mirror of
https://github.com/hoshikawa2/agent_platform_oci.git
synced 2026-07-09 14:04:19 +00:00
282 lines
4.8 KiB
Markdown
282 lines
4.8 KiB
Markdown
# Modos de roteamento multi-agent: Enterprise Router e Supervisor
|
|
|
|
Este projeto suporta dois desenhos arquiteturais para roteamento entre agentes, sem precisar criar dois frameworks diferentes.
|
|
|
|
## Modos disponíveis
|
|
|
|
Configure por variável de ambiente:
|
|
|
|
```bash
|
|
ROUTING_MODE=router
|
|
```
|
|
|
|
ou:
|
|
|
|
```bash
|
|
ROUTING_MODE=supervisor
|
|
```
|
|
|
|
Também existe a chave documental em `agent_template_backend/config/routing.yaml`:
|
|
|
|
```yaml
|
|
router:
|
|
mode: router
|
|
```
|
|
|
|
A variável de ambiente `ROUTING_MODE` é a forma recomendada para ativar um modo em runtime, especialmente em Docker, Kubernetes ou OCI.
|
|
|
|
---
|
|
|
|
## Opção 1: Enterprise Router
|
|
|
|
Fluxo:
|
|
|
|
```text
|
|
Usuário
|
|
-> Input Guardrails
|
|
-> EnterpriseRouter
|
|
-> AgentRegistry
|
|
-> 1 agente especialista
|
|
-> Output Guardrails
|
|
-> Judges
|
|
-> Supervisor Review
|
|
-> Persistência/eventos
|
|
```
|
|
|
|
Uso recomendado quando cada mensagem deve ser atendida por um único agente especialista.
|
|
|
|
Exemplos:
|
|
|
|
- `Minha fatura veio alta` -> `billing_agent`
|
|
- `Onde está meu pedido?` -> `orders_agent`
|
|
- `Quero trocar um produto com defeito` -> `support_agent`
|
|
|
|
Vantagens:
|
|
|
|
- Menor latência.
|
|
- Menor custo de tokens.
|
|
- Debug mais simples.
|
|
- Mais fácil de operar em produção.
|
|
|
|
Limitação:
|
|
|
|
- Uma mensagem com múltiplos assuntos precisa ser roteada para um agente principal ou tratada por handoff.
|
|
|
|
---
|
|
|
|
## Opção 2: Supervisor
|
|
|
|
Fluxo:
|
|
|
|
```text
|
|
Usuário
|
|
-> Input Guardrails
|
|
-> Supervisor.route_plan
|
|
-> supervisor_agent
|
|
-> billing_agent opcional
|
|
-> orders_agent opcional
|
|
-> product_agent opcional
|
|
-> support_agent opcional
|
|
-> Consolidação
|
|
-> Output Guardrails
|
|
-> Judges
|
|
-> Supervisor Review
|
|
-> Persistência/eventos
|
|
```
|
|
|
|
Uso recomendado quando uma única mensagem pode envolver vários agentes.
|
|
|
|
Exemplo:
|
|
|
|
```text
|
|
Meu pedido não chegou e também fui cobrado duas vezes.
|
|
```
|
|
|
|
Neste caso, o supervisor pode acionar:
|
|
|
|
- `orders_agent`
|
|
- `billing_agent`
|
|
|
|
Vantagens:
|
|
|
|
- Suporta múltiplas intenções na mesma mensagem.
|
|
- Permite consolidação de respostas.
|
|
- Facilita cenários enterprise com vários domínios.
|
|
|
|
Custos:
|
|
|
|
- Maior latência.
|
|
- Maior consumo de tokens.
|
|
- Mais complexidade operacional.
|
|
|
|
---
|
|
|
|
## O que foi alterado no código
|
|
|
|
### 1. Configuração
|
|
|
|
Arquivo:
|
|
|
|
```text
|
|
agent_framework/src/agent_framework/config/settings.py
|
|
```
|
|
|
|
Foi adicionada a configuração:
|
|
|
|
```python
|
|
ROUTING_MODE: Literal['router','supervisor'] = 'router'
|
|
```
|
|
|
|
### 2. Workflow LangGraph
|
|
|
|
Arquivo:
|
|
|
|
```text
|
|
agent_template_backend/app/workflows/agent_graph.py
|
|
```
|
|
|
|
O nó `enterprise_route` foi substituído por um nó genérico:
|
|
|
|
```text
|
|
routing_decision
|
|
```
|
|
|
|
Esse nó decide o caminho com base em `ROUTING_MODE`:
|
|
|
|
- `router` usa `EnterpriseRouter`.
|
|
- `supervisor` usa `Supervisor.route_plan`.
|
|
|
|
Também foi adicionado o nó:
|
|
|
|
```text
|
|
supervisor_agent
|
|
```
|
|
|
|
Ele executa um ou mais agentes e consolida o resultado.
|
|
|
|
### 3. Supervisor
|
|
|
|
Arquivo:
|
|
|
|
```text
|
|
agent_framework/src/agent_framework/supervisor/supervisor.py
|
|
```
|
|
|
|
Foi adicionada a estrutura:
|
|
|
|
```python
|
|
SupervisorPlan
|
|
```
|
|
|
|
E o método:
|
|
|
|
```python
|
|
route_plan(state)
|
|
```
|
|
|
|
Esse método retorna uma lista de agentes a executar.
|
|
|
|
### 4. Debug
|
|
|
|
Endpoint:
|
|
|
|
```text
|
|
POST /debug/route
|
|
```
|
|
|
|
Agora respeita `ROUTING_MODE` e permite verificar rapidamente como uma mensagem será roteada.
|
|
|
|
---
|
|
|
|
## Como testar localmente
|
|
|
|
### Instalação
|
|
|
|
```bash
|
|
cd agent_template_backend
|
|
python -m venv .venv
|
|
source .venv/bin/activate
|
|
pip install -U pip setuptools wheel
|
|
pip install -e ../agent_framework
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Modo Router
|
|
|
|
```bash
|
|
export ROUTING_MODE=router
|
|
uvicorn app.main:app --reload --port 8000
|
|
```
|
|
|
|
Teste:
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/debug/route \
|
|
-H 'Content-Type: application/json' \
|
|
-d '{"channel":"web","payload":{"text":"Onde está meu pedido?","session_id":"s1"}}'
|
|
```
|
|
|
|
Resultado esperado:
|
|
|
|
```json
|
|
{
|
|
"mode": "router",
|
|
"route": "orders_agent"
|
|
}
|
|
```
|
|
|
|
### Modo Supervisor
|
|
|
|
```bash
|
|
export ROUTING_MODE=supervisor
|
|
uvicorn app.main:app --reload --port 8000
|
|
```
|
|
|
|
Teste:
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/debug/route \
|
|
-H 'Content-Type: application/json' \
|
|
-d '{"channel":"web","payload":{"text":"Meu pedido atrasou e minha fatura veio duplicada","session_id":"s2"}}'
|
|
```
|
|
|
|
Resultado esperado:
|
|
|
|
```json
|
|
{
|
|
"mode": "supervisor",
|
|
"route": "supervisor_agent",
|
|
"agents": ["billing_agent", "orders_agent"]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Isolamento
|
|
|
|
A chave lógica de isolamento permanece:
|
|
|
|
```text
|
|
tenant_id:agent_id:session_id
|
|
```
|
|
|
|
Use essa chave para memória, sessão, checkpoint e telemetria. Em produção, recomenda-se padronizar `agent_id` por agente especialista ou por template, dependendo do nível de isolamento desejado.
|
|
|
|
---
|
|
|
|
## Recomendação
|
|
|
|
Comece em produção com:
|
|
|
|
```bash
|
|
ROUTING_MODE=router
|
|
```
|
|
|
|
Ative:
|
|
|
|
```bash
|
|
ROUTING_MODE=supervisor
|
|
```
|
|
|
|
quando houver necessidade real de múltiplos agentes na mesma mensagem.
|