v1.3 Registry 实现重构 + 第一把真实工具
- Registry 从纯接口升级为完整实现:Register/Execute/路由查找/错误自愈 - 新增 BaseTool 接口,统一工具契约 - 新增 ReadFileTool,首个真实工具实现(路径防穿越 + 截断保护) - 新增 String() 方法,Registry/Engine 调试可视化 - 新增 ToolCall 执行状态日志 - cmd/claw 切换为真实 Registry + ReadFileTool
This commit is contained in:
+25
-50
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user