Skip to content

Commit 516837d

Browse files
committed
rename to latest_context_size, expose on agent result
1 parent f6a268d commit 516837d

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

src/strands/agent/agent_result.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ class AgentResult:
3535
interrupts: Sequence[Interrupt] | None = None
3636
structured_output: BaseModel | None = None
3737

38+
@property
39+
def context_size(self) -> int | None:
40+
"""Most recent context size in tokens from the last LLM call.
41+
42+
Returns:
43+
The input token count from the most recent cycle, or None if no data is available.
44+
"""
45+
return self.metrics.latest_context_size
46+
3847
def __str__(self) -> str:
3948
"""Return a string representation of the agent result.
4049

src/strands/telemetry/metrics.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,17 +203,17 @@ class EventLoopMetrics:
203203
accumulated_metrics: Metrics = field(default_factory=lambda: Metrics(latencyMs=0))
204204

205205
@property
206-
def latest_context_tokens(self) -> int:
206+
def latest_context_size(self) -> int | None:
207207
"""Most recent context size from the last LLM call.
208208
209209
This represents the current context size as reported by the model.
210210
211211
Returns:
212-
The input token count from the most recent cycle, or 0 if no cycles exist.
212+
The input token count from the most recent cycle, or None if no data is available.
213213
"""
214214
if self.agent_invocations and self.agent_invocations[-1].cycles:
215-
return self.agent_invocations[-1].cycles[-1].usage.get("inputTokens", 0)
216-
return 0
215+
return self.agent_invocations[-1].cycles[-1].usage.get("inputTokens")
216+
return None
217217

218218
@property
219219
def _metrics_client(self) -> "MetricsClient":

tests/strands/agent/test_agent_result.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,3 +370,17 @@ def test__str__empty_interrupts_returns_agent_message(mock_metrics, simple_messa
370370

371371
# Empty list is falsy, should fall through to text content
372372
assert message_string == "Hello world!\n"
373+
374+
375+
def test_context_size_delegates_to_metrics(mock_metrics, simple_message: Message):
376+
"""Test that context_size delegates to metrics.latest_context_size."""
377+
mock_metrics.latest_context_size = 12345
378+
result = AgentResult(stop_reason="end_turn", message=simple_message, metrics=mock_metrics, state={})
379+
assert result.context_size == 12345
380+
381+
382+
def test_context_size_none_when_no_data(mock_metrics, simple_message: Message):
383+
"""Test that context_size returns None when metrics has no data."""
384+
mock_metrics.latest_context_size = None
385+
result = AgentResult(stop_reason="end_turn", message=simple_message, metrics=mock_metrics, state={})
386+
assert result.context_size is None

tests/strands/telemetry/test_metrics.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -568,27 +568,27 @@ def test_reset_usage_metrics(usage, event_loop_metrics, mock_get_meter_provider)
568568
assert event_loop_metrics.accumulated_usage["inputTokens"] == 11
569569

570570

571-
def test_latest_context_tokens_no_invocations(event_loop_metrics):
572-
assert event_loop_metrics.latest_context_tokens == 0
571+
def test_latest_context_size_no_invocations(event_loop_metrics):
572+
assert event_loop_metrics.latest_context_size is None
573573

574574

575-
def test_latest_context_tokens_invocation_with_no_cycles(event_loop_metrics):
575+
def test_latest_context_size_invocation_with_no_cycles(event_loop_metrics):
576576
event_loop_metrics.reset_usage_metrics()
577-
assert event_loop_metrics.latest_context_tokens == 0
577+
assert event_loop_metrics.latest_context_size is None
578578

579579

580-
def test_latest_context_tokens_returns_last_cycle(event_loop_metrics, mock_get_meter_provider):
580+
def test_latest_context_size_returns_last_cycle(event_loop_metrics, mock_get_meter_provider):
581581
event_loop_metrics.reset_usage_metrics()
582582
event_loop_metrics.start_cycle(attributes={"event_loop_cycle_id": "c1"})
583583
event_loop_metrics.update_usage(Usage(inputTokens=100, outputTokens=50, totalTokens=150))
584584

585585
event_loop_metrics.start_cycle(attributes={"event_loop_cycle_id": "c2"})
586586
event_loop_metrics.update_usage(Usage(inputTokens=250, outputTokens=80, totalTokens=330))
587587

588-
assert event_loop_metrics.latest_context_tokens == 250
588+
assert event_loop_metrics.latest_context_size == 250
589589

590590

591-
def test_latest_context_tokens_returns_from_latest_invocation(event_loop_metrics, mock_get_meter_provider):
591+
def test_latest_context_size_returns_from_latest_invocation(event_loop_metrics, mock_get_meter_provider):
592592
# First invocation
593593
event_loop_metrics.reset_usage_metrics()
594594
event_loop_metrics.start_cycle(attributes={"event_loop_cycle_id": "c1"})
@@ -599,11 +599,11 @@ def test_latest_context_tokens_returns_from_latest_invocation(event_loop_metrics
599599
event_loop_metrics.start_cycle(attributes={"event_loop_cycle_id": "c2"})
600600
event_loop_metrics.update_usage(Usage(inputTokens=500, outputTokens=80, totalTokens=580))
601601

602-
assert event_loop_metrics.latest_context_tokens == 500
602+
assert event_loop_metrics.latest_context_size == 500
603603

604604

605-
def test_latest_context_tokens_missing_input_tokens_key(event_loop_metrics):
606-
"""Returns 0 when usage dict is missing inputTokens (e.g. provider bug)."""
605+
def test_latest_context_size_missing_input_tokens_key(event_loop_metrics):
606+
"""Returns None when usage dict is missing inputTokens (e.g. provider bug)."""
607607
event_loop_metrics.reset_usage_metrics()
608608
invocation = event_loop_metrics.agent_invocations[-1]
609609
invocation.cycles.append(
@@ -612,4 +612,4 @@ def test_latest_context_tokens_missing_input_tokens_key(event_loop_metrics):
612612
usage={"outputTokens": 50, "totalTokens": 50},
613613
)
614614
)
615-
assert event_loop_metrics.latest_context_tokens == 0
615+
assert event_loop_metrics.latest_context_size is None

0 commit comments

Comments
 (0)