Descripción
archivo-core.ts es el módulo de síntesis de la Biblioteca. Contiene la lógica de construcción de prompts y la llamada a la API de Gemini para generar respuestas en el Help Widget de CreaRack Pro. Es consumido por archivo.ts (handler MCP bib_ask).
Exports públicos
synthesizeAnswer(apiKey, question, chunks, mode?)
Función principal. Construye los prompts según el modo y llama a la REST API de Gemini.
export async function synthesizeAnswer(
apiKey: string,
question: string,
chunks: ChunkMatch[],
mode: 'help' | 'tutor' = 'help', // parámetro añadido en commit 86c9ac4
): Promise<AskResult>
Flujo interno:
detectLanguage(question)→'en' | 'es'- Según
mode:'help'→buildHelpPrompts(question, chunks, lang)'tutor'→buildTutorPrompts(question, lang)
- Fetch a Google AI Studio REST API (no SDK — Workerd no lo soporta).
- Retorna
AskResultconanswer,model,durationMs.
detectLanguage(text)
export function detectLanguage(text: string): 'en' | 'es'
Detección heurística server-side del idioma de la pregunta. Usa marcadores EN para decidir; si no hay mayoría clara, cae a 'es'. Necesario porque los chunks de la wiki están mayoritariamente en español y sesgan al modelo (documentado en sesión s53).
Funciones privadas
buildHelpPrompts(question, chunks, lang)
Construye el par { systemPrompt, userPrompt } para el modo help:
- System prompt en inglés neutro. Rol de asistente in-app de CreaRack Pro. Solo usa los fragments proporcionados.
- User prompt en el idioma detectado (
lang). Incluye chunks formateados como bloques numerados[1],[2]… con título y ruta.
El patrón «system en EN + user en idioma detectado» se adoptó tras s53 para evitar el sesgo ES cuando los chunks son en español.
buildTutorPrompts(question, lang) (añadida en commit 86c9ac4)
Construye el par { systemPrompt, userPrompt } para el modo tutor:
- Sin chunks — el modelo responde desde su conocimiento general.
- System prompt con rol de senior IT engineer & educator. Define el dominio cubierto (Cisco/Juniper/Linux/RFC/SNMP/hardware), reglas de estilo pedagógico (bold para comandos, bloques de código, párrafos cortos), cap de 250 palabras y lógica de redirect si el usuario pregunta sobre la app.
- Instrucción explícita de honestidad: si no está seguro de un flag/sintaxis, debe decirlo.
Dominio del prompt Tutor
El system prompt de buildTutorPrompts delimita con precisión:
Networking: Cisco / Juniper / MikroTik / Aruba
OSPF / BGP / STP / RSTP, VLAN trunking, ACL, DHCP/DNS, NAT, VPN
Linux/Unix: shell, systemd, journalctl, ip/iproute2
IEEE/RFC: 802.1Q, 802.11, 802.3
Datacenter ops: cooling, racking, cabling, power, redundancia
Monitoring: SNMP v1/v2c/v3, ICMP, NetFlow/sFlow, syslog
Hardware: switches, routers, UPS, APs, servers, storage
Nota técnica: Google AI Studio via fetch
Workerd (runtime de Cloudflare Workers) no soporta el SDK @google/generative-ai. Por eso synthesizeAnswer usa fetch directo contra la REST API de Google AI Studio. Patrón documentado como «footgun documentado» en el código, consistente con el driver Python de Auto-Plan (s49).
Historial relevante
| Commit | Cambio |
|---|---|
86c9ac4 | Extrae buildHelpPrompts y buildTutorPrompts de synthesizeAnswer. Añade parámetro mode: 'help' | 'tutor' a synthesizeAnswer. Introduce modo IT Tutor sin grounding. |
Véase también
- [[entity—biblioteca—handler—bib-ask]] — Handler MCP que consume este módulo: routing, early return tutor, archivado
- [[feature—biblioteca—it-tutor-mode]] — Feature completa del modo IT Tutor: comportamiento, dominio, frontend pendiente
Referenciado desde
- ADR: Migración síntesis Help Widget a Gemma 4 E2B Q4_0 self-host (pve-epyc-02 + CF Tunnel)
- detectLanguage — Utility de detección de idioma para bib_ask
- Handler MCP bib_ask — Biblioteca (archivo.ts)
- Incident: bib_ask responde siempre en español independientemente del idioma de la pregunta
- Incidente: Gemma 4 emite scratchpad de razonamiento en bib_ask (latencia ×16, respuesta ilegible)
- Incidente: Oráculo hardening v1 — 5 bugs UX/operacionales en s72 (chips, 524 timeouts, sources truncados)
- Modo IT Tutor — Help Widget de la Biblioteca
- Saneo de chunks con defensa de inyección de prompt
- Servicio llama-help: llama.cpp self-host para síntesis RAG (Gemma 4 E2B Q4_0)