白泽图

  • 文章
    • Unity渲染
    • Unity项目开发
    • 工具
    • 数学
    • 算法
    • 网站搭建
    • 网络&操作系统
个人知识库
互联网技术研究与经验总结
  1. 首页
  2. AI
  3. 正文

OpenCode 2.0 新增开发包:client / codemode / sdk

2026-10-13 43点热度 0人点赞 0条评论

版本: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)

标签: 暂无
最后更新:2026-10-13

蒋程

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论
目录Toggle Table of ContentToggle
  • 速查:关键结论
  • 一、定位总览
  • 二、@opencode/client —— 网络客户端库
    • 2.1 定义与边界
    • 2.2 语言与技术栈
    • 2.3 使用示例
    • 2.4 要点
  • 三、@opencode/sdk —— 嵌入式引擎
    • 3.1 与 client 的本质区别
    • 3.2 使用示例
    • 3.3 典型用途
    • 3.4 许可注意
  • 四、@opencode/codemode —— 模型调用工具的机制(重点)
    • 4.1 一句话
    • 4.2 与传统方式的对比
    • 4.3 机制:search + execute
    • 4.4 常见疑问(结论)
    • 4.5 示例(以 unityMCP 为例)
    • 4.6 配置
  • 五、什么时候用哪个
  • 六、常见误区
  • 参考

COPYRIGHT © 2026 白泽图. ALL RIGHTS RESERVED.

京ICP备2026064017号-1

京公网安备11010102000001号

登录
注册|忘记密码?