# -*- coding: utf-8 -*- """ 点选/悬浮数据解读接口 —— SSE 流式 点选解读是一次性的数据查询操作,不属于对话场景, 因此不写数据库(不创建会话、不保存消息)。 """ import uuid from fastapi import APIRouter from fastapi.responses import StreamingResponse from api.models import TunClickInterpretRequest, DeviceClickInterpretRequest from api.sse_core import sse_event_generator from api.fast_generators import fast_tun_sse_generator, fast_device_sse_generator from agents.vent_agent import get_click_agent router = APIRouter() def _sse_response(generator, session_id: str) -> StreamingResponse: """构建统一的 SSE 响应对象""" return StreamingResponse( generator, media_type="text/event-stream", headers={ "Cache-Control": "no-cache", "Connection": "keep-alive", "X-Accel-Buffering": "no", "X-Session-Id": session_id, }, ) @router.post("/interpret/click/tun") async def click_interpret_tun(req: TunClickInterpretRequest): """点选/悬浮数据解读接口(SSE 流式) 用户点击某巷道数据行时触发,返回结构化的数据解读报告。 mode 参数: - plan(默认):走智能体 + Skills 全流程 - fast:直接查数据 + LLM 生成报告,跳过 Agent 与知识库 注意:点选解读不写数据库(不创建会话、不保存消息)。 响应: SSE 流(text/event-stream) """ thread_id = str(uuid.uuid4()) session_id = str(uuid.uuid4()) # 仅用作 SSE 流标识,不写库 # Fast 模式:直接查数据 + LLM 生成报告 if req.mode == "fast": return _sse_response( fast_tun_sse_generator(req.tun_id, req.tun_name, thread_id, session_id, save_to_db=False), session_id, ) # Plan 模式(默认):走智能体全流程 user_message = f"用户点击或选中某条巷道数据行,请执行巷道数据解读任务,该巷道ID为 {req.tun_id},名称为 {req.tun_name}。" config = {"configurable": {"thread_id": thread_id}} agent = get_click_agent() return _sse_response( sse_event_generator(agent, user_message, thread_id, session_id, config, save_to_db=False), session_id, ) @router.post("/interpret/click/device") async def click_interpret_device(req: DeviceClickInterpretRequest): """点选/悬浮数据解读接口(SSE 流式) 用户点击某设备数据行时触发,返回结构化的数据解读报告。 mode 参数: - plan(默认):走智能体 + Skills 全流程 - fast:直接查数据 + LLM 生成报告,跳过 Agent 与知识库 注意:点选解读不写数据库(不创建会话、不保存消息)。 响应: SSE 流(text/event-stream) """ thread_id = str(uuid.uuid4()) session_id = str(uuid.uuid4()) # 仅用作 SSE 流标识,不写库 # Fast 模式:直接查数据 + LLM 生成报告 if req.mode == "fast": return _sse_response( fast_device_sse_generator(req.device_id, req.device_name, req.device_type, thread_id, session_id, save_to_db=False), session_id, ) # Plan 模式(默认):走智能体全流程 user_message = f"用户点击或选中某个设备,请执行设备数据解读任务,该设备ID为 {req.device_id},类型为{req.device_type},名称为 {req.device_name}。" config = {"configurable": {"thread_id": thread_id}} agent = get_click_agent() return _sse_response( sse_event_generator(agent, user_message, thread_id, session_id, config, save_to_db=False), session_id, )