Files
tf_code/packages/web/src/content/docs/da/custom-tools.mdx
2026-02-09 11:34:35 -06:00

171 lines
4.3 KiB
Plaintext

---
title: Brugerdefinerede værktøjer
description: Opret værktøjer, som LLM kan kalde opencode ind.
---
Brugerdefinerede værktøjer er funktioner, du opretter, som LLM kan kalde under samtaler. De arbejder sammen med opencodes [built-in tools](/docs/tools) som `read`, `write` og `bash`.
---
## Oprettelse af et værktøj
Værktøjer er defineret som **TypeScript**- eller **JavaScript**-filer. Værktøjsdefinitionen kan dog kalde scripts skrevet på **alle sprog** - TypeScript eller JavaScript bruges kun til selve værktøjsdefinitionen.
---
### Placering
De kan definere:
- Lokalt ved at placere dem i biblioteket `.opencode/tools/` i dit projekt.
- Eller globalt ved at placere dem i `~/.config/opencode/tools/`.
---
### Struktur
Den nemmeste måde at oprette værktøjer på er at bruge `tool()`-hjælperen, som giver typesikkerhed og validering.
```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}`
},
})
```
**filnavnet** bliver **værktøjsnavnet**. Ovenstående opretter et `database` værktøj.
---
#### Flere værktøjer pr. fil
Du kan også eksportere flere værktøjer fra en enkelt fil. Hver eksport bliver **et separat værktøj** med navnet **`<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
},
})
```
Dette skaber værktøjer: `math_add` og `math_multiply`.
---
### Argumenter
Du kan bruge `tool.schema`, som kun er [Zod](https://zod.dev), til at definere argumenttyper.
```ts "tool.schema"
args: {
query: tool.schema.string().describe("SQL query to execute")
}
```
Du kan også importere [Zod](https://zod.dev) direkte og returnere et almindeligt objekt:
```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"
},
}
```
---
### Kontekst
Værktøjer modtager kontekst om den aktuelle session:
```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}`
},
})
```
Brug `context.directory` til sessionens arbejdsmappe.
Brug `context.worktree` til git-arbejdstræets rod.
---
## Eksempler
### Skriv et værktøj i Python
Du kan skrive dine værktøjer på et hvilket som helst sprog, du ønsker. Her er et eksempel, der tilføjer til tal ved hjælp af Python.
Først skal du oprette værktøjet som et Python-script:
```python title=".opencode/tools/add.py"
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)
```
Opret derefter værktøjsdefinitionen, der kalder den:
```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()
},
})
```
Her bruger vi [`Bun.$`](https://bun.com/docs/runtime/shell)-værktøjet til at køre Python-scriptet.