| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- """内容相关 API 路由。"""
- import logging
- from fastapi import APIRouter, HTTPException
- from ..models.schemas import ChapterContentRequest
- from ..services.content_service import ContentService
- from ..utils.errors import AppError
- from ..utils.sse import sse_chunk, sse_done, sse_error, sse_response
- logger = logging.getLogger(__name__)
- router = APIRouter(prefix="/api/content", tags=["内容管理"])
- @router.post("/generate-chapter")
- async def generate_chapter_content(request: ChapterContentRequest):
- """为单个章节生成完整内容。"""
- try:
- content_service = ContentService()
- content = await content_service.generate_chapter_content(
- chapter=request.chapter,
- parent_chapters=request.parent_chapters,
- sibling_chapters=request.sibling_chapters,
- project_overview=request.project_overview,
- )
- return {"success": True, "content": content}
- except AppError as exc:
- raise HTTPException(status_code=exc.status_code, detail=exc.message) from exc
- except Exception as exc:
- logger.exception("章节内容生成失败")
- raise HTTPException(status_code=500, detail=f"章节内容生成失败: {exc}") from exc
- @router.post("/generate-chapter-stream")
- async def generate_chapter_content_stream(request: ChapterContentRequest):
- """流式生成单章节内容。"""
- try:
- content_service = ContentService()
- except AppError as exc:
- raise HTTPException(status_code=exc.status_code, detail=exc.message) from exc
- async def generate():
- try:
- async for chunk in content_service.stream_chapter_content(
- chapter=request.chapter,
- parent_chapters=request.parent_chapters,
- sibling_chapters=request.sibling_chapters,
- project_overview=request.project_overview,
- ):
- yield sse_chunk(chunk)
- except AppError as exc:
- yield sse_error(exc.message)
- except Exception:
- logger.exception("章节内容流式生成失败")
- yield sse_error("章节内容生成失败,请稍后重试")
- finally:
- yield sse_done()
- return sse_response(generate())
|