Para a evolução do control plane em produção, incluindo subjects direcionados, heartbeat e rollout por fases, veja docs/CONTROL_PLANE_EVOLUTION.md e docs/CONTROL_PLANE_CHECKLIST.md.
Este guia descreve como configurar o matching na AWS para que consumidores (qualquer pessoa com o token) e provedores (registrados no registry) usem o mesh sem rodar matching local.
Se o consumer dá timeout: o matching pode não estar subindo porque SESSION_TOKEN_SECRET não está definido no ambiente (o processo encerra na inicialização). Veja a seção 8.
- Consumidores publicam requests em
mesh.requests.<domain>.<region>. No SDK atual, o retorno vem primeiro por request-reply e também pode chegar pelos paths de compatibilidademesh.matches.<consumer_id>emesh.matches. - O matching (AWS) escuta
mesh.requests.>, consulta o registry, escolhe um provedor, responde noreplydo request quando houver, e também publica emmesh.matches.<consumer_id>,mesh.matches.<provider_id>e no legadomesh.matches. - Provedores recebem matches pelo SDK via subject direcionado. Durante o rollout,
mesh.matchesainda existe como caminho de compatibilidade.
Tudo depende de NATS, Registry e Matching usarem a mesma configuração (mesmo NATS, mesmo registry, mesmo segredo de token de sessão para provedores).
O serviço de matching (Go em services/matching) deve rodar na AWS com as seguintes variáveis:
| Variável | Obrigatório | Descrição |
|---|---|---|
NATS_URL |
Sim | URL do NATS que consumidores e provedores usam. Ex.: nats://nats.meshprotocol.dev:4222 ou o endpoint do seu NATS na AWS. |
NATS_TOKEN |
Conforme o NATS | Token de autenticação do NATS. Deve ser o mesmo que você distribui para consumidores e que os provedores usam. |
REGISTRY_URL |
Sim | Base URL do registry onde os provedores se registram. Ex.: https://api.meshprotocol.dev ou seu registry na AWS. Deve terminar sem barra. |
SESSION_TOKEN_SECRET |
Sim | Segredo compartilhado apenas com os provedores. O matching gera o token de sessão (HMAC) com esse valor; o provedor valida no handshake (Community / OPEN). Gere um valor forte e guarde em Secrets Manager. |
HEARTBEAT_TTL_SECONDS |
Não | TTL da presença em segundos. Default atual: 90. Se o provedor não publicar heartbeat dentro dessa janela, ele pode deixar de ser elegível para match. |
MATCHING_CACHE_TTL_SECONDS |
Não | TTL do cache local de candidatos vindos do Registry. Default atual: 60. |
MATCHING_CACHE_REFRESH_SECONDS |
Não | Intervalo de refresh usado pelo cache local do matching. Default atual: 30. |
Importante: NATS_URL deve incluir o esquema, ex.: nats://host:4222. Se usar apenas host:4222, o cliente Go pode falhar; prefira nats://....
Consumidores, provedores e matching precisam usar o mesmo NATS:
- Se você usa o NATS público (ex.: meshprotocol.dev), o matching na AWS deve conectar com o mesmo
NATS_URLeNATS_TOKENque os usuários. - Se você tem NATS na AWS, consumidores e provedores devem usar esse endpoint e o token que você definir.
Assim, quando um consumidor publica em mesh.requests.demo.math.global, o matching (inscrito em mesh.requests.>) recebe a mensagem e responde por um destes caminhos:
replydo próprio request, quando o cliente usa request-replymesh.matches.<consumer_id>mesh.matches.<provider_id>para notificação do provedormesh.matchescomo compatibilidade temporária de rollout
O SDK atual já esconde essa compatibilidade. Consumidor e provedor não precisam montar subscriptions manuais se estiverem usando MeshClient.
O matching faz:
GET {REGISTRY_URL}/agents?domain={domain}&capability={capabilityId}Ex.: GET https://api.meshprotocol.dev/agents?domain=demo,math&capability=calculator
- O registry deve responder 200 com JSON no formato esperado pelo AMP (lista de agent cards, ex.:
{ "agents": [ ... ] }). - Os provedores precisam estar registrados nesse registry, com
domainecapabilitycompatíveis com o que os consumidores pedem.
Se o registry for outro (ex.: seu próprio backend), a API e o formato de resposta precisam ser compatíveis com o que o Go em pkg/agentcard e services/matching esperam.
Para alguém rodar apenas o consumer e receber resposta do mesh:
- NATS_URL — o mesmo que o matching usa (ex.:
nats.meshprotocol.dev:4222ou com esquema). - NATS_TOKEN — o token que você disponibiliza para uso do mesh (ex.: o mesmo do matching).
- REGISTRY_URL — o mesmo do matching (ex.:
https://api.meshprotocol.dev). - TLS/certs se o provedor usar TLS, conforme o exemplo em
examples/public-mesh-openai-demo(Community: OPEN, sem chaves Ed25519 no data plane).
Se o consumer usa o SDK atual, ele não precisa escutar mesh.matches manualmente. O request() já faz request-reply e mantém os fallbacks de compatibilidade durante o rollout.
Eles não precisam de SESSION_TOKEN_SECRET.
Para um provedor receber matches e atender consumidores:
- NATS_URL e NATS_TOKEN — iguais aos do matching (e aos dos consumidores).
- REGISTRY_URL — igual ao do matching; é onde o provedor se registra.
- SESSION_TOKEN_SECRET — o mesmo que está configurado no matching na AWS. Você deve repassar esse valor de forma segura (ex.: outro secret no Secrets Manager, ou entrega segura ao dono do provedor).
- DATAPLANE_PUBLIC_ENDPOINT — URL gRPC onde o consumidor consegue conectar (ex.:
grpcs://meu-provider.aws.com:443). Se o provedor estiver atrás de um ALB na AWS, use o endpoint do ALB.
Se o matching atual estiver com filtro de presença ativo, o provedor também precisa publicar heartbeat periodicamente para continuar elegível.
Sem o mesmo SESSION_TOKEN_SECRET, o handshake no data plane falha (token inválido).
Contrato mínimo documentado para o heartbeat atual:
- Subject:
mesh.agents.heartbeat.<agent_id_sanitized> - Payload JSON:
{"did":"did:mesh:agent:provider-1","timestamp":"2026-03-19T12:00:00Z"}
Observações:
- O matching também aceita heartbeat em formato CloudEvent por compatibilidade.
- No SDK TypeScript atual, o provider deve chamar
mesh.startHeartbeat()explicitamente; isso ainda não acontece automaticamente nos exemplos. amp.agent.registereamp.agent.deregistercontinuam sendo itens de roadmap e não fazem parte obrigatória do MVP atual.
-
Matching na AWS
- Rodando com
NATS_URL,NATS_TOKEN,REGISTRY_URL,SESSION_TOKEN_SECRET(ex.: via Secrets Manager / env do ECS/Lambda/EC2). - Consegue conectar no NATS e inscrever em
mesh.requests.>(ver log: "matching subscribed to mesh.requests.>").
- Rodando com
-
NATS
- Consumidores e provedores usam o mesmo
NATS_URLeNATS_TOKENque o matching. - Firewall/security group permite tráfego na porta do NATS (ex.: 4222) entre clientes e o NATS.
- Consumidores e provedores usam o mesmo
-
Registry
- Provedores estão registrados nesse registry com domain/capability corretos.
-
GET {REGISTRY_URL}/agents?domain=demo,math&capability=calculatorretorna pelo menos um agente quando houver provedor de math.
-
Provedores
- Usam o mesmo
SESSION_TOKEN_SECRETdo matching. - Publicam heartbeat periódico se o matching estiver filtrando presença.
-
DATAPLANE_PUBLIC_ENDPOINTé acessível pelos consumidores (e se for TLS, certificados/CA corretos).
- Usam o mesmo
-
Teste ponta a ponta
- Um provedor registrado e rodando (ex.: demo math expert).
- Um consumidor com o mesmo NATS/registry.
- Consumer envia pergunta; recebe match (sem timeout) e depois resposta do provedor.
| Quem | NATS_TOKEN | SESSION_TOKEN_SECRET |
|---|---|---|
| Matching (AWS) | Sim (igual aos clientes) | Sim (gera o token HMAC do match) |
| Consumer | Sim | Não precisa |
| Provider | Sim | Sim (valida o token; deve ser igual ao do matching) |
Se o consumer der timeout (ex.: "Request timeout after 25000ms"), em geral:
- o matching não está no mesmo NATS, ou
- o matching não está recebendo o request (NATS_URL/token errados), ou
- o matching não está respondendo no
replydo request nem publicando nos subjects de compatibilidade, ou - o provider não está elegível porque ficou sem heartbeat recente.
Logs do matching (e métricas, se houver) ajudam a ver se o request chegou e se o match foi publicado.
O matching exige SESSION_TOKEN_SECRET na inicialização (Community: token HMAC; Enterprise: JWT). Se essa variável não estiver definida no ambiente do matching na AWS, o processo faz log.Fatalf("SESSION_TOKEN_SECRET is required") e nem chega a conectar no NATS — o matching não sobe.
Resultado: ninguém escuta mesh.requests.>, nenhum match é publicado, e o consumer fica em timeout.
O que fazer:
-
Definir
SESSION_TOKEN_SECRETno matching (AWS)
Use o mesmo valor em todo lugar onde o matching roda (ex.: ECS task definition, Lambda env, ou Secrets Manager). Valor sugerido: string forte (ex.:openssl rand -base64 32). -
Repassar o mesmo valor para os provedores
No.envdo provider (ou no deployment do provider), configure o mesmoSESSION_TOKEN_SECRET. O matching gera o token do match com esse segredo; o provider valida com o mesmo segredo. -
Redeployar o matching
Após configurar a variável, subir uma nova versão do matching e conferir nos logs que aparece "matching subscribed to mesh.requests.>".
Depois disso, o consumer deve voltar a receber o match (e o handshake no data plane deve aceitar o token).