diff --git a/lib/crewai/src/crewai/agents/crew_agent_executor.py b/lib/crewai/src/crewai/agents/crew_agent_executor.py index 45d4f84f3..de19934d6 100644 --- a/lib/crewai/src/crewai/agents/crew_agent_executor.py +++ b/lib/crewai/src/crewai/agents/crew_agent_executor.py @@ -10,7 +10,7 @@ from collections.abc import Callable import logging from typing import TYPE_CHECKING, Any, Literal, cast -from pydantic import BaseModel, GetCoreSchemaHandler +from pydantic import BaseModel, GetCoreSchemaHandler, ValidationError from pydantic_core import CoreSchema, core_schema from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin @@ -244,7 +244,20 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): response_model=self.response_model, executor_context=self, ) - formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment] + if self.response_model is not None: + try: + self.response_model.model_validate_json(answer) + formatted_answer = AgentFinish( + thought="", + output=answer, + text=answer, + ) + except ValidationError: + formatted_answer = process_llm_response( + answer, self.use_stop_words + ) # type: ignore[assignment] + else: + formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment] if isinstance(formatted_answer, AgentAction): # Extract agent fingerprint if available @@ -278,7 +291,7 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): ) self._invoke_step_callback(formatted_answer) # type: ignore[arg-type] - self._append_message(formatted_answer.text) # type: ignore[union-attr,attr-defined] + self._append_message(formatted_answer.text) # type: ignore[union-attr] except OutputParserError as e: formatted_answer = handle_output_parser_exception( # type: ignore[assignment] @@ -398,7 +411,21 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): response_model=self.response_model, executor_context=self, ) - formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment] + + if self.response_model is not None: + try: + self.response_model.model_validate_json(answer) + formatted_answer = AgentFinish( + thought="", + output=answer, + text=answer, + ) + except ValidationError: + formatted_answer = process_llm_response( + answer, self.use_stop_words + ) # type: ignore[assignment] + else: + formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment] if isinstance(formatted_answer, AgentAction): fingerprint_context = {} @@ -431,7 +458,7 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): ) self._invoke_step_callback(formatted_answer) # type: ignore[arg-type] - self._append_message(formatted_answer.text) # type: ignore[union-attr,attr-defined] + self._append_message(formatted_answer.text) # type: ignore[union-attr] except OutputParserError as e: formatted_answer = handle_output_parser_exception( # type: ignore[assignment]