DeepSeek Harness 在 8 月 17 日发布 RC.7 两天后,8 月 19 日 23 点左右放出了 RC.8。这个 8 月 13 日才创建的 GitHub 仓库,star 数已超过 17.1 万,dsh-plugin 话题下的生态仓库接近 9000 个。RC.8 的更新横跨多模态输入、子代理、工具调用、Windows 终端和底层存储,官方 changelog 共列出 14 项变更,其中三条主线对使用方式影响最直接:图片可以作为一等输入进入工作流,Claude Code 与 Codex 改为按需安装的子代理,SQLite 存储结构换代。

图片进入工作流:声明式的模态配置
RC.8 给 DeepSeek 模型适配器增加了可配置的原生图片请求。/goal、/plan 等命令现在可以接收图文混合输入,输入框的 @ 菜单支持引用本地文件和历史会话,一次提问可以同时挂上截图、文件与过往对话。
图片能力的接入点在配置层。手动录入的模型在声明之前一律按纯文本对待,附加图片会在发送前就被拒绝并点名该模型。给视觉模型开启图片输入,需要在 $DSH_HOME/settings.yaml 中为该模型添加 input 字段:
llm-pi-ai:
providers:
vision-gateway:
apiKeyEnv: GATEWAY_API_KEY
api: openai-completions
baseURL: https://vision.example/v1
defaultInput: [text, image]
models:
- id: vision-preview
input: [text, image]input 接受 text 和 image 两个值,只作用于该模型,因此一条路由可以同时服务两类模型。如果路由下的模型全部接受图片,可以在路由上设置一次 defaultInput 回退值,省去逐个声明;defaultInput 是回退值而非覆盖值,不会削掉目录中本就具备图片能力的模型。这两个字段都是对端点能力的断言,框架不做检查:声明了端点并不提供的图片能力,请求会由提供方拒绝。
排查路径也写进了官方文档:图片在发送前被拒,说明模型未声明图片模态;提供方拒绝带图片的请求,说明声明与端点实际能力不符,移除对应的 image 声明并开启新会话即可。需要注意,DeepSeek 自身的 chat-completions 路由是纯文本的,且无法通过配置改变,原生图片请求面向的是第三方视觉模型或 OpenAI 兼容网关。

