Skip to content

OpenCode SDK(@opencode-ai/sdk)提供类型安全的 JavaScript/TypeScript 客户端,用于以编程方式与 OpenCode 服务器交互。支持创建会话、发送 Prompt、请求结构化输出、监听实时事件,以及控制 TUI 界面。

OpenCode JS/TS SDK 提供类型安全的客户端,用于以编程方式控制 OpenCode 服务器。适合构建自动化工具、CI/CD 集成或自定义 OpenCode 客户端。

详细了解服务器工作原理,参见 Server 文档。社区项目示例见生态系统


安装

bash
npm install @opencode-ai/sdk

创建客户端

createOpencode() 会同时启动服务器和客户端:

javascript
import { createOpencode } from "@opencode-ai/sdk"

const { client } = await createOpencode()
选项类型说明默认值
hostnamestring服务器主机名127.0.0.1
portnumber服务器端口4096
signalAbortSignal取消信号undefined
timeoutnumber服务器启动超时(ms)5000
configConfig配置对象{}

配置覆盖

传入配置对象覆盖 opencode.json 中的设置:

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(`服务器运行在 ${opencode.server.url}`)

opencode.server.close()

只创建客户端(连接已有服务器)

如果 OpenCode 服务器已在运行,直接创建客户端实例:

javascript
import { createOpencodeClient } from "@opencode-ai/sdk"

const client = createOpencodeClient({
  baseUrl: "http://localhost:4096",
})
选项类型说明默认值
baseUrlstring服务器 URLhttp://localhost:4096
fetchfunction自定义 fetch 实现globalThis.fetch
throwOnErrorboolean错误时抛异常而非返回false

TypeScript 类型

SDK 包含完整的 TypeScript 类型定义,从服务器 OpenAPI 规范自动生成:

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

结构化输出

通过 format 参数请求符合 JSON Schema 的结构化输出:

typescript
const result = await client.session.prompt({
  path: { id: sessionId },
  body: {
    parts: [{ type: "text", text: "研究 Anthropic 公司并提供公司信息" }],
    format: {
      type: "json_schema",
      schema: {
        type: "object",
        properties: {
          company: { type: "string", description: "公司名称" },
          founded: { type: "number", description: "成立年份" },
          products: {
            type: "array",
            items: { type: "string" },
            description: "主要产品",
          },
        },
        required: ["company", "founded"],
      },
    },
  },
})

// 获取结构化数据
console.log(result.data.info.structured_output)
// { company: "Anthropic", founded: 2021, products: ["Claude", "Claude API"] }
输出格式说明
text默认,标准文本响应
json_schema返回符合指定 Schema 的 JSON

如果模型无法在重试后生成有效结构化输出,响应中会包含 StructuredOutputError

typescript
if (result.data.info.error?.name === "StructuredOutputError") {
  console.error("结构化输出失败:", result.data.info.error.message)
}

主要 API

会话管理

javascript
// 创建会话
const session = await client.session.create({
  body: { title: "我的会话" },
})

// 列出所有会话
const sessions = await client.session.list()

// 发送 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: "你好!" }],
  },
})

// 注入上下文而不触发 AI 响应(适合插件场景)
await client.session.prompt({
  path: { id: session.id },
  body: {
    noReply: true,
    parts: [{ type: "text", text: "你是一个专业的代码助手。" }],
  },
})

// 中止运行中的会话
await client.session.abort({ path: { id: session.id } })

文件操作

javascript
// 搜索文件内容
const textResults = await client.find.text({
  query: { pattern: "function.*opencode" },
})

// 按名称查找文件
const files = await client.find.files({
  query: { query: "*.ts", type: "file" },
})

// 读取文件内容
const content = await client.file.read({
  query: { path: "src/index.ts" },
})

服务器状态

javascript
// 检查服务器健康状态
const health = await client.global.health()
console.log(health.data.version)

// 列出可用 Agents
const agents = await client.app.agents()

// 获取当前配置
const config = await client.config.get()

控制 TUI

javascript
// 向提示框附加文本
await client.tui.appendPrompt({
  body: { text: "帮我分析这个函数" },
})

// 显示 Toast 通知
await client.tui.showToast({
  body: { message: "任务完成", variant: "success" },
})

// 执行命令
await client.tui.executeCommand({
  body: { command: "/models" },
})

实时事件监听

javascript
const events = await client.event.subscribe()
for await (const event of events.stream) {
  console.log("事件:", event.type, event.properties)
}

配置认证凭证

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

错误处理

typescript
try {
  await client.session.get({ path: { id: "invalid-id" } })
} catch (error) {
  console.error("获取会话失败:", (error as Error).message)
}

常见问题

Q: SDK 和直接调用 opencode run CLI 有什么区别?

A: SDK 提供完整的编程接口,适合需要持久会话、监听事件流、控制 TUI 状态等场景。opencode run 更适合简单的单次调用。

Q: 如何在不启动新服务器的情况下连接到正在运行的 TUI?

A: 使用 createOpencodeClient({ baseUrl: "http://localhost:<port>" }) 连接到已有服务器。TUI 启动时会输出服务器端口,也可以通过 --port 参数固定端口。

Q: 结构化输出在哪些模型上可用?

A: 结构化输出使用 StructuredOutput Tool 实现,因此支持 Tool Call 的模型均可使用。如果模型不支持 Tool Call,则无法使用结构化输出。