fix: add type hints and ignore type checks for config access (#2603)

This commit is contained in:
Lucas Gomide
2025-04-14 17:58:09 -03:00
committed by GitHub
parent d659151dca
commit bc91e94f03
12 changed files with 93 additions and 47 deletions

View File

@@ -257,10 +257,14 @@ reporting_task:
from crewai import Agent, Crew, Process, Task from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool from crewai_tools import SerperDevTool
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
@CrewBase @CrewBase
class LatestAiDevelopmentCrew(): class LatestAiDevelopmentCrew():
"""LatestAiDevelopment crew""" """LatestAiDevelopment crew"""
agents: List[BaseAgent]
tasks: List[Task]
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:

View File

@@ -118,7 +118,7 @@ class LatestAiDevelopmentCrew():
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['researcher'], config=self.agents_config['researcher'], # type: ignore[index]
verbose=True, verbose=True,
tools=[SerperDevTool()] tools=[SerperDevTool()]
) )
@@ -126,7 +126,7 @@ class LatestAiDevelopmentCrew():
@agent @agent
def reporting_analyst(self) -> Agent: def reporting_analyst(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['reporting_analyst'], config=self.agents_config['reporting_analyst'], # type: ignore[index]
verbose=True verbose=True
) )
``` ```

View File

@@ -52,12 +52,16 @@ After creating your CrewAI project as outlined in the [Installation](/installati
```python code ```python code
from crewai import Agent, Crew, Task, Process from crewai import Agent, Crew, Task, Process
from crewai.project import CrewBase, agent, task, crew, before_kickoff, after_kickoff from crewai.project import CrewBase, agent, task, crew, before_kickoff, after_kickoff
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
@CrewBase @CrewBase
class YourCrewName: class YourCrewName:
"""Description of your crew""" """Description of your crew"""
agents: List[BaseAgent]
tasks: List[Task]
# Paths to your YAML configuration files # Paths to your YAML configuration files
# To see an example agent and task defined in YAML, checkout the following: # To see an example agent and task defined in YAML, checkout the following:
# - Task: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended # - Task: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended
@@ -80,27 +84,27 @@ class YourCrewName:
@agent @agent
def agent_one(self) -> Agent: def agent_one(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['agent_one'], config=self.agents_config['agent_one'], # type: ignore[index]
verbose=True verbose=True
) )
@agent @agent
def agent_two(self) -> Agent: def agent_two(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['agent_two'], config=self.agents_config['agent_two'], # type: ignore[index]
verbose=True verbose=True
) )
@task @task
def task_one(self) -> Task: def task_one(self) -> Task:
return Task( return Task(
config=self.tasks_config['task_one'] config=self.tasks_config['task_one'] # type: ignore[index]
) )
@task @task
def task_two(self) -> Task: def task_two(self) -> Task:
return Task( return Task(
config=self.tasks_config['task_two'] config=self.tasks_config['task_two'] # type: ignore[index]
) )
@crew @crew

View File

@@ -438,7 +438,7 @@ In this section, you'll find detailed examples that help you select, configure,
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['researcher'], config=self.agents_config['researcher'], # type: ignore[index]
llm=local_nvidia_nim_llm llm=local_nvidia_nim_llm
) )

View File

@@ -113,7 +113,7 @@ class LatestAiDevelopmentCrew():
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['researcher'], config=self.agents_config['researcher'], # type: ignore[index]
verbose=True, verbose=True,
tools=[SerperDevTool()] tools=[SerperDevTool()]
) )
@@ -121,20 +121,20 @@ class LatestAiDevelopmentCrew():
@agent @agent
def reporting_analyst(self) -> Agent: def reporting_analyst(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['reporting_analyst'], config=self.agents_config['reporting_analyst'], # type: ignore[index]
verbose=True verbose=True
) )
@task @task
def research_task(self) -> Task: def research_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['research_task'] config=self.tasks_config['research_task'] # type: ignore[index]
) )
@task @task
def reporting_task(self) -> Task: def reporting_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['reporting_task'] config=self.tasks_config['reporting_task'] # type: ignore[index]
) )
@crew @crew