RC.8 同时修复了图片链路上两个高频故障点:单张图片尺寸过大、多轮对话历史图片累计载荷过高导致的模型请求失败。图片相关的配套能力在 RC.7 已经就位:MCP 与 ACP 支持持久化图片附件,附件不再随单次调用结束而消失,PTC Mode 可以转发嵌套图片。
Claude Code 与 Codex:按需安装的一次性子代理
RC.7 首次把 Codex 与 Claude Code 的子代理任务接入 Job Panel,RC.8 将两者进一步做成 Profile Bundle,默认不随主体分发,需要时再安装。这一步让 Harness 的定位更接近统一调度层:上层负责任务拆解与工作流编排,底层按需把不同的编码代理拉进来执行。
从架构文档看,两个后端都是 one-shot 提供方,在 ctx.subagents 注册表中分别以 codex 和 claude-code 为默认名称注册。它们报告 inheritsParentContext: false:子代理拿到父会话的工作目录,但不复制父对话,每次调用创建全新的产品进程和不可续用的产品会话。递归深度由产品侧管理(maxDepth: provider-managed),前台收集为默认行为,也可以注册为 Job 在后台执行。
Codex 提供方锁定 @openai/[email protected],通过 app-server --stdio 启动。协议层的处理相当严格:turn/completed 是权威的终止事实,最终答案取 phase 为 final_answer 的最新 agentMessage,产品未输出显式 final phase 时回退到 phase 为 null 的最新消息,commentary 永远不会替代答案。进程清理走整树终止:启动失败会关闭管线、终止进程树并等待退出;正常回收在中断 turn、关闭管线之后同样等待整树退出,清理失败会报告 teardown 阶段。
非交互权限模式是无人值守流程的关键一环。面对命令与文件审批请求,提供方在请求给出的非审批选项中选择,优先 cancel,无选项列表时回退 decline;不授予任何权限,不回答用户输入请求,拒绝 MCP elicitation。没有合法非交互响应的请求直接失败,不会挂起等待一个不存在的用户界面。permissionMode 是三值配置,默认 never。多命名实例允许同时运行多个配置各异、名字不同的 Codex 子代理,每个实例保留独立的解析值。
工具调用与调度:并发搜索与主动唤醒
web_search 支持并发查询,子代理的 reportDelivery 会在任务完成后及时反馈并唤醒父任务。对先并发搜索多个信息源、再交给主代理汇总的长链任务,这两项改动直接改变了工作流的执行节奏:父任务无需轮询感知子任务结束,被主动叫醒后继续推进。
终端、存储与 SDK
Windows PTY 终端加入持久 PowerShell 会话,并在极简模式预设中默认开启,减少命令执行过程中反复重建终端环境的问题。极简模式本身只保留持久 bash 与 str_replace_editor 两个工具,RC.7 曾修复该模式下持久 Bash 调用卡顿。安装与启动流程同步瘦身:依赖下载体积缩小,本地运行 dsh web 时自动打开浏览器,SSH 启动只打印地址。
存储层是升级前最需要留心的一块:SQLite 后端的读写与分叉性能改善,存储体积下降,但数据结构与旧版不兼容,升级需要处理存量会话数据。大历史会话的分叉操作耗时也有优化。
Python SDK 的依赖配置现在覆盖全部 4 个内置 Agent 预设,并包含 rg/glob 搜索和 MCP stdio 工具所需依赖。基本使用形态:
from pathlib import Path
from deepseek_harness import DeepSeekHarness
config = Path("examples/jsonrpc-agent/minimal.cordis.yml").resolve()
workspace = Path("/absolute/path/to/workspace").resolve()
sessions = Path("/absolute/path/to/sessions").resolve()
with DeepSeekHarness(
provider="deepseek-official",
model="deepseek-v4-flash",
max_tokens=49_152,
cwd=str(workspace),
session_root=str(sessions),
cordis=str(config),
) as harness:
result = harness.run(
"Inspect the repository and fix the failing tests.",
session_id="example-001",
)
print(result.final_response)安装后的运行时不依赖系统 Node.js。会话语义有明确约定:独立任务使用新的 session id,只有需要延续同一段持久化对话时才复用原有 id,复用会保留该会话的 Bash 进程、工作目录、已导出变量与 shell 函数。内置组合使用 danger-full-access 权限,官方文档提示只能在可丢弃的 checkout 或容器内运行。
两项容易被忽略的修复也记录在此:部分自定义 OpenAI 兼容网关因请求格式差异无法调用、推理内容回传缺失的问题得到修复,这与视觉模型网关的可用性直接相关;"DeepSeek Harness"已是注册商标,品牌使用规范单独成文。
原生支持与社区插件的分工
官方原生图片能力落地之前,社区已经围绕视觉场景长出一批插件:modlens(3300+ star)、dsh-vision-toolkit、dsh-vision-router 等方案,通过 OCR、像素分析或独立视觉子代理,让纯文本模型间接处理图片。RC.8 的原生路径与这批插件形成分工:原生图片请求面向本身就支持视觉的模型,插件路径面向纯文本模型的结构化证据提取。两条路径的边界在配置文件里就能划清。
一周之内从公测走到 RC.8,DeepSeek Harness 仍处于 developer preview 阶段,官方明确提示后续会有破坏性变更。对使用者来说,RC.8 的实际价值集中在三处:图片成为一等输入、外部编码代理成为可调度的执行资源、存储与调度的性能改善。升级前唯一必须认真对待的是 SQLite 数据结构不兼容这条。