fix: resolve mypy type errors across agent adapters and core modules

This commit is contained in:
Greyson LaLonde
2025-09-04 22:47:18 -04:00
parent 843801f554
commit b44776c367
6 changed files with 34 additions and 20 deletions

View File

@@ -22,8 +22,10 @@ from crewai.utilities import Logger
from crewai.utilities.converter import Converter from crewai.utilities.converter import Converter
try: try:
from langgraph.checkpoint.memory import MemorySaver from langgraph.checkpoint.memory import (
from langgraph.prebuilt import create_react_agent MemorySaver, # type: ignore[import-not-found]
)
from langgraph.prebuilt import create_react_agent # type: ignore[import-not-found]
LANGGRAPH_AVAILABLE = True LANGGRAPH_AVAILABLE = True
except ImportError: except ImportError:
@@ -55,7 +57,7 @@ class LangGraphAgentAdapter(BaseAgentAdapter):
llm: Any = None, llm: Any = None,
max_iterations: int = 10, max_iterations: int = 10,
agent_config: Optional[dict[str, Any]] = None, agent_config: Optional[dict[str, Any]] = None,
**kwargs, **kwargs: Any,
): ):
"""Initialize the LangGraph agent adapter.""" """Initialize the LangGraph agent adapter."""
if not LANGGRAPH_AVAILABLE: if not LANGGRAPH_AVAILABLE:
@@ -198,7 +200,7 @@ class LangGraphAgentAdapter(BaseAgentAdapter):
raise raise
def create_agent_executor( def create_agent_executor(
self, task=None, tools: Optional[list[BaseTool]] = None self, task: Any = None, tools: Optional[list[BaseTool]] = None
) -> None: ) -> None:
"""Configure the LangGraph agent for execution.""" """Configure the LangGraph agent for execution."""
self.configure_tools(tools) self.configure_tools(tools)
@@ -222,6 +224,6 @@ class LangGraphAgentAdapter(BaseAgentAdapter):
"""Convert output format if needed.""" """Convert output format if needed."""
return Converter(llm=llm, text=text, model=model, instructions=instructions) return Converter(llm=llm, text=text, model=model, instructions=instructions)
def configure_structured_output(self, task) -> None: def configure_structured_output(self, task: Any) -> None:
"""Configure the structured output for LangGraph.""" """Configure the structured output for LangGraph."""
self._converter_adapter.configure_structured_output(task) self._converter_adapter.configure_structured_output(task)

View File

@@ -1,4 +1,5 @@
import json import json
from typing import Any
from crewai.agents.agent_adapters.base_converter_adapter import BaseConverterAdapter from crewai.agents.agent_adapters.base_converter_adapter import BaseConverterAdapter
from crewai.utilities.converter import generate_model_description from crewai.utilities.converter import generate_model_description
@@ -7,14 +8,14 @@ from crewai.utilities.converter import generate_model_description
class LangGraphConverterAdapter(BaseConverterAdapter): class LangGraphConverterAdapter(BaseConverterAdapter):
"""Adapter for handling structured output conversion in LangGraph agents""" """Adapter for handling structured output conversion in LangGraph agents"""
def __init__(self, agent_adapter): def __init__(self, agent_adapter: Any) -> None:
"""Initialize the converter adapter with a reference to the agent adapter""" """Initialize the converter adapter with a reference to the agent adapter"""
self.agent_adapter = agent_adapter self.agent_adapter = agent_adapter
self._output_format = None self._output_format: str | None = None
self._schema = None self._schema = None
self._system_prompt_appendix = None self._system_prompt_appendix = None
def configure_structured_output(self, task) -> None: def configure_structured_output(self, task: Any) -> None:
"""Configure the structured output for LangGraph.""" """Configure the structured output for LangGraph."""
if not (task.output_json or task.output_pydantic): if not (task.output_json or task.output_pydantic):
self._output_format = None self._output_format = None

View File

