feat: AI中间章节改写功能 + 滚动优化
This commit is contained in:
Binary file not shown.
@@ -5,7 +5,7 @@ import random
|
||||
from fastapi import APIRouter, Depends, Query, HTTPException
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import select, update, func, distinct
|
||||
from typing import Optional
|
||||
from typing import Optional, List
|
||||
from pydantic import BaseModel
|
||||
|
||||
from app.database import get_db
|
||||
@@ -25,6 +25,20 @@ class RewriteRequest(BaseModel):
|
||||
prompt: str
|
||||
|
||||
|
||||
class PathHistoryItem(BaseModel):
|
||||
nodeKey: str
|
||||
content: str = ""
|
||||
choice: str = ""
|
||||
|
||||
|
||||
class RewriteBranchRequest(BaseModel):
|
||||
userId: int
|
||||
currentNodeKey: str
|
||||
pathHistory: List[PathHistoryItem]
|
||||
currentContent: str
|
||||
prompt: str
|
||||
|
||||
|
||||
# ========== API接口 ==========
|
||||
|
||||
@router.get("")
|
||||
@@ -268,3 +282,59 @@ async def ai_rewrite_ending(story_id: int, request: RewriteRequest, db: AsyncSes
|
||||
"ending_type": "rewrite"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@router.post("/{story_id}/rewrite-branch")
|
||||
async def ai_rewrite_branch(
|
||||
story_id: int,
|
||||
request: RewriteBranchRequest,
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
"""AI改写中间章节,生成新的剧情分支"""
|
||||
if not request.prompt:
|
||||
raise HTTPException(status_code=400, detail="请输入改写指令")
|
||||
|
||||
# 获取故事信息
|
||||
result = await db.execute(select(Story).where(Story.id == story_id))
|
||||
story = result.scalar_one_or_none()
|
||||
|
||||
if not story:
|
||||
raise HTTPException(status_code=404, detail="故事不存在")
|
||||
|
||||
# 将 Pydantic 模型转换为字典列表
|
||||
path_history = [
|
||||
{"nodeKey": item.nodeKey, "content": item.content, "choice": item.choice}
|
||||
for item in request.pathHistory
|
||||
]
|
||||
|
||||
# 调用 AI 服务
|
||||
from app.services.ai import ai_service
|
||||
|
||||
ai_result = await ai_service.rewrite_branch(
|
||||
story_title=story.title,
|
||||
story_category=story.category or "未知",
|
||||
path_history=path_history,
|
||||
current_content=request.currentContent,
|
||||
user_prompt=request.prompt
|
||||
)
|
||||
|
||||
if ai_result and ai_result.get("nodes"):
|
||||
return {
|
||||
"code": 0,
|
||||
"data": {
|
||||
"nodes": ai_result["nodes"],
|
||||
"entryNodeKey": ai_result.get("entryNodeKey", "branch_1"),
|
||||
"tokensUsed": ai_result.get("tokens_used", 0)
|
||||
}
|
||||
}
|
||||
|
||||
# AI 服务不可用时,返回空结果(不使用兜底模板)
|
||||
return {
|
||||
"code": 0,
|
||||
"data": {
|
||||
"nodes": None,
|
||||
"entryNodeKey": None,
|
||||
"tokensUsed": 0,
|
||||
"error": "AI服务暂时不可用"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user