Skip to content

SDK

Type-safe JS klijent za opencode server.

opencode JS/TS SDK pruza type-safe klijent za interakciju sa serverom. Koristite ga za izradu integracija i programsko upravljanje opencode-om.

Saznajte vise kako server radi. Za primjere pogledajte projects koje je napravila zajednica.


Instalacija

Instalirajte SDK sa npm-a:

Terminal window
npm install @opencode-ai/sdk

Kreiranje klijenta

Kreirajte instancu opencode:

import { createOpencode } from "@opencode-ai/sdk"
const { client } = await createOpencode()

Ovo pokrece i server i klijent

Opcije

OpcijaTipOpisDefault
hostnamestringHostname servera127.0.0.1
portnumberPort servera4096
signalAbortSignalAbort signal za otkazivanjeundefined
timeoutnumberTimeout u ms za start servera5000
configConfigKonfiguracijski objekat{}

Konfiguracija

Mozete proslijediti konfiguracijski objekat za prilagodavanje ponasanja. Instanca i dalje ucitava opencode.json, ali konfiguraciju mozete nadjacati ili dodati inline:

import { createOpencode } from "@opencode-ai/sdk"
const opencode = await createOpencode({
hostname: "127.0.0.1",
port: 4096,
config: {
model: "anthropic/claude-3-5-sonnet-20241022",
},
})
console.log(`Server running at ${opencode.server.url}`)
opencode.server.close()

Samo klijent

Ako vec imate pokrenutu opencode instancu, mozete napraviti klijentsku instancu i povezati se na nju:

import { createOpencodeClient } from "@opencode-ai/sdk"
const client = createOpencodeClient({
baseUrl: "http://localhost:4096",
})

Opcije

OpcijaTipOpisDefault
baseUrlstringURL serverahttp://localhost:4096
fetchfunctionPrilagodena fetch implementacijaglobalThis.fetch
parseAsstringMetoda parsiranja odgovoraauto
responseStylestringStil povrata: data ili fieldsfields
throwOnErrorbooleanBaci greske umjesto povratafalse

Tipovi

SDK ukljucuje TypeScript definicije za sve API tipove. Uvezite ih direktno:

import type { Session, Message, Part } from "@opencode-ai/sdk"

Svi tipovi su generisani iz OpenAPI specifikacije servera i dostupni u types datoteci.


Greške

SDK moze baciti greske koje mozete uhvatiti i obraditi:

try {
await client.session.get({ path: { id: "invalid-id" } })
} catch (error) {
console.error("Failed to get session:", (error as Error).message)
}

Strukturirani izlaz

Možete zatražiti strukturirani JSON izlaz od modela specificiranjem format sa JSON šemom. Model će koristiti StructuredOutput alat da vrati validirani JSON koji odgovara vašoj šemi.

Osnovna upotreba

const result = await client.session.prompt({
path: { id: sessionId },
body: {
parts: [{ type: "text", text: "Research Anthropic and provide company info" }],
format: {
type: "json_schema",
schema: {
type: "object",
properties: {
company: { type: "string", description: "Company name" },
founded: { type: "number", description: "Year founded" },
products: {
type: "array",
items: { type: "string" },
description: "Main products",
},
},
required: ["company", "founded"],
},
},
},
})
// Access the structured output
console.log(result.data.info.structured_output)
// { company: "Anthropic", founded: 2021, products: ["Claude", "Claude API"] }

Tipovi formata izlaza

TipOpis
textDefault. Standardni tekstualni odgovor (nema strukturiranog izlaza)
json_schemaVraća validirani JSON koji odgovara pruženoj šemi

Format JSON šeme

Kada koristite type: 'json_schema', navedite:

PoljeTipOpis
type'json_schema'Obavezno. Određuje JSON schema način rada
schemaobjectObavezno. JSON Schema objekt koji definira strukturu izlaza
retryCountnumberOpcionalno. Broj ponovnih pokušaja validacije (default: 2)

Rukovanje greškama

Ako model ne uspije proizvesti validan strukturirani izlaz nakon svih ponovnih pokušaja, odgovor će uključivati StructuredOutputError:

if (result.data.info.error?.name === "StructuredOutputError") {
console.error("Failed to produce structured output:", result.data.info.error.message)
console.error("Attempts:", result.data.info.error.retries)
}

Najbolje prakse

  1. Navedite jasne opise u svojstvima vaše šeme kako biste pomogli modelu da razumije koje podatke treba izdvojiti
  2. Koristite required da odredite koja polja moraju biti prisutna
  3. Držite šeme fokusiranim - složene ugniježđene šeme modelu mogu biti teže za ispravno popunjavanje
  4. Postavite odgovarajući retryCount - povećajte za složene šeme, smanjite za jednostavne

API-ji

SDK izlaže sve server API-je kroz type-safe klijent.


Global

MetodaOpisOdgovor
global.health()Provjera zdravlja i verzije{ healthy: true, version: string }

Primjeri

const health = await client.global.health()
console.log(health.data.version)

App

