#1 crewAI: prepare-se para a Rebelião das Máquinas!

Luciano Santos Borges
6 min readMay 20, 2024

--

TL;DR: Nesta série de artigos, vou apresentar um exemplo mais complexo, onde utilizarei todos os recursos que aprendi no curso de João Moura, criador do crewAI. Neste primeiro artigo, você encontrará a descrição do cenário que pretendo criar ao longo da série, incluindo como criar um serviço de teste que acessa um banco de dados e disponibiliza uma API usando o Google Colab. Além disso, abordarei a criação da primeira ferramenta, do primeiro agente e da primeira tarefa.

Tudo estava indo muito bem quando tínhamos apenas as LLMs (Large Language Models) para nos ajudar em tarefas como geração de texto, assistência na escrita, sumarização de textos, entre outras. Era quase como ter um assistente pessoal que sabe mais do que qualquer humano médio (ou talvez até mais do que a média dos humanos). Mas então, o crewAI entrou em cena, elevando o uso dessas ferramentas a um nível completamente novo.

A cada dia que passa, concordo mais com meu amigo Rafael Miranda, que em seu post fez uma previsão sobre o futuro das equipes de trabalho. Com essas novas ferramentas, a composição das equipes está destinada a passar por transformações significativas. Não basta mais contar apenas com humanos talentosos; agora é essencial integrar a inteligência artificial ao time.

O crewAI é uma plataforma que cria agentes de IA autônomos capazes de trabalhar juntos como uma equipe, resolvendo tarefas complexas de forma colaborativa. Uma de suas funcionalidades mais importantes são as ferramentas (tools), que são funções que os agentes podem utilizar para executar diversas ações. Essas ferramentas permitem que os agentes sejam versáteis e eficientes, ampliando sua capacidade de interação e resolução de problemas.

Como ainda estou estudando todas essas ferramentas e não sou proficiente em ambientes produtivos usando Python, estou utilizando o Google Colab para meus testes. Devido à falta ou desconhecimento de um material que resuma tudo nessa plataforma, decidi registrar minhas descobertas aqui por escrito para futuras consultas.

Cenário:

Os clientes fazem seus pedidos de roteiro personalizado através de um formulário na página da agência de viagens. Esse pedido é armazenado no banco de dados, e uma API é disponibilizada para que outras ferramentas possam acessar os dados do pedido. A seguir, vamos explorar essa API.

Para o nosso exemplo, quero formar uma equipe especializada em organizar viagens de carro para os clientes. Essa equipe será responsável por planejar a melhor rota, oferecer dicas de pontos turísticos, recomendar hotéis e restaurantes ao longo do caminho.

Serviço (API)

O código a seguir demonstra a criação de uma API que acessa um banco de dados no Google Colab. Esta API simula um serviço que será utilizado por uma ferramenta (Tool) que criaremos no crewAI.

# Instalar Flask e pyngrok
!pip install Flask Flask-SQLAlchemy pyngrok

# Importar as bibliotecas necessárias
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from pyngrok import ngrok
from sqlalchemy.dialects.postgresql import ARRAY
from datetime import date


# Autenticar ngrok com seu token (Crie seu token em ngrok.com)
!ngrok authtoken <COLE_SEU_TOKEN_AQUI>

# Inicializar a aplicação Flask
app = Flask(__name__)

# Configurar a URL do banco de dados SQLite
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# Inicializar o banco de dados
db = SQLAlchemy(app)

# Definir o modelo de dados Trip
class Trip(db.Model):
id = db.Column(db.Integer, primary_key=True)
client_name = db.Column(db.String(80), nullable=False)
origin = db.Column(db.String(120), nullable=False)
destination = db.Column(db.String(120), nullable=False)
# Usando PickleType para armazenar arrays
cities_of_interest = db.Column(db.PickleType, nullable=True)
departure_date = db.Column(db.Date, nullable=False)
travel_duration = db.Column(db.Integer, nullable=False)
kilometers_per_day = db.Column(db.Integer, nullable=False)

# Criar o banco de dados e a tabela com o contexto de aplicação
with app.app_context():
db.create_all()

# Adicionar registros iniciais
if not Trip.query.first():
trip1 = Trip(
client_name="Stephanie",
origin="Lisbon",
destination="Nice",
cities_of_interest=["Segóvia", "Lourdes", "Mônaco", "Marseille", "Cartagena"],
departure_date=date(2024, 7, 21),
travel_duration=15,
kilometers_per_day=700
)
trip2 = Trip(
client_name="Bob Smith",
origin="Miami",
destination="Seattle",
cities_of_interest=["Atlanta", "Denver"],
departure_date=date(2024, 6, 10),
travel_duration=10,
kilometers_per_day=400
)
db.session.add(trip1)
db.session.add(trip2)
db.session.commit()

# Definir uma rota para retornar uma viagem específica
@app.route('/trips/<int:id>', methods=['GET'])
def get_trip(id):
trip = Trip.query.get_or_404(id)
result = {
"id": trip.id,
"client_name": trip.client_name,
"origin": trip.origin,
"destination": trip.destination,
"cities_of_interest": trip.cities_of_interest,
"departure_date": trip.departure_date.isoformat(),
"travel_duration": trip.travel_duration,
"kilometers_per_day": trip.kilometers_per_day
}
return jsonify(result), 200

