Rama JARVIS-GREEN, independiente de master (el nucleo naranja queda intacto). - README propio del carril verde con diagrama de arquitectura y capturas del panel. - verde/: arranque, panel web, puente de voz (escucha local con faster-whisper + habla con la voz del naranja), pruebas (07 voz, 08 escucha), config y notas. - Integracion RAG: nucleo/saber/busca_cli.py + skill buscar-en-apuntes, para que el agente consulte el mismo indice que el nucleo. - Todo local (127.0.0.1); sin datos personales (rutas y modelo de GPU scrubeados).
92 lines
3.5 KiB
Bash
Executable file
92 lines
3.5 KiB
Bash
Executable file
#!/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
|