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).
This commit is contained in:
parent
b1f8118272
commit
1e3e5ca20d
32 changed files with 3697 additions and 161 deletions
111
verde/pruebas/comun.sh
Executable file
111
verde/pruebas/comun.sh
Executable file
|
|
@ -0,0 +1,111 @@
|
|||
#!/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'
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue