JARVIS/verde/pruebas/comun.sh
sito 1e3e5ca20d carril verde (Hermes Agent): documentacion, panel, voz local y RAG
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).
2026-08-18 11:26:42 +02:00

111 lines
3.6 KiB
Bash
Executable file

#!/usr/bin/env bash
# Utilidades compartidas por las pruebas del verde. No se ejecuta suelto.
#
# Misma forma que pruebas/comun.sh del naranja —comprueba, afirma, resumen— para
# que las dos suites se lean igual. Lo que cambia es a QUE se le pregunta: alli
# es gsettings dentro de un flatpak, aqui es un YAML, ollama y un binario.
#
# Ninguna prueba de esta carpeta abre el TUI ni habla por el altavoz.
RAIZ=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")/../.." && pwd)
VERDE=$RAIZ/verde
CONFIG=$HOME/.hermes/config.yaml
HERMES=$HOME/.hermes
OLLAMA=${OLLAMA_URL:-http://127.0.0.1:11434}
MODELO=qwen3.5:4b-verde
NARANJA=qwen3.5:4b-jarvis
TMP=${TMPDIR:-/tmp}/jarvis-verde-pruebas
mkdir -p "$TMP"
_ok=0
_fallo=0
verde() { printf '\033[32m%s\033[0m' "$1"; }
rojo() { printf '\033[31m%s\033[0m' "$1"; }
gris() { printf '\033[90m%s\033[0m' "$1"; }
# comprueba <descripcion> <valor obtenido> <valor esperado>
comprueba() {
local desc=$1 obtenido=$2 esperado=$3
if [ "$obtenido" = "$esperado" ]; then
printf ' %s %s\n' "$(verde OK)" "$desc"
_ok=$((_ok + 1))
else
printf ' %s %s\n' "$(rojo FALLO)" "$desc"
printf ' esperado: %s\n obtenido: %s\n' "$esperado" "$obtenido"
_fallo=$((_fallo + 1))
fi
}
# afirma <descripcion> <comando...> — pasa si el comando devuelve 0
afirma() {
local desc=$1; shift
if "$@" >/dev/null 2>&1; then
printf ' %s %s\n' "$(verde OK)" "$desc"
_ok=$((_ok + 1))
else
printf ' %s %s\n' "$(rojo FALLO)" "$desc"
printf ' fallo: %s\n' "$*"
_fallo=$((_fallo + 1))
fi
}
# menor_que <descripcion> <valor> <tope>
menor_que() {
local desc=$1 valor=$2 tope=$3
if awk "BEGIN{exit !($valor < $tope)}"; then
printf ' %s %s %s\n' "$(verde OK)" "$desc" "$(gris "($valor < $tope)")"
_ok=$((_ok + 1))
else
printf ' %s %s %s\n' "$(rojo FALLO)" "$desc" "$(gris "($valor >= $tope)")"
_fallo=$((_fallo + 1))
fi
}
# mayor_que <descripcion> <valor> <suelo>
mayor_que() {
local desc=$1 valor=$2 suelo=$3
if awk "BEGIN{exit !($valor > $suelo)}"; then
printf ' %s %s %s\n' "$(verde OK)" "$desc" "$(gris "($valor > $suelo)")"
_ok=$((_ok + 1))
else
printf ' %s %s %s\n' "$(rojo FALLO)" "$desc" "$(gris "($valor <= $suelo)")"
_fallo=$((_fallo + 1))
fi
}
titulo() { printf '\n\033[1m%s\033[0m\n' "$1"; }
nota() { printf ' %s %s\n' "$(gris '·')" "$1"; }
resumen() {
printf '\n %s pasan · %s fallan\n' "$(verde $_ok)" \
"$([ $_fallo -eq 0 ] && gris 0 || rojo $_fallo)"
[ $_fallo -eq 0 ]
}
# Lo que ocupa la tarjeta ahora mismo, en MiB.
vram() { nvidia-smi --query-gpu=memory.used --format=csv,noheader 2>/dev/null | tr -d ' MiB'; }
# Un parametro del Modelfile tal y como lo tiene ollama guardado. Se pregunta a
# ollama y no al fichero del repo: el Modelfile del repo es la intencion, esto
# es lo que de verdad se va a cargar. arrancar.sh recrea el modelo al medir el
# techo de contexto, asi que los dos pueden diferir legitimamente.
parametro() { # $1 = modelo $2 = parametro
ollama show --modelfile "$1" 2>/dev/null \
| awk -v p="$2" '$1=="PARAMETER" && $2==p {print $3; exit}'
}
# El bloque model: del config.yaml, PARSEADO. Nunca leido con grep: el fichero
# declara provider y base_url dos veces dentro de model: y en YAML gana la
# ultima. Leyendolo parecia local y el trafico salia por OpenRouter.
config_model() { # $1 = clave
python3 -c "
import yaml, sys
try:
print(yaml.safe_load(open('$CONFIG'))['model'].get('$1', ''))
except Exception as e:
print('ERROR:', e)
" 2>/dev/null | tr -d '\n'
}