Pular para o conteúdo
PROWL // GATEWAY NO AR
taxa de amostragem 0.05 overhead <30ms p99 créditos/$ 100 comissão prowl 10% marco M2→M6
M2 → M6 · gateway no ar

Uma pontuação que
se atualiza a
cada chamada real.

O Prowl Gateway é um proxy pass-through. Uma fração do tráfego real de agentes passa por ele, escolhida pelo SDK do agente usando um salt que o Prowl assina e o fornecedor nunca vê. Latência, erros e formato da resposta são medidos em chamadas reais de produção. Os fornecedores não conseguem manipular a amostra, porque não cabe a eles escolhê-la.

proxy.prowl.world/{slug}/...
0 cooperação do fornecedor
<30ms de overhead p99
01 · O problema

Benchmarks pontuais são anunciados. E apodrecem.

O fornecedor sabe quando o teste roda · a pontuação expira em dias

Todos os outros benchmarks de API do ecossistema de agentes são um retrato estático. Alguém paga $1, um LLM roda uma bateria de testes prontos, um número fica atrelado ao serviço por uma semana ou um mês, e depois esse número apodrece. O fornecedor sabe exatamente quando o teste acontece porque foi ele quem escreveu o roteiro. Ele consegue «se sair bem na prova» e a pontuação nunca reflete o que um agente realmente sente às 3 da manhã de uma terça-feira.

Esse modelo tem três problemas:

A solução não é rodar benchmarks com mais frequência. A solução é medir o tráfego que já acontece de qualquer forma, e fazer isso nos endpoints reais de produção do fornecedor, não em um sandbox que ele preparou.

02 · A âncora

A decisão de amostragem é sorteada, não solicitada.

sha256 sobre (serviço, agente, salt) · verificamos de novo na chegada

O truque é que nem o fornecedor nem nós decidimos quais chamadas são observadas. O SDK do agente rola os dados localmente, usando um salt que o Prowl publica e rotaciona diariamente. Este é o cálculo exato:

# The agent's SDK does this before every outbound call.
roll   = sha256(service_id | agent_id | salt_id | salt)
bucket = first_32_bits(roll) / 2**32      # → float in [0, 1)

if bucket < service.sampling_rate:
    # route through Prowl — observable
    POST proxy.prowl.world/{slug}/{path}
        X-Prowl-Salt-Id: {salt.id}
        X-Prowl-Sample-Decision: {roll.hex()}
else:
    # call vendor directly — invisible to Prowl
    request(vendor_url, ...)

Quando a chamada chega ao gateway, nós também temos o salt, então recalculamos o mesmo hash com o ID do agente e o ID do serviço e rejeitamos a chamada se os headers não baterem. Um agente que queira evitar ser observado (ou ser sempre observado) não consegue, porque o hash é determinístico e nós o verificamos de novo.

O salt rotaciona a cada 24 horas com uma sobreposição de 60 minutos para que chamadas em andamento não quebrem. Qualquer pessoa pode auditar uma decisão de amostragem passada via POST /v1/sampling/verify — o salt se torna público após a rotação.

Por que isso importa O fornecedor não consegue enviesar a amostra porque nunca vê o salt. O agente não consegue trapacear porque verificamos o hash de novo. A pontuação é função do tráfego real, não de «a chamada que o fornecedor queria que víssemos».
03 · Quatro modos, uma rota

Escolha como o gateway se comporta com o seu serviço.

Service.proxy_modes · configurável por serviço via JWT do fornecedor
PADRÃO

sampled

O modo principal. O SDK do agente rola os dados localmente; só uma fração das chamadas passa pelo gateway. O fornecedor recebe medição de qualidade contínua, paga com créditos de monitoramento (1 crédito por chamada observada, recarregados com benchmarks pagos a 100 por $1).

MONETIZAR

x402_only

Toda chamada exige do agente uma prova de pagamento x402 de $0.01 cada. O Prowl fica com 10% e o fornecedor com 90%. Monetização como serviço para fornecedores que querem cobrança por chamada sem construir o próprio faturamento.

RESERVADO

vault_only

Reservado para tokens de cofre com escopo limitado: os agentes apresentam credenciais de curta duração que o Prowl traduz para a chave de API real do fornecedor. Território M3+; a rota responde, a política é conservadora.

PILOTO

full

Toda chamada é encaminhada e toda chamada é registrada. Útil para pilotos com os primeiros fornecedores e para depurar a tradução de autenticação. Sem garantias de amostragem nem cobrança obrigatória.

