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).
111 lines
3.6 KiB
Bash
Executable file
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'
|
|
}
|