Skip to content

Commit 91bf184

Browse files
author
Workshop Participant
committed
Updates tests with cache tokens for the supported models
1 parent ebcd4c0 commit 91bf184

File tree

11 files changed

+164
-38
lines changed

11 files changed

+164
-38
lines changed

tests-integ/test_bedrock_cache_point.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,8 @@ def test_bedrock_cache_point():
1616
{"role": "assistant", "content": [{"text": "Blue!"}]},
1717
]
1818

19-
cache_point_usage = 0
19+
agent = Agent(messages=messages, load_tools_from_directory=False)
20+
response = agent("What is favorite color?")
2021

21-
def cache_point_callback_handler(**kwargs):
22-
nonlocal cache_point_usage
23-
if "event" in kwargs and kwargs["event"] and "metadata" in kwargs["event"] and kwargs["event"]["metadata"]:
24-
metadata = kwargs["event"]["metadata"]
25-
if "usage" in metadata and metadata["usage"]:
26-
if "cacheReadInputTokens" in metadata["usage"] or "cacheWriteInputTokens" in metadata["usage"]:
27-
cache_point_usage += 1
28-
29-
agent = Agent(messages=messages, callback_handler=cache_point_callback_handler, load_tools_from_directory=False)
30-
agent("What is favorite color?")
31-
assert cache_point_usage > 0
22+
usage = response.metrics.accumulated_usage
23+
assert usage["cacheReadInputTokens"] >= 0 or usage["cacheWriteInputTokens"] > 0 # At least one should have tokens

tests/strands/event_loop/test_streaming.py

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,13 @@ def test_handle_message_stop():
250250

251251
def test_extract_usage_metrics():
252252
event = {
253-
"usage": {"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
253+
"usage": {
254+
"inputTokens": 0,
255+
"outputTokens": 0,
256+
"totalTokens": 0,
257+
"cacheReadInputTokens": 0,
258+
"cacheWriteInputTokens": 0,
259+
},
254260
"metrics": {"latencyMs": 0},
255261
}
256262

@@ -279,7 +285,13 @@ def test_extract_usage_metrics():
279285
},
280286
{
281287
"metadata": {
282-
"usage": {"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
288+
"usage": {
289+
"inputTokens": 1,
290+
"outputTokens": 1,
291+
"totalTokens": 1,
292+
"cacheReadInputTokens": 1,
293+
"cacheWriteInputTokens": 1,
294+
},
283295
"metrics": {"latencyMs": 1},
284296
}
285297
},
@@ -364,6 +376,8 @@ def test_extract_usage_metrics():
364376
"inputTokens": 1,
365377
"outputTokens": 1,
366378
"totalTokens": 1,
379+
"cacheReadInputTokens": 1,
380+
"cacheWriteInputTokens": 1,
367381
},
368382
},
369383
},
@@ -376,7 +390,13 @@ def test_extract_usage_metrics():
376390
"role": "assistant",
377391
"content": [{"toolUse": {"toolUseId": "123", "name": "test", "input": {"key": "value"}}}],
378392
},
379-
{"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
393+
{
394+
"inputTokens": 1,
395+
"outputTokens": 1,
396+
"totalTokens": 1,
397+
"cacheReadInputTokens": 1,
398+
"cacheWriteInputTokens": 1,
399+
},
380400
{"latencyMs": 1},
381401
)
382402
},
@@ -398,7 +418,13 @@ def test_extract_usage_metrics():
398418
"role": "assistant",
399419
"content": [],
400420
},
401-
{"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
421+
{
422+
"inputTokens": 0,
423+
"outputTokens": 0,
424+
"totalTokens": 0,
425+
"cacheReadInputTokens": 0,
426+
"cacheWriteInputTokens": 0,
427+
},
402428
{"latencyMs": 0},
403429
),
404430
},
@@ -426,7 +452,13 @@ def test_extract_usage_metrics():
426452
},
427453
{
428454
"metadata": {
429-
"usage": {"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
455+
"usage": {
456+
"inputTokens": 1,
457+
"outputTokens": 1,
458+
"totalTokens": 1,
459+
"cacheReadInputTokens": 1,
460+
"cacheWriteInputTokens": 1,
461+
},
430462
"metrics": {"latencyMs": 1},
431463
}
432464
},
@@ -506,6 +538,8 @@ def test_extract_usage_metrics():
506538
"inputTokens": 1,
507539
"outputTokens": 1,
508540
"totalTokens": 1,
541+
"cacheReadInputTokens": 1,
542+
"cacheWriteInputTokens": 1,
509543
},
510544
},
511545
},
@@ -518,7 +552,13 @@ def test_extract_usage_metrics():
518552
"role": "assistant",
519553
"content": [{"text": "REDACTED."}],
520554
},
521-
{"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
555+
{
556+
"inputTokens": 1,
557+
"outputTokens": 1,
558+
"totalTokens": 1,
559+
"cacheReadInputTokens": 1,
560+
"cacheWriteInputTokens": 1,
561+
},
522562
{"latencyMs": 1},
523563
),
524564
},
@@ -584,7 +624,13 @@ async def test_stream_messages(agenerator, alist):
584624
"stop": (
585625
"end_turn",
586626
{"role": "assistant", "content": [{"text": "test"}]},
587-
{"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
627+
{
628+
"inputTokens": 0,
629+
"outputTokens": 0,
630+
"totalTokens": 0,
631+
"cacheReadInputTokens": 0,
632+
"cacheWriteInputTokens": 0,
633+
},
588634
{"latencyMs": 0},
589635
)
590636
},

