4.4 KiB
4.4 KiB
| title | state | created_at | updated_at | assignee |
|---|---|---|---|---|
| Tool実行にToolExecutionContextを渡す | planning | 2026-06-09T09:30:50Z | 2026-06-09T09:30:50Z | null |
背景
LLM-Worker は tool calls を並列実行する前提で作られている。Worker 側に tool/resource scheduling policy を持たせるのではなく、順序性や排他が必要な tool は tool 実装側で待つ設計にしたい。
そのためには tool 実装が、現在の tool call がどの LLM response / tool batch に属し、response 内で何番目の call なのかを知る必要がある。
現状の Tool::execute(input_json) には以下の情報が渡らない:
- tool call id;
- response/tool-batch identity;
- response 内の tool call order;
- LLM call / turn に紐づく実行文脈。
Hook / Interceptor ではこの用途をきれいに満たせない。pre_tool_call で lock を取ると、全 pre hooks が tool execution 前に走る構造のため deadlock し得る。また guard を tool execution future の lifetime に渡す API もない。
ゴール
Tool 実行 API に ToolExecutionContext を導入し、tool 実装が response-local order / call identity を参照できるようにする。Worker は並列実行を維持し、scheduling policy は持たない。
要件
API 変更
- 既存 API 互換を優先せず、
Tool::executeを context 付き signature に置き換える。 - 例:
async fn execute(&self, input_json: &str, ctx: ToolExecutionContext) -> Result<ToolOutput, ToolError>;
ToolServer::call_tool/ Worker の tool execution path も context を渡す形に更新する。- 互換 wrapper や default old-API bridge は原則作らなくてよい。既存 tools を一括更新する。
ToolExecutionContext
ToolExecutionContextに少なくとも以下を含める:call_id: provider/tool call id;batch_id: 1つの assistant response / tool-call batch を識別する id;call_index: batch 内の tool call order;- 必要なら
llm_call_index/turn_index相当。ただし first pass では過剰に増やさない。
batch_idは tool execution batch ごとに stable であればよい。- random UUID でも Worker-local increment でもよい。
- session log に出す必要があるかは実装時に判断する。
call_indexは LLM が出した tool call order を反映する。- Context は Worker の scheduling 判断に使わない。tool が必要に応じて利用する metadata とする。
Worker behavior
- Worker はこれまで通り approved tool calls を並列実行する。
- Worker は per-tool parallel-safe / serial / resource conflict policy を持たない。
- Worker は各 tool call に context を付与して並列実行するだけ。
pre_tool_call/post_tool_callinterceptors の既存意味論は極力維持する。- 必要なら
ToolCallInfo/ToolResultInfoに context 相当の情報を追加する。 - ただし lock/permit lifecycle を interceptor に持たせない。
- 必要なら
Tool update
- 既存 built-in tools を新 signature に更新する。
- 初期段階では多くの tools は context を無視してよい。
- Context を使う具体的な same-file mutation queue / Edit-Write serialization は別 Ticket で扱う。
非目標
- Worker に resource scheduling policy を実装すること。
Edit/Writeの same-file mutex をこの Ticket で実装すること。parallel_tool_calls=falseの導入。- Hook / Interceptor で lock lifecycle を管理すること。
- Backward-compatible old Tool API を長期維持すること。
受け入れ条件
Tool::executeがToolExecutionContextを受け取る。- Worker が 1 assistant response / tool batch ごとに
batch_idとcall_indexを付与して tools を並列実行する。 call_indexは response 内の tool call order と一致する。- 既存 built-in tools が新 API に移行され、context を無視しても動作する。
- Interceptor / hook の意味論が壊れていない。
- Tests cover:
- multiple tool calls in one response receive same
batch_idand increasingcall_index; - separate tool batches receive distinct
batch_id; - synthetic / skipped / aborted tool calls の context handling が破綻しない;
- parallel execution is still used for approved calls.
- multiple tool calls in one response receive same
- Focused tests,
cargo fmt --check,git diff --check, andtarget/debug/yoi ticket doctorpass.