#!/usr/bin/env bash # ¿Cabe la pregunta? El bloqueo que paro el primer arranque. # # No es que qwen3.5:4b rindiera mal: es que el prompt fijo de Hermes —26 KB de # sistema + 56 KB de esquemas de 19 herramientas— son ~20.500 tokens contra los # 4.096 de num_ctx del naranja. Cinco veces por encima. Con eso, la pregunta del # usuario ni entra. # # DOS TRAMPAS que esta prueba evita, las dos costaron tiempo: # # 1. El directorio desde el que se lanza CAMBIA el prompt de sistema. Desde # ~/.hermes/hermes-agent son 55.261 B en vez de 26.281: se cuela el AGENTS.md # de 81 KB del propio repo de Hermes como fichero de contexto. Por eso aqui # se hace cd a la raiz del proyecto, que es lo que hace verde-launcher.sh. # # 2. El contexto que se compara es el del MODELFILE, no el de /api/show. Ollama # reporta ahi 262144, el maximo del modelo, no lo configurado. cd "$(dirname "$0")" && . ./comun.sh titulo "El prompt fijo, medido" SALIDA=$TMP/prompt-size.txt ( cd "$RAIZ" && timeout 180 hermes prompt-size ) > "$SALIDA" 2>&1 if [ $? -ne 0 ] || ! grep -q 'System prompt total' "$SALIDA"; then echo " $(rojo FALLO) 'hermes prompt-size' no dio una medida" sed 's/^/ /' "$SALIDA" | head -5 exit 1 fi # Se parsea con python y no con awk por el awk de Debian: mawk no admite el # match() de tres argumentos de gawk y devolveria vacio en silencio, que en una # resta da un numero plausible y equivocado. # # " System prompt total : 26,278 B (25.7 KB, 26,148 chars)" # " Tool schemas : 55,978 B (54.7 KB, 19 tools)" leer=$(python3 - "$SALIDA" <<'PY' import re, sys texto = open(sys.argv[1]).read() def bytes_de(etiqueta): m = re.search(re.escape(etiqueta) + r'\s*:\s*([\d,]+)\s*B', texto) return int(m.group(1).replace(',', '')) if m else 0 herr = re.search(r'([\d,]+)\s+tools', texto) print(bytes_de('System prompt total'), bytes_de('Tool schemas'), herr.group(1).replace(',', '') if herr else '?') PY ) read -r SISTEMA ESQUEMAS HERRAM <<<"$leer" if [ "${SISTEMA:-0}" -eq 0 ] || [ "${ESQUEMAS:-0}" -eq 0 ]; then echo " $(rojo FALLO) no pude leer las cifras de 'hermes prompt-size'" sed 's/^/ /' "$SALIDA" | head -8 exit 1 fi FIJO=$((SISTEMA + ESQUEMAS)) # ~4 B por token en castellano y JSON. Es la misma regla con la que se dimensiono # el modelo verde; sirve para decidir, no para presumir de precision. TOKENS=$((FIJO / 4)) nota "sistema $SISTEMA B" nota "esquemas $ESQUEMAS B ($HERRAM herramientas)" nota "fijo $FIJO B ~ $TOKENS tokens" titulo "Contra el contexto configurado" CTX=$(parametro "$MODELO" num_ctx) nota "num_ctx del Modelfile: $CTX" menor_que "el prompt fijo cabe en el contexto" "$TOKENS" "$CTX" # Que quepa no basta: si no sobra sitio, Hermes comprime el historial en cuanto # empiece la conversacion y el agente se olvida de lo que acaba de hacer. El # suelo son los 2000 que usa arrancar.sh para avisar. HUECO=$((CTX - TOKENS)) nota "quedan ~$HUECO tokens para la conversacion" mayor_que "queda sitio para conversar" "$HUECO" 2000 # El otro tope, el escondido: 300 tokens de num_predict cortan el JSON de una # tool call por la mitad. El naranja lo hereda del modelo base y es correcto # para el —respuestas habladas cortas—, pero aqui seria un fallo silencioso. mayor_que "la respuesta no se corta a media llamada" \ "$(parametro "$MODELO" num_predict)" 1024 titulo "De donde viene el numero" nota "medido con cd a $RAIZ" nota "desde ~/.hermes/hermes-agent saldrian ~30 KB mas (su AGENTS.md de 81 KB)" resumen