DeepSeeker-Code源码导读05-计划模式与子Agent
DeepSeeker-Codeæºç 导读05-è®¡åæ¨¡å¼ä¸åAgent
æ¨å°è 2026-08-19 0 é 读23åé读æè®¡å模å¼ä¸å Agentï¼ä¿¡å·å½æ¨¡åï¼çº¦æå½ harness
è¿ç¯è®²ä»ä¹
ä¸ä¸ªæçç agent è¦ä¼ä¸¤ä»¶äºï¼æ³æ¸ æ¥å卿ï¼è®¡å模å¼ï¼ï¼åæ´¾å身å»å¹²æ´»ï¼å Agentï¼ãåè 让å®å¨å¤æä»»å¡åå è°ç ãåºæ¹æ¡ãè¿å®¡æ¹ï¼åè è®©å®æç¬ç«åä»»å¡å§æ´¾ç»ä¸ä¸ªç¬ç«çå° agent å»è·ã
è¿ä¸¤ä¸ªåè½ç似毫ä¸ç¸å¹²ââä¸ä¸ªæ¯"èªæå å¶"ï¼ä¸ä¸ªæ¯"æ´¾çå身"ãä½è¯»å®æºç ä½ ä¼åç°ï¼å®ä»¬è忝åä¸ä¸ªè®¾è®¡ååï¼ä¿¡å·å½æ¨¡åï¼çº¦æå½ harnessãè¿ç¯å°±æ planMode.tsãsubagent.ts å workflow.tsï¼çè¿ä¸ªååæä¹æä¸¤ä¸ªåè½ç»ä¸èµ·æ¥ã
å è§£é两个è¯ãä¿¡å·ï¼signalï¼æ¯æ¨¡åèªç±è¡¨è¾¾çæå¾ââ"ææ³å è§å""ææ³æ´¾ä¸ªå身"ã约æï¼constraintï¼æ¯ harness ç©ç䏿½å ç强å¶ââ"è®¡åæ¨¡å¼ä¸ä½ æ ¹æ¬æ²¡æåå·¥å ·""å agent ä¸åç¨ shell"ãæ¨¡åå¯ä»¥åä¿¡å·ï¼ä½çº¦æä¸ç±å®è¯´äºç®ã
ä¸ãå çå ¨è²ï¼ä¸¤ä¸ªåè½ï¼ä¸ä¸ªåå
ä¸é¢è¿å¼ 表æ¯è¯»è¿ç¯çé¥åââè®¡åæ¨¡å¼åå Agent åèªç"ä¿¡å·"å"约æ"æ¯ä»ä¹ï¼
| ä¿¡å·ï¼æ¨¡åååºï¼ | 约æï¼harness 强å¶ï¼ | |
|---|---|---|
| è®¡åæ¨¡å¼ | enter_plan_modeï¼ææ³è§åï¼/ exit_plan_modeï¼æ¹æ¡å¥½äºï¼è¯·å®¡æ¹ï¼ | PLAN_ALLOWED_TOOLS æ§è¡å±é¨ç¦æç»ä¸ååå·¥å
·ï¼å·¥å
·è¡¨æå®ä¸è£åªï¼ |
| å Agent | spawn_agentï¼æ´¾ä¸ªåèº«å¹²è¿æ´»ï¼/ run_workflowï¼ä¸æ¬¡æ´¾å¤ä¸ªï¼ | SUBAGENT_DENYLIST åé¤å agent ç shell/éå½å é¤ + æ·±åº¦çæ |
æ³¨ææ¯è¡çå³è¾¹é£ä¸åââ约æé½ä¸æ¯é æç¤ºè¯å®ç°çãè®¡åæ¨¡å¼ä¸æ¯è¯´"è¯·ä½ åªè¯»"ï¼æ¨¡åä¼é³å¥é´è¿ï¼ï¼èæ¯å¨å·¥å ·æ§è¡å ¥å£è®¾ä¸éé¨ç¦ï¼åå·¥å ·çè°ç¨å°äºæ§è¡å±ï¼ç´æ¥è¢«æãè¿åå¼å¯¼ææ¡ãå agent 䏿¯è¯´"ä½ çº§å«ä½ï¼å«ç¨ run_command"ï¼èæ¯å¹²èä¸ç»å®è¿ä¸ªå·¥å ·ã
è¿å°±æ¯"ä¿¡å· vs 约æå离"çæ ¸å¿ï¼æå¾å½æ¨¡åï¼å¼ºå¶å½ harnessï¼èä¸å¼ºå¶å¿ é¡»æ¯ç©ççãç»ä¸è¿å»çã æ¿å ä¸ªåºæ¯çä¸ä¸ï¼
-
åºæ¯ Aï¼å¤æä»»å¡ï¼æ¨¡åæ³å è§åã å®è°
enter_plan_modeï¼ä¿¡å·ï¼ãharness æ¥å°ä¿¡å·ï¼ç¿»è½¬ planMode éè·ãè¿ä¸è½®èµ·ï¼å·¥å ·è¡¨çº¹ä¸ä¸å¨ï¼ä¿åç¼ç¼åï¼ï¼ä½æ§è¡å±é¨ç¦çæââæ¨¡å妿"æ³"ç´æ¥ edit_fileï¼è°ç¨ä¼ç«å»æ¶å°"â å½å为åªè¯»è°ç é¶æ®µï¼ç¦æ¢ edit_file"çæç»ç»æï¼åæä½æ ¹æ¬è½ä¸å°ç£çã -
åºæ¯ Bï¼æ¨¡åå¨è®¡å模å¼è°ç å®ï¼æäº¤æ¹æ¡ã å®è°
exit_plan_modeï¼ä¿¡å·ï¼ãharness ææ¹æ¡æ¨ç»ç¨æ·å®¡æ¹ãç¨æ·ç¹äº"éè¿"ï¼harness æç¿»è½¬åæ£å¸¸æ¨¡å¼ï¼åå·¥å ·çé¨ç¦è§£é¤ï¼è¿å ¥å®ç°é¶æ®µã -
åºæ¯ Cï¼ä¸» agent æ³æ"ååå æµè¯"è¿æ´»æ´¾åºå»ã å®è°
spawn_agentï¼ä¿¡å·ï¼ãharness æ´¾çä¸ä¸ªå agentï¼ä½ç»å®çå·¥å ·è¡¨æ¯æ¶è¿æçï¼çº¦æï¼ââæ²¡ærun_commandãæ²¡ædelete_pathãå agent è½è¯»å代ç ï¼ä½ä¸è½è· shellãä¸è½éå½å ã -
åºæ¯ Dï¼å¹¶è¡æ´¾ 5 个å agent å®¡æ¥ 5 个模åã 主 agent è°
run_workflowï¼ä¿¡å·ï¼ãharness å¹¶åæ´¾çï¼ä½åå¹¶åä¸éèæµï¼çº¦æï¼é²æç APIï¼ï¼ä¸å ±äº«ä¸æå®¡æ¹éï¼çº¦æï¼é² 5 个é«å±å®¡æ¹åæ¶å¼¹çªç«æï¼ã
çè§£äº"ä¿¡å·æ¯æ¨¡åçæå©ãçº¦ææ¯ harness ç责任"ï¼å读æºç ï¼é£äº"为ä»ä¹ä¸ç´æ¥å¨æç¤ºè¯éå"ççé®å°±é½éäºãä¸é¢åå«æä¸¤ä¸ªåè½ã
äºãè®¡åæ¨¡å¼ï¼æ¨¡ååä¿¡å·ï¼harness è½çº¦æ
两个对å¶çä¿¡å·å·¥å ·
planMode.ts æ´é²äºä¸¤ä¸ªç¹æ®çå·¥å · schemaï¼å®ä»¬ä¸æ¯å¸¸è§å·¥å ·ï¼æ²¡æ executeãæ²¡æ safetyLevelï¼ï¼èæ¯"ä¿¡å·éé"ï¼
// enter_plan_modeï¼æ¨¡å主å¨è¯·æ±è¿å
¥è®¡å模å¼
{ name: "enter_plan_mode", parameters: { reason: "为ä½è¦è§å" } }
// exit_plan_modeï¼æ¨¡åæäº¤å®ç°æ¹æ¡ï¼è¯·æ±å®¡æ¹
{ name: "exit_plan_mode", parameters: { plan: "宿´å®ç°æ¹æ¡" } }
å®ä»¬è¢« runAgent æåç¹æ®æ¦æªï¼ä¸èµ°å¸¸è§çå·¥å ·æ§è¡ç®¡çº¿ãæ¦æªåï¼harness å¹²çæ£çäºââ翻转 planMode ç¶æãéè·ã模ååªæ¯"æäºä¸ªé¨é"ï¼å¼é¨çæ¯ harnessã
çæ£ç约æï¼æ§è¡å±é¨ç¦ + å·¥å ·è¡¨æå®
ä¿¡å·æ¶å°åï¼çº¦ææä¹è½ï¼è¿éæä¸æ®µå¼å¾å®æ´è®²çæ¼è¿å²ã
第ä¸çåæ³æ¯"ç©çè£åªå·¥å
·è¡¨"ï¼è®¡å模å¼ä¸ filterToolsForPlanMode æå·¥å
·è¡¨è£æåªè¯»ç½ååï¼çº¦ 14 个åªè¯»å·¥å
· + exit_plan_modeï¼ï¼æ£å¸¸æ¨¡å¼ç¨ appendPlanControlTools æ¢å¤å
¨éãæ¨¡åå¨è®¡å模å¼ä¸æ ¹æ¬çä¸å°åå·¥å
·ââæ³åæ ä»è°èµ·ãå¬èµ·æ¥å¾å®ç¾ï¼
宿µæè¸äºã 对ç DeepSeek çåç¼ç¼åå A/B å®éªï¼åä¸ä¼è¯ä¸¤ä¸ªè®¡åè½®ï¼å¯ä¸åéæ¯å·¥å ·è¡¨çç¥ï¼ï¼æ°æ®æ¯è¿æ ·çï¼
| å·¥å ·è¡¨çç¥ | 计åè½®é¦è°ç¼åå½ä¸ç |
|---|---|
| è£è¡¨ï¼schema æ¡£ï¼ | 6.4%ï¼2.2K / 34.1Kï¼ |
| æå® + æ§è¡å±é¨ç¦ï¼runtime æ¡£ï¼ | 59.7%ï¼23.3K / 39.0Kï¼ |
ä¹åå·®è·ãåå èå¨ä¸ä¸ªå®¹æå¿½ç¥çäºå®éï¼OpenAI åè®®æ tools åæ°åºååå¨è¯·æ±å¤´é¨ï¼DeepSeek æå®è®¡å
¥åç¼ç¼ååå¸ãä¹å°±æ¯è¯´ï¼message[0] 稳å®è¿ä¸å¤ââå·¥å
·è¡¨ä¸åï¼åç¼ç
§æ ·å
¨åºãè"è¿è®¡åâåºè®¡å"ä¸ä¸ªå¾ªç¯ï¼å·¥å
·è¡¨è¦ç¿»è½¬ä¸¤æ¬¡ï¼å
¨éâç½ååâå
¨éï¼ï¼æ´ä¸ªä¼è¯åå² re-prefill 两次ãè¿æ°å¥½åçå¨"æ¹æ¡åæ¹åçå¼å·¥"å"åè¿è®¡åçè°ç "ä¸¤ä¸ªç¨æ·æææçæ¶å»ââTTFT ç´æ¥ç¿»åï¼è¿ææäº"翻转âå½ä¸çæåºâæåå缩丢ç»èâåå»ç©¿"çå¤å伤害é¾ã
æä»¥ç°ç¶æ¯ä¸¤å±çï¼systemInjections.ts :45ï¼ï¼
// runtime æ¡£ï¼é»è®¤ï¼ï¼ä¸¤æç»ä¸èµ° appendPlanControlToolsââå·¥å
·è¡¨å
¨ä¼è¯æå®ï¼ä¿åç¼ç¼å
const rawToolsPreEnv = (planMode && appConfig.planEnforcement === 'schema')
? filterToolsForPlanMode(toolSchemas ?? []) // schema æ¡£ï¼åéæ§è£è¡¨è·¯å¾
: appendPlanControlTools(toolSchemas ?? []); // æ£å¸¸/计å两æå表
å·¥å
·è¡¨æå®äºï¼çº¦æå»åªäºï¼ç§»å°æ§è¡å±ãtoolExecution.ts :143ï¼processToolCall çå
¥å£å¤ï¼ç»ç»ç±»å¤å®ä¹åãå·¥å
·å¹é
ä¹åï¼ï¼
if (!parseFailed && planMode && appConfig.planEnforcement === 'runtime'
&& calledName !== 'enter_plan_mode' && calledName !== 'exit_plan_mode'
&& !PLAN_ALLOWED_TOOLS.has(calledName)) {
const note = `â [è®¡åæ¨¡å¼] å½å为åªè¯»è°ç é¶æ®µï¼ç¦æ¢ ${calledName}ãå®ææ¹æ¡è¯·è° exit_plan_mode æäº¤ï¼ç»ç¨æ·å®¡æ¹åè¿å
¥å®ç°é¶æ®µã`;
return { ..., resultForModel: note, ok: false };
}
注æè¿ä¸ªæç»çåéï¼ä¸å审æ¹ãä¸å éãä¸è¿ hook æµæ°´çº¿ââåå·¥å ·çè°ç¨è¿å®¡æ¹ç½å ³é½å°ä¸äºï¼ç´æ¥ä»¥ç»æææ¡åè¿ã"计åå äºæ§è¡"çè¯ä¹ä¸ç¹æ²¡åï¼åªæ¯è½ç¹ä»"模åçä¸è§"åæäº"模åè°ä¸å¨"ã
è¿ä¸ªè½¬åæä¸ªè¯å®ç代价ï¼è®¡åææ¨¡åçå¾è§åå·¥å ·ï¼è¡¨æå®çå¿ ç¶ï¼ï¼å¶å°å¯è½è¯æ¢ä¸æ¬¡åæä½ââæµªè´¹ä¸è½®æ¨çã宿µï¼ä¸ä¸ªå®æ´ plan 循ç¯ï¼è¯æ¢æ¬¡æ°ä¸º 0ï¼ç³»ç»æç¤ºè¯å·²æ"è®¡åæ¨¡å¼åªè¯»"çéæçº¦æï¼æ¾å¼è¯±å¯¼åççæä»¤åè被模åå½å¯çæä»¤æç»äºä¸¤æ¬¡ãéæå¼å¯¼ + é¨ç¦å åºï¼è¶³å¤ã
ä¸ä¸ªé å¥ç»èï¼
- ç½ååè¡¥æ¼ï¼
PLAN_ALLOWED_TOOLSç°å¨å å«get_diagnosticsãgoto_definitionââLSP 导èª/è¯ææ°æ°æ¯è°ç é¶æ®µæéè¦çï¼åååæ¼ç»è®°ï¼ç½ååæ¼ç§» bugï¼ï¼æ 论åªä¸ªæ¡£é½è¡¥ä¸äºã - é²ç¿»è½¬å®å«ï¼è¡¨æå®å enter_plan_mode å¨è®¡å模å¼å ä¹å¯è§ã模åéå¤è°å®ä¸å触å"翻转éè·"循ç¯ï¼èæ¯è¿å䏿¡æ®éç»æ"ï¼å·²å¨è®¡å模å¼ä¸ï¼æ ééå¤è¿å ¥ï¼"ã
- åéå¼å
³ï¼
DEEP_SEEK_PLAN_ENFORCEMENT=schemaä¸è¡ç¯å¢åééåæ§è£è¡¨è·¯å¾ãææè¡ä¸ºåæ´é½çéè·¯ï¼æ¯è¿ä¸ªé¡¹ç®çæ¯ä¾ã
䏿¡è·¯å¾ï¼é½æ¶æå°æ¹æ¡å®¡æ¹
è®¡åæ¨¡å¼æä¸æ¡è¿å ¥è·¯å¾ï¼ä½æç»é½æ¶æå°åä¸ä¸ª"æ¹æ¡å®¡æ¹"é¸é¨ï¼
- ç¨æ·æå¨å¼ï¼
--plan/ å¿«æ·é®ï¼â ç´æ¥è¿å ¥åªè¯»è®¡å模å¼ã - 模åèªä¸»è¿å
¥ï¼è°
enter_plan_modeï¼â harness 翻转ã以åªè¯»éè·è®¡åé¶æ®µã - 模åè·³è¿ enterï¼èªè¡ç¨åªè¯»å·¥å
·è°ç â ç´æ¥è°
exit_plan_modeæäº¤æ¹æ¡ã
ç¬¬ä¸æ¡æ¯ä¸ªå®¹ææ¼çè¾¹çãçæ³¨éï¼planMode.ts :91ï¼ï¼
ä¸ºä½æ£å¸¸æ¨¡å¼ä¹æ´é² exit_plan_modeï¼DeepSeek ææ¶ä¼è·³è¿ enter_plan_modeãèªè¡ç¨åªè¯»å·¥å ·å è°ç ï¼éåæ³æäº¤æ¹æ¡å´æ¾ä¸å° exit_plan_mode â éåçº¯ææ¬æ¹æ¡ï¼æ¹æ¡å®¡æ¹å¼¹çªæ°¸ä¸è§¦åã
DeepSeek çè¡ä¸ºä¸å®å ¨å¯æ§ââå®å¯è½ä¸ç enter_plan_modeï¼èªå·±å read ä¸éãå¦æè¿æ¶å没 exit_plan_mode å¯è°ï¼å®å°±ææ¹æ¡å½æ®éææ¬è¾åºï¼å®¡æ¹é¸é¨å½¢åè设ãæä»¥æ£å¸¸æ¨¡å¼ä¹ä¸å¹¶æ´é² exit_plan_modeï¼è®©"èªè¡è°ç åæäº¤æ¹æ¡"ä¹è½æ£ç¡®èµ°å®¡æ¹ãè¿æ¯ä¸ªä¸ºæ¨¡åå®é è¡ä¸ºæè¡¥ä¸çç»èã
P0-4 å»¶ç»ï¼çº¦æéæåï¼åç¼ç¼åç两次å级
è¿éæä¸ªååå ç« å¼åºç设计ï¼èä¸å®ç»åäºä¸¤æ¬¡åçº§ï¼æè½ä½ç°"ç¼åä¼å "è¿æ¡å忝æä¹ä¸æ¥æ¥é¼åºæ¶ææ¼è¿çã
ç¬¬ä¸æ¬¡å级ï¼çº¦æè¯´æéæåã è®¡åæ¨¡å¼ç"约æè¯´æ"ï¼æ¯éæåè¿ç³»ç»æç¤ºè¯çï¼ä¸é planMode ç¶æå¨ææ¹å message[0]ï¼planMode.ts :27ï¼ï¼
è®¡åæ¨¡å¼çº¦æå·²éæåè¿ SYSTEM_PROMPTï¼ä¸åé planMode ç¶æå¨ææ¹å message[0]ï¼é¿å ç ´å DeepSeek éå¼åç¼ç¼åï¼ã
å¦æè®¡åæ¨¡å¼ä¸å¼ä¸å ³å°±æ¹åç³»ç»æç¤ºè¯ï¼åç¼ç¼åå°±åºäºãæä»¥æ"è¯´ææ§æå"éæåï¼æ°¸è¿å¨æç¤ºè¯éï¼ï¼è¿è¡æ¶å¼ºå¶äº¤ç»å·¥å ·æºå¶ã
ç¬¬äºæ¬¡å级ï¼å·¥å ·è¡¨æå®ï¼å°±æ¯ä¸ä¸èè®²çæ§è¡å±é¨ç¦ï¼ã ç¬¬ä¸æ¬¡å级åªä¿ä½äº message[0] çææ¬ï¼æ¼äºä¸ä¸ªåå¨è¯·æ±å¤´é¨çåéââtools åæ°ã宿µè¯æ DeepSeek æ tools è®¡å ¥åç¼åå¸åï¼è£è¡¨ç¿»è½¬ç §æ ·å ¨åå²å»ç©¿ï¼äºæ¯æäº P0-Aï¼å·¥å ·è¡¨å ¨ä¼è¯æå®ï¼çº¦æç§»å°æ§è¡å±ã
两次å级åèµ·æ¥ç宿´å¾æ¯ï¼åç»æ¨¡åçè¯·æ± = 头é¨ï¼tools + message[0]ï¼+ ä¸é¨ï¼åå²ï¼+ å°¾é¨ï¼ææ°å 容ï¼ï¼åç¼ç¼åè¦æ±å¤´é¨ç»å¯¹ç¨³å®ã è®¡åæ¨¡å¼çææå¨ææ§ââæ¨¡å¼åæ¢ã约æå¼ºå¶ââ齿¶å卿§è¡å±åå°¾é¨ï¼æ°¸ä¸åå头é¨ãæç¤ºè¯è´è´£åè¯æ¨¡åè§ç©ï¼æ§è¡å±è´è´£ç©çæ§è¡è§ç©ï¼ä¸¤è å离ï¼åä¸å½±åç¼åã
ä¸ãå Agentï¼æ´¾çå æ ¸ runSubagent
ä¸¤ä¸ªç¼æå·¥å ·ï¼ä¸ä¸ªå ±äº«å æ ¸
å Agent æä¸¤ä¸ªå·¥å ·ï¼agent.ts å workflow.tsï¼ï¼
spawn_agentï¼ä¸²è¡æ´¾çå个å agentãéå"æè¿åç¬ç«æ´»æ´¾åºå»"ãrun_workflowï¼å¹¶è¡ï¼parallelï¼ææµæ°´çº¿ï¼pipelineï¼ç¼æå¤ä¸ªå agentãéåå¤§è§æ¨¡å®¡æ¥ãè¿ç§»åæè¿ç±»å¯åè§£çä»»å¡ã
两è
å
±äº«åä¸ä¸ªæ´¾çå
æ ¸ââsubagent.ts ç runSubagentãæ³¨é说å¾å¾æ¸
æ¥ï¼subagent.ts :1ï¼ï¼
æãæé åç³»ç»è¯ / å·¥å ·è¡¨æ¶æ / åå§ååä¼è¯ / é©±å¨ runAgent / éé final / å¼å¸¸çæãå°è£ ä¸ºçº¯å½æ° runSubagentï¼ä¾ spawn_agent ä¸ run_workflow å¤ç¨ï¼é¿å 两å¤å¤å¶ç²è´´åä¸å¥é»è¾ã
runSubagent åçäºï¼æ£æ¥æ·±åº¦çæ â å 载声æå¼ manifestï¼è¥æï¼â æé åç³»ç»è¯ â å·¥å
·è¡¨æ¶æ â åå§ååä¼è¯ â éå½è° runAgent â éé final â å¼å¸¸å
åºãå®è¿åçº¯æ°æ® { ok, output, sessionId }ï¼ä¸å任使æ¡å
è£
ï¼æ±æ¥æ¡ã忥éç¥çç»è°ç¨æ¹ï¼è®© spawn_agent å run_workflow åèªå®å¶åç°ï¼ã
åä¸ä¸ªçº¦æï¼å Agent çå·¥å ·æ¶æ
å agent çå·¥å
·è¡¨ï¼æ¯è¢«æ¶è¿æçï¼subagent.ts :29ï¼ï¼
// åµå¥æ·±åº¦ ⥠1 çå agent ä¸åæ¥æ shell æ§è¡ä¸éå½å é¤
export const SUBAGENT_DENYLIST = new Set(["run_command", "delete_path"]);
注éç¹æäºæ¶æççç±ââ"è¿ä¸¤è æ¯çç¸å徿大çé«å±åè¯"ãå agent è½è¯»å代ç ï¼å§æ´¾ä»£ç å·¥ä½åçï¼ï¼ä½ä¸è½è· shellãä¸è½éå½å ãèä¸ MUTATION/DANGER å·¥å ·ä»åèªèµ°å®¡æ¹ç½å ³ä½ä¸ºåç¾ã
è¿é忝ä¸ä¸ª"ä¿¡å· vs 约æ"çä½ç°ï¼spawn_agent æ¯æ¨¡åæ´¾å身çä¿¡å·ï¼ä½æ´¾åºå»çåèº«å¤©çæ¯æ¶æçââ䏿¯é æç¤ºè¯åè¯å agent"ä½ å«è· shell"ï¼èæ¯å®çå·¥å ·è¡¨éåæ ¹æ²¡æ run_commandã
声æå¼å Agent è¿æ´è¿ä¸æ¥ââæ¾å¼ç½ååæ¿ä»£é»ååï¼subagent.ts :113ï¼ï¼
const toolSchemas = manifest && manifest.tools.length > 0
? allTools.filter(t => manifest.tools.includes(t.function.name)) // æ¾å¼ææ
: allTools.filter(t => !SUBAGENT_DENYLIST.has(t.function.name)); // å¦ååéé»åå
声æå¼å Agentï¼.deepseeker-code/agents/<name>.agent.md é声æäº toolsï¼èµ°"åªç»æ¸
åéçå·¥å
·"ï¼å¯¹æ Claude Code çææææï¼ï¼æ²¡å£°æçåéé»ååãæ¾å¼æææ¯é»è®¤æ¶ææ´å¯æ§ââä½ æç¡®ç¥éè¿ä¸ªå身æåªäºè½åï¼è䏿¯"é¤äºé»ååå¥é½è½å¹²"ã
ç½ååè¿æä¸ª MCP æ¶ä»£çå
¼å®¹ç»èï¼subagent.ts :114ï¼ï¼manifest é声æçå¯è½æ¯æ§çéå·¥å
·åï¼mcp__playwright__browser_navigateï¼ï¼ä½ MCP åå卿¨¡å¼ä¸å
¨å±è¡¨å·²ç»æ²¡æè¿äºç¬ç«å·¥å
·åäºï¼ç¬¬ 9 ç¯ä¼è®²ï¼é»è®¤åªæ mcp_list_tools + mcp_call 两个æå® schemaï¼ãæä»¥æ¶æè¿éåäºä¸æ¬¡è¿è¡æç¿»è¯ï¼
// manifest 声æ mcp__*ï¼æ§éå·¥å
·åï¼ãmcp_call æ mcp_list_tools æ¶ï¼
// ä¸å¹¶æäºä¸¤ä¸ªæå®ååå¨å·¥å
·ï¼dispatcher 模å¼ä¸å
¨å±è¡¨ä¸åæ mcp__server__tool ç¬ç«åï¼
const wantsMcp = manifest?.tools.some(t => t === 'mcp_call' || t === 'mcp_list_tools' || t.startsWith('mcp__')) ?? false;
const toolSchemas = manifest && manifest.tools.length > 0
? allTools.filter(t => manifest.tools.includes(t.function.name)
|| (wantsMcp && (t.function.name === 'mcp_call' || t.function.name === 'mcp_list_tools')))
: allTools.filter(t => !SUBAGENT_DENYLIST.has(t.function.name));
manifest å mcp__* æ¡ç®å³è§ä¸º"ææ MCP"ï¼ç¿»è¯æååå¨åå·¥å
·æäºãå®å
¨ç½æ²¡ææ¾ï¼æ¯æ¬¡ mcp_call 仿åæåèµ° permissions è§å + auto åç±»å¨ + DANGER 审æ¹ç½å
³ââæåæ
嵿¯å agent è¯æ¢æªææ server æ¶å¼¹ä¸æ¬¡å®¡æ¹ï¼ä¸åå¨éé»è¶æãè¿å P1-C çå§æ´¾çç¥æ¯ä¸ä½çï¼éå/ä¸ç¨å·¥å
·éçåºæ¯ï¼æ¨èç¨å£°æå¼å agent æ¿æ¥ï¼frontmatter 声æ tools ç½åå + modelï¼ï¼ç¶ä¼è¯åªè§ spawn_agentââä¸å¤§å¨ä¸ç¨ schema ä¸å¡å主ä¼è¯å¤´é¨ï¼æ£æ¯"æ°å·¥å
·ä¸è¿ L1"ååçè½å°ã
å éå·¥ç¨æ¤åæ²³
å¹¶è¡ç¼æï¼run_workflowï¼è¿æå é鲿¢"æ´¾å身派åºäº"çæ¤åæ²³ï¼
深度çæï¼é²æ éåµå¥ï¼ï¼å agent è¿è½åçå agentï¼ä½ä¸è½æ éå¥å¨ãMAX_AGENT_DEPTH ä¸å°å°±æç»æ´¾çï¼subagent.ts :69ï¼ãå主循ç¯ç 500 è½®å
åºä¸ä¸ªæè·¯ââæç«¯æ
åµæè§¦åçä¿é©ä¸ã
å¹¶åèæµï¼é²æç APIï¼ï¼parallel 模å¼ç¨ä¿¡å·ééå¹¶åï¼workflow.ts :206ï¼ï¼æ¨¡å说"æ´¾ 10 个"ä½å®é
åæ¶è·çå workflowConcurrency ä¸éèæµã
审æ¹ä¸²è¡åï¼é²å¼¹çªç«æï¼ï¼è¿æ¯æå·§å¦çä¸éãå¹¶è¡å agent å
±äº«ä¸æäºæ¥éå
裹审æ¹ï¼workflow.ts :131ï¼ï¼
const approvalMutex = createSemaphore(1);
const serializedApproval = ctx.requestApproval
? async (...raArgs) => {
await approvalMutex.acquire();
try { return await ctx.requestApproval!(...raArgs); }
finally { approvalMutex.release(); }
} : undefined;
为ä»ä¹éè¦å®ï¼å 为 CLI æ¯åå¼¹çªæ¨¡åââå䏿¶å»åªè½æ¾ç¤ºä¸ä¸ªå®¡æ¹æ¡ã5 个å agent åæ¶è¦å®¡æ¹é«å±æä½ï¼å¦æä¸ä¸²è¡åï¼5 个弹çªç«æãç¨æ·ç¹åªä¸ªé½ä¸å¯¹ãäºæ¥é让并åçé«å±è¯·æ±æé审æ¹ï¼ä¸ä¸ªä¸ä¸ªæ¥ã
worktree é离ï¼é²å¹¶è¡åå²çªï¼ï¼parallel é»è®¤å
±äº«å·¥ä½åºï¼å»ºè®®åªç¨äºè¯»/åæï¼ãä½è¦åå¹¶è¡è¿ç§»/æ¹é æ¶ï¼è®¾ isolation="worktree"ï¼æ¯ä¸ªå agent å¨ç¬ç«ç git worktree éè·ï¼äºä¸æ±¡æï¼ç»æåæ¶å²åèªç diff ä¾åå¹¶ï¼workflow.ts :166ï¼ãè¿æ¯"å¹¶è¡å"è½å®å
¨åçå
³é®ã
åãå个设计å³ç
å³çä¸ï¼ä¿¡å· vs 约æå离ï¼å ¨ç¯ä¸»çº¿ï¼
è¿æ¯è®¡å模å¼åå Agent å ±åççµéãæ¨¡åçæå¾éè¿ä¿¡å·å·¥å ·è¡¨è¾¾ï¼enter_plan_mode / spawn_agentï¼ï¼ä½çæ£çéå¶ç± harness ç©çæ½å ï¼æ§è¡å±é¨ç¦ / æ¶æ / 深度çæï¼ã 两è ä¸¥æ ¼å离ï¼ä¿¡å·ä¸è½èªå¸¦çº¦æã
为ä»ä¹è¿ä¹åï¼å 为模åä¸å¯ä¿¡ã让模å"æ¿è¯ºåªè¯»"æ"æ¿è¯ºä¸åµå¥"ï¼å®ä¼é³å¥é´è¿ââå´ä¸çåºï¼æä¸ç §åä¸è¯¯ãæä»¥æå¾å½æ¨¡åï¼å®ææä»»å¡è¦ä¸è¦è§åãè¦ä¸è¦å身ï¼ï¼å¼ºå¶å½ harnessï¼åªæ harness è½ä¿è¯å¼ºå¶çç被æ§è¡ï¼ã
è¿ä¸ªææ³å第 1 ç¯ç nudgeï¼è½¯å¼å¯¼ï¼vs repeatBreakerï¼ç¡¬çæï¼ä¸èç¸æ¿ï¼è½¯ç彿¨¡åèªå³ï¼ç¡¬çå½ harness 强å¶ã
å³çäºï¼çº¦æé æ§è¡å±å¼ºå¶ï¼ä¸é æç¤ºè¯ä¹ä¸é è£è¡¨
è¿æ¯å³çä¸çç´æ¥æ¨è®ºï¼ä½å®èªå·±ä¹æ¼è¿è¿ä¸è½®ã第ä¸ç"è£æåå·¥å ·"å½ç¶ææï¼å¯å®æä¸äºåç¼ç¼åè¿å µå¢ââtools å¨è¯·æ±å¤´é¨ï¼è£è¡¨å°±æ¯å¨å¤´é¨ãæç»çå½¢ææ¯ï¼è®¡å模å¼ä¸å"请åªè¯»"ï¼æç¤ºè¯åªæ¯å¼å¯¼ï¼ï¼èæ¯å·¥å ·è¡¨æå® + æ§è¡å±æç½ååæç»ï¼å agent ä¸å"å«ç¨ shell"ï¼èæ¯ä¸ç» shell å·¥å ·ãæç¤ºè¯æ¯å»ºè®®ï¼æ§è¡ç»ææ¯äºå®ã 模åå¯ä»¥æ è§å»ºè®®ï¼ä½å®è°ä¸æ¬¡åå·¥å ·å°±å䏿¬¡æç»ââç»ä¸è¿å»ã
å¼å¾åçæ¯è¿ä¸¤ç§"ç©ç约æ"çåèï¼è£è¡¨æ¯ä¿¡æ¯å±ç约æï¼æ¨¡åçä¸è§ï¼é¶æµªè´¹ï¼ï¼é¨ç¦æ¯æ§è¡å±ç约æï¼æ¨¡åçå¾è§ï¼å¶å°æµªè´¹ä¸è½®è¯æ¢ï¼ãä¿¡æ¯å±çº¦ææ´å¼ºï¼ä½ä»£ä»·æ¯å¤´é¨ä¸ç¨³å®ï¼æ§è¡å±çº¦æç¨å¼±ï¼ä½å¤´é¨æå®ãDeepSeeker-Code çéæ©æ¯ââ约æå¼ºåº¦å¤ç¨å°±å¥½ï¼å®æµé¶è¯æ¢ï¼ï¼ç¼å稳å®å¿ 须满åã è¿æ¯ä¸ªå¾å ¸åçå·¥ç¨ trade-offï¼ä¸æ¯é"æå¼ºç约æ"ï¼èæ¯é"约æå¤ç¨åæä¸ä»£ä»·æå°çé£ä¸ª"ã
读æºç æ¶ï¼å¡çå°"约æ"ï¼å é®èªå·±"è¿æ¯æç¤ºè¯å±é¢çï¼å¯ç»è¿ï¼ï¼è¿æ¯æ§è¡å±/å·¥å ·è¡¨/çæå±é¢çï¼ç»ä¸è¿ï¼"ãDeepSeeker-Code çææå ³é®çº¦æï¼é½æ¯åè ã
å³çä¸ï¼å£°æå¼ä¼äºéå¼é»è®¤
声æå¼å Agent ç¨æ¾å¼ç½ååï¼åªç»å£°æçå·¥å ·ï¼ï¼è䏿¯é»è®¤é»ååï¼é¤äºå±é©çå ¨ç»ï¼ãè¿æ¯ä¸ª"ç½ååä¼å äºé»åå"çå®å ¨èå¼ââé»è®¤ä¸ç»ï¼æ¾å¼è¦æç»ï¼æ¯"é»è®¤å ¨ç»ï¼æ¾å¼ç¦æç¦"å®å ¨å¾å¤ã读 agents/loader.ts æ¶ï¼ä½ ä¼åç°å£°æå¼ agent ç frontmatterï¼system/tools/modelï¼å°±æ¯è¿å¥æ¾å¼ææçé ç½®é¢ã
å³çåï¼å ±äº«å æ ¸ï¼ææ¡å½è°ç¨æ¹
spawn_agent å run_workflow å ±äº« runSubagent å æ ¸ï¼ä½åèªç"åç°"ä¸åââspawn_agent å æ±æ¥æ¡ + 忥éç¥ï¼run_workflow åå¹¶è¡èåãè¿æ¯ä¸ªå¹²åçèè´£ååï¼æ´¾ç/æ§è¡/æ¶æ/çææ¯å ±äº«é»è¾ï¼ææ¡å è£ æ¯åèªå®å¶ãrunSubagent è¿åçº¯æ°æ®ï¼è°ç¨æ¹å³å®æä¹å è£ ãè¿ç§"å æ ¸å ±äº«ãå¤å£³å®å¶"çæ¨¡å¼ï¼è®©ä¸¤ä¸ªå·¥å ·çé»è¾é¶ååã
äºãäºä¸ªææ¯é¾ç¹
é¾ç¹ä¸ï¼æ¨¡å䏿å¥è·¯åºçæä¹å
è®¡åæ¨¡å¼è®¾è®¡äºä¸å¥"è¿âè°ç âåº"çæµç¨ï¼ä½ DeepSeek ä¸ä¸å®ç §çèµ°ââå®å¯è½è·³è¿ enter_plan_mode èªå·±è°ç ï¼é¾ç¹è§ç¬¬äºèç¬¬ä¸æ¡è·¯å¾ï¼ï¼ä¹å¯è½åæ ¹ä¸è¿è®¡å模å¼ç´æ¥å¨æã
åºå¯¹æ¯å¤å±å
åºï¼ç³»ç»æç¤ºè¯éå强å¼å¯¼ï¼PLAN_MODE_AUTO_ENTER_HINTï¼ç»åºéå¹³å¡å¤æ®ï¼æè½¬"ä»ä¸è¿è®¡å模å¼"çå¾åï¼ï¼æ£å¸¸æ¨¡å¼ä¹æ´é² exit_plan_modeï¼è®©èªè¡è°ç ä¹è½èµ°å®¡æ¹ï¼ï¼é¦è½®è¿æ PLAN_FIRST nudgeï¼ç¬¬ 1 ç¯è®²è¿ï¼æ¨å®è¿è®¡å模å¼ï¼è¿äºè®¡å模å¼ååéå¤è° enter_plan_modeï¼é²ç¿»è½¬å®å«ä»¥æ®éç»æåè¿ãä¸å设模åå®è§ç©ï¼èæ¯æ è®ºå®æä¹èµ°ï¼é½è½è¢«æ¶æå°æ£ç¡®çé¸é¨ã
å·¥å ·è¡¨æå®è¿å¼å ¥äºæ°åä½ï¼"å®è§ç©"å¤äºä¸å±å«ä¹ââè®¡åææ¨¡åçå¾è§åå·¥å ·ï¼ä¼ä¸ä¼æçï¼å®æµé¶è¯æ¢ï¼ä½è®¾è®¡ä¸ä¸è½èµï¼æ§è¡å±é¨ç¦å°±æ¯é£éå åºï¼çè¯æ¢äºä¹æ¯ä¸æ¬¡å¸¦å¼å¯¼ææ¡çæç»ï¼ä¸å¼¹å®¡æ¹ãä¸å éï¼ï¼ä¸ä¸è½®æ¨¡åèªç¶è½¬åªè¯»ãå¼å¯¼ï¼æç¤ºè¯ï¼+ å åºï¼é¨ç¦ï¼åå±ï¼æ¯"ç©ççä¸è§"å°ä¸åä¼é ï¼å¤ä¸åç¼åã
é¾ç¹äºï¼å¹¶è¡å agent ç审æ¹ç«æ
第äºèè®²è¿ approvalMutexãè¡¥å å®ä¸ºä»ä¹é¾ââå¹¶åç¼ç¨é"å ±äº«èµæº"ç访é®è¦ä¸²è¡åæ¯å¸¸è¯ï¼ä½è¿éçå ±äº«èµæºæ¯"ç¨æ·æ³¨æå"ï¼ä¸æ¬¡åªè½çä¸ä¸ªå®¡æ¹æ¡ï¼ãæå®¡æ¹å½å ±äº«èµæºä¸éï¼æ¯éå ¸å使£ç¡®çæ½è±¡ãæ¼äºè¿æéï¼å¹¶è¡é«å±æä½ä¼è®©ç¨æ·é¢å¯¹ä¸å 乱跳çå¼¹çªã
é¾ç¹ä¸ï¼å¹¶è¡åå䏿¹æä»¶
parallel 模å¼é»è®¤å ±äº«å·¥ä½åºï¼å¤ä¸ªå agent åæ¶æ¹å䏿¹æä»¶å¿ ç¶å²çªã注éåå¤å¼ºè°"parallel 强ç建议ç¨äºè¯»/åæä»»å¡"ãçè¦å¹¶è¡åï¼é worktree é离ââæ¯ä¸ªå agent ä¸ä¸ªç¬ç« git worktreeï¼ç»æåæ¶å² diffãè¿æ¯ä¸ªå®æ´ç"å¹¶è¡åå®å ¨"æ¹æ¡ï¼é离æ§è¡ + äºååå¹¶ï¼è䏿¯"å¹¶è¡æ¹åä¸ä¸ªå·¥ä½åºç¶åç¥ç¥·ä¸å²çª"ã
é¾ç¹åï¼ç¶å agent çç¶æåæ¥
å agent 伿¹æä»¶ï¼ä½ç¶ agent ä¸ç¥éæ¹äºåªäºãspawn_agent çè¿åå¼éå¡äºä¸æ®µåºç¼ç忥éç¥ï¼agent.ts :60ï¼ï¼
ð¨ãéè¦åæ¥éç¥ã: 该å Agent åæææå¯è½å·²ç»é«é¢ä¿®æ¹ãå建æå é¤äº
ä½ ç®¡è¾åºå
çæ¬å°æºç æä»¶ãå¦æä½ æ¥ä¸æ¥è¦å¯¹æä»¶ç³»ç»ç»§ç»å®æ½ edit_fileã
write_file æéªè¯ï¼ãä½ å¿
é¡»ãé¦å
è°ç¨ read_file éæ°è¯»åææ°ç£çç¶æï¼
ç¦æ¢ç²ç®ä¾èµä½ ä¹åçè®°å¿ç¼åï¼å¦åå¿
ç¶ä¼å¼åå¯ä¸æ§å²çªå¹é
失败ï¼
è¿æ¯ç»æ¨¡åççæéââç¶å agent å ±äº«æä»¶ç³»ç»ï¼å agent æ¹äºæä»¶ï¼ç¶ agent ç"è®°å¿"å°±è¿æäºãå¦æç¶ agent åè®°å¿å» editï¼old_str å¹é ä¸ä¸ï¼å 为å agent æ¹è¿äºï¼ãè¿æ®µéç¥å¼ºè¿«ç¶ agent å read_file å·æ°"è§ç½èç¼å"ãæ³¨éé"è§ç½èç¼å"è¿ä¸ªæ¯å»å¾å½¢è±¡ââagent 没æçæ£çæä»¶ç³»ç»æç¥ï¼å®ç"è®°å¿"å ¨é ä¹å read å°çå 容ï¼è¿æäºå°±å ¨éã
é¾ç¹äºï¼æ·±åº¦çæé²æ éå¥å¨
å agent è½åçå agentï¼ç论ä¸è½æ éåµå¥ãMAX_AGENT_DEPTH ä¸å°å°±æç»ï¼subagent.ts :69ï¼ãè¿åä¸»å¾ªç¯ 500 è½®ãå缩è¿ç»å¤±è´¥ 3 æ¬¡çææ¯åä¸ç±»è®¾è®¡ââç»éå½/循ç¯ä¸ä¸ªç©çä¸éï¼é²å¤±æ§ãè䏿¥éæ¯å»ºè®¾æ§çï¼"è¯·å¨æ¬å±çº§èªè¡æ¶åä»»å¡"ï¼ï¼ä¸æ¯ç´æ¥å´©ã
å ãæ¨èçæºç é 读顺åº
- å
读 planMode.tsï¼ä»
PLAN_ALLOWED_TOOLSï¼åªè¯»ç½ååï¼å¼å§ï¼çfilterToolsForPlanModeï¼schema åéæ¡£çè£è¡¨çº¦æï¼åä¸¤ä¸ªä¿¡å· schemaï¼enter/exit_plan_modeï¼ãè¿æ¯"ä¿¡å· vs 约æ"çæå°å®æ´æ ·æ¬ã - 读 toolExecution.ts çè®¡åæ¨¡å¼é¨ç¦ï¼
:143ï¼ï¼ç runtime æ¡£ï¼é»è®¤ï¼æä¹å¨æ§è¡å±æç»åå·¥å ·ââä¸å¼¹å®¡æ¹ãä¸å éãç´æ¥ä»¥ç»æææ¡åè¿ãè¿æ¯ç°ç¶çº¦æççæ£è½ç¹ã - 读 systemInjections.ts ç
prepareToolsAndInjectionsï¼ç planMode æä¹åä¸»å¾ªç¯æ¥ä¸ï¼ä¸¤æç»ä¸ appendPlanControlTools çæå®å·¥å ·è¡¨ï¼ï¼ä»¥å P0-4 éæå约æç注éã - 读 subagent.ts ç
runSubagentï¼è¿æ¯å agent çæ´¾çå æ ¸ï¼éç¹ç深度çæãå·¥å ·æ¶æï¼é»åå + ç½ååï¼ã审æ¹éä¼ ãå¼å¸¸å åºã - 读 agent.tsï¼spawn_agentï¼ï¼ç宿ä¹è° runSubagent + å ææ¡ï¼æ±æ¥æ¡ + 忥éç¥ï¼ã
- 读 workflow.tsï¼run_workflowï¼ï¼éç¹ç parallel/pipeline ä¸¤ç§æ¨¡å¼ãå¹¶åèæµã审æ¹ä¸²è¡åãworktree é离ã
ä¸ãå ³èï¼ä¿¡å·ä¸çº¦æçè¾å°
"ä¿¡å· vs 约æå离"ä¸åªæ¯è¿ä¸¤ä¸ªåè½çååï¼å®è¾å°å°æ´ä¸ª agentï¼
- è®¡åæ¨¡å¼ç约æï¼æ§è¡å±é¨ç¦ï¼â å¤ç¨ç¬¬ 6 ç¯è¦è®²çå·¥å ·åè®®ï¼CustomTool ç safetyLevel / å·¥å ·è¡¨æ¬èº«å°±æ¯çº¦æçè½½ä½ï¼ï¼ä¸é¨ç¦è½å¨ç¬¬ 7 ç¯ processToolCall æ¦æªé¾çæå段ã
- å Agent ç审æ¹éä¼ â 第 7 ç¯çå®å ¨é²çº¿ï¼processToolCall 审æ¹ç®¡çº¿ï¼å agent å¿ é¡»éä¼ requestApproval å¦åæ»éï¼ã
- æ·±åº¦çæ / å¹¶åèæµ â å第 1 ç¯ç nudge é¢ç®ä¸éãrepeatBreaker ä¸èç¸æ¿ï¼é½æ¯"ç»è½¯æºå¶é 硬ä¸é"ã
- worktree é离 â å¤ç¨ git worktree å·¥å ·ï¼æ¯"å¹¶è¡åå®å ¨"çå·¥ç¨æ¹æ¡ã
ä½ ä¼åç°ï¼"ä¿¡å·å½æ¨¡åã约æå½ harness"æ¯ DeepSeeker-Code å¤ç"模åèªä¸»æ§ vs 坿§æ§"çæ ¸å¿æ¹æ³è®ºãè®¡åæ¨¡å¼åå Agent åªæ¯å®æéä¸çä½ç°ã
æå
让 agent åèªä¸»å坿§ï¼æ¯ææ agentic ç³»ç»çæ ¸å¿é¾é¢ãç»æ¨¡å太大èªç±ï¼å®ä¹±æ¥ï¼ç®¡å¤ªæ»ï¼å®æ²¡ç¨ãDeepSeeker-Code ççæ¡æ¯ä¿¡å· vs 约æå离ââæ"æ³åä»ä¹"çæå©äº¤ç»æ¨¡åï¼ä¿¡å·å·¥å ·ï¼ï¼æ"è½ä¸è½å"çå¼ºå¶æ¡å¨ harness æéï¼æ§è¡å±é¨ç¦ / æ¶æ / çæï¼ï¼èä¸å¼ºå¶å¿ é¡»æ¯ç©ççãç»ä¸è¿å»çã
è®¡åæ¨¡å¼è®© agent "æ³æ¸ æ¥å卿"ï¼å Agent 让å®"æ´¾å身å»å¹²æ´»"ï¼ä¸¤ä¸ªåè½è¡¨é¢ä¸åï¼åºå±é½æ¯è¿å¥ååãèè¿ç¯è¿æä¸æ¡æçº¿å¼å¾å¸¦èµ°ï¼çº¦æçå®ç°æ¹å¼æ¬èº«ä¹å¨è¢«ç¼åå¥çº¦éå¡ââä»"è£æå·¥å ·"å°"é¨ç¦æç»"ï¼çº¦æå¼ºåº¦è®©äºä¸æ¥ï¼æ¨¡åçå¾è§åå·¥å ·äºï¼ï¼æ¢æ¥å·¥å ·è¡¨å ¨ä¼è¯æå®ï¼é¦è°å½ä¸ç 6.4% â 59.7%ï¼ãå½ä½ ç³»ç»ç头é¨åèå¼é±æ¶ï¼"ç©ççä¸è§"è¿ç§çº¦æå°±ä¸æ¯å è´¹çãè¯»è¿æ®µæºç ï¼æå¼å¾å¸¦èµ°çæ¯é£ä¸ªå¤æï¼çå°ä¸ä¸ªçº¦æï¼å é®å®æ¯æç¤ºè¯å±é¢çï¼å¯ç»è¿ï¼ï¼è¿æ¯æ§è¡å±/çæå±é¢çï¼ç»ä¸è¿ï¼ï¼åé®ä¸å¥ï¼å®å¨æ²¡å¨è¯·æ±å¤´é¨ã
ä¸ä¸ç¯ï¼æä»¬è¯»å·¥å
·åè®®æ¬èº«ââCustomTool çåæ®µè®¾è®¡ï¼çä¸ä¸ªå·¥å
·æ¯æä¹ç¨ safetyLevelã审æ¹ãéãç¯å¢æè¨è¿äºåæ®µï¼æ"约æ"ç»æåçã
é¡¹ç®æºç 弿ºå¨ github.com/xnk/deepSeeâ¦ï¼æç« éæå°çæä»¶é½å¨ src/core/src/agent/ å src/core/src/tool/ ä¸ï¼æ¬¢è¿å¯¹çæºç 读ãè§å¾è¿ä¸ªå¯¼è¯»ç³»åæç¹ææï¼ç¹ä¸ª star æ¯å¯¹ææå¤§çé¼å±ã
æ»ç»
- æ ¸å¿ååï¼ä¿¡å·å½æ¨¡åï¼çº¦æå½ harnessãæå¾ï¼enter_plan_mode / spawn_agentï¼æ¯æ¨¡åçæå©ï¼å¼ºå¶ï¼æ§è¡å±é¨ç¦ / æ¶æ / çæï¼æ¯ harness ç责任ï¼ä¸¤è ä¸¥æ ¼å离ï¼
- è®¡åæ¨¡å¼ï¼enter/exit_plan_mode æ¯ä¿¡å·ï¼æåæ¦æªãä¸èµ°å¸¸è§æ§è¡ï¼ï¼çº¦ææ¯æ§è¡å±é¨ç¦ââPLAN_ALLOWED_TOOLS ç½ååå¤çå·¥å ·å¨ processToolCall ç´æ¥æç»ï¼ä¸å¼¹å®¡æ¹ä¸å éï¼ï¼å·¥å ·è¡¨å ¨ä¼è¯æå®ï¼P0-Aï¼tools è®¡å ¥ DeepSeek åç¼åå¸ï¼è£è¡¨ç¿»è½¬å®æµ 6.4% vs æå® 59.7% é¦è°å½ä¸ï¼ï¼schema æ¡£å¯åéï¼ä¸æ¡è¿å ¥è·¯å¾é½æ¶æå°æ¹æ¡å®¡æ¹ï¼
- å Agentï¼spawn_agentï¼ä¸²è¡ï¼/ run_workflowï¼å¹¶è¡+æµæ°´çº¿ï¼å ±äº« runSubagent å æ ¸ï¼çº¦ææ¯ SUBAGENT_DENYLIST æ¶æï¼æ shell/éå½å é¤ï¼+ 声æå¼ç½ååï¼mcp__* æ¡ç®è¿è¡æç¿»è¯ä¸ºååå¨åå·¥å ·ï¼+ 深度çæï¼
- å个设计å³çï¼ä¿¡å·çº¦æå离ã约æé æ§è¡å±å¼ºå¶ä¸é æç¤ºè¯ï¼çº¦æå¼ºåº¦è®©ä¸æ¥ãç¼åç¨³å®æ§ææ»¡ç trade-offï¼ã声æå¼ç½ååä¼äºé»ååãå ±äº«å æ ¸ææ¡å½è°ç¨æ¹ï¼
- äºä¸ªææ¯é¾ç¹ï¼æ¨¡åä¸å®è§ç©çå¤å±å åºï¼å«é²ç¿»è½¬å®å«ä¸è®¡åæè¯æ¢æ²»çï¼ãå¹¶è¡å®¡æ¹ç«æï¼approvalMutex 串è¡åï¼ãå¹¶è¡åå²çªï¼worktree é离ï¼ãç¶åç¶æåæ¥ï¼ð¨ é读éç¥ï¼ã深度çæé²å¥å¨ã
Aitishiku.com