Esta documentação descreve a arquitetura baseada em Interaction Nets (Lafont 1989), o modelo de execução do Archon e como operar o sistema via API e NATS.
- Arquitetura
- Conceitos de Interaction Nets
- Agentes built-in e portas
- Subjects NATS
- API HTTP
- Plan (LLM JSON)
- Regras (RuleDefs)
- Persistência no Redis
- Executores externos
- Como rodar
- Troubleshooting
Fluxo geral:
- API publica comandos no NATS (
archon.command.*). - Worker consome comandos, atualiza o estado no Redis e dispara interações.
- Engine executa regras de Interaction Nets (reescrita topológica).
- Resultados e needs são publicados em
archon.result.*earchon.need.*. - Executores externos (ex.: HTTP) consomem
archon.need.*e respondem via webhook.
Componentes principais:
- API (
cmd/api): entrada REST. - Worker (
cmd/worker): orquestra workflow/Interações. - Redis: persistência do estado e regras.
- NATS JetStream: fila/event bus.
O sistema segue os princípios do paper de Lafont (1989):
- Linearity
- Cada porta interna deve ser usada no máximo uma vez.
- Binary interaction
- Interações só ocorrem entre portas principais conectadas.
- No ambiguity
- No máximo uma regra para cada par de símbolos distintos.
- Não há regra para
S,S.
- RHS sem par ativo
- A regra não pode gerar um par principal↔principal no lado direito.
Esses invariantes são verificados no momento do registro de regras.
-
calculator
- principal:
input - auxiliares:
output
- principal:
-
transform
- principal:
input - auxiliares:
output
- principal:
-
http
- principal:
trigger - auxiliares:
response - resposta: sempre retorna JSON com
ok(true/false); em erro incluistatus,error,body,headers
- principal:
archon.command.spawnarchon.command.add_agentarchon.command.connectarchon.command.define_rule
archon.interaction.pending
archon.need.*archon.response.*
archon.result.*
POST /api/v1/workflows
{
"user_id": "user_123",
"agents": [
{"id": "calc1", "type": "calculator", "config": {"operation": "sum"}}
],
"connections": [],
"input": [1,2,3]
}POST /api/v1/workflows/{id}/agents
{
"id": "calc2",
"type": "calculator",
"config": {"operation": "sum"}
}POST /api/v1/workflows/{id}/connections
{
"from": {"agent_id": "calc1", "port": "input"},
"to": {"agent_id": "calc2", "port": "input"}
}POST /api/v1/rules
{
"rule": {
"agent_a_type": "calculator",
"agent_b_type": "transform",
"agents": [
{"id": "x", "type": "calculator", "config": {"operation": "sum"}}
],
"connections": [],
"interface": [
{
"external": {"side": "A", "port": "output"},
"internal": {"agent_id": "x", "port": "input"}
},
{
"external": {"side": "B", "port": "input"},
"internal": {"agent_id": "x", "port": "output"}
}
]
}
}GET /api/v1/rules
GET /api/v1/rules/{a}/{b}
Use um único endpoint para aplicar regras → spawn → add_agent → connect.
POST /api/v1/plan
- Exemplo:
docs/plan.example.json - Schema oficial:
docs/schema.plan.json
Uma regra tem:
agent_a_type,agent_b_typeagents(sub-rede RHS)connections(entre agentes RHS)interface(mapeia portas externas A/B → RHS)
Requisitos validados:
- No ambiguity (A != B)
- Todas as portas auxiliares externas mapeadas
- Sem portas duplicadas
- Sem uso de porta principal na interface
- RHS não gera par ativo principal↔principal
Chaves principais:
workflow:{id}workflow:{id}:agent:{agent_id}index:state:{state}rule:{a}|{b}rules:index
Regras são persistidas e carregadas na inicialização do worker.
O agent http gera um need em archon.need.http e fica aguardando resposta.
O executor HTTP faz:
- consome
archon.need.http - executa a chamada HTTP real
- responde
/api/v1/webhooks/needs/{correlation_id}
Rodar:
ARCHON_NATS_URL=nats://localhost:4222 \
ARCHON_API_URL=http://localhost:8080 \
go run cmd/http-executor/main.go
Para consumir needs customizados (ex.: archon.need.consulta-car), rode com:
ARCHON_NEED_SUBJECT=archon.need.> \
go run cmd/http-executor/main.go
ARCHON_NATS_URL=nats://localhost:4222 \
ARCHON_REDIS_ADDR=localhost:6379 \
go run cmd/worker/main.go
ARCHON_NATS_URL=nats://localhost:4222 \
ARCHON_REDIS_ADDR=localhost:6379 \
ARCHON_APP_PORT=8080 \
go run cmd/api/main.go
ARCHON_NATS_URL=nats://localhost:4222 \
ARCHON_API_URL=http://localhost:8080 \
go run cmd/http-executor/main.go
- Nenhuma interação executa: verifique se existe regra para o par de símbolos.
- Erro “filtered consumer not unique on workqueue stream”: há consumers antigos com o mesmo filtro; reinicie ou remova consumers.
- NUI mostra erro “multiple non-filtered consumers not allowed on workqueue stream”: o stream
ARCHON_INTERACTIONSusa workqueue. Para visualizar no NUI, rode comARCHON_INTERACTIONS_RETENTION=limits(ouinterest) e reinicie API/worker. - Poucos logs no worker: inicie com
ARCHON_LOG_EVENTS=1para imprimir eventos recebidos/produzidos. - HTTPAgent não responde: verifique se o executor HTTP está rodando.
Lafont, Yves — “Interaction Nets”, POPL 1990.