@@ -22,7 +22,14 @@ def test_usage_add_aggregates_all_fields():
2222 total_tokens = 15 ,
2323 )
2424
25- u1 .add (u2 )
25+ u1 .add (
26+ u2 ,
27+ metadata = {
28+ "model_name" : "gpt-5" ,
29+ "agent_name" : "test-agent" ,
30+ "response_id" : "resp-1" ,
31+ },
32+ )
2633
2734 assert u1 .requests == 3
2835 assert u1 .input_tokens == 17
@@ -43,7 +50,14 @@ def test_usage_add_aggregates_with_none_values():
4350 total_tokens = 15 ,
4451 )
4552
46- u1 .add (u2 )
53+ u1 .add (
54+ u2 ,
55+ metadata = {
56+ "model_name" : "gpt-5" ,
57+ "agent_name" : "test-agent" ,
58+ "response_id" : "resp-1" ,
59+ },
60+ )
4761
4862 assert u1 .requests == 2
4963 assert u1 .input_tokens == 7
@@ -61,13 +75,21 @@ def test_request_usage_creation():
6175 total_tokens = 300 ,
6276 input_tokens_details = InputTokensDetails (cached_tokens = 10 ),
6377 output_tokens_details = OutputTokensDetails (reasoning_tokens = 20 ),
78+ metadata = {
79+ "model_name" : "gpt-5" ,
80+ "agent_name" : "test-agent" ,
81+ "response_id" : "resp-123" ,
82+ },
6483 )
6584
6685 assert request_usage .input_tokens == 100
6786 assert request_usage .output_tokens == 200
6887 assert request_usage .total_tokens == 300
6988 assert request_usage .input_tokens_details .cached_tokens == 10
7089 assert request_usage .output_tokens_details .reasoning_tokens == 20
90+ assert request_usage .metadata ["model_name" ] == "gpt-5"
91+ assert request_usage .metadata ["agent_name" ] == "test-agent"
92+ assert request_usage .metadata ["response_id" ] == "resp-123"
7193
7294
7395def test_usage_add_preserves_single_request ():
@@ -82,7 +104,14 @@ def test_usage_add_preserves_single_request():
82104 total_tokens = 300 ,
83105 )
84106
85- u1 .add (u2 )
107+ u1 .add (
108+ u2 ,
109+ metadata = {
110+ "model_name" : "gpt-5" ,
111+ "agent_name" : "test-agent" ,
112+ "response_id" : "resp-1" ,
113+ },
114+ )
86115
87116 # Should preserve the request usage details
88117 assert len (u1 .request_usage_entries ) == 1
@@ -92,6 +121,9 @@ def test_usage_add_preserves_single_request():
92121 assert request_usage .total_tokens == 300
93122 assert request_usage .input_tokens_details .cached_tokens == 10
94123 assert request_usage .output_tokens_details .reasoning_tokens == 20
124+ assert request_usage .metadata ["model_name" ] == "gpt-5"
125+ assert request_usage .metadata ["agent_name" ] == "test-agent"
126+ assert request_usage .metadata ["response_id" ] == "resp-1"
95127
96128
97129def test_usage_add_ignores_zero_token_requests ():
@@ -106,7 +138,14 @@ def test_usage_add_ignores_zero_token_requests():
106138 total_tokens = 0 ,
107139 )
108140
109- u1 .add (u2 )
141+ u1 .add (
142+ u2 ,
143+ metadata = {
144+ "model_name" : "gpt-5" ,
145+ "agent_name" : "test-agent" ,
146+ "response_id" : "resp-1" ,
147+ },
148+ )
110149
111150 # Should not create a request_usage_entry for zero tokens
112151 assert len (u1 .request_usage_entries ) == 0
@@ -124,7 +163,14 @@ def test_usage_add_ignores_multi_request_usage():
124163 total_tokens = 300 ,
125164 )
126165
127- u1 .add (u2 )
166+ u1 .add (
167+ u2 ,
168+ metadata = {
169+ "model_name" : "gpt-5" ,
170+ "agent_name" : "test-agent" ,
171+ "response_id" : "resp-1" ,
172+ },
173+ )
128174
129175 # Should not create a request usage entry for multi-request usage
130176 assert len (u1 .request_usage_entries ) == 0
@@ -142,7 +188,14 @@ def test_usage_add_merges_existing_request_usage_entries():
142188 output_tokens_details = OutputTokensDetails (reasoning_tokens = 20 ),
143189 total_tokens = 300 ,
144190 )
145- u1 .add (u2 )
191+ u1 .add (
192+ u2 ,
193+ metadata = {
194+ "model_name" : "gpt-5" ,
195+ "agent_name" : "agent-1" ,
196+ "response_id" : "resp-1" ,
197+ },
198+ )
146199
147200 # Create second usage with request_usage_entries
148201 u3 = Usage (
@@ -154,7 +207,14 @@ def test_usage_add_merges_existing_request_usage_entries():
154207 total_tokens = 125 ,
155208 )
156209
157- u1 .add (u3 )
210+ u1 .add (
211+ u3 ,
212+ metadata = {
213+ "model_name" : "gpt-5" ,
214+ "agent_name" : "agent-2" ,
215+ "response_id" : "resp-2" ,
216+ },
217+ )
158218
159219 # Should have both request_usage_entries
160220 assert len (u1 .request_usage_entries ) == 2
@@ -164,12 +224,16 @@ def test_usage_add_merges_existing_request_usage_entries():
164224 assert first .input_tokens == 100
165225 assert first .output_tokens == 200
166226 assert first .total_tokens == 300
227+ assert first .metadata ["agent_name" ] == "agent-1"
228+ assert first .metadata ["response_id" ] == "resp-1"
167229
168230 # Second request
169231 second = u1 .request_usage_entries [1 ]
170232 assert second .input_tokens == 50
171233 assert second .output_tokens == 75
172234 assert second .total_tokens == 125
235+ assert second .metadata ["agent_name" ] == "agent-2"
236+ assert second .metadata ["response_id" ] == "resp-2"
173237
174238
175239def test_usage_add_with_pre_existing_request_usage_entries ():
@@ -185,7 +249,14 @@ def test_usage_add_with_pre_existing_request_usage_entries():
185249 output_tokens_details = OutputTokensDetails (reasoning_tokens = 20 ),
186250 total_tokens = 300 ,
187251 )
188- u1 .add (u2 )
252+ u1 .add (
253+ u2 ,
254+ metadata = {
255+ "model_name" : "gpt-5" ,
256+ "agent_name" : "agent-1" ,
257+ "response_id" : "resp-1" ,
258+ },
259+ )
189260
190261 # Create another usage with request_usage_entries
191262 u3 = Usage (
@@ -198,7 +269,14 @@ def test_usage_add_with_pre_existing_request_usage_entries():
198269 )
199270
200271 # Add u3 to u1
201- u1 .add (u3 )
272+ u1 .add (
273+ u3 ,
274+ metadata = {
275+ "model_name" : "gpt-5" ,
276+ "agent_name" : "agent-2" ,
277+ "response_id" : "resp-2" ,
278+ },
279+ )
202280
203281 # Should have both request_usage_entries
204282 assert len (u1 .request_usage_entries ) == 2
@@ -228,7 +306,14 @@ def test_anthropic_cost_calculation_scenario():
228306 output_tokens_details = OutputTokensDetails (reasoning_tokens = 0 ),
229307 total_tokens = 150_000 ,
230308 )
231- usage .add (req1 )
309+ usage .add (
310+ req1 ,
311+ metadata = {
312+ "model_name" : "gpt-5" ,
313+ "agent_name" : "test-agent" ,
314+ "response_id" : "resp-1" ,
315+ },
316+ )
232317
233318 # Second request: 150K input tokens
234319 req2 = Usage (
@@ -239,7 +324,14 @@ def test_anthropic_cost_calculation_scenario():
239324 output_tokens_details = OutputTokensDetails (reasoning_tokens = 0 ),
240325 total_tokens = 225_000 ,
241326 )
242- usage .add (req2 )
327+ usage .add (
328+ req2 ,
329+ metadata = {
330+ "model_name" : "gpt-5" ,
331+ "agent_name" : "test-agent" ,
332+ "response_id" : "resp-2" ,
333+ },
334+ )
243335
244336 # Third request: 80K input tokens
245337 req3 = Usage (
@@ -250,7 +342,14 @@ def test_anthropic_cost_calculation_scenario():
250342 output_tokens_details = OutputTokensDetails (reasoning_tokens = 0 ),
251343 total_tokens = 120_000 ,
252344 )
253- usage .add (req3 )
345+ usage .add (
346+ req3 ,
347+ metadata = {
348+ "model_name" : "gpt-5" ,
349+ "agent_name" : "test-agent" ,
350+ "response_id" : "resp-3" ,
351+ },
352+ )
254353
255354 # Verify aggregated totals
256355 assert usage .requests == 3
0 commit comments