fix(claude_sdk,conversations,rotation): context size from the last api call, new-day text by rotation reason
This commit is contained in:
@@ -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")),
|
||||
|
||||
Reference in New Issue
Block a user