View File

@@ -185,15 +185,20 @@ Let's modify the `crew.py` file:
from crewai import Agent, Crew, Process, Task from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool from crewai_tools import SerperDevTool
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
@CrewBase @CrewBase
class ResearchCrew(): class ResearchCrew():
"""Research crew for comprehensive topic analysis and reporting""" """Research crew for comprehensive topic analysis and reporting"""
agents: List[BaseAgent]
tasks: List[Task]
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['researcher'], config=self.agents_config['researcher'], # type: ignore[index]
verbose=True, verbose=True,
tools=[SerperDevTool()] tools=[SerperDevTool()]
) )
@@ -201,20 +206,20 @@ class ResearchCrew():
@agent @agent
def analyst(self) -> Agent: def analyst(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['analyst'], config=self.agents_config['analyst'], # type: ignore[index]
verbose=True verbose=True
) )
@task @task
def research_task(self) -> Task: def research_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['research_task'] config=self.tasks_config['research_task'] # type: ignore[index]
) )
@task @task
def analysis_task(self) -> Task: def analysis_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['analysis_task'], config=self.tasks_config['analysis_task'], # type: ignore[index]
output_file='output/report.md' output_file='output/report.md'
) )

View File

@@ -203,35 +203,40 @@ These task definitions provide detailed instructions to our agents, ensuring the
# src/guide_creator_flow/crews/content_crew/content_crew.py # src/guide_creator_flow/crews/content_crew/content_crew.py
from crewai import Agent, Crew, Process, Task from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task from crewai.project import CrewBase, agent, crew, task
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
@CrewBase @CrewBase
class ContentCrew(): class ContentCrew():
"""Content writing crew""" """Content writing crew"""
agents: List[BaseAgent]
tasks: List[Task]
@agent @agent
def content_writer(self) -> Agent: def content_writer(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['content_writer'], config=self.agents_config['content_writer'], # type: ignore[index]
verbose=True verbose=True
) )
@agent @agent
def content_reviewer(self) -> Agent: def content_reviewer(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['content_reviewer'], config=self.agents_config['content_reviewer'], # type: ignore[index]
verbose=True verbose=True
) )
@task @task
def write_section_task(self) -> Task: def write_section_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['write_section_task'] config=self.tasks_config['write_section_task'] # type: ignore[index]
) )
@task @task
def review_section_task(self) -> Task: def review_section_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['review_section_task'], config=self.tasks_config['review_section_task'], # type: ignore[index]
context=[self.write_section_task()] context=[self.write_section_task()]
) )

View File

@@ -87,15 +87,20 @@ Follow the steps below to get Crewing! 🚣‍♂️
from crewai import Agent, Crew, Process, Task from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool from crewai_tools import SerperDevTool
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
@CrewBase @CrewBase
class LatestAiDevelopmentCrew(): class LatestAiDevelopmentCrew():
"""LatestAiDevelopment crew""" """LatestAiDevelopment crew"""
agents: List[BaseAgent]
tasks: List[Task]
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['researcher'], config=self.agents_config['researcher'], # type: ignore[index]
verbose=True, verbose=True,
tools=[SerperDevTool()] tools=[SerperDevTool()]
) )
@@ -103,20 +108,20 @@ Follow the steps below to get Crewing! 🚣‍♂️
@agent @agent
def reporting_analyst(self) -> Agent: def reporting_analyst(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['reporting_analyst'], config=self.agents_config['reporting_analyst'], # type: ignore[index]
verbose=True verbose=True
) )
@task @task
def research_task(self) -> Task: def research_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['research_task'], config=self.tasks_config['research_task'], # type: ignore[index]
) )
@task @task
def reporting_task(self) -> Task: def reporting_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['reporting_task'], config=self.tasks_config['reporting_task'], # type: ignore[index]
output_file='output/report.md' # This is the file that will be contain the final report. output_file='output/report.md' # This is the file that will be contain the final report.
) )

