Conseguir que greetings, smalltalk, prompts cortos y observe básico vayan SIEMPRE a llama-3.1-8b, reservando qwen2.5-coder-14b solo para coding, architecture, reasoning y debugging.

Tras FASE 29.3 (three-model runtime), se detectó que saludos como “adios”, “vale”, “genial”, “perfecto” y prompts triviales como “si”, “no”, “claro” seguían activando qwen2.5-14b innecesariamente. El is_greeting_request() solo reconocía 11 marcadores exactos.

_GREETING_MARKERS = (
"hola", "buenas", "adios", "gracias", "ok", "vale", "genial",
"perfecto", "claro", "entendido", "si", "no", "de acuerdo",
"hello", "hi", "thanks", "bye", "yes", "yeah", "nope", ...
)

48 marcadores cubriendo español e inglés. Token-based fallback con len(tokens) <= 1 para detectar cualquier saludo corto no listado.

def is_lightweight_prompt(text: str) -> bool:
if len(text) < 120 and no code_fences and no_architecture_keywords:
return True # → llama-3.1-8b

9 razones deterministas para activar qwen2.5-14b:

RazónDisparador
coding_explicitCode fences, function writing
architecture_deepMulti-step analysis keywords
debuggingStacktrace, traceback, exception
long_contextPrompt > 500 chars técnico
multi_stepMulti-file planning
reasoning_deep”analiza”, “razona”, “compara”
report_technical”informe”, “report”, “documentación”

El observe fastpath forzaba llama incluso para análisis profundos. Corregido: si get_qwen_escalation_reason() detecta motivo de escalada, el observe no fuerza llama.

13/13 tests PASS:

  • Todos los greetings → llama ✅
  • Coding → qwen2.5 ✅
  • Architecture → qwen2.5 ✅
  • Short trivia → llama ✅
  • ailab_greeting_fastpath_total
  • ailab_qwen_escalation_total
  • ailab_llama_fastpath_total