#!/usr/bin/env python3 """Standalone evaluation script for ResilientAgent-Prod environment.""" import sys import os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from server.resilientagent_prod_environment import ResilientAgentEnvironment from models import ResilientAgentAction def run_task(env, task_id): """Run a single task and return results.""" print(f"\n{'='*60}") print(f"Running task: {task_id}") print(f"{'='*60}") # Reset environment obs = env.reset(task_id=task_id) print(f"Initial metrics: {obs.metrics}") print(f"Initial alert: {obs.alert_status}") print(f"Logs: {obs.recent_logs[:3]}") # Get correct actions for this task correct_actions = env._get_correct_actions_for_task() print(f"Correct action sequence: {correct_actions}") steps = 0 max_steps = 20 # Execute correct actions for action_type in correct_actions: # Determine target based on action type and task target = "inference_service" if task_id == "task1_latency_spike": target = "inference_service" elif task_id == "task2_prediction_drift": target = "ml_model" elif task_id == "task3_cascading_failure": if action_type == "restart_service": target = "primary_model" elif action_type == "scale_service": target = "fallback_model" else: target = "primary_model" action = ResilientAgentAction( action_type=action_type, target=target, parameters=None ) print(f"\nStep {steps + 1}: {action_type} -> {target}") obs = env.step(action) print(f" Reward: {obs.reward:.3f}") print(f" Done: {obs.done}") print(f" Metrics: {obs.metrics}") steps += 1 if obs.done: print(f" [OK] Task resolved!") break # Get final grade score = env.grade() print(f"\n Final score: {score:.3f}") return { "task_id": task_id, "score": score, "steps": steps, "resolved": env._model_healthy } def main(): """Main evaluation.""" print("="*60) print("ResilientAgent-Prod Environment Evaluation") print("="*60) env = ResilientAgentEnvironment() tasks = [ "task1_latency_spike", "task2_prediction_drift", "task3_cascading_failure" ] results = {} for task_id in tasks: result = run_task(env, task_id) short_name = task_id.split("_", 1)[1] results[short_name] = result # Final summary print(f"\n{'='*60}") print("FINAL RESULTS") print(f"{'='*60}") for short_name, result in results.items(): print(f"\n{short_name}:") print(f" Score: {result['score']:.3f}") print(f" Steps: {result['steps']}") print(f" Resolved: {result['resolved']}") avg_score = sum(r["score"] for r in results.values()) / len(results) resolved = sum(1 for r in results.values() if r["resolved"]) print(f"\n{'='*60}") print(f"Average Score: {avg_score:.3f}") print(f"Tasks Resolved: {resolved}/{len(tasks)}") print(f"{'='*60}") # Compare to baseline baseline_scores = { "latency_spike": 0.80, "prediction_drift": 1.00, "cascading_failure": 0.80 } print(f"\nComparison to Baseline:") for task, result in results.items(): baseline = baseline_scores.get(task, 0) diff = result['score'] - baseline status = "UP" if diff > 0 else "DOWN" if diff < 0 else "SAME" print(f" {task}: {result['score']:.3f} vs {baseline:.3f} baseline ({status} {abs(diff):.3f})") if __name__ == "__main__": main()