#!/usr/bin/env bash # Runner completo de evals. Corre las 4 capas en orden. # Exit 0 si todo pasa, 1 si alguna falla. set -uo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" FAILED=0 # ─── Capa 0: Lint ─────────────────────────────────────────────────────────── echo "[lint] best practices" if python3 evals/lint_wxo_yaml.py; then echo " ✓ lint PASS" else echo " ✗ lint FAIL" FAILED=$((FAILED + 1)) fi echo "" # ─── Capa 1: Native (ADK) ─────────────────────────────────────────────────── echo "[native] orchestrate agents test" NATIVE_PASS=0; NATIVE_FAIL=0 for f in evals/scenarios/*.input.json; do [ -f "$f" ] || continue # Derivar nombre del agente (convención: scenario_X_agentName.input.json o leer del JSON) agent=$(python3 -c "import json,sys; d=json.load(open('$f')); print(d.get('_agent',''))" 2>/dev/null) if [ -z "$agent" ]; then echo " ⚠ $f sin '_agent' field, skip" continue fi if orchestrate agents test "$agent" --input-file "$f" > /tmp/eval_native_$$.log 2>&1; then NATIVE_PASS=$((NATIVE_PASS + 1)) else NATIVE_FAIL=$((NATIVE_FAIL + 1)) echo " ✗ $f failed (see /tmp/eval_native_$$.log)" fi done echo " native: $NATIVE_PASS pass / $NATIVE_FAIL fail" [ "$NATIVE_FAIL" -gt 0 ] && FAILED=$((FAILED + 1)) echo "" # ─── Capa 2 + 3: Behavior + Final state (runner.py) ───────────────────────── echo "[behavior+final] custom runner" if python3 evals/runner.py; then echo " ✓ runner PASS" else echo " ✗ runner FAIL" FAILED=$((FAILED + 1)) fi echo "" # ─── Capa 4: Smoke test ───────────────────────────────────────────────────── echo "[smoke] end-to-end" if ./evals/smoke-test.sh > /tmp/eval_smoke_$$.log 2>&1; then echo " ✓ smoke PASS" else echo " ✗ smoke FAIL (see /tmp/eval_smoke_$$.log)" FAILED=$((FAILED + 1)) fi echo "" # ─── Resumen ──────────────────────────────────────────────────────────────── echo "════════════════════════════════════════" if [ "$FAILED" -eq 0 ]; then echo " ✓ ALL EVALS PASS" exit 0 else echo " ✗ $FAILED layer(s) FAILED" exit 1 fi