第 7 章 · 工具调用(Tools)
7.1 Function Calling 原理
Function Calling 常被误解为「模型执行了代码」。恰恰相反——模型只输出一段 JSON 说"我想调用 X,参数是 Y",执行永远发生在宿主程序:
所以「给模型加工具」= 三件事:
- 声明:用 JSON Schema 描述工具名、用途、参数(模型据此决定能否用、怎么用)
- 执行:宿主程序真正干活
- 回填:把结果作为
role: 'tool'消息发回模型
7.2 OpenBudy 的工具三要素
在 src/types/index.ts 中定义:
// 1. 声明:给模型看的 JSON Schema(OpenAI function 格式)
interface ToolDefinition {
type: 'function'
function: {
name: string
description: string
parameters: Record<string, unknown> // JSON Schema
}
}
// 2. 执行上下文:每个工具执行时都能 拿到
interface ToolExecutionContext {
workspacePath: string
signal?: AbortSignal // 用户点停止 → abort
}
// 3. 处理器:真正干活的函数
type ToolHandler = (
args: Record<string, unknown>,
context: ToolExecutionContext
) => Promise<string> // 返回字符串(模型只认识文本)
注意 ToolHandler 返回的是 string 而非对象——工具输出最终会成为 role: 'tool' 消息的 content。结构化数据应自己 JSON.stringify。