@@ -332,6 +332,61 @@ def test_compute_cost_model_name_processing(self, mock_metrics):
332332 # Should strip provider prefix
333333 call_kwargs = mock_cost .call_args [1 ]
334334 assert call_kwargs ["model" ] == "gpt-4o-mini"
335+ assert call_kwargs ["custom_llm_provider" ] == "provider"
336+
337+ def test_compute_cost_passes_provider_to_litellm_cost_calculator (
338+ self , mock_metrics
339+ ):
340+ telemetry = Telemetry (
341+ model_name = "vertex_ai/claude-sonnet-4-5@20250929" ,
342+ metrics = mock_metrics ,
343+ )
344+
345+ resp = ModelResponse (
346+ id = "test-id" ,
347+ choices = [],
348+ created = 1234567890 ,
349+ model = "claude-sonnet-4-5@20250929" ,
350+ object = "chat.completion" ,
351+ )
352+
353+ with patch (
354+ "openhands.sdk.llm.utils.telemetry.litellm_completion_cost"
355+ ) as mock_cost :
356+ mock_cost .return_value = 0.10
357+ telemetry ._compute_cost (resp )
358+
359+ mock_cost .assert_called_once ()
360+ kwargs = mock_cost .call_args .kwargs
361+ assert kwargs ["model" ] == "claude-sonnet-4-5@20250929"
362+ assert kwargs ["custom_llm_provider" ] == "vertex_ai"
363+
364+ def test_compute_cost_passes_provider_to_litellm_cost_calculator_azure (
365+ self , mock_metrics
366+ ):
367+ telemetry = Telemetry (
368+ model_name = "azure/responses/gpt-5.2-chat" ,
369+ metrics = mock_metrics ,
370+ )
371+
372+ resp = ModelResponse (
373+ id = "test-id" ,
374+ choices = [],
375+ created = 1234567890 ,
376+ model = "gpt-5.2-chat" ,
377+ object = "chat.completion" ,
378+ )
379+
380+ with patch (
381+ "openhands.sdk.llm.utils.telemetry.litellm_completion_cost"
382+ ) as mock_cost :
383+ mock_cost .return_value = 0.05
384+ telemetry ._compute_cost (resp )
385+
386+ mock_cost .assert_called_once ()
387+ kwargs = mock_cost .call_args .kwargs
388+ assert kwargs ["model" ] == "responses/gpt-5.2-chat"
389+ assert kwargs ["custom_llm_provider" ] == "azure"
335390
336391
337392class TestTelemetryLogging :
0 commit comments