Visão Geral do Projeto
Este é um exemplo simples de agente Hello World baseado no A2A (Agent-to-Agent) SDK. Este projeto demonstra como criar um servidor de agente inteligente básico que pode responder a mensagens de usuários e retornar saudações simples.
Descrição das Versões de Dependências
Requisitos de Versão do Python
- Python >= 3.10
Principais Pacotes de Dependências
Nome do Pacote | Versão | Propósito |
---|---|---|
a2a-sdk |
>= 0.2.5 | SDK principal A2A, fornece framework de agentes |
uvicorn |
>= 0.34.2 | Servidor ASGI, para executar aplicações web |
click |
>= 8.1.8 | Ferramenta de interface de linha de comando |
httpx |
>= 0.28.1 | Cliente HTTP assíncrono |
pydantic |
>= 2.11.4 | Validação e serialização de dados |
python-dotenv |
>= 1.1.0 | Gerenciamento de variáveis de ambiente |
langchain-google-genai |
>= 2.1.4 | Integração com Google Generative AI |
langgraph |
>= 0.4.1 | Framework de processamento de grafos de linguagem |
Estrutura do Projeto
helloworld/
├── __init__.py # Arquivo de inicialização do pacote
├── __main__.py # Ponto de entrada do programa principal
├── agent_executor.py # Implementação do executor de agente
├── test_client.py # Cliente de teste
├── pyproject.toml # Configuração do projeto e dependências
├── uv.lock # Arquivo de bloqueio de dependências
└── README.md # Documentação do projeto
Configuração do Ambiente
1. Instalar o Gerenciador de Pacotes UV
Se você ainda não instalou o UV, instale primeiro:
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# ou use pip
pip install uv
2. Clonar o Projeto
git clone https://github.com/google-a2a/a2a-samples.git
cd a2a-samples/samples/python/agents/helloworld
3. Instalar Dependências
O UV instalará automaticamente todas as dependências de acordo com os arquivos pyproject.toml
e uv.lock
:
uv sync
Descrição da Arquitetura do Código
Componentes Principais
1. HelloWorldAgent (agent_executor.py
)
class HelloWorldAgent:
"""Hello World Agent."""
async def invoke(self) -> str:
return 'Hello World'
2. HelloWorldAgentExecutor (agent_executor.py
)
class HelloWorldAgentExecutor(AgentExecutor):
"""Implementação do executor de agente"""
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
result = await self.agent.invoke()
event_queue.enqueue_event(new_agent_text_message(result))
3. Configuração do Servidor (__main__.py
)
- Definir habilidades do agente (AgentSkill)
- Configurar cartões de agente públicos e estendidos (AgentCard)
- Configurar manipuladores de requisição e armazenamento de tarefas
- Iniciar servidor Uvicorn
Passos de Execução
1. Iniciar o Servidor do Agente
uv run .
O servidor iniciará em http://localhost:9999
.
2. Executar o Cliente de Teste
Em outra janela do terminal:
uv run test_client.py
3. Verificar o Serviço
Você pode verificar se o serviço está funcionando corretamente das seguintes maneiras:
Acessar Informações do Cartão do Agente
curl http://localhost:9999/.well-known/agent.json
Acessar Cartão de Agente Estendido (Autenticação Necessária)
curl -H "Authorization: Bearer dummy-token-for-extended-card" \
http://localhost:9999/agent/authenticatedExtendedCard
Fluxograma do Projeto
Fluxo de Interação Cliente-Servidor A2A
sequenceDiagram
participant Client as A2A Client
participant Server as A2A Server
participant Agent as HelloWorldAgent
participant Queue as EventQueue
Note over Client,Server: 1. Fase de Descoberta de Serviço
Client->>Server: GET /.well-known/agent.json
Server-->>Client: Retornar cartão de agente público
Note over Client,Server: 2. Recuperação de Cartão Estendido (Opcional)
Client->>Server: GET /agent/authenticatedExtendedCard<br/>(with Bearer token)
Server-->>Client: Retornar cartão de agente estendido
Note over Client,Server: 3. Fluxo de Envio de Mensagem
Client->>Server: POST /agent/message<br/>{"message": {"role": "user", "parts": [...]}}
Note over Server,Queue: 4. Processamento Interno do Servidor
Server->>Agent: Chamar HelloWorldAgentExecutor.execute()
Agent->>Agent: Executar HelloWorldAgent.invoke()
Agent-->>Queue: Gerar mensagem "Hello World"
Queue-->>Server: Retornar resultado da fila de eventos
Note over Client,Server: 5. Retorno de Resposta
Server-->>Client: Retornar resposta da mensagem
Note over Client,Server: 6. Processamento de Mensagem em Streaming (Opcional)
Client->>Server: POST /agent/message/stream
Server-->>Client: Retornar chunks de mensagem em streaming
Server-->>Client: Chunk de Mensagem 1
Server-->>Client: Chunk de Mensagem 2
Server-->>Client: Marcador de Fim
Fluxograma da Arquitetura do Sistema
graph TB
subgraph "Ambiente Cliente"
C1[Inicialização do Cliente de Teste]
C2[A2ACardResolver<br/>Análise do Cartão do Agente]
C3[A2AClient<br/>Inicialização]
C4[Enviar Requisição de Mensagem]
C5[Processar Resposta]
end
subgraph "Comunicação de Rede"
N1[Requisição HTTP/HTTPS]
N2[Transferência de Dados JSON]
end
subgraph "Ambiente Servidor"
S1[A2AStarletteApplication<br/>Servidor Web]
S2[DefaultRequestHandler<br/>Manipulador de Requisição]
S3[HelloWorldAgentExecutor<br/>Executor de Agente]
S4[HelloWorldAgent<br/>Lógica Principal do Agente]
S5[InMemoryTaskStore<br/>Armazenamento de Tarefas]
S6[EventQueue<br/>Fila de Eventos]
end
subgraph "Configuração do Agente"
A1[Cartão de Agente Público<br/>Habilidades Básicas]
A2[Cartão de Agente Estendido<br/>Habilidades Aprimoradas]
end
%% Fluxo do Cliente
C1 --> C2
C2 --> C3
C3 --> C4
C4 --> C5
%% Comunicação de Rede
C4 --> N1
N1 --> N2
N2 --> S1
S1 --> N2
N2 --> C5
%% Fluxo do Servidor
S1 --> S2
S2 --> S3
S3 --> S4
S4 --> S6
S6 --> S3
S3 --> S2
S2 --> S1
%% Associação de Configuração
A1 --> S1
A2 --> S1
S2 --> S5
%% Estilização
style C3 fill:#e3f2fd
style S1 fill:#f3e5f5
style S4 fill:#e8f5e8
style N2 fill:#fff3e0
Endpoints da API
Endpoints Públicos
Endpoint | Método | Descrição |
---|---|---|
/.well-known/agent.json |
GET | Obter informações do cartão de agente público |
/agent/message |
POST | Enviar mensagem para o agente |
/agent/message/stream |
POST | Enviar mensagem em streaming |
Endpoints de Autenticação
Endpoint | Método | Descrição | Autenticação |
---|---|---|---|
/agent/authenticatedExtendedCard |
GET | Obter cartão de agente estendido | Bearer Token |
Configuração de Habilidades
Habilidades Básicas
- ID:
hello_world
- Nome: Returns hello world
- Descrição: just returns hello world
- Exemplos: ['hi', 'hello world']
Habilidades Estendidas (Autenticação Necessária)
- ID:
super_hello_world
- Nome: Returns a SUPER Hello World
- Descrição: A more enthusiastic greeting, only for authenticated users
- Exemplos: ['super hi', 'give me a super hello']
Solução de Problemas
Problemas Comuns
-
Porta Ocupada
# Verificar uso da porta lsof -i :9999 # Matar processo ocupante kill -9 <PID>
-
Falha na Instalação de Dependências
# Limpar cache e reinstalar uv cache clean uv sync --reinstall
-
Versão do Python Incompatível
# Verificar versão do Python python --version # Garantir que a versão >= 3.10
Desenvolvimento de Extensões
Adicionar Novas Habilidades
- Definir nova
AgentSkill
em__main__.py
- Modificar processamento de lógica em
agent_executor.py
- Atualizar configuração do cartão do agente
Integração de API Externa
- Adicionar novas dependências em
pyproject.toml
- Implementar chamadas de API em
agent_executor.py
- Lidar com respostas assíncronas e erros
Resumo
Este exemplo Hello World demonstra o uso básico do A2A SDK, incluindo:
- Criação e configuração do servidor de agente
- Definição e gerenciamento de habilidades
- Comunicação cliente-servidor
- Autenticação e funcionalidade estendida
Através deste exemplo, você pode rapidamente entender como construir suas próprias aplicações de agentes inteligentes.