Skip to content

deepcode 如何工作

deepcode 不是一个「提示词 + 单次生成」的工具,而是一个跑在终端里的 agent 循环:模型决定做什么,代码决定怎么执行、怎么兜底。理解这个分工,就理解了 deepcode 的大部分行为。

心智模型

四条原则贯穿整个 harness:

  • 控制流姓代码、智能姓模型。 该不该重试、该不该继续跑下一轮、权限怎么判——这些是确定性代码的活;该做什么、调哪个工具、怎么理解报错——这些交给模型判断。两边不越界。
  • 重试只包 API 建流、工具执行不重放。 网络抖动、连接超时,只在「和模型服务建立连接」这一层重试;一旦某个工具已经开始执行(尤其是 BashEdit 这类有副作用的工具),就不会被静默重跑——避免同一条命令因为一次网络波动被意外执行两次。
  • 报错写给模型看。 工具失败时,deepcode 不会把异常吞掉或者直接中断整轮对话,而是把结构化的错误信息回灌给模型,让它自己判断要不要换个思路重试——这也是 agent 能「自己纠错」的关键机制。
  • 工具结果是不可信输入。 文件内容、命令输出、网页抓取结果,本质上都是外部数据,不因为「是工具返回的」就天然可信。deepcode 在权限、路径校验、SSRF 防护等环节都按「不可信输入」来处理,而不是默认信任。

一轮循环

一轮任务大致是这样跑的:

模型(决定下一步)→ 工具调用(Read / Grep / Edit / Bash …)→ 结果回灌给模型 → 直到收敛

模型每次只决定「接下来调用哪个工具、传什么参数」,工具执行完的结果(文件内容、命令输出、diff)会原样回灌进对话,模型基于最新状态再决定下一步——如此循环,直到模型判断任务完成或用户中断。权限门控发生在工具真正执行之前:每一次工具调用都先过一遍权限判断(allow / ask / deny),通过了才落到磁盘或跑进 shell,模型看不到的这一层由代码把关。

子系统一览

主循环之外,几个子系统各自负责一块职责:

  • 工具编排:Read / Grep / Edit / Bash / WebFetch / WebSearch 等工具的调度、参数校验与结果格式化。详见工具总览
  • 权限:五种模式(default / accept / plan / auto / ask-deny)决定哪些操作要问你、哪些直接放行、哪些直接拦下。详见权限模式
  • 记忆:单次会话里沉淀的上下文会被保留,跨会话的关键信息可以被召回,不用每次都从头介绍项目背景。详见记忆系统
  • 子代理与 worktree:复杂任务可以拆给独立的子代理去跑,写操作可选在隔离的 git worktree 里进行,不影响你当前的工作区。详见子代理 & worktree
  • 工作流 loop:需要多轮、多 agent 协作的任务可以编排成工作流,按依赖关系自动推进。详见工作流 loop
  • MCP · Skills · Hooks 生态:通过 MCP 接外部工具与数据源,通过 Skills 打包可复用的技能,通过 Hooks 在关键节点插入自定义逻辑。详见 MCPSkillsHooks

每一行都在你手里

这些子系统不是黑盒里的既定行为——它们就是仓库里的源码。系统提示词、工具描述、权限判断逻辑、重试策略,全部是可读、可改、可调的普通 TypeScript 代码,不依赖某个厂商没有公开的内部实现。想换一种权限策略、想给某个工具加一条规则、想调整模型看到的报错格式,改代码就是了——deepcode 的每一行都在你手里。