#!/usr/bin/env bash # test.sh — Validation end-to-end du skill agent-delegation et de ask-agent # # Usage : bash test.sh # Doit tourner sur storage-01 (ou depuis le poste perso via SSH) # # Vérifie : # 1. ask-agent CLI disponible et fonctionnel (system, monitor, brain) # 2. Skill agent-delegation présent dans le profil funk-ai # 3. Hermes funk-ai appelle réellement Terminal: ask-agent quand demandé set -uo pipefail PASS=0 FAIL=0 SKIP=0 green() { echo -e "\033[32m✓ $*\033[0m"; } red() { echo -e "\033[31m✗ $*\033[0m"; } yellow(){ echo -e "\033[33m~ $*\033[0m"; } pass() { green "$1"; ((PASS++)); } fail() { red "$1"; ((FAIL++)); } skip() { yellow "$1 (SKIP)"; ((SKIP++)); } echo "" echo "═══════════════════════════════════════════════════════" echo " Test agent-delegation + ask-agent — Funk Cluster" echo "═══════════════════════════════════════════════════════" echo "" # ── Test 1 : ask-agent disponible ──────────────────────────────────────────── echo "▸ [1] ask-agent CLI disponible sur storage-01" if command -v ask-agent &>/dev/null; then pass "ask-agent trouvé : $(which ask-agent)" else fail "ask-agent introuvable dans PATH" fi # ── Test 2 : LiteLLM accessible ────────────────────────────────────────────── echo "▸ [2] LiteLLM proxy accessible (127.0.0.1:4000)" if curl -sf -o /dev/null http://127.0.0.1:4000/health -H "Authorization: Bearer lm-studio"; then pass "LiteLLM répond" else fail "LiteLLM inaccessible — vérifier : sudo systemctl status litellm" fi # ── Test 3 : ask-agent system ───────────────────────────────────────────────── echo "▸ [3] ask-agent system — réponse non vide" RESP=$(ask-agent system "Réponds juste: OK" --max-tokens 200 2>&1) || true if [ -n "$RESP" ] && echo "$RESP" | grep -qiv "error\|failed\|curl"; then pass "ask-agent system répond : ${RESP:0:80}..." else fail "ask-agent system a échoué : $RESP" fi # ── Test 4 : ask-agent monitor ──────────────────────────────────────────────── echo "▸ [4] ask-agent monitor — réponse non vide" RESP=$(ask-agent monitor "Réponds juste: OK" --max-tokens 200 2>&1) || true if [ -n "$RESP" ] && echo "$RESP" | grep -qiv "error\|failed\|curl"; then pass "ask-agent monitor répond : ${RESP:0:80}..." else fail "ask-agent monitor a échoué : $RESP" fi # ── Test 5 : ask-agent brain ────────────────────────────────────────────────── echo "▸ [5] ask-agent brain — réponse non vide" if curl -sf http://127.0.0.1:4000/v1/models -H "Authorization: Bearer lm-studio" | grep -q "claude"; then RESP=$(ask-agent brain "Réponds juste: OK" --max-tokens 200 2>&1) || true if [ -n "$RESP" ] && echo "$RESP" | grep -qiv "error\|failed\|curl"; then pass "ask-agent brain répond : ${RESP:0:80}..." else fail "ask-agent brain a échoué : $RESP" fi else skip "ask-agent brain — claude-sonnet non disponible dans LiteLLM" fi # ── Test 6 : ask-agent avec données réelles ─────────────────────────────────── echo "▸ [6] ask-agent monitor — analyse données système réelles" DISK=$(df -h /srv/data | tail -1) RESP=$(ask-agent monitor "Est-ce que cette utilisation disque est critique ? $DISK — réponds en une phrase." --max-tokens 100 2>&1) || true if [ -n "$RESP" ] && echo "$RESP" | grep -qiv "error\|failed\|curl"; then pass "ask-agent monitor analyse données réelles : ${RESP:0:120}..." else fail "ask-agent monitor analyse échouée : $RESP" fi # ── Test 7 : Skill dans répertoire global HERMES_HOME ──────────────────────── echo "▸ [7] Skill agent-delegation dans HERMES_HOME/skills/" SKILL_GLOBAL="${HERMES_HOME:-/srv/data/hermes}/skills/funk/agent-delegation/SKILL.md" if [ -f "$SKILL_GLOBAL" ]; then pass "Skill global : $SKILL_GLOBAL" else fail "Skill absent : $SKILL_GLOBAL" fi # ── Test 8 : Skill dans le profil funk-ai ──────────────────────────────────── echo "▸ [8] Skill agent-delegation dans profil funk-ai" SKILL_PROFILE="${HERMES_HOME:-/srv/data/hermes}/profiles/funk-ai/skills/funk/agent-delegation/SKILL.md" if [ -f "$SKILL_PROFILE" ]; then pass "Skill profil : $SKILL_PROFILE" else fail "Skill absent du profil — copier et redémarrer hermes-agent" fi # ── Test 9 : Skill enabled dans hermes skills list ─────────────────────────── echo "▸ [9] Skill agent-delegation enabled dans hermes skills list" HERMES_BIN="${HOME:-/opt/hermes}/.local/bin/hermes" if [ -x "$HERMES_BIN" ]; then STATUS=$(HERMES_HOME="${HERMES_HOME:-/srv/data/hermes}" "$HERMES_BIN" skills list 2>/dev/null | grep "agent-delegation" || echo "") if echo "$STATUS" | grep -q "enabled"; then pass "Skill enabled : $STATUS" else fail "Skill non trouvé ou disabled dans hermes skills list" fi else skip "hermes binaire introuvable : $HERMES_BIN" fi # ── Test 10 : Hermes funk-ai appelle Terminal ask-agent ─────────────────────── echo "▸ [10] Hermes funk-ai appelle Terminal: ask-agent (test fonctionnel)" if [ -x "$HERMES_BIN" ]; then RESP=$(HERMES_HOME="${HERMES_HOME:-/srv/data/hermes}" bash -c \ "cd ${HERMES_HOME:-/srv/data/hermes} && $HERMES_BIN -z \ 'Exécute via ton outil terminal exactement cette commande et affiche le résultat brut : ask-agent system \"Réponds OK\"' \ 2>/dev/null") || true # Vérifier dans la dernière session que le tool terminal a été appelé avec ask-agent LAST_SESSION=$(ls -t "${HERMES_HOME:-/srv/data/hermes}/profiles/funk-ai/sessions/session_"*.json 2>/dev/null | head -1) if [ -n "$LAST_SESSION" ]; then TOOL_CALL=$(python3 -c " import json with open('$LAST_SESSION') as f: data = json.load(f) for msg in data.get('messages', []): if msg.get('role') == 'tool': content = msg.get('content', '') if 'ask-agent' in content or 'OK' in content: print('FOUND') break " 2>/dev/null || echo "") if [ "$TOOL_CALL" = "FOUND" ]; then pass "Hermes a appelé Terminal: ask-agent et reçu une réponse" else # Fallback : vérifier juste que la réponse contient OK if echo "$RESP" | grep -qi "OK"; then pass "Hermes a obtenu la réponse ask-agent : ${RESP:0:100}" else fail "Hermes n'a pas appelé ask-agent via Terminal — réponse : ${RESP:0:200}" fi fi else skip "Impossible de lire la session — test de session ignoré" fi else skip "hermes binaire introuvable — test fonctionnel ignoré" fi # ── Résumé ──────────────────────────────────────────────────────────────────── echo "" echo "═══════════════════════════════════════════════════════" echo " Résultats : ✓ $PASS passés ✗ $FAIL échoués ~ $SKIP ignorés" echo "═══════════════════════════════════════════════════════" echo "" if [ $FAIL -gt 0 ]; then exit 1 fi