El modelo (qwen2.5-coder-14b-instruct) mezclaba categorías en sus respuestas:

  • Colecciones Qdrant confundidas con servicios systemd (ej: “colecciones cognitivas como ailab-docs, ailab-gateway”)
  • context_size del modelo (32768) reportado como si fuera el contexto usado por HARD FACTS
  • working_memory activa afirmada sin dato verificable en el JSON
  • Valores inferidos dentro de la sección [HARD_FACTS] sin etiquetar como [INFERIDO]

El BASE_SYSTEM_CONTEXT en router_api.py tenía directrices genéricas pero no reglas taxativas:

DIRECTRICES:
4. Distingue siempre entre:
- [HARD_FACTS] → dato verificado del runtime
- [INFERIDO] → deducción lógica propia
- [PENDIENTE] → funcionalidad no implementada aún

Esto permitía que el modelo interpretara libremente en lugar de citar textualmente.

[HARD_FACTS] solo puede contener datos que aparezcan explícitamente en el bloque JSON. No resumir, no interpretar, no extender.

Cada sección del JSON tiene su propósito declarado en el prompt:

Sección JSONCategoría realNo confundir con
gpu_nodesNodos GPU físicos con modelos LM StudioServicios systemd
servicesServicios systemd (ailab-router, ailab-docs…)Contenedores Docker
docker.mainContenedores Docker (traefik, qdrant, open-webui…)Colecciones Qdrant
routing.model_performanceRendimiento de modelos de inferenciaNodos GPU
pending_implementationsFuncionalidades no implementadasServicios activos
(no aparece en JSON)Colecciones Qdrant→ [NO DISPONIBLE]

El modelo tiene prohibido inferir:

  • context_size — solo existe ctx por modelo (ventana del modelo, no contexto usado)
  • health_score numérico
  • working_memory activa
  • watchdog score detallado por servicio
  • routing_confidence
  • Latencia por request individual
EtiquetaCuándo usarla
[HARD_FACTS]Copia literal o resumen fiel de datos del JSON
[INFERIDO]Deducción lógica propia (“probablemente…”)
[PENDIENTE]Funcionalidad listada en pending_implementations
[NO DISPONIBLE]Dato que no aparece en HARD FACTS ni PENDING
  • No usar thinking ni reasoning_content
  • No inventar valores numéricos
  • No confundir servicios con colecciones con contenedores
  • No decir que algo funciona si no aparece en HARD FACTS
  • No mover infraestructura sin permiso explícito

Archivo: runtime/llm/router_api.py (líneas 82-108 y 377-384)

Dos cambios:

  1. BASE_SYSTEM_CONTEXT (línea 82): Reemplazadas las DIRECTRICES genéricas por REGLAS ESTRICTAS con 6 secciones (citas textuales, categorías, datos no disponibles, etiquetas obligatorias, ejemplo correcto, prohibiciones).

  2. final_instruction (línea 377): Añadido refuerzo: “No infieras valores ni confundas categorías: services != collections != containers != models”.

Test de validación con la pregunta “Describe el estado actual del AI-LAB. ¿Qué colecciones Qdrant existen? ¿Qué servicios systemd?”:

AntesDespués
”colecciones cognitivas como ailab-docs, ailab-gateway” ❌“Colecciones Qdrant: [NO DISPONIBLE en HARD FACTS]” ✅
Servicios systemd mezclados con colecciones7 servicios systemd listados correctamente
Sin etiquetas [HARD_FACTS]Etiquetas [HARD_FACTS] en cada afirmación
GPU NVIDIA inventadasSolo nodos reales del JSON
  • runtime/llm/router_api.py — BASE_SYSTEM_CONTEXT + final_instruction

Este cambio es posterior al commit 052c2db (FASE 9.5) y 1bfa064 (FASE 10 JSON HARD FACTS). No tiene commit propio — aplicado directamente sobre main.