197 lines
7.8 KiB
Plaintext
197 lines
7.8 KiB
Plaintext
---
|
|
title: เครื่องมือที่กำหนดเอง
|
|
description: สร้างเครื่องมือที่ LLM สามารถเรียกใช้ใน opencode
|
|
---
|
|
|
|
เครื่องมือแบบกำหนดเองคือฟังก์ชันที่คุณสร้างขึ้นซึ่ง LLM สามารถเรียกใช้ระหว่างการสนทนาได้ โดยทำงานร่วมกับ [เครื่องมือในตัว](/docs/tools) ของ opencode เช่น `read`, `write` และ `bash`
|
|
|
|
---
|
|
|
|
## การสร้างเครื่องมือ
|
|
|
|
เครื่องมือถูกกำหนดให้เป็นไฟล์ **TypeScript** หรือ **JavaScript** อย่างไรก็ตาม คำจำกัดความของเครื่องมือสามารถเรียกใช้สคริปต์ที่เขียนใน **ภาษาใดก็ได้** — TypeScript หรือ JavaScript ใช้สำหรับคำจำกัดความของเครื่องมือเท่านั้น
|
|
|
|
---
|
|
|
|
### ที่ตั้ง
|
|
|
|
สามารถกำหนดได้:
|
|
|
|
- ภายในเครื่องโดยวางไว้ในไดเรกทอรี `.opencode/tools/` ของโครงการของคุณ
|
|
- หรือทั่วโลกโดยวางไว้ที่ `~/.config/opencode/tools/`
|
|
|
|
---
|
|
|
|
### โครงสร้าง
|
|
|
|
วิธีที่ง่ายที่สุดในการสร้างเครื่องมือคือการใช้ตัวช่วย `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`
|
|
|
|
---
|
|
|
|
#### ชื่อซ้ำกับเครื่องมือในตัว
|
|
|
|
เครื่องมือแบบกำหนดเองจะถูกระบุด้วยชื่อเครื่องมือ หากเครื่องมือแบบกำหนดเองใช้ชื่อเดียวกับเครื่องมือในตัว เครื่องมือแบบกำหนดเองจะมีความสำคัญเหนือกว่า
|
|
|
|
ตัวอย่างเช่น ไฟล์นี้จะแทนที่เครื่องมือ `bash` ในตัว:
|
|
|
|
```ts title=".opencode/tools/bash.ts"
|
|
import { tool } from "@opencode-ai/plugin"
|
|
|
|
export default tool({
|
|
description: "Restricted bash wrapper",
|
|
args: {
|
|
command: tool.schema.string(),
|
|
},
|
|
async execute(args) {
|
|
return `blocked: ${args.command}`
|
|
},
|
|
})
|
|
```
|
|
|
|
:::note
|
|
ชอบชื่อที่ไม่ซ้ำกันเว้นแต่คุณตั้งใจจะแทนที่เครื่องมือในตัว หากคุณต้องการปิดใช้งานเครื่องมือในตัวแต่ไม่ต้องการแทนที่ ให้ใช้ [permissions](/docs/permissions)
|
|
:::
|
|
|
|
---
|
|
|
|
### ข้อโต้แย้ง
|
|
|
|
คุณสามารถใช้ `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"
|
|
},
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### บริบท
|
|
|
|
เครื่องมือได้รับบริบทเกี่ยวกับเซสชันปัจจุบัน:
|
|
|
|
```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 worktree
|
|
|
|
---
|
|
|
|
## ตัวอย่าง
|
|
|
|
### เขียนเครื่องมือใน 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
|