Custom tools 是你自己创建的函数,LLM 可以在对话过程中调用它们。
它们可以与 opencode 的 built-in tools(例如 read、write、bash)一起协同工作。
创建一个 tool(Creating a tool)
Tools 可以定义为 TypeScript 或 JavaScript 文件。 不过,tool definition 可以调用 任何语言 编写的脚本 —— TypeScript 或 JavaScript 仅用于 tool 本身的定义。
位置(Location)
Tools 可以放在:
- 本地:放在项目目录下的
.opencode/tool/中。 - 全局:放在
~/.config/opencode/tool/中。
结构(Structure)
创建 tool 最简单的方式是使用 tool() helper,它可以提供类型安全(type-safety)和参数校验(validation)。
import { tool } from "@opencode-ai/plugin"export default tool({description: "Query the project database",args: {query: tool.schema.string().describe("SQL query to execute"),},async execute(args) {// Your database logic herereturn `Executed query: ${args.query}`},})
文件名(filename) 会成为 tool name。
上面的例子会创建一个名为 database 的 tool。
单文件定义多个 tools(Multiple tools per file)
你也可以在一个文件中导出多个 tools。 每一个 export 都会成为一个独立的 tool,命名规则为:
<filename>_<exportname>
示例:
import { tool } from "@opencode-ai/plugin"export const add = tool({description: "Add two numbers",args: {a: tool.schema.number().describe("First number"),b: tool.schema.number().describe("Second number"),},async execute(args) {return args.a + args.b},})export const multiply = tool({description: "Multiply two numbers",args: {a: tool.schema.number().describe("First number"),b: tool.schema.number().describe("Second number"),},async execute(args) {return args.a * args.b},})
这会生成两个 tools:
math_addmath_multiply
参数定义(Arguments)
你可以使用 tool.schema 来定义参数类型,它本质上就是 Zod。
args: {query: tool.schema.string().describe("SQL query to execute")}
你也可以直接引入 Zod,并返回一个普通对象:
import { z } from "zod"export default {description: "Tool description",args: {param: z.string().describe("Parameter description"),},async execute(args, context) {// Tool implementationreturn "result"},}
上下文(Context)
Tools 可以接收到当前 session 的上下文信息:
import { tool } from "@opencode-ai/plugin"export default tool({description: "Get project information",args: {},async execute(args, context) {// Access context informationconst { agent, sessionID, messageID } = contextreturn `Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}`},})
你可以从 context 中获取:
agentsessionIDmessageID
等信息。
示例(Examples)
使用 Python 编写一个 tool(Write a tool in Python)
你可以用任何你喜欢的语言来实现 tools。 下面是一个使用 Python 实现两个数字相加的示例。
首先,创建一个 Python 脚本作为实际逻辑:
import sysa = int(sys.argv[1])b = int(sys.argv[2])print(a + b)
然后,创建一个调用该脚本的 tool definition:
import { tool } from "@opencode-ai/plugin"export default tool({description: "Add two numbers using Python",args: {a: tool.schema.number().describe("First number"),b: tool.schema.number().describe("Second number"),},async execute(args) {const result = await Bun.$`python3 .opencode/tool/add.py ${args.a} ${args.b}`.text()return result.trim()},})
这里使用了 Bun.$ 工具来执行 Python 脚本。
