DeepSeek Harness 源码解读(四):一次 Turn 为什么会跑多个 Step

发布时间:2026/11/3 15:20:10
DeepSeek Harness 源码解读(四):一次 Turn 为什么会跑多个 Step 第一次看 Agent Loop,我下意识把“一条用户消息”理解成“一次模型请求”。顺着packages/core/agent-loop/src/agent.ts走完以后,才发现这两个边界并不重合。用户消息先进入 Inbox。驱动器打开 Turn,再根据当时欠下的工作创建 Step。模型如果要求调用工具,工具结果写回 Session 后,同一个 Turn 会继续开下一个 Step;请求失败后选择重试,甚至不会增加 Step 编号。这篇只做一件事:沿当前源码把一条输入从 Inbox 追到turn/end。项目地址:deepseek-ai/deepseek-harness源码基线:0.1.0-rc.5输入先进入 Inbox,不会直接调用模型ReactLoopAgent暴露了三种投递方式:followup(input:UserMessage):void{this.send(input,'next-turn',true)}steer(input:UserMessage):void{this.send(input,'next-step',true)}inject(input:UserMessage):void{this.send(input,'next-step',false)}followup()把消息放进next-turn队列,并唤醒驱动器;steer()把消息放进next-step队列,驱动器正在运行时会并入当前 Turn;inject()同样准备下一 Step 的输入,但不会单独把空闲 Agent 唤醒。这三个方法的差异不是命名上的细节。它们决定一条消息应该开启新 Turn,还是在当前 Turn 的下一个模型边界生效。Agent 从 idle 进入 running 后,只启动一条驱动链:privateasynckick():Promisevoid{try{while(awaitthis.turn()){}}catch(_error){// 已上报的失败和取消在驱动器边界收口}finally{// 恢复 idle;如果还有待处理输入,再次唤醒}}所以同一个 Agent 不会因为连续收到几条消息就并发跑几套主循环。Inbox 可以继续收消息,kick()负责按 Turn 串行消化。Turn 在认领输入之前就已经开始turn()先追加turn/start,然后才尝试生成第一个 Step:constturn=phase.turn+1this.session.append('turn/start',{turn})phase.turn=turnletturnEnds:TurnEndReason|null=nulllettarget:InboxTarget='next-turn'while(true){conststep=phase.step+1constdecision

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询