@@ -224,24 +224,70 @@ class ListModelsProvider(BaseOpenAIProvider):
224224
225225
226226@pytest .mark .asyncio
227- async def test_stream_with_response_format_raises () -> None :
227+ async def test_stream_with_dict_response_format_uses_create () -> None :
228228 class TestProvider (BaseOpenAIProvider ):
229229 PROVIDER_NAME = "TestProvider"
230230 ENV_API_KEY_NAME = "TEST_API_KEY"
231231 PROVIDER_DOCUMENTATION_URL = "https://example.com"
232232
233- with patch ("any_llm.providers.openai.base.AsyncOpenAI" ):
233+ response_format = {"type" : "json_object" }
234+
235+ with patch ("any_llm.providers.openai.base.AsyncOpenAI" ) as mock_openai_class :
236+ mock_client = AsyncMock ()
237+ mock_openai_class .return_value = mock_client
238+ mock_client .chat .completions .create = AsyncMock (return_value = MagicMock ())
239+
234240 provider = TestProvider (api_key = "test-key" )
235241
236- with pytest .raises (ValueError , match = "stream is not supported for response_format" ):
237- await provider ._acompletion (
238- CompletionParams (
239- model_id = "test-model" ,
240- messages = [{"role" : "user" , "content" : "Hello" }],
241- stream = True ,
242- response_format = {"type" : "json_object" },
243- )
242+ await provider ._acompletion (
243+ CompletionParams (
244+ model_id = "test-model" ,
245+ messages = [{"role" : "user" , "content" : "Hello" }],
246+ stream = True ,
247+ response_format = response_format ,
244248 )
249+ )
250+
251+ mock_client .chat .completions .create .assert_awaited_once_with (
252+ model = "test-model" ,
253+ messages = [{"role" : "user" , "content" : "Hello" }],
254+ stream = True ,
255+ response_format = response_format ,
256+ )
257+ mock_client .chat .completions .parse .assert_not_called ()
258+
259+
260+ @pytest .mark .asyncio
261+ async def test_stream_with_basemodel_response_format_uses_create_json_schema () -> None :
262+ class TestProvider (BaseOpenAIProvider ):
263+ PROVIDER_NAME = "TestProvider"
264+ ENV_API_KEY_NAME = "TEST_API_KEY"
265+ PROVIDER_DOCUMENTATION_URL = "https://example.com"
266+
267+ with patch ("any_llm.providers.openai.base.AsyncOpenAI" ) as mock_openai_class :
268+ mock_client = AsyncMock ()
269+ mock_openai_class .return_value = mock_client
270+ mock_client .chat .completions .create = AsyncMock (return_value = MagicMock ())
271+
272+ provider = TestProvider (api_key = "test-key" )
273+
274+ await provider ._acompletion (
275+ CompletionParams (
276+ model_id = "test-model" ,
277+ messages = [{"role" : "user" , "content" : "Hello" }],
278+ stream = True ,
279+ response_format = _City ,
280+ )
281+ )
282+
283+ create_kwargs = mock_client .chat .completions .create .call_args .kwargs
284+ assert create_kwargs ["stream" ] is True
285+ assert create_kwargs ["response_format" ]["type" ] == "json_schema"
286+ assert create_kwargs ["response_format" ]["json_schema" ]["name" ] == "_City"
287+ assert create_kwargs ["response_format" ]["json_schema" ]["schema" ]["properties" ] == {
288+ "city_name" : {"title" : "City Name" , "type" : "string" }
289+ }
290+ mock_client .chat .completions .parse .assert_not_called ()
245291
246292
247293def test_base_provider_maps_max_tokens_to_max_completion_tokens () -> None :
0 commit comments