#!/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
