Crews
Visão Geral
Seção intitulada “Visão Geral”Uma crew no crewAI representa um grupo colaborativo de agentes trabalhando em conjunto para alcançar um conjunto de tarefas. Cada crew define a estratégia de execução de tarefas, colaboração entre agentes e o fluxo de trabalho geral.
Atributos de Crew
Seção intitulada “Atributos de Crew”| Atributo | Parâmetros | Descrição |
|---|---|---|
| Tasks | tasks | Uma lista de tasks atribuídas à crew. |
| Agents | agents | Uma lista de agentes que fazem parte da crew. |
| Process (opcional) | process | O fluxo de processo (por exemplo, sequencial, hierárquico) seguido pela crew. O padrão é sequential. |
| Verbose (opcional) | verbose | O nível de verbosidade para logging durante a execução. O padrão é False. |
| Manager LLM (opcional) | manager_llm | O modelo de linguagem utilizado pelo agente gerenciador em um processo hierárquico. Obrigatório ao usar um processo hierárquico. |
| Function Calling LLM (opcional) | function_calling_llm | Se definido, a crew utilizará este LLM para invocar funções das ferramentas para todos os agentes da crew. Cada agente pode ter seu próprio LLM, que substitui o LLM da crew para chamadas de função. |
| Config (opcional) | config | Configurações opcionais para a crew, no formato Json ou Dict[str, Any]. |
| Max RPM (opcional) | max_rpm | Número máximo de requisições por minuto que a crew respeita durante a execução. O padrão é None. |
| Memory (opcional) | memory | Utilizada para armazenar memórias de execução (curto prazo, longo prazo, memória de entidade). |
| Cache (opcional) | cache | Especifica se deve usar cache para armazenar os resultados da execução de ferramentas. O padrão é True. |
| Embedder (opcional) | embedder | Configuração do embedder a ser utilizado pela crew. Atualmente mais usado por memory. O padrão é {"provider": "openai"}. |
| Step Callback (opcional) | step_callback | Uma função chamada após cada etapa de cada agente. Pode ser usada para registrar as ações do agente ou executar outras operações; não sobrescreve o step_callback específico do agente. |
| Task Callback (opcional) | task_callback | Uma função chamada após a conclusão de cada tarefa. Útil para monitoramento ou para operações adicionais pós-execução da task. |
| Share Crew (opcional) | share_crew | Se deseja compartilhar as informações completas da crew e execução com a equipe do crewAI para melhorar a biblioteca e nos permitir treinar modelos. |
| Output Log File (opcional) | output_log_file | Defina como True para salvar logs como logs.txt no diretório atual ou forneça um caminho de arquivo. Os logs estarão em formato JSON se o nome terminar com .json, caso contrário .txt. O padrão é None. |
| Manager Agent (opcional) | manager_agent | manager define um agente customizado que será utilizado como gerente. |
| Prompt File (opcional) | prompt_file | Caminho para o arquivo JSON de prompt a ser utilizado pela crew. |
| Planning (opcional) | planning | Adiciona habilidade de planejamento à Crew. Quando ativado, antes de cada iteração, todos os dados da Crew são enviados a um AgentPlanner que planejará as tasks e este plano será adicionado à descrição de cada task. |
| Planning LLM (opcional) | planning_llm | O modelo de linguagem usado pelo AgentPlanner em um processo de planejamento. |
| Knowledge Sources (opcional) | knowledge_sources | Fontes de conhecimento disponíveis no nível da crew, acessíveis a todos os agentes. |
| Stream (opcional) | stream | Habilita saída em streaming para receber atualizações em tempo real durante a execução da crew. Retorna um objeto CrewStreamingOutput que pode ser iterado para chunks. O padrão é False. |
Criando Crews
Seção intitulada “Criando Crews”Existem duas maneiras principais de criar crews no CrewAI: utilizando configuração JSONC (recomendada para novas crews) ou definindo a crew em código para projetos clássicos e casos avançados.
Configuração JSONC (Recomendado)
Seção intitulada “Configuração JSONC (Recomendado)”Novos projetos criados com crewai create crew <name> usam crew.jsonc para configurações da crew e tarefas, além de um arquivo por agente em agents/. crewai run detecta crew.jsonc ou crew.json, carrega os agentes referenciados, pergunta por placeholders ausentes e inicia a crew.
{ "name": "Market Research Crew", "agents": ["researcher", "analyst"], "tasks": [ { "name": "research", "description": "Research {topic} and collect the most relevant facts.", "expected_output": "Structured research notes about {topic}.", "agent": "researcher" }, { "name": "analysis", "description": "Analyze the research and write a concise report.", "expected_output": "A markdown report with findings and recommendations.", "agent": "analyst", "context": ["research"], "output_file": "output/report.md" } ], "process": "sequential", "verbose": true, "memory": true, "inputs": { "topic": "AI Agents" }}Cada string em agents resolve primeiro para agents/<name>.jsonc e depois para agents/<name>.json. Para crews hierárquicas, use "process": "hierarchical" com manager_llm ou manager_agent.
Configuração YAML Clássica
Seção intitulada “Configuração YAML Clássica”Projetos clássicos criados com crewai create crew <name> --classic usam crew.py, config/agents.yaml, config/tasks.yaml e os decorators @CrewBase, @agent, @task e @crew.
Essa abordagem continua suportada para projetos existentes em Python/YAML e para equipes que precisam de controle explícito via decorators.
Após criar um projeto clássico, você pode definir sua crew em uma classe que herda de CrewBase e utiliza decorators para definir agentes, tarefas e a própria crew.
Exemplo de Classe Crew com Decorators
Seção intitulada “Exemplo de Classe Crew com Decorators”from crewai import Agent, Crew, Task, Processfrom crewai.project import CrewBase, agent, task, crew, before_kickoff, after_kickofffrom crewai.agents.agent_builder.base_agent import BaseAgentfrom typing import List
@CrewBaseclass YourCrewName: """Descrição da sua crew"""
agents: List[BaseAgent] tasks: List[Task]
# Caminhos para seus arquivos de configuração YAML # Para um exemplo de agente e tarefa definidos em YAML, confira: # - Task: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended # - Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended agents_config = 'config/agents.yaml' tasks_config = 'config/tasks.yaml'
@before_kickoff def prepare_inputs(self, inputs): # Modifique inputs antes da crew iniciar inputs['additional_data'] = "Alguma informação extra" return inputs
@after_kickoff def process_output(self, output): # Modifique a saída após a crew finalizar output.raw += "\nProcessado após kickoff." return output
@agent def agent_one(self) -> Agent: return Agent( config=self.agents_config['agent_one'], # type: ignore[index] verbose=True )
@agent def agent_two(self) -> Agent: return Agent( config=self.agents_config['agent_two'], # type: ignore[index] verbose=True )
@task def task_one(self) -> Task: return Task( config=self.tasks_config['task_one'] # type: ignore[index] )
@task def task_two(self) -> Task: return Task( config=self.tasks_config['task_two'] # type: ignore[index] )
@crew def crew(self) -> Crew: return Crew( agents=self.agents, # Coletado automaticamente pelo decorator @agent tasks=self.tasks, # Coletado automaticamente pelo decorator @task process=Process.sequential, verbose=True, )Como executar o código acima:
YourCrewName().crew().kickoff(inputs={"any": "input here"})A classe CrewBase, junto com esses decorators, automatiza a coleta de agentes e tarefas, reduzindo a necessidade de gerenciamento manual.
Visão geral dos Decorators de annotations.py
Seção intitulada “Visão geral dos Decorators de annotations.py”O CrewAI fornece vários decorators no arquivo annotations.py que são usados para marcar métodos dentro de sua classe crew para tratamento especial:
@CrewBase: Marca a classe como classe base de crew.@agent: Denota um método que retorna um objetoAgent.@task: Denota um método que retorna um objetoTask.@crew: Denota o método que retorna o objetoCrew.@before_kickoff: (Opcional) Marca um método a ser executado antes da crew iniciar.@after_kickoff: (Opcional) Marca um método a ser executado após a crew finalizar.
Esses decorators ajudam na organização da estrutura da sua crew e coletam automaticamente agentes e tasks sem precisar listá-los manualmente.
Definição Direta em Código (Alternativa)
Seção intitulada “Definição Direta em Código (Alternativa)”Como alternativa, você pode definir a crew diretamente em código sem utilizar arquivos de configuração YAML.
from crewai import Agent, Crew, Task, Processfrom crewai_tools import YourCustomTool
class YourCrewName: def agent_one(self) -> Agent: return Agent( role="Analista de Dados", goal="Analisar tendências de dados no mercado brasileiro", backstory="Analista experiente com formação em economia", verbose=True, tools=[YourCustomTool()] )
def agent_two(self) -> Agent: return Agent( role="Pesquisador de Mercado", goal="Coletar informações sobre a dinâmica do mercado nacional", backstory="Pesquisador dedicado com olhar atento aos detalhes", verbose=True )
def task_one(self) -> Task: return Task( description="Coletar dados recentes do mercado brasileiro e identificar tendências.", expected_output="Um relatório resumido com as principais tendências do mercado.", agent=self.agent_one() )
def task_two(self) -> Task: return Task( description="Pesquisar fatores que afetam a dinâmica do mercado nacional.", expected_output="Uma análise dos fatores que influenciam o mercado.", agent=self.agent_two() )
def crew(self) -> Crew: return Crew( agents=[self.agent_one(), self.agent_two()], tasks=[self.task_one(), self.task_two()], process=Process.sequential, verbose=True )Como executar o código acima:
YourCrewName().crew().kickoff(inputs={})Neste exemplo:
- Agentes e tarefas são definidos diretamente dentro da classe, sem decorators.
- Criamos e gerenciamos manualmente a lista de agentes e tasks.
- Essa abordagem fornece mais controle, mas pode ser menos sustentável para projetos maiores.
Saída da Crew
Seção intitulada “Saída da Crew”A saída de uma crew no framework CrewAI é encapsulada na classe CrewOutput.
Essa classe fornece uma forma estruturada de acessar os resultados da execução da crew, incluindo vários formatos como string bruta, JSON e modelos Pydantic.
O CrewOutput inclui os resultados da tarefa final, uso de tokens e as saídas das tasks individuais.
Atributos do Crew Output
Seção intitulada “Atributos do Crew Output”| Atributo | Parâmetros | Tipo | Descrição |
|---|---|---|---|
| Raw | raw | str | A saída bruta da crew. Este é o formato padrão da saída. |
| Pydantic | pydantic | Optional[BaseModel] | Um objeto modelo Pydantic representando a saída estruturada da crew. |
| JSON Dict | json_dict | Optional[Dict[str, Any]] | Um dicionário representando a saída da crew em formato JSON. |
| Tasks Output | tasks_output | List[TaskOutput] | Uma lista de objetos TaskOutput, cada um representando a saída de uma task na crew. |
| Token Usage | token_usage | Dict[str, Any] | Um resumo do uso de tokens, oferecendo informações sobre a performance do modelo de linguagem. |
Métodos e Propriedades do Crew Output
Seção intitulada “Métodos e Propriedades do Crew Output”| Método/Propriedade | Descrição |
|---|---|
| json | Retorna a representação em string JSON da saída da crew caso o formato seja JSON. |
| to_dict | Converte as saídas JSON e Pydantic em um dicionário. |
| str | Retorna a representação em string do resultado da crew, priorizando Pydantic, depois JSON, depois raw. |
Acessando a Saída da Crew
Seção intitulada “Acessando a Saída da Crew”Após executar uma crew, sua saída pode ser acessada pelo atributo output do objeto Crew. A classe CrewOutput oferece várias formas de interagir com esta saída.
Exemplo
Seção intitulada “Exemplo”# Execução de exemplo da crewcrew = Crew( agents=[research_agent, writer_agent], tasks=[research_task, write_article_task], verbose=True)
crew_output = crew.kickoff()
# Acessando a saída da crewprint(f"Raw Output: {crew_output.raw}")if crew_output.json_dict: print(f"JSON Output: {json.dumps(crew_output.json_dict, indent=2)}")if crew_output.pydantic: print(f"Pydantic Output: {crew_output.pydantic}")print(f"Tasks Output: {crew_output.tasks_output}")print(f"Token Usage: {crew_output.token_usage}")Acessando Logs da Crew
Seção intitulada “Acessando Logs da Crew”Você pode visualizar o log em tempo real da execução da crew, definindo output_log_file como True(Boolean) ou um file_name(str). Suporta logging de eventos como tanto file_name.txt quanto file_name.json.
Se for True(Boolean), salvará como logs.txt.
Caso output_log_file seja False(Boolean) ou None, os logs não serão gerados.
# Salvar logs da crewcrew = Crew(output_log_file = True) # Logs serão salvos como logs.txtcrew = Crew(output_log_file = file_name) # Logs serão salvos como file_name.txtcrew = Crew(output_log_file = file_name.txt) # Logs serão salvos como file_name.txtcrew = Crew(output_log_file = file_name.json) # Logs serão salvos como file_name.jsonUtilização de Memória
Seção intitulada “Utilização de Memória”As crews podem utilizar memória (curto prazo, longo prazo e memória de entidade) para potencializar sua execução e aprendizado ao longo do tempo. Este recurso permite que as crews armazenem e recuperem memórias de execução, auxiliando na tomada de decisão e nas estratégias de execução de tasks.
Utilização de Cache
Seção intitulada “Utilização de Cache”Caches podem ser utilizados para armazenar resultados de execuções de ferramentas, tornando o processo mais eficiente ao evitar a reexecução de tasks idênticas.
Métricas de Uso da Crew
Seção intitulada “Métricas de Uso da Crew”Após a execução da crew, você pode acessar o atributo usage_metrics para visualizar as métricas de uso do modelo de linguagem (LLM) para todas as tasks executadas pela crew. Isso fornece insights sobre eficiência operacional e oportunidades de melhoria.
# Acessar as métricas de uso da crewcrew = Crew(agents=[agent1, agent2], tasks=[task1, task2])crew.kickoff()print(crew.usage_metrics)Processo de Execução da Crew
Seção intitulada “Processo de Execução da Crew”- Sequential Process: As tasks são executadas uma após a outra, permitindo um fluxo de trabalho linear.
- Hierarchical Process: Um agente gerente coordena a crew, delegando tarefas e validando resultados antes de prosseguir. Nota: Um
manager_llmoumanager_agenté necessário para este processo e é essencial para validar o fluxo.
Iniciando uma Crew
Seção intitulada “Iniciando uma Crew”Uma vez que sua crew esteja montada, inicie o workflow com o método kickoff(). Isso inicia a execução conforme o fluxo de processo definido.
# Iniciar execução das tasks da crewresult = my_crew.kickoff()print(result)Diferentes Formas de Iniciar uma Crew
Seção intitulada “Diferentes Formas de Iniciar uma Crew”Assim que sua crew estiver definida, inicie o fluxo de trabalho com o método kickoff apropriado. O CrewAI oferece vários métodos para melhor controle do processo.
Métodos Síncronos
Seção intitulada “Métodos Síncronos”kickoff(): Inicia o processo de execução seguindo o fluxo definido.kickoff_for_each(): Executa tasks sequencialmente para cada evento de entrada ou item da coleção fornecida.
Métodos Assíncronos
Seção intitulada “Métodos Assíncronos”O CrewAI oferece duas abordagens para execução assíncrona:
| Método | Tipo | Descrição |
|---|---|---|
akickoff() | Async nativo | Async/await verdadeiro em toda a cadeia de execução |
akickoff_for_each() | Async nativo | Execução async nativa para cada entrada em uma lista |
kickoff_async() | Baseado em thread | Envolve execução síncrona em asyncio.to_thread |
kickoff_for_each_async() | Baseado em thread | Async baseado em thread para cada entrada em uma lista |
# Iniciar execução das tasks da crewresult = my_crew.kickoff()print(result)
# Exemplo com kickoff_for_eachinputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]results = my_crew.kickoff_for_each(inputs=inputs_array)for result in results: print(result)
# Exemplo usando async nativo com akickoffinputs = {'topic': 'AI in healthcare'}async_result = await my_crew.akickoff(inputs=inputs)print(async_result)
# Exemplo usando async nativo com akickoff_for_eachinputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]async_results = await my_crew.akickoff_for_each(inputs=inputs_array)for async_result in async_results: print(async_result)
# Exemplo usando kickoff_async baseado em threadinputs = {'topic': 'AI in healthcare'}async_result = await my_crew.kickoff_async(inputs=inputs)print(async_result)
# Exemplo usando kickoff_for_each_async baseado em threadinputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]async_results = await my_crew.kickoff_for_each_async(inputs=inputs_array)for async_result in async_results: print(async_result)Esses métodos fornecem flexibilidade para gerenciar e executar tasks dentro de sua crew, permitindo fluxos de trabalho síncronos e assíncronos de acordo com sua necessidade. Para exemplos detalhados de async, consulte o guia Inicie uma Crew de Forma Assíncrona.
Streaming na Execução da Crew
Seção intitulada “Streaming na Execução da Crew”Para visibilidade em tempo real da execução da crew, você pode habilitar streaming para receber saída conforme é gerada:
# Habilitar streamingcrew = Crew( agents=[researcher], tasks=[task], stream=True)
# Iterar sobre saída em streamingstreaming = crew.kickoff(inputs={"topic": "AI"})for chunk in streaming: print(chunk.content, end="", flush=True)
# Acessar resultado finalresult = streaming.resultSaiba mais sobre streaming no guia Streaming na Execução da Crew.
Repetindo Execução a partir de uma Task Específica
Seção intitulada “Repetindo Execução a partir de uma Task Específica”Agora é possível reiniciar a execução a partir de uma task específica usando o comando CLI replay.
O recurso de replay no CrewAI permite reexecutar a partir de uma task específica através da interface de linha de comando (CLI). Rodando o comando crewai replay -t <task_id>, você pode especificar o task_id para o processo de replay.
Kickoffs agora salvam localmente as saídas das tasks dos kickoffs recentes para permitir replay posteriormente.
Repetindo a Partir de uma Task Específica Usando o CLI
Seção intitulada “Repetindo a Partir de uma Task Específica Usando o CLI”Para usar o recurso de replay, siga estes passos:
- Abra seu terminal ou prompt de comando.
- Navegue até o diretório do seu projeto CrewAI.
- Execute o seguinte comando:
Para visualizar os IDs das últimas tasks do kickoff, utilize:
crewai log-tasks-outputsDepois, para repetir a partir de uma task específica, utilize:
crewai replay -t <task_id>Esses comandos permitem repetir tasks dos seus últimos kickoffs, mantendo o contexto das tasks já executadas anteriormente.