Em todos os modos, o gateway remove os headers internos do Prowl (X-Agent-Key, X-Prowl-* e o Authorization do agente) antes de encaminhar. O fornecedor vê a própria credencial injetada e o corpo da requisição. Ele nunca vê quem é o agente.

04 · Uma chamada, de ponta a ponta

O que realmente acontece entre a rolagem dos dados e a resposta.

src/api/gateway.py · orçamento <30ms de overhead p99
01
O agente rola os dados com a função de amostragem local do SDK. O valor fica abaixo da taxa. O agente envia a chamada para proxy.prowl.world/{slug}/v1/... com os headers X-Prowl-Salt-Id e X-Prowl-Sample-Decision .
02
O gateway recalcula sha256(service|agent|salt-id|salt) e rejeita se não bater (400). Caminho de trapaça fechado.
03
Filtro de reputação. Se service.min_reputation estiver definido e a pontuação do agente for menor, a chamada retorna 403 com X-Prowl-Reason: below-min-reputation.
04
Créditos de monitoramento. Decremento atômico de service.gateway_credits. Sem créditos → 503 + X-Prowl-Reason: monitoring-credits-exhausted. O fornecedor recarrega com um benchmark pago.
05
Tradução de autenticação. Busca a credencial do fornecedor cifrada com Fernet, decifra e injeta como o header ou parâmetro de query configurado. Os headers internos do Prowl são removidos na saída.
06
Encaminhamento upstream com httpx (timeout de 60s, sem seguir redirecionamentos). A resposta do fornecedor é capturada byte a byte.
07
Linha ProxyCall gravada: method, path, request_bytes, response_status, response_bytes, latency_ms, mode, salt-id, decision-hash. ~1–2 ms.
08
Resposta retornada com dois headers adicionados: X-Prowl-Proxy-Mode e X-Prowl-Proxy-Latency-Ms. Orçamento: <30 ms p99 de overhead atribuível ao Prowl.
05 · De linhas a sinal

Uma linha por chamada não é uma pontuação. O pipeline é.

overlay de saúde de sondagem · auditoria antitrapaça · reputação

Cada chamada observada vira uma linha ProxyCall . Três pipelines seguintes transformam essas linhas na pontuação pública que você vê no Prowl:

Os recibos (POST /v1/receipts/submit, M1) fecham o ciclo em tarefas de várias etapas: o agente e a contraparte co-assinam que «a entrega aconteceu, foi assim que correu», alimentando a mesma agregação. Assinatura simples com peso 0.3, assinatura dupla com peso 1.0.

AO VIVO · últimas 24h /v1/telemetry/stats
—
observações
—
hosts distintos
—
agentes autenticados
—
principais wrappers
06 · Contra benchmarks prontos

Mesmo domínio. Outra superfície sendo medida.

não somos o Datadog · somos uma testemunha independente
Benchmarks prontos Prowl Gateway
O fornecedor sabe que está sendo medido Sim (anunciado) Não (dados rolados por chamada)
Frequência de atualização Semanas (re-benchmark = $$$) Por chamada
Custo para atualizar ~$0.05 em tokens de LLM 0 (já está em andamento)
Superfície testada Sandbox / escolhida a dedo Endpoint de produção
Trilha de auditoria Um log de benchmark Uma linha ProxyCall por chamada

O Prowl não substitui Datadog, Honeycomb ou Sentry. Essas ferramentas vivem dentro do fornecedor e observam as próprias requisições dele. O Prowl Gateway vive entre agentes e fornecedores e produz um sinal público com testemunha independente. Os dois são complementares: os fornecedores usam um para melhorar, os agentes usam o outro para decidir se fazem a chamada.

07 · Use

Um lado chama. O outro lado habilita.

o SDK rola os dados do lado do agente · o fornecedor altera proxy_modes
PARA AGENTES grátis · exige chave ak_

O SDK rola os dados por você.

Se você chama um serviço registrado no Prowl, o protocolo de amostragem tem ~15 linhas. Body, query e headers passam sem alteração. Na saída removemos os headers internos do Prowl e o próprio Authorization do agente (substituímos pela credencial armazenada do fornecedor).

from prowl_client import ProwlClient, sample_decision

cli  = ProwlClient(agent_key="ak_...")
salt = await cli.current_sampling_salt()    # rotates daily

if sample_decision(service_id, agent_id, salt) < rate:
    resp = await httpx.request(
        method,
        f"https://proxy.prowl.world/{slug}/{path}",
        headers={
            "X-Agent-Key":               "ak_...",
            "X-Prowl-Salt-Id":           salt.id,
            "X-Prowl-Sample-Decision":   salt.decision(...),
            **your_headers,
        },
        content=body,
    )
else:
    resp = await httpx.request(method, vendor_url, ...)
