mirror of
https://github.com/Alkatrazz24/Funk-lab.git
synced 2026-07-08 14:24:42 +02:00
- 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>
169 lines
8.1 KiB
Bash
Executable file
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
|