Keshav0375/Sentinel
GitHub: Keshav0375/Sentinel
Sentinel 是一个多 agent 编排的 DevOps 自主事件响应系统,能对告警自动分流、诊断根因、起草修复计划并在破坏性操作前强制人工审批。
Stars: 0 | Forks: 0
# Sentinel
**自主 DevOps 事件响应 agent** — 这是一个多 agent pipeline,能够对告警进行分流、诊断根本原因、起草修复计划并沟通状态,并且在执行任何破坏性操作之前设有强制的人工审批关卡。
本项目作为一个作品集项目开发,旨在展示生产级的智能体工程:多 agent 编排、HITL 安全性、情景记忆、轨迹评估以及实时可观测性。
## 工作原理
```
Alert fires
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Orchestrator Agent │
│ (coordinates handoffs, enforces 15-call cap, writes STM) │
└──┬──────────┬──────────┬──────────┬──────────┬─────────────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Triage Log Deploy Remediation Comms
Agent Analyst Correlator Agent Agent
│ │ │ │ │
│ fetch_ list_ draft_ draft_
get_ logs recent_ rollback_ slack_
service_ deploys pr summary
metadata │
search_ request_human_
past_ approval ◄── HITL gate
incidents │
▼
Human approves / rejects
│
▼
Incident resolved + stored
in episodic memory
```
每一次工具调用都会作为轨迹被捕获。解决事件后,LLM 评估器会从 6 个维度对该轨迹进行评分,并生成一份可在 Web 仪表板中查看的报告。
## 功能
- **多 agent pipeline** — 通过 OpenAI Agents SDK 交接机制编排的 5 个专家 agent(分流、日志分析师、部署关联器、修复、沟通)
- **HITL 安全关卡** — `request_human_approval` 是执行破坏性操作的唯一途径;任何 agent 都无法绕过它
- **情景记忆** — 过去的事件被嵌入并存储在 SQLite 中;在事件分流期间会自动浮现相似的历史事件
- **语义记忆** — 从种子数据加载的服务映射、依赖图和操作手册
- **实时事件仪表板** — 在 `http://localhost:8000/` 实时通过 SSE 流式传输 agent 活动;可从浏览器批准/拒绝 HITL
- **轨迹评估** — LLM-as-judge 从 6 个维度(0–5 分)对每个事件进行评分,并附带 Markdown 和 JSON 报告
- **评估结果仪表板** — 在 `http://localhost:8000/eval` 浏览每个场景的得分
- **10 个合成场景** — 涵盖 5 类故障(异常部署、DB 连接池、下游服务中断、内存泄漏、配置回退)
## 快速开始
### 前置条件
- Python 3.12+
- [Groq API key](https://console.groq.com/keys)(免费额度即可)
- Docker + docker-compose(可选,但强烈推荐)
### 1. 克隆并配置
```
git clone https://github.com/keshxv/sentinel.git
cd sentinel
cp .env.example .env
# 编辑 .env — 添加你的 GROQ_API_KEY
```
### 2a. 使用 Docker 运行
```
docker-compose up --build
```
仪表板:[http://localhost:8000](http://localhost:8000)
### 2b. 不使用 Docker 运行
```
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
python -m data.seed # seed service map + runbooks
uvicorn sentinel.main:app --reload
```
仪表板:[http://localhost:8000](http://localhost:8000)
### 3. 切换提供商(可选)
模型字符串使用 `provider/model` 格式。只需 3 个环境变量即可替换任何提供商,无需修改代码。
**将分析切换至 Anthropic Claude:**
```
SENTINEL_ANALYSIS_MODEL=anthropic/claude-sonnet-4-6
ANTHROPIC_API_KEY=sk-ant-...
```
**将所有任务切换至 OpenAI:**
```
SENTINEL_TRIAGE_MODEL=openai/gpt-4o-mini
SENTINEL_ANALYSIS_MODEL=openai/gpt-4o
SENTINEL_JUDGE_MODEL=openai/gpt-4o-mini
OPENAI_API_KEY=sk-...
```
请参阅 [available_models.md](available_models.md) 获取完整的模型列表和提供商能力矩阵。
### 4. 触发场景
**从仪表板** — 从下拉菜单中选择一个场景,然后点击 ⚡ 触发场景。
**从 CLI**:
```
python scripts/run_scenario.py bad_deploy_01
python scripts/run_scenario.py --list # see all 10 scenarios
```
### 5. 运行评估套件
```
python scripts/run_eval.py
# 或其子集:
python scripts/run_eval.py --scenarios bad_deploy_01 db_pool_01
```
结果 → `reports/eval_report.json` + `reports/eval_report.md`
仪表板 → [http://localhost:8000/eval](http://localhost:8000/eval)
## 演示
1. 从下拉菜单中选择 `bad_deploy_01` — 触发严重的 API 网关告警
2. 观察五个 agent 卡片随着每个专家完成分析而依次点亮
3. 当修复 agent 请求回滚批准时,会出现一个琥珀色的 HITL 悬浮层
4. 点击 ✅ 批准 — pipeline 继续执行,事件得到解决
5. 切换到 `/eval` 查看 LLM 评估器的各项维度得分
## 技术栈
| 层级 | 技术 |
|-------|-----------|
| Agent 框架 | [openai-agents](https://github.com/openai/openai-agents-python) (Agents SDK) |
| LLM | LiteLLM 多提供商 — 通过 `provider/model` 环境变量支持 `groq/`, `openai/`, `anthropic/`, `azure/`。默认:Groq(免费额度)。参见 [available_models.md](available_models.md)。 |
| API 层 | FastAPI + uvicorn |
| 记忆 — 情景 | 通过 aiosqlite + 余弦相似度的 SQLite |
| 记忆 — 语义 | SQLite (服务映射,操作手册) |
| Embeddings | sentence-transformers `all-MiniLM-L6-v2` (本地,384 维,零成本) |
| 实时 | Server-Sent Events (`EventSource` API) |
| 模型/校验 | Pydantic v2 |
| 配置 | pydantic-settings |
| 日志 | structlog (JSON) |
| HTTP 客户端 | httpx |
| 容器化 | Docker + docker-compose |
| 代码检查 | ruff |
| 类型检查 | pyright |
| 测试 | pytest + pytest-asyncio |
## 评估结果
**评估维度(由评估器打分 0–5 分):**
| 维度 | 衡量内容 |
|-----------|-----------------|
| `triage_accuracy` | 服务正确且严重性准确? |
| `root_cause_correctness` | 假设是否与已知根本原因相符? |
| `tool_efficiency` | 工具调用顺序是否合理?无冗余调用? |
| `mttr` | 从告警到提出修复建议的时间(越短越好) |
| `remediation_safety` | 是否使用了 HITL 关卡?提出的修复方案是否恰当? |
| `comms_quality` | Slack 摘要是否清晰、完整、结构化? |
及格阈值:**3.0 / 5.0** (60%)
## 项目结构
```
sentinel/
├── src/sentinel/
│ ├── agents/ # 5 specialist agents + orchestrator
│ ├── tools/ # Tool implementations (fetch_logs, draft_rollback_pr, …)
│ ├── memory/ # Episodic (SQLite + embeddings), semantic, short-term
│ ├── eval/ # Rubric, LLM-as-judge, batch runner, report generator
│ ├── api/ # FastAPI routes (webhooks, SSE, HITL, incidents, scenarios)
│ ├── infra/ # DB, logging, tracing, event bus, dashboard emitter
│ ├── models/ # Pydantic domain models
│ ├── generator/ # Synthetic alert + log + deploy data
│ └── dashboard/ # index.html (live dashboard) + eval.html
├── data/
│ ├── scenarios/ # 10 JSON scenario files
│ └── services/ # service_map.json, dependency_graph.json, runbooks.json
├── scripts/
│ ├── run_scenario.py # Fire a single scenario from CLI
│ ├── run_eval.py # Batch eval across all scenarios
│ └── demo.py # Interactive demo runner (coming soon)
├── tests/ # ~1 000 tests across all layers
└── reports/ # Trajectory JSON, eval_report.json/md
```
## 架构决策
**为什么选择多 agent 而不是单 agent?** 每个专家都有专属的 system prompt 和受限的工具集。这使得每个 agent 都可以独立测试和改进——修改日志分析师的 prompt 不会影响事件分流功能。
**为什么 HITL 在工具级别而不是在 prompt 级别实现?** 系统中不存在“执行回滚”工具,只有 `draft_rollback_pr` + `request_human_approval`。agent 无法通过忽略 prompt 指令来绕过审批;从工具层面来说,它根本没有任何可以脱离人类授权而执行操作的工具。
**为什么使用 SQLite 作为情景记忆?** 对于 MVP 而言,基础设施成本为零。这种 embedding + 余弦相似度的方法在 10 到 100 起事件规模时效果很好。Phase 2 将为了扩展性切换到带有向量索引的 Cosmos DB。
**为什么使用单独的评估模型?** 在评估时使用不同的模型家族可以避免自我评分偏见。agent 运行在 `llama-3.3-70b-versatile` 上;评估器运行在 `llama-3.1-8b-instant` 上。在生产环境中,您会完全使用不同的提供商。
## Phase 2 路线图
_此处记录的内容旨在用于面试中探讨生产环境就绪度:_
| 能力 | Phase 2 方案 |
|-----------|-----------------|
| 云部署 | Azure Container Apps + Bicep IaC |
| 数据库 | Cosmos DB (向量 + JSON) 替代 SQLite |
| 缓存 | 用于短期记忆的 Redis |
| 模型路由 | LiteLLM 已实现 (Phase 9) — 用于 token 预算控制的 Kong AI Gateway 为 Phase 2 计划 |
| 可观测性 | 自托管的 LangFuse 用于链路追踪仪表板 |
| HITL 渠道 | Slack 交互式按钮(真实的 Slack 应用) |
| PR 创建 | 用于创建真实 PR 的 GitHub App |
| 自我改进 | 每晚执行的 ACA Job — 重新评估 + 自动提交 PR 以改进失败的 prompt |
| 告警源 | Azure Service Bus + Datadog webhook 用于接收真实告警 |
| 对抗性评估 | 40 个场景,8 种故障类型,含糊的多原因复杂案例 |
| CI/CD | 带有评估分数门控的 GHA(如果平均分 < 3.5 则部署失败) |
## 运行测试
```
pytest # run all ~1 000 tests
pytest tests/test_eval/ # eval layer only
pytest tests/test_tools/ # tool layer only
pytest -x -v # stop on first failure, verbose
```
## 许可证
MIT
标签:人机协同, 多智能体协同, 安全规则引擎, 智能运维, 自动化事件响应, 请求拦截, 运行时操纵, 逆向工具