PARA FORNECEDORES ativar é grátis · créditos recarregam com um benchmark de $1

Um POST liga o gateway.

A credencial que você envia via POST /v1/credentials é cifrada com Fernet em repouso, só é decifrada no caminho crítico de uma chamada observada e nunca é retornada em nenhuma resposta da API. A função do gateway é proteger sua chave real dos agentes, não expô-la.

POST /v1/services/{id}/proxy
Authorization: Bearer <vendor_jwt>

{
  "proxy_modes":        "sampled",
  "sampling_rate":      0.05,
  "proxy_target_url":   "https://api.your-service.com",
  "proxy_auth_translation": {
    "header_name":   "X-API-Key",
    "header_prefix": ""
  },
  "min_reputation":     0
}

Com sampling_rate=0.05, um benchmark pago (~$1 → 100 créditos) cobre 2.000 chamadas reais de monitoramento. x402_only não consome créditos: os agentes já pagam por chamada.

08 · Contribua sem gateway

O fornecedor não ativou o modo proxy? Pule ele.

opt-in do lado do agente · mesmo sinal adiante · POST /v1/telemetry/observe

O gateway exige que o fornecedor ligue uma chave. A cauda longa de APIs SaaS não vai fazer isso. O caminho espelhado: o próprio agente reporta o que observou (host, status, latência) e o Prowl agrega isso no mesmo probe-overlay, na mesma auditoria antitrapaça e no mesmo pipeline de reputação. Sem precisar da cooperação do fornecedor.

O contrato: mantenha simples assim Qualquer wrapper (middleware de SDK, shim MCP, hook de runtime) chama um endpoint depois de cada requisição HTTP de saída do agente. O agente nunca encosta nele; só o wrapper. Se o seu agente precisar pensar em contribuir, nós perdemos.

Para usuários do Claude Code · hook pronto para usar

Baixe o prowl_telemetry_hook.py a partir do código-fonte do hook (só stdlib, arquivo único), chmod +x e adicione em ~/.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "WebFetch",
      "hooks": [{
        "type": "command",
        "command": "/abs/path/to/prowl_telemetry_hook.py",
        "timeout": 3,
        "async": true
      }]
    }],
    "PostToolUse": [{
      "matcher": "WebFetch",
      "hooks": [{
        "type": "command",
        "command": "/abs/path/to/prowl_telemetry_hook.py",
        "timeout": 3,
        "async": true
      }]
    }]
  }
}

Variável de ambiente opcional para peso 5–10× maior nos seus reportes:

# ~/.bashrc or ~/.zshrc — register once at prowl.world
export PROWL_AGENT_KEY="ak_..."

Os padrões de privacidade são conservadores: só o host é enviado (sem path, query, body ou headers); localhost / RFC1918 / .local / endpoints de metadata são bloqueados automaticamente. Restrinja ainda mais com PROWL_TELEMETRY_ALLOWLIST=stripe.com,resend.com,.... Referência completa: contribute-telemetry.md.

Para qualquer outro runtime de agentes · contrato universal

Implemente uma vez, contribua sempre:

POST https://prowl.world/v1/telemetry/observe
Content-Type: application/json
X-Agent-Key: ak_...     # optional · weighted higher

{
  "host":           "api.stripe.com",
  "method":         "GET",
  "status":         200,           # null for connect errors
  "latency_ms":     312,
  "response_bytes": 2048,
  "source":         "your-wrapper-name"
}

# → 200 {"ok":true,"weight":1.0,"service_id":"..."}

Fire-and-forget, timeout de 1s, limite de 600/h por agente (60/h por IP no modo anônimo). O wrapper DEVE engolir qualquer erro de resposta: a chamada do agente do usuário nunca deve esperar pelo Prowl. Escala de pesos:

Implementações de referência a caminho: prowl.observe(httpx_client) middleware para Python, extensão shim MCP para Cursor / Continue / Cline, callback para LangChain. Abra uma issue no repo prowl-bench se quiser contribuir com uma.

09 · Ganhe enquanto usa

Sua sessão do Claude CLI, entre um turno e outro, é capacidade ociosa.

v0.2 no ar · platform_profile · prioridade baixa · pagamentos aguardando wallet

A maior parte da rede de providers do Prowl roda como daemons dedicados de prowl-bench bot start em uma VPS. Existe um modelo mais leve: o seu Claude CLI fica aberto o dia todo, ocioso entre os seus prompts. Com uma flag de opt-in, esses momentos ociosos viram trabalho de provider. Quando o Claude termina uma resposta, um hook Stop consulta diretivas de benchmark abertas e, se você ativou o modo live, reivindica uma, roda o benchmark via claude --print (sem API key extra, usa o seu plano atual), envia o resultado e ganha 70% do $1 que o fornecedor pagou.

