fix: ensure response models checked before parsing attempt

final answer was incorrectly trying to parse response models
This commit is contained in:
Greyson LaLonde
2026-01-06 17:52:41 -05:00
parent 57d91439a7
commit b754dc19fb

View File

@@ -10,7 +10,7 @@ from collections.abc import Callable
import logging import logging
from typing import TYPE_CHECKING, Any, Literal, cast 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 pydantic_core import CoreSchema, core_schema
from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin
@@ -244,7 +244,20 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
response_model=self.response_model, response_model=self.response_model,
executor_context=self, 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): if isinstance(formatted_answer, AgentAction):
# Extract agent fingerprint if available # Extract agent fingerprint if available
@@ -278,7 +291,7 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
) )
self._invoke_step_callback(formatted_answer) # type: ignore[arg-type] 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: except OutputParserError as e:
formatted_answer = handle_output_parser_exception( # type: ignore[assignment] formatted_answer = handle_output_parser_exception( # type: ignore[assignment]
@@ -398,7 +411,21 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
response_model=self.response_model, response_model=self.response_model,
executor_context=self, 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): if isinstance(formatted_answer, AgentAction):
fingerprint_context = {} fingerprint_context = {}
@@ -431,7 +458,7 @@ class CrewAgentExecutor(CrewAgentExecutorMixin):
) )
self._invoke_step_callback(formatted_answer) # type: ignore[arg-type] 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: except OutputParserError as e:
formatted_answer = handle_output_parser_exception( # type: ignore[assignment] formatted_answer = handle_output_parser_exception( # type: ignore[assignment]