Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Anthropic plugin drops thinking blocks between tool calls

Open
#7,908 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@Yatha04 is already working on this.

Since Oct 17, 2026.

  • #7909 by @Yatha04 — open

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
machine-learning, python

Research direction

Start in livekit-plugins-anthropic by tracing where thinking, redacted_thinking, thinking_delta, and signature_delta events are handled and where FunctionCall.extra is serialized. Use the issue's agent reproduction and request logging to verify that thinking blocks are replayed unchanged before tool results. The change is complete when blocks are restored while the system prompt, tools, and earlier messages are unchanged, but omitted after a prefix change without causing a 400.

Written by the indexing model from the issue text.

Description

Bug Description

livekit-plugins-anthropic ignores the thinking events in the stream (thinking and redacted_thinking blocks, thinking_delta, signature_delta). The blocks never reach the chat context, so the request that carries a tool result goes without the reasoning that led to the tool call.

The API does not return an error for this. The model silently loses its reasoning and starts again in the middle of a tool loop. Anthropic's docs make this a requirement (Preserving thinking blocks):

Required: within a tool-use turn, pass thinking blocks back.

This now affects agents that never asked for thinking: Claude Haiku 5.5, Sonnet 5.5, Opus 5 and Opus 5.5 think by default (adaptive). #6868 notes the same gap ("thinking blocks are not kept in the chat context, so a turn carrying a tool call is replayed without them") and leaves it out of scope.

Expected Behavior

The thinking blocks of a response that calls a tool go back, unchanged, before that tool_use block in the following requests.

There is one catch for a fix. A thinking block's signature is bound to the system prompt, the tools and the earlier messages. On accounts created on or after 2026-08-31, the API rejects a block with a 400 when that prefix changed, and update_instructions() and update_tools() change it in the middle of a session:

messages.1.content.0: Invalid `signature` in `thinking` block. The block is bound to a different conversation. Remove the block, or set `thinking.block_binding.prefix_mismatch_behavior` to "drop_block". The `system` prompt differs from the one this block was created with.

So a fix must also stop sending a block after its prefix changed.

Reproduction Steps
1. Run an agent with anthropic.LLM(model="claude-haiku-5-5") and one function tool.
2. Ask something that makes the model call the tool.
3. Log the request that carries the tool result: the assistant turn has only the tool_use block.

Direct API check with claude-haiku-5-5 (anthropic 0.125.0, effort low), same tool step:
- tool result, thinking block kept:       200, 601 input tokens
- tool result, thinking block stripped:   200, 525 input tokens (the reasoning is gone, no error)
- block kept, system prompt then edited, with
  thinking.block_binding.prefix_mismatch_behavior="error"
  (what a new account gets by default):   400 (message above); the same for an added tool
Operating System

macOS 26.6.2

Models Used

Claude Haiku 5.5 (claude-haiku-5-5) through livekit-plugins-anthropic

Package Versions
livekit-agents==1.8.3, and main at ceb3d59
livekit-plugins-anthropic==1.8.3, and main at ceb3d59 (1.8.8 is the same)
anthropic==0.125.0
Proposed fix

A PR follows: it keeps the blocks in FunctionCall.extra["anthropic"] (the field that carries Gemini thought signatures) with a hash of the request prefix, and puts them back only while that prefix is unchanged.

Dominant language
Python
Stars
14.6k
Forks
3.9k
Avg merge
3d 7h
Merged PRs (30d)
165

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from livekit/agents

All issues in livekit/agents

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.