@@ -18,8 +18,8 @@ from crewai.tools.agent_tools.agent_tools import AgentTools
from crewai.utilities import Logger from crewai.utilities import Logger
try: try:
from agents import Agent as OpenAIAgent # type: ignore from agents import Agent as OpenAIAgent # type: ignore[import-not-found]
from agents import Runner, enable_verbose_stdout_logging # type: ignore from agents import Runner, enable_verbose_stdout_logging
from .openai_agent_tool_adapter import OpenAIAgentToolAdapter from .openai_agent_tool_adapter import OpenAIAgentToolAdapter
@@ -40,13 +40,14 @@ class OpenAIAgentAdapter(BaseAgentAdapter):
step_callback: Any = Field(default=None) step_callback: Any = Field(default=None)
_tool_adapter: "OpenAIAgentToolAdapter" = PrivateAttr() _tool_adapter: "OpenAIAgentToolAdapter" = PrivateAttr()
_converter_adapter: OpenAIConverterAdapter = PrivateAttr() _converter_adapter: OpenAIConverterAdapter = PrivateAttr()
agent_executor: Any = Field(default=None)
def __init__( def __init__(
self, self,
model: str = "gpt-4o-mini", model: str = "gpt-4o-mini",
tools: Optional[list[BaseTool]] = None, tools: Optional[list[BaseTool]] = None,
agent_config: Optional[dict] = None, agent_config: Optional[dict[str, Any]] = None,
**kwargs, **kwargs: Any,
): ):
if not OPENAI_AVAILABLE: if not OPENAI_AVAILABLE:
raise ImportError( raise ImportError(
@@ -109,6 +110,7 @@ class OpenAIAgentAdapter(BaseAgentAdapter):
task=task, task=task,
), ),
) )
assert hasattr(self, "agent_executor"), "agent_executor not initialized"
result = self.agent_executor.run_sync(self._openai_agent, task_prompt) result = self.agent_executor.run_sync(self._openai_agent, task_prompt)
final_answer = self.handle_execution_result(result) final_answer = self.handle_execution_result(result)
crewai_event_bus.emit( crewai_event_bus.emit(
@@ -132,7 +134,7 @@ class OpenAIAgentAdapter(BaseAgentAdapter):
raise raise
def create_agent_executor( def create_agent_executor(
self, task=None, tools: Optional[list[BaseTool]] = None self, task: Any = None, tools: Optional[list[BaseTool]] = None
) -> None: ) -> None:
""" """
Configure the OpenAI agent for execution. Configure the OpenAI agent for execution.
@@ -171,7 +173,7 @@ class OpenAIAgentAdapter(BaseAgentAdapter):
tools = agent_tools.tools() tools = agent_tools.tools()
return tools return tools
def configure_structured_output(self, task) -> None: def configure_structured_output(self, task: Any) -> None:
"""Configure the structured output for the specific agent implementation. """Configure the structured output for the specific agent implementation.
Args: Args:

View File

@@ -1,5 +1,6 @@
import json import json
import re import re
from typing import Any
from crewai.agents.agent_adapters.base_converter_adapter import BaseConverterAdapter from crewai.agents.agent_adapters.base_converter_adapter import BaseConverterAdapter
from crewai.utilities.converter import generate_model_description from crewai.utilities.converter import generate_model_description
@@ -19,14 +20,14 @@ class OpenAIConverterAdapter(BaseConverterAdapter):
_output_model: The Pydantic model for the output _output_model: The Pydantic model for the output
""" """
def __init__(self, agent_adapter): def __init__(self, agent_adapter: Any) -> None:
"""Initialize the converter adapter with a reference to the agent adapter""" """Initialize the converter adapter with a reference to the agent adapter"""
self.agent_adapter = agent_adapter self.agent_adapter = agent_adapter
self._output_format = None self._output_format = None
self._schema = None self._schema = None
self._output_model = None self._output_model = None
def configure_structured_output(self, task) -> None: def configure_structured_output(self, task: Any) -> None:
""" """
Configure the structured output for OpenAI agent based on task requirements. Configure the structured output for OpenAI agent based on task requirements.

View File

@@ -791,7 +791,12 @@ class Crew(FlowTrackable, BaseModel):
manager.tools = [] manager.tools = []
raise Exception("Manager agent should not have tools") raise Exception("Manager agent should not have tools")
else: else:
self.manager_llm = create_llm(self.manager_llm) if self.manager_llm is None:
from crewai.utilities.llm_utils import create_default_llm
self.manager_llm = create_default_llm()
else:
self.manager_llm = create_llm(self.manager_llm)
manager = Agent( manager = Agent(
role=i18n.retrieve("hierarchical_manager_agent", "role"), role=i18n.retrieve("hierarchical_manager_agent", "role"),
goal=i18n.retrieve("hierarchical_manager_agent", "goal"), goal=i18n.retrieve("hierarchical_manager_agent", "goal"),

View File

@@ -62,7 +62,7 @@ from crewai.utilities.agent_utils import (
) )
from crewai.utilities.converter import generate_model_description from crewai.utilities.converter import generate_model_description
from crewai.utilities.guardrail import process_guardrail from crewai.utilities.guardrail import process_guardrail
from crewai.utilities.llm_utils import create_llm from crewai.utilities.llm_utils import create_default_llm, create_llm
from crewai.utilities.printer import Printer from crewai.utilities.printer import Printer
from crewai.utilities.token_counter_callback import TokenCalcHandler from crewai.utilities.token_counter_callback import TokenCalcHandler
from crewai.utilities.tool_utils import execute_tool_and_check_finality from crewai.utilities.tool_utils import execute_tool_and_check_finality
@@ -195,7 +195,10 @@ class LiteAgent(FlowTrackable, BaseModel):
@model_validator(mode="after") @model_validator(mode="after")
def setup_llm(self) -> Self: def setup_llm(self) -> Self:
"""Set up the LLM and other components after initialization.""" """Set up the LLM and other components after initialization."""
self.llm = create_llm(self.llm) if self.llm is None:
self.llm = create_default_llm()
else:
self.llm = create_llm(self.llm)
if not isinstance(self.llm, BaseLLM): if not isinstance(self.llm, BaseLLM):
raise ValueError( raise ValueError(
f"Expected LLM instance of type BaseLLM, got {type(self.llm).__name__}" f"Expected LLM instance of type BaseLLM, got {type(self.llm).__name__}"