大家玩智能体编排的,最近应该都注意到 DeepSeek Harness 这波更新了。Codex、Claude Code 的子智能体支持直接进了官方插件列表,同时把 Git 工作树和思考翻译也一并放了进来。这几个能力放在一起,基本上就是把 Harness 从“单模型调度器”往“多智能体协作平台”推了一大步。
我拿到更新后第一时间就跑了实测,这篇就把这次的改动拆开讲清楚:子智能体插件怎么配、Git 工作树到底解决了什么痛点、思考翻译机制是怎么工作的,以及我在迁移和调试过程中踩到的坑。不管你是刚开始接触 Harness,还是已经在生产环境里跑了一段时间,这篇应该都能给你一些参考。
1. 这次更新的核心逻辑:从“调模型”到“调智能体”
在聊具体功能之前,有必要先说说这次更新背后的方向转变。DeepSeek Harness 早期本质上是一个模型调用框架,核心是帮你管理 prompt、上下文、输出解析这些基础工作。但随着模型能力分化——有的模型擅长代码生成,有的模型擅长长文档分析,有的模型在工具调用上更稳——单靠一个模型打天下的思路已经不够用了。
这就是子智能体架构出现的根本原因:把不同任务拆给不同模型或不同工具去执行,由一个主控智能体负责任务编排、结果汇总和决策。你不需要在 prompt 里费劲地让一个模型“假装”自己会调用外部工具,而是直接给主控挂上子智能体插件,让它把任务委派出去。
这次 Harness 把 Codex 和 Claude Code 做成官方插件,等于官方认可了这个方向,而且帮你把最脏最累的对接活儿干完了。以前你要自己写 HTTP 调用、处理鉴权、封装工具调用协议,现在只需要在配置里声明插件,写几行工具调用规则,就能让主控智能体指挥这些外部编码智能体干活。
还有一个容易被忽略的点是 Git 工作树支持。这个功能解决的不只是“分支管理”的问题,背后是智能体执行任务时的文件系统隔离问题。后面我会专门展开讲。
思考翻译这个功能则更有意思,它把模型内部的推理过程“翻译”成可读的、结构化的步骤记录。对调试和审计来说,这比黑盒式的“给个结果”要可靠得多。
2. 子智能体插件接入:Codex 和 Claude Code 的实战配置
2.1 为什么优先接入这两个子智能体
先说明白一个事情:Codex 和 Claude Code 这两个子智能体,定位是完全不同的,Harness 把它们都收进来,不是为了让它们“竞争”,而是让它们互补。
Codex 的优势在代码生成和执行链路的闭环上。它的训练数据里代码语料密度高,生成代码时对 API 的调用习惯、常见库的用法掌握得比较扎实,而且它的输出格式天然适合被解析后直接执行。在 Harness 里挂上 Codex 子智能体,主控可以把“实现某个函数”“修某个 bug”“写一段测试”这类任务整体委派出去,拿到结果后自己做验证。
Claude Code 的强项则偏向长上下文理解和复杂任务的拆解。它的上下文窗口大,指令跟随能力强,你给它一个模糊的任务描述,它能把任务拆成步骤、列出风险点、给出方案对比。在 Harness 里,它更适合做“分析型”的子智能体——比如让主控把一段遗留代码丢给它,让它梳理逻辑、标注问题、给出重构建议。
所以我的建议是:不要二选一,两个都挂上。主控负责决策,Codex 负责干活,Claude Code 负责分析和把关。这三者配合起来,才是一个完整的智能体团队。
2.2 插件配置的完整流程
Harness 的插件机制走的是声明式配置,和 Docker Compose 的思路有点像。你不需要写代码去“调用”子智能体,只需要在配置里声明它、定义它的工具权限,然后在系统指令里告诉主控“什么时候该用它”。
先看插件声明部分,我用的是 YAML 格式:
plugins: codex: provider: openai model: codex-mini-latest credentials: ${CODEX_API_KEY} max_workers: 2 timeout: 120 tool_policy: - file_write - terminal_exec - code_search claude_code: provider: anthropic model: claude-code credentials: ${CLAUDE_API_KEY} max_workers: 1 timeout: 180 tool_policy: - file_read - code_search - web_search注意几个关键参数:
max_workers:同一个子智能体的最大并发数。不是越大越好,因为外部 API 有速率限制,而且主控的上下文窗口也会被多个子智能体的返回结果迅速占满。timeout:子智能体执行超时时间。编码类任务普遍比分析类任务快,但遇到大规模重构时,120 秒也可能不够,我后面会讲怎么动态控制。tool_policy:这是安全边界。Codex 我给了文件写入和终端执行权限,因为它要改代码、跑测试;Claude Code 我只给了读取和搜索权限,它负责的是分析,不需要改文件。
然后是主控系统指令里的调用规则,我用一段伪代码来说明思路:
当收到编码类任务时: 1. 委派给 codex 子智能体 2. 要求返回:修改的文件列表、关键代码片段、测试结果 3. 将返回结果交给 claude_code 做代码审查 4. 综合双方结论生成最终响应 当收到分析类任务时: 1. 委派给 claude_code 子智能体 2. 要求返回:问题列表、影响范围、重构建议 3. 如涉及具体代码修改,再将建议转交给 codex 执行这套编排逻辑的妙处在于:主控不需要自己懂代码,它只要懂得“把任务分给对的人”,然后对子智能体的输出做交叉验证。
2.3 接插件时最容易踩的三个坑
坑一:子智能体返回结果太长,撑爆主控上下文。这是我最开始频繁遇到的问题。Codex 执行一次代码生成任务,返回的可能是几百行代码;Claude Code 做一个大文件分析,返回的分析报告可能上千字。如果主控把这些内容全部塞进自己的上下文,几个来回之后主控的记忆就开始“混乱”,表现就是它忘了前面的任务目标。
解决思路是在插件配置里加返回结果的截断策略。Harness 提供了一个response_summary参数,可以指定子智能体对返回内容做摘要压缩。我实际配置的是:代码类任务保留完整代码片段但限制文件数量,分析类任务强制输出结构化摘要。
坑二:子智能体之间的状态不同步。Codex 改了代码文件,但 Claude Code 读到的还是旧文件,导致审查结果和实际代码不匹配。这个问题的根源在于子智能体各自维护自己的上下文快照。
我的做法是在主控层面强制设置检查点:子智能体返回结果后,主控先把关键状态(文件哈希、变更列表)记录下来,再决定是否进入下一个子智能体环节。这个检查点机制可以避免“改了等于没改”的尴尬。
坑三:凭证管理草率。有些人在配置文件里直接硬编码 API Key,一旦配置文件被分享出去,等于把账号权限交给别人。Harness 支持环境变量注入,用credentials: ${CODEX_API_KEY}这种方式,Key 不出现在文件里,只在运行时从环境读取。这个习惯要早点养成。
3. Git 工作树支持:智能体执行环境的隔离利器
3.1 传统分支切换的痛点
先说说我为什么对 Git 工作树这个功能这么兴奋。做智能体开发的时候,经常要并行跑多个实验:一个子智能体在改认证逻辑,另一个在优化数据库查询,还有一个在重写前端组件。如果它们都工作在同一个分支上,改动的文件互相覆盖,整个工作区就是一团乱麻。
用 Git stash 也不是好办法,因为 stash 是基于当前工作区的,多个智能体共享一个工作区时,A 存储的改动可能被 B 的 stash 操作冲掉。用传统git branch切换更痛苦,因为切换分支时未提交的改动会被 Git 阻止,你得先 commit 或者 stash,这打断了智能体的连续工作流。
Git 工作树(worktree)解决的正是这个问题。它允许你在同一个仓库下创建多个工作目录,每个目录关联不同的分支,互不干扰。相当于同一个项目有了多个并行的工作副本,每个副本都有自己的文件状态和分支指针。
3.2 Harness 里的工作树配置方法
Harness 这次把 worktree 操作直接封装进了工具调用接口,你不用在 shell 里手动敲git worktree命令,而是让主控智能体通过工具调用完成。
配置在环境设置里:
environment: git: worktree_enabled: true worktree_base_path: /workspaces/project_worktrees auto_cleanup: true max_worktrees: 8几个参数的含义:
worktree_base_path:所有工作树目录的根路径。每个子智能体分配一个子目录,比如/workspaces/project_worktrees/codex_agent。auto_cleanup:任务完成后自动删除工作树。这个功能要慎用,如果子智能体产出的代码没合并回主分支,删了就没了。我会把它设置成 false,在 CI 流程里手动控制合并。max_worktrees:最大并行工作树数量。每个 worktree 都是文件的完整副本,数量太多会占用大量磁盘空间,8 个是比较稳妥的数值。
在主控指令里添加工作树分配逻辑也很简单:
子智能体分配工作目录: 1. 每个子智能体获得独立 worktree 2. worktree 创建在 base_path 下的独立目录 3. 子智能体完成工作后,主控审查变更并合并 4. 合并成功后清理 worktree3.3 工作树机制的两个实战场景
场景一:多智能体并行开发互不干扰。我有一次跑了三个子智能体同时改同一个仓库——一个加新功能,一个修旧 bug,一个做代码格式化。以前这种并行操作一定会冲突,现在每个子智能体在自己的 worktree 里随便改,最后统一合并。合并的时候虽然也会遇到冲突,但冲突范围小得多,因为每个子智能体只动了它负责的那部分代码。
场景二:主控智能体的实验性操作有了“后悔药”。主控在做一个大胆的重构时,可以直接在临时 worktree 里操作,不需要担心搞坏主分支。效果不满意的话,直接删掉这个 worktree,主分支毫发无损。这对智能体场景尤其重要,因为模型的行为有随机性,你可能这次跑出来一个烂方案,下次跑出来一个好方案,有了 worktree,你就可以大胆地让模型多试几次,选出最优结果。
3.4 工作树使用中的注意事项
- 子智能体在 worktree 里操作时,主控应该定期检查它的进度,而不是干等超时。Harness 支持事件回调机制,当工作树里有文件变更时自动触发一次主控的“进度检查”,这能避免一个跑偏的子智能体在错误方向上工作几个小时。
- 合并 worktree 分支前,务必做一次主分支的快速更新,否则合并时会遇到大量“假冲突”,这些冲突不是代码逻辑问题,而是版本差异带来的噪音。
auto_cleanup开启的情况下,合并失败时工作树会被自动删除,你的排查线索也一起没了。我建议关闭自动清理,改为在合并成功且验证通过后手动清理。
4. 思考翻译机制:让模型的推理过程变透明
4.1 黑盒执行的问题
做过智能体调试的人都有过这种体验:主控给子智能体派了个任务,子智能体嘴上说“好的,我开始执行”,然后过了几分钟,返回一个完全不符合预期的结果。这时候你想排查问题,但子智能体就像一个黑盒,你只看到输入和输出,中间发生了什么完全不可见。
思考翻译(Thought Translation)机制就是来解决这个问题的。它把模型内部的推理追踪(reasoning trace)转换成结构化的、人类可读的步骤记录,并且和工具调用事件关联起来。
4.2 工作原理和配置
Harness 的实现思路是这样:在子智能体执行任务时,拦截模型的推理过程,把每一段“思考”对应到具体的动作上,最终生成一个执行日志。
配置项如下:
thought_translation: enabled: true output_format: structured include_confidence: true min_confidence_threshold: 0.6 log_tool_events: true关键参数:
output_format:可选raw或structured。raw是推理痕迹原文,信息完整但噪音大;structured会按“意图-动作-预期结果”的格式整理成条目,推荐后者。include_confidence:记录模型对当前步骤的信心分数。这个参数在排查问题时很有用,信心高的步骤基本不会出错,出错点往往集中在信心中低区域。min_confidence_threshold:低于这个信心值的步骤会被特殊标注,提示你重点关注。
开启后,每个任务完成时,你会得到类似这样的日志:
[步骤 1] 意图: 解析用户请求中的数据库操作关键词 动作: 调用 tool: text_search 工具说明: 在用户输入中搜索 "query"、"select" 等关键词 信心: 0.92 [步骤 2] 意图: 确认目标表结构 动作: 调用 tool: db_schema_inspect 工具说明: 读取用户数据库的 schema 信息 信心: 0.87 [步骤 3] 意图: 生成 SQL 查询语句 动作: 调用 tool: code_generation 工具说明: 基于 schema 和用户需求生成查询 信心: 0.41看到步骤 3 的信心只有 0.41,你就知道问题出在 SQL 生成环节,而不是前面的意图解析或表结构检查。排查范围一下子缩小了。
4.3 思考翻译的更深层价值
除了调试,思考翻译还有两个容易被忽略的用途。
第一个用途是做执行策略的复盘优化。智能体执行任务时,它的“思考路径”决定了它的行为方式。如果它总是绕弯路,你会看到它的思考步骤特别多,而且反复在同一个环节徘徊。这种迹象表明需要调整系统指令,或者在任务拆解时给出更明确的路径引导。
第二个用途是增强审计合规性。在生成代码或处理数据的场景里,你不仅要知道智能体产出了什么,还要知道它为什么这么做。思考翻译日志就是一份现成的“执行证据”,记录了这个决策是怎么一步步形成的。我见过有团队直接用这个日志作为发布评审附件,评审效率提高不少。
4.4 思考翻译的性能与隐私权衡
开启思考翻译会带来两个代价:性能和隐私。
性能上,翻译和结构化推理过程需要额外的计算开销,任务执行时间会增加,实测下来大约有 10%-20% 的延迟提升,对应的资源消耗主要在推理日志的存储和转换上。如果对速度有严格要求的任务,可以针对特定子智能体关闭翻译,只在调试阶段开启。
隐私上需要注意:推理痕迹可能包含模型“自言自语”的内容,有些内容并不适合直接存入日志或展示给用户——比如它考虑过一些不合规但可行的思路(哪怕最后没采用)。所以建议搭一套过滤策略,把包含特定敏感词的推理步骤做脱敏处理。
5. 实战记录:一次完整的子智能体协作任务
这一部分用一个我实际跑过的任务来串起上面的所有功能:让主控智能体对一段遗留代码做逻辑梳理、生成测试补丁并执行验证。
5.1 任务配置与执行过程
任务描述是:“检查legacy_module.py中的数据处理逻辑,找出潜在的并发安全问题,生成修复补丁并运行测试验证。”我把这个任务交给了配置好子智能体和思考翻译的 Harness 实例。
第一步:主控创建了fix_concurrency_issue的 worktree,分支名和任务名一致。然后主控在系统提示词里确定任务分配方案:由 Claude Code 子智能体负责代码逻辑分析,Codex 子智能体负责生成补丁和测试。
第二步:Claude Code 开始分析。通过思考翻译日志,我观察到它先扫描了文件结构,然后逐段检查涉及共享状态的部分。它标记了两处风险点:一处是全局变量在并发读写时未加锁,另一处是原子操作的缺失。信心值分别为 0.81 和 0.76。
第三步:主控将 Claude Code 的分析结果转交给 Codex,Codex 在工作树里修改了代码,并生成了一个对应的并发测试用例。Codex 执行了测试,第一次结果有三个用例失败。思考翻译日志显示,Codex 在这时候做了一轮内部推理,决定调整锁的粒度,把粗粒度锁改成了细粒度锁,第二次测试全部通过。
第四步:主控看到测试通过后,启动了一个合并操作。合并前还做了一次主分支的快速更新。合并过程顺利,随后我手动验证了主分支的代码没有问题,才清理了 worktree。
5.2 这次实测暴露的三个问题
第一个问题是 Claude Code 分析和 Codex 执行之间存在信息损耗。分析结果里有几句话被摘要机制压缩过度,导致 Codex 不明白 Claude Code 想要修的具体位置。最后我只能人工干预,补充了更明确的指令。这个问题的根源是两个子智能体没有共享上下文,中间是主控在传话,传话总是会丢信息。
目前 Harness 还没有完美的解决方案,我的折中做法是在任务分派时把 Claude Code 的输出直接作为 Codex 的输入上下文,尽量保持原文传递,只在必须压缩时才压缩。
第二个问题是 worktree 的磁盘空间消耗比预期大。仓库本身有大量二进制资源文件,每个 worktree 都完整复制了一份,三个 worktree 跑起来占了几 GB。我的解决方案是把二进制资源目录加进.gitignore,改用符号链接指向公共缓存目录。
第三个问题是多个子智能体并发时 API 配额会迅速打满。实测中同时跑两个以上的子智能体,出现限流的概率明显增加。我在配置里加了重试机制和动态并发控制,这个后面细说。
5.3 配置上的几个调优建议
- 并发数从低往高调。先 1 个 workers 跑通流程,再逐步增加,不要一开始就把
max_workers拉满。 - 为不同类型的任务设定不同的超时时间。分析类任务设长一点,代码生成这类的短一点。不要用同一个超时值应对所有场景,否则要么小任务等半天,要么大任务被过早杀掉。
- 思考翻译的
min_confidence_threshold值不要设太高,0.6 左右最合适。设太高会导致大量步骤被标记为“低信心”,反而淹没了真正的问题信号。
6. 常见问题与排查技巧速查
| 问题现象 | 可能原因 | 排查思路与解法 |
|---|---|---|
| 子智能体返回结果为空 | 凭证权限不足、tool_policy 限制了核心动作 | 检查环境变量,先放开 tool_policy 里的只读权限做测试,确认能调用成功后再逐级放开 |
| 子智能体超时频繁 | max_workers 并发过高或任务量超出单次执行上限 | 调低并发数,或者在大段代码生成前在主控层做任务切分,让子智能体分段返回 |
| 返回内容被截断导致结果不完整 | 没有配置 response_summary 策略或摘要阈值过低 | 将关键文件的代码设为“不压缩直出”,只对分析文本做摘要 |
| worktree 合并时冲突过多 | 工作树创建后主分支有大量更新,两边版本差距大 | 合并前先 fast-forward 主分支,用 rebase 而不是直接 merge |
| 思考翻译日志里出现明显错误的低信心步骤 | 模型在关键环节的推理本身不稳定 | 可考虑在该环节增加一次“自我验证调用”,让子智能体先跑一个最小化实验确认方案可行 |
| 两个子智能体同时写入同一文件导致内容覆盖 | tool_policy 和 worktree 隔离没同时生效 | 确认每个子智能体有独立 worktree,且在配置中禁止跨工作树写入 |
这里多说一句排查时的“从日志反推”技巧。Harness 的日志输出设计得比较细,遇到问题不要上来就改代码,先打开思考翻译日志,看看子智能体在哪个步骤信心值最低、哪个调用延迟最高。大部分问题只要顺着日志走一遍就清楚了,比盲猜要高效得多。
关于 API 配额被限流的情况,我自己的处理办法是加了一个简单的指数退避重试:
import time import random def call_with_retry(agent_func, max_retries=5, base_delay=2.0): for attempt in range(max_retries): try: return agent_func() except RateLimitError: delay = base_delay * (2 ** attempt) + random.uniform(0, 1) time.sleep(delay) raise RuntimeError("agent call failed after retries")这只是一个基础版,生产环境可以再加上并发信号量,限制同时进行的外部调用数量。
7. 我个人的整体评价与下一步的玩法
这次 Harness 更新,我觉得最值钱的部分不是某一个单独功能,而是这几个功能之间形成的组合效应。子智能体插件解决了“让合适的模型干合适的活”的问题;Git 工作树解决了“多个智能体怎么在同一个项目上并行干活”的问题;思考翻译解决了“智能体干活的过程怎么被理解和验证”的问题。这三个问题正好卡在智能体应用从 Demo 走向生产的要害上。
如果你问我产业界下一步会演化成什么样,我的判断是:智能体的能力差距会越来越小,真正拉开差距的会是对智能体的管理能力——调度、编排、审计、隔离。这次的三个功能,恰好都在往这个方向发力。
而且我注意到这次官方插件统一了接口标准,后续如果出现新的优秀编码智能体,接入成本会低很多。未来一个主控调度多个异构智能体的场景,大概率会成为智能体应用的主流形态。
最后说一个我自己的习惯:每次拿到新版本,我不会急着把生产任务切过去,而是先用一个模拟项目把新功能跑熟,验证配置的稳定性和边界行为。工具越强大,越需要你理解它的脾气。这套流程走完之后,再迁移生产任务就顺手多了。