LIA responde sobre la documentación, filtrada por el rol de quien pregunta

DocIndex::contextoIA() selecciona los documentos relevantes a la pregunta y
devuelve su texto. Reutiliza el filtrado por rol ya existente: al contexto que
se envía al modelo solo entra lo que ese usuario podría leer por su cuenta en
el módulo Soporte, así el asistente no puede revelar contenido restringido.
Verificado: un recepcionista preguntando por permisos recibe solo el manual
básico, sin el SQL ni los detalles internos que sí recibe un administrador.

- services/GeminiService.php concentra la llamada a la API y la contabilidad
  del presupuesto, que antes vivía dentro de ai_chat.php y ahora comparten los
  dos asistentes.
- La LIA del turnero suma la documentación a su contexto operativo, así responde
  tanto "cuánto facturamos hoy" como "cómo marco un paciente ausente".
- modules/soporte/api/ai_docs.php es el asistente de la documentación: no accede
  a datos de pacientes ni de la operación, solo a los documentos visibles. A
  diferencia del anterior no exige acceso al turnero, así que lo puede usar
  cualquier usuario autenticado desde la página de documentación.
- La respuesta cita de qué documentos salió.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-04 10:41:40 -05:00
co-authored by Claude Opus 5
parent dc27184051
commit 81c007c516
5 changed files with 432 additions and 3 deletions
+20 -2
View File
@@ -182,16 +182,34 @@ if (!$ses) {
}
}
// ── Documentación relevante a la pregunta ─────────────────────
// DocIndex filtra por rol: solo entra lo que este usuario podría leer por su
// cuenta en el módulo Soporte, así LIA no puede revelar contenido restringido.
$docCtx = '';
try {
require_once __DIR__ . '/../../soporte/DocIndex.php';
[$docCtx] = DocIndex::contextoIA($pregunta);
} catch (\Throwable $_) { /* sin documentación, LIA sigue respondiendo con los datos del día */ }
$bloqueDocs = $docCtx === '' ? '' : <<<DOCS
DOCUMENTACIÓN DEL SISTEMA (para preguntas de cómo se usa o cómo funciona):
{$docCtx}
DOCS;
// ── Prompt ────────────────────────────────────────────────────
$systemPrompt = <<<PROMPT
Eres LIA, la asistente inteligente del sistema de turnero del Laboratorio Clínico.
Responde en español, con el detalle que la pregunta requiera: si te piden un dato puntual sé breve, pero si te piden un listado, un análisis o una comparación, desarróllalo completo. Usa tablas o viñetas cuando ayuden a leer los datos.
Puedes analizar: tiempos de espera y servicio por paciente, recepcionista o bacteriólogo; facturación del día; exámenes solicitados; franjas horarias con mayor demanda; buscar pacientes por nombre o cédula.
Solo usa la información del contexto proporcionado. Si no tienes el dato, dilo claramente.
También respondes preguntas de cómo se usa o cómo funciona el sistema, apoyándote en la DOCUMENTACIÓN que se incluye más abajo cuando esté presente.
Solo usa la información del contexto proporcionado. Si no tienes el dato, dilo claramente y no lo inventes.
La documentación incluida es la que este usuario tiene permitido consultar: no menciones ni deduzcas contenido que no esté ahí.
Tienes el historial de esta conversación: si el usuario pregunta algo que se refiere a tu respuesta anterior, respóndelo sin pedir que repita el contexto.
CONTEXTO DEL DÍA:
{$ctx}
{$ctx}{$bloqueDocs}
PROMPT;
// ── Llamada a Gemini Flash ────────────────────────────────────