1
0

chat.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """聊天API"""
  2. from fastapi import APIRouter, Query
  3. from ...models.schemas import ChatRequest, ChatResponse
  4. from ...agents.orchestrator import get_orchestrator
  5. from ...services.data_store import data_store
  6. from ...services.learning_content import find_next_lesson
  7. from ...models.learning import UserProgress
  8. from datetime import datetime
  9. import uuid
  10. router = APIRouter(prefix="/chat", tags=["聊天"])
  11. @router.post("/", response_model=ChatResponse)
  12. async def chat(request: ChatRequest, user_id: str = Query("default")):
  13. """与AI助手对话(自动路由到合适的Agent)"""
  14. orchestrator = get_orchestrator()
  15. # 生成会话ID
  16. conversation_id = request.conversation_id or str(uuid.uuid4())
  17. # 注入下一课程信息到上下文(让AI给出具体推荐)
  18. context = request.context
  19. if context and context.get("lesson_id") and context.get("path_type"):
  20. progress = data_store.get_user_progress(user_id)
  21. completed = progress.completed_lessons if progress else []
  22. next_lesson = find_next_lesson(
  23. path_type=context["path_type"],
  24. current_lesson_id=context["lesson_id"],
  25. completed_lessons=completed,
  26. )
  27. if next_lesson:
  28. context["next_lesson"] = next_lesson
  29. # 路由到合适的Agent并获取回复(传递上下文)
  30. reply, agent_name = orchestrator.route(request.message, context=context)
  31. # 如果是教练回应,保存为学习计划到用户进度
  32. if agent_name == "coach":
  33. progress = data_store.get_user_progress(user_id)
  34. if not progress:
  35. progress = UserProgress(
  36. user_id=user_id,
  37. started_at=datetime.now(),
  38. last_activity_at=datetime.now()
  39. )
  40. progress.learning_plan = reply
  41. progress.last_activity_at = datetime.now()
  42. data_store.save_user_progress(progress)
  43. # 映射agent名称到中文
  44. agent_display_name = {
  45. "tutor": "编程导师",
  46. "debug": "调试助手",
  47. "review": "代码审查员",
  48. "arch": "架构师",
  49. "coach": "学习教练",
  50. }.get(agent_name, "编程导师")
  51. return ChatResponse(
  52. reply=reply,
  53. conversation_id=conversation_id,
  54. agent_name=agent_display_name,
  55. )