Funk-lab/hermes-skills/funk/agent-delegation/test.sh
alkatrazz 5e93c1d3d7 fix: ask-agent /no_think + SKILL.md renforcé + tests 10/10
- ask-agent : ajout /no_think pour agents system et monitor
  (Qwen3-1.7B en mode thinking consommait tous les tokens sur
  le raisonnement interne, laissant content: "" vide)
- SKILL.md v1.1.0 : règles OBLIGATOIRES de délégation, distinction
  ask-agent vs delegate_task, exemples concrets, syntaxe exacte
- test.sh : suite 10 tests end-to-end — CLI disponible, LiteLLM,
  system/monitor/brain, données réelles, skill présence/activation,
  Hermes funk-ai appelle Terminal: ask-agent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 17:26:25 +02:00

169 lines
8.1 KiB
Bash
Executable file

#!/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