Skip to content

Commit b754dc1

Browse files
fix: ensure response models checked before parsing attempt
final answer was incorrectly trying to parse response models
1 parent 57d9143 commit b754dc1

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

lib/crewai/src/crewai/agents/crew_agent_executor.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import logging
1111
from typing import TYPE_CHECKING, Any, Literal, cast
1212

13-
from pydantic import BaseModel, GetCoreSchemaHandler
13+
from pydantic import BaseModel, GetCoreSchemaHandler, ValidationError
1414
from pydantic_core import CoreSchema, core_schema
1515

1616
from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin
@@ -244,7 +244,20 @@ def _invoke_loop(self) -> AgentFinish:
244244
response_model=self.response_model,
245245
executor_context=self,
246246
)
247-
formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment]
247+
if self.response_model is not None:
248+
try:
249+
self.response_model.model_validate_json(answer)
250+
formatted_answer = AgentFinish(
251+
thought="",
252+
output=answer,
253+
text=answer,
254+
)
255+
except ValidationError:
256+
formatted_answer = process_llm_response(
257+
answer, self.use_stop_words
258+
) # type: ignore[assignment]
259+
else:
260+
formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment]
248261

249262
if isinstance(formatted_answer, AgentAction):
250263
# Extract agent fingerprint if available
@@ -278,7 +291,7 @@ def _invoke_loop(self) -> AgentFinish:
278291
)
279292

280293
self._invoke_step_callback(formatted_answer) # type: ignore[arg-type]
281-
self._append_message(formatted_answer.text) # type: ignore[union-attr,attr-defined]
294+
self._append_message(formatted_answer.text) # type: ignore[union-attr]
282295

283296
except OutputParserError as e:
284297
formatted_answer = handle_output_parser_exception( # type: ignore[assignment]
@@ -398,7 +411,21 @@ async def _ainvoke_loop(self) -> AgentFinish:
398411
response_model=self.response_model,
399412
executor_context=self,
400413
)
401-
formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment]
414+
415+
if self.response_model is not None:
416+
try:
417+
self.response_model.model_validate_json(answer)
418+
formatted_answer = AgentFinish(
419+
thought="",
420+
output=answer,
421+
text=answer,
422+
)
423+
except ValidationError:
424+
formatted_answer = process_llm_response(
425+
answer, self.use_stop_words
426+
) # type: ignore[assignment]
427+
else:
428+
formatted_answer = process_llm_response(answer, self.use_stop_words) # type: ignore[assignment]
402429

403430
if isinstance(formatted_answer, AgentAction):
404431
fingerprint_context = {}
@@ -431,7 +458,7 @@ async def _ainvoke_loop(self) -> AgentFinish:
431458
)
432459

433460
self._invoke_step_callback(formatted_answer) # type: ignore[arg-type]
434-
self._append_message(formatted_answer.text) # type: ignore[union-attr,attr-defined]
461+
self._append_message(formatted_answer.text) # type: ignore[union-attr]
435462

436463
except OutputParserError as e:
437464
formatted_answer = handle_output_parser_exception( # type: ignore[assignment]

0 commit comments

Comments
 (0)