View File

@@ -1,6 +1,7 @@
from crewai import Agent, Crew, Process, Task from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task from crewai.project import CrewBase, agent, crew, task
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
# If you want to run a snippet of code before or after the crew starts, # If you want to run a snippet of code before or after the crew starts,
# you can use the @before_kickoff and @after_kickoff decorators # you can use the @before_kickoff and @after_kickoff decorators
# https://docs.crewai.com/concepts/crews#example-crew-class-with-decorators # https://docs.crewai.com/concepts/crews#example-crew-class-with-decorators
@@ -9,25 +10,26 @@ from crewai.project import CrewBase, agent, crew, task
class {{crew_name}}(): class {{crew_name}}():
"""{{crew_name}} crew""" """{{crew_name}} crew"""
agents: List[BaseAgent]
tasks: List[Task]
# Learn more about YAML configuration files here: # Learn more about YAML configuration files here:
# Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended # Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended
# Tasks: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended # Tasks: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended
agents_config = 'config/agents.yaml'
tasks_config = 'config/tasks.yaml'
# If you would like to add tools to your agents, you can learn more about it here: # If you would like to add tools to your agents, you can learn more about it here:
# https://docs.crewai.com/concepts/agents#agent-tools # https://docs.crewai.com/concepts/agents#agent-tools
@agent @agent
def researcher(self) -> Agent: def researcher(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['researcher'], config=self.agents_config['researcher'], # type: ignore[index]
verbose=True verbose=True
) )
@agent @agent
def reporting_analyst(self) -> Agent: def reporting_analyst(self) -> Agent:
return Agent( return Agent(
config=self.agents_config['reporting_analyst'], config=self.agents_config['reporting_analyst'], # type: ignore[index]
verbose=True verbose=True
) )
@@ -37,13 +39,13 @@ class {{crew_name}}():
@task @task
def research_task(self) -> Task: def research_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['research_task'], config=self.tasks_config['research_task'], # type: ignore[index]
) )
@task @task
def reporting_task(self) -> Task: def reporting_task(self) -> Task:
return Task( return Task(
config=self.tasks_config['reporting_task'], config=self.tasks_config['reporting_task'], # type: ignore[index]
output_file='report.md' output_file='report.md'
) )

View File

@@ -1,5 +1,7 @@
from crewai import Agent, Crew, Process, Task from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task from crewai.project import CrewBase, agent, crew, task
from crewai.agents.agent_builder.base_agent import BaseAgent
from typing import List
# If you want to run a snippet of code before or after the crew starts, # If you want to run a snippet of code before or after the crew starts,
# you can use the @before_kickoff and @after_kickoff decorators # you can use the @before_kickoff and @after_kickoff decorators
@@ -10,6 +12,9 @@ from crewai.project import CrewBase, agent, crew, task
class PoemCrew: class PoemCrew:
"""Poem Crew""" """Poem Crew"""
agents: List[BaseAgent]
tasks: List[Task]
# Learn more about YAML configuration files here: # Learn more about YAML configuration files here:
# Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended # Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended
# Tasks: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended # Tasks: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended
@@ -21,7 +26,7 @@ class PoemCrew:
@agent @agent
def poem_writer(self) -> Agent: def poem_writer(self) -> Agent:
return Agent( return Agent(
config=self.agents_config["poem_writer"], config=self.agents_config["poem_writer"], # type: ignore[index]
) )
# To learn more about structured task outputs, # To learn more about structured task outputs,
@@ -30,7 +35,7 @@ class PoemCrew:
@task @task
def write_poem(self) -> Task: def write_poem(self) -> Task:
return Task( return Task(
config=self.tasks_config["write_poem"], config=self.tasks_config["write_poem"], # type: ignore[index]
) )
@crew @crew

View File

