@@ -141,14 +141,29 @@ async def test_sync_request_text_response(allow_model_requests: None):
141
141
142
142
result = await agent .run ('hello' )
143
143
assert result .output == 'world'
144
- assert result .usage () == snapshot (Usage (requests = 1 , request_tokens = 5 , response_tokens = 10 , total_tokens = 15 ))
145
-
144
+ assert result .usage () == snapshot (
145
+ Usage (
146
+ requests = 1 ,
147
+ request_tokens = 5 ,
148
+ response_tokens = 10 ,
149
+ total_tokens = 15 ,
150
+ details = {'input_tokens' : 5 , 'output_tokens' : 10 },
151
+ )
152
+ )
146
153
# reset the index so we get the same response again
147
154
mock_client .index = 0 # type: ignore
148
155
149
156
result = await agent .run ('hello' , message_history = result .new_messages ())
150
157
assert result .output == 'world'
151
- assert result .usage () == snapshot (Usage (requests = 1 , request_tokens = 5 , response_tokens = 10 , total_tokens = 15 ))
158
+ assert result .usage () == snapshot (
159
+ Usage (
160
+ requests = 1 ,
161
+ request_tokens = 5 ,
162
+ response_tokens = 10 ,
163
+ total_tokens = 15 ,
164
+ details = {'input_tokens' : 5 , 'output_tokens' : 10 },
165
+ )
166
+ )
152
167
assert result .all_messages () == snapshot (
153
168
[
154
169
ModelRequest (parts = [UserPromptPart (content = 'hello' , timestamp = IsNow (tz = timezone .utc ))]),
@@ -167,6 +182,38 @@ async def test_sync_request_text_response(allow_model_requests: None):
167
182
)
168
183
169
184
185
+ async def test_async_request_prompt_caching (allow_model_requests : None ):
186
+ c = completion_message (
187
+ [TextBlock (text = 'world' , type = 'text' )],
188
+ usage = AnthropicUsage (
189
+ input_tokens = 3 ,
190
+ output_tokens = 5 ,
191
+ cache_creation_input_tokens = 4 ,
192
+ cache_read_input_tokens = 6 ,
193
+ ),
194
+ )
195
+ mock_client = MockAnthropic .create_mock (c )
196
+ m = AnthropicModel ('claude-3-5-haiku-latest' , provider = AnthropicProvider (anthropic_client = mock_client ))
197
+ agent = Agent (m )
198
+
199
+ result = await agent .run ('hello' )
200
+ assert result .output == 'world'
201
+ assert result .usage () == snapshot (
202
+ Usage (
203
+ requests = 1 ,
204
+ request_tokens = 13 ,
205
+ response_tokens = 5 ,
206
+ total_tokens = 18 ,
207
+ details = {
208
+ 'input_tokens' : 3 ,
209
+ 'output_tokens' : 5 ,
210
+ 'cache_creation_input_tokens' : 4 ,
211
+ 'cache_read_input_tokens' : 6 ,
212
+ },
213
+ )
214
+ )
215
+
216
+
170
217
async def test_async_request_text_response (allow_model_requests : None ):
171
218
c = completion_message (
172
219
[TextBlock (text = 'world' , type = 'text' )],
@@ -178,7 +225,15 @@ async def test_async_request_text_response(allow_model_requests: None):
178
225
179
226
result = await agent .run ('hello' )
180
227
assert result .output == 'world'
181
- assert result .usage () == snapshot (Usage (requests = 1 , request_tokens = 3 , response_tokens = 5 , total_tokens = 8 ))
228
+ assert result .usage () == snapshot (
229
+ Usage (
230
+ requests = 1 ,
231
+ request_tokens = 3 ,
232
+ response_tokens = 5 ,
233
+ total_tokens = 8 ,
234
+ details = {'input_tokens' : 3 , 'output_tokens' : 5 },
235
+ )
236
+ )
182
237
183
238
184
239
async def test_request_structured_response (allow_model_requests : None ):
@@ -551,7 +606,15 @@ async def my_tool(first: str, second: str) -> int:
551
606
]
552
607
)
553
608
assert result .is_complete
554
- assert result .usage () == snapshot (Usage (requests = 2 , request_tokens = 20 , response_tokens = 5 , total_tokens = 25 ))
609
+ assert result .usage () == snapshot (
610
+ Usage (
611
+ requests = 2 ,
612
+ request_tokens = 20 ,
613
+ response_tokens = 5 ,
614
+ total_tokens = 25 ,
615
+ details = {'input_tokens' : 20 , 'output_tokens' : 5 },
616
+ )
617
+ )
555
618
assert tool_called
556
619
557
620
0 commit comments