From eed2ffde5f05111530705a29a556fe5c83c0f533 Mon Sep 17 00:00:00 2001 From: Greyson LaLonde Date: Wed, 3 Sep 2025 23:23:36 -0400 Subject: [PATCH] fix: resolve additional mypy type errors - Fix tool_usage.py: proper type annotations for result and fingerprint metadata - Fix lite_agent.py: proper Union type for guardrail callable accepting both LiteAgentOutput and TaskOutput - Add missing return type annotations to task_output_storage_handler.py methods - Fix crew.py: replace Json generic check with str, remove unused type:ignore and redundant cast --- src/crewai/crew.py | 6 +++--- src/crewai/lite_agent.py | 6 ++++-- src/crewai/tools/tool_usage.py | 6 +++--- src/crewai/utilities/task_output_storage_handler.py | 4 ++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/crewai/crew.py b/src/crewai/crew.py index a66742770..2ed94b3ca 100644 --- a/src/crewai/crew.py +++ b/src/crewai/crew.py @@ -273,7 +273,7 @@ class Crew(FlowTrackable, BaseModel): """ # TODO: Improve typing - return json.loads(v) if isinstance(v, Json) else v + return json.loads(v) if isinstance(v, str) else v @model_validator(mode="after") def set_private_attrs(self) -> Self: @@ -641,7 +641,7 @@ class Crew(FlowTrackable, BaseModel): for agent in self.agents: agent.i18n = i18n - agent.crew = self # type: ignore[attr-defined] + agent.crew = self agent.set_knowledge(crew_embedder=self.embedder) # TODO: Create an AgentFunctionCalling protocol for future refactoring if not agent.function_calling_llm: # type: ignore # "BaseAgent" has no attribute "function_calling_llm" @@ -983,7 +983,7 @@ class Crew(FlowTrackable, BaseModel): if hasattr(task_agent, "get_delegation_tools"): delegation_tools = task_agent.get_delegation_tools(agents) # Cast delegation_tools to the expected type for _merge_tools - return self._merge_tools(tools, cast(list[BaseTool], delegation_tools)) + return self._merge_tools(tools, delegation_tools) return cast(list[BaseTool], tools) def _add_multimodal_tools( diff --git a/src/crewai/lite_agent.py b/src/crewai/lite_agent.py index 6d4f187a7..c65c0c155 100644 --- a/src/crewai/lite_agent.py +++ b/src/crewai/lite_agent.py @@ -5,6 +5,7 @@ from collections.abc import Callable from typing import ( Any, Optional, + Union, cast, get_args, get_origin, @@ -39,6 +40,7 @@ from crewai.events.types.logging_events import AgentLogsExecutionEvent from crewai.flow.flow_trackable import FlowTrackable from crewai.llm import LLM from crewai.llms.base_llm import BaseLLM +from crewai.task import TaskOutput from crewai.tools.base_tool import BaseTool from crewai.tools.structured_tool import CrewStructuredTool from crewai.utilities import I18N @@ -185,8 +187,8 @@ class LiteAgent(FlowTrackable, BaseModel): _messages: list[dict[str, str]] = PrivateAttr(default_factory=list) _iterations: int = PrivateAttr(default=0) _printer: Printer = PrivateAttr(default_factory=Printer) - _guardrail: Optional[Callable[[LiteAgentOutput], tuple[bool, Any]]] = PrivateAttr( - default=None + _guardrail: Optional[Callable[[LiteAgentOutput | TaskOutput], tuple[bool, Any]]] = ( + PrivateAttr(default=None) ) _guardrail_retry_count: int = PrivateAttr(default=0) diff --git a/src/crewai/tools/tool_usage.py b/src/crewai/tools/tool_usage.py index 6b8e4075f..5f01b0b6d 100644 --- a/src/crewai/tools/tool_usage.py +++ b/src/crewai/tools/tool_usage.py @@ -199,7 +199,7 @@ class ToolUsage: started_at = time.time() from_cache = False - result = None # type: ignore + result: str | None = None if self.tools_handler and self.tools_handler.cache: result = self.tools_handler.cache.read( @@ -243,7 +243,7 @@ class ToolUsage: try: acceptable_args = tool.args_schema.model_json_schema()[ "properties" - ].keys() # type: ignore + ].keys() arguments = { k: v for k, v in calling.arguments.items() @@ -668,7 +668,7 @@ class ToolUsage: return event_data - def _add_fingerprint_metadata(self, arguments: dict) -> dict: + def _add_fingerprint_metadata(self, arguments: dict[str, Any]) -> dict[str, Any]: """Add fingerprint metadata to tool arguments if available. Args: diff --git a/src/crewai/utilities/task_output_storage_handler.py b/src/crewai/utilities/task_output_storage_handler.py index ccd381e6f..b6ae3929c 100644 --- a/src/crewai/utilities/task_output_storage_handler.py +++ b/src/crewai/utilities/task_output_storage_handler.py @@ -33,7 +33,7 @@ class TaskOutputStorageHandler: def __init__(self) -> None: self.storage = KickoffTaskOutputsSQLiteStorage() - def update(self, task_index: int, log: dict[str, Any]): + def update(self, task_index: int, log: dict[str, Any]) -> None: saved_outputs = self.load() if saved_outputs is None: raise ValueError("Logs cannot be None") @@ -60,7 +60,7 @@ class TaskOutputStorageHandler: task_index: int, inputs: dict[str, Any] | None = None, was_replayed: bool = False, - ): + ) -> None: inputs = inputs or {} self.storage.add(task, output, task_index, was_replayed, inputs)