chore: 删除脚本生成 SSE 流式相关废弃代码
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
============
|
||||
|
||||
提供脚本生成、润色、模型健康检查等功能。
|
||||
支持 SSE 流式响应。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -11,21 +10,17 @@ from __future__ import annotations
|
||||
import asyncio
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Request
|
||||
from fastapi.responses import StreamingResponse
|
||||
from fastapi import APIRouter
|
||||
|
||||
from app.schemas.common import ApiResponse, success_response
|
||||
from app.ai.model_router import get_model_router
|
||||
from app.ai.prompts import list_categories, load_prompt, render_template
|
||||
from app.schemas.common import ApiResponse, success_response
|
||||
from app.schemas.script import (
|
||||
CategoryItem,
|
||||
GenerateScriptRequest,
|
||||
GenerateTitleRequest,
|
||||
GenerateTitleResponse,
|
||||
ModelHealthResponse,
|
||||
PolishRequest,
|
||||
ScriptGenerationEvent,
|
||||
ScriptShot,
|
||||
TestModelRequest,
|
||||
TestModelResponse,
|
||||
)
|
||||
@@ -49,83 +44,6 @@ async def get_categories():
|
||||
)
|
||||
|
||||
|
||||
@router.post("/generate/stream")
|
||||
async def generate_script_stream(request: Request, data: GenerateScriptRequest):
|
||||
"""
|
||||
流式生成脚本(SSE)
|
||||
|
||||
返回 Server-Sent Events,包含进度更新和最终结果。
|
||||
前端通过 EventSource 接收实时进度。
|
||||
|
||||
**SSE 事件类型:**
|
||||
- `start`: 开始生成
|
||||
- `generating`: AI 生成中
|
||||
- `complete`: 完成,包含 result 字段
|
||||
- `error`: 错误
|
||||
|
||||
**示例事件流:**
|
||||
```
|
||||
data: {"type": "start", "message": "正在创作脚本..."}
|
||||
|
||||
data: {"type": "generating", "message": "正在创作脚本..."}
|
||||
|
||||
data: {"type": "complete", "message": "脚本生成成功", "result": [...]}
|
||||
```
|
||||
"""
|
||||
service = get_script_service()
|
||||
|
||||
async def event_generator():
|
||||
"""SSE 事件生成器,带客户端断开检测"""
|
||||
try:
|
||||
async for event in service.generate_script_stream(
|
||||
category=data.category,
|
||||
subcategory=data.subcategory,
|
||||
duration=data.duration,
|
||||
script_type=data.script_type,
|
||||
model=data.model,
|
||||
):
|
||||
# 检查客户端是否已断开
|
||||
if await request.is_disconnected():
|
||||
logger.info("[SSE] 客户端已断开连接,停止生成")
|
||||
break
|
||||
|
||||
# SSE 格式:data: {...}\n\n
|
||||
try:
|
||||
yield f"data: {event.model_dump_json()}\n\n"
|
||||
await asyncio.sleep(0.05) # 确保事件被 flush,前端有时间渲染
|
||||
except Exception as e:
|
||||
logger.error(f"[SSE] 序列化事件失败: {e}")
|
||||
continue
|
||||
|
||||
# 发送结束标记(如果客户端还连接着)
|
||||
if not await request.is_disconnected():
|
||||
yield "data: [DONE]\n\n"
|
||||
|
||||
except Exception as e:
|
||||
logger.exception("[SSE] 事件生成器异常")
|
||||
# 尝试发送错误信息给客户端
|
||||
try:
|
||||
error_event = ScriptGenerationEvent(
|
||||
type="error",
|
||||
progress=0,
|
||||
message=f"服务器错误: {str(e)}",
|
||||
)
|
||||
yield f"data: {error_event.model_dump_json()}\n\n"
|
||||
yield "data: [DONE]\n\n"
|
||||
except:
|
||||
pass
|
||||
|
||||
return StreamingResponse(
|
||||
event_generator(),
|
||||
media_type="text/event-stream",
|
||||
headers={
|
||||
"Cache-Control": "no-cache",
|
||||
"Connection": "keep-alive",
|
||||
"X-Accel-Buffering": "no", # 禁用 Nginx 缓冲
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@router.post("/polish", response_model=ApiResponse[str])
|
||||
async def polish_content(request: PolishRequest):
|
||||
"""
|
||||
@@ -265,7 +183,7 @@ async def generate_title(request: GenerateTitleRequest):
|
||||
data=GenerateTitleResponse(title=title),
|
||||
message="标题生成成功",
|
||||
)
|
||||
except asyncio.TimeoutError:
|
||||
except TimeoutError:
|
||||
logger.warning("[generate_title] 标题生成超时")
|
||||
return success_response(
|
||||
code=500,
|
||||
|
||||
Reference in New Issue
Block a user