From 37526c693bba8bf6c67335fcc621a40f1f854e89 Mon Sep 17 00:00:00 2001 From: Vidit Ostwal <110953813+Vidit-Ostwal@users.noreply.github.com> Date: Sat, 29 Nov 2025 07:03:53 +0530 Subject: [PATCH] Fixing ChatCompletionsClinet call (#3910) * Fixing ChatCompletionsClinet call * Moving from json-object -> JsonSchemaFormat * Regex handling * Adding additionalProperties explicitly * fix: ensure additionalProperties is recursive --------- Co-authored-by: Greyson LaLonde Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com> --- .../crewai/llms/providers/azure/completion.py | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/crewai/src/crewai/llms/providers/azure/completion.py b/lib/crewai/src/crewai/llms/providers/azure/completion.py index e79bb72f2..0fc7a5f82 100644 --- a/lib/crewai/src/crewai/llms/providers/azure/completion.py +++ b/lib/crewai/src/crewai/llms/providers/azure/completion.py @@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any from pydantic import BaseModel from crewai.utilities.agent_utils import is_context_length_exceeded +from crewai.utilities.converter import generate_model_description from crewai.utilities.exceptions.context_window_exceeding_exception import ( LLMContextLengthExceededError, ) @@ -26,6 +27,7 @@ try: from azure.ai.inference.models import ( ChatCompletions, ChatCompletionsToolCall, + JsonSchemaFormat, StreamingChatCompletionsUpdate, ) from azure.core.credentials import ( @@ -278,13 +280,16 @@ class AzureCompletion(BaseLLM): } if response_model and self.is_openai_model: - params["response_format"] = { - "type": "json_schema", - "json_schema": { - "name": response_model.__name__, - "schema": response_model.model_json_schema(), - }, - } + model_description = generate_model_description(response_model) + json_schema_info = model_description["json_schema"] + json_schema_name = json_schema_info["name"] + + params["response_format"] = JsonSchemaFormat( + name=json_schema_name, + schema=json_schema_info["schema"], + description=f"Schema for {json_schema_name}", + strict=json_schema_info["strict"], + ) # Only include model parameter for non-Azure OpenAI endpoints # Azure OpenAI endpoints have the deployment name in the URL @@ -311,8 +316,8 @@ class AzureCompletion(BaseLLM): params["tool_choice"] = "auto" additional_params = self.additional_params - additional_drop_params = additional_params.get('additional_drop_params') - drop_params = additional_params.get('drop_params') + additional_drop_params = additional_params.get("additional_drop_params") + drop_params = additional_params.get("drop_params") if drop_params and isinstance(additional_drop_params, list): for drop_param in additional_drop_params: