Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

triage: parallel tool-call turns send `tool_result` blocks one message too late, so the next request is rejected with 400

クローズ
#3,361 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

  • #3360 @c01dsummer による — マージされずにクローズ

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
25/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
rust
領域
api, backend, testing

調査の方向性

Read convert_messages() in rust/crates/rusty-claude-cli/src/main.rs and inspect the multi_tool_turn_roundtrip scenario in mock-anthropic-service. The issue proposes merging adjacent tool-result messages and extending regression coverage to check the captured request body. Done means all tool results for one assistant turn appear together in the immediately following message; a linked pull request is already open.

索引モデルが issue の本文から書いたものです。

説明

Initial classification

actionable-bug

Evidence

Reported symptom. A claw REPL turn that issues two tool calls at once ends with the
provider rejecting the follow-up request:

✘ ❌ Request failed
[error-kind: api_http_error]
error: api returned 400 Bad Request (invalid_request_error): messages.3:`tool_use` ids were found
without `tool_result` blocks immediately after: call_01_4QJqcZ0075kla1ILwra75582. Each `tool_use`
block must have a corresponding `tool_result` block in the next message. (request_id: cfd...)

Reproduction. In an interactive claw session, send a prompt that makes the model request two
tools in one assistant turn (the session below asked to investigate a directory; the model emitted
ls-style bash calls twice). The first tool-result message pairs, the second does not, and the
request that follows is rejected with HTTP 400.

The durable session log written by that run shows the shape directly — this is
.claw/sessions/e49619b247aa3fce/session-1792170907799-0.jsonl, message records 1-5:

[3] assistant  blocks=[thinking, thinking, tool_use, tool_use]   <- two calls in ONE message
[4] tool       blocks=[tool_result]   <- call_00_8mxD6kU9VooBxwZzfYpO5328
[5] tool       blocks=[tool_result]   <- call_01_4QJqcZ0075kla1ILwra75582

Root cause. runtime records one MessageRole::Tool message per tool call, and
convert_messages() in rust/crates/rusty-claude-cli/src/main.rs turned each of them into its own
wire message. The Anthropic Messages API requires every tool_use of an assistant message to be
answered by tool_result blocks in the single message that follows it, so the wire history
became:

messages.3  assistant  [thinking, thinking, tool_use, tool_use]
messages.4  user       [tool_result]  call_00_8mxD6kU9VooBxwZzfYpO5328   <- paired
messages.5  user       [tool_result]  call_01_4QJqcZ0075kla1ILwra75582   <- one message too late

Single-call turns are unaffected, which is why this only appears when the model requests several
tools at once. preflight_message_request only checks context length, and the OpenAI-compat path
has sanitize_tool_message_pairing while the Anthropic path has no equivalent.

Local verification of the failure mode. Replaying the session's message list through the
pre-fix convert_messages logic reproduces the provider's complaint verbatim, including the id it
names:

messages.3 assistant tool_use=['call_00_8mxD6kU9VooBxwZzfYpO5328', 'call_01_4QJqcZ0075kla1ILwra75582']
  messages.4 tool_result=['call_00_8mxD6kU9VooBxwZzfYpO5328']  -> VIOLATION
==> messages.4: `tool_use` ids were found without `tool_result` blocks immediately after: call_01_4QJqcZ0075kla1ILwra75582

Proposed fix (offered, not applied here). Merge a run of adjacent tool-result messages into the
one user message that follows the assistant turn, extending only a message whose content is tool
results and nothing else. A regression test can drive the real binary against
mock-anthropic-service's multi_tool_turn_roundtrip scenario and assert the pairing contract on
the captured request body; run against the pre-fix code it fails with exactly the payload above.

Two further defects surfaced in the same session and are recorded as ROADMAP #836 (terminal-scope
record paths exceed the APFS 1024-byte total-path limit for a maximal key, invisible to the ubuntu
CI job because Linux PATH_MAX is 4096) and #838 (the missing-credential error never mentions a
configured non-Anthropic ANTHROPIC_BASE_URL).

Safe next action

Maintainer review of the proposed fix shape. A ready branch exists at
https://github.com/c01dsummer/claw-code/pull/1 (fork PR, closed as superseded because the review
target is this repository). If a same-repo PR is preferred so that CI runs without the
first-time-contributor workflow approval, I can open one; the diff is 574/-68 across 9 files and
carries its own unit and integration coverage plus the ROADMAP entries.

  • I did not close, merge, or mutate remote state as part of this triage-only report.
  • I checked for duplicates or related PRs/issues before recommending action. (searched this
    repository for existing tool_use/tool_result pairing reports: none found)
  • If this touches credentials, security, or private data, I avoided public reproduction details
    and routed to the appropriate private/security path. (no credentials in this report)
主要言語
Rust
スター
195k
フォーク
108k
平均マージ
1日 15時間
マージ済み PR(30日)
44

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

ultraworkers/claw-code のほかの issue

ultraworkers/claw-code の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。