Files
ai-agent/internal/services/tool_catalog_service.go
T
mlogclub 1370e4b675 feat: enhance AI agent functionality with tool management and logging improvements
- Added AllowedToolCodes field to Context for managing tool access.
- Introduced ResumeSource in aiReplyTraceData to track resume points.
- Enhanced logging with additional fields: PlannedSkillName, SkillRouteTrace, InterruptType, ResumeSource, and FinalStatus.
- Implemented functions to parse and resolve allowed tool codes for agents and skills.
- Refactored skill definition creation and update logic to streamline request handling.
- Updated MCP tool catalog to include source type and integrated built-in tools.
- Improved UI components to display additional tool information and enhance user experience.
2026-04-10 14:43:57 +08:00

105 lines
2.8 KiB
Go

package services
import (
"context"
"slices"
"strings"
"cs-agent/internal/ai/mcps"
"cs-agent/internal/pkg/config"
"cs-agent/internal/pkg/errorsx"
"cs-agent/internal/pkg/toolx"
)
var ToolCatalogService = newToolCatalogService()
func newToolCatalogService() *toolCatalogService {
return &toolCatalogService{}
}
type toolCatalogService struct{}
type MCPToolCatalogItem struct {
ToolCode string
ServerCode string
ToolName string
SourceType string
Title string
Description string
InputSchema any
OutputSchema any
}
func (s *toolCatalogService) ListMCPTools(ctx context.Context) ([]MCPToolCatalogItem, error) {
cfg := config.Current()
if !cfg.MCP.Enabled {
return nil, errorsx.InvalidParam("MCP未启用")
}
if len(cfg.MCP.Servers) == 0 {
return nil, nil
}
serverCodes := make([]string, 0, len(cfg.MCP.Servers))
for serverCode, server := range cfg.MCP.Servers {
if !server.Enabled {
continue
}
serverCodes = append(serverCodes, serverCode)
}
slices.Sort(serverCodes)
ret := make([]MCPToolCatalogItem, 0)
ret = append(ret, MCPToolCatalogItem{
ToolCode: toolx.BuiltinCreateTicketConfirmToolCode,
ServerCode: toolx.BuiltinToolCatalogServerCode,
ToolName: toolx.BuiltinCreateTicketConfirmToolName,
SourceType: toolx.BuiltinToolCatalogServerCode,
Title: toolx.BuiltinCreateTicketConfirmToolTitle,
Description: toolx.BuiltinCreateTicketConfirmToolDescription,
})
for _, serverCode := range serverCodes {
tools, err := mcps.Runtime.ListTools(ctx, serverCode)
if err != nil {
return nil, err
}
for _, item := range tools {
ret = append(ret, MCPToolCatalogItem{
ToolCode: toolx.BuildMCPToolCode(serverCode, item.Name),
ServerCode: serverCode,
ToolName: strings.TrimSpace(item.Name),
SourceType: "mcp",
Title: strings.TrimSpace(item.Title),
Description: strings.TrimSpace(item.Description),
InputSchema: item.InputSchema,
OutputSchema: item.OutputSchema,
})
}
}
return ret, nil
}
func (s *toolCatalogService) ValidateMCPToolCode(toolCode string) error {
return s.ValidateToolCode(toolCode)
}
func (s *toolCatalogService) ValidateToolCode(toolCode string) error {
cfg := config.Current()
toolCode = strings.TrimSpace(toolCode)
if toolCode == "" {
return errorsx.InvalidParam("toolCode不能为空")
}
if toolCode == toolx.BuiltinCreateTicketConfirmToolCode {
return nil
}
serverCode, toolName := toolx.SplitMCPToolCode(toolCode)
if serverCode == "" || toolName == "" {
return errorsx.InvalidParam("toolCode格式不合法")
}
if !cfg.MCP.Enabled {
return errorsx.InvalidParam("MCP未启用")
}
server, ok := cfg.MCP.Servers[serverCode]
if !ok || !server.Enabled {
return errorsx.InvalidParam("toolCode 绑定的 MCP 服务不存在或未启用")
}
return nil
}