执行通道队列

会话默认没有队列,除非创建时传入 queueConfig / queue_config / QueueConfig。有了队列后, 宿主直接发起的工具调用(session.tool(...) 以及 bash、readFile、grep 等类型化辅助方法) 会被调度到各个 lane 上,每个 lane 有自己的并发上限。模型在 send 或 stream 回合内发起的 工具调用会直接运行,不经过队列。

四个 lane 分别是 control、query、execute 和 generate,默认并发上限依次为 2、4、2 和 1。 工具按名称映射到 lane:read、ls、search(grep 和 glob 背后的工具)、web_fetch、 web_search 以及代码智能工具使用 query;其他所有工具使用 execute。没有工具映射到 control 或 generate。

Rust
Node.js
Python
Go

说明:

  • 只有在创建会话时传入了队列配置,hasQueue() / has_queue() / HasQueue() 才返回 true。 没有队列配置时,设置 lane 处理器不起作用,队列统计也始终为零。
  • 每个 lane 都有一个处理器 mode:internal(默认)在进程内运行工具;external 把调用作为 外部任务挂起,直到你的宿主完成它;hybrid 在进程内运行工具,只发出 pending 和 completed 通知。可以用 setLaneHandler / set_lane_handler / SetLaneHandler 设置,也可以预先写在 队列配置中。完整的取出并完成流程见 外部任务。
  • 队列统计报告 total_pending、total_active 和 external_pending(Node 中为 totalPending、totalActive 和 externalPending)。Rust、Python 和 Go 还会在 lanes 下给出每个 lane 的状态。
  • 在 Node 中,hasQueue 是同步的,其他队列方法返回 promise。Python 的队列方法是同步的。Go 的 队列方法接收调用方的 context.Context。