DSH / TOOL FEEDBACK

一次工具结果,怎样进入下一轮上下文

同一个 c1,连接模型的调用意图、工具的返回值与后续请求。

↔ 左右滑动查看完整回路,文字保持可读大小

dsh 工具反馈回路模型响应经 Agent 调度工具,调用与结果追加到 Session,下一 Step 派生并冻结包含工具结果的消息,再发给模型。 messages → stream 响应 执行 tool/call messages下一 Step 派生 tool/result MODEL模型read · id = c1 AGENT LOOPAgentStep n → Step n+1 TOOL RUNTIME工具运行时read(README.md) SESSION · EVENT LOG会话记录追加事件 → 更新表面 → 派生消息callId: c1sourceEventSeqs: [42] dsh 工具反馈回路:紧凑布局模型响应经 Agent 调度工具,调用与返回值进入会话记录,下一 Step 派生消息并发送给模型。messages tool/call execute messages下一 Step 派生 tool/resultMODEL模型read · id = c1 AGENT LOOPAgentStep n → n+1 TOOL RUNTIME工具运行时read(README.md) SESSION会话记录追加 → 更新表面→ 派生消息c1 ↔ seq 42
阶段 6 / 6

  1. 01模型响应结算
  2. 02登记工具调用
  3. 03执行工具
  4. 04提交工具结果
  5. 05派生消息历史
  6. 06发送下一轮

从一条 read 调用开始

点击播放,观察调用与返回值如何闭合这条回路。下方三个视角会随阶段变化;也可以点图中的链接切换视角。

模型给出调用意图

assistant/message 已记录 read 调用。c1 是这次调用的标识;文件内容还没有返回。

先留下调用记录

调度器先追加 tool/call,并保留它的事件序号。后续结果将引用这个序号。

运行时接手执行

工具运行时按 prepare、策略检查、执行与结果处理的路径调用 read。图中只展开正常读取路径。

返回值成为会话事件

tool/result 携带工具消息,并用 sourceEventSeqs 引用先前的 tool/call。Session 先提交到内存记录。

下一 Step 读取会话表面

正常继续路径进入下一 Step。prepareRequest() 调用 session.deriveMessages(),得到包含工具结果的消息历史。

冻结请求,再交给模型

边界消息和请求被冻结,随后交给 adapter.stream()。模型这次获得了 read 的返回内容。

选择观察视角

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。

user
读取 README.md,并概述这个项目。
assistant
尚未结算;预期为带 c1 的 read 调用。
tool
结果尚未进入会话历史。

尚未收到模型响应;下一轮请求未构造。

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。

user
读取 README.md,并概述这个项目。
assistant
read · c1 · {"file_path":"README.md"}
工具调用块;不是文件内容。
tool
结果尚未进入会话历史。

助手调用已结算;工具还没有执行。

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。

user
读取 README.md,并概述这个项目。
assistant
read · c1 · {"file_path":"README.md"}
工具调用块;不是文件内容。
tool
结果尚未进入会话历史。

tool/call 已提交;等待运行时返回。

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。

user
读取 README.md,并概述这个项目。
assistant
read · c1 · {"file_path":"README.md"}
工具调用块;不是文件内容。
tool
结果尚未进入会话历史。

工具已进入运行时;等待结果提交。

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。此处预览已提交记录的消息形态,尚未调用 deriveMessages()。

user
读取 README.md,并概述这个项目。
assistant
read · c1 · {"file_path":"README.md"}
工具调用块;不是文件内容。
tool
toolCallId = c1
# DeepSeek Harness
用于组织模型、工具和会话的软件框架。(示例文件内容)

结果已进入会话;下一 Step 尚未派生消息。

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。

user
读取 README.md,并概述这个项目。
assistant
read · c1 · {"file_path":"README.md"}
工具调用块;不是文件内容。
tool
toolCallId = c1
# DeepSeek Harness
用于组织模型、工具和会话的软件框架。(示例文件内容)

消息已派生;下一轮请求尚未冻结。

仅展示 user / assistant / tool;省略 system、developer 与 provider 包装。

user
读取 README.md,并概述这个项目。
assistant
read · c1 · {"file_path":"README.md"}
工具调用块;不是文件内容。
tool
toolCallId = c1
# DeepSeek Harness
用于组织模型、工具和会话的软件框架。(示例文件内容)

消息与请求已冻结;交给 adapter.stream()。

可展开载荷。序号 41–43 为演示值;未提交项展示计划载荷,已省略完整 Schema 的其他字段。

41assistant/message尚未提交已提交
{
  "type": "assistant/message",
  "message": {
    "role": "assistant",
    "content": [{ "type": "tool-call", "id": "c1",
      "name": "read",
      "arguments": "{\"file_path\":\"README.md\"}" }]
  }
}
42tool/call尚未提交已提交
{
  "type": "tool/call",
  "callId": "c1",
  "name": "read",
  "arguments": "{\"file_path\":\"README.md\"}"
}
43tool/result尚未提交已提交
{
  "type": "tool/result",
  "message": { "role": "tool", "toolCallId": "c1",
    "content": [{ "type": "text",
      "text": "# DeepSeek Harness…(示例文件内容)" }] },
  "sourceEventSeqs": [42]
}

颜色标记数据与职责的归属;下一 Step 只展示正常获准继续的路径。

模型 · 产生调用意图

assistant/message 结算后提取工具调用。模型提供名称、调用 ID 与参数;文件读取由工具运行时执行。

Agent · 组织下一 Step

executeToolCalls() 调度本轮工具;正常继续时,prepareRequest() 派生并冻结下一轮消息。

工具 · 返回执行结果

调度受执行模式与屏障约束。commitReady() 按模型调用顺序提交结果,完成顺序可以不同。

Session · 保存事件并派生表面

tool/result 引用 tool/call 的序号;deriveMessages() 将会话表面投影为消息历史。提交与刷盘分开。