Skip to content

📌 一、项目概述 ​

Ops Agent 是一个基于 LangGraph 的运维智能体项目,允许用户通过自然语言下达运维任务,由 AI Agent 通过 SSH 自动执行服务器操作。

属性内容
项目名称som-agent
核心定位运维 AI Agent(脚手架/演示项目)
语言/框架Python 3.12+ / FastAPI / LangGraph / SQLAlchemy
许可证MIT
警告级别⚠️ 不建议用于生产环境

🏗️ 二、架构设计 ​

2.1 技术架构图 ​

层级技术职责
1. 表现层HTML/CSS/JS + SSE + WebSocket用户界面、实时交互
2. 网关层FastAPI + uvicorn + Pydantic路由分发、请求验证、认证授权
3. Agent 编排层LangGraph + LangChain任务规划、命令生成、安全分级、审批门
4. LLM 集成层LangChain OpenAI/Anthropic模型调用、超时控制、错误处理
5. 工具层asyncssh + MCP Adapters + LangChain ToolsSSH 执行、云服务调用、任务澄清
6. 数据层SQLAlchemy + PostgreSQL/SQLite + Fernet数据持久化、凭证加密、审计追踪
7. 基础设施层Docker + Python 3.12 + uv容器化部署、环境隔离

核心技术栈:Python 3.12 + LangGraph + LangChain + FastAPI + asyncssh + SQLAlchemy

2.2 应用架构图 ​

┌─────────────────────────────────────────────────────────────────┐
│                        前端 (index.html)                         │
│         单文件 Web 控制台:对话 + 终端 + 配置 + 审计              │
└─────────────────────────────────────────────────────────────────┘
                                  │
                         FastAPI HTTP/WS
                                  │
┌─────────────────────────────────────────────────────────────────┐
│                       API 路由层 (app/api/)                      │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────────┐ │
│  │ auth.py │ │chat.py  │ │admin.py │ │terminal.py│ │deps.py    │ │
│  │ 登录认证 │ │对话/SSE │ │后台配置 │ │交互终端WS │ │ 依赖注入  │ │
│  └─────────┘ └─────────┘ └─────────┘ └─────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────────┘
                                  │
┌─────────────────────────────────────────────────────────────────┐
│                    Agent 核心层 (app/agent/)                     │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐       │
│  │ graph.py  │ │ state.py  │ │guardrails.py│ │runtime.py │     │
│  │ LangGraph │ │ 状态定义   │ │ 命令分级   │ │ 流式运行   │       │
│  │ 主图编排   │ │ Plan+Exec │ │ 三级护栏   │ │ 审批续跑   │       │
│  └───────────┘ └───────────┘ └───────────┘ └───────────┘       │
│  ┌───────────┐                                                  │
│  │prompts.py │  系统提示词                                       │
│  └───────────┘                                                  │
└─────────────────────────────────────────────────────────────────┘
                                  │
┌─────────────────────────────────────────────────────────────────┐
│                      工具层 (app/tools/)                         │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐               │
│  │   ssh.py    │ │mcp_manager.py│ │ clarify.py  │               │
│  │ SSH 执行    │ │ 云 MCP 接入  │ │ 任务澄清    │               │
│  └─────────────┘ └─────────────┘ └─────────────┘               │
└─────────────────────────────────────────────────────────────────┘
                                  │
┌─────────────────────────────────────────────────────────────────┐
│              LLM 层 (app/llm/registry.py)                        │
│    OpenAI / Anthropic / Qwen / MiniMax / DeepSeek 统一封装       │
└─────────────────────────────────────────────────────────────────┘
                                  │
┌─────────────────────────────────────────────────────────────────┐
│                     数据层 (app/db/)                             │
│  ┌─────────┐ ┌─────────┐ ┌─────────────┐                        │
│  │models.py│ │base.py  │ │ crypto.py   │                        │
│  │ ORM模型 │ │SQLAlch. │ │ Fernet加密  │                        │
│  └─────────┘ └─────────┘ └─────────────┘                        │
│                        │                                        │
│                   SQLite / PostgreSQL                            │
└─────────────────────────────────────────────────────────────────┘