@@ -4069,11 +4069,17 @@ def test_crew_guardrail_feedback_in_context():
@pytest.mark.vcr(filter_headers=["authorization"]) @pytest.mark.vcr(filter_headers=["authorization"])
def test_before_kickoff_callback(): def test_before_kickoff_callback():
from crewai.project import CrewBase, agent, before_kickoff, task from crewai.project import CrewBase
@CrewBase @CrewBase
class TestCrewClass: class TestCrewClass:
from crewai.project import crew from typing import List
from crewai.agents.agent_builder.base_agent import BaseAgent
from crewai.project import CrewBase, agent, before_kickoff, crew, task
agents: List[BaseAgent]
tasks: List[Task]
agents_config = None agents_config = None
tasks_config = None tasks_config = None

View File

@@ -1,6 +1,9 @@
from typing import List
import pytest import pytest
from crewai.agent import Agent from crewai.agent import Agent
from crewai.agents.agent_builder.base_agent import BaseAgent
from crewai.crew import Crew from crewai.crew import Crew
from crewai.llm import LLM from crewai.llm import LLM
from crewai.project import ( from crewai.project import (
@@ -40,28 +43,32 @@ class InternalCrew:
agents_config = "config/agents.yaml" agents_config = "config/agents.yaml"
tasks_config = "config/tasks.yaml" tasks_config = "config/tasks.yaml"
agents: List[BaseAgent]
tasks: List[Task]
@llm @llm
def local_llm(self): def local_llm(self):
return LLM( return LLM(
model='openai/model_name', model="openai/model_name",
api_key="None", api_key="None",
base_url="http://xxx.xxx.xxx.xxx:8000/v1") base_url="http://xxx.xxx.xxx.xxx:8000/v1",
)
@agent @agent
def researcher(self): def researcher(self):
return Agent(config=self.agents_config["researcher"]) return Agent(config=self.agents_config["researcher"]) # type: ignore[index]
@agent @agent
def reporting_analyst(self): def reporting_analyst(self):
return Agent(config=self.agents_config["reporting_analyst"]) return Agent(config=self.agents_config["reporting_analyst"]) # type: ignore[index]
@task @task
def research_task(self): def research_task(self):
return Task(config=self.tasks_config["research_task"]) return Task(config=self.tasks_config["research_task"]) # type: ignore[index]
@task @task
def reporting_task(self): def reporting_task(self):
return Task(config=self.tasks_config["reporting_task"]) return Task(config=self.tasks_config["reporting_task"]) # type: ignore[index]
@before_kickoff @before_kickoff
def modify_inputs(self, inputs): def modify_inputs(self, inputs):
@@ -165,24 +172,27 @@ def test_before_kickoff_with_none_input():
def test_multiple_before_after_kickoff(): def test_multiple_before_after_kickoff():
@CrewBase @CrewBase
class MultipleHooksCrew: class MultipleHooksCrew:
agents: List[BaseAgent]
tasks: List[Task]
agents_config = "config/agents.yaml" agents_config = "config/agents.yaml"
tasks_config = "config/tasks.yaml" tasks_config = "config/tasks.yaml"
@agent @agent
def researcher(self): def researcher(self):
return Agent(config=self.agents_config["researcher"]) return Agent(config=self.agents_config["researcher"]) # type: ignore[index]
@agent @agent
def reporting_analyst(self): def reporting_analyst(self):
return Agent(config=self.agents_config["reporting_analyst"]) return Agent(config=self.agents_config["reporting_analyst"]) # type: ignore[index]
@task @task
def research_task(self): def research_task(self):
return Task(config=self.tasks_config["research_task"]) return Task(config=self.tasks_config["research_task"]) # type: ignore[index]
@task @task
def reporting_task(self): def reporting_task(self):
return Task(config=self.tasks_config["reporting_task"]) return Task(config=self.tasks_config["reporting_task"]) # type: ignore[index]
@before_kickoff @before_kickoff
def first_before(self, inputs): def first_before(self, inputs):