chat.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. """
  2. AI对话助手 API — 协调者Agent流式对话接口
  3. """
  4. import json
  5. from fastapi import APIRouter
  6. from fastapi.responses import StreamingResponse
  7. from pydantic import BaseModel, Field
  8. from app.services import chat_service
  9. router = APIRouter(prefix="/chat", tags=["AI对话助手"])
  10. class ChatRequest(BaseModel):
  11. message: str = Field(..., description="用户消息", min_length=1)
  12. stock_code: str = Field("", description="关联股票代码(可选)")
  13. stock_name: str = Field("", description="关联股票名称(可选)")
  14. history: list = Field(default_factory=list, description="对话历史")
  15. def _make_chat_stream(message: str, stock_code: str, stock_name: str, history: list):
  16. """生成NDJSON流式响应"""
  17. try:
  18. for event in chat_service.iter_chat_stream_events(
  19. message, stock_code, stock_name, history
  20. ):
  21. yield json.dumps(event, ensure_ascii=False) + "\n"
  22. except Exception as e:
  23. err = {"type": "error", "content": f"对话服务错误: {e}", "message": f"对话服务错误: {e}"}
  24. yield json.dumps(err, ensure_ascii=False) + "\n"
  25. @router.post("/stream")
  26. async def chat_stream(body: ChatRequest):
  27. """AI对话助手流式接口
  28. 用户通过对话形式提供需求,协调者Agent解析需求,
  29. 自主调用子Agent并流式输出分析结果。
  30. """
  31. return StreamingResponse(
  32. _make_chat_stream(body.message, body.stock_code, body.stock_name, body.history),
  33. media_type="application/x-ndjson",
  34. headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
  35. )