simonw--llm
a2547d8183
ReasoningPart.token_count duplicated info already on response.token_details (reasoning_tokens), and the side-channel `response._reasoning_token_count` attribute with its set_usage ordering footgun was the wrong shape. Replaced with a clean StreamEvent.redacted=True marker that plugins yield like any other event. The framework hoists redacted reasoning Parts to the start of the assembled message so UIs render them before content, even though the opaque count typically arrives at the end of the stream. Also fix parallel tool calls emitted without tool_call_id (e.g. Gemini): a fresh tool_call_name now always allocates a new index instead of falling through to the prior tool-call group, so N parallel calls produce N distinct ToolCallParts instead of one with concatenated names and args. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>