커스텀 도구
opencode에서 LLM이 호출할 수 있는 도구를 만드세요.
커스텀 도구는 대화 중에 LLM이 호출할 수 있도록 직접 만드는 함수입니다. read, write, bash 같은 opencode의 내장 도구와 함께 작동합니다.
도구 만들기
도구는 TypeScript 또는 JavaScript 파일로 정의됩니다. 단, 도구 정의는 어떤 언어로든 작성된 스크립트를 호출할 수 있습니다. TypeScript 또는 JavaScript는 도구 정의 자체에만 사용됩니다.
위치
다음 위치에 정의할 수 있습니다:
- 로컬: 프로젝트의
.opencode/tools/디렉터리에 배치. - 또는 전역:
~/.config/opencode/tools/에 배치.
구조
도구를 만드는 가장 쉬운 방법은 타입 안전성과 검증을 제공하는 tool() 헬퍼를 사용하는 것입니다.
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 도구를 만듭니다.
파일당 여러 도구
단일 파일에서 여러 도구를 내보낼 수도 있습니다. 각 export는 <filename>_<exportname> 이름의 별도 도구가 됩니다:
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 도구를 대체합니다:
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: 의도적으로 내장 도구를 대체하려는 경우가 아니라면 고유한 이름을 사용하는 것이 좋습니다. 내장 도구를 비활성화하되 재정의하지 않으려면, 권한을 사용하세요.
인수
Zod (opens in a new tab)일 뿐인 tool.schema를 사용하여 인수 타입을 정의할 수 있습니다.
args: {
query: tool.schema.string().describe("SQL query to execute")
}Zod (opens in a new tab)를 직접 가져와서 일반 객체를 반환할 수도 있습니다:
import { z } from "zod"
export default {
description: "Tool description",
args: {
param: z.string().describe("Parameter description"),
},
async execute(args, context) {
// Tool implementation
return "result"
},
}컨텍스트
도구는 현재 세션에 대한 컨텍스트를 받습니다:
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 워크트리 루트에는 context.worktree를 사용하세요.
예시
Python으로 도구 작성하기
도구는 원하는 어떤 언어로든 작성할 수 있습니다. 다음은 Python을 사용하여 두 숫자를 더하는 예시입니다.
먼저, 도구를 Python 스크립트로 만듭니다:
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)그런 다음 이를 호출하는 도구 정의를 만듭니다:
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.$ (opens in a new tab) 유틸리티를 사용하여 Python 스크립트를 실행합니다.