#!/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 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 — 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 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 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' }