First commit
This commit is contained in:
133
apps/agent_frontend_a2a/README.md
Normal file
133
apps/agent_frontend_a2a/README.md
Normal file
@@ -0,0 +1,133 @@
|
||||
# Frontend A2A para o Agent Framework OCI
|
||||
|
||||
Interface estática, sem build e sem dependências JavaScript de produção. Usa os
|
||||
endpoints A2A que já existem no pacote: pode falar com o template de backend
|
||||
ou com o Agent Gateway. O frontend nativo em `apps/agent_frontend` é preservado.
|
||||
|
||||
## Experimentar sem OCI
|
||||
|
||||
Na raiz do framework:
|
||||
|
||||
```sh
|
||||
python -m pip install -e 'libs/agent_framework[a2a]' uvicorn
|
||||
python -m uvicorn examples.a2a_frontend_demo:app --host 127.0.0.1 --port 8000
|
||||
```
|
||||
|
||||
Abra **http://localhost:8000** e clique em **Conectar ao serviço**. O exemplo
|
||||
serve a tela e a API na mesma origem, sem precisar configurar CORS.
|
||||
|
||||
A demonstração usa o **adaptador A2A e o SDK reais**, com a lógica de negócio
|
||||
simulada. Digite uma mensagem e acompanhe a tarefa. Comandos de demonstração:
|
||||
|
||||
- `/confirmar`: aguarda sua resposta e retoma a mesma Task.
|
||||
- `/lento`: permite testar o botão de cancelamento.
|
||||
- `/erro`: demonstra uma Task que termina em falha.
|
||||
|
||||
Se a porta 8000 estiver ocupada, altere a porta ao iniciar e informe o novo
|
||||
endereço no campo **Endereço do serviço**, ou use `?service=http://localhost:NOVA_PORTA`.
|
||||
|
||||
## Usar com seu agente ou Gateway
|
||||
|
||||
Habilite A2A no serviço, conforme `docs/A2A_ASSINCRONO.md`, e sirva este diretório:
|
||||
|
||||
```sh
|
||||
python -m http.server 5173 --directory apps/agent_frontend_a2a
|
||||
```
|
||||
|
||||
Abra **http://localhost:5173**. Não abra `index.html` como arquivo local, pois a
|
||||
interface usa módulos JavaScript e requisições HTTP.
|
||||
|
||||
| Uso | Endereço do serviço | Destino na interface | Seleção carregada do Agent Card |
|
||||
| --- | --- | --- | --- |
|
||||
| Template de agente | `http://localhost:8000` | Agente | Perfis de `agents.yaml` |
|
||||
| Agent Gateway | `http://localhost:8010` | Gateway | Backends do catálogo |
|
||||
|
||||
Use **Seleção automática** para deixar a decisão com o serviço. No Gateway,
|
||||
um backend selecionado é enviado como `message.metadata.backend_id`. Um perfil
|
||||
opcional dentro dele pode ser informado em **Perfil do agente no backend**.
|
||||
O adaptador A2A encaminha a seleção ao roteador existente; os contratos nativos
|
||||
não são alterados.
|
||||
|
||||
O serviço deve permitir a origem da interface em `CORS_ORIGINS`. O valor padrão
|
||||
do pacote já permite `http://localhost:5173`. Se mudar o host ou a porta,
|
||||
configure a origem exata, por exemplo:
|
||||
|
||||
```dotenv
|
||||
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
|
||||
ENABLE_A2A=true
|
||||
A2A_TASK_MODE=true
|
||||
```
|
||||
|
||||
Para publicar com Docker:
|
||||
|
||||
```sh
|
||||
docker build -t agent-frontend-a2a apps/agent_frontend_a2a
|
||||
docker run --rm -p 5173:80 agent-frontend-a2a
|
||||
```
|
||||
|
||||
O navegador precisa alcançar o endereço informado no formulário. Para uso
|
||||
externo, informe a URL pública do backend/Gateway, não o nome interno do
|
||||
container. Uma interface HTTPS deve acessar um serviço HTTPS.
|
||||
|
||||
## O que a interface oferece
|
||||
|
||||
- Descoberta do Agent Card e escolha de versão automática ou explícita (1.0/0.3).
|
||||
- Envio de mensagem com retorno imediato de Task.
|
||||
- Acompanhamento por POST SSE com `SubscribeToTask`/`tasks/resubscribe`.
|
||||
- Recuperação por `GetTask`/`tasks/get` quando o fluxo termina ou cai.
|
||||
- Consulta periódica como alternativa ao streaming.
|
||||
- Cancelamento solicitado ao serviço, incluindo tarefas aguardando input.
|
||||
- Continuação de tarefas em input-required/auth-required.
|
||||
- Exibição de respostas diretas e dos artefatos de Tasks, com suporte aos
|
||||
resultados estruturados de múltiplos agentes do framework.
|
||||
- Contexto de negócio opcional (cliente e contrato/pedido).
|
||||
- Identificadores da conversa/tarefa preservados em `sessionStorage` para
|
||||
retomar após recarregar a mesma aba. O conteúdo do chat não é persistido.
|
||||
- Nova conversa independente, sem reaproveitar uma Task concluída.
|
||||
|
||||
O frontend usa `fetch` para SSE, permitindo enviar os mesmos cabeçalhos de
|
||||
autenticação nas consultas e no acompanhamento. Em **Contexto e autenticação**,
|
||||
informe o nome e o valor completo do cabeçalho exigido pelo serviço, por
|
||||
exemplo `Authorization` / `Bearer ...`, ou `x-api-key` / valor da chave.
|
||||
Credenciais ficam somente na memória e precisam ser informadas novamente após
|
||||
recarregar. Não são gravadas em `sessionStorage` nem colocadas na URL.
|
||||
|
||||
Nenhuma operação de envio é repetida automaticamente. Se a resposta do envio
|
||||
não chegar, a tela informa a incerteza, pois o serviço pode ter aceitado a
|
||||
mensagem. O botão **Retomar** consulta a mesma Task, quando seu ID é conhecido.
|
||||
Trocar conexão, tenant, perfil ou backend requer reconectar e inicia outra
|
||||
conversa quando a identidade da configuração mudou.
|
||||
|
||||
## Limites herdados do serviço
|
||||
|
||||
O frontend não transforma o armazenamento em memória em armazenamento durável.
|
||||
Uma Task perdida ao reiniciar o serviço não pode ser recuperada pela tela.
|
||||
O cancelamento local não desfaz efeitos externos já confirmados e não garante
|
||||
cancelar uma operação já aceita por um agente remoto.
|
||||
|
||||
`auth-required` indica que a tarefa aguarda autorização, mas esta interface não
|
||||
implementa login OAuth nem aprovação externa automática. Realize o fluxo exigido
|
||||
pelo agente, atualize a credencial se necessário e retome a tarefa.
|
||||
|
||||
Não há upload de arquivos, push notifications, gRPC ou emissão de tokens do LLM.
|
||||
A seleção de versão 0.3 é explícita quando o serviço publica um Agent Card 1.0
|
||||
mas também aceita o formato 0.3, como ocorre no adaptador do framework.
|
||||
|
||||
## Testes
|
||||
|
||||
Sem bibliotecas JavaScript adicionais, com Node.js 22 ou superior:
|
||||
|
||||
```sh
|
||||
cd apps/agent_frontend_a2a
|
||||
node --test tests/client.test.js
|
||||
```
|
||||
|
||||
Com a demonstração em execução:
|
||||
|
||||
```sh
|
||||
A2A_DEMO_URL=http://localhost:8000 node --test tests/*.test.js
|
||||
```
|
||||
|
||||
Os testes de integração exercitam o cliente JavaScript contra o SDK real do
|
||||
framework: A2A 1.0 e 0.3, envio, streaming, consulta, confirmação, cancelamento
|
||||
e falha. Os testes de interface também foram realizados em navegador local.
|
||||
Reference in New Issue
Block a user