Files
opencode/packages/web/src/content/docs/zh-cn/custom-tools.mdx
2026-02-10 20:22:30 +00:00

171 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 自定义工具
description: 创建 LLM 可以在 opencode 中调用的工具。
---
自定义工具是您创建的函数LLM 可以在对话期间调用。它们与 opencode 的 [Built-in Tools](/docs/tools) 一起工作,例如 `read`、`write` 和 `bash`。
---
## 创建工具
工具定义为 **TypeScript** 或 **JavaScript** 文件。但是,工具定义调用可以使用 **任何语言** 编写的脚本 - TypeScript 或 JavaScript 仅用于工具定义本身。
---
### Location
它们可以定义为:
- 通过将它们放在项目的 `.opencode/tools/` 目录中来本地进行。
- 或者在全局范围内,将它们放在 `~/.config/opencode/tools/` 中。
---
### Structure
创建工具最简单的方法是使用 `tool()` 帮助程序,它提供类型安全和验证。
```ts title=".opencode/tools/database.ts" {1}
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 here
return `Executed query: ${args.query}`
},
})
```
**文件名** 成为 **工具名称**。以上创建了一个 `database` 工具。
---
#### 每个文件多个工具
您还可以从单个文件导出多个工具。每个导出都会成为 **一个单独的工具**,名称为 **`<filename>_<exportname>`**
```ts title=".opencode/tools/math.ts"
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
},
})
```
这将创建两个工具:`math_add` 和 `math_multiply`。
---
### Arguments
您可以使用 `tool.schema`(即 [Zod](https://zod.dev))来定义参数类型。
```ts "tool.schema"
args: {
query: tool.schema.string().describe("SQL query to execute")
}
```
您还可以直接导入 [Zod](https://zod.dev) 并返回一个普通对象:
```ts {6}
import { z } from "zod"
export default {
description: "Tool description",
args: {
param: z.string().describe("Parameter description"),
},
async execute(args, context) {
// Tool implementation
return "result"
},
}
```
---
### Context
工具接收有关当前会话的上下文:
```ts title=".opencode/tools/project.ts" {8}
import { tool } from "@opencode-ai/plugin"
export default tool({
description: "Get project information",
args: {},
async execute(args, context) {
// Access context information
const { agent, sessionID, messageID, directory, worktree } = context
return `Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}, Directory: ${directory}, Worktree: ${worktree}`
},
})
```
使用 `context.directory` 作为会话工作目录。
使用 `context.worktree` 作为 git 工作树根。
---
## 示例
### 使用 Python 编写工具
您可以使用任何您想要的语言编写工具。下面是一个使用 Python 将两个数字相加的示例。
首先,使用创建 Python 脚本的工具:
```python title=".opencode/tools/add.py"
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)
```
然后创建调用它的工具定义:
```ts title=".opencode/tools/python-add.ts" {10}
import { tool } from "@opencode-ai/plugin"
import path from "path"
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, context) {
const script = path.join(context.worktree, ".opencode/tools/add.py")
const result = await Bun.$`python3 ${script} ${args.a} ${args.b}`.text()
return result.trim()
},
})
```
这里我们使用 [`Bun.$`](https://bun.com/docs/runtime/shell) 实用程序来运行 Python 脚本。