版本:2.0.27 · 发布日期:2026-10-12(公测 2026-07-10)· 文档定位:开发包说明(面向二次开发与集成)
速查:关键结论
| 包 | 一句话 | 类别 |
|---|---|---|
@opencode/client |
官方 TypeScript 客户端库,通过网络连接一台已运行的 OpenCode 服务 | 客户端库 |
@opencode/sdk |
把整个 OpenCode 引擎作为库嵌入宿主应用,进程内运行 | 宿主引擎 |
@opencode/codemode |
把 MCP / OpenAPI 端点转成脚本内可调用的函数,是模型调用工具的机制 | Agent 工具调用机制 |
关键结论:
- 三个包都面向开发者;只是使用 OpenCode(TUI / 网页 / 手机)的人不需要。
client与sdk的区别只在传输层:网络 vs 内存,API 形状一致。codemode默认对所有 MCP 服务器开启,普通使用者无需任何配置。
一、定位总览
官方将"在 OpenCode 之上构建"归纳为三种方式:
| 方式 | 相关包 | 说明 |
|---|---|---|
| Extend(扩展) | 插件 API | 添加工具、命令、agent、自定义行为,其余保持原样 |
| Run as server(作为服务连接) | @opencode/client |
用与 TUI / 桌面相同的方式连接服务,构建任意界面、工作流、agent 体验 |
| Embed(内嵌) | @opencode/sdk |
把引擎直接嵌入应用,构建完全自定义的 agent / 开发者产品 |
三者不在同一层:
client、sdk解决"引擎在哪运行、程序怎么连";codemode解决"引擎内部的模型如何调用工具"。
二、@opencode/client —— 网络客户端库
2.1 定义与边界
- 官方定义:the TypeScript client for the OpenCode HTTP API,用于"应用程序通过网络连接一台正在运行的 OpenCode 服务器"。
- 底层全部是 HTTP 请求(REST + SSE 事件流),本包只是把这些请求封装成带类型的 JS/TS 方法。
- 其类型与方法由与 API reference 同一份契约生成(
/openapi.json),新接口出现后客户端同步更新。
2.2 语言与技术栈
| 技术栈 | 能否直接用 @opencode/client |
做法 |
|---|---|---|
| JS/TS(Node、Bun、前端) | ✅ | bun add @opencode/client |
| 原生(Swift / Kotlin / Dart / Go…) | ❌(它是 npm 包) | 按 GET /openapi.json 契约自研或 codegen 生成 |
注意区分两层含义:
- 架构角色:凡通过网络连接服务的程序都是 client(与语言无关);
- 官方实现:
@opencode/client特指官方那个 TS 库,只在 JS/TS 技术栈可用。
2.3 使用示例
import { OpenCode } from "@opencode/client"
const client = OpenCode.make({
baseUrl: "http://localhost:4096",
})
const session = await client.session.create({
location: { directory: "/workspace" },
})
await client.session.prompt({
sessionID: session.id,
text: "Review the current changes",
})
带认证头与超时:
const client = OpenCode.make({
baseUrl: "https://opencode.example.com",
headers: { authorization: `Bearer ${process.env.OPENCODE_TOKEN}` },
})
await client.session.list(undefined, { signal: AbortSignal.timeout(10_000) })
事件订阅(返回异步迭代器):
for await (const event of client.event.subscribe()) {
console.log(event.type)
}
2.4 要点
| 事项 | 说明 |
|---|---|
| 自动发现本地服务 | 用 Service.ensure() 发现本机服务端点,脚本/定时任务可直接连接 |
| 事件流 | 纯实时:无重放、无自动重连,慢消费者会被断开,需自行重连并重拉状态(与架构文一致) |
| 请求选项 | 每个操作接受末位参数(AbortSignal / per-request 请求头);事件订阅只接受订阅者本地取消 |
| 插件 RPC | 导入插件 RPC 定义后,client.rpc(Acme) 直接调用插件暴露的远程接口 |
三、@opencode/sdk —— 嵌入式引擎
3.1 与 client 的本质区别
官方原文:the SDK … assembles the OpenCode server and routes API calls through its HTTP router in memory. It opens no HTTP listener and adds no network hop between the client and server.
@opencode/client |
@opencode/sdk |
|
|---|---|---|
| 传输 | 网络(HTTP,进程外) | 内存(进程内) |
| 服务生命周期 | 由外部服务拥有 | 由你的应用拥有 |
| 是否监听端口 | 否(连接别人的) | 否(不开监听、无网络跳) |
| 资源管理 | 无需 | 需显式释放 |
sdk 是引擎本体,不是接口封装:OpenCode.create() 在你进程内实例化整个 server(router、Location 服务、fiber、插件注册、会话执行等),API 调用走内存中的 HTTP router。
3.2 使用示例
import { OpenCode } from "@opencode/sdk"
await using opencode = await OpenCode.create()
const session = await opencode.sessions.create({
location: { directory: "/workspace" },
})
await opencode.sessions.prompt({
sessionID: session.id,
text: "Review the current changes",
})
OpenCode.create()返回显式持有的宿主;无显式资源管理环境时调用await opencode.close()。- 与
client共用同一套 Promise 值、声明的错误类型、请求选项、AsyncIterable 流;并额外提供sessions/events便捷别名。 - worktree 操作需
projectID。 - 可在内嵌实例上加载插件:
OpenCode.create({ plugins: [plugin] }),插件 API 与 CLI 相同。
3.3 典型用途
- 把 agent 能力嵌入自有产品(内嵌 server + 自绘界面/工作流),并对外包装成独立产品;
- 部署到受限环境(如 Cloudflare Durable Objects,官方提供专项指南),引擎可裁剪;
- 由于对外走的是标准 OpenCode server 协议,任何 OpenCode 客户端都可连接它。
3.4 许可注意
项目为 MIT 许可:可商用、可修改、可闭源,义务是保留版权声明(LICENSE)。
四、@opencode/codemode —— 模型调用工具的机制(重点)
4.1 一句话
传统方式一次工具调用 = 一次模型往返;Code Mode 让模型写一段 JS 程序,由运行时一次执行,循环、并行、条件、结果后处理都在程序内完成,中间结果不进模型上下文。
4.2 与传统方式的对比
| 传统(原生工具调用) | Code Mode | |
|---|---|---|
| 工具位置 | 全部挂在模型的原生工具列表 | 收进 execute 执行器,按服务器名分组 |
| 一次调用 | 一个工具 | 脚本内任意个(可并行 / 循环 / 串联) |
| 中间结果 | 全部进入上下文 | 留在解释器内 |
| 往返次数 | 每个操作一次 | 整段脚本一次 |
| 上下文常驻成本 | O(工具总数) | O(1) |
4.3 机制:search + execute
模型侧只保留两个"骨架工具"的说明(固定大小):
execute:执行一段 JS;工具通过tools.<server>.<tool>(...)调用。其 schema 是通用且固定大小的,不枚举任何具体工具。search:按关键词 / 命名空间查询工具,返回命中的"工具卡片"(path、描述、参数签名)。
工具定义存放在运行时一侧的 catalog(注册表)中,按需拉取:
- 不搜 → 不进上下文;
- 只搜命中项 → 只有命中的卡片进入上下文;
- 上下文成本 = O(1)(两个骨架工具)+ O(实际查询/使用的工具数)。
对比"全量 push":传统方式把全部工具 schema 每轮推给模型;Code Mode 是"按需 pull",用偶尔一次 search 的往返,换掉每轮常驻的全量 schema。工具越多,交换越划算。
4.4 常见疑问(结论)
| 疑问 | 结论 |
|---|---|
| 模型怎么知道有某台 MCP 服务器 / 某个工具? | 它一开始并不知道。它常驻可见的只有 search 的说明;需要某个工具时自己调用 search,从返回卡片得知存在性、名称与签名 |
| 每次都搜索吗? | 不。已获取的卡片留在会话上下文中,之后直接调用;只有"需要某个尚未见过的工具"时才再搜一次。即"每个新工具一次发现成本,会话内摊销" |
| 工具名怎么来的? | 按服务器规范化名称分组,形如 tools.context_7.resolve_library_id(...)(服务器名 + 工具名,非法字符替换为 _);参数以卡片签名为准,失配时据 MCP 返回的错误修正 |
| 运行时能力边界? | 无文件系统、无 imports、无 timers、无 fetch;只能调用 catalog 中的工具(及宿主扩展) |
| 权限如何生效? | Code Mode 是否可用由 execute 权限(resource *)控制;脚本内每个嵌套工具调用各自执行自己的权限检查 |
关键词说明:实际的查找是查询已注册的 catalog,返回精确的 path / description / signature,不是统计或猜测。
4.5 示例(以 unityMCP 为例)
任务:把场景中所有 Cube 沿 X 轴排开。
传统方式
模型 → manage_scene(get_hierarchy) ← 整棵场景树 JSON 进入上下文 模型 → manage_gameobject(set_transform, Cube1) ← 结果进入上下文 模型 → manage_gameobject(set_transform, Cube2) ← 结果进入上下文 ... N 个 Cube 需要 N 次
→ N+1 次往返,中间数据全部经过上下文。
Code Mode:模型先 search("gameobject transform") 获取卡片,再输出一段 execute 脚本(示意):
const h = await tools.unityMCP.manage_scene({ action: "get_hierarchy" })
const cubes = h.tree.filter(o => o.name.startsWith("Cube"))
await Promise.all(cubes.map((c, i) =>
tools.unityMCP.manage_gameobject({
action: "set_transform",
target: c.name,
position: { x: i * 2, y: 0, z: 0 },
})))
→ 1 次往返;场景树与每个中间结果留在解释器内,只有结果回到模型。(参数形态以实际 MCP 服务器定义为准。)
官方发布说明中的同型示例:查出标记为 bug 的 GitHub issue → 写入 Linear → 返回新建 ID,同样在一次程序内完成。
4.6 配置
- 默认对所有 MCP 服务器开启。
- 关闭单个服务器:配置中
"codemode": false,该服务器的工具回到模型原生工具列表。 - 效果:MCP 工具的 schema 不再每轮进入模型上下文,可挂载大量服务器而上下文开销可控。
五、什么时候用哪个
| 场景 | 选择 |
|---|---|
| 脚本自动化 / CI / 自研界面(网络连接) | TS/JS 用 @opencode/client;其它语言按 HTTP / OpenAPI 自研 |
| 把 agent 能力嵌入自有产品 | @opencode/sdk(进程内) |
| 只想使用 OpenCode(TUI / 网页 / 手机) | 三个包都不需要;codemode 默认开启,无需操作 |
| 想理解 MCP 工具如何被模型调用 | 了解 codemode 机制即可 |
六、常见误区
| 误区 | 纠正 |
|---|---|
client 是一个能运行的产品 |
它是库(积木):没有界面,不能单独启动,需由你的程序调用 |
sdk 只是接口封装 |
它是引擎本体:server 与资源生命周期由你的进程持有、释放 |
codemode 是给用户用的功能 |
它是模型调用工具的内部机制;对用户表现为"MCP 工具不再塞满上下文" |
search 是模型瞎猜 |
它查询运行时中已注册的工具 catalog,返回精确的 path / 描述 / 参数签名 |
参考
- 官方文档:
opencode.ai/v2/docs/build/(Intro / Client / SDK) - 官方文档:
opencode.ai/v2/docs/tools/(Execute / Code Mode) - 官方发布说明:OpenCode 2.0 launch note(Anomaly,2026-10-12)
文章评论