- agent/main.py: 添加日志记录功能 - agent/llm: 更新 anthropic, openai, factory - agent/core/agent.py: 更新 - server: agent_handler, agent_service, chat_service 更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
144 lines
3.9 KiB
Go
144 lines
3.9 KiB
Go
package handler
|
||
|
||
import (
|
||
"net/http"
|
||
|
||
"x-agents/server/internal/service"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// AgentHandler Agent 处理器
|
||
type AgentHandler struct {
|
||
agentService *service.AgentService
|
||
}
|
||
|
||
// NewAgentHandler 创建 Agent 处理器
|
||
func NewAgentHandler(agentService *service.AgentService) *AgentHandler {
|
||
return &AgentHandler{
|
||
agentService: agentService,
|
||
}
|
||
}
|
||
|
||
// ChatRequest 对话请求
|
||
type ChatRequest struct {
|
||
AgentID int `json:"agent_id" binding:"required"`
|
||
Message string `json:"message" binding:"required"`
|
||
SessionID string `json:"session_id"`
|
||
ModelID string `json:"model_id"`
|
||
}
|
||
|
||
// ChatResponse 对话响应
|
||
type ChatResponse struct {
|
||
AgentID int `json:"agent_id"`
|
||
Reply string `json:"reply"`
|
||
ToolsUsed []string `json:"tools_used"`
|
||
SessionID string `json:"session_id"`
|
||
TokensUsed int `json:"tokens_used"`
|
||
DurationMs int `json:"duration_ms"`
|
||
Metadata interface{} `json:"metadata"`
|
||
}
|
||
|
||
// Chat 单智能体对话
|
||
func (h *AgentHandler) Chat(c *gin.Context) {
|
||
var req ChatRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||
return
|
||
}
|
||
|
||
// 获取用户 ID(从认证中间件获取)
|
||
userID := 1 // TODO: 从 c.Get("user_id") 获取
|
||
|
||
pythonReq := service.AgentChatRequest{
|
||
AgentID: req.AgentID,
|
||
Message: req.Message,
|
||
UserID: userID,
|
||
SessionID: req.SessionID,
|
||
ModelID: req.ModelID,
|
||
}
|
||
|
||
result, err := h.agentService.Chat(pythonReq)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||
return
|
||
}
|
||
|
||
// 转换工具调用
|
||
toolsUsed := make([]string, 0)
|
||
for _, tool := range result.ToolCalls {
|
||
if toolMap, ok := tool.(map[string]interface{}); ok {
|
||
if skillID, ok := toolMap["skill_id"].(string); ok {
|
||
toolsUsed = append(toolsUsed, skillID)
|
||
}
|
||
}
|
||
}
|
||
|
||
c.JSON(http.StatusOK, ChatResponse{
|
||
AgentID: result.AgentID,
|
||
Reply: result.Response,
|
||
ToolsUsed: toolsUsed,
|
||
SessionID: result.SessionID,
|
||
TokensUsed: result.TokensUsed,
|
||
DurationMs: result.DurationMs,
|
||
Metadata: nil,
|
||
})
|
||
}
|
||
|
||
// TeamChatRequest 多智能体群聊请求
|
||
type TeamChatRequest struct {
|
||
SupervisorAgentID int `json:"supervisor_agent_id" binding:"required"`
|
||
MemberAgentIDs []int `json:"member_agent_ids" binding:"required"`
|
||
Message string `json:"message" binding:"required"`
|
||
SessionID string `json:"session_id"`
|
||
Strategy string `json:"strategy"`
|
||
}
|
||
|
||
// TeamChatResponse 多智能体群聊响应
|
||
type TeamChatResponse struct {
|
||
SupervisorAgentID int `json:"supervisor_agent_id"`
|
||
Reply string `json:"reply"`
|
||
SubtaskResults interface{} `json:"subtask_results"`
|
||
Strategy string `json:"strategy"`
|
||
SessionID string `json:"session_id"`
|
||
DurationMs int `json:"duration_ms"`
|
||
Metadata interface{} `json:"metadata"`
|
||
}
|
||
|
||
// TeamChat 多智能体群聊
|
||
func (h *AgentHandler) TeamChat(c *gin.Context) {
|
||
var req TeamChatRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||
return
|
||
}
|
||
|
||
// 获取用户 ID
|
||
userID := 1 // TODO: 从 c.Get("user_id") 获取
|
||
|
||
pythonReq := service.TeamChatRequest{
|
||
SupervisorAgentID: req.SupervisorAgentID,
|
||
MemberAgentIDs: req.MemberAgentIDs,
|
||
Message: req.Message,
|
||
UserID: userID,
|
||
SessionID: req.SessionID,
|
||
Strategy: req.Strategy,
|
||
}
|
||
|
||
result, err := h.agentService.TeamChat(pythonReq)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, TeamChatResponse{
|
||
SupervisorAgentID: result.SupervisorAgentID,
|
||
Reply: result.Response,
|
||
SubtaskResults: result.SubtaskResults,
|
||
Strategy: result.Strategy,
|
||
SessionID: result.SessionID,
|
||
DurationMs: result.DurationMs,
|
||
Metadata: nil,
|
||
})
|
||
}
|