커스텀 도구
opencode에서 LLM이 호출할 수 있는 도구를 만드세요.
커스텀 도구는 여러분이 만드는 함수로, LLM이 대화 중에 호출할 수 있습니다. opencode의 내장 도구인 read, write, bash와 함께 작동합니다.
도구 만들기
도구는 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 도구를 생성합니다.
파일당 여러 도구
단일 파일에서 여러 도구를 내보낼 수도 있습니다. 각 내보내기는 <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 두 개의 도구가 생성됩니다.
인수
tool.schema를 사용하여 인수 타입을 정의할 수 있습니다. 이것은 Zod (opens in a new tab)입니다.
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 worktree 루트에는 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 스크립트를 실행합니다.