From 2c9111dc44785f6c3fdbb70895bf3d7e8fd90dbd Mon Sep 17 00:00:00 2001 From: perseus <51974392+tcconnally@users.noreply.github.com> Date: Mon, 15 Jun 2026 20:27:02 +0000 Subject: [PATCH 1/2] fix: skip response_format for Deepseek provider Deepseek's API returns 'response_format type is unavailable now' when the response_format parameter is included. Added a provider blocklist check in both base_llm.py (constant) and openai/completion.py (gate). Closes #5990 --- lib/crewai/src/crewai/llms/base_llm.py | 4 ++++ lib/crewai/src/crewai/llms/providers/openai/completion.py | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/crewai/src/crewai/llms/base_llm.py b/lib/crewai/src/crewai/llms/base_llm.py index 94d5eb6b9f..fe3df746ed 100644 --- a/lib/crewai/src/crewai/llms/base_llm.py +++ b/lib/crewai/src/crewai/llms/base_llm.py @@ -126,6 +126,10 @@ def get_current_call_id() -> str: return call_id +# Providers that do not support the response_format parameter. +# Deepseek: returns "response_format type is unavailable now" +PROVIDERS_WITHOUT_RESPONSE_FORMAT: set[str] = {"deepseek"} + class BaseLLM(BaseModel, ABC): """Abstract base class for LLM implementations. diff --git a/lib/crewai/src/crewai/llms/providers/openai/completion.py b/lib/crewai/src/crewai/llms/providers/openai/completion.py index d8972e1de4..202ac7f00b 100644 --- a/lib/crewai/src/crewai/llms/providers/openai/completion.py +++ b/lib/crewai/src/crewai/llms/providers/openai/completion.py @@ -1569,7 +1569,13 @@ def _prepare_completion_params( if self.is_o1_model and self.reasoning_effort: params["reasoning_effort"] = self.reasoning_effort - if self.response_format is not None: + # Skip response_format for providers that don't support it + # (e.g., Deepseek returns "response_format type is unavailable") + if ( + self.response_format is not None + and self._extract_provider(self.model) + not in {"deepseek"} + ): if isinstance(self.response_format, type) and issubclass( self.response_format, BaseModel ): From 45c8aa790905e2cdb482dab2d38cd23992f4165a Mon Sep 17 00:00:00 2001 From: perseus <51974392+tcconnally@users.noreply.github.com> Date: Mon, 15 Jun 2026 21:26:25 +0000 Subject: [PATCH 2/2] refactor: use PROVIDERS_WITHOUT_RESPONSE_FORMAT constant from base_llm Addresses CodeRabbit review: import the centralized provider blocklist instead of duplicating a hardcoded set literal. --- lib/crewai/src/crewai/llms/providers/openai/completion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/crewai/src/crewai/llms/providers/openai/completion.py b/lib/crewai/src/crewai/llms/providers/openai/completion.py index 202ac7f00b..59a635e22d 100644 --- a/lib/crewai/src/crewai/llms/providers/openai/completion.py +++ b/lib/crewai/src/crewai/llms/providers/openai/completion.py @@ -30,7 +30,7 @@ from crewai.events.types.llm_events import LLMCallType from crewai.llms._finish_reason_utils import extract_choices_finish_reason_and_id -from crewai.llms.base_llm import BaseLLM, JsonResponseFormat, llm_call_context +from crewai.llms.base_llm import PROVIDERS_WITHOUT_RESPONSE_FORMAT, BaseLLM, JsonResponseFormat, llm_call_context from crewai.llms.hooks.base import BaseInterceptor from crewai.llms.hooks.transport import AsyncHTTPTransport, HTTPTransport from crewai.llms.providers.utils.common import safe_tool_conversion @@ -1574,7 +1574,7 @@ def _prepare_completion_params( if ( self.response_format is not None and self._extract_provider(self.model) - not in {"deepseek"} + not in PROVIDERS_WITHOUT_RESPONSE_FORMAT ): if isinstance(self.response_format, type) and issubclass( self.response_format, BaseModel