Descripción
Pipeline de traducción automática de páginas wiki de Español a Inglés en el repo CreaRackSL-workspace. Consta de dos callers que comparten la misma lógica y modelo de IA:
| Componente | Archivo | Contexto de uso |
|---|---|---|
| CF Pages Function | functions/api/wiki/translate.ts | Traducción on-demand vía HTTP POST desde el editor wiki |
| Batch script | scripts/translate-wiki.mjs | Traducción en batch antes de astro build o manualmente |
Modelo de IA
Gemma 4 26B-A4B-IT vía Google AI Studio Paid Tier (REST directo).
ENDPOINT: https://generativelanguage.googleapis.com/v1beta/models/gemma-4-26b-a4b-it:generateContent
ENV VAR: GOOGLE_AI_API_KEY
Nota: workerd (Cloudflare Pages runtime) no soporta el SDK
google-genai. Se usafetchnativo directo a la REST API — patrón canónico documentado enarchivo-core.ts(Help Widgetbib_ask).
Historia de migraciones
| Fecha | Cambio |
|---|---|
| ~2026-04-01 | Gemini 2.5 Flash (API directa) — versión original |
2026-04-28 (s?, ADR decision--20260428--gemma-4-via-openrouter-migration) | Gemini 2.5 Flash → Gemma 4 vía OpenRouter |
2026-05-12 (s58 d21, commit e2e6847) | OpenRouter → Google AI Studio Paid Tier directo (cierre de deuda s55) |
Flujo (CF Pages Function translate.ts)
POST /api/wiki/translate { file: "slug.md" }
↓
1. Lee source ES desde GitHub (GH_PAT, ya committed por el editor)
2. Traduce title + description con Gemma 4 (instrucción corta, quirúrgica)
3. Traduce body con Gemma 4 (instrucción de translator profesional)
4. Commit versión EN a wiki-en/
5. Actualiza titles.json con el par ES → EN
Auth: gestionado por _middleware.ts (CF Access o Bearer token).
Flujo (batch script translate-wiki.mjs)
node scripts/translate-wiki.mjs
↓
1. Escanea src/content/wiki/*.md
2. Filtra solo páginas user-facing (prefijo crearack--)
3. Para cada archivo nuevo/modificado:
a. Traduce body con BODY_INSTRUCTION
b. Traduce frontmatter con FM_INSTRUCTION
c. Escribe resultado en src/content/wiki-en/
4. Genera/actualiza src/content/wiki-en/titles.json
Solo se traducen archivos con prefijo
crearack--(páginas user-facing del Help Widget). Las páginas internas (decision--*,concept--*,workspace--*) se omiten para reducir coste.
Configuración de parámetros AI
{
"temperature": 0.2,
"maxOutputTokens": 8192
}
Variables de entorno requeridas
| Var | Descripción |
|---|---|
GOOGLE_AI_API_KEY | API key de Google AI Studio Paid Tier (compartida con el resto del workspace) |
GH_PAT | Personal Access Token de GitHub con permisos de escritura al repo |
OPENROUTER_API_KEYya NO es requerida por este pipeline. Solo persiste enfunctions/types.tspara el callerai-eval/run.ts(herramienta de comparación multi-proveedor, excepción legítima documentada en el ADR).
Fix TypeScript (s57 lote 3, s58 d21)
request.json() devuelve Promise<unknown> con TypeScript estricto. Se aplica el patrón canónico:
// ✅ Correcto (patrón s57 lote 3)
const body = (await request.json().catch(() => ({}))) as { file?: string };
// ❌ Incorrecto (pre-s58)
const body: any = await request.json().catch(() => ({}));
Véase también
- [[decision—20260511—cleanup-openrouter-monoproveedor-google-genai]]
- [[decision—20260428—gemma-4-via-openrouter-migration]]
- [[concept—ai—monoproveedor-google-genai]]