Download packages/web/src/content/docs/ko/custom-tools.mdx from SaylorTwift/opencode: direct link, hf CLI and curl.
- Browser
- Download file 5.37 kB
-
https://huggingface.co/SaylorTwift/opencode/resolve/main/packages/web/src/content/docs/ko/custom-tools.mdx
- Command line
-
hf download hf://SaylorTwift/opencode/packages/web/src/content/docs/ko/custom-tools.mdx
-
curl -L -o custom-tools.mdx https://huggingface.co/SaylorTwift/opencode/resolve/main/packages/web/src/content/docs/ko/custom-tools.mdx
5.37 kB
| 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 ์ ์ | |
| ํ๋์ ํ์ผ์์ ์ฌ๋ฌ 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" | |
| }, | |
| } | |
| ``` | |
| ### Context | |
| 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`๋ฅผ ์ฌ์ฉํ์ธ์. | |
| ## ์์ | |
| ### Python์ผ๋ก tool ์์ฑ | |
| 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) ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. | |