withOhm
oficialPlano de control de tráfico de IA (gobernador de caos): reproducción de prompts en Redis, ingesta web compatible, libro mayor de organizaciones con SSO, Agent Shell. Entrada compatible con OpenAI mediante BYOK. Cursor opcional; MCP es un cliente de compatibilidad.
¿Qué puedes hacer con withOhm MCP?
- Replay de prompts en caché — Pide a tu IA que reenvíe una solicitud idéntica y obtén una respuesta byte-idéntica con
X-AT-Cache: HIT, facturada como un acierto en lugar de una llamada de modelo nueva. - Verificar recibos criptográficos — Haz que tu asistente compruebe el JWS firmado
X-Ohm-Receipten cualquier respuesta usandoverify_receipt.pypara demostrar que un acierto fue real, no afirmado. - Obtener contexto web público — Usa
ohm_fetch_webpara recuperar páginas públicas como markdown/JSON redactado, con indicadores de cumplimiento comoweb_purposeyweb_compliance_ackaplicados. - Consultar uso y facturación — Consulta
ohm_usagepara ver el consumo medido en los medidoresohm_cache_hit,ohm_cache_missyohm_web_fetch, además de la estimación de ahorro entre inquilinos. - Chatear a través del proxy — Usa
ohm_chatpara enviar solicitudes compatibles con OpenAI a cualquier proveedor (OpenAI, Anthropic, Google, etc.) mediante una única URL base, con BYOK víaX-Ohm-Upstream-Key.
Documentación
Ohm (withOhm)
En una frase: withOhm es un proxy que se sitúa entre tu aplicación (o Cursor) y OpenAI/Anthropic/etc. — reproduce solicitudes byte-idénticas de forma gratuita en lugar de volver a pagar al modelo, obtiene contexto web público bajo controles de cumplimiento, y te da una única factura auditable con recibo criptográfico en lugar de varias facturas opacas de proveedores.
El conducto medido sobre inferencia desperdiciada y repetida: entrada compatible con OpenAI, reproducción de indicaciones con Redis, ingesta web conforme, arrendamiento de organización con SSO y un libro mayor corporativo limpio. Para las empresas, el mismo conducto es un gobernador del caos para el gasto en IA (cuña canónica: docs/GEM_POSITION.md). Cursor/MCP son clientes opcionales.
Aciertos de reproducción exacta que cuestan cero tokens ascendentes. Consistencia entre proveedores. Localidad — lecturas de borde Redis. Valor de reproducción y auditoría. Apunta cualquier cliente compatible con OpenAI (o el Ohm Agent Shell) a una única URL base. Conserva tus claves o usa un grupo gestionado. Alquila la plomería; gobierna el caos.
Sitio: https://www.withohm.dev · API: https://api.withohm.dev/v1 · Workbench: /workbench · Arquitectura: docs/ARCHITECTURE.md · Visión: docs/VISION.md · Empresa: docs/ENTERPRISE_CHAOS.md · Gem: docs/GEM_POSITION.md · Auditoría de cuidado: docs/CARE_AUDIT.md — la disciplina de mantenimiento de la verdad aplicada a cada afirmación pública; léela antes de juzgar la relación ingeniería-atracción.
Licencia: MIT (ver LICENSE + NOTICE). El código fuente es abierto; el conducto withOhm alojado sigue siendo un servicio comercial medido. Los nombres de paquetes/claves pueden seguir diciendo at-utility / sk-at-* (prefijo AT heredado); el producto es withOhm.
Etapa, sin rodeos
Sin giros: withOhm está en pre-semilla y pre-atracción por diseño, no por accidente de omisión. Tabla completa y regla de fuentes: docs/STATUS.md.
| Hecho | Ahora |
|---|---|
| Versión | 0.1.2 |
| Socios de diseño | 0 de los 10 equipos objetivo (docs/DESIGN_PARTNERS.md — "desde cero") |
| Financiación institucional | Ninguna; pre-incorporación (docs/distribution/INVESTOR_INTRO_TARGETS.md) |
| Región | Única (us-east-1); sin SLA contractual |
| Cobertura de pruebas automatizadas | 30 archivos, más de 215 funciones de prueba en tests/ (pytest -q, CI en cada push) |
La disciplina de ingeniería y auditoría (pruebas, recibos firmados, INSPECTION.md, docs/CARE_AUDIT.md) es en lo que se ha invertido el tiempo pre-atracción — lee los números de etapa y la disciplina juntos, no uno solo.
Verifícalo tú mismo
La prosa es barata; cada afirmación que soporta carga viene con el comando que la comprueba.
| Afirmación | Verificación |
|---|---|
| El conducto está activo (ambos planos) | curl -s https://api.withohm.dev/health && curl -s https://api.withohm.dev/ready |
| Los aciertos se reproducen y se facturan como aciertos | Envía el mismo cuerpo dos veces; la segunda respuesta tiene X-AT-Cache: HIT + X-AT-Billed-USD |
| Un acierto es criptográfico, no afirmado | Las respuestas de acierto llevan X-Ohm-Receipt (JWS firmado) — verifica: python scripts/verify_receipt.py "<receipt>" (docs/RECEIPTS.md) |
| Las claves de firma son públicas | curl -s https://api.withohm.dev/.well-known/http-message-signatures-directory |
| Límites y rechazos publicados | curl -s https://api.withohm.dev/v1/public/honesty — lo que no haremos, con el endpoint que prueba cada elemento |
| Contador de ahorro entre inquilinos | curl -s https://api.withohm.dev/v1/public/stats (siempre estimate_only: true) |
| La ruta de revisión funciona cada noche contra producción | Golden path workflow history |
Contrato local para desarrolladores (estable)
| Rol | Dirección | Notas |
|---|---|---|
| Entrada pública de cliente | http://localhost:8081/v1 | Borde Rust. Apunte aquí los kits de desarrollo de software de OpenAI. |
| Plano de control interno | http://localhost:8080 | Python FastAPI. Los proxies Rust van aquí en caso de fallo de caché. No des esto a desconocidos. |
| Autenticación | Authorization: Bearer <ohm-api-key> | Clave de arranque local: sk-at-dev (ver .env). |
| BYOK | X-Ohm-Upstream-Key: <provider-key> | Requerido en fallo de caché para gpt/claude a menos que haya claves gestionadas por entorno/empresa. |
| Selección de modelo | Campo JSON model | mock permanece local; gpt-* / o* → OpenAI; claude-* → Anthropic; gemini-* → Google; deepseek-* → DeepSeek; kimi-* / moonshot-* → Moonshot; glm-* → Z.ai; qwen* → Qwen; grok-* → xAI (todos compatibles con OpenAI, BYOK). |
from at_utility_sdk import openai_client, LOCAL_BASE_URL
client = openai_client(
"sk-at-dev",
base_url=LOCAL_BASE_URL,
upstream_api_key="sk-proj-...",
)
completion = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
)
Inicio rápido (Docker Compose)
cd <repo-root> # e.g. clone of iwasinnam2/ohm
copy .env.example .env
# Edit .env: set OPENAI_API_KEY for local env-fallback; keep OPENAI_BASE_URL=https://api.openai.com/v1
docker compose --profile rust up --build -d
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\release_smoke.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File scripts\railgun_smoke.ps1
Ejecución nativa en la nube / agente (sin Docker): ver AGENTS.md.
El smoke de release verifica salud, fallo/acierto simulado, fallo/acierto de OpenAI (cuando hay una clave presente), cabecera de plano Rust y contadores de uso. El smoke de Railgun verifica cabeceras BYOK, seat_plus_meters y la forma del endpoint de checkout.
Cursor / MCP
MCP local stdio más un MCP remoto sin estado sobre HTTP transmisible (núcleo sin estado MCP 2026-07-28). Base pública: https://api.withohm.dev/v1. Socios: docs/LAUNCH_GTM.md · https://www.withohm.dev/design-partners
pip install withohm-mcp
# monorepo dev alternative: pip install -e ".[mcp]"
# stdio (Cursor local attach): set OHM_API_KEY (required). Optional: OHM_UPSTREAM_KEY, OHM_BASE_URL
# Plugin: .cursor-plugin/ + mcp.json — see docs/CURSOR.md
# Remote (stateless streamable HTTP at /mcp, default port 8091):
# OHM_MCP_TRANSPORT=http ohm-mcp (or: ohm-mcp-http)
# Auth is per-request: clients send `Authorization: Bearer sk-at-*`
# (falls back to OHM_API_KEY env). Host allowlist: OHM_MCP_ALLOWED_HOSTS.
Honestidad sobre streaming y conmutación por error
- No streaming de completaciones de chat: el borde Rust puede reintentar el upstream de Python (URL primaria y luego de respaldo) antes de devolver un cuerpo. Las escrituras de caché ocurren después de una respuesta completa exitosa.
- Streaming de completaciones de chat: la conmutación por error pre-primer-byte está implementada. El plano Python abre con avidez el stream upstream, reintenta una vez si muere antes del primer byte, y devuelve un error HTTP honesto (no un stream de marco de error 200) si ambos intentos fallan; el borde Rust cae en errores de conexión o 5xx pre-primer-byte y reenvía el stream de tokens fragmento a fragmento (sin buffering en el borde). La transferencia de proveedor a mitad de stream después del primer byte sin reconexión del cliente no está soportada — planifica reconexión o no-stream para rutas críticas.
Reglas de entorno
- Los secretos en vivo pertenecen solo a
.env(ignorado por git). .env.examplenunca debe contener un secreto vivo de OpenAI o Stripe.- Después de cambiar
.env, recrea los contenedores:docker compose up -d --force-recreate gateway. OPENAI_BASE_URLdebe serhttps://api.openai.com/v1, nunca el host del sitio webplatform.openai.com.
Límites legales (obligatorio)
La ingesta web es solo pública y limitada por propósito bajo las normas del RGPD/CMA del Reino Unido y CFAA/CCPA de EE. UU. Todo el repositorio debe permanecer dentro de este marco—ver docs/LEGAL.md.
Cuando fetch_web_context es verdadero, los clientes deben enviar:
web_purpose— uno depublic_web_retrieval,business_catalog,public_company_info,job_listingsweb_compliance_ack: true— confirmar solo público, sin recolección de clientes potenciales / expedientes / acceso restringidoterms_ack/dpa_ack: true— vincular plantillas de docs/legal/- opcional
cache_control: "no_store"— omitir escritura en Redis para indicaciones confidenciales
Inspecciona la política en vivo: GET /v1/compliance/policy. Plantillas: Términos, DPA, lista de verificación ascendente bajo docs/legal/.
Arquitectura
| Capa | Rol |
|---|---|
gateway-rs (:8081) | Borde público: caché de protocolo de serialización Redis, proxy, cabecera de plano |
Python gateway (:8080) | API compatible con OpenAI, proveedores, límites de velocidad, medición, arrendamiento, puertas de cumplimiento |
Ingest worker (:8090) | Meta-búsqueda + obtención de páginas públicas → markdown/JSON redactado para fetch_web_context |
src/at_utility/compliance/ | Matriz de propósito, puerta de URL, robots.txt, redacción de PII |
src/ohm_mcp/ | Adjunto MCP de Cursor (ohm_fetch_web, ohm_usage, ohm_chat) |
| Redis líder / réplica | Caché + RL; GET en réplica/lector, SET en líder — docs/REDIS_MESH.md |
infra/ | Terraform + Kubernetes: EKS de una sola región (malla conservada detrás de banderas) |
site/ | Marketing + docs + autoservicio /billing |
Arrendamiento y facturación
La clave de arranque sk-at-dev funciona localmente. Autoservicio: POST /v1/billing/checkout (sitio /billing). Operaciones: emisión con clave de administrador (AT_ADMIN_API_KEYS):
curl.exe -s -X POST http://localhost:8080/v1/admin/tenants `
-H "Authorization: Bearer sk-at-dev" `
-H "Content-Type: application/json" `
-d "{\"plan\":\"payg\",\"label\":\"design-partner-1\",\"terms_ack\":true,\"dpa_ack\":true}"
Los inquilinos suspendidos (POST /v1/admin/tenants/{id}/status con {"status":"suspended"}, o webhook de cancelación de Stripe) reciben HTTP 403.
La medición escribe claves de libro mayor diarias duraderas y sincroniza los medidores de facturación de Stripe cuando stripe_customer_id está configurado (ohm_web_fetch, ohm_cache_hit, ohm_cache_miss).
Libros mayores: El cliente paga a los proveedores (BYOK). El cliente paga asiento + medidores de Ohm. Opcional: pip install -e ".[billing]".
Pruebas
pip install -e ".[dev,billing]"
pytest -q