2.3 Agent 执行流程(LangGraph 图) ​

START 
  │
  ▼
┌─────────┐  tool_calls?  ┌───────────┐ 审批通过/只读  ┌──────────────┐
│  Agent  │──────────────▶│ Guardrail │───────────────▶│execute_tools │
│  (LLM)  │               │  (护栏)   │               │  (执行工具)  │
└─────────┘               └───────────┘               └──────────────┘
     ▲                         │                            │
     │                         │ 危险命令 → interrupt()      │
     │                         │ 等用户审批                   │
     │                         ▼                            │
     │                   ┌───────────┐                      │
     └───────────────────┤   END     │◀─────────────────────┘
                         └───────────┘

📁 三、模块详解 ​

3.1 Agent 编排 (app/agent/) ​

文件职责关键实现
graph.pyLangGraph 主图编排START → agent → guardrail → execute_tools → END 循环;60秒 LLM 超时保护;错误分类处理(余额不足/认证失败/404)
state.py状态定义AgentState TypedDict:messages, plan, current_step, dry_run, notes, approved_ids, auto_approve_all, last_io
guardrails.py命令分级护栏三级分类(readonly/mutating/dangerous);正则规则 + LLM 辅助判断;白名单持久化
runtime.pyAgent 运行时SSE 流式输出;astream_turn/astream_resume/astream_clarify;全局 MemorySaver checkpointer
prompts.py系统提示词角色定位:SRE/运维工程师;工作原则;工具说明

3.2 命令分级护栏详解 ​

python
# guardrails.py 中的危险命令正则模式
_DANGEROUS = [
    r"\brm\s+-[a-z]*[rf]",          # rm -rf
    r"\bmkfs\b", r"\bdd\b",
    r"\b(shutdown|reboot|halt|poweroff)\b",
    r"\b(drop|truncate)\s+(table|database)\b",
    r":\s*\(\)\s*\{",               # fork 炸弹
    ...
]

# LLM 辅助判断(用于 SSH 命令)
async def classify_command_llm(command: str, model) -> CommandLevel:
    # 使用 LLM 判断命令风险级别,失败时回退到正则规则

3.3 数据库模型 (app/db/models.py) ​

模型用途加密字段
ModelProviderLLM 供应商配置api_key_enc
SSHKey可复用 SSH 私钥库private_key_enc, passphrase_enc
Server服务器 SSH 连接配置password_enc, private_key_enc, passphrase_enc
CloudAccount云账号 MCP 配置secrets_enc
Conversation会话记录-
Message消息历史-
AutoApproveRule自动审批白名单-
AuditLog审计日志-

3.4 API 路由 (app/api/) ​

