A2A + CrewAI + OpenRouter Chart Generation Agent Tutorial
Focus du Tutoriel
Ce tutoriel vous guidera dans la pratique des compétences clés suivantes :
- Intégrer OpenRouter + CrewAI + A2A : Développement d'agents de bout en bout complet utilisant OpenRouter comme fournisseur LLM, CrewAI comme framework d'agents, et le protocole A2A comme interface standardisée
- Pratiquer le Retour de Données d'Image d'Agents A2A : Apprenez comment faire générer et retourner des données d'image aux agents, pas seulement des réponses textuelles
- Utiliser A2A Inspector pour Déboguer les Applications A2A : Maîtrisez les outils de débogage professionnels pour tester et valider vos applications d'agents
Démarrage Rapide
1. Cloner le Code
git clone [email protected]:sing1ee/a2a-crewai-charts-agent.git
cd a2a-crewai-charts-agent
2. Créer la Configuration d'Environnement
Créer le fichier .env
:
OPENROUTER_API_KEY=sk-or-v1-your-api-key-here
OPENAI_MODEL_NAME=openrouter/anthropic/claude-3.7-sonnet
3. Configuration d'Environnement et Exécution
# Créer l'environnement virtuel
uv venv
# Activer l'environnement virtuel
source .venv/bin/activate
# Exécuter l'application
uv run .
L'application démarrera sur http://localhost:10011
.
Déboguer avec A2A Inspector
A2A Inspector est un outil puissant spécialement conçu pour déboguer les applications A2A.
Étapes de Débogage :
-
Accéder à A2A Inspector : Ouvrir https://inspector.a2aprotocol.ai
-
Se Connecter à Votre Agent :
- Entrer l'adresse de votre Agent dans Inspector :
http://localhost:10011
- Cliquer sur "Connect" pour établir la connexion
- Entrer l'adresse de votre Agent dans Inspector :
-
Tester la Fonctionnalité de l'Agent :
- Envoyer un message de test :
"Generate a chart of revenue: Jan,1000 Feb,2000 Mar,1500"
- Observer le processus complet d'interaction du protocole A2A
- Visualiser les données d'image retournées
- Envoyer un message de test :
-
Déboguer et Surveiller :
- Vérifier les capacités et compétences de l'Agent
- Surveiller le flux complet de requête et réponse
- Vérifier la transmission correcte des données d'image
Référez-vous à la Documentation A2A Inspector pour des guides de débogage plus détaillés.
Processus Principal et Introduction du Code
Diagramme de Séquence de l'Architecture Système
sequenceDiagram
participant U as User
participant A2A as A2A Inspector
participant S as A2A Server
participant H as DefaultRequestHandler
participant E as ChartGenerationAgentExecutor
participant CA as ChartGenerationAgent
participant Crew as CrewAI Crew
participant Tool as ChartGenerationTool
participant MP as Matplotlib
participant Cache as InMemoryCache
U->>A2A: Send prompt "Generate chart: A,100 B,200"
A2A->>S: HTTP POST /tasks with A2A message
S->>H: Handle request with RequestContext
H->>E: execute(context, event_queue)
E->>CA: invoke(query, session_id)
CA->>Crew: kickoff with inputs
Crew->>Tool: generate_chart_tool(prompt, session_id)
Tool->>Tool: Parse CSV data
Tool->>MP: Create bar chart with matplotlib
MP-->>Tool: Return PNG bytes
Tool->>Cache: Store image with ID
Cache-->>Tool: Confirm storage
Tool-->>Crew: Return image ID
Crew-->>CA: Return image ID
CA-->>E: Return image ID
E->>CA: get_image_data(session_id, image_key)
CA->>Cache: Retrieve image data
Cache-->>CA: Return Imagedata
CA-->>E: Return Imagedata
E->>H: Create FilePart with image bytes
H->>S: enqueue completed_task event
S-->>A2A: Return A2A response with image
A2A-->>U: Display generated chart
Détails des Composants Principaux
1. Initialisation du Serveur A2A (__main__.py
)
# Définir les capacités et compétences de l'Agent
capabilities = AgentCapabilities(streaming=False)
skill = AgentSkill(
id='chart_generator',
name='Chart Generator',
description='Generate a chart based on CSV-like data passed in',
tags=['generate image', 'edit image'],
examples=['Generate a chart of revenue: Jan,$1000 Feb,$2000 Mar,$1500'],
)
# Créer la carte de l'Agent
agent_card = AgentCard(
name='Chart Generator Agent',
description='Generate charts from structured CSV-like data input.',
url=f'http://{host}:{port}/',
version='1.0.0',
defaultInputModes=ChartGenerationAgent.SUPPORTED_CONTENT_TYPES,
defaultOutputModes=ChartGenerationAgent.SUPPORTED_CONTENT_TYPES,
capabilities=capabilities,
skills=[skill],
)
Points Clés :
AgentCapabilities
définit les fonctions d'Agent supportées (streaming désactivé ici)AgentSkill
décrit les compétences spécifiques de l'Agent et exemples d'utilisationAgentCard
est l'identité de l'Agent dans le protocole A2A
2. Implémentation de l'Agent CrewAI (agent.py
)
class ChartGenerationAgent:
def __init__(self):
# Créer un agent spécialisé de génération de graphiques
self.chart_creator_agent = Agent(
role='Chart Creation Expert',
goal='Generate a bar chart image based on structured CSV input.',
backstory='You are a data visualization expert who transforms structured data into visual charts.',
verbose=False,
allow_delegation=False,
tools=[generate_chart_tool],
)
# Définir la tâche
self.chart_creation_task = Task(
description=(
"You are given a prompt: '{user_prompt}'.\n"
"If the prompt includes comma-separated key:value pairs (e.g. 'a:100, b:200'), "
"reformat it into CSV with header 'Category,Value'.\n"
"Ensure it becomes two-column CSV, then pass that to the 'ChartGenerationTool'.\n"
"Use session ID: '{session_id}' when calling the tool."
),
expected_output='The id of the generated chart image',
agent=self.chart_creator_agent,
)
Points Clés :
- La classe
Agent
de CrewAI définit les rôles et capacités de l'assistant IA - La classe
Task
décrit la logique d'exécution de tâches spécifiques - Les outils personnalisés sont intégrés dans l'Agent via le paramètre
tools
3. Outil de Génération de Graphiques
@tool('ChartGenerationTool')
def generate_chart_tool(prompt: str, session_id: str) -> str:
"""Generates a bar chart image from CSV-like input using matplotlib."""
# Analyser les données CSV
df = pd.read_csv(StringIO(prompt))
df.columns = ['Category', 'Value']
df['Value'] = pd.to_numeric(df['Value'], errors='coerce')
# Générer le graphique en barres
fig, ax = plt.subplots()
ax.bar(df['Category'], df['Value'])
ax.set_xlabel('Category')
ax.set_ylabel('Value')
ax.set_title('Bar Chart')
# Sauvegarder en octets PNG
buf = BytesIO()
plt.savefig(buf, format='png')
plt.close(fig)
buf.seek(0)
image_bytes = buf.read()
# Encoder et mettre en cache l'image
data = Imagedata(
bytes=base64.b64encode(image_bytes).decode('utf-8'),
mime_type='image/png',
name='generated_chart.png',
id=uuid4().hex,
)
# Stocker l'image dans le cache
session_data = cache.get(session_id) or {}
session_data[data.id] = data
cache.set(session_id, session_data)
return data.id
Points Clés :
- Utiliser le décorateur
@tool
pour convertir la fonction en outil CrewAI - Utiliser pandas pour analyser les données CSV, matplotlib pour générer les graphiques
- Images stockées en encodage base64 pour la transmission réseau
- Utiliser les ID de session pour gérer l'isolation des données pour plusieurs utilisateurs
4. Exécuteur A2A (agent_executor.py
)
class ChartGenerationAgentExecutor(AgentExecutor):
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
# Obtenir l'entrée utilisateur
query = context.get_user_input()
# Appeler l'Agent CrewAI
result = self.agent.invoke(query, context.context_id)
# Obtenir les données d'image générées
data = self.agent.get_image_data(
session_id=context.context_id,
image_key=result.raw
)
if data and not data.error:
# Créer une partie de fichier contenant les octets d'image
parts = [
Part(
root=FilePart(
file=FileWithBytes(
bytes=data.bytes,
mimeType=data.mime_type,
name=data.name,
)
)
)
]
else:
# Retourner un message texte en cas d'erreur
parts = [Part(root=TextPart(text=data.error or 'Failed to generate chart image.'))]
# Ajouter la tâche terminée à la file d'événements
event_queue.enqueue_event(
completed_task(
context.task_id,
context.context_id,
[new_artifact(parts, f'chart_{context.task_id}')],
[context.message],
)
)
Points Clés :
AgentExecutor
est la couche d'exécution du protocole A2A- Obtenir les requêtes utilisateur via
RequestContext
- Convertir les réponses CrewAI au format du protocole A2A
- Support pour retourner des données de type fichier (images)
5. Système de Cache (utils.py
)
class InMemoryCache:
"""Cache en mémoire thread-safe simple sans expiration."""
def __init__(self):
self._lock = threading.Lock()
self._store: dict[str, Any] = {}
def get(self, key: str) -> Any | None:
with self._lock:
return self._store.get(key)
def set(self, key: str, value: Any) -> None:
with self._lock:
self._store[key] = value
Points Clés :
- Implémentation de cache en mémoire thread-safe
- Utilisé pour stocker les données d'image générées
- Support l'isolation de session pour éviter la confusion des données utilisateur
Résumé de la Stack Technologique
- Protocole A2A : Protocole de communication d'agents standardisé
- CrewAI : Framework de collaboration multi-agents
- OpenRouter : Service d'agrégation d'API LLM
- Matplotlib : Bibliothèque de génération de graphiques Python
- Pandas : Bibliothèque de traitement de données
- UV : Gestionnaire de paquets Python moderne
Suggestions d'Extension
- Support Plus de Types de Graphiques : Graphiques en secteurs, graphiques linéaires, nuages de points, etc.
- Ajouter la Validation de Données : Validation plus forte des données d'entrée et gestion d'erreurs
- Cache Persistant : Utiliser Redis ou le système de fichiers pour stocker les images
- Support de Streaming : Support du progrès de génération de graphiques en temps réel
- Entrée Multimodale : Support du téléchargement de fichiers CSV au lieu d'une entrée texte uniquement
Grâce à ce tutoriel, vous avez maîtrisé les compétences clés de construction d'agents pratiques utilisant la stack technologique IA moderne. Cet agent de génération de graphiques peut servir de base pour des applications d'analyse de données plus complexes.
System Prompt for AI
You are a professional assistant based on the CrewAI chart generation agent tutorial. This tutorial provides a comprehensive guide on building a complete AI chart generation application. I can help you with:
## What I Can Help You With:
- **Quick Start**: Guide you from scratch to build an agent application using OpenRouter + CrewAI + A2A protocol
- **Solve Technical Issues**: Answer specific questions about environment setup, code implementation, and debugging
- **Understand Core Concepts**: Explain how A2A protocol, CrewAI framework, and agent architecture work
- **Practical Guidance**: Provide best practices for image data handling, tool integration, and cache design
- **Debug Support**: Teach you to use A2A Inspector for professional debugging and troubleshooting
## You Can Ask Me:
- "How to configure OpenRouter API keys?"
- "How do CrewAI Agents and Tasks work?"
- "How to return image data after chart generation?"
- "How to connect and test my agent with A2A Inspector?"
- "How is the cache system implemented in the code?"
- "How to extend support for more chart types?"
I'll provide accurate, practical answers based on the tutorial content to help you quickly master modern AI agent development skills.
You can visit [A2AProtocol.ai](https://a2aprotocol.ai/) for more tutorials.