detectLanguage — Utility de detección de idioma para bib_ask
Resumen
Función TypeScript exportada desde functions/api/mcp/handlers/archivo-core.ts. Detecta si el texto de entrada está en inglés o español usando heurística de regex con marcadores léxicos. El idioma detectado se usa para seleccionar el mensaje de fallback apropiado cuando el pipeline de bib_ask no encuentra resultados o la síntesis de Gemma 4 produce JSON malformado.
Signatura
export function detectLanguage(text: string): 'en' | 'es'
Parámetros
| Param | Tipo | Descripción |
|---|---|---|
text | string | Texto a analizar (normalmente la question del usuario) |
Retorno
'en'— si el texto contiene al menos un marcador EN como token entero (\b...\b).'es'— en cualquier otro caso (default, porque la UI principal de CreaRack Pro es español).
Implementación
export function detectLanguage(text: string): 'en' | 'es' {
const enMarkers = /\b(what|how|where|when|why|who|which|is|are|the|do|does|can|could|should|would|will|with|without|from|need|want|please|tell|show|explain|find|create|add|remove|delete|edit|update|see|view)\b/i;
return enMarkers.test(text) ? 'en' : 'es';
}
Marcadores EN (30 tokens): what, how, where, when, why, who, which, is, are, the, do, does, can, could, should, would, will, with, without, from, need, want, please, tell, show, explain, find, create, add, remove, delete, edit, update, see, view.
Dónde se usa
1. Fallback “no matches” — archivo.ts
Cuando el vector search no devuelve ningún chunk relevante (matches.length === 0):
answer: detectLanguage(question) === 'en'
? 'I have not found relevant information in the documentation for this question.'
: 'No he encontrado informacion relevante en la documentacion para esta pregunta.',
2. Fallback “JSON malformado / query muy amplia” — archivo-core.ts
Cuando synthesizeAnswer no puede parsear la respuesta del modelo (query demasiado abierta, timeout, etc.):
answer = detectLanguage(question) === 'en'
? 'Your question is too broad and the answer does not fit. Try again with something more specific (for example, a single task or feature).'
: 'Tu pregunta es muy amplia y la respuesta no cabe completa. Pruébala de nuevo concretando un poco más (por ejemplo, una sola tarea o feature).';
Relación con el system prompt de Gemma 4
detectLanguage cubre los caminos de error (fallbacks). En el caso normal (síntesis exitosa), el idioma lo decide el propio modelo Gemma 4 a través de la regla LANGUAGE (CRITICAL) colocada al principio del system prompt en mayúsculas:
LANGUAGE (CRITICAL — non-negotiable):
- Respond in the EXACT SAME language as the user's question.
La utility y el system prompt son complementarios: el modelo maneja el caso feliz; detectLanguage garantiza coherencia lingüística en los fallbacks que el modelo nunca ve.
Limitaciones conocidas
- Falsos positivos EN: palabras como
the,is,areaparecen en textos en español con términos técnicos en inglés (p.ej. “¿El rack is editable?”). La heurística puede detectar EN incorrectamente en esos casos. - Sin soporte para otros idiomas: devuelve
'es'para FR, DE, PT, etc. Aceptable porque el producto actualmente solo soporta ES/EN. - Sin NLP real: no usa librerías de detección (ej.
franc,langdetect). Diseñada para ser ligera en un CF Worker.
Historial
| Fecha | Evento |
|---|---|
| 2026-05-08 | Introducida en commit 917d69e como parte del fix del bug s53 (respuestas siempre en ES). |
Véase también
- [[incident—20260508—bib-ask-respuesta-siempre-es]]
- [[entity—biblioteca—function—synthesize-answer]]
- [[entity—biblioteca—handler—archivo-core]]
- [[entity—biblioteca—handler—archivo]]
- [[feature—biblioteca—help-widget]]