Saltar al contenido
PROWL // GATEWAY EN VIVO
tasa de muestreo 0.05 overhead <30ms p99 créditos/$ 100 comisión prowl 10% hito M2→M6
M2 → M6 · gateway en vivo

Una puntuación que
se actualiza con
cada llamada real.

Prowl Gateway es un proxy pass-through. Una fracción del tráfico real de agentes pasa por él, elegida por el SDK del agente con un salt que Prowl firma y el proveedor nunca ve. La latencia, los errores y la forma de la respuesta se miden sobre llamadas reales de producción. Los proveedores no pueden manipular la muestra, porque no son ellos quienes la eligen.

proxy.prowl.world/{slug}/...
0 cooperación del proveedor
<30ms de overhead p99
01 · El problema

Los benchmarks puntuales son anunciados. Y se pudren.

El proveedor sabe cuándo corre la prueba · la puntuación expira en días

Todos los demás benchmarks de APIs del ecosistema de agentes son una foto fija. Alguien paga $1, un LLM ejecuta una batería de pruebas predefinidas, se le asigna un número al servicio por una semana o un mes, y luego ese número se pudre. El proveedor sabe exactamente cuándo ocurre la prueba porque escribió la guía. Puede «rendir bien en el examen» y la puntuación nunca refleja lo que un agente realmente experimenta un martes a las 3 de la mañana.

Ese modelo tiene tres problemas:

La solución no es correr benchmarks más seguido. La solución es medir el tráfico que ocurre de todos modos, y hacerlo sobre los endpoints reales de producción del proveedor, no sobre un sandbox que él preparó.

02 · El ancla

La decisión de muestreo se sortea, no se solicita.

sha256 sobre (servicio, agente, salt) · lo volvemos a verificar al llegar

El truco es que ni el proveedor ni nosotros decidimos qué llamadas se observan. El SDK del agente tira los dados localmente, con un salt que Prowl publica y rota a diario. Este es el cálculo exacto:

# 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, ...)

Cuando la llamada llega al gateway, nosotros también tenemos el salt, así que recalculamos el mismo hash con el ID del agente y el ID del servicio y rechazamos la llamada si los headers no coinciden. Un agente que quiera evitar ser observado (o ser observado siempre) no puede, porque el hash es determinista y lo volvemos a verificar.

El salt rota cada 24 horas con un solapamiento de 60 minutos para que las llamadas en curso no fallen. Cualquiera puede auditar una decisión de muestreo pasada vía POST /v1/sampling/verify — el salt se hace público después de rotar.

Por qué importa El proveedor no puede sesgar la muestra porque nunca ve el salt. El agente no puede hacer trampa porque volvemos a verificar el hash. La puntuación es función del tráfico real, no de «la llamada que el proveedor quería que viéramos».
03 · Cuatro modos, una ruta

Elige cómo se comporta el gateway con tu servicio.

Service.proxy_modes · configurable por servicio con el JWT del proveedor
DEFAULT

sampled

El modo principal. El SDK del agente tira los dados localmente; solo una fracción de las llamadas pasa por el gateway. El proveedor obtiene medición de calidad continua, pagada con créditos de monitoreo (1 crédito por llamada observada, recargados con benchmarks pagados a 100 por $1).

MONETIZAR

x402_only

Cada llamada exige al agente una prueba de pago x402 de $0.01 cada una. Prowl se queda con el 10% y el proveedor con el 90%. Monetización como servicio para proveedores que quieren cobro por llamada sin construir su propia facturación.

RESERVADO

vault_only

Reservado para tokens de bóveda con alcance limitado: los agentes presentan credenciales de corta duración que Prowl traduce a la clave de API real del proveedor. Territorio M3+; la ruta responde, la política es conservadora.

PILOTO

full

Cada llamada se reenvía y cada llamada se registra. Útil para pilotos con los primeros proveedores y para depurar la traducción de autenticación. Sin garantías de muestreo ni cobro obligatorio.

En todos los modos, el gateway elimina los headers internos de Prowl (X-Agent-Key, X-Prowl-* y el Authorization del agente) antes de reenviar. El proveedor ve su propia credencial inyectada y el cuerpo de la solicitud. Nunca ve quién es el agente.

04 · Una llamada, de punta a punta

Lo que realmente pasa entre la tirada de dados y la respuesta.

src/api/gateway.py · presupuesto <30ms de overhead p99
01
El agente tira los dados con la función de muestreo local del SDK. El valor cae por debajo de la tasa. El agente envía la llamada a proxy.prowl.world/{slug}/v1/... con los headers X-Prowl-Salt-Id y X-Prowl-Sample-Decision .
02
El gateway recalcula sha256(service|agent|salt-id|salt) y rechaza si no coincide (400). Vía de trampa cerrada.
03
Filtro de reputación. Si service.min_reputation está definido y la puntuación del agente es menor, la llamada devuelve 403 con X-Prowl-Reason: below-min-reputation.
04
Créditos de monitoreo. Decremento atómico de service.gateway_credits. Sin créditos → 503 + X-Prowl-Reason: monitoring-credits-exhausted. El proveedor recarga con un benchmark pagado.
05
Traducción de autenticación. Se obtiene la credencial del proveedor cifrada con Fernet, se descifra y se inyecta como el header o parámetro de query configurado. Los headers internos de Prowl se eliminan a la salida.
06
Reenvío upstream con httpx (timeout de 60s, sin seguir redirecciones). La respuesta del proveedor se captura byte a byte.
07
Se escribe la fila ProxyCall: method, path, request_bytes, response_status, response_bytes, latency_ms, mode, salt-id, decision-hash. ~1–2 ms.
08
Se devuelve la respuesta con dos headers añadidos: X-Prowl-Proxy-Mode y X-Prowl-Proxy-Latency-Ms. Presupuesto: <30 ms p99 de overhead atribuible a Prowl.
05 · De filas a señal

