Back to Opencode

SDK

packages/web/src/content/docs/bs/sdk.mdx

1.14.3919.6 KB
Original Source

import config from "../../../../config.mjs" export const typesUrl = ${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts

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:

bash
npm install @opencode-ai/sdk

Kreiranje klijenta

Kreirajte instancu opencode:

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

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

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

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

Svi tipovi su generisani iz OpenAPI specifikacije servera i dostupni u <a href={typesUrl}>types datoteci</a>.


Greške

SDK moze baciti greske koje mozete uhvatiti i obraditi:

typescript
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

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

typescript
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

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

App

MetodaOpisOdgovor
app.log()Upis log zapisaboolean
app.agents()Lista dostupnih agenata<a href={typesUrl}><code>Agent[]</code></a>

Primjeri

javascript
// 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 projekata<a href={typesUrl}><code>Project[]</code></a>
project.current()Trenutni projekat<a href={typesUrl}><code>Project</code></a>

Primjeri

javascript
// List all projects
const projects = await client.project.list()

// Get current project
const currentProject = await client.project.current()

Path

MetodaOpisOdgovor
path.get()Trenutna putanja<a href={typesUrl}><code>Path</code></a>

Primjeri

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

Konfiguracija

MetodaOpisOdgovor
config.get()Info o konfiguraciji<a href={typesUrl}><code>Config</code></a>
config.providers()Lista provajdera i default modela{ providers: <a href={typesUrl}><code>Provider[]</code></a>, default: { [key: string]: string } }

Primjeri

javascript
const config = await client.config.get()

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

Sesije

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

Primjeri

javascript
// 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 symbols<a href={typesUrl}><code>Symbol[]</code></a>
file.read({ query })Read a file{ type: "raw" | "patch", content: string }
file.status({ query? })Get status for tracked files<a href={typesUrl}><code>File[]</code></a>

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

javascript
// 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

javascript
// 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

javascript
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

javascript
// 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)
}