Zum Inhalt springen

Benutzerdefinierte Tools

Erstellen Sie Tools, die der LLM in opencode aufrufen kann.

Benutzerdefinierte Tools sind Funktionen, die Sie erstellen und die der LLM waehrend Gesprachen aufrufen kann. Sie arbeiten neben den integrierten Tools von OpenCode wie read, write und bash.


Ein Tool erstellen

Tools werden als TypeScript- oder JavaScript-Dateien definiert. Die Tool-Definition kann jedoch Skripte aufrufen, die in beliebiger Sprache geschrieben sind — TypeScript oder JavaScript wird nur fur die Tool-Definition selbst verwendet.


Speicherort

Sie konnen definiert werden:

  • Lokal, indem Sie sie im Verzeichnis .opencode/tool/ Ihres Projekts platzieren.
  • Oder global, indem Sie sie in ~/.config/opencode/tool/ platzieren.

Struktur

Der einfachste Weg, Tools zu erstellen, ist die Verwendung des tool()-Helfers, der Typsicherheit und Validierung bietet.

.opencode/tool/database.ts
import { tool } from "@opencode-ai/plugin"
export default tool({
description: "Projektdatenbank abfragen",
args: {
query: tool.schema.string().describe("SQL-Abfrage zum Ausfuhren"),
},
async execute(args) {
// Ihre Datenbanklogik hier
return `Abfrage ausgefuhrt: ${args.query}`
},
})

Der Dateiname wird zum Tool-Namen. Das Obige erstellt ein database-Tool.


Mehrere Tools pro Datei

Sie konnen auch mehrere Tools aus einer einzigen Datei exportieren. Jeder Export wird zu einem separaten Tool mit dem Namen <dateiname>_<exportname> :

.opencode/tool/math.ts
import { tool } from "@opencode-ai/plugin"
export const add = tool({
description: "Zwei Zahlen addieren",
args: {
a: tool.schema.number().describe("Erste Zahl"),
b: tool.schema.number().describe("Zweite Zahl"),
},
async execute(args) {
return args.a + args.b
},
})
export const multiply = tool({
description: "Zwei Zahlen multiplizieren",
args: {
a: tool.schema.number().describe("Erste Zahl"),
b: tool.schema.number().describe("Zweite Zahl"),
},
async execute(args) {
return args.a * args.b
},
})

Dies erstellt zwei Tools: math_add und math_multiply.


Argumente

Sie konnen tool.schema verwenden, was einfach Zod ist, um Argumenttypen zu definieren.

args: {
query: tool.schema.string().describe("SQL-Abfrage zum Ausfuhren")
}

Sie konnen auch Zod direkt importieren und ein einfaches Objekt zuruckgeben:

import { z } from "zod"
export default {
description: "Tool-Beschreibung",
args: {
param: z.string().describe("Parameterbeschreibung"),
},
async execute(args, context) {
// Tool-Implementierung
return "Ergebnis"
},
}

Kontext

Tools erhalten Informationen uber die aktuelle Sitzung:

.opencode/tool/project.ts
import { tool } from "@opencode-ai/plugin"
export default tool({
description: "Projektinformationen abrufen",
args: {},
async execute(args, context) {
// Auf Kontextinformationen zugreifen
const { agent, sessionID, messageID } = context
return `Agent: ${agent}, Sitzung: ${sessionID}, Nachricht: ${messageID}`
},
})

Beispiele

Ein Tool in Python schreiben

Sie konnen Ihre Tools in jeder beliebigen Sprache schreiben. Hier ist ein Beispiel, das zwei Zahlen mit Python addiert.

Erstellen Sie zuerst das Tool als Python-Skript:

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

Erstellen Sie dann die Tool-Definition, die es aufruft:

.opencode/tool/python-add.ts
import { tool } from "@opencode-ai/plugin"
export default tool({
description: "Zwei Zahlen mit Python addieren",
args: {
a: tool.schema.number().describe("Erste Zahl"),
b: tool.schema.number().describe("Zweite Zahl"),
},
async execute(args) {
const result = await Bun.$`python3 .opencode/tool/add.py ${args.a} ${args.b}`.text()
return result.trim()
},
})

Hier verwenden wir das Bun.$-Dienstprogramm, um das Python-Skript auszufuhren.