前言¶
在 DeepSeek Harness(DSH)里把 Provider 指到 opencode.ai、选用免费模型发消息时,常见报错是 403 FreeTierError: OpenCode's free tier can only be used from within OpenCode。密钥、模型 ID 和 Harness 本身往往没问题:OpenCode 的免费档只接受带 session id 的请求,而 DSH 默认不会在出站请求里带上它。可选退路包括整段任务改在 OpenCode CLI 里跑、购买付费 Key,或经代理/聚合层转发——都会增加成本或运维负担。下面介绍社区插件 dsh-opencode-freeaccess(维护者 mubaid,分类:联网工具),它在匹配 OpenCode 路由的请求上补全 session 相关头,使免费档可在 DSH 内直接使用。
这是什么¶
dsh-opencode-freeaccess 是 DeepSeek Harness 插件,职责很窄:在发往 OpenCode 的请求上写入会话标识(session id)及官方客户端同类头信息,不改变请求体、URL、方法、凭据与响应内容;对其它 Host 的请求按原样转发。
- 仓库:github.com/mubaid/dsh-opencode-freeaccess
- 目录页:skillhub.cn 插件页
- 许可证:MIT(见仓库 LICENSE)
- package 版本:0.2.1;要求 Node
>=20.3,DSH^0.2.0-rc.2(README 写明已在 DSH0.2.0-rc.2与0.2.1-alpha.4上验证)
DSH 侧本身已持有会话信息,适配层此前未把它传到线上;该插件在能触达网络的一层补上缺口,无需新建 Provider 块或额外网关。
核心功能¶
以下均来自项目 README 与 package 描述,未单独验证的边界见文末「注意」。
-
解锁 OpenCode 免费档
安装并重启 profile 后,同一 Provider、同一免费模型在 DSH 中可正常流式返回,而非403 FreeTierError。 -
按会话稳定的 id
id 由对话创建时间与对话 uuid 派生,格式与 OpenCode 一致:ses_+ 12 位十六进制(时间)+ 14 位(uuid 派生)。一次 DSH 对话对应一个 id,重启后仍相同;并行对话互不共用 id。 -
并发与子智能体
会话作用域使用 async context,并行对话不会串 id;子智能体各自从所属对话生成 id。 -
仅改请求头
项目含测试:对匹配请求与控制请求 diff,断言只有 headers 不同。prompt 与回复逻辑不被插件改写。 -
默认按 Host 限定
只处理配置匹配的 OpenCode 相关 Host;可通过 profile patch 调整范围。 -
可观测
配置verbose: true时可日志输出每次发送的 id。 -
无构建步骤
纯 ESM,从 GitHub 安装,README 称无需额外 permission。
写入的头(完整列表见 README)包括:x-opencode-session、x-session-affinity、x-opencode-session-id、x-session-id、x-opencode-client: cli、x-opencode-project: global,以及 User-Agent: opencode/latest/<version>/cli。
安装与启用¶
先做插件安装,再重启对应 profile 服务。官方 Quick start 如下。
dsh plugin --profile web add github:mubaid/dsh-opencode-freeaccess
systemctl restart dsh-web
README 说明:默认已对齐 opencode.ai 与常见路由,一般无需再改 Provider 配置。若你使用自建 gateway 或代理,可将现有 baseURLs 指向该路径,插件仍可在匹配 Host 上注入头信息。
观察插件是否在运行:
journalctl -u dsh-web -f | grep opencode-freeaccess
典型用法与预期现象¶
安装前(同一 opencode2 / space-bunny-free 等免费模型):
403 FreeTierError: OpenCode's free tier can only be used from within OpenCode
安装并重启 profile 后(同一 Provider、同一模型、同一 Key):
streaming normally
README 中的场景示例(非独立案例数据,仅为能力说明):
- 长时 Agent 会话:对话 id 全程不变,上游可维持 prompt cache 亲和,而非每请求一个新 id。
- 并行子智能体:多个子任务各自 id,互不影响。
- 希望 dsh 到 OpenCode 直连、不经过聚合代理时,仍保留免费档。
- 从代理迁移:去掉中间 hop,模型与免费档行为可保留。
高级配置在 profile 的 patch 层,插件 id 为 opencode-freeaccess,字段包括 providers、hosts、baseURLs、headers、extraHeaders、userAgent、sessionIdEnv、verbose、seedSessionId、disableFetchInjection;默认值见仓库 docs/design.md。
适用场景与注意¶
适合谁
- 已在 DSH 中配置 OpenCode Provider,想使用其免费模型且不愿整段工作流迁到 OpenCode CLI。
- 需要会话级稳定 id(缓存亲和、路由)且希望改动范围限于请求头。
- 使用
openai-completions、openai-responses、anthropic-messages等基于fetch的协议栈。
与其它路径对比(摘自 README 对比表)
| OpenCode CLI | 代理/聚合 | 本插件 | |
|---|---|---|---|
| Harness | 仅 OpenCode | 任意 | DeepSeek Harness |
| 免费档 | 是 | 视上游而定 | 是 |
| 额外 hop | 无 | 有 | 无 |
| 需自维护基础设施 | 无 | 有 | 无 |
务必知晓的限制
- WebSocket 传输不走
fetch,不支持。 - OpenCode 免费档期望请求里存在名为
read的工具(官方客户端会发read+shell);DSH 默认带有同名工具,若禁用可能导致网关拒绝。 - 个别免费模型在上游偶发失败,README 说明可能与凭据无关,属上游行为。
- 项目自述为早期阶段、职责面窄;未验证项见 VERIFICATION.md。
安全与信任
插件以当前 DSH 进程权限运行,会在匹配的出站请求上追加头信息。安装前请阅读源码与 MIT 许可证,确认 Host 匹配范围与 patch 配置符合你的环境。社区目录站点(如 SkillHub)与 DeepSeek / 幻方无官方从属关系,插件来自社区维护者 mubaid,非官方应用商店条目。
结尾¶
dsh-opencode-freeaccess 针对「DSH 已知 session id 但未写入 OpenCode 请求」这一缺口:一条安装命令、重启 profile,即可在 Harness 内继续使用 OpenCode 免费模型,而无需代理或付费 Key。细节、测试与配置默认值以 GitHub 仓库为准。
- 目录页:https://www.skillhub.cn/plugins/mubaid/dsh-opencode-freeaccess
- GitHub:https://github.com/mubaid/dsh-opencode-freeaccess