"""对话 API POST /api/chat/stream - SSE 流式对话 """ import json import logging from fastapi import APIRouter from fastapi.responses import StreamingResponse from pydantic import BaseModel from app.llm.chat_agent import chat_stream logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/chat", tags=["chat"]) class ChatMessage(BaseModel): role: str content: str class ChatRequest(BaseModel): messages: list[ChatMessage] @router.post("/stream") async def chat_stream_endpoint(req: ChatRequest): """流式对话接口(SSE)""" messages = [{"role": m.role, "content": m.content} for m in req.messages] async def event_generator(): try: async for msg in chat_stream(messages): data = json.dumps(msg, ensure_ascii=False) yield f"data: {data}\n\n" yield "data: [DONE]\n\n" except Exception as e: logger.error(f"Chat stream error: {e}") error_data = json.dumps( {"type": "content", "content": f"出错了: {e}"}, ensure_ascii=False, ) yield f"data: {error_data}\n\n" yield "data: [DONE]\n\n" return StreamingResponse( event_generator(), media_type="text/event-stream", headers={ "Cache-Control": "no-cache", "Connection": "keep-alive", "X-Accel-Buffering": "no", }, )