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 Engineering
1. 代码 Agent 的核心公式,不是“模型 + IDE”
很多人第一次理解Coding Agent,会把它看成“更聪明的代码补全”。
其实这已经完全低估了它。
代码补全的输入通常只是光标附近的上下文。
Coding Agent面对的却是一个长期任务。
它需要理解整个仓库。
需要定位相关文件。
需要修改代码。
需要运行测试。
需要读取错误。
还需要决定下一步是否继续。
更准确的公式
Agent = Model + Context + Tools + State + Policy + Feedback Loop
Harness负责的,正是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_factory=list ) failed_tests: list[str] = field( default_factory=list ) iteration: int = 0 max_iterations: int = 20 token_cost: float = 0.0 last_error: str | None = None如果Agent没有显式状态,模型“记得自己做过什么”的能力就完全依赖上下文窗口。
一旦Context被压缩或者截断,Agent就可能重复读取文件、重复改代码、重复跑测试。
STATE-101|STATE_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( f"duplicate tool: {tool.name}" ) self._tools[tool.name] = tool def get(self, name: str) -> Tool: if name not in self._tools: raise KeyError( f"unknown tool: {name}" ) return self._tools[name]真正的Harness应该知道哪个工具是只读的。
哪个工具会修改文件。
哪个操作需要人工确认。
TOOL-202|SHELL_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-301|STALE_FILE_OVERWRITE
Agent基于旧文件生成修改,但应用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-401|RUN_ON_HOST
Agent生成的命令直接在开发机或生产环境执行,没有文件、网络、环境变量和资源隔离。
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, key=context_score, reverse=True, ) selected = [] used = 0 for item in ordered: if ( used + item.token_count > token_budget ): continue selected.append(item) used += item.token_count return selectedCTX-501|WHOLE_REPO_DUMP
为了利用长上下文把整个仓库直接塞给模型,导致噪声增加、成本上升,并削弱真正关键文件的注意力。
9. 第七件事:长任务必须做Context Compaction
Coding 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-601|INFINITE_AGENT_LOOP
Agent没有最大迭代数、工具调用数、成本和墙钟时间限制,一次失败任务可能无限消耗资源。
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( state=state, tool_calls=0, elapsed_seconds=0, budget=self.budget, ): state.phase = AgentPhase.FAILED state.last_error = "budget exceeded" return state context = await build_context( state ) decision = await self.model.plan( goal=state.goal, context=context, ) if decision.type == "tool": tool = self.tools.get( decision.tool_name ) result = await execute_tool( tool=tool, args=decision.arguments, sandbox=self.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-101|NO_PERSISTENT_STATE
任务执行状态只存在于上下文中,断线或压缩后无法可靠恢复。
TOOL-202|UNRESTRICTED_SHELL
把任意Shell作为唯一工具接口,缺少权限、语义和审计边界。
PATCH-303|WRITE_WITHOUT_VERSION_CHECK
修改文件前不校验版本,Agent可能覆盖开发者或其他Agent的新改动。
SANDBOX-404|HOST_EXECUTION
直接在宿主机执行模型生成的命令,没有网络、文件系统和环境变量隔离。
CTX-505|CONTEXT_DUMP
依赖超长上下文解决所有问题,把整个仓库塞给模型,导致噪声与成本同步上涨。
LOOP-606|NO_BUDGET
没有迭代数、工具调用、Token成本和时间预算,失败任务可以无限循环。
DONE-707|MODEL_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内部实现。