Files

106 lines
2.6 KiB
Go
Raw Permalink Normal View History

2026-08-14 21:50:48 +08:00
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,
},
})
}