Buckets:
| 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 | |
Xet Storage Details
- Size:
- 7.99 kB
- Xet hash:
- 7439f978b6b07ed1736a39607b420a7d626939d90d5cdce7aad9d84f0fc0c833
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.