fix(claude_sdk,conversations,rotation): context size from the last api call, new-day text by rotation reason

This commit is contained in:
hh
2026-08-29 16:54:29 +02:00
parent 72639c4b90
commit 4a59c59bda
8 changed files with 120 additions and 16 deletions
+19 -3
View File
@@ -391,7 +391,7 @@ class ClaudeSdkBackend:
live.session_id = turn.result.session_id
if conversation_id is None:
self._rekey(live.key, fingerprint([*history, *turn.synthesized]))
usage = _usage_of(turn.result)
usage = _usage_of(turn.result, context_tokens=turn.context_tokens)
interrupted = live.interrupt_requested
live.interrupt_requested = False
if capture is not None:
@@ -455,6 +455,7 @@ class ClaudeSdkBackend:
event = message.event
if event.get("type") == "message_start":
offset = next_index
turn.context_tokens = _context_of(event.get("message"))
continue
index = event.get("index")
if isinstance(index, int):
@@ -740,6 +741,9 @@ class _SessionSpec:
class _Turn:
events: int = 0
"""Wire events already yielded to the caller."""
context_tokens: int = 0
"""Input size of the latest API call (``message_start`` usage)."""
synthesized: list[dict[str, Any]] = field(default_factory=list)
result: ResultMessage | None = None
stop_reason: StopReason = "end_turn"
@@ -895,11 +899,23 @@ def _block_to_dict(block: Any) -> dict[str, Any]:
raise TypeError(msg)
def _usage_of(result: ResultMessage | None) -> TurnUsage:
def _context_of(message: Any) -> int:
usage = message.get("usage") if isinstance(message, dict) else None
if not isinstance(usage, dict):
return 0
return (
_int(usage.get("input_tokens"))
+ _int(usage.get("cache_read_input_tokens"))
+ _int(usage.get("cache_creation_input_tokens"))
)
def _usage_of(result: ResultMessage | None, *, context_tokens: int = 0) -> TurnUsage:
if result is None:
return TurnUsage()
return TurnUsage(context_tokens=context_tokens)
usage = result.usage or {}
return TurnUsage(
context_tokens=context_tokens,
input_tokens=_int(usage.get("input_tokens")),
output_tokens=_int(usage.get("output_tokens")),
cache_read_tokens=_int(usage.get("cache_read_input_tokens")),