yourcoder0/Incident-Response
GitHub: yourcoder0/Incident-Response
一个基于Docker与FastAPI的AI驱动生产事件响应模拟环境,训练智能体在高压下完成真实SRE处置流程。
Stars: 0 | Forks: 0
title: IncidentResponseEnv
emoji: 🚨
colorFrom: red
colorTo: red
sdk: docker
pinned: false
license: apache-2.0
tags:
- openenv
- reinforcement-learning
- incident-response
- sre
# 🚨 IncidentResponseEnv — AI 驱动的生产事件响应
## 🧠 本环境的独特之处
IncidentResponseEnv 模拟了**生产事件响应**的高风险场景 —— 在这里,AI agent 必须扮演待命的 SRE 工程师,在压力下做出时间紧迫的决策。
与简单的测试环境不同,agent 必须:
- 在级联故障下**正确确定优先级**(顺序错误 = 实质性损害)
- **遵循升级协议**(联系错误的团队 = 浪费时间)
- 在进行缓解操作的同时**与客户沟通**
- 出于监管和运营问责的目的**撰写事后总结**
- **避免灾难性操作**(过早提升副本会导致数据损坏)
## 🎯 为什么选择这个环境?
生产事件是**高风险、时间敏感且受策略约束的决策**,越来越多地被交给 AI agent 处理。本环境针对那些会导致实际业务损害的特定故障模式对 agent 进行训练:
- 错误的升级路径会在宕机期间浪费 10 多分钟
- 在禁用写入之前刷新被污染的缓存会导致缓存立即被再次污染
- 宕机期间缺失客户沟通会违反 SLA 合同
- 过早提升数据库副本会导致不可逆的数据损坏
这些**不是儿戏般的决策** —— 它们反映了大规模实际应用中使用的真实 SRE 操作手册。
## 🚀 快速开始
### 本地 (Python)
```
git clone https://huggingface.co/spaces//incident-response-env
cd incident-response-env
pip install -r requirements.txt
uvicorn server.app:app --host 0.0.0.0 --port 7860
python inference.py --mock
```
### Docker
```
docker build -t incident-response-env .
docker run -p 7860:7860 \
-e API_BASE_URL=https://api.openai.com/v1 \
-e MODEL_NAME=gpt-4o-mini \
-e HF_TOKEN=sk-... \
incident-response-env
```
## 🌐 API Endpoints
| Method | Path | Description |
|--------|------|-------------|
| GET | `/` | 根健康检查 |
| GET | `/health` | 健康监控 |
| POST | `/reset` | 重置 episode `{"task_id": "..."}` |
| POST | `/step` | 执行操作 `{"action": {...}}` |
| GET | `/state` | 完整序列化状态 |
| GET | `/tasks` | 列出所有 task ID |
| GET | `/action_space` | Action schema |
| GET | `/obs_space` | Observation schema |
## 📦 项目结构
```
incident_response_env/
├── env/
│ ├── environment.py # Main IncidentResponseEnv class
│ ├── models.py # Typed Pydantic schemas
│ └── reward_function.py # 7-component shaped reward
├── tasks/
│ └── task_definitions.py # 3 tasks: easy → hard
├── graders/
│ └── graders.py # Deterministic episode graders
server/
└── app.py # FastAPI HTTP server
inference.py # Baseline agent script
openenv.yaml # OpenEnv spec metadata
client.py # Typed HTTP client
```
## 🔭 Observation Space
```
class Observation(BaseModel):
task_id: str
step: int
max_steps: int
incident_id: str
alerts: List[Alert] # fired alerts with metrics
service_status: Dict[str, str] # service -> healthy|degraded|down
recent_deployments: List[Dict] # recent deploys with commit info
runbook: Dict[str, str] # available runbook steps
knowledge_base: Dict[str, str] # policy lookups
last_action_result: Optional[str]
assigned_severity: Optional[str] # sev1|sev2|sev3|sev4
tags: List[str]
done: bool
info: Dict[str, Any]
```
## ⚡ Action Space
```
class Action(BaseModel):
action_type: ActionType # One of 9 types below
query: Optional[str] # investigate
escalation_team: Optional[str] # escalate: database|networking|security|payments|platform|management
escalation_reason: Optional[str] # escalate
runbook_step: Optional[str] # mitigate: key from runbook
mitigation_note: Optional[str] # mitigate
message: Optional[str] # communicate
audience: Optional[str] # communicate: customers|team|stakeholders|management
deployment_id: Optional[str] # rollback
rollback_reason: Optional[str] # rollback
resolution_code: Optional[str] # resolve: fixed|rolled_back|mitigated|false_alarm
resolution_note: Optional[str] # resolve
postmortem: Optional[str] # resolve (required for hard task)
tags: Optional[List[str]] # tag
summary_text: Optional[str] # summarize
```
**Action 类型:** `investigate`、`escalate`、`mitigate`、`communicate`、`rollback`、`resolve`、`tag`、`summarize`、`request_info`
**终止 action:** `resolve` 会立即结束 episode。
## 🏆 Reward Function
所有 reward 都是确定性的(没有 LLM 调用)。分数始终在 `[0.0, 1.0]` 之间。
| Component | Weight | Description |
|-----------|--------|-------------|
| `severity_accuracy` | 0.15 | 分配了正确的 SEV 级别 |
| `investigation_quality` | 0.20 | 查询了相关的指标/日志 |
| `mitigation_quality` | 0.20 | 应用了正确的 runbook 步骤 |
| `communication_quality` | 0.15 | 通知了正确的受众 |
| `escalation_accuracy` | 0.15 | 寻呼了正确的团队 |
| `resolution_quality` | 0.10 | 代码正确且包含事后总结 |
| `efficiency_bonus` | 0.05 | 在步数预算内解决 |
**惩罚:**
| Violation | Penalty |
|-----------|---------|
| 升级到错误的团队 | −0.10 |
| 错误的操作顺序(禁用前刷新) | −0.15 |
| 缺失必填字段 | −0.05 |
| 过早提升副本 | −0.20 |
## 📋 Tasks
### Task 1 — 简单:数据库连接激增(最多 4 步)
**场景:** 部署 DEPLOY-441 后,用户服务的数据库连接池占用率达到 95%。
**目标:**
1. 调查最近的部署
2. 实施缓解措施(回滚或增加连接池大小)
3. 以正确的代码解决
**及格线:** 0.60 | **预期 Baseline:** ~0.80
### Task 2 — 中等:支付服务降级(最多 5 步)
**场景:** Stripe SDK v4 迁移后,结账错误率达到 2.1%。支付网关延迟 4200ms。
**目标:**
1. 升级给**支付团队**(不是安全团队,也不是数据库团队)
2. 通过状态页与客户沟通
3. 调查并进行缓解
4. 解决
**及格线:** 0.55 | **预期 Baseline:** ~0.75
**关键失败模式:** 升级给错误的团队(安全/数据库)= -0.10 惩罚。
### Task 3 — 困难:级联故障 / 全站宕机(最多 6 步)
**场景:** CDN 可用率为 0% + 数据库复制延迟 45s + 缓存污染 —— 这一切都是由 DEPLOY-455 激进的缓存预取同时触发的。
**目标:**
1. 分配 SEV1
2. **首先禁用缓存写入** —— 在刷新之前(关键顺序)
3. 刷新被污染的缓存
4. 升级给平台团队
5. 通知管理层(SEV1 要求)
6. 向客户沟通宕机事件
7. 以 20 字以上的事后总结解决
**及格线:** 0.50 | **预期 Baseline:** ~0.65
**关键失败模式:**
- 在禁用写入之前刷新缓存 = -0.15(再次污染)
- 过早提升副本 = -0.20(数据损坏)
- 未通知管理层 = -0.05
## 📊 Baseline 分数(mock 模式)
| Task | Difficulty | Baseline Score | Passed |
|------|-----------|---------------|--------|
| task_easy_db_spike | Easy | ~0.80 | ✅ |
| task_medium_payment_degradation | Medium | ~0.75 | ✅ |
| task_hard_cascading_failure | Hard | ~0.65 | ✅ |
| **Average** | | **~0.73** | **3/3** |
## 🔧 环境变量
| Variable | Description | Default |
|----------|-------------|---------|
| `API_BASE_URL` | LLM API endpoint | `https://api.openai.com/v1` |
| `MODEL_NAME` | 模型标识符 | `gpt-4o-mini` |
| `HF_TOKEN` | API key | (必填) |
| `PORT` | 服务器端口 | `7860` |
## 🚀 核心创新
- **对顺序敏感的评分** — Task 3 通过扫描操作历史记录来检测 `disable_cache_writes` 是否发生在 `flush_cache` 之前
- **灾难性操作检测** — 在活跃事件期间执行 `promote_replica` = -0.20 惩罚
- **7 组件塑形 reward** — agent 即使从部分解决方案中也能获得训练信号
- **真实的 SRE runbook** — 任务基于实际的事件响应模式
- **策略控制的升级** — 确定性地惩罚升级给错误团队的行为
## 📄 许可证
Apache 2.0
标签:AI智能体, SRE, 人工智能, 偏差过滤, 强化学习环境, 故障响应, 用户模式Hook绕过, 运维模拟