v1.3 Registry 实现重构 + 第一把真实工具

- Registry 从纯接口升级为完整实现:Register/Execute/路由查找/错误自愈
- 新增 BaseTool 接口,统一工具契约
- 新增 ReadFileTool,首个真实工具实现(路径防穿越 + 截断保护)
- 新增 String() 方法,Registry/Engine 调试可视化
- 新增 ToolCall 执行状态日志
- cmd/claw 切换为真实 Registry + ReadFileTool
This commit is contained in:
zhuyongxin
2026-05-15 11:24:42 +08:00
parent daa89531f5
commit b94460083a
6 changed files with 240 additions and 53 deletions
+25 -50
View File
@@ -4,63 +4,38 @@ import (
"context"
"log"
"os"
"fmt"
"go-tiny-claw/internal/engine"
"go-tiny-claw/internal/schema"
"go-tiny-claw/internal/provider"
"go-tiny-claw/internal/tools"
)
// 伪造的工具注册表 (用于测试 Provider 的工具提取能力)
type mockRegistry struct{}
func (m *mockRegistry) GetAvailableTools() []schema.ToolDefinition {
return []schema.ToolDefinition{
{
Name: "get_weather",
Description: "获取指定城市的当前天气情况。",
InputSchema: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"city": map[string]interface{}{
"type": "string",
},
},
"required": []string{"city"},
},
},
}
}
func (m *mockRegistry) Execute(ctx context.Context, call schema.ToolCall) schema.ToolResult {
log.Printf(" -> [Mock 工具执行] 获取 %s 的天气中...\n", call.Name)
return schema.ToolResult{
ToolCallID: call.ID,
Output: "API 返回:今天是晴天,气温 25 度。",
IsError: false,
}
}
func main() {
fmt.Printf("11111")
workDir, _ := os.Getwd()
// 1. 初始化真实的 Provider大脑 (指向智谱 GLM-4.5)
// 这里你可以任意切换 NewZhipuClaudeProvider 或 NewZhipuOpenAIProvider,效果完全一致!
llmProvider := provider.DeepseekOpenAIProvider("deepseek-v4-flash")
// 2. 注入伪造的工具注册表
registry := &mockRegistry{}
workDir, _ := os.Getwd()
// 3. 实例化并运行引擎,开启 EnableThinking = true (开启慢思考阶段!)
eng := engine.NewAgentEngine(llmProvider, registry, workDir, true)
// 1. 初始化真实的 Provider大脑
// 这里你可以任意切换 NewZhipuClaudeProvider 或 NewZhipuOpenAIProvider,效果完全一致!
llmProvider := provider.DeepseekOpenAIProvider("deepseek-v4-flash")
// 设定测试任务
prompt := "我想去北京跑步,帮我查查天气适合吗?"
// 3. 初始化真实的 Tool Registry
registry := tools.NewRegistry()
err := eng.Run(context.Background(), prompt)
if err != nil {
log.Fatalf("引擎运行崩溃: %v", err)
}
}
// 4. 将真实的 ReadFile 工具挂载到注册表中
readFileTool := tools.NewReadFileTool(workDir)
registry.Register(readFileTool)
// 5. 实例化核心引擎,由于任务简单,我们关闭思考阶段 (EnableThinking = false) 以加快速度
eng := engine.NewAgentEngine(llmProvider, registry, workDir, false)
log.Printf("registry: %s\n", registry)
log.Printf("engine: %s\n", eng)
// 6. 下发一个必须通过真实工具才能完成的任务
prompt := "请调用工具读取一下当前工作区目录下 hello.txt 文件的内容,并用一句话向我总结它说了什么。"
err := eng.Run(context.Background(), prompt)
if err != nil {
log.Fatalf("引擎运行崩溃: %v", err)
}
}