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>okeepwarm: 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):
- El modelo podría enfriarse antes de 15 minutos → bajar a
*/10o*/5 - Editar
workers/oracle-keepwarm/wrangler.toml→ campocrons - 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
scheduledasync - Entrada:
ScheduledController,Env(conGOOGLE_AI_API_KEY) - Salida: logs a
console(no response HTTP) - Lógica:
- Validar
GOOGLE_AI_API_KEYpresente (skip si no) - Construir URL:
${AI_STUDIO_BASE}/${MODEL}:generateContent?key=... - POST JSON con prompt “ping” + config minimal
- Medir tiempo de respuesta (
Date.now()) - Log con status HTTP y millisegundos (ej.
OK 200 en 625ms) - Catch errores (timeout, network) y loguear con el nombre de error
- Validar
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 porfunctions/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
- Monitorear 1ª consulta diaria (desde 29-05): ¿responde en ~7-10s sin timeout?
- Si sigue lento/fallando: bajar cadencia a
*/10o*/5(ver “Ruta de ajuste”) - 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]]