MetodaOpisOdgovor
app.log()Upis log zapisaboolean
app.agents()Lista dostupnih agenataAgent[]

Primjeri

// Write a log entry
await client.app.log({
body: {
service: "my-app",
level: "info",
message: "Operation completed",
},
})
// List available agents
const agents = await client.app.agents()

Project

MetodaOpisOdgovor
project.list()Lista svih projekataProject[]
project.current()Trenutni projekatProject

Primjeri

// List all projects
const projects = await client.project.list()
// Get current project
const currentProject = await client.project.current()

Path

MetodaOpisOdgovor
path.get()Trenutna putanjaPath

Primjeri

// Get current path information
const pathInfo = await client.path.get()

Konfiguracija

MetodaOpisOdgovor
config.get()Info o konfiguracijiConfig
config.providers()Lista provajdera i default modela{ providers: Provider[], default: { [key: string]: string } }

Primjeri

const config = await client.config.get()
const { providers, default: defaults } = await client.config.providers()

Sesije

MetodaOpisNapomene
session.list()List sessionsReturns Session[]
session.get({ path })Get sessionReturns Session
session.children({ path })List child sessionsReturns Session[]
session.create({ body })Create sessionReturns Session
session.delete({ path })Delete sessionReturns boolean
session.update({ path, body })Update session propertiesReturns Session
session.init({ path, body })Analyze app and create AGENTS.mdReturns boolean
session.abort({ path })Abort a running sessionReturns boolean
session.share({ path })Share sessionReturns Session
session.unshare({ path })Unshare sessionReturns Session
session.summarize({ path, body })Summarize sessionReturns boolean
session.messages({ path })List messages in a sessionReturns { info: Message, parts: Part[]}[]
session.message({ path })Get message detailsReturns { info: Message, parts: Part[]}
session.prompt({ path, body })Send prompt messagebody.noReply: true returns UserMessage (context only). Default returns AssistantMessage with AI response. Supports body.outputFormat for structured output
session.command({ path, body })Send command to sessionReturns { info: AssistantMessage, parts: Part[]}
session.shell({ path, body })Run a shell commandReturns AssistantMessage
session.revert({ path, body })Revert a messageReturns Session
session.unrevert({ path })Restore reverted messagesReturns Session
postSessionByIdPermissionsByPermissionId({ path, body })Respond to a permission requestReturns boolean

Primjeri

// Create and manage sessions
const session = await client.session.create({
body: { title: "My session" },
})
const sessions = await client.session.list()
// Send a prompt message
const result = await client.session.prompt({
path: { id: session.id },
body: {
model: { providerID: "anthropic", modelID: "claude-3-5-sonnet-20241022" },
parts: [{ type: "text", text: "Hello!" }],
},
})
// Inject context without triggering AI response (useful for plugins)
await client.session.prompt({
path: { id: session.id },
body: {
noReply: true,
parts: [{ type: "text", text: "You are a helpful assistant." }],
},
})

Datoteke

MetodaOpisOdgovor
find.text({ query })Search for text in filesArray of match objects with path, lines, line_number, absolute_offset, submatches
find.files({ query })Find files and directories by namestring[] (paths)
find.symbols({ query })Find workspace symbolsSymbol[]
file.read({ query })Read a file{ type: "raw" | "patch", content: string }
file.status({ query? })Get status for tracked filesFile[]

find.files supports a few optional query fields:

  • type: "file" or "directory"
  • directory: override the project root for the search
  • limit: max results (1–200)

Primjeri

// Search and read files
const textResults = await client.find.text({
query: { pattern: "function.*opencode" },
})
const files = await client.find.files({
query: { query: "*.ts", type: "file" },
})
const directories = await client.find.files({
query: { query: "packages", type: "directory", limit: 20 },
})
const content = await client.file.read({
query: { path: "src/index.ts" },
})

TUI

MetodaOpisOdgovor
tui.appendPrompt({ body })Append text to the promptboolean
tui.openHelp()Open the help dialogboolean
tui.openSessions()Open the session selectorboolean
tui.openThemes()Open the theme selectorboolean
tui.openModels()Open the model selectorboolean
tui.submitPrompt()Submit the current promptboolean
tui.clearPrompt()Clear the promptboolean
tui.executeCommand({ body })Execute a commandboolean
tui.showToast({ body })Show toast notificationboolean

Primjeri

// Control TUI interface
await client.tui.appendPrompt({
body: { text: "Add this to prompt" },
})
await client.tui.showToast({
body: { message: "Task completed", variant: "success" },
})

Auth

MetodaOpisOdgovor
auth.set({ ... })Set authentication credentialsboolean

Primjeri

await client.auth.set({
path: { id: "anthropic" },
body: { type: "api", key: "your-api-key" },
})

Događaji

MetodaOpisOdgovor
event.subscribe()Server-sent events streamServer-sent events stream

Primjeri

// Listen to real-time events
const events = await client.event.subscribe()
for await (const event of events.stream) {
console.log("Event:", event.type, event.properties)
}