数据截至 (上游 commit 9fe68b96f0a7)
Composio — 工具与执行主线
本章讲什么:
tools.get(拿到框架能用的工具)和tools.execute(真正调用一次工具)端到端怎么走,以及 before/after modifier 管线在哪两个位置插进去。读完你会知道 SDK 在一次工具调用里到底做了哪几件事。
1. 先看脊梁:两个方法
Composio 的工具世界只有两个核心动作:
| 动作 | 方法 | 干什么 |
|---|---|---|
| 取工具 | composio.tools.get(userId, filters) | 从后端拉工具 schema,套成 provider 格式,返回可直接喂给 agent 框架的工具 |
| 执行工具 | composio.tools.execute(slug, body) | 把工具 + 参数发到后端真正调用,返回结果 |
get 通常你只调一次(组装 agent 时);execute 在 agent 每次选用工具时被框架自动回调——不是你手动调的。这点很关键,见下一节。
2. tools.get:取工具 + 套格式 + 绑执行函数
它要解决的小问题
后端给的工具 schema 是「裸数据」(snake_case、跟某个框架无关)。agent 框架要的却是它自家格式的工具对象,而且工具被选中后还得知道「怎么真正执行」。get 把这两件事一次办了。
主线三步
tools.get(userId, {toolkits:['github']})
│
① getRawComposioTools ── HTTP ──▶ 后端 → 裸 schema(snake_case)
│ transformToolCases:转 camelCase + 严格 Zod 校验
│ applyDefaultSchemaModifiers:默认 schema 改写(如文件上传字段)
▼
② wrapToolsForProvider
│ createExecuteToolFn(userId):造一个「绑死了 userId 的执行闭包」
▼
③ provider.wrapTools(tools, executeFn)
│ 套成框架格式,把执行闭包塞进每个工具
▼
返回:框架能直接用、且自带执行能力的工具集合
第 ② 步是精髓:createExecuteToolFn 把 userId 提前柯里化进闭包里,这样 agent 框架后面调工具时只需传「工具名 + 参数」,不必再关心是哪个用户(models/Tools.ts:833-848):
private createExecuteToolFn(userId: string, modifiers?: ExecuteToolModifiers): ExecuteToolFn {
const executeToolFn = async (toolSlug: string, input: Record<string, unknown>) => {
return await this.execute(toolSlug, {
userId, // ← 提前绑死,框架不用再传
arguments: input,
dangerouslySkipVersionCheck: true, // agentic 流程默认跳版本检查(见 §5)
}, modifiers);
};
return executeToolFn;
}