Spaces:
Sleeping
Download README.md from vivekharry/scalermod: direct link, hf CLI and curl.
- Browser
- Download file 16.7 kB
-
https://huggingface.co/spaces/vivekharry/scalermod/resolve/main/README.md
- Command line
-
hf download hf://spaces/vivekharry/scalermod/README.md
-
curl -L -o README.md https://huggingface.co/spaces/vivekharry/scalermod/resolve/main/README.md
title: ChaosLab
emoji: π§
colorFrom: red
colorTo: gray
sdk: docker
app_port: 7860
ChaosLab β AI SRE Training Environment
What Is This?
ChaosLab is a simulated Linux server that AI agents can connect to and practice fixing real infrastructure problems β like restarting a crashed database, cleaning up a full disk, or tracing a cascading failure across multiple services.
Think of it as a flight simulator for AI system administrators. No real servers are touched. Everything runs in pure Python.
The Problem
Companies want AI that can manage servers, but:
- You can't let untrained AI touch real production systems
- There's no standardized way to test if an AI can actually fix a server
- Most AI benchmarks test chatting ability, not hands-on troubleshooting
- Real server issues involve chain reactions (one failure causes another), and no existing tool simulates that well
What We Built (Step by Step)
Step 1: Virtual Linux Filesystem
File: src/virtual_filesystem.py (~660 lines)
We built a fake Linux server entirely in Python dictionaries. No actual OS calls.
What it simulates:
- 30+ files β app logs, nginx logs, syslog, auth logs, cron logs, config files, scripts, /proc files, SSH keys
- 6 services β nginx, postgres, redis, app, cron, sshd (each with PID, status, CPU, memory, port)
- Disk partitions β /, /boot, /var/log, /tmp with realistic usage numbers
- Network ports β 6 ports with LISTEN/CLOSED states
- Memory β 8GB RAM with used/free/cached/swap tracking
- Cron jobs β 3 scheduled tasks with pass/fail history
- Users & groups β root, www-data, postgres, redis, user, nobody
- Environment variables β PATH, DATABASE_URL, REDIS_URL, APP_ENV, etc.
- Firewall rules β iptables INPUT/FORWARD/OUTPUT chains
- DNS records β localhost, db-primary, db-replica, cache-01, api.example.com
Everything resets instantly. No side effects on your actual machine.
Step 2: Terminal Emulator
File: src/terminal_emulator.py (~1100 lines)
A shell command parser that reads commands and returns realistic Linux output.
37 supported commands:
| Category | Commands |
|---|---|
| File reading | cat, head, tail, grep, find, wc |
| File management | ls, touch, mkdir, cp, mv, rm, chmod |
| Process management | ps, kill, systemctl |
| System info | top, free, df, du, uptime, whoami, id, hostname, date |
| Networking | netstat/ss, curl, dig/nslookup, iptables |
| Logs & scheduling | journalctl, crontab |
| Text processing | sort, uniq, cut, tr, tee, echo |
| Utilities | cd, pwd, env, export, which, mount, history, clear |
Also supports:
- Pipes:
cat /var/log/app.log | grep ERROR | wc -l - Redirects:
echo "hello" > /tmp/test.txt - Append:
echo "line" >> /tmp/test.txt - Chaining:
ps; df -h; free -m - Variable expansion:
echo $DATABASE_URL - Path resolution: relative paths,
~,.. - Quoting: single and double quotes
Step 3: Composable Scenario Engine (Key Differentiator)
File: src/scenarios.py (~850 lines)
Instead of hardcoded tasks, we built a modular system where failure scenarios are composed from building blocks.
Fault Injection Primitives (9 types):
| Fault | What It Does | Example |
|---|---|---|
crash_service |
Kills a service, closes its port | postgres crashes |
fill_disk |
Increases used space on a mount | /var/log fills to 95% |
corrupt_config |
Replaces config file content | nginx points to wrong port |
bad_permissions |
Sets wrong file permissions | script becomes non-executable |
add_log_flood |
Appends thousands of log lines | 5000 error lines in nginx log |
kill_port |
Closes a network port | port 8080 becomes CLOSED |
fail_cron |
Marks a cron job as failed | backup job shows FAILED |
memory_pressure |
Raises memory usage | 95% RAM used |
add_unauthorized_access |
Adds brute-force SSH entries to auth log | 50 failed login attempts |
Cascading Rules:
Faults can trigger other faults automatically:
Database crashes
βββ App can't connect, throws errors
βββ Error logs flood /var/log
βββ Disk fills up to 95%
βββ App can't write logs, crashes too
This is defined declaratively:
CascadeRule(
condition_fn="service_is_dead", # IF postgres is dead
condition_params={"service": "postgres"},
effect=Fault("disk_fill", ..., # THEN fill the /var/log disk
"fill_disk", {"mount": "/var/log", "fill_mb": 8500}),
)
Cascades are evaluated after every command the AI runs, so the environment evolves dynamically.
Step 4: 11 Pre-Built Scenarios
| # | Scenario | Difficulty | Objectives | What Happens |
|---|---|---|---|---|
| 1 | Log Analysis | Easy | 1 | Find timestamp of first 500 error in app logs |
| 2 | Permission Repair | Medium | 1 | Fix a script that can't execute (chmod) |
| 3 | Disk Space Crisis | Medium | 2 | /var/log partition is 90%+ full, clean it up |
| 4 | Cron Job Failure | Medium | 3 | Backup cron failing β create and fix the script |
| 5 | Process Recovery | Hard | 3 | PostgreSQL crashed, restart and verify |
| 6 | Nginx Misconfiguration | Hard | 3 | Wrong upstream port after deploy, fix config |
| 7 | Security Incident | Hard | 3 | Brute-force SSH attack, investigate auth logs |
| 8 | Memory Leak | Hard | 4 | Server low on RAM, find and restart leaky service |
| 9 | Network Troubleshooting | Hard | 4 | App unreachable β diagnose DNS/ports/firewall |
| 10 | Cascading DB Failure | Expert | 5 | DB crash β 502s β log flood β disk full β app crash |
| 11 | Full Incident Response | Expert | 6 | Everything broken at once: DB down, disk full, brute-force attack, memory pressure |
Each scenario has:
- Multiple graded objectives (partial credit)
- Hints for the AI
- Cascading fault chains (expert scenarios)
- Configurable max steps
Step 5: OpenEnv-Compliant API
File: src/server.py (~340 lines)
A FastAPI REST server that any AI agent can connect to over HTTP.
Endpoints:
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/health |
Health check |
GET |
/api/v1/tasks |
List all available tasks |
GET |
/api/v1/tasks/{key} |
Get task details |
GET |
/api/v1/scenarios |
List all 11 scenarios with metadata |
GET |
/api/v1/scenarios/{key} |
Get single scenario details |
POST |
/api/v1/env/reset |
Create a new environment instance |
POST |
/api/v1/env/{id}/step |
Execute a command, get reward |
GET |
/api/v1/env/{id}/state |
Debug: full environment state |
GET |
/api/v1/env |
List all active environments |
DELETE |
/api/v1/env/{id} |
Destroy an environment |
How the API works:
1. POST /api/v1/env/reset {"scenario": "cascading_db_failure"}
β Returns: env_id, initial observation, task instructions
2. POST /api/v1/env/env_0/step {"action": "ps"}
β Returns: command output, reward, score, done flag
3. Repeat step 2 until done=true or max steps reached
4. DELETE /api/v1/env/env_0 (cleanup)
Step 6: Agent Interface
File: src/agent.py (~270 lines)
Two ways to drive the environment:
AIWorker (Programmatic β no LLM needed):
from src.agent import AIWorker
agent = AIWorker(scenario="cascading_db_failure")
initial = agent.boot()
result = agent.invoke("ps") # run a command
result = agent.invoke("systemctl restart postgres")
print(agent.report()) # final score + history
LLMAgent (Optional β requires litellm + API key):
from src.agent import LLMAgent
agent = LLMAgent(model="openai/gpt-4o", api_key="sk-...")
result = agent.solve("cascading_db_failure") # fully autonomous
# Agent will: observe β think β run command β repeat until solved
Step 7: Arena Mode
Compare two agents (or two LLM models) solving the same scenario:
POST /api/v1/arena/run
{
"scenario": "process_recovery",
"commands_a": ["ps", "systemctl restart postgres", "systemctl status postgres"],
"commands_b": ["systemctl status postgres", "systemctl restart postgres", "ps"],
"label_a": "GPT-4",
"label_b": "Claude"
}
β Returns: winner, scores, step-by-step history for both
Who Will Use This
| User | How They Use It |
|---|---|
| Hackathon judges | Hit /api/v1/env/reset, run their agent against it, see if it scores 1.0 |
| AI researchers | Benchmark different LLMs on SRE tasks (GPT-4 vs Claude vs Gemini) |
| Companies building AI ops tools | Test their AI agent's troubleshooting ability before deploying to production |
| Students learning SRE | Step through scenarios manually to learn Linux troubleshooting |
| Platform builders | Use the scenario engine to create custom failure scenarios for training |
Use Cases
AI Agent Evaluation β "Can GPT-4 actually fix a crashed database?" Run it against the
process_recoveryscenario and get an objective 0-1 score.Benchmarking β Compare 5 different LLMs on all 11 scenarios. Rank them by score and steps used. Publish results.
Training Data Generation β Run thousands of episodes, collect command-reward pairs. Use for fine-tuning SRE-specific models.
Chaos Engineering for AI β Build custom cascading failure scenarios to stress-test AI agents before they touch real infrastructure.
Interactive Learning β A junior engineer (or AI) works through scenarios from easy to expert, building skills progressively.
Tech Stack
| Component | Technology |
|---|---|
| Language | Python 3.11+ |
| API Server | FastAPI + Uvicorn |
| Data Validation | Pydantic |
| Live Streaming | WebSockets |
| Container | Docker |
| LLM Integration | LiteLLM (optional) |
| Dependencies | 4 packages (fastapi, uvicorn, pydantic, python-multipart) |
Quick Start
# Install
cd meta
pip install -r requirements.txt
# Optional: install test dependencies
pip install -r requirements-dev.txt
# Run the demo
python demo.py
# Start the API server
python -m uvicorn src.server:app --host 0.0.0.0 --port 8000
# Optional: set runtime config (defaults are in .env.example)
set APP_ENV=development
set ALLOW_ORIGINS=http://localhost:8000,http://127.0.0.1:8000
# Run tests
pytest -q
# Test it
curl http://localhost:8000/health
curl http://localhost:8000/api/v1/scenarios
curl -X POST http://localhost:8000/api/v1/env/reset -H "Content-Type: application/json" -d '{"scenario": "cascading_db_failure"}'
Project Structure
meta/
βββ src/
β βββ virtual_filesystem.py # Simulated Linux OS (files, services, disk, network, memory)
β βββ terminal_emulator.py # 37-command shell with pipes, redirects, chaining
β βββ scenarios.py # 11 composable scenarios with cascading faults
β βββ tasks.py # Task interface + legacy compatibility
β βββ environment.py # OpenEnv reset/step loop
β βββ agent.py # AIWorker + optional LLMAgent
β βββ server.py # FastAPI server (REST endpoints + frontend routes)
β βββ settings.py # Environment-driven runtime/security settings
β βββ __init__.py
βββ tests/
β βββ test_environment.py
βββ .env.example
βββ requirements-dev.txt
βββ .github/workflows/ci.yml
βββ demo.py
βββ requirements.txt
βββ Dockerfile
βββ openenv.yaml
βββ README.md # Original readme
βββ Readmenew.md # This file
Important: Task Scoring Requirements
Validation rules for submissions:
- Your submission must include at least 3 tasks with graders (objectives).
- Each task's score must be strictly between 0 and 1 (not 0.0 and not 1.0).
- If you define a single-objective scenario, set
points=0.99(or similar). - For multi-objective scenarios, ensure no single objective uses
points=1.0orpoints=0.0. - The scenario grader and all scoring logic use floating-point values for compatibility.
Grading Table Example:
| Scenario Name | Objective Description | Points | Valid? |
|---|---|---|---|
| Log Analysis | Find 500 error in app log | 0.99 | β |
| Permission Repair | Make cleanup.sh executable | 0.99 | β |
| Process Recovery | Identify postgres is dead | 0.2 | β |
| Process Recovery | Restart postgres service | 0.5 | β |
| Process Recovery | Verify postgres is listening on 5432 | 0.3 | β |
| (Invalid Example) | Only objective, points=1.0 | 1.0 | β |
| (Invalid Example) | Only objective, points=0.0 | 0.0 | β |
These requirements are enforced by the validator. See src/scenarios.py for more examples of correct scoring.
What Makes This Different
Cascading failures β Faults trigger other faults, just like in real production outages. No other AI training environment does this.
Composable scenarios β Mix and match fault primitives to create any failure scenario. Not limited to pre-built tasks.
37 real Linux commands β Not a toy. Supports pipes, redirects, variable expansion, path resolution.
Objective grading β Every scenario is scored 0.0 to 1.0 based on measurable outcomes (is the service running? is the disk below 85%?). No subjective evaluation.
Arena mode β Side-by-side agent comparison on identical scenarios.
Zero infrastructure β Runs anywhere Python runs. No VMs, no Docker required, no GPU. Millisecond resets.