先说清楚它解决的是什么。DeepSeek Harness(DSH)有个子智能体(subagent)委托机制:你主线 agent 遇到一个活儿,可以"外包"给另一个后端去干,自己只管收结果。问题在于,DSH 本身并不能直接用 OpenCode(那个有免费/隐身模型的独立产品)里的模型——因为 OpenCode 的免费额度有反滥用护栏,你用普通 HTTP 客户端拿同一个 API key 去调,它直接 403,回一句"OpenCode 的免费额度只能从 OpenCode 内部用"。dsh-subagent-opencode 就是给 DSH 补上这个口子:它注册成一个委托后端(provider),把任务丢给本地 opencode run 一次性跑完,让 OpenCode 自己那个 client 去发请求——这是"从 DSH 合法用到 OpenCode 免费模型"的受支持路径。仓库 0 星、很新,但切中一个很具体的痛点。
一、它是什么:DSH 的一个"委托后端",不是完整的 agent
先纠一个容易搞混的概念。它不是一个 agent,也不是"让 DSH 变成 opencode"。它是 DSH 的 subagents 机制上的一个 provider——你可以理解成"一条委托规则里的后端驱动":告诉 DSH"当你把这个子任务派给 opencode 时,我这么去调 opencode、这么把结果取回来"。
它的工作方式很克制:每次委托都在当前会话的工作目录下,起一个子进程 opencode run --standalone --format json,把你的任务文本作为这个进程的消息发进去,等它跑完,只取子进程最后输出的 assistant 文本(或者一段被安全裁剪过的失败诊断)。它自己不持有任何 API key、不读任何凭据——它只用 DSH 已经给它挂好的 subagents 和 subprocess 两个服务,整包代码里除了 Node 内置模块,唯一的第三方 import 是 DSH 自己的 @deepseek-ai/schemastery(用来渲染配置页的 schema)。
二、它到底能干啥:把 OpenCode 的免费模型接进 DSH 主线
![]()
(图注1:一次委托的四步。DSH 主线把子任务丢给注册的 opencode provider;provider 起本地 opencode run 子进程;由 OpenCode 自己的 client 发请求,合法命中免费/隐身模型;只把子进程的最终 assistant 文本取回主线,过程旁白一并带回)
它能干的核心一件事,但价值很实:
• 让 DSH 合法调用 OpenCode 的免费 / 隐身(stealth zen)模型:这是它存在的全部理由。OpenCode 的免费层只认"从我自己内部发起的请求",这个 provider 就是那个"内部发起"的通道。
• 一行一模型:它的后端是"进程外"的,没有 start-time 能力广播,所以一行配置对应一个模型,不同模型就挂不同行。
• one-shot 委托:起一个子进程、把任务发进去、拿到最终结果、结束。不是可续跑的会话,是一次性的。
• 免凭据:DSH 主线不用配 OpenCode 的 key,凭据留在 OpenCode 那边,provider 不碰。
三、架构:subagents 接缝 + subprocess 服务 + NDJSON 折叠
![]()
(图注2:左边是 DSH 已挂载的 subagents 接缝和 subprocess 服务(provider 只借用,不自己起服务);中间是 opencode run 子进程这个黑箱——工具、权限、日志、token 都在 OpenCode 里,DSH 只看最终文本;右边是一行一模型的配置边界和 one-shot 一次性委托)
几个值得展开的架构点,读一遍知道它"稳"在哪:
• 它不自己起服务:只往 DSH 的 subagents 接缝上注册一个 provider,真正起进程靠 DSH 已有的 subprocess 服务。这意味着卸载它不会留任何残留服务,也没多开一个长驻进程。
• 任务校验很严:只收纯文本任务,做合并、做 UTF-8 字节上限检查(默认 128KB),超了拒收而不是硬塞——因为任务作为一个 argv 参数进子进程,太大就会撑爆。
• NDJSON 折叠取全量:子进程的输出是逐行 JSON,它会按消息 id 分组,把所有非空 assistant 消息按到达顺序拼全——因为 OpenCode 会在步骤间"自言自语"("我读两个文件"、"我看一下…"),它最后一条消息常常只含结果的尾巴,取"最后一条"反而会漏。
• 三态结算:completed(成功 + 最终文本)/ error(失败,带固定进程信息 + 一行裁剪过的后端错误,≤4096 字节)/ aborted(取消)。而且它绝不在流没读完时把截断的答案当"完成"——输出没齐就报 incomplete-output,不把半截结果伪装成成功。
四、怎么装:装 bundle → 暴露工具 → 配一行一模型
它走的是 DSH 插件 bundle,安装、暴露、配置三步,命令行就够。
第一步:装进 profile,重启 profile。
【从 GitHub 装(发布到 npm 前用这条)】 dsh plugin --profile web add github:geokkjer/dsh-subagent-opencode 【或 npm 发布后】 dsh plugin --profile web add dsh-subagent-opencode 【本地 checkout 就 link】 pnpm add link:/path/to/dsh-subagent-opencode
注意:这一步只是注册 provider,它不会起任何 OpenCode 进程、也不会暴露任何工具,直到某条委托规则点名它。
第二步:暴露一个委托工具。要让主线 agent 真的能调它,得加一条 DSH 的子智能体工具行(@deepseek-ai/dsh-tool-subagent),指向这个 provider:
• insert: - id: tool-subagent-opencode name: '@deepseek-ai/dsh-tool-subagent' config: provider: opencode toolName: subagent_opencode backgroundMode: one-shot maxDepth: provider-managed
maxDepth: provider-managed 是这个后端该用的值——它没法在另一个产品内部帮你管递归预算。Web 应用里模型能看到哪些工具来自 Agent preset,所以这条要么加进 preset,要么在 Plugins 页开同一条。
第三步:一行配一个模型。provider 那一行长这样,要接第二个模型就再加一行、providerName 换掉:
• insert: - id: dsh-subagent-opencode-kimi name: 'dsh-subagent-opencode' config: providerName: opencode-kimi model: opencode/kimi-k3
五、举例:把一段代码修复任务委托给 OpenCode
举个实际用法。你主线 agent 在跑一个项目,遇到一段"让这段脚本兼容 Python 3.12"的活儿,你想甩给 OpenCode 免费模型去修,自己主线只管收结果:
1. 前提:这台机器上 opencode --version 能跑通(OpenCode 已装、已登录,且在 DSH 进程的 PATH 上)。
2. 你主线调用工具 subagent_opencode,任务文本写清楚:把 <仓库路径>/tools/fmt.py 改成兼容 Python 3.12,别动其它文件。
3. provider 在当前会话工作目录起 opencode run --standalone --format json -- <上面那段任务>,把任务文本作为消息发进去。
4. OpenCode 自己读文件、改代码、跑验证——这些过程日志都留在 OpenCode 那边,DSH 看不到中间步。
5. 跑完,provider 把子进程全部非空 assistant 消息拼起来取回主线。你拿到的是"完整答复"(含 OpenCode 自己的旁白),不是它替你精炼过的摘要。
两个实操要点(都是它的真实限制):
• 跨目录任务要么放行 autoApprove、要么改 cwd:子进程被关在当前会话工作目录里,非交互模式下它读外部目录会被 OpenCode 自动拒(external_directory ... auto-rejecting)。要让它读别的目录,要么给这行配 autoApprove: true(这会顺带放行它没明确拒绝的所有权限,仅在你能接受这个宽度时开),要么把这一行的 cwd 设成任务所在的目录。
• 任务走 argv,别塞超大文本:任务超过默认 128KB 上限会被拒而不是流进 stdin。委托文件路径让 OpenCode 自己去读,比把整个文件内容塞进任务文本稳得多。
六、应用场景 + 需要注意的事
适合用在哪:已经在用 DSH 做主线、又想要 OpenCode 那批免费/隐身模型(尤其是普通 HTTP 客户端拿不到、只有 OpenCode 内部才能用的 zen 模型)做子任务外包的场景;想给 DSH 主线加"把某类活儿(改代码、跑验证)委托出去"的能力,且这个活儿适合一次性、结果导向的。
要注意 / 风险(务必读):
• 子进程是黑箱:OpenCode 用的什么工具、开了什么权限、会话日志、token 消耗,DSH 全看不到,主线只拿最终文本。也就是说"这条子任务到底怎么干成的"无法从 DSH 主线会话日志重建,排查只能进 OpenCode 自己的日志。
• 答案含旁白,不是摘要:取回的是 OpenCode 说的全部(含"I'll read both files" 这类过程话),多步任务回给你的文本会比较啰嗦,用之前要接受这一点。
• 凭据仍留在 OpenCode 里:provider 不读 key,但 OpenCode 侧的登录态/凭据得是通的;要隔离 OpenCode 状态得用 env 指 XDG 目录,隔离了就得在那边另配凭据。
• one-shot,不能续跑:它没实现 prepareContinuable,所以 backgroundMode: continuable 和 send_message 追问都不可用,只能用 one-shot。需要多轮就别选它。
• 免费模型有滥用防护:这是它命门也是它价值所在——免费额度只认 OpenCode 内部发起,所以别想着用它绕去跑大规模生产负载,那是 OpenCode 免费层明确不保护的用法。
• 委托会话会进 OpenCode 历史:子进程共享用户 OpenCode 状态,你委托的活儿会出现在你的 OpenCode 历史记录里,介意就用 env 隔离。
dsh-subagent-opencode 很小、切面很窄,但它是"让 DSH 主线合法吃到 OpenCode 免费模型"的官方姿势——在一个有免费模型白嫖需求的 DSH 工作流里,它是目前最直接的一块拼图。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.