feat: 实装AI改写结局功能 - 接入DeepSeek API - AI动态生成新结局名称 - 新增rewrite类型结局样式 - 修复请求超时问题

This commit is contained in:
2026-03-05 15:57:51 +08:00
parent 89b5a3b658
commit d47ccd7039
11 changed files with 513 additions and 15 deletions

View File

@@ -187,6 +187,9 @@ async def toggle_like(story_id: int, request: LikeRequest, db: AsyncSession = De
@router.post("/{story_id}/rewrite")
async def ai_rewrite_ending(story_id: int, request: RewriteRequest, db: AsyncSession = Depends(get_db)):
"""AI改写结局"""
import json
import re
if not request.prompt:
raise HTTPException(status_code=400, detail="请输入改写指令")
@@ -194,7 +197,54 @@ async def ai_rewrite_ending(story_id: int, request: RewriteRequest, db: AsyncSes
result = await db.execute(select(Story).where(Story.id == story_id))
story = result.scalar_one_or_none()
# 模拟AI生成后续替换为真实API调用
if not story:
raise HTTPException(status_code=404, detail="故事不存在")
# 调用 AI 服务
from app.services.ai import ai_service
ai_result = await ai_service.rewrite_ending(
story_title=story.title,
story_category=story.category or "未知",
ending_name=request.ending_name or "未知结局",
ending_content=request.ending_content or "",
user_prompt=request.prompt
)
if ai_result and ai_result.get("content"):
content = ai_result["content"]
ending_name = f"{request.ending_name}AI改写"
# 尝试解析 JSON 格式的返回
try:
# 提取 JSON 部分
json_match = re.search(r'\{[^{}]*"ending_name"[^{}]*"content"[^{}]*\}', content, re.DOTALL)
if json_match:
parsed = json.loads(json_match.group())
ending_name = parsed.get("ending_name", ending_name)
content = parsed.get("content", content)
else:
# 尝试直接解析整个内容
parsed = json.loads(content)
ending_name = parsed.get("ending_name", ending_name)
content = parsed.get("content", content)
except (json.JSONDecodeError, AttributeError):
# 解析失败,使用原始内容
pass
return {
"code": 0,
"data": {
"content": content,
"speaker": "旁白",
"is_ending": True,
"ending_name": ending_name,
"ending_type": "rewrite",
"tokens_used": ai_result.get("tokens_used", 0)
}
}
# AI 服务不可用时的降级处理
templates = [
f"根据你的愿望「{request.prompt}」,故事有了新的发展...\n\n",
f"命运的齿轮开始转动,{request.prompt}...\n\n",
@@ -205,8 +255,7 @@ async def ai_rewrite_ending(story_id: int, request: RewriteRequest, db: AsyncSes
new_content = (
template +
"原本的结局被改写,新的故事在这里展开。\n\n" +
f"AI改写提示】这是基于「{request.prompt}」生成的新结局。\n" +
"实际部署时这里将由AI大模型根据上下文生成更精彩的内容。"
f"提示】AI服务暂时不可用这是模板内容。"
)
return {