# Definir uma rota simples
@app.route('/')
def hello_world():
return "Hello, World!"

# Rodar a aplicação Flask
if __name__ == '__main__':
# Configurar o ngrok para criar um túnel para a aplicação Flask
url = ngrok.connect(5000)
print('Public URL:', url)
app.run(port=5000)

Pyngrok é uma biblioteca em Python que facilita a utilização do serviço ngrok em aplicativos Python. O ngrok é uma ferramenta que torna possível acessar servidores locais pela internet, mesmo que eles estejam protegidos por roteadores ou firewalls. Com o ngrok, você obtém um link seguro que permite acessar seu servidor local de qualquer lugar. Isso é muito útil para desenvolvimento, testes e demonstrações, pois permite que outras pessoas acessem seu trabalho sem que você precise configurar complicados ajustes de rede.

Ferramentas (Tools)

Agora que nosso serviço de teste está no ar, vamos criar a ferramenta do crewAI que acessará a API fornecida por esse serviço.

A URL é gerada dinamicamente pelo Ngrok, portanto, você deve ajustá-la conforme a URL gerada pelo seu serviço.

@tool("Buscar dados da viagem via API")
def trip_tool(id: str) -> str:
"""Obter dados da requisição de viagem acessando uma API externa"""
url = f'https://9691-34-125-134-14.ngrok-free.app/trips/{id}'
response = requests.get(url)
if response.status_code == 200:
return json.dumps(response.json())
else:
return json.dumps({"error": "API request failed", "status_code": response.status_code})

Agentes (Agents)

O primeiro agente será o Agente de Viagem. Ele será responsável por buscar as informações do cliente no serviço e repassá-las aos demais agentes. Em seguida, coletará todas as informações geradas pelos outros agentes e formatará a proposta da viagem.

Por enquanto, ele apenas buscará os dados no serviço e exibi-los na tela.

trip_agent = Agent(
role="Agente de Viagem",
goal="Montar o roteiro de viagem com base no trabalho dos agentes de roteamento, "
"atrações turísticas, alojamento e restaurante para garantir uma experiência "
"de viagem coesa e satisfatória para os clientes.",
backstory="Com anos de experiência na indústria de viagens e um talento natural para "
"organização e gestão, o agente de viagem é responsável por supervisionar "
"todos os aspectos do planejamento da viagem. Ele garante que todas as "
"recomendações e reservas sejam integradas perfeitamente, proporcionando "
"uma jornada tranquila e memorável para os clientes.",
allow_delegation=True,
verbose=True,
llm = llama3
)

Tarefas (Tasks)

A primeira tarefa será carregar os dados da API. Ela utiliza a ferramenta trip_tool e é executada pelo agente trip_agent. O parâmetro {id} é fornecido como entrada ao chamar a equipe (Crew). Esse {id} é passado para a ferramenta e usado na construção da URL do serviço.

load_trip_task = Task(
description=(
"Analisar a requisição da requisição cujo id é {id} para extrair "
"os detalhes a fim de montar o melhor roteiro de viagem."
),
expected_output=(
"As informações da requisição de forma estruturadas."
),
tools = [trip_tool],
agent = trip_agent
)

Equipe (Crew)

Por enquanto, a equipe está bem simples, composta por um único agente e uma única tarefa. Inicialmente, manteremos assim, mas no futuro iremos expandi-la e aprimorá-la.

trip_crew = Crew(
agents=[trip_agent],
tasks=[load_trip_task],
verbose=True
)

trip_inputs = {
'id': '2'
}

result = trip_crew.kickoff(inputs=trip_inputs)
print(result)

Após executarmos o código, podemos observar que os dados exibidos são referentes à viagem cujo id é 2.

Antes de rodar esse código, lembre-se de fazer os imports e configurar o llama 3.

!pip install --q crewai
!pip install --q langchain_groq
!pip install --q 'crewai[tools]'

import os
import json
import requests
import warnings
from crewai_tools import tool
from crewai import Agent, Task, Crew, Process
from langchain_groq import ChatGroq

# Controle de alerta
warnings.filterwarnings('ignore')

# Conexão ao llama3 através do Groq
llama3 = ChatGroq(
api_key="<COLE_SUA_CHAVE_AQUI>",
model="llama3-70b-8192"
)

Nos próximos artigos desta série, iremos desenvolver detalhadamente cada agente e suas respectivas tarefas, explorando as capacidades do crewAI em profundidade. Não deixe de acompanhar para aprender como tirar proveito desta poderosa ferramenta. Se você gostou deste artigo, não se esqueça de curtir e me seguir no LinkedIn para mais atualizações e conteúdos exclusivos.

Se ainda não leu o artigo Euquipe: o tão sonhado pesadelo está chegando! Você está preparado?, recomendo que o faça. As informações contidas nele podem ser muito úteis nesta jornada.

--

--