expand.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. """
  2. FastAPI 路由层 - 英语句子扩写智能体
  3. """
  4. from fastapi import APIRouter, HTTPException
  5. from fastapi.responses import StreamingResponse
  6. from typing import AsyncGenerator
  7. import sys
  8. import os
  9. # 添加 backend 目录到 Python 路径
  10. sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  11. from models.entities import (
  12. StartRequest,
  13. SubmitRequest,
  14. AgentResponse,
  15. SessionState
  16. )
  17. from services.session_store import get_session_store
  18. from agents.orchestrator import get_orchestrator
  19. from agents.auto_mode_agent import get_auto_mode
  20. router = APIRouter(prefix="/api", tags=["expand"])
  21. @router.post("/session/start", response_model=AgentResponse)
  22. async def start_session(request: StartRequest) -> AgentResponse:
  23. """
  24. 创建新会话,返回第一阶段提问
  25. Args:
  26. request: 开始会话请求,包含种子句和模式
  27. Returns:
  28. AgentResponse: 智能体响应
  29. """
  30. # 获取会话存储
  31. session_store = get_session_store()
  32. # 创建会话
  33. session = session_store.create_session(
  34. seed_sentence=request.seed_sentence,
  35. mode=request.mode
  36. )
  37. # 获取 Orchestrator
  38. orchestrator = get_orchestrator()
  39. # 开始会话
  40. response = orchestrator.start_session(session)
  41. return response
  42. @router.post("/session/submit", response_model=AgentResponse)
  43. async def submit_sentence(request: SubmitRequest) -> AgentResponse:
  44. """
  45. 提交用户扩写句子,返回点评和下一阶段提问(手动模式)
  46. Args:
  47. request: 提交请求,包含会话 ID 和用户句子
  48. Returns:
  49. AgentResponse: 智能体响应
  50. """
  51. # 获取会话存储
  52. session_store = get_session_store()
  53. # 获取会话
  54. session = session_store.get_session(request.session_id)
  55. if not session:
  56. raise HTTPException(status_code=404, detail="Session not found")
  57. # 获取 Orchestrator
  58. orchestrator = get_orchestrator()
  59. # 处理用户输入
  60. response = orchestrator.process_user_input(
  61. session_state=session,
  62. user_sentence=request.user_sentence
  63. )
  64. # 更新会话
  65. session_store.update_session(session)
  66. return response
  67. @router.get("/session/{session_id}/auto")
  68. async def auto_mode_stream(session_id: str) -> StreamingResponse:
  69. """
  70. SSE 流式推送三轮自动演示
  71. Args:
  72. session_id: 会话 ID
  73. Returns:
  74. StreamingResponse: SSE 流式响应
  75. """
  76. # 获取会话存储
  77. session_store = get_session_store()
  78. # 获取会话
  79. session = session_store.get_session(session_id)
  80. if not session:
  81. raise HTTPException(status_code=404, detail="Session not found")
  82. # 获取 AutoModeAgent
  83. auto_mode_agent = get_auto_mode()
  84. # 生成流式响应
  85. async def event_generator() -> AsyncGenerator[str, None]:
  86. import json
  87. try:
  88. # 使用流式运行
  89. async for event in auto_mode_agent.run_auto_mode_stream(session.seed_sentence):
  90. yield f"data: {json.dumps(event, ensure_ascii=False)}\n\n"
  91. # 发送结束事件
  92. yield "event: done\ndata: {}\n\n"
  93. except Exception as e:
  94. yield f"event: error\ndata: {json.dumps({'detail': str(e), 'type': type(e).__name__}, ensure_ascii=False)}\n\n"
  95. return StreamingResponse(
  96. event_generator(),
  97. media_type="text/event-stream",
  98. headers={
  99. "Cache-Control": "no-cache",
  100. "Connection": "keep-alive",
  101. "X-Accel-Buffering": "no"
  102. }
  103. )
  104. @router.get("/session/{session_id}", response_model=SessionState)
  105. async def get_session(session_id: str) -> SessionState:
  106. """
  107. 获取当前会话完整状态
  108. Args:
  109. session_id: 会话 ID
  110. Returns:
  111. SessionState: 会话状态
  112. """
  113. # 获取会话存储
  114. session_store = get_session_store()
  115. # 获取会话
  116. session = session_store.get_session(session_id)
  117. if not session:
  118. raise HTTPException(status_code=404, detail="Session not found")
  119. return session