This repository has been archived on 2026-08-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Cyrene/backend/tool-engine/internal/service/tool_service.go
T
AskaEth 87214b9441 feat: Phase 1+2 架构进化 — 连续思考链/主动消息决策/情感状态机/离线自主思考 (86文件)
Phase 1 (基础设施):
- ThinkChain 思考链连续性 + 差异化思考提示词 (persistent)
- AutonomousToolPolicy 工具安全策略 (safe/unsafe/conditional)
- MessageScheduler 自适应消息节奏 (Idle/Available/Busy)
- SessionEnrichmentStore 渐进式上下文丰富 (5层)
- ConversationBus 事件总线 + ResponseCache (dedup)
- pkg/logger 统一日志 + 所有 handler 替换 fmt.Printf
- NPE 守卫/链路优化/数据库表修复/Go workspace

Phase 2 (人格交互):
- EmotionState/EmotionTracker 情感状态机 (5种心情, 情绪衰减)
- ProactiveGuard 主动消息多维决策 (静默时段/紧急度/频率/校验)
- Gateway↔ai-core 在线状态感知链路 (presence notification)
- 离线思考频率控制 + 重连问候 + 离线消息排队

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 15:25:12 +08:00

124 lines
3.2 KiB
Go

package service
import (
"context"
"fmt"
"github.com/yourname/cyrene-ai/pkg/logger"
"github.com/yourname/cyrene-ai/tool-engine/internal/model"
"github.com/yourname/cyrene-ai/tool-engine/internal/tools"
)
// ToolService 工具执行引擎
type ToolService struct {
registry map[string]tools.Tool
}
// NewToolService 创建工具服务,注册所有工具
func NewToolService(iotClient tools.IoTClientInterface, dataDir string) *ToolService {
svc := &ToolService{
registry: make(map[string]tools.Tool),
}
// 注册所有 13 个工具
svc.Register(tools.NewCalculatorTool())
svc.Register(tools.NewDateTimeTool())
svc.Register(tools.NewTextTool())
svc.Register(tools.NewCryptoTool())
svc.Register(tools.NewRandomTool())
svc.Register(tools.NewMarkdownTool())
svc.Register(tools.NewJSONTool())
svc.Register(tools.NewFileTool(dataDir))
svc.Register(tools.NewHTTPTool())
svc.Register(tools.NewWebSearchTool())
svc.Register(tools.NewWebFetchTool())
// IoT 工具(需要 IoT 客户端)
if iotClient != nil {
svc.Register(tools.NewIoTQueryTool(iotClient))
svc.Register(tools.NewIoTControlTool(iotClient))
} else {
logger.Println("[tool-service] IoT 客户端未配置,跳过 IoT 工具注册")
}
return svc
}
// Register 注册工具
func (s *ToolService) Register(tool tools.Tool) {
def := tool.Definition()
s.registry[def.Name] = tool
logger.Printf("[tool-service] 已注册工具: %s", def.Name)
}
// ListTools 获取所有工具定义
func (s *ToolService) ListTools() []model.ToolDefinition {
defs := make([]model.ToolDefinition, 0, len(s.registry))
for _, tool := range s.registry {
defs = append(defs, tool.Definition())
}
return defs
}
// GetTool 获取单个工具定义
func (s *ToolService) GetTool(name string) (*model.ToolDefinition, bool) {
tool, ok := s.registry[name]
if !ok {
return nil, false
}
def := tool.Definition()
return &def, true
}
// Execute 执行单个工具
func (s *ToolService) Execute(ctx context.Context, name string, arguments map[string]interface{}) (*model.ToolResult, error) {
tool, ok := s.registry[name]
if !ok {
return &model.ToolResult{
Output: "",
Error: fmt.Sprintf("工具 %s 不存在", name),
}, nil
}
logger.Printf("[tool-service] 执行工具: %s", name)
result, err := tool.Execute(ctx, arguments)
if err != nil {
logger.Printf("[tool-service] 工具 %s 执行错误: %v", name, err)
return &model.ToolResult{
Output: "",
Error: fmt.Sprintf("执行工具 %s 失败: %v", name, err),
}, nil
}
if result.Error != "" {
logger.Printf("[tool-service] 工具 %s 返回错误: %s", name, result.Error)
} else {
logger.Printf("[tool-service] 工具 %s 执行成功", name)
}
return result, nil
}
// ExecuteBatch 批量执行工具调用
func (s *ToolService) ExecuteBatch(ctx context.Context, calls []model.ToolCall) *model.BatchExecuteResponse {
results := make([]model.ToolResult, 0, len(calls))
for _, call := range calls {
result, err := s.Execute(ctx, call.Name, call.Arguments)
if err != nil {
results = append(results, model.ToolResult{
ID: call.ID,
Output: "",
Error: err.Error(),
})
continue
}
result.ID = call.ID
results = append(results, *result)
}
return &model.BatchExecuteResponse{
Results: results,
}
}