SDK
Cliente JS con tipos seguros para el servidor de opencode.
El SDK JS/TS de opencode proporciona un cliente con tipos seguros para interactuar con el servidor. Úsalo para construir integraciones y controlar opencode programáticamente.
Aprende más sobre cómo funciona el servidor. Consulta los proyectos construidos por la comunidad.
Instalación
Instala el SDK desde npm:
npm install @opencode-ai/sdkCrear cliente
Crea una instancia de opencode:
import { createOpencode } from "@opencode-ai/sdk"
const { client } = await createOpencode()Esto inicia tanto un servidor como un cliente.
Opciones
| Opción | Tipo | Descripción | Predeterminado |
|---|---|---|---|
hostname | string | Nombre de host del servidor | 127.0.0.1 |
port | number | Puerto del servidor | 4096 |
signal | AbortSignal | Señal de cancelación | undefined |
timeout | number | Tiempo de espera en ms para inicio del servidor | 5000 |
config | Config | Objeto de configuración | {} |
Configuración
Puedes pasar un objeto de configuración para personalizar el comportamiento. La instancia aún lee tu opencode.json, pero puedes sobrescribir o agregar configuración en línea:
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()Solo cliente
Si ya tienes una instancia de opencode en ejecución, puedes crear una instancia de cliente para conectarte a ella:
import { createOpencodeClient } from "@opencode-ai/sdk"
const client = createOpencodeClient({
baseUrl: "http://localhost:4096",
})Opciones
| Opción | Tipo | Descripción | Predeterminado |
|---|---|---|---|
baseUrl | string | URL del servidor | http://localhost:4096 |
fetch | function | Implementación personalizada de fetch | globalThis.fetch |
parseAs | string | Método de análisis de respuesta | auto |
responseStyle | string | Estilo de retorno: data o fields | fields |
throwOnError | boolean | Lanzar errores en lugar de retornar | false |
Tipos
El SDK incluye definiciones TypeScript para todos los tipos de API. Impórtalos directamente:
import type { Session, Message, Part } from "@opencode-ai/sdk"Todos los tipos se generan a partir de la especificación OpenAPI del servidor y están disponibles en el archivo de tipos (opens in a new tab).
Errores
El SDK puede lanzar errores que puedes capturar y manejar:
try {
await client.session.get({ path: { id: "invalid-id" } })
} catch (error) {
console.error("Failed to get session:", (error as Error).message)
}APIs
El SDK expone todas las APIs del servidor a través de un cliente con tipos seguros.
Global
| Método | Descripción | Respuesta |
|---|---|---|
global.health() | Verificar salud y versión del servidor | { healthy: true, version: string } |
Ejemplos
const health = await client.global.health()
console.log(health.data.version)App
| Método | Descripción | Respuesta |
|---|---|---|
app.log() | Escribir una entrada de registro | boolean |
app.agents() | Listar todos los agentes disponibles | Agent[] (opens in a new tab) |
Ejemplos
// Escribir una entrada de registro
await client.app.log({
body: {
service: "my-app",
level: "info",
message: "Operation completed",
},
})
// Listar agentes disponibles
const agents = await client.app.agents()Project
| Método | Descripción | Respuesta |
|---|---|---|
project.list() | Listar todos los proyectos | Project[] (opens in a new tab) |
project.current() | Obtener proyecto actual | Project (opens in a new tab) |
Ejemplos
// Listar todos los proyectos
const projects = await client.project.list()
// Obtener proyecto actual
const currentProject = await client.project.current()Path
| Método | Descripción | Respuesta |
|---|---|---|
path.get() | Obtener ruta actual | Path (opens in a new tab) |
Ejemplos
// Obtener información de la ruta actual
const pathInfo = await client.path.get()Config
| Método | Descripción | Respuesta |
|---|---|---|
config.get() | Obtener información de configuración | Config (opens in a new tab) |
config.providers() | Listar proveedores y modelos predeterminados | { providers: Provider[] (opens in a new tab), default: { [key: string]: string } } |
Ejemplos
const config = await client.config.get()
const { providers, default: defaults } = await client.config.providers()Sessions
| Método | Descripción | Notas |
|---|---|---|
session.list() | Listar sesiones | Retorna Session[] (opens in a new tab) |
session.get({ path }) | Obtener sesión | Retorna Session (opens in a new tab) |
session.children({ path }) | Listar sesiones hijas | Retorna Session[] (opens in a new tab) |
session.create({ body }) | Crear sesión | Retorna Session (opens in a new tab) |
session.delete({ path }) | Eliminar sesión | Retorna boolean |
session.update({ path, body }) | Actualizar propiedades de sesión | Retorna Session (opens in a new tab) |
session.init({ path, body }) | Analizar app y crear AGENTS.md | Retorna boolean |
session.abort({ path }) | Abortar sesión en ejecución | Retorna boolean |
session.share({ path }) | Compartir sesión | Retorna Session (opens in a new tab) |
session.unshare({ path }) | Dejar de compartir sesión | Retorna Session (opens in a new tab) |
session.summarize({ path, body }) | Resumir sesión | Retorna boolean |
session.messages({ path }) | Listar mensajes en una sesión | Retorna { info: Message (opens in a new tab), parts: Part[] (opens in a new tab)}[] |
session.message({ path }) | Obtener detalles del mensaje | Retorna { info: Message (opens in a new tab), parts: Part[] (opens in a new tab)} |
session.prompt({ path, body }) | Enviar mensaje de prompt | body.noReply: true retorna UserMessage (solo contexto). Por defecto retorna AssistantMessage (opens in a new tab) con respuesta de IA |
session.command({ path, body }) | Enviar comando a sesión | Retorna { info: AssistantMessage (opens in a new tab), parts: Part[] (opens in a new tab)} |
session.shell({ path, body }) | Ejecutar comando shell | Retorna AssistantMessage (opens in a new tab) |
session.revert({ path, body }) | Revertir un mensaje | Retorna Session (opens in a new tab) |
session.unrevert({ path }) | Restaurar mensajes revertidos | Retorna Session (opens in a new tab) |
postSessionByIdPermissionsByPermissionId({ path, body }) | Responder a solicitud de permiso | Retorna boolean |
Ejemplos
// Crear y gestionar sesiones
const session = await client.session.create({
body: { title: "My session" },
})
const sessions = await client.session.list()
// Enviar mensaje de prompt
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!" }],
},
})
// Inyectar contexto sin activar respuesta de IA (útil para plugins)
await client.session.prompt({
path: { id: session.id },
body: {
noReply: true,
parts: [{ type: "text", text: "You are a helpful assistant." }],
},
})Files
| Método | Descripción | Respuesta |
|---|---|---|
find.text({ query }) | Buscar texto en archivos | Array de objetos de coincidencia con path, lines, line_number, absolute_offset, submatches |
find.files({ query }) | Encontrar archivos y directorios por nombre | string[] (rutas) |
find.symbols({ query }) | Encontrar símbolos del workspace | Symbol[] (opens in a new tab) |
file.read({ query }) | Leer un archivo | { type: "raw" | "patch", content: string } |
file.status({ query? }) | Obtener estado de archivos rastreados | File[] (opens in a new tab) |
find.files soporta algunos campos de consulta opcionales:
type:"file"o"directory"directory: sobrescribir la raíz del proyecto para la búsquedalimit: máximo de resultados (1-200)
Ejemplos
// Buscar y leer archivos
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
| Método | Descripción | Respuesta |
|---|---|---|
tui.appendPrompt({ body }) | Agregar texto al prompt | boolean |
tui.openHelp() | Abrir diálogo de ayuda | boolean |
tui.openSessions() | Abrir selector de sesiones | boolean |
tui.openThemes() | Abrir selector de temas | boolean |
tui.openModels() | Abrir selector de modelos | boolean |
tui.submitPrompt() | Enviar el prompt actual | boolean |
tui.clearPrompt() | Limpiar el prompt | boolean |
tui.executeCommand({ body }) | Ejecutar un comando | boolean |
tui.showToast({ body }) | Mostrar notificación toast | boolean |
Ejemplos
// Controlar interfaz TUI
await client.tui.appendPrompt({
body: { text: "Add this to prompt" },
})
await client.tui.showToast({
body: { message: "Task completed", variant: "success" },
})Auth
| Método | Descripción | Respuesta |
|---|---|---|
auth.set({ ... }) | Establecer credenciales de autenticación | boolean |
Ejemplos
await client.auth.set({
path: { id: "anthropic" },
body: { type: "api", key: "your-api-key" },
})Events
| Método | Descripción | Respuesta |
|---|---|---|
event.subscribe() | Stream de eventos enviados por servidor | Stream de eventos enviados por servidor |
Ejemplos
// Escuchar eventos en tiempo real
const events = await client.event.subscribe()
for await (const event of events.stream) {
console.log("Event:", event.type, event.properties)
}