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绕过, 运维模拟