Русский
Документация
Пользовательские инструменты

Пользовательские инструменты

Создавайте инструменты, которые LLM может вызывать в opencode.

Пользовательские инструменты — это функции, которые вы создаёте и которые LLM может вызывать во время разговоров. Они работают наряду со встроенными инструментами opencode, такими как read, write и bash.

Создание инструмента

Инструменты определяются как файлы TypeScript или JavaScript. Однако определение инструмента может вызывать скрипты, написанные на любом языке — TypeScript или JavaScript используется только для самого определения инструмента.

Расположение

Их можно определить:

  • Локально, поместив в директорию .opencode/tools/ вашего проекта.
  • Или глобально, поместив в ~/.config/opencode/tools/.

Структура

Самый простой способ создания инструментов — использование хелпера tool(), который обеспечивает типобезопасность и валидацию.

.opencode/tools/database.ts
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>:

.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:

.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}`
  },
})

Предпочитайте уникальные имена, если вы не хотите намеренно заменить встроенный инструмент. Если вы хотите отключить встроенный инструмент, но не переопределять его, используйте разрешения.

Аргументы

Вы можете использовать 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"
  },
}

Контекст

Инструменты получают контекст о текущей сессии:

.opencode/tools/project.ts
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-скрипт:

.opencode/tools/add.py
import sys
 
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)

Затем создайте определение инструмента, которое его вызывает:

.opencode/tools/python-add.ts
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-скрипта.