PTENES
Biblioteca · servicio HTTP · CLI — sin dependencias

Una puerta para toda decisión.

Límite de gasto, caché y registro de costos en cada consulta a Jev. Y cuando Jev deja de funcionar, tu sistema no cae con él: la respuesta pasa a revisión humana.

jev-gw — una puerta para cada decisión de Jev
Qué es

Llamar a Jev desde cinco lugares diferentes es el problema

Cada punto de integración reinventa el manejo de errores, nadie sabe cuánto se gastó en el día y, cuando la API falla, el sistema cae con ella. El gateway es la única puerta que resuelve esto de una vez.

💰 Límite de gasto diario

Un valor en dólares por día, verificado antes de cada consulta. Si se excede, pasa a revisión humana: no sirve descubrir el perjuicio después.

🛟 Falla conservadora

Jev fuera de servicio, clave incorrecta, tiempo de espera agotado, respuesta extraña: todo devuelve review. Ninguna falla de infraestructura se lanza como excepción para quien hizo la llamada.

📊 Costo por llamada

Una línea JSONL con costo, latencia y decisión. El state — donde viven los datos de tu cliente — no se registra.

Cómo funciona

El camino de una decisión

Seis etapas, siempre en este orden; el orden fue elegido, no sorteado.

validación→ caché→ presupuesto→ consulta a Jev→ política→ registro

Caché antes del presupuesto

Una respuesta ya guardada no cuesta nada, así que no tiene sentido bloquearla por el límite. Al contrario, un sistema que superó el límite perdería incluso lo que ya pagó.

Presupuesto antes de la consulta

Verificar después sería verificar el perjuicio, no evitarlo.

Política después de la respuesta

Los umbrales son de tu dominio, no del modelo. La clasificación de correos y la clasificación clínica usan el mismo Jev y distintos umbrales.

El documento ARQUITETURA.md explica cada módulo, el contrato de fallas y lo que el gateway no hace.

Requisitos previos

Python 3.10 y nada más

Sin framework, sin base de datos, sin cola, sin pip install. La clave solo se exige en la primera consulta real.

Python 3.10+

El gateway completo usa solo la biblioteca estándar.

python3 --version

Una clave de Jev

TypeSafe directamente o a través de OpenRouter. Solo al hacer una consulta real; las pruebas y los ejemplos funcionan sin ella.

export TYPESAFE_API_KEY=...
# o: OPENROUTER_API_KEY + JEV_PROVIDER=openrouter

Nada más

Copia la carpeta jev_gw/ dentro de tu proyecto si lo prefieres; es autocontenida a propósito.

git clone https://github.com/inematds/jev-gw.git
Guía de uso · paso a paso

Tres formas de integrarlo

Las tres llaman a la misma función. No hay lógica que solo tenga el servidor.

1

Descarga y ejecuta las pruebas

Las 23 pruebas usan un evaluador controlado: la suite no gasta ni un centavo.

git clone https://github.com/inematds/jev-gw.git
cd jev-gw && python3 -m unittest discover -s testes
# Ran 23 tests ... OK
2

Sistema en Python: importa

Ningún proceso adicional ni puerto abierto. Es la forma más directa de integrarlo.

from jev_gw import decidir

saida = decidir(pedido)
if saida['acao'] == 'suggest':
    encaminhar(saida['resposta']['answers']['fila']['choice'])
else:
    fila_de_revisao(saida['motivo'])  # incluye "Jev se cayó"
3

Otro lenguaje: inicia el servicio

Escucha solo en 127.0.0.1 — el gateway guarda tu clave.

python3 -m jev_gw servir
# jev-gw escuchando en http://127.0.0.1:8770 (panel en /painel)

curl -X POST localhost:8770/decidir \
  -H 'content-type: application/json' -d @pedido.json
4

La solicitud

Es el formato de la propia API de Jev: contexto y una o más preguntas con alternativas.

{
  "model": "jev-1.13.0",
  "state": "Cliente: comprei ontem e quero devolver, nem abri a caixa.",
  "questions": {
    "fila": {
      "type": "choice",
      "instructions": "Para qual fila encaminhar?",
      "criteria": {
        "reembolso": "Pedido de devolução ou estorno",
        "suporte": "Dúvida de uso ou defeito",
        "insuficiente": "Não dá para decidir com o que está escrito"
      }
    }
  }
}
5

Ajusta el límite y la caché

Todo mediante variables de entorno, todo con valores predeterminados que ya funcionan. 0 al llegar al límite, el gateway se apaga.

export JEV_GW_TETO_DIARIO=1.00   # dólares por día
export JEV_GW_TTL_CACHE=900     # segundos que vale una respuesta
export JEV_GW_TIMEOUT=5         # segundos por consulta
6

Sigue el gasto

Panel en el navegador o JSON en la terminal para integrarlo a tu monitoreo.

python3 -m jev_gw custo
# {"chamadas": 2, "consultas_reais": 1, "cache": 1, "gasto_usd": 1.6e-05, ...}

http://127.0.0.1:8770/painel  # gasto del día, latencia, últimas llamadas
7

El contrato de error

Solo un error se lanza como excepción: una solicitud fuera del contrato de Jev, que es un error tuyo y debe hacerse visible. Todo lo demás es una decisión.

# 200  decisión tomada — incluso "review" porque Jev se cayó
# 422  solicitud íntegra, pero fuera del contrato de Jev
# 400  JSON mal formado u opción no válida
# si se supera el límite, devuelve 200, no 429: para quien llamó no es un error,
# es una decisión de enviar a revisión
Ejemplos

Medido el 22/09/2026, no estimado

Una consulta real a Jev por OpenRouter, y la misma consulta repetida justo después.

Consulta real

Decisión reembolso, confianza 1,0.
610 ms · US$ 0,0000155

La misma consulta, otra vez

Vino del caché.
0 ms · US$ 0,00

Sin clave configurada

Devuelta review con el motivo, lo registró y el cliente siguió. Ninguna excepción.

Evidencia sin procesar: reports/smoke-2026-09-22.jsonl. Esto es una prueba de integración y de contrato — no es un benchmark de calidad de decisión, y no se afirma ningún ahorro sin una medición comparable.

Hoja de ruta

Lo que existe y lo que no existe

Estado real al 22/09/2026, sin promesas sobre lo que aún no se ha escrito.

Listo
Biblioteca, servicio HTTP y CLILa misma función detrás de las tres. 23 pruebas aprobadas, incluido el flujo de error y el servidor de punta a punta.
Listo
Límite, caché, registro y panelCaché y límite medidos en una llamada real; el panel muestra el gasto del día, la latencia y las últimas llamadas.
No hace
No es un proxy para agentes de códigoNo se interpone entre tu Codex/Claude Code y el modelo. Para eso existe jev-gateway (proyecto independiente, TypeScript): es complementario a este.
No hace
No ejecuta accionesDevuelve una sugerencia. Quien la aplica es tu sistema, con sus permisos. Aquí dentro, ninguna decisión se convierte en una llamada a la API, un correo electrónico o una escritura en la base de datos.
Siguiente
Umbrales por preguntaHoy el umbral se aplica a la solicitud completa; lo natural es que cada pregunta tenga el suyo, porque el costo de equivocarse cambia según la pregunta.
Siguiente
Adoptar en openpcbotv3El bot ya tiene su propio gateway con presupuesto y modo de observación. Unificarlos significa tener un solo lugar para el límite, el costo y el registro.