第 4 卷
那两个工具没删,模型怎么知道如何用?
清单换了形式:框架用 schema 现场生成 TypeScript SDK 塞进提示词。读清单抓三样(中文注释是我加的,其余照录运行输出):
3
| 4 | interfaceToolArgsMap{ | //能调什么 |
|---|---|---|
| 5 | /** Add two numbers. */ | |
| 6 | add: { | |
| 7 | /** First addend */ | |
| 8 | a:number; | |
| 9 | /** Second addend */ | |
| 10 | b:number; | |
| 11 | } &Record<string, jsonvalue>; | |
| 12 | /** Report the runtime environment. */ | |
| 13 | env_probe:Record<string, jsonvalue>; | |
| 14 | } |
15 16interface ToolOutputMap {// 返回什么
17add: number;
18env_probe: { 19platform?: string;
20node?: string;
21};
22} 23
24type ToolName = keyof ToolOutputMap 25
| 26 | declareclassToolCallErrorextendsError{ | //失败抛什么 |
|---|---|---|
| 27 | readonlyname:"ToolCallError"; | |
| 28 | readonlytoolName:ToolName; | |
| 29 | } |
30
| 31 | declareconsttools: { | //模型就这么调 |
|---|---|---|
| 32 | [KinToolName]:(args:ToolArgsMap[K]) =>Promise<tooloutputmap[k]>; | |
| 33 | }</tooloutputmap[k]></string, jsonvalue></string, jsonvalue> |
SDK 是 schema 的忠实翻译;env_probe 字段带 ?,因为 schema 没写 required,少写一个 required,模型看到的就是这个字段可能不存在(code mode 下模型看到的与 native
mode 不同)。
程序在哪跑、怎么调到工具?
Provider,程序就在独立 worker 线程里跑。tools.add、tools.env_probe 是运行时注入的绑定,每次调用都桥接回注册表、走完整流水线。
整串步骤在 worker 线程里跑完:中间结果留在变量里——逐次往返没了,只剩“发一次程序、收一份结果”:
复制代码 1//(此处代码仅用于演示,未接真实模型)
| 2 | constsum =awaittools.add({a:1,b:2}) |
|---|---|
| 3 | constenv =awaittools.env_probe({}) |
| 4 | console.log('platform =', env.platform) |
| 5 | return{ sum,platform: env.platform} |
跑出来:
复制代码 1{"isError": false,"content": [{"type": "text","text": "platform = darwin\n{\n\"
其中 content 的 text 渲染出来,就是模型看到的样子:
复制代码 1platform = darwin
2{ 3"sum": 3,
4"platform": "darwin"
5}
四个动作:add 求和、env_probe 探环境、console.log 进 logs、return 进 result ——两次调用只把渲染出的这份 content 送回模型上下文;中间值只活在程序变量里。