Custom tools 是你自己创建的函数,LLM 可以在对话过程中调用它们。 它们可以与 opencode 的 built-in tools(例如 readwritebash)一起协同工作。


创建一个 tool(Creating a tool)

Tools 可以定义为 TypeScriptJavaScript 文件。 不过,tool definition 可以调用 任何语言 编写的脚本 —— TypeScript 或 JavaScript 仅用于 tool 本身的定义。


位置(Location)

Tools 可以放在:

  • 本地:放在项目目录下的 .opencode/tool/ 中。
  • 全局:放在 ~/.config/opencode/tool/ 中。

结构(Structure)

创建 tool 最简单的方式是使用 tool() helper,它可以提供类型安全(type-safety)和参数校验(validation)。

  1. import { tool } from "@opencode-ai/plugin"
  2. export default tool({
  3. description: "Query the project database",
  4. args: {
  5. query: tool.schema.string().describe("SQL query to execute"),
  6. },
  7. async execute(args) {
  8. // Your database logic here
  9. return `Executed query: ${args.query}`
  10. },
  11. })

文件名(filename) 会成为 tool name。 上面的例子会创建一个名为 database 的 tool。


单文件定义多个 tools(Multiple tools per file)

你也可以在一个文件中导出多个 tools。 每一个 export 都会成为一个独立的 tool,命名规则为:

  1. <filename>_<exportname>

示例:

  1. import { tool } from "@opencode-ai/plugin"
  2. export const add = tool({
  3. description: "Add two numbers",
  4. args: {
  5. a: tool.schema.number().describe("First number"),
  6. b: tool.schema.number().describe("Second number"),
  7. },
  8. async execute(args) {
  9. return args.a + args.b
  10. },
  11. })
  12. export const multiply = tool({
  13. description: "Multiply two numbers",
  14. args: {
  15. a: tool.schema.number().describe("First number"),
  16. b: tool.schema.number().describe("Second number"),
  17. },
  18. async execute(args) {
  19. return args.a * args.b
  20. },
  21. })

这会生成两个 tools:

  • math_add
  • math_multiply

参数定义(Arguments)

你可以使用 tool.schema 来定义参数类型,它本质上就是 Zod

  1. args: {
  2. query: tool.schema.string().describe("SQL query to execute")
  3. }

你也可以直接引入 Zod,并返回一个普通对象:

  1. import { z } from "zod"
  2. export default {
  3. description: "Tool description",
  4. args: {
  5. param: z.string().describe("Parameter description"),
  6. },
  7. async execute(args, context) {
  8. // Tool implementation
  9. return "result"
  10. },
  11. }

上下文(Context)

Tools 可以接收到当前 session 的上下文信息:

  1. import { tool } from "@opencode-ai/plugin"
  2. export default tool({
  3. description: "Get project information",
  4. args: {},
  5. async execute(args, context) {
  6. // Access context information
  7. const { agent, sessionID, messageID } = context
  8. return `Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}`
  9. },
  10. })

你可以从 context 中获取:

  • agent
  • sessionID
  • messageID

等信息。


示例(Examples)

使用 Python 编写一个 tool(Write a tool in Python)

你可以用任何你喜欢的语言来实现 tools。 下面是一个使用 Python 实现两个数字相加的示例。

首先,创建一个 Python 脚本作为实际逻辑:

  1. import sys
  2. a = int(sys.argv[1])
  3. b = int(sys.argv[2])
  4. print(a + b)

然后,创建一个调用该脚本的 tool definition:

  1. import { tool } from "@opencode-ai/plugin"
  2. export default tool({
  3. description: "Add two numbers using Python",
  4. args: {
  5. a: tool.schema.number().describe("First number"),
  6. b: tool.schema.number().describe("Second number"),
  7. },
  8. async execute(args) {
  9. const result = await Bun.$`python3 .opencode/tool/add.py ${args.a} ${args.b}`.text()
  10. return result.trim()
  11. },
  12. })

这里使用了 Bun.$ 工具来执行 Python 脚本。