click_routes.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # -*- coding: utf-8 -*-
  2. """
  3. 点选/悬浮数据解读接口 —— SSE 流式
  4. 点选解读是一次性的数据查询操作,不属于对话场景,
  5. 因此不写数据库(不创建会话、不保存消息)。
  6. """
  7. import uuid
  8. from fastapi import APIRouter
  9. from fastapi.responses import StreamingResponse
  10. from api.models import TunClickInterpretRequest, DeviceClickInterpretRequest
  11. from api.sse_core import sse_event_generator
  12. from api.fast_generators import fast_tun_sse_generator, fast_device_sse_generator
  13. from agents.vent_agent import get_click_agent
  14. router = APIRouter()
  15. def _sse_response(generator, session_id: str) -> StreamingResponse:
  16. """构建统一的 SSE 响应对象"""
  17. return StreamingResponse(
  18. generator,
  19. media_type="text/event-stream",
  20. headers={
  21. "Cache-Control": "no-cache",
  22. "Connection": "keep-alive",
  23. "X-Accel-Buffering": "no",
  24. "X-Session-Id": session_id,
  25. },
  26. )
  27. @router.post("/interpret/click/tun")
  28. async def click_interpret_tun(req: TunClickInterpretRequest):
  29. """点选/悬浮数据解读接口(SSE 流式)
  30. 用户点击某巷道数据行时触发,返回结构化的数据解读报告。
  31. mode 参数:
  32. - plan(默认):走智能体 + Skills 全流程
  33. - fast:直接查数据 + LLM 生成报告,跳过 Agent 与知识库
  34. 注意:点选解读不写数据库(不创建会话、不保存消息)。
  35. 响应: SSE 流(text/event-stream)
  36. """
  37. thread_id = str(uuid.uuid4())
  38. session_id = str(uuid.uuid4()) # 仅用作 SSE 流标识,不写库
  39. # Fast 模式:直接查数据 + LLM 生成报告
  40. if req.mode == "fast":
  41. return _sse_response(
  42. fast_tun_sse_generator(req.tun_id, req.tun_name, thread_id, session_id, save_to_db=False),
  43. session_id,
  44. )
  45. # Plan 模式(默认):走智能体全流程
  46. user_message = f"用户点击或选中某条巷道数据行,请执行巷道数据解读任务,该巷道ID为 {req.tun_id},名称为 {req.tun_name}。"
  47. config = {"configurable": {"thread_id": thread_id}}
  48. agent = get_click_agent()
  49. return _sse_response(
  50. sse_event_generator(agent, user_message, thread_id, session_id, config, save_to_db=False),
  51. session_id,
  52. )
  53. @router.post("/interpret/click/device")
  54. async def click_interpret_device(req: DeviceClickInterpretRequest):
  55. """点选/悬浮数据解读接口(SSE 流式)
  56. 用户点击某设备数据行时触发,返回结构化的数据解读报告。
  57. mode 参数:
  58. - plan(默认):走智能体 + Skills 全流程
  59. - fast:直接查数据 + LLM 生成报告,跳过 Agent 与知识库
  60. 注意:点选解读不写数据库(不创建会话、不保存消息)。
  61. 响应: SSE 流(text/event-stream)
  62. """
  63. thread_id = str(uuid.uuid4())
  64. session_id = str(uuid.uuid4()) # 仅用作 SSE 流标识,不写库
  65. # Fast 模式:直接查数据 + LLM 生成报告
  66. if req.mode == "fast":
  67. return _sse_response(
  68. fast_device_sse_generator(req.device_id, req.device_name, req.device_type, thread_id, session_id, save_to_db=False),
  69. session_id,
  70. )
  71. # Plan 模式(默认):走智能体全流程
  72. user_message = f"用户点击或选中某个设备,请执行设备数据解读任务,该设备ID为 {req.device_id},类型为{req.device_type},名称为 {req.device_name}。"
  73. config = {"configurable": {"thread_id": thread_id}}
  74. agent = get_click_agent()
  75. return _sse_response(
  76. sse_event_generator(agent, user_message, thread_id, session_id, config, save_to_db=False),
  77. session_id,
  78. )