wavetermdev/waveterm · error
tool call with ID %s not found in chat %s
Error message
tool call with ID %s not found in chat %s
What it means
After locating the chat, UpdateToolUseData scans all native messages for a tool call whose ID matches toolCallId. If the whole chat is traversed without a match, it concludes the tool call does not exist in that chat and returns this error.
Source
Thrown at pkg/aiusechat/anthropic/anthropic-convertmessage.go:901
if block.Type != "tool_use" || block.ID != toolCallId {
continue
}
updatedMsg := &anthropicChatMessage{
MessageId: chatMsg.MessageId,
Usage: chatMsg.Usage,
Role: chatMsg.Role,
Content: slices.Clone(chatMsg.Content),
}
updatedMsg.Content[i].ToolUseData = &toolUseData
aiOpts := &uctypes.AIOptsType{
APIType: chat.APIType,
Model: chat.Model,
APIVersion: chat.APIVersion,
}
return chatstore.DefaultChatStore.PostMessage(chatId, aiOpts, updatedMsg)
}
}
return fmt.Errorf("tool call with ID %s not found in chat %s", toolCallId, chatId)
}
func RemoveToolUseCall(chatId string, toolCallId string) error {
chat := chatstore.DefaultChatStore.Get(chatId)
if chat == nil {
return fmt.Errorf("chat not found: %s", chatId)
}
for _, genMsg := range chat.NativeMessages {
chatMsg, ok := genMsg.(*anthropicChatMessage)
if !ok {
continue
}
for i, block := range chatMsg.Content {
if block.Type != "tool_use" || block.ID != toolCallId {
continue
}
updatedMsg := &anthropicChatMessage{
MessageId: chatMsg.MessageId,View on GitHub (pinned to a4447c1563)
Solutions
- Confirm the toolCallId exists in this chat's messages (it may have been removed by RemoveToolUseCall)
- Use the exact tool_use id from the assistant message's tool_use block
- Check you are passing the correct chatId for that tool call
Example fix
// before
err := anthropic.UpdateToolUseData(chatId, staleToolCallID, data)
// after
if err := anthropic.UpdateToolUseData(chatId, toolCallID, data); err != nil {
// skip or recreate the tool use instead of failing
log.Printf("tool call %s gone, skipping update", toolCallID)
} Defensive patterns
Strategy: try-catch
Try / catch
err := anthropic.UpdateToolUseData(chatId, toolCallId, data)
if err != nil && strings.Contains(err.Error(), "not found in chat") {
// tool use already removed or wrong chat; log and continue
log.Printf("tool call %s not in chat %s; skipping", toolCallId, chatId)
return nil
} Prevention
- Track live tool call IDs per chat so you never update removed ones
- Make update/remove operations idempotent in your wrapper layer
- Use the exact tool_use id from the assistant message, not a derived value
When it happens
Trigger: UpdateToolUseData called with a toolCallId that no *anthropicChatMessage in the chat contains — the call was already removed (e.g. by RemoveToolUseCall), the ID belongs to another chat, or the ID was fabricated.
Common situations: Double-applying an update after the tool use was removed; mixing up IDs between concurrent chats; using a truncated/renamed tool call ID from logs.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- tool result missing ToolUseID
- chat not found: %s
- %s: no such file
- invalid accumulated tool input JSON: %w
- tool input is not an object
AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01).
Data as JSON: /api/errors/3f274ad9cb8f2abb.
Report an issue: GitHub.