AnirudhS3110/Sentinel-AI

GitHub: AnirudhS3110/Sentinel-AI

一个基于多智能体协作的生产级 AI 事件响应平台,通过 LangGraph 编排六个专职智能体自动完成基础设施事件的根因分析、修复与复盘。

Stars: 0 | Forks: 0

# SentinelAI 面向生产环境的 AI 驱动的事件编排系统。提交包含日志的事件;六个专门的 agent 负责规划、分类、分析、验证、修复和报告——并将实时进度流式传输到指挥中心仪表板。 技术栈:Next.js, NestJS, TypeScript, PostgreSQL, Prisma, Redis, BullMQ, Socket.IO, LangGraph, LangChain, Google Gemini, Tailwind CSS, Framer Motion, Recharts, Firebase Auth, Railway, Vercel, Neon, Upstash **在线演示:** [sentinel-ai-v1.vercel.app](https://sentinel-ai-v1.vercel.app/) ## 目录 - [概述](#overview) - [架构](#architecture) - [Monorepo 结构](#monorepo-structure) - [AI agent](#ai-agents) - [工作流 pipeline](#workflow-pipeline) - [技术栈](#tech-stack) - [数据模型](#data-model) - [实时更新](#real-time-updates) - [身份验证](#authentication) - [前置条件](#prerequisites) - [本地设置](#local-setup) - [环境变量](#environment-variables) - [脚本](#scripts) - [部署](#deployment) - [应用路由](#app-routes) ## 概述 SentinelAI 实现了事件生命周期的自动化: 1. 用户通过 Web UI 创建事件(标题、描述、原始日志)。 2. **API** 持久化事件,并将首个任务加入 **BullMQ** (Redis) 队列。 3. **worker** 按顺序运行六个由 **Gemini** 驱动的 agent,更新 PostgreSQL 并发布事件。 4. **API** 通过 **Socket.IO** 转发事件,以便仪表板实时更新。 编排是**队列驱动**的 (BullMQ)。**LangGraph** 仅用于验证路由(重试分析 vs. 继续 vs. 失败)。 ## 架构 ``` flowchart TB subgraph Client["Browser (Next.js)"] UI[Dashboard / Incidents] REST[REST client] SIO[Socket.IO client] end subgraph API["apps/api — NestJS"] HTTP[REST + Auth] GW[IncidentsGateway] SUB[Redis subscriber] PROD[Queue producer] end subgraph Worker["apps/worker — NestJS"] PROC[BullMQ processors ×6] AGT[Gemini agents ×6] LG[LangGraph router] PUB[Redis publisher] end subgraph Data["Infrastructure"] PG[(PostgreSQL)] RD[(Redis)] end UI --> REST --> HTTP UI --> SIO --> GW HTTP --> PG PROD --> RD RD --> PROC PROC --> AGT AGT --> LG PROC --> PG PROC --> PUB --> RD --> SUB --> GW ``` | 服务 | 端口 (本地) | 角色 | |---------|----------------|------| | **web** | `3000` | Next.js UI;将 `/backend/*` 代理到 API | | **api** | `3001` | REST API, Firebase auth, BullMQ **producer**, Socket.IO | | **worker** | — | BullMQ **consumer**, Gemini LLM 调用, 工作流路由 | 本地运行必须同时启动这三个进程(或在生产环境中单独部署),才能实现端到端的编排。 ## Monorepo 结构 ``` sentinel-ai/ ├── apps/ │ ├── web/ # Next.js 16 dashboard & marketing │ ├── api/ # NestJS API + WebSockets + queue producer │ └── worker/ # NestJS worker + agents + queue consumers ├── packages/ │ └── shared/ # Enums, Zod schemas, queue names, events, prompts ├── railway.toml # Railway build/start for API ├── DEPLOYMENT.md # Production deploy checklist └── package.json # npm workspaces root ``` | 包 | npm 名称 | 描述 | |---------|----------|-------------| | `apps/web` | `web` | React 19, TanStack Query, Firebase client, Recharts | | `apps/api` | `api` | Prisma, BullMQ producer, Firebase Admin, Socket.IO | | `apps/worker` | `worker` | LangChain + Gemini, LangGraph, BullMQ consumer | | `packages/shared` | `@sentinel/shared` | 共享类型、常量、agent 输出 schema | ## AI agent 六个 agent 在固定的 pipeline 中运行。每个 agent 都通过 LangChain 使用 **Google Gemini**(默认为 `gemini-2.5-flash-lite`),并在 `packages/shared` 中定义了 **Zod 校验的 JSON** 输出。 | # | Agent | 队列 | 目的 | 关键输出 | |---|--------|-------|---------|------------| | 1 | **Planner** | `planner` | 根据事件上下文和日志构建调查计划 | `steps`, `focusAreas`, `estimatedDurationMinutes` | | 2 | **Classification** | `classification` | 分配严重性、类别和事件类型 | `severity`, `category`, `incidentType`, `confidence` | | 3 | **Analysis** | `analysis` | 带有证据的根本原因分析 | `rootCause`, `affectedServices`, `evidence`, `confidence` | | 4 | **Validation** | `validation` | 检查分析的安全性和正确性 | `valid`, `issues`, `safetyScore`, `requiresRetry` | | 5 | **Remediation** | `remediation` | 提出修复步骤和回滚计划 | `steps`, `rollbackPlan`, `requiresHumanApproval` | | 6 | **Report** | `report-generation` | 编写最终的复盘报告 | `summary`, `rootCause`, `remediation`, `timeline` | **实现路径** | Agent | Worker 源码 | |-------|----------------| | Planner | `apps/worker/src/agents/planner/planner.agent.ts` | | Classification | `apps/worker/src/agents/classification/classification.agent.ts` | | Analysis | `apps/worker/src/agents/analysis/analysis.agent.ts` | | Validation | `apps/worker/src/agents/validation/validation.agent.ts` | | Remediation | `apps/worker/src/agents/remediation/remediation.agent.ts` | | Report | `apps/worker/src/agents/report/report.agent.ts` | **LLM 层:** `apps/worker/src/common/llm.service.ts` — 结构化 JSON schema → JSON 模式 → 手动提取兜底。 **Prompt 与 schema:** `packages/shared/src/llm/agent-prompts.ts`, `packages/shared/src/schemas/agent-outputs.ts` ## 工作流 pipeline ### 阶段 | 阶段 | `IncidentStatus` | 设置者 | |-------|------------------|--------| | 规划 | `PLANNING` | Planner | | 分类 | `CLASSIFICATION` | Classification | | 分析 | `ROOT_CAUSE_ANALYSIS` | Analysis | | 验证 | `VALIDATION` | Validation | | 修复 | `REMEDIATION` | Remediation | | 人工审批 | `HUMAN_APPROVAL` | Remediation(目前会自动推进) | | 报告 | `REPORT_GENERATION` | Report agent | | 完成 | `RESOLVED` | 报告已存储 | | 失败 | `FAILED` | Agent 错误或验证耗尽 | ### 控制流 ``` POST /incidents (API) → enqueue planner → Planner → Classification → Analysis → Validation ↑_________________________| (retry, max 3) → Remediation → Report → RESOLVED ``` - **BullMQ** 链式任务:每个处理器完成后,会将下一个任务加入队列 (`apps/worker/src/common/queue-dispatcher.service.ts`)。 - **API** 仅将第一个任务加入队列 (`apps/api/src/queues/queue-producer.service.ts`)。 - **LangGraph** (`apps/worker/src/workflows/workflow-router.service.ts`) 在验证后做出决定: - `retry_analysis` — 重新运行分析(最多 `MAX_VALIDATION_RETRIES` 次,默认为 3 次) - `remediation` — 继续 pipeline - `failed` — 标记事件为失败 验证后规则还会在 `safetyScore < 0.5` 或分析 `confidence < 0.4` 时强制重试。 ## 技术栈 | 层 | 技术 | |-------|----------------| | **Frontend** | Next.js 16, React 19, Tailwind CSS 4, TanStack Query, Framer Motion, Socket.IO client, Recharts, XYFlow | | **API** | NestJS 11, Prisma 7, PostgreSQL, BullMQ, Socket.IO, Firebase Admin | | **Worker** | NestJS 11, BullMQ, LangChain, `@langchain/google-genai`, LangGraph, Zod | | **Shared** | TypeScript, Zod 4, 共享枚举和事件类型 | | **Infra** | PostgreSQL, Redis(队列 + pub/sub) | | **AI** | Google Gemini API | | **Auth** | Firebase Authentication | ## 数据模型 Prisma schema:`apps/api/prisma/schema.prisma` | 模型 | 目的 | |-------|---------| | `User` | 关联到 Firebase UID | | `Incident` | 标题、日志、严重性、类别、状态 | | `WorkflowExecution` | 单个事件的运行,`currentStage`,`retryCount` | | `AgentExecution` | 单个 agent 的输入/输出、持续时间、状态 | | `IncidentReport` | 最终生成的报告 | ## 实时更新 1. Worker/API 将 `WorkflowEventPayload` 发布到 Redis 频道 `sentinel:workflow:events`。 2. API 的 `RedisSubscriberService` 接收事件,并通过 Socket.IO 广播。 3. Web 客户端连接到命名空间 `/incidents`,加入房间 `incident:{id}`,并监听 `workflow.event`。 | 组件 | 路径 | |-----------|------| | 事件类型 | `packages/shared/src/events/workflow-events.ts` | | Gateway | `apps/api/src/websocket/incidents.gateway.ts` | | Client hook | `apps/web/hooks/use-workflow-socket.ts` | ## 身份验证 - **生产环境:** 在 `Authorization: Bearer` 头中携带 Firebase ID token;API 使用 Firebase Admin 进行验证,并将 `User` upsert 到 PostgreSQL 中。 - **本地开发(无 Firebase):** Web 使用开发专用的 bearer token;API 在未验证的情况下解码 JWT payload (`apps/web/lib/dev-auth.ts`)。 在客户端配置 Firebase Web 密钥 (`NEXT_PUBLIC_FIREBASE_*`),并在 API 上配置 Admin 凭据 (`FIREBASE_*`)。 ## 前置条件 - **Node.js** 20+(推荐 22) - **npm** 10+ - **PostgreSQL** 14+ - **Redis** 6+ - **Google Gemini API key** (`GEMINI_API_KEY`) — worker 必需 - **Firebase project**(使用 dev-auth 绕过的本地开发可选) ## 本地设置 ### 1. 克隆并安装 ``` git clone https://github.com/AnirudhS3110/Sentinel-AI.git cd sentinel-ai # or your clone directory name npm install ``` ### 2. 配置环境 **API** — 复制并编辑: ``` cp apps/api/.env.example apps/api/.env ``` **Worker** — 使用相同的 `.env` 或一个专用文件,至少需包含: ``` DATABASE_URL=postgresql://user:password@localhost:5432/sentinel REDIS_URL=redis://localhost:6379 GEMINI_API_KEY=your_gemini_api_key ``` **Web** — 创建 `apps/web/.env.local`: ``` NEXT_PUBLIC_API_URL=http://localhost:3000/backend NEXT_PUBLIC_WS_URL=http://localhost:3001 NEXT_PUBLIC_WEB_URL=http://localhost:3000 # 可选:Firebase(省略以使用 dev-auth) NEXT_PUBLIC_FIREBASE_API_KEY= NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN= NEXT_PUBLIC_FIREBASE_PROJECT_ID= NEXT_PUBLIC_FIREBASE_APP_ID= ``` Next.js 开发服务器将 `/backend/*` 代理到 API(`apps/web/next.config.ts`,可通过 `API_PROXY_TARGET` 覆盖)。 ### 3. 数据库 ``` npm run db:generate npm run db:push # quick start # 或 npm run db:migrate # with migrations ``` ### 4. 构建 shared 包 ``` npm run build --workspace=@sentinel/shared ``` ### 5. 运行所有服务(需三个终端) ``` npm run dev:api # http://localhost:3001 npm run dev:worker # BullMQ consumers + Gemini npm run dev:web # http://localhost:3000 ``` ### 6. 验证 ``` curl http://localhost:3001/health # → {"ok":true} ``` 打开 [http://localhost:3000](http://localhost:3000),登录并从仪表板创建一个事件。 ## 环境变量 ### API (`apps/api`) | 变量 | 必需 | 描述 | |----------|----------|-------------| | `DATABASE_URL` | 是 | PostgreSQL 连接字符串 | | `REDIS_URL` | 是 | 用于 BullMQ 和 pub/sub 的 Redis | | `PORT` | 否 | HTTP 端口(默认 `3001`;由 Railway 设置) | | `CORS_ORIGIN` | 生产 | 逗号分隔的允许来源(例如 Vercel URL) | | `FIREBASE_PROJECT_ID` | 生产 | Firebase Admin | | `FIREBASE_CLIENT_EMAIL` | 生产 | Firebase Admin | | `FIREBASE_PRIVATE_KEY` | 生产 | Firebase Admin(在 PEM 中转义 `\n`) | ### Worker (`apps/worker`) | 变量 | 必需 | 描述 | |----------|----------|-------------| | `DATABASE_URL` | 是 | 与 API 相同的数据库 | | `REDIS_URL` | 是 | 与 API 相同的 Redis | | `GEMINI_API_KEY` | 是 | Google AI API key | | `GEMINI_MODEL` | 否 | 默认为 `gemini-2.5-flash-lite` | | `GEMINI_TEMPERATURE` | 否 | 默认为 `0` | | `MAX_VALIDATION_RETRIES` | 否 | 默认为 `3` | ### Web (`apps/web`) | 变量 | 必需 | 描述 | |----------|----------|-------------| | `NEXT_PUBLIC_API_URL` | 是 | REST 基础 URL(本地:`http://localhost:3000/backend`) | | `NEXT_PUBLIC_WS_URL` | 是 | Socket.IO 服务器(本地:`http://localhost:3001`) | | `NEXT_PUBLIC_WEB_URL` | 否 | 公网站点 URL | | `NEXT_PUBLIC_FIREBASE_*` | 生产 | Firebase web SDK 配置 | | `API_PROXY_TARGET` | 否 | Next rewrite 目标(默认为 `http://localhost:3001`) | ## 脚本 | 命令 | 描述 | |---------|-------------| | `npm run dev:web` | 启动 Next.js dev server | | `npm run dev:api` | 以 watch mode 启动 API | | `npm run dev:worker` | 以 watch mode 启动 worker | | `npm run build` | 构建 shared → api → worker | | `npm run db:generate` | 生成 Prisma client | | `npm run db:push` | 将 schema 推送到数据库 | | `npm run db:migrate` 运行 Prisma 迁移 | 各工作区的构建: ``` npm run build --workspace=@sentinel/shared npm run build --workspace=api npm run build --workspace=worker npm run build --workspace=web ``` ## 部署 生产环境需要**三个**部署目标:**Vercel (web)**、**Railway (API)** 和 **一个 worker 进程**(Railway 第二个服务、Render、Fly.io 等)。 ### API (Railway) 有关故障排除(例如“Failed to fetch”),请参阅 [DEPLOYMENT.md](./DEPLOYMENT.md)。 - 服务根目录:**monorepo 根目录** - 构建:`npm ci && npm run build --workspace=@sentinel/shared && npm run build --workspace=api` - 启动:`npm run start:prod --workspace=api` - 健康检查:`GET /health` - 公网 URL:使用 HTTPS,**不带** `:3001`(例如 `https://sentinalai-apiservice.up.railway.app`) ### Worker(独立服务) 与 API 使用相同的 `DATABASE_URL`、`REDIS_URL` 和 `GEMINI_API_KEY`: ``` npm ci npm run build --workspace=@sentinel/shared npm run build --workspace=worker npm run start:prod --workspace=worker ``` ### Web (Vercel) | 变量 | 示例 | |----------|---------| | `NEXT_PUBLIC_WEB_URL` | `https://sentinel-ai-v1.vercel.app` | | `NEXT_PUBLIC_API_URL` | `https://sentinalai-apiservice.up.railway.app` | | `NEXT_PUBLIC_WS_URL` | `https://sentinalai-apiservice.up.railway.app` | | `NEXT_PUBLIC_FIREBASE_*` | 你的 Firebase web app | 更改环境变量后请重新部署。 ## 应用路由 | 路由 | 描述 | |-------|-------------| | `/` | 着陆页 | | `/login` | Firebase 登录 | | `/dashboard` | 指挥中心,实时活动 | | `/incidents/[id]` | 事件详情、agent 网格、时间线 | | `/workflows` | 工作流可视化 | | `/agents` | Agent 集群指标 | | `/reports` | 事件报告 | | `/architecture` | 应用内架构概览 | ## License 除非代码库中另有说明,否则为私有/无特殊许可证。
标签:BurpSuite集成, LLM, NestJS, Unmanaged PE, 搜索引擎查询, 测试用例, 特征库, 自动化攻击, 自动化编排, 运维监控