mirror of
https://github.com/anthropics/claude-code.git
synced 2026-04-17 00:32:44 +00:00
Compare commits
4 Commits
claude/sla
...
claude/sla
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9be32446c8 | ||
|
|
e095e1270a | ||
|
|
69da5e8269 | ||
|
|
7069a25987 |
123
.github/issues/duplicate-tool-result-bug.md
vendored
123
.github/issues/duplicate-tool-result-bug.md
vendored
@@ -1,123 +0,0 @@
|
||||
# Bug Report: Duplicate tool_result blocks with same tool_use_id
|
||||
|
||||
## Summary
|
||||
When a tool call fails (particularly observed with the Tmux tool), two `tool_result` blocks are incorrectly sent to the API with the same `tool_use_id`, causing an API error:
|
||||
|
||||
```
|
||||
API Error: 400
|
||||
{"type":"error","error":{"type":"invalid_request_error","message":"messages.X.content.1: each tool_use must have a single result. Found multiple `tool_result` blocks with id: toolu_XXX"}}
|
||||
```
|
||||
|
||||
## Root Cause
|
||||
The parallel tool execution error handling code sends a "Sibling tool call errored" message even for the tool that actually failed, when it should only send this message for OTHER sibling tools in the parallel batch.
|
||||
|
||||
## Reproduction
|
||||
1. Execute a tool call that will fail (e.g., Tmux select-pane on a non-existent window)
|
||||
2. Observe two tool_result messages being generated:
|
||||
- First: The actual error result ("Window not found...")
|
||||
- Second: A "<tool_use_error>Sibling tool call errored</tool_use_error>" message with the SAME tool_use_id
|
||||
|
||||
## Example JSON (from reported incident)
|
||||
```json
|
||||
// Assistant requests tool use
|
||||
{
|
||||
"type": "tool_use",
|
||||
"id": "toolu_01K2K2KFvUrwA9PaHGp652zW",
|
||||
"name": "Tmux",
|
||||
"input": {"args": ["select-pane", "-t", "test-perms3:0.0"]}
|
||||
}
|
||||
|
||||
// First tool_result (correct - actual error)
|
||||
{
|
||||
"type": "user",
|
||||
"message": {
|
||||
"role": "user",
|
||||
"content": [{
|
||||
"tool_use_id": "toolu_01K2K2KFvUrwA9PaHGp652zW",
|
||||
"type": "tool_result",
|
||||
"content": "Window not found. The specified window may not exist.",
|
||||
"is_error": true
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
||||
// Second tool_result (BUG - same tool_use_id!)
|
||||
{
|
||||
"type": "user",
|
||||
"message": {
|
||||
"role": "user",
|
||||
"content": [{
|
||||
"type": "tool_result",
|
||||
"content": "<tool_use_error>Sibling tool call errored</tool_use_error>",
|
||||
"is_error": true,
|
||||
"tool_use_id": "toolu_01K2K2KFvUrwA9PaHGp652zW"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Expected Behavior
|
||||
- When a tool fails, only ONE tool_result should be sent for that tool_use_id
|
||||
- The "Sibling tool call errored" message should ONLY be sent for OTHER tool_use_ids in a parallel batch, not for the tool that actually errored
|
||||
|
||||
## Suggested Fix Location
|
||||
The fix should be in the code that handles parallel tool execution errors:
|
||||
|
||||
```typescript
|
||||
// Pseudocode for the fix
|
||||
function handleParallelToolResults(toolUseIds: string[], failedToolId: string, error: Error) {
|
||||
const results = [];
|
||||
|
||||
for (const id of toolUseIds) {
|
||||
if (id === failedToolId) {
|
||||
// Send actual error for the failed tool
|
||||
results.push({
|
||||
tool_use_id: id,
|
||||
type: "tool_result",
|
||||
content: error.message,
|
||||
is_error: true
|
||||
});
|
||||
} else {
|
||||
// Only send sibling error for OTHER tools
|
||||
results.push({
|
||||
tool_use_id: id,
|
||||
type: "tool_result",
|
||||
content: "<tool_use_error>Sibling tool call errored</tool_use_error>",
|
||||
is_error: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
```
|
||||
|
||||
Additionally, a deduplication check before sending to the API would prevent this:
|
||||
```typescript
|
||||
function deduplicateToolResults(messages: Message[]): Message[] {
|
||||
const seenToolUseIds = new Set<string>();
|
||||
return messages.filter(msg => {
|
||||
if (msg.type === "tool_result") {
|
||||
if (seenToolUseIds.has(msg.tool_use_id)) {
|
||||
return false; // Skip duplicate
|
||||
}
|
||||
seenToolUseIds.add(msg.tool_use_id);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
## Related CHANGELOG Fixes
|
||||
Similar issues have been fixed before:
|
||||
- v1.0.84: "Fix tool_use/tool_result id mismatch error when network is unstable"
|
||||
- v2.0.0: "Hooks: Reduced PostToolUse 'tool_use' ids were found without 'tool_result' blocks errors"
|
||||
- v2.0.22: "Fix bug causing duplicate permission prompts with parallel tool calls"
|
||||
|
||||
## Reported By
|
||||
Issue reported via Slack with multiple reproductions showing the Tmux tool triggering this bug.
|
||||
|
||||
## Request IDs (for debugging)
|
||||
- req_011CVt2KXhCGmrL2YN9sSZQP
|
||||
- req_011CVtFYJLPxn9oB9FEkCnRr
|
||||
- req_011CVtG1PREveTLikakXGEdn
|
||||
26
CHANGELOG.md
26
CHANGELOG.md
@@ -1,5 +1,31 @@
|
||||
# Changelog
|
||||
|
||||
## 2.0.64
|
||||
|
||||
- Made auto-compacting instant
|
||||
- Agents and bash commands can run asynchronously and send messages to wake up the main agent
|
||||
- /stats now provides users with interesting CC stats, such as favorite model, usage graph, usage streak
|
||||
- Added named session support: use `/rename` to name sessions, `/resume <name>` in REPL or `claude --resume <name>` from the terminal to resume them
|
||||
- Added support for .claude/rules/`. See https://code.claude.com/docs/en/memory for details.
|
||||
- Added image dimension metadata when images are resized, enabling accurate coordinate mappings for large images
|
||||
- Fixed auto-loading .env when using native installer
|
||||
- Fixed `--system-prompt` being ignored when using `--continue` or `--resume` flags
|
||||
- Improved `/resume` screen with grouped forked sessions and keyboard shortcuts for preview (P) and rename (R)
|
||||
- VSCode: Added copy-to-clipboard button on code blocks and bash tool inputs
|
||||
- VSCode: Fixed extension not working on Windows ARM64 by falling back to x64 binary via emulation
|
||||
- Bedrock: Improve efficiency of token counting
|
||||
- Unshipped AgentOutputTool and BashOutputTool, in favor of a new unified TaskOutputTool
|
||||
|
||||
## 2.0.62
|
||||
|
||||
- Added "(Recommended)" indicator for multiple-choice questions, with the recommended option moved to the top of the list
|
||||
- Added `attribution` setting to customize commit and PR bylines (deprecates `includeCoAuthoredBy`)
|
||||
- Fixed duplicate slash commands appearing when ~/.claude is symlinked to a project directory
|
||||
- Fixed slash command selection not working when multiple commands share the same name
|
||||
- Fixed an issue where skill files inside symlinked skill directories could become circular symlinks
|
||||
- Fixed running versions getting removed because lock file incorrectly going stale
|
||||
- Fixed IDE diff tab not closing when rejecting file changes
|
||||
|
||||
## 2.0.61
|
||||
|
||||
- Reverted VSCode support for multiple terminal clients due to responsiveness issues.
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
|
||||
Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining complex code, and handling git workflows -- all through natural language commands. Use it in your terminal, IDE, or tag @claude on Github.
|
||||
|
||||
Hello World
|
||||
|
||||
**Learn more in the [official documentation](https://docs.anthropic.com/en/docs/claude-code/overview)**.
|
||||
|
||||
<img src="./demo.gif" />
|
||||
|
||||
Reference in New Issue
Block a user