行业资讯
📅 2026/8/13 19:31:23
DeepSeek Harness 传出内测:代码 Agent 真正的护城河,为什么不是模型,而是 Harness?
摘要最近“DeepSeek Harness”开始在开发者圈里被频繁讨论。真正值得技术人员关注的不是它会不会成为“国产Claude Code”而是一个更根本的问题。为什么同一个模型放进普通聊天框和放进Coding Agent里会表现得像两个完全不同的产品答案就在Harness。本文从工程视角拆解Model Harness Agent这条链路并用Python实现任务状态机、工具注册表、代码沙箱、Patch Plan、测试闭环、上下文压缩、成本预算和审计日志等核心组件。FACT-001先区分“视频热点”和“官方可核验信息”视频中提到了DeepSeek Harness独立产品、8月1日内测招募、团队负责人和公众号注册等细节。截至本文核验时没有在DeepSeek公开官网、官方API文档或官方GitHub中找到这些产品细节的独立官宣页面。目前可以从DeepSeek官方资料确认的是DeepSeek V4已经显著强化Agentic Coding能力并明确适配Claude Code、OpenCode、OpenClaw、GitHub Copilot CLI、Pi等Agent / Harness生态。因此本文把“DeepSeek Harness”作为热点切入口但技术结论只建立在官方已经公开的V4 Agent能力和Harness工程模式之上。关键词DeepSeek Harness、DeepSeek V4、Coding Agent、Agent Harness、Claude Code、OpenCode、Tool Calling、Sandbox、Context Engineering1. 代码 Agent 的核心公式不是“模型 IDE”很多人第一次理解Coding Agent会把它看成“更聪明的代码补全”。其实这已经完全低估了它。代码补全的输入通常只是光标附近的上下文。Coding Agent面对的却是一个长期任务。它需要理解整个仓库。需要定位相关文件。需要修改代码。需要运行测试。需要读取错误。还需要决定下一步是否继续。更准确的公式Agent Model Context Tools State Policy Feedback LoopHarness负责的正是Model之外的这些部分。模型负责“思考”。Harness负责让思考变成可以执行、可以验证、可以恢复的工程动作。2. DeepSeek 官方已经释放出一个明确信号V4 正在往 Agent 生态靠DeepSeek V4官方发布资料把Agentic Coding单独列成重点能力。官方还明确表示V4已经与Claude Code、OpenClaw、OpenCode等主流Agent工具集成。DeepSeek官方Agent集成文档目前还覆盖GitHub Copilot CLI、Pi、Deep Code、WorkBuddy、Crush、Kilo Code等工具。这说明DeepSeek正在做的事情已经不只是提供一个Chat API。它在主动进入Agent执行层。同一个DeepSeek V4模型可以被多个不同Harness驱动。DeepSeek V4 ├── Claude Code Harness ├── OpenCode Harness ├── Copilot CLI Harness ├── Pi Harness └── 自研 Harness这也是为什么“模型能力强”并不自动等于“Coding Agent好用”。3. Harness第一件事必须把任务变成状态机普通聊天可以一问一答。代码任务不能。“给项目增加JWT鉴权”可能持续几十分钟。中间会经历搜索、阅读、规划、修改、测试、失败、回滚和继续。因此Agent必须拥有显式状态。from dataclasses import dataclass, field from enum import Enum class AgentPhase(str, Enum): PLANNING planning SEARCHING searching EDITING editing TESTING testing REVIEWING reviewing DONE done FAILED failed dataclass class AgentState: task_id: str goal: str phase: AgentPhase touched_files: list[str] field( default_factorylist ) failed_tests: list[str] field( default_factorylist ) iteration: int 0 max_iterations: int 20 token_cost: float 0.0 last_error: str | None None如果Agent没有显式状态模型“记得自己做过什么”的能力就完全依赖上下文窗口。一旦Context被压缩或者截断Agent就可能重复读取文件、重复改代码、重复跑测试。STATE-101STATE_ONLY_IN_PROMPT任务状态只存在于自然语言上下文里一旦上下文压缩或会话恢复Agent会失去可靠执行历史。4. 第二件事Tool Registry必须可控而不是“给模型一个Shell”Coding Agent最大的能力来源不是模型参数。而是工具。读取文件。搜索代码。写补丁。运行测试。调用LSP。执行Git命令。如果所有能力都直接变成“执行任意Shell”系统几乎没有治理能力。from dataclasses import dataclass from typing import Callable dataclass class Tool: name: str description: str handler: Callable read_only: bool True requires_approval: bool False class ToolRegistry: def __init__(self): self._tools {} def register(self, tool: Tool): if tool.name in self._tools: raise ValueError( fduplicate tool: {tool.name} ) self._tools[tool.name] tool def get(self, name: str) - Tool: if name not in self._tools: raise KeyError( funknown tool: {name} ) return self._tools[name]真正的Harness应该知道哪个工具是只读的。哪个工具会修改文件。哪个操作需要人工确认。TOOL-202SHELL_IS_THE_API把任意Shell当作唯一工具接口模型可以绕过权限边界审计系统也无法准确理解每一次操作。5. 第三件事代码修改不能直接 write file应该先产生 Patch直接让模型覆盖文件是最粗糙的Coding Agent实现。真正可控的方式是先生成Patch Plan。Harness先检查。再应用。from dataclasses import dataclass dataclass class FilePatch: path: str old_hash: str new_content: str dataclass class PatchPlan: reason: str files: list[FilePatch] requires_test: bool True rollback_ready: bool Trueold_hash很重要。因为Agent读取文件以后文件可能已经被人或者另一个Agent修改。如果Hash不一致就不应该盲目覆盖。import hashlib def sha256_text(text: str) - str: return hashlib.sha256( text.encode(utf-8) ).hexdigest() def verify_patch_base( current_content: str, expected_hash: str, ) - bool: return ( sha256_text(current_content) expected_hash )PATCH-301STALE_FILE_OVERWRITEAgent基于旧文件生成修改但应用Patch时没有检查版本可能覆盖开发者刚刚提交的新代码。6. 第四件事真正的Coding Agent必须运行在Sandbox里AI修改代码之后必须执行。但执行代码本身就是风险。测试脚本可能删除文件。依赖安装可能执行生命周期脚本。项目代码可能读取环境变量。因此Harness不应该直接在宿主机执行所有命令。from dataclasses import dataclass dataclass class SandboxPolicy: network: bool False writable_paths: tuple[str, ...] ( /workspace, /tmp, ) env_allowlist: tuple[str, ...] () max_cpu_seconds: int 120 max_memory_mb: int 2048 timeout_seconds: int 180真实实现可以使用Docker、gVisor、Firecracker或者独立CI Runner。关键不是选哪个隔离技术。关键是执行环境必须和开发者机器隔离。SANDBOX-401RUN_ON_HOSTAgent生成的命令直接在开发机或生产环境执行没有文件、网络、环境变量和资源隔离。7. 第五件事测试不是最后一步而是Agent的反馈信号普通代码生成的流程是生成代码然后结束。Coding Agent的流程应该是生成Patch、执行测试、读取错误、定位原因、重新修改。dataclass class TestResult: command: str exit_code: int stdout: str stderr: str duration_ms: int def should_continue( state: AgentState, result: TestResult, ) - bool: if result.exit_code 0: return False if ( state.iteration state.max_iterations ): return False return TruePlan → Read/Search → Patch → Test → Observe → Re-plan这就是Agent Loop。而Harness最大的价值就是把这个Loop变得稳定。8. 第六件事Context Engineering才是代码Agent最容易被低估的能力DeepSeek V4官方已经把1M上下文作为重要能力。但1M上下文不意味着应该把整个仓库全部塞进模型。上下文越大检索噪声同样可能越大。优秀Harness必须先决定什么值得进入Context。dataclass class ContextItem: source: str content: str relevance: float freshness: float token_count: int def context_score( item: ContextItem, ) - float: return ( 0.70 * item.relevance 0.30 * item.freshness ) def select_context( items: list[ContextItem], token_budget: int, ): ordered sorted( items, keycontext_score, reverseTrue, ) selected [] used 0 for item in ordered: if ( used item.token_count token_budget ): continue selected.append(item) used item.token_count return selectedCTX-501WHOLE_REPO_DUMP为了利用长上下文把整个仓库直接塞给模型导致噪声增加、成本上升并削弱真正关键文件的注意力。9. 第七件事长任务必须做Context CompactionCoding Agent运行20分钟后上下文里会堆积大量工具调用、文件内容和测试日志。全部保留会越来越贵。全部删除又会失忆。所以需要Checkpoint。dataclass class AgentCheckpoint: goal: str current_plan: list[str] completed_steps: list[str] important_files: list[str] unresolved_errors: list[str] decisions: list[str] next_action: strCheckpoint不是普通聊天摘要。它保存的是任务继续执行所需的最小状态。10. 第八件事Harness必须有预算Agent不能无限自我循环Agent最危险的失败方式之一不是报错。而是不停重试。dataclass class Budget: max_iterations: int 20 max_tool_calls: int 100 max_cost_usd: float 2.0 max_wall_time_seconds: int 1800 def budget_exceeded( state: AgentState, tool_calls: int, elapsed_seconds: int, budget: Budget, ) - bool: return any([ state.iteration budget.max_iterations, tool_calls budget.max_tool_calls, state.token_cost budget.max_cost_usd, elapsed_seconds budget.max_wall_time_seconds, ])BUDGET-601INFINITE_AGENT_LOOPAgent没有最大迭代数、工具调用数、成本和墙钟时间限制一次失败任务可能无限消耗资源。11. 第九件事同一个Harness里Pro和Flash应该承担不同角色DeepSeek V4官方目前同时提供Pro和Flash。官方描述里Flash在简单Agent任务上可以接近Pro同时速度更快、成本更低。这很适合Agent内部做分工。def route_agent_model( task_type: str, complexity: int, ) - str: if task_type in { file_summary, simple_search, format_result, }: return deepseek-v4-flash if complexity 2: return deepseek-v4-flash return deepseek-v4-pro主Agent可以使用Pro。文件摘要、简单搜索判断和子Agent任务可以使用Flash。一次用户任务内部也可以产生多次不同模型调用。12. 第十件事每一步都要可审计否则“自动改代码”很难进入企业个人写Demo可以只看最终结果。企业场景不行。必须知道Agent看了哪些文件、执行了哪些工具、为什么修改、哪些测试通过、谁批准了高风险操作。from dataclasses import dataclass from datetime import datetime dataclass class AgentEvent: task_id: str timestamp: datetime phase: str action: str tool_name: str | None input_digest: str | None output_digest: str | None cost_usd: float approved_by: str | None NoneAgent的Session Log未来很可能和CI日志一样重要。13. 把组件串起来一个最小Harness长什么样class CodingHarness: def __init__( self, model_client, tool_registry, sandbox, budget, ): self.model model_client self.tools tool_registry self.sandbox sandbox self.budget budget async def run( self, state: AgentState, ): while True: if budget_exceeded( statestate, tool_calls0, elapsed_seconds0, budgetself.budget, ): state.phase AgentPhase.FAILED state.last_error budget exceeded return state context await build_context( state ) decision await self.model.plan( goalstate.goal, contextcontext, ) if decision.type tool: tool self.tools.get( decision.tool_name ) result await execute_tool( tooltool, argsdecision.arguments, sandboxself.sandbox, ) await append_observation( state, result, ) elif decision.type finish: state.phase AgentPhase.DONE return state else: raise RuntimeError( unknown decision ) state.iteration 1真正产品当然会复杂很多。但骨架基本不会逃出Task State、Context、Model、Tool、Sandbox、Feedback这几层。14. 为什么Agent产品最难复制的部分很可能就是Harness模型可以通过API调用。Harness却需要长期积累。STEP 1仓库理解策略什么文件应该先看什么目录应该忽略如何使用LSP、Git历史和依赖图缩小Context。STEP 2工具调用策略不同任务开放哪些工具哪些命令需要审批什么情况下应该拒绝执行。STEP 3修改策略什么时候直接Patch什么时候先重构Plan如何避免旧版本覆盖和无关改动。STEP 4验证策略先跑哪组测试失败以后读取哪些日志什么时候需要扩大测试范围。STEP 5恢复策略Agent被中断、模型报错、上下文压缩以后如何从Checkpoint继续。STEP 6评测策略如何判断一个任务是真的完成而不是模型自己宣布完成。这些规则加起来才构成产品体验。所以同一个DeepSeek V4放进两个不同Harness里实际效果可以有巨大差异。15. 多模型平台为什么也会越来越需要Harness层如果平台只做聊天多模型聚合主要解决“模型选择”。当平台开始提供智能体以后问题会迅速升级。一个任务可能先用文本模型拆计划。再调用图片模型生成资产。再调用视频模型完成镜头。最后用PPT能力整理结果。对于聚合500模型、同时包含智能体、无限画布、AI漫剧和AI PPT的多模型平台来说本质上也会遇到同一个问题。模型越多越不能只做一个“模型下拉框”。真正有价值的是统一的执行层。Multi-Model Harness ├── Task Planner ├── Model Router ├── Tool Registry ├── Asset Registry ├── Workflow DAG ├── Context Manager ├── Retry Policy ├── Budget Manager ├── Quality Gate └── Audit Log从这个角度看Harness并不只属于Coding Agent。它是所有“AI真正开始干活”之后都会出现的一层。16. 七个Coding Agent最容易踩的坑STATE-101NO_PERSISTENT_STATE任务执行状态只存在于上下文中断线或压缩后无法可靠恢复。TOOL-202UNRESTRICTED_SHELL把任意Shell作为唯一工具接口缺少权限、语义和审计边界。PATCH-303WRITE_WITHOUT_VERSION_CHECK修改文件前不校验版本Agent可能覆盖开发者或其他Agent的新改动。SANDBOX-404HOST_EXECUTION直接在宿主机执行模型生成的命令没有网络、文件系统和环境变量隔离。CTX-505CONTEXT_DUMP依赖超长上下文解决所有问题把整个仓库塞给模型导致噪声与成本同步上涨。LOOP-606NO_BUDGET没有迭代数、工具调用、Token成本和时间预算失败任务可以无限循环。DONE-707MODEL_SAYS_DONE把模型输出“任务完成”当成真实完成没有测试、Diff和业务验收。17. 真正该怎么评测一个Coding Harness只看模型Benchmark是不够的。Harness应该有自己的工程指标。指标含义Task Success Rate真实任务最终通过测试和验收的比例First-pass Success第一次Patch就通过的比例Median Iterations完成任务需要多少Agent循环Tool Failure Rate工具调用失败、参数错误和权限拒绝比例Context Efficiency有效上下文Token占总输入Token的比例Accepted Task Cost完成一个可接受任务的真实总成本Rollback Rate最终需要撤销Agent改动的任务比例如果一个Harness让模型多调用50%的Token却把Task Success Rate提高20%它可能依然非常划算。反过来Token很省但任务大量失败也不是真正的低成本。18. 最后DeepSeek如果真的自研Harness最值得看的不是UI如果后续DeepSeek真的正式推出自研Harness产品我最关注的不会是它长得像不像Claude Code。也不会是它能不能一键生成几千行代码。真正值得看的会是四件事。第一Context选择是不是足够准。第二工具和沙箱是不是足够稳定。第三测试失败后的恢复循环是不是足够聪明。第四Pro与Flash能不能在同一任务内部形成有效分工。模型决定Agent能力上限。Harness决定这个上限有多少能够真正变成工程产出。代码Agent下一阶段真正的竞争很可能不再只是Model War而是Harness Engineering。资料说明DeepSeek V4官方发布资料明确强调Agentic Coding能力并表示V4已与Claude Code、OpenClaw、OpenCode等主流Agent工具集成。DeepSeek官方Agent集成文档目前还提供Claude Code、OpenCode、GitHub Copilot CLI、Pi、Deep Code、WorkBuddy等工具的接入说明。DeepSeek官方GitHub仓库awesome-deepseek-agent用于整理DeepSeek模型与多种Agent / Coding Assistant的集成方式。视频中关于“DeepSeek Harness独立产品内测、具体团队与负责人”的信息目前未在DeepSeek公开官网/API文档中找到可独立核验页面因此本文没有把这些细节写成确定事实。文中的Python代码、Harness架构、错误码与评测指标均为工程设计示例不代表DeepSeek内部实现。