feat: 实装AI改写结局功能 - 接入DeepSeek API - AI动态生成新结局名称 - 新增rewrite类型结局样式 - 修复请求超时问题
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user