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
90
verde/pruebas/06_privacidad.sh
Executable file
90
verde/pruebas/06_privacidad.sh
Executable file
|
|
@ -0,0 +1,90 @@
|
|||
#!/usr/bin/env bash
|
||||
# Que siga siendo local. Es la premisa del carril, asi que se verifica igual que
|
||||
# cualquier otra cosa en vez de darla por hecha.
|
||||
#
|
||||
# Misma idea que pruebas/06_privacidad.sh del naranja, con las preguntas que
|
||||
# aplican aqui: alli se interroga a gsettings, aqui al .env, al YAML y a ss.
|
||||
#
|
||||
# Lo que SI puede salir, y no es fallo, se lista al final para que no sorprenda:
|
||||
# el navegador si el agente decide navegar, y la comprobacion de versiones.
|
||||
|
||||
cd "$(dirname "$0")" && . ./comun.sh
|
||||
|
||||
titulo "Credenciales"
|
||||
|
||||
# Las 11 lineas con valor del .env no son claves: son TERMINAL_TIMEOUT,
|
||||
# BROWSER_SESSION_TIMEOUT, banderas de depuracion y similares. Se busca por el
|
||||
# NOMBRE de la variable, que es lo que distingue una clave de un ajuste.
|
||||
CLAVES=$(grep -vE '^\s*#|^\s*$' "$HERMES/.env" 2>/dev/null \
|
||||
| grep -iE '^[A-Z_]*(API_KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)[A-Z_]*=.+' \
|
||||
| grep -vE '=\s*$' | wc -l)
|
||||
comprueba "cero credenciales con valor en el .env" "$CLAVES" "0"
|
||||
|
||||
# Sin tokens de mensajeria el gateway no arranca, que es justo lo que se quiere:
|
||||
# un canal de mensajeria es la unica pieza del carril que sacaria conversaciones
|
||||
# de esta maquina.
|
||||
MENSAJERIA=$(grep -vE '^\s*#|^\s*$' "$HERMES/.env" 2>/dev/null \
|
||||
| grep -icE '^(TELEGRAM|DISCORD|SLACK|WHATSAPP|SIGNAL|TEAMS|QQ)[A-Z_]*=.+')
|
||||
comprueba "cero tokens de mensajeria" "$MENSAJERIA" "0"
|
||||
|
||||
titulo "La red"
|
||||
|
||||
# Ollama es el cerebro: tiene que escuchar, pero solo aqui.
|
||||
FUERA=$(ss -ltn 2>/dev/null | awk 'NR>1 {print $4}' \
|
||||
| grep -E '^(0\.0\.0\.0|\*|\[::\]):(11434|8000|8080|3000)$' | wc -l)
|
||||
comprueba "ningun puerto nuestro escucha fuera de loopback" "$FUERA" "0"
|
||||
|
||||
OLLAMA_LOCAL=$(ss -ltn 2>/dev/null | awk 'NR>1 {print $4}' | grep -c '127.0.0.1:11434')
|
||||
comprueba "ollama escucha SOLO en 127.0.0.1" "$OLLAMA_LOCAL" "1"
|
||||
|
||||
# Conexiones salientes vivas de hermes en este momento. Cero es lo normal: la
|
||||
# 04 y la 05 hablan con 127.0.0.1.
|
||||
SALIENTES=$(ss -tnp 2>/dev/null | grep -c 'hermes' || true)
|
||||
nota "conexiones de hermes ahora mismo: ${SALIENTES:-0}"
|
||||
|
||||
titulo "El cerebro no sale de aqui"
|
||||
|
||||
BASE=$(config_model base_url)
|
||||
case "$BASE" in
|
||||
http://127.0.0.1:*|http://localhost:*)
|
||||
echo " $(verde OK) inferencia en esta maquina ($BASE)"; _ok=$((_ok + 1)) ;;
|
||||
*)
|
||||
echo " $(rojo FALLO) la inferencia sale a $BASE"; _fallo=$((_fallo + 1)) ;;
|
||||
esac
|
||||
|
||||
# telemetry es de Hermes y viene en el config; si se enciende, sale. No es una
|
||||
# bandera suelta sino un arbol —hoy telemetry.shared_metrics.enabled— asi que se
|
||||
# recorre entero: leer solo la clave de arriba devolvia el diccionario y la
|
||||
# prueba fallaba con la telemetria APAGADA, que es la peor forma de fallar.
|
||||
ENCENDIDAS=$(python3 - "$CONFIG" <<'PY'
|
||||
import sys, yaml
|
||||
|
||||
encendidas = []
|
||||
|
||||
def anda(nodo, ruta="telemetry"):
|
||||
if isinstance(nodo, dict):
|
||||
for k, v in nodo.items():
|
||||
if k == "enabled" and v is True:
|
||||
encendidas.append(ruta)
|
||||
else:
|
||||
anda(v, f"{ruta}.{k}")
|
||||
elif nodo is True and ruta.endswith("enabled"):
|
||||
encendidas.append(ruta)
|
||||
|
||||
anda(yaml.safe_load(open(sys.argv[1])).get('telemetry', {}) or {})
|
||||
print(",".join(encendidas))
|
||||
PY
|
||||
)
|
||||
if [ -z "$ENCENDIDAS" ]; then
|
||||
echo " $(verde OK) telemetria apagada en todas sus ramas"; _ok=$((_ok + 1))
|
||||
else
|
||||
echo " $(rojo FALLO) telemetria encendida en: $ENCENDIDAS"; _fallo=$((_fallo + 1))
|
||||
fi
|
||||
|
||||
titulo "Salidas conocidas, que no son fallo"
|
||||
|
||||
nota "el navegador (Playwright/Chromium) SOLO si el agente decide navegar"
|
||||
nota "hermes update comprueba versiones contra su repo cuando se le pide"
|
||||
nota "el driver de Computer Use esta INSTALADO pero nada lo invoca hoy"
|
||||
|
||||
resumen
|
||||
Loading…
Add table
Add a link
Reference in a new issue