初始化
This commit is contained in:
105
internal/handler/agent_handler.go
Normal file
105
internal/handler/agent_handler.go
Normal file
@@ -0,0 +1,105 @@
|
||||
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,
|
||||
},
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user