tests/strands/models/test_anthropic.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,12 @@ def test_format_chunk_message_stop(model):
597597
def test_format_chunk_metadata(model):
598598
event = {
599599
"type": "metadata",
600-
"usage": {"input_tokens": 1, "output_tokens": 2},
600+
"usage": {
601+
"input_tokens": 1,
602+
"output_tokens": 2,
603+
"cache_read_input_tokens": 4,
604+
"cache_creation_input_tokens": 5,
605+
},
601606
}
602607

603608
tru_chunk = model.format_chunk(event)
@@ -607,6 +612,8 @@ def test_format_chunk_metadata(model):
607612
"inputTokens": 1,
608613
"outputTokens": 2,
609614
"totalTokens": 3,
615+
"cacheReadInputTokens": 4,
616+
"cacheWriteInputTokens": 5,
610617
},
611618
"metrics": {
612619
"latencyMs": 0,

tests/strands/models/test_bedrock.py

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,13 @@ async def test_converse_stream_input_guardrails(
497497
):
498498
metadata_event = {
499499
"metadata": {
500-
"usage": {"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
500+
"usage": {
501+
"inputTokens": 0,
502+
"outputTokens": 0,
503+
"totalTokens": 0,
504+
"cacheReadInputTokens": 0,
505+
"cacheWriteInputTokens": 0,
506+
},
501507
"metrics": {"latencyMs": 245},
502508
"trace": {
503509
"guardrail": {
@@ -552,7 +558,13 @@ async def test_converse_stream_output_guardrails(
552558
model.update_config(guardrail_redact_input=False, guardrail_redact_output=True)
553559
metadata_event = {
554560
"metadata": {
555-
"usage": {"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
561+
"usage": {
562+
"inputTokens": 0,
563+
"outputTokens": 0,
564+
"totalTokens": 0,
565+
"cacheReadInputTokens": 0,
566+
"cacheWriteInputTokens": 0,
567+
},
556568
"metrics": {"latencyMs": 245},
557569
"trace": {
558570
"guardrail": {
@@ -609,7 +621,13 @@ async def test_converse_output_guardrails_redacts_input_and_output(
609621
model.update_config(guardrail_redact_output=True)
610622
metadata_event = {
611623
"metadata": {
612-
"usage": {"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
624+
"usage": {
625+
"inputTokens": 0,
626+
"outputTokens": 0,
627+
"totalTokens": 0,
628+
"cacheReadInputTokens": 0,
629+
"cacheWriteInputTokens": 0,
630+
},
613631
"metrics": {"latencyMs": 245},
614632
"trace": {
615633
"guardrail": {
@@ -666,7 +684,13 @@ async def test_converse_output_no_blocked_guardrails_doesnt_redact(
666684
):
667685
metadata_event = {
668686
"metadata": {
669-
"usage": {"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
687+
"usage": {
688+
"inputTokens": 0,
689+
"outputTokens": 0,
690+
"totalTokens": 0,
691+
"cacheReadInputTokens": 0,
692+
"cacheWriteInputTokens": 0,
693+
},
670694
"metrics": {"latencyMs": 245},
671695
"trace": {
672696
"guardrail": {
@@ -719,7 +743,13 @@ async def test_converse_output_no_guardrail_redact(
719743
):
720744
metadata_event = {
721745
"metadata": {
722-
"usage": {"inputTokens": 0, "outputTokens": 0, "totalTokens": 0},
746+
"usage": {
747+
"inputTokens": 0,
748+
"outputTokens": 0,
749+
"totalTokens": 0,
750+
"cacheReadInputTokens": 0,
751+
"cacheWriteInputTokens": 0,
752+
},
723753
"metrics": {"latencyMs": 245},
724754
"trace": {
725755
"guardrail": {
@@ -909,7 +939,13 @@ async def test_stream_with_streaming_false_with_metrics_and_usage(bedrock_client
909939
"""Test stream method with streaming=False."""
910940
bedrock_client.converse.return_value = {
911941
"output": {"message": {"role": "assistant", "content": [{"text": "test"}]}},
912-
"usage": {"inputTokens": 1234, "outputTokens": 1234, "totalTokens": 2468},
942+
"usage": {
943+
"inputTokens": 1234,
944+
"outputTokens": 1234,
945+
"totalTokens": 2468,
946+
"cacheReadInputTokens": 128,
947+
"cacheWriteInputTokens": 512,
948+
},
913949
"metrics": {"latencyMs": 1234},
914950
"stopReason": "tool_use",
915951
}
@@ -927,7 +963,13 @@ async def test_stream_with_streaming_false_with_metrics_and_usage(bedrock_client
927963
{"messageStop": {"stopReason": "tool_use", "additionalModelResponseFields": None}},
928964
{
929965
"metadata": {
930-
"usage": {"inputTokens": 1234, "outputTokens": 1234, "totalTokens": 2468},
966+
"usage": {
967+
"inputTokens": 1234,
968+
"outputTokens": 1234,
969+
"totalTokens": 2468,
970+
"cacheReadInputTokens": 128,
971+
"cacheWriteInputTokens": 512,
972+
},
931973
"metrics": {"latencyMs": 1234},
932974
}
933975
},

tests/strands/models/test_litellm.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,15 @@ async def test_stream(litellm_client, model, alist):
146146
mock_event_3 = unittest.mock.Mock(choices=[unittest.mock.Mock(finish_reason=None, delta=mock_delta_3)])
147147
mock_event_4 = unittest.mock.Mock(choices=[unittest.mock.Mock(finish_reason=None, delta=mock_delta_4)])
148148
mock_event_5 = unittest.mock.Mock(choices=[unittest.mock.Mock(finish_reason="tool_calls", delta=mock_delta_5)])
149-
mock_event_6 = unittest.mock.Mock()
149+
mock_event_6 = unittest.mock.Mock(
150+
usage=unittest.mock.Mock(
151+
prompt_tokens_details=unittest.mock.Mock(
152+
audio_tokens=None, cached_tokens=0, text_tokens=None, image_tokens=None
153+
),
154+
cache_creation_input_tokens=0,
155+
cache_read_input_tokens=0,
156+
)
157+
)
150158

151159
litellm_client.chat.completions.create.return_value = iter(
152160
[mock_event_1, mock_event_2, mock_event_3, mock_event_4, mock_event_5, mock_event_6]

tests/strands/models/test_llamaapi.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ def test_format_chunk_metadata(model):
346346
"inputTokens": 100,
347347
"outputTokens": 50,
348348
"totalTokens": 150,
349+
"cacheReadInputTokens": 0,
350+
"cacheWriteInputTokens": 0,
349351
},
350352
"metrics": {
351353
"latencyMs": 0,

tests/strands/models/test_mistral.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,8 @@ def test_format_chunk_metadata(model):
391391
"inputTokens": 100,
392392
"outputTokens": 50,
393393
"totalTokens": 150,
394+
"cacheReadInputTokens": 0,
395+
"cacheWriteInputTokens": 0,
394396
},
395397
"metrics": {
396398
"latencyMs": 250,
@@ -419,6 +421,8 @@ def test_format_chunk_metadata_no_latency(model):
419421
"inputTokens": 100,
420422
"outputTokens": 50,
421423
"totalTokens": 150,
424+
"cacheReadInputTokens": 0,
425+
"cacheWriteInputTokens": 0,
422426
},
423427
"metrics": {
424428
"latencyMs": 0,

tests/strands/models/test_ollama.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,8 @@ def test_format_chunk_metadata(model):
398398
"inputTokens": 100,
399399
"outputTokens": 50,
400400
"totalTokens": 150,
401+
"cacheReadInputTokens": 0,
402+
"cacheWriteInputTokens": 0,
401403
},
402404
"metrics": {
403405
"latencyMs": 1.0,

tests/strands/telemetry/test_metrics.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ def usage(request):
9090
"inputTokens": 1,
9191
"outputTokens": 2,
9292
"totalTokens": 3,
93+
"cacheReadInputTokens": 4,
94+
"cacheWriteInputTokens": 5,
9395
}
9496
if hasattr(request, "param"):
9597
params.update(request.param)
@@ -315,17 +317,15 @@ def test_event_loop_metrics_update_usage(usage, event_loop_metrics, mock_get_met
315317
event_loop_metrics.update_usage(usage)
316318

317319
tru_usage = event_loop_metrics.accumulated_usage
318-
exp_usage = Usage(
319-
inputTokens=3,
320-
outputTokens=6,
321-
totalTokens=9,
322-
)
320+
exp_usage = Usage(inputTokens=3, outputTokens=6, totalTokens=9, cacheReadInputTokens=12, cacheWriteInputTokens=15)
323321

324322
assert tru_usage == exp_usage
325323
mock_get_meter_provider.return_value.get_meter.assert_called()
326324
metrics_client = event_loop_metrics._metrics_client
327325
metrics_client.event_loop_input_tokens.record.assert_called()
328326
metrics_client.event_loop_output_tokens.record.assert_called()
327+
metrics_client.event_loop_input_tokens_cache_read.record.assert_called()
328+
metrics_client.event_loop_input_tokens_cache_write.record.assert_called()
329329

330330

331331
def test_event_loop_metrics_update_metrics(metrics, event_loop_metrics, mock_get_meter_provider):
@@ -358,6 +358,8 @@ def test_event_loop_metrics_get_summary(trace, tool, event_loop_metrics, mock_ge
358358
"inputTokens": 0,
359359
"outputTokens": 0,
360360
"totalTokens": 0,
361+
"cacheReadInputTokens": 0,
362+
"cacheWriteInputTokens": 0,
361363
},
362364
"average_cycle_time": 0,
363365
"tool_usage": {
@@ -394,7 +396,7 @@ def test_event_loop_metrics_get_summary(trace, tool, event_loop_metrics, mock_ge
394396
{},
395397
"Event Loop Metrics Summary:\n"
396398
"├─ Cycles: total=0, avg_time=0.000s, total_time=0.000s\n"
397-
"├─ Tokens: in=0, out=0, total=0\n"
399+
"├─ Tokens: in=0 (cache_write=0), out=0, total=0 (cache_read=0)\n"
398400
"├─ Bedrock Latency: 0ms\n"
399401
"├─ Tool Usage:\n"
400402
" └─ tool1:\n"
@@ -412,7 +414,7 @@ def test_event_loop_metrics_get_summary(trace, tool, event_loop_metrics, mock_ge
412414
{},
413415
"Event Loop Metrics Summary:\n"
414416
"├─ Cycles: total=0, avg_time=0.000s, total_time=0.000s\n"
415-
"├─ Tokens: in=0, out=0, total=0\n"
417+
"├─ Tokens: in=0 (cache_write=0), out=0, total=0 (cache_read=0)\n"
416418
"├─ Bedrock Latency: 0ms\n"
417419
"├─ Tool Usage:\n"
418420
" └─ tool1:\n"

0 commit comments

Comments
 (0)