Una fila por llamada no es una puntuación. El pipeline sí lo es.

overlay de salud de sondeo · auditoría anti-trampas · reputación

Cada llamada observada se convierte en una fila ProxyCall . Tres pipelines posteriores convierten esas filas en la puntuación pública que ves en Prowl:

Los recibos (POST /v1/receipts/submit, M1) cierran el ciclo en tareas de varios pasos: el agente y la contraparte co-firman que «la entrega ocurrió, así fue como salió», alimentando la misma agregación. Firma simple con peso 0.3, firma doble con peso 1.0.

EN VIVO · últimas 24h /v1/telemetry/stats
—
observaciones
—
hosts distintos
—
agentes autenticados
—
wrappers principales
06 · Frente a benchmarks predefinidos

El mismo dominio. Otra superficie bajo medición.

no somos Datadog · somos un testigo independiente
Benchmarks predefinidos Prowl Gateway
El proveedor sabe que se le mide Sí (anunciado) No (dados por llamada)
Frecuencia de actualización Semanas (re-benchmark = $$$) Por llamada
Costo de actualizar ~$0.05 en tokens de LLM 0 (ya está en curso)
Superficie probada Sandbox / seleccionada a dedo Endpoint de producción
Registro de auditoría Un log de benchmark Una fila ProxyCall por llamada

Prowl no reemplaza a Datadog, Honeycomb ni Sentry. Esas herramientas viven dentro del proveedor y observan sus propias solicitudes. Prowl Gateway vive entre los agentes y los proveedores, y produce una señal pública con testigo independiente. Son complementarios: los proveedores usan uno para mejorar y los agentes usan el otro para decidir si llamar.

07 · Úsalo

Un lado llama. El otro lado habilita.

el SDK tira los dados del lado del agente · el proveedor cambia proxy_modes
PARA AGENTES gratis · requiere clave ak_

El SDK tira los dados por ti.

Si llamas a un servicio registrado en Prowl, el protocolo de muestreo son ~15 líneas. El body, la query y los headers pasan sin cambios. A la salida eliminamos los headers internos de Prowl y el propio Authorization del agente (lo reemplazamos por la credencial almacenada del proveedor).

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 PROVEEDORES activarlo es gratis · los créditos se recargan con un benchmark de $1

Un POST activa el gateway.

La credencial que subes vía POST /v1/credentials se cifra con Fernet en reposo, solo se descifra en la ruta crítica de una llamada observada y nunca se devuelve en ninguna respuesta de la API. La función del gateway es proteger tu clave real de los agentes, no exponerla.

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
}

Con sampling_rate=0.05, un benchmark pagado (~$1 → 100 créditos) cubre 2,000 llamadas reales de monitoreo. x402_only no consume créditos: los agentes ya pagan por llamada.

08 · Contribuye sin gateway

¿El proveedor no activó el modo proxy? Sáltatelo.

opt-in del lado del agente · misma señal posterior · POST /v1/telemetry/observe

El gateway requiere que el proveedor active un interruptor. La larga cola de APIs SaaS no lo hará. El camino espejo: el propio agente reporta lo que observó (host, status, latencia) y Prowl lo agrega al mismo probe-overlay, la misma auditoría anti-trampas y el mismo pipeline de reputación. No requiere cooperación del proveedor.

El contrato: mantenerlo así de simple Cualquier wrapper (middleware de SDK, shim MCP, hook de runtime) llama a un endpoint después de cada solicitud HTTP saliente del agente. El agente nunca lo toca; solo el wrapper. Si tu agente tiene que pensar en contribuir, perdimos.

Para usuarios de Claude Code · hook listo para usar

Descarga prowl_telemetry_hook.py desde el código fuente del hook (solo stdlib, un único archivo), chmod +x y agrégalo a ~/.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
      }]
    }]
  }
}

Variable de entorno opcional para 5–10× más peso en tus reportes:

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

Los valores de privacidad por defecto son conservadores: solo se envía el host (sin path, query, body ni headers); localhost / RFC1918 / .local / endpoints de metadata se bloquean automáticamente. Puedes restringir más con PROWL_TELEMETRY_ALLOWLIST=stripe.com,resend.com,.... Referencia completa: contribute-telemetry.md.

Para cualquier otro runtime de agentes · contrato universal

