Перейти к содержимому

SDK

Типобезопасный JS-клиент для сервера opencode.

SDK JS/TS с открытым кодом предоставляет типобезопасный клиент для взаимодействия с сервером. Используйте его для создания интеграции и программного управления открытым кодом.

Узнайте больше о том, как работает сервер. Примеры можно найти в projects, созданном сообществом.


Установить

Установите SDK из npm:

Окно терминала
npm install @opencode-ai/sdk

Создать клиента

Создайте экземпляр opencode:

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

Это запускает и сервер, и клиент.

Параметры

ВариантТипОписаниеПо умолчанию
hostnamestringServer hostname127.0.0.1
portnumberServer port4096
signalAbortSignalAbort signal for cancellationundefined
timeoutnumberTimeout in ms for server start5000
configConfigConfiguration object{}

Конфигурация

Вы можете передать объект конфигурации для настройки поведения. Экземпляр по-прежнему получает ваш opencode.json, но вы можете переопределить или добавить встроенную конфигурацию:

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()

Только клиент

Если у вас уже есть работающий экземпляр opencode, вы можете создать экземпляр клиента для подключения к нему:

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

Параметры

ВариантТипОписаниеПо умолчанию
baseUrlstringURL of the serverhttp://localhost:4096
fetchfunctionCustom fetch implementationglobalThis.fetch
parseAsstringResponse parsing methodauto
responseStylestringReturn style: data or fieldsfields
throwOnErrorbooleanThrow errors instead of returnfalse

Типы

SDK включает определения TypeScript для всех типов API. Импортируйте их напрямую:

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

Все типы генерируются на основе спецификации OpenAPI сервера и доступны в файле types.


Ошибки

SDK может выдавать ошибки, которые вы можете отловить и обработать:

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

Структурированный вывод

Вы можете запросить структурированный вывод JSON от модели, указав format со схемой JSON. Модель будет использовать инструмент StructuredOutput для возврата проверенного JSON, соответствующего вашей схеме.

Основное использование

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"] }

Типы форматов вывода

ТипОписание
textПо умолчанию. Стандартный текстовый ответ (без структурированного вывода)
json_schemaВозвращает проверенный JSON, соответствующий предоставленной схеме

Формат схемы JSON

При использовании type: 'json_schema', укажите:

ПолеТипОписание
type'json_schema'Обязательно. Указывает режим схемы JSON
schemaobjectОбязательно. Объект JSON Schema, определяющий структуру вывода
retryCountnumberНеобязательно. Количество повторных попыток проверки (по умолчанию: 2)

Обработка ошибок

Если модель не может выдать действительный структурированный вывод после всех повторных попыток, ответ будет включать 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)
}

Лучшие практики

  1. Предоставляйте четкие описания в свойствах вашей схемы, чтобы помочь модели понять, какие данные извлекать
  2. Используйте required, чтобы указать, какие поля должны присутствовать
  3. Делайте схемы сфокусированными — сложные вложенные схемы могут быть труднее для правильного заполнения моделью
  4. Устанавливайте соответствующий retryCount — увеличивайте для сложных схем, уменьшайте для простых

API

SDK предоставляет все серверные API через типобезопасный клиент.


Глобальный

МетодОписаниеОтвет
global.health()Check server health and version{ healthy: true, version: string }

Примеры

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

Приложение

МетодОписаниеОтвет
app.log()Write a log entryboolean
app.agents()List all available agentsAgent[]

Примеры

// 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.list()List all projectsProject[]
project.current()Get current projectProject

Примеры

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

Путь

МетодОписаниеОтвет
path.get()Get current pathPath

Примеры

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

Конфигурация

МетодОписаниеОтвет
config.get()Get config infoConfig
config.providers()List providers and default models{ providers: Provider[], default: { [key: string]: string } }

Примеры

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

Сессии

МетодОписаниеПримечания
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 возвращает UserMessage (только контекст). По умолчанию возвращает AssistantMessage с ответом ИИ. Поддерживает body.outputFormat для структурированного вывода
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

Примеры

// 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." }],
},
})

Файлы

МетодОписаниеОтвет
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 поддерживает несколько дополнительных полей запроса:

  • type: "file" или "directory"
  • directory: переопределить корень проекта для поиска.
  • limit: максимальное количество результатов (1–200)

Примеры

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

МетодОписаниеОтвет
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

Примеры

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

Аутентификация

МетодОписаниеОтвет
auth.set({ ... })Set authentication credentialsboolean

Примеры

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

События

МетодОписаниеОтвет
event.subscribe()Server-sent events streamServer-sent events stream

Примеры

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