package handler import ( "tcm-agent/internal/agent" "github.com/gin-gonic/gin" ) // ======================================================================== // 通用 Agent 对话接口 // ======================================================================== // 用于:自由问诊、多轮对话、调试 Agent 行为 // ======================================================================== // AgentHandler 通用 Agent 对话处理器 type AgentHandler struct { runner *agent.Runner } // NewAgentHandler 创建 Agent 处理器 func NewAgentHandler(runner *agent.Runner) *AgentHandler { return &AgentHandler{runner: runner} } // ChatRequest 对话请求 type ChatRequest struct { SessionID string `json:"session_id"` // 可选,不传则创建新会话 Message string `json:"message" binding:"required"` UserID string `json:"user_id"` // 用户 ID Scene string `json:"scene"` // 场景名(决定用哪个模型) } // Chat 通用 Agent 对话接口 // // POST /api/v1/agent/chat // // 支持多轮对话:传 session_id 则延续上下文。 // 不传 scene 时使用默认路由。 func (h *AgentHandler) Chat(c *gin.Context) { var req ChatRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": "消息内容不能为空"}) return } // 获取或创建会话 sessionID := req.SessionID if sessionID == "" { userID := req.UserID if userID == "" { userID = c.GetString("user_id") } // 使用请求的 scene(为空则用默认) session := h.runner.CreateSession(userID, req.Scene) sessionID = session.ID } // 执行 Agent 推理 response, err := h.runner.Run(c.Request.Context(), sessionID, req.Message) if err != nil { c.JSON(500, gin.H{ "error": "Agent 执行失败", "detail": err.Error(), }) return } session, _ := h.runner.GetSession(sessionID) c.JSON(200, gin.H{ "code": 200, "data": gin.H{ "session_id": sessionID, "response": response, "history_len": len(session.History), "status": session.Status, }, }) } // GetSession 查看会话详情 // // GET /api/v1/agent/session/:id func (h *AgentHandler) GetSession(c *gin.Context) { id := c.Param("id") session, ok := h.runner.GetSession(id) if !ok { c.JSON(404, gin.H{"error": "会话不存在"}) return } c.JSON(200, gin.H{ "code": 200, "data": gin.H{ "id": session.ID, "user_id": session.UserID, "scene": session.Scene, "status": session.Status, "history": session.History, "state": session.State, "created_at": session.CreatedAt, "updated_at": session.UpdatedAt, }, }) }