Files
opencode/packages/web/src/content/docs/zh-cn/custom-tools.mdx
2026-02-09 11:34:35 -06:00

171 lines
4.2 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 的[内置工具](/docs/tools) 一起工作,例如 `read`、`write` 和 `bash`。
---
## 創建工具
工具定义为 **TypeScript** 或 **JavaScript** 文件。但是,工具定义调用可以使用 **任何语言** 编写的脚本 - TypeScript 或 JavaScript 仅用于工具定义本身。
---
### 地點
它們可以定義為:
- 通过将它们放在项目的 `.opencode/tools/` 目录中来本地进行。
- Error 500 (Server Error)!!1500.Thats an error.There was an error. Please try again later.Thats all we know.
---
### 結構
创建工具最简单的方法是使用 `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`。
---
### 論據
您可以使用`tool.schema`(即[佐德](https://zod.dev))来定义参数类型。
```ts "tool.schema"
args: {
query: tool.schema.string().describe("SQL query to execute")
}
```
您还可以直接导入[佐德](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"
},
}
```
---
### 情境
工具接收有關當前會話的上下文:
```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 脚本。