|
5 | 5 |
|
6 | 6 | import pytest
|
7 | 7 | from litellm import Choices, Message, ModelResponse
|
| 8 | +from litellm.types.utils import Usage |
| 9 | +import asyncio |
8 | 10 |
|
9 | 11 | import dspy
|
10 | 12 | from dspy.utils.dummies import DummyLM
|
@@ -307,6 +309,54 @@ def __call__(self, question: str) -> str:
|
307 | 309 | assert results[1].get_lm_usage().keys() == set(["openai/gpt-3.5-turbo"])
|
308 | 310 |
|
309 | 311 |
|
| 312 | +@pytest.mark.asyncio |
| 313 | +async def test_usage_tracker_async_parallel(): |
| 314 | + program = dspy.Predict("question -> answer") |
| 315 | + |
| 316 | + with patch("litellm.acompletion") as mock_completion: |
| 317 | + mock_completion.return_value = ModelResponse( |
| 318 | + choices=[Choices(message=Message(content="{'answer': 'Paris'}"))], |
| 319 | + usage=Usage( |
| 320 | + **{ |
| 321 | + "prompt_tokens": 1117, |
| 322 | + "completion_tokens": 46, |
| 323 | + "total_tokens": 1163, |
| 324 | + "prompt_tokens_details": {"cached_tokens": 0, "audio_tokens": 0}, |
| 325 | + "completion_tokens_details": { |
| 326 | + "reasoning_tokens": 0, |
| 327 | + "audio_tokens": 0, |
| 328 | + "accepted_prediction_tokens": 0, |
| 329 | + "rejected_prediction_tokens": 0, |
| 330 | + }, |
| 331 | + }, |
| 332 | + ), |
| 333 | + model="openai/gpt-4o-mini", |
| 334 | + ) |
| 335 | + |
| 336 | + coroutines = [ |
| 337 | + program.acall(question="What is the capital of France?"), |
| 338 | + program.acall(question="What is the capital of France?"), |
| 339 | + program.acall(question="What is the capital of France?"), |
| 340 | + program.acall(question="What is the capital of France?"), |
| 341 | + ] |
| 342 | + with dspy.settings.context( |
| 343 | + lm=dspy.LM("openai/gpt-4o-mini", cache=False), track_usage=True, adapter=dspy.JSONAdapter() |
| 344 | + ): |
| 345 | + results = await asyncio.gather(*coroutines) |
| 346 | + |
| 347 | + assert results[0].get_lm_usage() is not None |
| 348 | + assert results[1].get_lm_usage() is not None |
| 349 | + |
| 350 | + lm_usage0 = results[0].get_lm_usage()["openai/gpt-4o-mini"] |
| 351 | + lm_usage1 = results[1].get_lm_usage()["openai/gpt-4o-mini"] |
| 352 | + assert lm_usage0["prompt_tokens"] == 1117 |
| 353 | + assert lm_usage1["prompt_tokens"] == 1117 |
| 354 | + assert lm_usage0["completion_tokens"] == 46 |
| 355 | + assert lm_usage1["completion_tokens"] == 46 |
| 356 | + assert lm_usage0["total_tokens"] == 1163 |
| 357 | + assert lm_usage1["total_tokens"] == 1163 |
| 358 | + |
| 359 | + |
310 | 360 | def test_module_history():
|
311 | 361 | class MyProgram(dspy.Module):
|
312 | 362 | def __init__(self, **kwargs):
|
|
0 commit comments