路由方法功能
/auth/loginPOST登录认证
/auth/logoutPOST登出
/chat/streamPOST发起任务(SSE 流式)
/chat/approvePOST审批续跑
/chat/clarifyPOST澄清回答
/chat/conversationsGET/DELETE会话管理
/chat/terminal/*WS/POST/DELETE交互式终端
/admin/modelsCRUD模型配置
/admin/serversCRUD服务器配置
/admin/ssh-keysCRUDSSH 密钥库
/admin/cloud-accountsCRUD云账号配置
/admin/auditsGET审计日志

3.5 交互式终端 (app/api/terminal.py) ​

  • 基于 WebSocket 的持久会话
  • PTY Shell 保持常驻(刷新不丢失)
  • 回放缓冲区(256KB)支持历史输出恢复
  • 30分钟空闲超时自动回收

🔐 四、安全设计 ​

4.1 凭证加密 ​

python
# db/crypto.py
Fernet 对称加密(主密钥来自 SECRET_ENCRYPTION_KEY)
- SSH 私钥/密码
- 云账号密钥
- 登录会话令牌(带 TTL)

4.2 认证机制 ​

  • 单用户登录(用户名密码来自 .env)
  • Cookie + Fernet 签名验证
  • WebSocket 端点同步校验 Cookie

4.3 Human-in-the-loop ​

  • 危险命令强制 interrupt() 暂停
  • 变更命令需逐条审批
  • 支持"本会话所有命令无需确认"开关

4.4 安全风险(README 明确警告) ​

风险项现状建议
鉴权单用户,不支持多用户隔离生产环境需 RBAC
SSH 主机指纹known_hosts=None应配置 known_hosts
密钥托管本地 Fernet 主密钥建议用 KMS/Vault
Checkpointer内存版 MemorySaver生产换 PostgresSaver

⚙️ 五、配置项 ​

bash
# 必填
SECRET_ENCRYPTION_KEY    # Fernet 主密钥
AUTH_USERNAME            # 登录用户名
AUTH_PASSWORD            # 登录密码(留空则不启认证)

# 可选
DATABASE_URL             # 数据库路径(默认 SQLite)
CHECKPOINT_DB_URL        # LangGraph checkpointer
REQUIRE_APPROVAL_FOR_DANGEROUS   # 危险命令是否强制审批
REQUIRE_COMMAND_APPROVAL         # 是否逐条审批
DEFAULT_DRY_RUN          # 默认只展示不执行
APP_HOST / APP_PORT      # 监听地址/端口

📦 六、依赖分析 ​

核心依赖:
├── langgraph==1.2.2           # Agent 编排框架
├── langchain-core>=0.3.0      # LangChain 核心
├── langchain-openai>=0.2.0    # OpenAI/Qwen/MiniMax/DeepSeek
├── langchain-anthropic>=0.3.0 # Anthropic
├── langchain-mcp-adapters>=0.1.0  # MCP 云资源接入
├── asyncssh>=2.14.0           # SSH 异步连接
├── fastapi>=0.115.0           # Web 框架
├── sqlalchemy>=2.0.0          # ORM
├── cryptography>=43.0.0       # Fernet 加密
└── pydantic>=2.8.0            # 数据验证

✅ 七、项目亮点 ​

  1. Human-in-the-loop 设计:基于 LangGraph interrupt() 实现审批门,审批前任务自动挂起
  2. 命令分级护栏:正则 + LLM 双层判断,危险命令强制人工审批
  3. 流式输出:SSE 实现实时流式响应,前端体验流畅
  4. 交互式终端:WebSocket + PTY Shell,刷新不丢会话
  5. 凭证安全:Fernet 加密所有敏感信息落库
  6. 全量审计:每次命令执行都有记录可追溯
  7. 多模型支持:OpenAI 兼容协议统一封装,切换灵活

⚠️ 八、待改进项(生产化 TODO) ​

类别改进项
安全硬化checkpointer 换 PostgresSaver
正式鉴权 / RBAC / 多用户隔离
SSH known_hosts 主机指纹校验
密钥改用 KMS / Vault 托管
能力扩展云资源管理(ECS/OSS/安全组)
监控管理(Prometheus/Zabbix)
网络设备管理(交换机/路由器/防火墙)

📊 九、代码质量评估 ​

维度评分说明
架构设计⭐⭐⭐⭐⭐模块化清晰,分层合理
代码规范⭐⭐⭐⭐使用 ruff,风格统一
文档完整性⭐⭐⭐⭐⭐README 详细,代码注释充足
错误处理⭐⭐⭐⭐有超时保护和异常分类
安全性⭐⭐⭐演示项目,生产需加固
可维护性⭐⭐⭐⭐代码简洁,依赖清晰

以上就是对 Ops Agent 项目的完整分析。该项目是一个设计良好的运维 AI Agent 演示脚手架,核心功能完整,但在生产环境使用前需要进行安全加固。

Released under the MIT License.