xuw/iiis-oncall-agent

GitHub: xuw/iiis-oncall-agent

基于 Claude 大模型的 AI 驱动基础设施事件响应系统,自动诊断和修复 Kubernetes 集群及 AI 服务故障。

Stars: 0 | Forks: 0

# IIIS OnCall Agent 面向清华大学(IIIS,交叉信息研究院)的 AI 驱动的基础设施事件响应系统。 ## 概述 IIIS OnCall Agent 是一个自动化的事件响应系统,通过 AI agent 处理基础设施工单。用户通过 Web 界面(带有 SSO 认证)提交工单,agent 会自动连接到 Kubernetes 集群、检查服务、分析日志并尝试修复,从而诊断问题。 ### 主要特性 - **SSO 认证**:通过 Keycloak PKCE 流程进行安全用户登录 - **智能队列管理**:自动进行工单排队与位置追踪 - **重复检测**:基于 Claude 的语义分析以识别重复工单 - **实时诊断**:通过 Server-Sent Events (SSE) 流提供实时的 agent 更新 - **邮件通知**:在工单生命周期内发送确认和结果邮件 - **管理员仪表盘**:全面展示所有工单、统计信息和事件日志的综合视图 - **自动化诊断与修复**:配备 20 多种诊断和修复工具的 AI agent ## 系统架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ User (Browser) │ │ https://p0.ai.iiis.co:9445 │ └────────────────────┬────────────────────────────────────────┘ │ HTTPS/SSE │ ┌────────────────────▼────────────────────────────────────────┐ │ FastAPI Application │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Web UI (static/) │ │ │ │ - index.html: Ticket submission │ │ │ │ - admin.html: Admin dashboard │ │ │ │ - callback.html: OAuth PKCE redirect │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ API Layer (app.py) │ │ │ │ - Keycloak JWT verification │ │ │ │ - Ticket CRUD + SSE streaming │ │ │ │ - Admin endpoints │ │ │ └──────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Agent Worker (agent.py) │ │ │ │ - asyncio.Queue for ticket processing │ │ │ │ - Claude Sonnet 4 with tool use │ │ │ │ - Max 3 repair attempts per ticket │ │ │ └────────────┬─────────────────────────────────────────┘ │ │ │ │ │ ┌────────────▼─────────────────────────────────────────┐ │ │ │ Tools (tools.py) │ │ │ │ - check_litellm_health() │ │ │ │ - check_k8s_pods() │ │ │ │ - restart_proxy_service() │ │ │ │ - test_model_call() │ │ │ │ - 20+ diagnostic/repair functions │ │ │ └────────────┬─────────────────────────────────────────┘ │ │ │ │ │ ┌────────────▼─────────────────────────────────────────┐ │ │ │ SSH Manager (ssh_manager.py) │ │ │ │ - kubectl via local tunnel │ │ │ │ - Direct SSH to AWS proxy │ │ │ └────────────┬─────────────────────────────────────────┘ │ └───────────────┼──────────────────────────────────────────┘ │ │ kubectl (via autossh tunnel) │ ┌───────────────▼──────────────────────────────────────────┐ │ IIIS Kubernetes Cluster (iiis) │ │ - Namespace: weixu │ │ - LiteLLM Router (Deployment: litellm) │ │ - Harbor Registry (harbor.ai.iiis.co:9443) │ └───────────────────────────────────────────────────────────┘ ┌───────────────────────────────────────────────────────────┐ │ AWS Japan Proxy (p0.ai.iiis.co) │ │ - Anthropic Proxy: port 9443 (api-proxy.service) │ │ - Codex/GPT Proxy: port 9444 (codex-proxy.service) │ └───────────────────────────────────────────────────────────┘ ``` ## 快速开始 ### 前置条件 - Python 3.11+ - 拥有 IIIS Kubernetes 集群的访问权限(`~/.kube/config` 中包含 `weixu-k8s.iiis` context) - 拥有 AWS 代理服务器(`p0.ai.iiis.co`)的 SSH 访问权限 - Keycloak SSO 凭证 - SSL 证书(`/etc/letsencrypt/live/p0.ai.iiis.co/`) ### 安装说明 1. **克隆仓库**: git clone https://github.com/xuw/iiis-oncall-agent.git cd iiis-oncall-agent 2. **创建虚拟环境**: python3 -m venv venv source venv/bin/activate 3. **安装依赖**: pip install -r requirements.txt 4. **配置环境**: cp .env.example .env # 使用你的凭证编辑 .env 文件 5. **初始化数据库**: python -c "import asyncio; from database import init_db; asyncio.run(init_db())" 6. **本地运行(开发环境)**: python app.py # 访问地址: https://localhost:9445 ### 生产部署 1. **部署到服务器**: ./deploy.sh 2. **启用 systemd 服务**: sudo cp oncall-agent.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable oncall-agent sudo systemctl start oncall-agent 3. **启用 K8s API 隧道**: sudo cp autossh-k8s-tunnel.service /etc/systemd/system/ sudo systemctl enable autossh-k8s-tunnel sudo systemctl start autossh-k8s-tunnel 4. **验证部署**: ./acceptance_test.sh ## 配置说明 ### 环境变量 (`.env`) ``` # Anthropic API (用于 agent Claude 模型) ANTHROPIC_API_KEY=sk-ant-... ANTHROPIC_BASE_URL=https://p0.ai.iiis.co:9443 # LiteLLM Router (用于基础设施查询) LITELLM_MASTER_KEY=sk-... LITELLM_PROXY_URL=https://router.ai.iiis.co:9443 # 认证 AUTH_PASSWORD=your-admin-password KEYCLOAK_ISSUER=https://sso.iiis.co:9443/realms/iiis KEYCLOAK_CLIENT_ID=litellm # SSH 配置 SSH_KEY_PATH=/home/ec2-user/.ssh/iiis_ai SSH_JUMP_HOST=ailab@js.ai.iiis.co SSH_JUMP_PORT=9022 # 电子邮件 (SMTP) SMTP_HOST=smtp.example.com SMTP_PORT=587 SMTP_USER=oncall@iiis.edu.cn SMTP_PASS=password SMTP_FROM=oncall@iiis.edu.cn ADMIN_EMAIL=admin@iiis.edu.cn # Agent 约束 MAX_ITERATIONS=100 MAX_TICKETS_PER_MINUTE=5 MAX_AGENT_RUNS_PER_HOUR=20 TOOL_TIMEOUT=30 TICKET_TIMEOUT=300 # 数据库 DB_PATH=oncall.db ``` ## API 参考 ### 身份验证 所有端点都需要通过以下方式进行身份验证: - **Keycloak JWT**:`Authorization: Bearer ` - **管理员会话**(回退机制):`Authorization: Bearer ` ### 端点 #### `POST /api/tickets` 创建新工单。在排队前会执行重复检测。 **请求**: ``` { "category": "litellm|model_error|cluster|deployment|other", "title": "LiteLLM 502 gateway error", "description": "Detailed problem description", "user_email": "user@iiis.edu.cn" } ``` **响应**: ``` { "id": 123, "category": "litellm", "title": "LiteLLM 502 gateway error", "status": "open", "queue_position": 2, "queue_total": 5, "created_at": "2025-03-31T12:00:00", ... } ``` #### `GET /api/tickets/{ticket_id}/stream` 用于实时 agent 诊断的 Server-Sent Events 流。 **事件**: - `history`:客户端连接时的历史事件 - `status`:工单状态已更改 - `tool_call`:Agent 正在调用诊断工具 - `tool_result`:工具执行结果 - `thinking`:Agent 推理输出 - `done`:Agent 已完成(已解决/已升级) **示例**: ``` const eventSource = new EventSource('/api/tickets/123/stream'); eventSource.onmessage = (e) => { const msg = JSON.parse(e.data); if (msg.type === 'tool_call') { console.log(`Tool: ${msg.data.tool}`); } }; ``` #### `GET /api/my/tickets` 获取当前用户的工单历史。 **查询参数**: - `limit` (默认: 50) - `offset` (默认: 0) #### `GET /api/my/tickets/{ticket_id}` 获取工单的详细视图(仅限所有者或管理员)。 **响应**: ``` { "ticket": { /* TicketResponse */ }, "events": [ { "id": 1, "actor": "agent", "type": "diagnosis", "content": "检查 LiteLLM health...", "created_at": "2025-03-31T12:01:00" } ] } ``` #### `GET /api/admin/tickets` (仅限管理员) 列出所有工单,支持可选的状态过滤。 **查询参数**: - `status`:`open|investigating|resolved|escalated|duplicate` - `limit`,`offset` #### `GET /api/admin/stats` (仅限管理员) 获取系统统计信息。 **响应**: ``` { "total_tickets": 156, "resolved_count": 98, "escalated_count": 12, "avg_resolution_time_minutes": 3.5, "categories": { "litellm": 45, "model_error": 32, "cluster": 19 } } ``` #### `GET /api/sso/config` 获取用于前端 PKCE 流程的 SSO 配置。 #### `POST /api/login` (回退机制) 使用密码的传统管理员登录方式。 ## Agent 工具 Agent 可以访问 20 多种用于诊断和修复的工具: ### 诊断工具 (只读) - `check_litellm_health`:LiteLLM 路由的健康检查 - `check_litellm_models`:列出可用模型 - `test_model_call`:测试模型 API 调用 - `check_proxy_health`:检查 AWS 代理服务 - `check_proxy_logs`:检索代理服务日志 - `check_proxy_token_status`:检查 Codex token 池状态 - `check_proxy_cert`:验证 SSL 证书有效性 - `check_k8s_pods`:列出 namespace 中的 pod - `check_k8s_pod_logs`:获取 pod 日志 - `describe_k8s_pod`:详细的 pod 信息 - `check_k8s_nodes`:列出集群节点 - `check_gpu_status`:GPU 分配信息 - `run_kubectl_readonly`:执行只读 kubectl 命令 ### 修复工具 (自动修复) - `restart_proxy_service`:重启 AWS 代理服务 (api-proxy/codex-proxy) - `restart_litellm`:滚动重启 LiteLLM deployment - `restart_model_pod`:重启特定的模型服务器 pod **安全限制**: - 每个工单最多执行 3 次修复操作 - namespace 限制:`weixu`、`gpu-operator`、`kube-system` - 服务名称验证 ## 测试说明 ### 运行测试 ``` # 所有测试 pytest # 带覆盖率 pytest --cov=. --cov-report=html # 特定测试文件 pytest tests/test_database.py -v ``` ### 测试结构 ``` tests/ ├── conftest.py # Fixtures (test DB, mock auth) ├── test_database.py # DB operations ├── test_models.py # Pydantic model validation └── test_api.py # API endpoints (mocked agent) ``` ### 部署前检查 ``` ./pre_deploy_check.sh ``` ## 开发指南 ### 项目结构 ``` . ├── app.py # FastAPI application ├── agent.py # AI agent logic ├── tools.py # Agent tool definitions ├── database.py # SQLite async operations ├── models.py # Pydantic models ├── config.py # Configuration settings ├── ssh_manager.py # SSH/kubectl wrapper ├── static/ # Frontend HTML/JS │ ├── index.html # User ticket form │ ├── admin.html # Admin dashboard │ └── callback.html # OAuth callback ├── tests/ # Test suite ├── requirements.txt # Python dependencies ├── .env.example # Environment template ├── deploy.sh # Deployment script ├── oncall-agent.service # systemd service └── autossh-k8s-tunnel.service # K8s API tunnel ``` ### 添加新工具 1. 在 `tools.py` 中定义工具: async def my_diagnostic_tool(param: str) -> dict: """工具文档字符串 (展示给 agent)""" # 实现 return {"status": "ok", "result": ...} 2. 添加到 `TOOL_DEFINITIONS`: { "name": "my_diagnostic_tool", "description": "此工具的功能描述", "input_schema": { "type": "object", "properties": { "param": {"type": "string", "description": "..."} }, "required": ["param"] } } 3. 在 `execute_tool()` 调度器中注册 ### 扩展 Agent 系统提示词 编辑 `agent.py` 中的 `SYSTEM_PROMPT` 以添加新的操作手册或基础设施上下文。 ## 运维维护 ### 日志 ``` # 服务日志 sudo journalctl -u oncall-agent -f # K8s 隧道日志 sudo journalctl -u autossh-k8s-tunnel -f # 应用日志 (如果直接运行) tail -f oncall.log ``` ### 数据库 ``` # 备份 cp oncall.db oncall.db.backup # 检查 sqlite3 oncall.db > SELECT * FROM tickets ORDER BY created_at DESC LIMIT 10; ``` ### SSL 证书续期 证书由 K8s 中的 cert-manager 管理。如需更新 AWS 代理: ``` # 在 AWS 服务器上 kubectl get secret p0-ai-iiis-co-tls -n weixu -o jsonpath='{.data.tls\.crt}' | base64 -d > /etc/letsencrypt/live/p0.ai.iiis.co/fullchain.pem kubectl get secret p0-ai-iiis-co-tls -n weixu -o jsonpath='{.data.tls\.key}' | base64 -d > /etc/letsencrypt/live/p0.ai.iiis.co/privkey.pem sudo systemctl restart api-proxy codex-proxy oncall-agent ``` ## 开源许可证 MIT License - 详情请见 [LICENSE](LICENSE) 文件。 ## 技术支持 如有问题或疑问,请联系: - **GitHub Issues**:https://github.com/xuw/iiis-oncall-agent/issues - **管理员邮箱**:admin@iiis.edu.cn - **内部文档**:请参阅 `DESIGN.md` 了解架构详情
标签:AIOps, AI智能体, AV绕过, Claude, CVE检测, DLL 劫持, FastAPI, Keycloak, LLM, Python, Server-Sent Events, SSE, SSO单点登录, Syscall, Unmanaged PE, Web开发, 交叉信息研究院, 人工智能, 内存分配, 基础设施运维, 大语言模型, 子域名突变, 工单系统, 排队系统, 无后门, 智能运维, 清华大学, 用户模式Hook绕过, 管理后台, 网络研究, 自动修复, 自动化诊断, 运维自动化, 逆向工具, 邮件通知, 重复检测