| --- |
| title: Custom Tools |
| description: Create tools the LLM can call in OpenCode. |
| --- |
| |
| custom tool์ ๋ํ ์ค LLM์ด ํธ์ถํ ์ ์๋๋ก ์ฌ์ฉ์๊ฐ ์ง์ ๋ง๋ ํจ์์
๋๋ค. `read`, `write`, `bash` ๊ฐ์ OpenCode์ [built-in tools](/docs/tools)์ ํจ๊ป ๋์ํฉ๋๋ค. |
|
|
| --- |
| |
| |
|
|
| tool์ **TypeScript** ๋๋ **JavaScript** ํ์ผ๋ก ์ ์ํฉ๋๋ค. ๋ค๋ง tool ์ ์์์ ํธ์ถํ๋ ์คํฌ๋ฆฝํธ๋ **์ด๋ค ์ธ์ด๋ ** ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, TypeScript/JavaScript๋ tool ์ ์ ์์ฒด์๋ง ํ์ํฉ๋๋ค. |
|
|
| --- |
| |
| |
|
|
| tool์ ๋ค์ ์์น์ ๋ ์ ์์ต๋๋ค. |
|
|
| - ํ๋ก์ ํธ์ `.opencode/tools/` ๋๋ ํ ๋ฆฌ(๋ก์ปฌ) |
| - `~/.config/opencode/tools/` ๋๋ ํ ๋ฆฌ(์ ์ญ) |
|
|
| --- |
| |
| |
|
|
| tool์ ๊ฐ์ฅ ์ฝ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํ์
์์ ์ฑ๊ณผ validation์ ์ ๊ณตํ๋ `tool()` helper๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. |
|
|
| ```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}` |
| }, |
| }) |
| ``` |
|
|
| **ํ์ผ ์ด๋ฆ**์ด **tool ์ด๋ฆ**์ด ๋ฉ๋๋ค. ์ ์์๋ `database` tool์ ์์ฑํฉ๋๋ค. |
|
|
| --- |
| |
| |
|
|
| ํ๋์ ํ์ผ์์ ์ฌ๋ฌ tool์ exportํ ์๋ ์์ต๋๋ค. ๊ฐ export๋ **๋ณ๋์ tool**์ด ๋๋ฉฐ ์ด๋ฆ์ **`<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์ด ์์ฑ๋ฉ๋๋ค. |
|
|
| --- |
| |
| |
|
|
| ์ปค์คํ
๋๊ตฌ๋ ๋๊ตฌ ์ด๋ฆ์ผ๋ก ์๋ณ๋ฉ๋๋ค. ์ปค์คํ
๋๊ตฌ๊ฐ ๊ธฐ๋ณธ ๋๊ตฌ์ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ปค์คํ
๋๊ตฌ๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. |
|
|
| ์๋ฅผ ๋ค์ด, ์ด ํ์ผ์ ๊ธฐ๋ณธ `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`๋ก ์ ์ํ ์ ์์ต๋๋ค. `tool.schema`๋ [Zod](https://zod.dev) ๊ธฐ๋ฐ์
๋๋ค. |
|
|
| ```ts "tool.schema" |
| args: { |
| query: tool.schema.string().describe("SQL query to execute") |
| } |
| ``` |
|
|
| [Zod](https://zod.dev)๋ฅผ ์ง์ importํด์ ์ผ๋ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฐฉ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|
|
| ```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" |
| }, |
| } |
| ``` |
|
|
| --- |
| |
| |
|
|
| tool์ ํ์ฌ ์ธ์
์ 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`๋ฅผ ์ฌ์ฉํ์ธ์. |
| git worktree ๋ฃจํธ๋ `context.worktree`๋ฅผ ์ฌ์ฉํ์ธ์. |
|
|
| --- |
| |
| |
|
|
| |
|
|
| tool์ ์ํ๋ ์ธ์ด๋ก ์์ฑํ ์ ์์ต๋๋ค. ์๋๋ Python์ผ๋ก ๋ ์ซ์๋ฅผ ๋ํ๋ ์์์
๋๋ค. |
|
|
| ๋จผ์ Python ์คํฌ๋ฆฝํธ๋ก tool์ ๋ง๋ญ๋๋ค. |
|
|
| ```python title=".opencode/tools/add.py" |
| import sys |
|
|
| a = int(sys.argv[1]) |
| b = int(sys.argv[2]) |
| print(a + b) |
| ``` |
|
|
| ๊ทธ๋ค์ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถํ๋ tool ์ ์๋ฅผ ๋ง๋ญ๋๋ค. |
|
|
| ```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() |
| }, |
| }) |
| ``` |
|
|
| ์ฌ๊ธฐ์๋ Python ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ํด [`Bun.$`](https://bun.com/docs/runtime/shell) ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. |
|
|