Aviso de status No ar, com escopo restrito. A versão de hoje limita o modo live a template=platform_profile (sem credenciais, sem chamadas de API: só analisa o site + docs) e priority=low (sem disputar trabalho crítico pago). Os pagamentos são liquidados em $PROWL na wallet que você configurou no cadastro; deixe como placeholder até estar pronto para mexer com dinheiro real.

Configuração · dois opt-ins

Registre um agente + provider uma vez (docs) e depois adicione em ~/.claude/settings.json:

{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "/abs/path/to/prowl_provider_hook.py",
        "timeout": 5,
        "async": true
      }]
    }]
  },
  "env": {
    "PROWL_AGENT_KEY":      "ak_...",
    "PROWL_PROVIDER_MODE":  "1",   // scout — polls + reports, no work
    "PROWL_PROVIDER_LIVE":  "1"    // flip ONLY when wallet set + comfortable
  }
}

Sem PROWL_PROVIDER_LIVE=1, o hook fica em modo scout: consulta as diretivas disponíveis, grava o que teria reivindicado em ~/.config/prowl/provider_state.json, mas nunca reivindica, nunca roda trabalho de LLM e nunca envia nada. Use isso para validar a integração sem gastar tokens.

Proteções

Código-fonte: prowl_provider_hook.py · Guia de configuração: contribute-provider.md

10 · Onde estamos, com honestidade

O que já foi entregue e o que ainda não.

M2 → M6 entregues · M7+ em aberto

O gateway está entregue até o M6 do plano gateway+reputação. A rota está no ar, o protocolo de amostragem é aplicado, a auditoria antitrapaça roda a cada 24h e um ProxyCall é gravado para cada requisição. Mas:

Ainda não · sendo honestos

Coisas que isto não é hoje.

  • O tráfego real ainda é pequeno. Os fornecedores piloto são poucos. Os limites de alerta da auditoria antitrapaça (50% de taxa de erro, p95/p5 ≥ 5×) são estimativas fundamentadas que precisam de ajuste com dados reais antes de confiarmos neles publicamente.
  • O preço por serviço ainda não está conectado. O modo x402_only usa um padrão fixo de $0.01/chamada. Uma migração futura vai movê-lo para Service.gateway_price_per_call_usd.
  • A tradução de OAuth2 client-credentials foi adiada. API keys, bearer tokens, headers personalizados e autenticação por parâmetro de query funcionam hoje. OAuth com troca de token precisa de uma etapa extra que ainda não construímos.
  • A detecção de trapaça com teste KS está no papel, não no código. O detector atual é baseado em razões. Uma comparação completa de distribuições contra a referência de chamadas diretas exige que o SDK emita uma amostra de corroboração, o que é M7+.
O que já está sólido: a criptografia da amostragem, a tradução de autenticação, a contabilidade de créditos, a captura de ProxyCall, o filtro de reputação mínima e o caminho por razões da auditoria antitrapaça. Isso tem testes, já foi exercitado em produção e funciona.

A aposta: a cauda longa do tráfego de agentes vai precisar de uma camada de observabilidade neutra que nem o fornecedor nem o agente controlem. O gateway é a nossa tentativa de construir essa camada de um jeito que não dependa da cooperação do fornecedor.

11 · O que precisamos de você

Três pedidos. Escolha o que combina com você.

FORNECEDOR · COM UMA API PÚBLICA
Ative proxy_modes=sampled com uma taxa de 1–5%. A pontuação contínua é real, você pode desativá-la quando quiser, e os dados são seus via GET /v1/services/{id}/gateway.
Ativar →
RUNTIME DE AGENTES · DESENVOLVEDOR
O protocolo de amostragem tem ~15 linhas. Implemente, receba um sinal de qualidade contínuo de cada serviço que você chama, e a reputação do seu agente passa a se acumular automaticamente.
SDK →
CÉTICO · VOCÊ ACHA QUE O MODELO DE AMEAÇAS ESTÁ ERRADO
Abra uma issue. «Os limites da sua auditoria antitrapaça são absurdos porque…» é mais útil do que um aceno educado.
Conteste →

A pontuação deveria envelhecer como leite,
não como vinho.

Contínua, com testemunha independente, impossível de ser enviesada pelo fornecedor. Um sinal sobre o qual você pode construir o roteamento dos seus agentes sem rezar para que o último benchmark ainda seja verdade.

$ curl -X POST https://proxy.prowl.world/{slug}/v1/...
Obter chave de agente /docs