CreaRack-SL

Worker oracle-keepwarm · Cloudflare Cron (Oráculo)

Descripción

oracle-keepwarm es un Worker de Cloudflare que ejecuta periódicamente (cada 15 minutos, UTC) un ping mínimo al modelo Gemma 4 (gemma-4-26b-a4b-it) de Google AI Studio.

Problema que resuelve: el modelo de Gemma 4 en AI Studio se enfría tras inactividad; la primera consulta del día al Oráculo pegaba un cold start > 80 segundos, causando timeout (2 intentos × 40s) y error “AI Studio timeout” hacia el usuario. El diagnóstico s92 confirmó que la cadena modelo + key + prompt estaban sanas — era exclusivamente un problema de provisión tardia del modelo.

Solución: mantener el modelo “caliente” mediante pings triviales cada 15 minutos, de modo que la primera consulta real responda en ~7-10 segundos como las demás.

Lógica y Configuración

Handler

  • Tipo: scheduled (sin tráfico HTTP, solo cron-triggered)
  • Cadencia: */15 * * * * (cada 15 minutos, UTC)
  • Trigger: Cloudflare Cron Triggers (gratis en plan Workers Free — límite 5/cuenta)

Ping al Modelo

Cada disparo realiza un POST a https://generativelanguage.googleapis.com/v1beta/models/gemma-4-26b-a4b-it:generateContent:

{
  contents: [{ role: 'user', parts: [{ text: 'ping' }] }],
  generationConfig: {
    temperature: 0,
    maxOutputTokens: 8  // Mínimo: solo provisión, sin latencia útil
  }
}
  • Prompt: "ping" (trivial)
  • Tokens de salida: 8 (el mínimo posible — Gemma responde con ~1-2 tokens)
  • Timeout: 90 segundos (holgado para absorber un cold start puntual sin romper el cron)
  • Headers: Content-Type: application/json

Credencial

  • API Key: GOOGLE_AI_API_KEY (compartida con el Oráculo, misma credencial en ambos Workers)
    • Gestión: ver runbook—infra—mcp-token-rotation (sección 1.4, credencial única para toda la cadena Oráculo)
    • Valor: secreto Cloudflare, no committeado

Costes

  • Cloudflare: $0 (Cron Triggers gratis)
  • Google AI Studio: $0 (Gemma 4 es “Free of charge”)
  • Request: ~1 ping/15 min = ~96 requests/día → negociable con Google

Logs y Monitoreo

  • Consola: wrangler tail oracle-keepwarm (desde raíz del workspace)
  • Salida esperada: keepwarm: OK 200 en 625ms (tiempo promedio del primer ping post-deploy)
  • Fallos: logs muestran keepwarm: HTTP <status> o keepwarm: fallo <ErrorName>

Seguimiento de Eficacia (s92)

Condición de éxito: desde el 29-05-2026, la primera consulta del día al Oráculo responde en ~7-10 segundos, sin error “AI Studio timeout”.

Ruta de ajuste (si la cadencia 15min no basta):

  1. El modelo podría enfriarse antes de 15 minutos → bajar a */10 o */5
  2. Editar workers/oracle-keepwarm/wrangler.toml → campo crons
  3. Redeploy: wrangler deploy -c ./workers/oracle-keepwarm/wrangler.toml

Métricas: ver anotación en NEXT.md, sección “Seguimientos con fecha/condición”.

Estructura de Archivos

workers/oracle-keepwarm/
├── src/
│   └── index.ts              # Handler scheduled + lógica del ping
├── wrangler.toml             # Config Wrangler (cron, env, secretos)
└── package.json              # Deps (fetch, JSON parsing)

src/index.ts (~60 LOC)

  • Función default: handler scheduled async
  • Entrada: ScheduledController, Env (con GOOGLE_AI_API_KEY)
  • Salida: logs a console (no response HTTP)
  • Lógica:
    1. Validar GOOGLE_AI_API_KEY presente (skip si no)
    2. Construir URL: ${AI_STUDIO_BASE}/${MODEL}:generateContent?key=...
    3. POST JSON con prompt “ping” + config minimal
    4. Medir tiempo de respuesta (Date.now())
    5. Log con status HTTP y millisegundos (ej. OK 200 en 625ms)
    6. Catch errores (timeout, network) y loguear con el nombre de error

wrangler.toml (~30 LOC)

name = "oracle-keepwarm"
main = "src/index.ts"
compatibility_date = "2026-04-01"
compatibility_flags = ["nodejs_compat"]

[triggers]
crons = ["*/15 * * * *"]  # Cada 15 min, UTC

[observability]
enabled = true
  • name: oracle-keepwarm (identificador en CF Dashboard)
  • triggers.crons: cadencia configurable (ver sección de ajuste)
  • observability: logs habilitados (acceso vía wrangler tail)

Relación con el Oráculo

  • Mismo modelo: gemma-4-26b-a4b-it (Gemma 4, usado por functions/api/oraculo/ask.ts)
  • Misma credencial: GOOGLE_AI_API_KEY (única para toda la cadena)
  • Propósito: garantizar que el modelo esté provisio cuando la 1ª consulta real llega
  • Sin dependencia de código: el Worker es autónomo (cron schedule), no requiere cambios en ask.ts

Historial

  • 2026-05-28: Deploy inicial de oracle-keepwarm (s92)
    • Diagnóstico: cold start >80s confirmado
    • Solución: ping cada 15 min (cadencia inicial)
    • Verificación: primer ping → HTTP 200 en 625ms

Próximos Pasos

  1. Monitorear 1ª consulta diaria (desde 29-05): ¿responde en ~7-10s sin timeout?
  2. Si sigue lento/fallando: bajar cadencia a */10 o */5 (ver “Ruta de ajuste”)
  3. Revisar factura Gemini (junio) para validar coste $0 o mínimo

Véase también

  • [[concept—oraculo—gemini-api]]
  • [[entity—functions-api—endpoint—oraculo-ask]]
  • [[decision—20260528—keep-warm-cron-gemma-coldstart]]
  • [[runbook—infra—mcp-token-rotation]]
  • [[crearack-tech—guides—ollama-self-hosted-ai]]