有位UP主总结的不错,我这边简单整理一下:
原视频https://www.bilibili.com/video/BV1QDNwz9Ex3
1. Skill其实不是工具本身,更像是一份"工具说明书"
这是最关键的一点,很多人一开始都会搞错。你可能会想,我加了一个叫"say-hi"的Skill,那模型不就多了一个"say-hi"的工具可以用吗?其实不是这样的。
博主翻了一下调试日志,发现模型那边看到的永远只有一个工具,名字就叫"skill"。你添加的所有本地Skill(比如say-hi),它们的名字和简介都被打包在一起,塞进了这个"skill"工具的"说明书"(description)里。模型是读了这份说明书,才知道"哦,原来我还能干这个"。
就像弹幕里有人说的:"skill是一个用来执行skill的工具"——听起来有点绕,但就是这么回事。
2. 整个调用过程其实是这样的
博主把整个流程拆解了一遍,挺清晰的:
-
第一步,模型发现:模型在聊天的时候,从"skill"工具的说明书里看到了"say-hi"这个选项,然后判断"用户说了hi,我应该调用这个"。
-
第二步,发起调用:模型不会直接回你"hi",而是先返回一个调用请求,说要使用"skill"这个工具,参数name填"say-hi"。注意啊,这里调用的工具名是"skill",不是"say-hi"。
-
第三步,程序干活:OpenCode收到请求后,才去硬盘上找到say-hi.md这个文件,把里面的内容完整读进内存。
-
第四步,把结果塞回去:程序把读到的Skill完整内容(就是say-hi.md的原文),以工具返回结果的形式,加到对话记录里,再传给模型。
