|
10 | 10 | import logging |
11 | 11 | from typing import TYPE_CHECKING, Any, Literal, cast |
12 | 12 |
|
13 | | -from pydantic import BaseModel, GetCoreSchemaHandler |
| 13 | +from pydantic import BaseModel, GetCoreSchemaHandler, ValidationError |
14 | 14 | from pydantic_core import CoreSchema, core_schema |
15 | 15 |
|
16 | 16 | from crewai.agents.agent_builder.base_agent_executor_mixin import CrewAgentExecutorMixin |
@@ -244,7 +244,20 @@ def _invoke_loop(self) -> AgentFinish: |
244 | 244 | response_model=self.response_model, |
245 | 245 | executor_context=self, |
246 | 246 | ) |
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] |
248 | 261 |
|
249 | 262 | if isinstance(formatted_answer, AgentAction): |
250 | 263 | # Extract agent fingerprint if available |
@@ -278,7 +291,7 @@ def _invoke_loop(self) -> AgentFinish: |
278 | 291 | ) |
279 | 292 |
|
280 | 293 | 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] |
282 | 295 |
|
283 | 296 | except OutputParserError as e: |
284 | 297 | formatted_answer = handle_output_parser_exception( # type: ignore[assignment] |
@@ -398,7 +411,21 @@ async def _ainvoke_loop(self) -> AgentFinish: |
398 | 411 | response_model=self.response_model, |
399 | 412 | executor_context=self, |
400 | 413 | ) |
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] |
402 | 429 |
|
403 | 430 | if isinstance(formatted_answer, AgentAction): |
404 | 431 | fingerprint_context = {} |
@@ -431,7 +458,7 @@ async def _ainvoke_loop(self) -> AgentFinish: |
431 | 458 | ) |
432 | 459 |
|
433 | 460 | 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] |
435 | 462 |
|
436 | 463 | except OutputParserError as e: |
437 | 464 | formatted_answer = handle_output_parser_exception( # type: ignore[assignment] |
|
0 commit comments