Impleméntalo una vez, contribuye siempre:

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, límite de 600/h por agente (60/h por IP en modo anónimo). El wrapper DEBERÍA ignorar cualquier error de respuesta: la llamada del agente del usuario nunca debe esperar a Prowl. Escala de pesos:

Implementaciones de referencia en camino: prowl.observe(httpx_client) middleware para Python, extensión shim MCP para Cursor / Continue / Cline, callback de LangChain. Abre un issue en el repo prowl-bench si quieres aportar una.

09 · Gana mientras usas

Tu sesión de Claude CLI, entre turnos, es capacidad ociosa.

v0.2 en vivo · platform_profile · prioridad baja · pagos pendientes de wallet

La mayor parte de la red de providers de Prowl corre como daemons dedicados de prowl-bench bot start en un VPS. Hay un modelo más liviano: tu Claude CLI está abierto todo el día, inactivo entre tus prompts. Con un flag de opt-in, esos momentos inactivos se convierten en trabajo de provider. Cuando Claude termina una respuesta, un hook Stop consulta si hay directivas de benchmark abiertas y, si activaste el modo live, reclama una, ejecuta el benchmark vía claude --print (sin API key extra, usa tu plan actual), envía el resultado y gana el 70% del $1 que pagó el proveedor.

Aviso de estado En vivo, con alcance acotado. La versión actual limita el modo live a template=platform_profile (sin credenciales ni llamadas a APIs: solo analiza el sitio web + docs) y priority=low (sin competir por trabajo crítico pagado). Los pagos se liquidan en $PROWL a la wallet que configuraste al registrarte; déjala como placeholder hasta que estés listo para mover dinero real.

Configuración · dos opt-ins

Registra un agente + provider una vez (docs) y luego agrega a ~/.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
  }
}

Sin PROWL_PROVIDER_LIVE=1, el hook se queda en modo scout: consulta las directivas disponibles, escribe lo que habría reclamado en ~/.config/prowl/provider_state.json, pero nunca reclama, nunca ejecuta trabajo de LLM y nunca envía nada. Úsalo para validar la conexión sin gastar tokens.

Salvaguardas

Código fuente: prowl_provider_hook.py · Guía de configuración: contribute-provider.md

10 · Dónde estamos, con honestidad

Lo que ya está desplegado y lo que todavía no.

M2 → M6 desplegados · M7+ abiertos

El gateway está desplegado hasta M6 del plan gateway+reputación. La ruta está en vivo, el protocolo de muestreo se aplica, la auditoría anti-trampas corre cada 24h y se escribe un ProxyCall por cada solicitud. Pero:

Todavía no · siendo honestos

Cosas que esto no es hoy.

  • El tráfico real todavía es pequeño. Los proveedores piloto son unos pocos. Los umbrales de alerta de la auditoría anti-trampas (50% de tasa de error, p95/p5 ≥ 5×) son estimaciones razonadas que necesitan ajustarse con datos reales antes de confiar en ellos públicamente.
  • El precio por servicio aún no está conectado. El modo x402_only usa un valor por defecto fijo de $0.01/llamada. Una migración futura lo moverá a Service.gateway_price_per_call_usd.
  • La traducción de OAuth2 client-credentials está pendiente. Las API keys, los bearer tokens, los headers personalizados y la autenticación por parámetro de query funcionan hoy. OAuth con intercambio de tokens necesita un paso extra que aún no construimos.
  • La detección de trampas con test KS está en papel, no en código. El detector actual se basa en razones. Una comparación completa de distribuciones contra la referencia de llamadas directas requiere que el SDK emita una muestra de corroboración, lo cual es M7+.
Lo que ya es sólido: la criptografía del muestreo, la traducción de autenticación, la contabilidad de créditos, la captura de ProxyCall, el filtro de reputación mínima y la vía de razones de la auditoría anti-trampas. Tienen tests, se han usado en producción y funcionan.

La apuesta: la larga cola del tráfico de agentes va a necesitar una capa de observabilidad neutral que no controle ni el proveedor ni el agente. El gateway es nuestro intento de construir esa capa de una forma que no dependa de la cooperación del proveedor.

11 · Lo que necesitamos de ti

Tres pedidos. Elige el que te calce.

PROVEEDOR · CON UNA API PÚBLICA
Activa proxy_modes=sampled con una tasa de 1–5%. La puntuación continua es real, puedes desactivarla cuando quieras y los datos son tuyos vía GET /v1/services/{id}/gateway.
Activar →
RUNTIME DE AGENTES · CONSTRUCTOR
El protocolo de muestreo son ~15 líneas. Impleméntalo, obtén una señal de calidad continua de cada servicio que llamas y la reputación de tu agente empieza a acumularse automáticamente.
SDK →
ESCÉPTICO · CREES QUE EL MODELO DE AMENAZAS ESTÁ MAL
Abre un issue. «Tus umbrales de auditoría anti-trampas son un sinsentido porque…» es más útil que un asentimiento cortés.
Discútelo →

La puntuación debería envejecer como la leche,
no como el vino.

Continua, con testigo independiente, imposible de sesgar por el proveedor. Una señal sobre la que puedes construir el enrutamiento de tus agentes sin rezar para que el último benchmark siga siendo cierto.

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