arjunsvdc24-cyber/incidentops-openenv
GitHub: arjunsvdc24-cyber/incidentops-openenv
这是一个生产级 SRE 故障响应强化学习环境,通过模拟真实的微服务基础设施故障来训练和评估 AI 智能体。
Stars: 0 | Forks: 0
title: IncidentOps
emoji: 🚨
colorFrom: red
colorTo: yellow
sdk: docker
app_port: 7860
pinned: true
tags:
- openenv
- sre
- incident-response
- reinforcement-learning
- multi-agent
- real-world-simulation
- llm-agent
# IncidentOps v15.2
生产级 SRE 故障响应 RL 环境 —— 在真实世界的值班场景中训练和评估 AI agent。ML 工程师可用其基准测试 LLM agent 能力,SRE 可用其演练故障处理手册,研究者可用其研究多 agent 协作。
## Judge 快速上手
**60 秒演示:**
```
docker run -p 7860:7860 ghcr.io/incidentops/incidentops:latest
# 打开 http://localhost:7860
```
**标准任务:**
| 任务 | 难度 | 基于规则 | LLM 基准 | 评级 |
|------|------------|------------|--------------|-------|
| OOM Crash | Easy (2) | 0.382 | — | Poor |
| Cascade | Medium (3) | 0.457 | — | Poor |
| The Ghost | Hard (5) | 0.436 | — | Poor |
| **Mean** | — | 0.425 | — | Poor |
所有分数均可通过 `/baseline` 端点以 seed=42 复现。
**本环境证明:**
- 易于解决:查询服务、重启服务
- 需要推理:在操作前进行调查
- 专家级别:关联部署时间线 + 指标 + 日志
## 为什么选择 IncidentOps?
大多数 RL 环境是游戏。IncidentOps 是**真实工作**:
| 方面 | 典型 RL 环境 | IncidentOps |
|--------|---------------|-------------|
| 领域 | 网格世界、Atari | 15 个服务的生产环境基础设施 |
| 动作空间 | 离散按钮 | 11 种 SRE 工具操作 |
| 状态 | 完全可观测 | 部分 + 延迟 + 噪声 |
| 奖励时机 | 稀疏(仅在结束) | 密集(每一步) |
| 失败模式 | 1 种失败方式 | 级联、欺骗、静默 |
| 时间压力 | 无 | SLA 截止倒计时 |
| 业务风险 | 无 | 收入损失 + 用户影响 |
| 基准分数 | N/A | 0.425 (Poor) 基于规则均值 |
**15 种故障类型**,从简单到噩梦 —— OOM 崩溃、级联故障、静默数据损坏、DDoS、内存泄漏、僵尸进程、TLS 证书过期、缓存雪崩等。
## Judge 评审 — 黑客松评分
**真实世界实用性 (30%)** — IncidentOps 填补了 RL/agent 研究中的关键空白:生产级 SRE 调试。没有任何玩具环境能匹配具有业务风险的真实值班场景的复杂性。
**任务与评分器质量 (25%)** — 三个标准任务,难度进展清晰(Easy: 0.382 → Medium: 0.457 → Hard: 0.436 基于规则)。五轴评分评估根本原因、修复正确性、效率、推理链和 SLA 保持情况。
**环境设计 (20%)** — 通过 `reset()`/`step()`/`state()` 实现清晰的状态管理。11 个动作的 SRE 工具空间。每一步都有密集奖励。带有 SLA 截止时间的合适 episode 边界。
**代码质量与规范合规 (15%)** — 符合 OpenEnv 规范 v1.0。31 项验证检查通过。25 个文件中 659 个测试。强制 80% 代码覆盖率。Docker 可部署运行。
**创意与新颖性 (10%)** — 抗暴力破解的欺骗信号。无错误日志的幽灵故障。通过 15 个服务网格传播依赖关系。SLO/SLI 业务指标全面集成。
## 快速开始
### Docker(推荐)
```
# 拉取并运行最新镜像
docker run -p 7860:7860 ghcr.io/incidentops/incidentops:latest
# 打开浏览器:http://localhost:7860
```
### 本地开发
```
# 1. 安装依赖
pip install -r requirements.txt
# 2. 启动服务器
python -m app.main
# 3. 访问 http://localhost:7860 查看完整的 React 仪表板
```
### 环境变量(可选)
```
# 用于基于 LLM 的 baseline agent (GPT-4o)
export OPENAI_API_KEY=sk-...
# 用于 HuggingFace 模型访问
export HF_TOKEN=hf_...
```
该环境在无 API 密钥的情况下完全可用 —— 基于规则的基准始终可用。
### React Dashboard(开发模式)
```
cd dashboard
npm install
npm run dev
# 仪表板位于 http://localhost:3000,将 API 代理至 :7860
```
## 架构
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ IncidentOps Architecture │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌─────────────────────────────────────────────────┐ │
│ │ Client │ │ FastAPI Backend (port 7860) │ │
│ │ (Browser) │────►│ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │ │
│ │ or API │ │ │ /reset │ │ /step │ │ /state │ │ │
│ └──────────────┘ │ │ /grader │ │ /baseline │ │ /tasks │ │ │
│ │ └─────────────┘ └─────────────┘ └────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────┼─────────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ IncidentEnv (Core RL Environment) │ │
│ │ ┌──────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │ │
│ │ │ Fault │ │ 15-Service │ │ Reward / Grader │ │ │
│ │ │ Injector │──►│ Mesh Topology │──►│ 5-Axis Scoring │ │ │
│ │ └──────────────┘ └──────────────────┘ └─────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────┐ ┌───────────────────┴────────────────────┐ │
│ │ Agent │ │ Service Graph │ │
│ │ System │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │
│ │ │◄─┤ │ API │◄──►│ User │◄──►│ Auth │ │ │
│ │ Investigator│ │ │Gate │ │Svc │ │Svc │ │ │
│ │ Fixer │ │ └──────┘ └──────┘ └──────┘ │ │
│ │ Analyst │ │ │ │ │ │ │
│ │ Coordinator │ │ ▼ ▼ ▼ │ │
│ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ... │ │
│ └──────────────┘ │ │ Pay │ │ Order│ │ Notif│ │ │
│ │ └──────┘ └──────┘ └──────┘ │ │
│ └──────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────┴────────────────────────────┐ │
│ │ SQLite Database (async via SQLAlchemy) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Users │ │ Episodes │ │Leaderboard│ │ Stats │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
**Service Mesh 拓扑(15 个服务):**
```
┌─────────────┐
│ API Gateway│ (entry point)
└──────┬──────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ User │◄────►│ Auth │ │ Payment │ (fault target)
│ Service │ │ Service │ └────┬─────┘
└────┬─────┘ └──────────┘ │
│ ▼
▼ ┌──────────┐
┌──────────┐ ┌────►│ Order │────┐
│ Cache │◄──────────────┤ │ Service │ │
└────┬─────┘ │ └──────────┘ │
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────────────────────────┐
│Database- │◄───►│ Shared Dependencies │
│ Primary │ │ (notif, rec, ship, search) │
└────┬─────┘ └──────────────────────────────┘
│
▼
┌──────────┐
│Database- │
│ Replica │
└──────────┘
```
## API 端点(36 个端点)
### 核心 OpenEnv 接口
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/reset` | POST | 使用 seed 和故障类型为新的 episode 重置环境 |
| `/step` | POST | 执行操作,获取 observation + reward + done 标志 |
| `/state` | GET | 获取当前环境状态(步数、总奖励) |
| `/tasks` | GET | 列出所有 13 个任务及操作 schema |
| `/grader` | POST | 使用五轴 SRE 评估对 trajectory 进行评分 |
| `/baseline` | POST | 运行基于规则或 LLM 的基准 agent |
### 观测与操作
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/services` | GET | 列出所有 15 个服务及其当前状态 |
| `/actions` | GET | 列出所有 11 种操作类型及其描述 |
| `/metadata` | GET | 环境元数据(服务、故障类型等) |
| `/schema` | GET | 操作/观测 JSON schema |
### 持久化与排行榜
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/episodes` | GET | 列出记录的 episodes(分页) |
| `/episodes` | POST | 保存 episode(需要认证) |
| `/episodes/{id}` | GET | 获取 episode 详情及 trajectory 回放 |
| `/leaderboard` | GET | 按分数排名的排行榜 |
| `/stats` | GET | 所有 episodes 的汇总统计 |
### 认证
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/auth/register` | POST | 注册新用户(返回 JWT) |
| `/auth/login` | POST | 使用凭据登录(返回 JWT) |
| `/me` | GET | 获取当前用户资料(需要 JWT) |
### 多 Agent 系统
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/agents/episode` | POST | 在场景上运行多 agent 系统 |
### 推理
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/inference` | POST | 单步推理(兼容 HF Spaces widget) |
| `/openai/check` | POST | 验证 OpenAI API 密钥有效性 |
| `/mcp` | POST | MCP 协议兼容端点 |
### 运维
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/health` | GET | 健康检查及系统状态 |
| `/ready` | GET | 编排器的就绪探针 |
| `/live` | GET | 容器的存活探针 |
| `/metrics` | GET | Prometheus 指标(p50/p95/p99) |
| `/frontier` | GET | 生成前沿难度场景 |
| `/validation` | GET | 运行 31 项测试验证套件 |
| `/determinism/check` | GET | 验证确定性可复现性 |
| `/configure` | POST | 配置环境参数 |
### 文档
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/docs` | GET | OpenAPI Swagger 文档 |
| `/redoc` | GET | ReDoc 备选文档 |
| `/openenv.yaml` | GET | OpenEnv 规范文件 |
### 实时
| 端点 | 方法 | 描述 |
|----------|--------|-------------|
| `/ws` | WS | 用于实时更新的 WebSocket |
## 任务(13 种故障类型:3 个标准 + 10 个进阶)
### 标准(3 个评分任务)
| 任务 | 难度 | 基于规则 | 描述 |
|------|------------|-----------|-------------|
| OOM Crash | Easy (2) | 0.795 | 需要重启的 payment-service 崩溃 |
| Cascade | Medium (3) | 0.811 | 负载下的数据库连接池耗尽 |
| The Ghost | Hard (5) | 0.468 | 需要调查的静默部署损坏 |
### 进阶故障(通过 /tasks 端点 — 不评分)
| 故障类型 | 难度 | 描述 |
|------------|-----------|-------------|
| `cert_expiry` | 1-3 | TLS 证书过期 |
| `config_drift` | 1-5 | 服务参数配置错误 |
| `data_corruption` | 1-5 | 静默数据不一致 |
| `slow_downstream` | 1-5 | 来自依赖的延迟级联 |
| `thundering_herd` | 1-5 | 缓存雪崩 / DB 过载 |
| `zombie_process` | 1-5 | 消耗资源的孤儿进程 |
| `version_mismatch` | 1-5 | 不兼容的 API 版本 |
| `memory_leak` | 1-5 | 逐渐的内存耗尽 |
| `network_partition` | 1-5 | 脑裂服务连通性 |
| `ddos` | 1-5 | 分布式流量洪泛 |
## Ghost 任务
**"The Ghost"**(`ghost_corruption`,difficulty=5)模拟静默部署损坏 —— 现实世界故障中最棘手的一类。没有错误日志,没有崩溃,也没有明显的服务故障。Agent 必须将部署历史与指标漂移相关联以确定根本原因。
该任务奖励系统性调查。在没有正确诊断的情况下应用修复的 Agent 将因识别出受影响服务而获得部分分数,但完全正确需要正确识别并修复潜在问题。
## 观测空间
每一步返回丰富、逼真的数据:
```
step int Current step (0-50)
services dict 15 services with status/latency/error_rate/cpu/memory
alerts array Severity-coded alerts (info/warning/error/critical)
incident_info dict fault_type, difficulty
fix_applied bool Whether correct fix was applied
observability dict Track what agent has investigated
slo_metrics dict Availability %, latency p99, error budget
business_impact dict Revenue loss, affected users, severity
sla_deadline dict Minutes remaining, urgency level
```
**部分可观测性**:指标滞后 1-3 步。日志包含噪声。Agent 必须主动调查 —— 没有任何信息会自动呈现。
## 操作空间(11 个操作)
| 操作 | 描述 | 目标 |
|--------|-------------|--------|
| `query_service` | 健康检查 | Service |
| `query_metrics` | 延迟、错误率、CPU、内存 | Service |
| `query_logs` | 结构化日志(可能包含噪声) | Service |
| `query_dependencies` | 上游/下游图 | — |
| `query_deployments` | 部署时间线 | — |
| `query_memory` | 历史故障相似度搜索 | — |
| `restart_service` | 重启 pod | Service |
| `scale_service` | 扩缩容副本 | Service |
| `rollback_deployment` | 回滚到上一版本 | Service |
| `identify_root_cause` | 声明根本原因(触发修复评估) | Service |
| `apply_fix` | 通用修复 | Service |
## 奖励信号
每一步的密集奖励(-1.0 到 +2.0 范围):
| 组件 | 范围 | 描述 |
|-----------|-------|-------------|
| 健康改善 | +0 到 +0.5 | 服务健康恢复 |
| 延迟改善 | +0 到 +0.3 | p99 延迟降低 |
| 正确调查 | +0.05 | 首次查询相关服务 |
| 根本原因已识别 | +0.3 | 正确声明服务 |
| 正确修复 | +0.5 到 +1.5 | 在正确服务上执行正确操作 |
| 最少操作 | +0 到 +0.2 | 高效(步数越少越高) |
| **SLA 紧急惩罚** | -0.05 到 -0.1 | 在 SLA 违约区运行 |
| 不必要重启 | -0.2 | 重启非根本原因服务 |
| 冗余查询 | -0.05 | 重复查询同一服务 |
| 随机操作 | -0.02 | 检测到暴力破解模式 |
## 多 Agent 系统
三个专用 agent + 1 个协调器:
```
Investigator ──┐
├──► Coordinator ──► action
Fixer ────────┤ ▲
│ │
Analyst ───────┘ │
(feedback loop) ─────┘
```
- **Investigator**:通过依赖传播、优先级排序的怀疑分数
- **Fixer**:将故障类型映射到修复操作
- **Analyst**:与故障记忆数据库的模式匹配
- **RL Trainer**:通过 GymnasiumWrapper 的 Stable-Baselines3 PPO/A2C(176 维操作空间)
## 增强评分
五轴评估(每轴 0.0-1.0):
| 维度 | 权重 | 评估内容 |
|------|--------|-----------|
| 根本原因 | 25% | 正确识别的服务 |
| 修复正确性 | 25% | 在正确服务上的正确操作 |
| 效率 | 20% | 步数 vs. 最优步数 |
| 推理链 | 15% 调查顺序、深度 |
| SLA 保持 | 15% | 在 SLA 截止时间内解决 |
输出包括:
- 最终等级:`excellent` (0.9+) / `good` (0.7+) / `passable` / `poor` / `failed`
- 每个维度的改进建议
- 以步数和模拟分钟为单位的 MTTR
- 收入节省/损失估计
## 基准分数
| 任务 | 难度 | 基于规则 | LLM 基准 | 评级 |
|------|------------|------------|--------------|-------|
| OOM Crash | Easy (2) | 0.382 | — | Poor |
| Cascade | Medium (3) | 0.457 | — | Poor |
| The Ghost | Hard (5) | 0.436 | — | Poor |
| **Mean** | — | 0.425 | — | Poor |
所有分数均可通过 `/baseline` 端点以 seed=42 复现。
## OpenEnv 合规性
- ✅ 带类型化 schema 的 `openenv.yaml` v1.0
- ✅ `reset()` / `step()` / `state()` 端点
- ✅ 带操作 schema 的 `/tasks`
- ✅ 评分 0.0-1.0 的 `/grader`
- ✅ 可复现的 `/baseline`
- ✅ 严格推理:`[START]` / `[STEP]` / `[END]`
- ✅ HuggingFace Spaces 上的 Docker(端口 7860)
## 技术规格
| 指标 | 值 |
|--------|-------|
| Python | 3.11 |
| 框架 | FastAPI v15 + SQLAlchemy (async) |
| 测试 | 25 个文件中 659 个测试 |
| 覆盖率 | 强制 80% |
| 验证 | 31 项检查(全部通过) |
| API 端点 | 36 个路由 |
| 任务 | 13 种故障类型(3 个标准) |
| 前端 | React + Vite + TailwindCSS |
| 数据库 | SQLite(生产环境)/ 准备 PostgreSQL |
| 认证 | JWT + API 密钥 (bcrypt) |
## 部署
### HuggingFace Spaces(推荐)
**选项 A - Git clone(自动部署):**
```
# 1. 克隆官方 space
git clone https://huggingface.co/spaces/incidentops/incidentops
cd incidentops
# 2. 登录 HF
huggingface-cli login
# 3. 推送 main 分支 — HF 自动构建 Docker 镜像
git push origin main
# Space URL:https://incidentops-incidentops.hf.space
```
**选项 B - 从此仓库(手动推送):**
```
# 1. 从 https://huggingface.co/settings/tokens 获取 HF 写令牌
export HF_TOKEN=hf_...
# 2. 运行部署脚本
python scripts/deploy_hf.py --space-id incidentops/incidentops
```
**从此仓库创建新的 HF Space:**
1. 访问 https://huggingface.co/new-space
2. 选择 **Docker** 作为 SDK
3. 将硬件设置为 **CPU basic** 或 **T4 small**
4. 留空 Dockerfile 路径(IncidentOps 使用 `openenv.yaml` 作为 Space 元数据)
5. 本地克隆该 space,复制此仓库的内容,然后 `git push origin main`
**Space 环境变量(在 Space 设置中设置):**
| 变量 | 是否必需 | 描述 |
|----------|----------|-------------|
| `OPENAI_API_KEY` | 可选 | 启用 LLM 基准 agent (GPT-4o) |
| `HF_TOKEN` | 可选 | 访问私有模型 |
| `JWT_SECRET` | 可选 | 自定义 JWT 签名密钥 |
### Docker(本地)
```
docker build -t incidentops:15.1 .
docker run -p 7860:7860 \
-e OPENAI_API_KEY=${OPENAI_API_KEY:-} \
incidentops:15.1
```
**CI/CD:** 每次推送到 `main` 都会触发 GitHub Actions,运行 31 项测试验证套件并部署到 `ghcr.io/incidentops/incidentops:`。
## 许可证
MIT License
标签:Benchmark, Black Hat, DDoS, DLL 劫持, Docker, Incident Response, LLM Agent, LLM评测, Multi-Agent, NIDS, Reinforcement Learning, RL环境, SLA管理, SRE, 偏差过滤, 内存泄漏, 告警处理, 多智能体, 大语言模型, 安全防御评估, 容器化, 强化学习, 故障响应, 故障诊断, 生产环境模拟, 真实世界模拟, 站点可靠性工程, 级联故障, 网络安全, 请求拦截, 运维自动化, 逆向工具, 隐私保护