group-sml/app.py
2026-01-08 01:13:17 +08:00

197 lines
5.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from flask import Flask, render_template, request, jsonify
from dotenv import load_dotenv
import dashscope
from dashscope import Generation
from datetime import datetime
import json
load_dotenv()
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
app = Flask(__name__)
# --------------------------
# 配置
# --------------------------
SCENE_PROMPTS = {
"general": "这是通用写作场景,语言自然清晰。",
"media": "这是自媒体写作,语言有吸引力,适合传播。",
"script": "这是剧本写作,语言有画面感和情绪张力。",
"essay": "这是学生作文写作,结构清晰、表达规范。",
"academic_scene": "这是学术写作,语言严谨、逻辑清楚。"
}
POLISH_STYLES = {
"formal": "正式、书面",
"literary": "文学性强、有文采",
"spoken": "口语化、自然",
"business": "商务、专业",
"internet": "网络风格、轻松"
}
history_records = []
MAX_HISTORY = 10
# --------------------------
# AI 调用
# --------------------------
def call_ai(prompt):
resp = Generation.call(model="qwen-turbo", prompt=prompt)
if resp.status_code == 200:
return resp.output.text
return "❌ AI 调用失败"
# --------------------------
# 多版本润色
# --------------------------
def multi_version_rewrite(text, style):
prompt = f"""
请对以下文本进行润色,生成 3 个不同版本:
要求:
1. 保持原意
2. 风格:{style}
3. 输出 3 个版本,分别标记 版本1/版本2/版本3
原文:
{text}
"""
return call_ai(prompt)
# --------------------------
# 扩写
# --------------------------
def expand_text(text, target_length):
"""
扩写文本到指定长度(字数/字符)
"""
prompt = f"""
请将以下文本扩写,保持原意,但丰富细节和表达,使字数达到 {target_length} 字左右。
可以生成 3 个不同版本,分别标记 版本1/版本2/版本3。
原文:
{text}
"""
return call_ai(prompt)
# --------------------------
# 修改原因生成
# --------------------------
def generate_revision_reason(original, revised):
prompt = f"""
请对下面两段文本进行对比,说明修改的原因。
仅输出文字说明,不要高亮或格式化。
原文:
{original}
改写后:
{revised}
请详细说明改动原因。
"""
return call_ai(prompt)
# --------------------------
# 文学参考
# --------------------------
def generate_literary_reference(text):
prompt = f"""
请理解下面这句话的含义,然后给出 3 条
“文学作品风格中的相似表达示例”。
要求:
1. 不是原文引用
2. 给出【风格参考作者】和【作品名】
3. 仅作为文学风格参考
输出格式:
1. 句子内容
—— 风格参考:作者《作品名》
原句:
{text}
"""
return call_ai(prompt)
# --------------------------
# 历史记录
# --------------------------
def save_history(data, result):
history_records.insert(0, {
"time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"mode": data.get("mode"),
"scene": data.get("scene"),
"input": data.get("text", "")[:100],
"output": result[:200]
})
if len(history_records) > MAX_HISTORY:
history_records.pop()
# --------------------------
# 情感分析
# --------------------------
def sentiment_analysis(text):
prompt = f"""
请分析下面文本的情感倾向,仅返回严格 JSON 格式:
{{"positive": %, "neutral": %, "negative": %}}
文本:
{text}
"""
result = call_ai(prompt)
try:
parsed = json.loads(result.replace("", ":").replace("%",""))
return parsed
except:
return {"positive":0, "neutral":0, "negative":0}
# --------------------------
# 路由
# --------------------------
@app.route("/")
def index():
return render_template("index.html")
@app.route("/rewrite", methods=["POST"])
def rewrite():
data = request.json
text = data.get("text","")
mode = data.get("mode")
scene = data.get("scene","general")
# 根据模式生成文本
if mode=="polish":
style = data.get("style","formal")
result = multi_version_rewrite(text, style)
elif mode=="expand":
target_length = data.get("target_length", 300)
result = expand_text(text, target_length)
else:
result = f"普通生成模式:{text}" # 保留原功能
save_history(data, result)
return jsonify({"result": result})
@app.route("/literary", methods=["POST"])
def literary():
text = request.json.get("text","")
return jsonify({"reference": generate_literary_reference(text)})
@app.route("/history")
def history():
return jsonify(history_records)
@app.route("/revision_reason", methods=["POST"])
def revision_reason():
data = request.json
original = data.get("original","")
revised = data.get("revised","")
reason = generate_revision_reason(original, revised)
return jsonify({"reason": reason})
@app.route("/sentiment", methods=["POST"])
def sentiment():
text = request.json.get("text","")
return jsonify({"result": sentiment_analysis(text)})
if __name__=="__main__":
app.run(debug=True)