Volver a la wiki

Oráculo de EL — Asistente conversacional del Workspace

Asistente conversacional integrado en la caja de búsqueda del header de workspace.crearack.com. Reutiliza toda la infraestructura del Bibliotecario (embeddings BGE-M3, retrieval sobre bib_chunks, síntesis con Gemma 4 26B-A4B-IT vía Google AI Studio) con un nuevo modo de síntesis 'oracle' cuyo scope abarca el universo EsfericLabs completo: CreaRack Pro, Workspace, ADRs, runbooks, claude-method (pendiente Fase 2).

Construido en 4 PRs encadenados durante la sesión 72 (s72, 2026-05-19 tarde). Fase 3 cerrada en PR#53.


Motivación

Edu leyó la guía del Bibliotecario y detectó que el 90% del backend necesario ya existía. La caja de búsqueda del header usaba solo Fuse.js local; cablearlo al grafo era la pieza que faltaba. El Tutor de CreaRack Pro servía de referencia de patrón (modo 'tutor', multi-turno con history).


Arquitectura

Detección híbrida automática

SearchInline.tsx detecta si la query debe ir al Oráculo o al índice Fuse local mediante shouldAskOracle(query, mode):

Endpoint POST /api/oraculo/ask

functions/api/oraculo/ask.ts (~80 LOC tras PR#53):

POST /api/oraculo/ask
Body: { question: string, mode?: string, history?: TutorMessage[] }
Response: { answer, sources[], model, chunks_used, duration_ms }

Flujo interno:

  1. Valida question (max 500 chars) y history (shape {role, content}, cap servidor 12 turnos).
  2. Retrieval sin filtros app/source_type sobre todo el corpus del Bibliotecario (TOP_K = 8).
  3. Threshold relevance (PR#53): si matches[0].score < RELEVANCE_FLOOR (0.4) y history.length === 0 → respuesta honesta inmediata sin invocar al modelo (ahorra ~2s + tokens). En multi-turno NO aplica.
  4. Si pasa el threshold: llama a synthesizeAnswer(apiKey, question, matches, 'oracle', history?) en archivo-core.ts.
  5. INSERT best-effort a tabla D1 oraculo_queries (telemetría, sin almacenar respuestas).

Modo 'oracle' en archivo-core.ts

buildOraclePrompts genera un system prompt distinto de 'help' (restringido a CreaRack Pro) y de 'tutor' (IT general sin grounding):

Telemetría oraculo_queries (D1)

Migración 0031_create_oraculo_queries.sql. Campos: question, sources_count, top_relevance, duration_ms, mode, created_at. Sin almacenar respuestas (no inflar BD, no duplicar contenido). El campo top_relevance permite detectar gaps de corpus (queries con score bajo habitual = área no indexada).


Chat multi-turno (SearchInline.tsx)


Threshold de relevancia (RELEVANCE_FLOOR · PR#53)

const RELEVANCE_FLOOR = 0.4;

Calibrado empíricamente sobre embeddings BGE-M3:

Rango scoreInterpretación
> 0.5Info clara en el grafo
0.4 – 0.5Tangencial
< 0.4Ruido — no invocar al modelo

Cuando topScore < 0.4 y sin history previo → respuesta honesta inmediata + top 5 fuentes débiles como chips informativos. La entrada en oraculo_queries con top_relevance bajo sirve como señal de gap de corpus.

Excepción multi-turno: en conversaciones con history, el threshold NO aplica. El contexto del chat puede dar sentido a follow-ups aunque el retrieval de la nueva pregunta sea flojo.


Cobertura del corpus (s72)

FuenteEstado
Workspace .md (wikis)✅ vía Bibliotecario-Ingest
Workspace .ts/.tsx/.mjs✅ vía bib-reindex-ts.yml
CreaRack-Pro .py + .md✅ vía cron Hetzner bib_ast.py
claude-method/❌ sin workflow · Fase 2 pendiente

Fase 2 — Plan concreto (Opción C recomendada): nuevo workflow .github/workflows/bib-reindex-claude-method.yml en workspace que clona claude-method via GH_PAT y corre bib_ast_ts.mjs --root external/claude-method. Cron diario 00:30 UTC (tras el cron TS de 00:15). Ejecución en sesión futura.


PRs de implementación

PRCommitDescripción
#5056463f6Backend: endpoint POST /api/oraculo/ask, modo 'oracle', migración oraculo_queries
#514e282a1Frontend Fase 1: UI híbrida SearchInline.tsx, chips Auto/Buscar/Preguntar, 14 clases CSS
#52a1da9a0Multi-turn: estado turns[], caja followup, botón Nueva conversación, cap 12 turnos
#53(cierre s72)Cierre Fase 3: botón Cerrar, RELEVANCE_FLOOR=0.4, documentación s72

Validación en producción (Edu · s72)


Decisiones de arquitectura relevantes


Véase también

Page parcialmente aislada: el Oráculo es una feature nueva sin precedentes directos en el grafo wiki actual. Candidata a ampliar related cuando se indexen páginas sobre archivo-core, Bibliotecario-Ingest, synthesizeAnswer y la tabla oraculo_queries.

Subir