一、痛点:为什么 SaaS 系统需要 AI 对话入口?
传统 B/S 系统的交互模式是"菜单 → 表单 → 按钮"。当系统功能越来越多,用户面临的问题也越来越明显:
- 操作路径深:查一个报表要点 5 层菜单
- 学习成本高:新员工需要培训才能上手
- 跨模块操作繁琐:一个业务流程涉及多个页面来回切换
- 运维排查低效:出了问题要登录服务器、翻日志、查指标,步骤多且门槛高
如果系统能像 ChatGPT 一样,用户输入一句话就能完成操作呢?
用户:"帮我查一下今天所有异常订单"
AI:正在查询… 今天共有 3 笔异常订单:
| 订单号 | 客户 | 异常原因 |
| ORD-001 | 张三 | 支付超时 |
| ORD-002 | 李四 | 库存不足 |
| ORD-003 | 王五 | 地址无效 |
建议:ORD-001 可自动重试支付,ORD-002 需要补货后重新发起。
这就是 AI Gateway 要解决的问题。
二、核心思路:AI 网关 + 配置驱动 + 零侵入
整体方案的核心是在现有系统和大模型之间架设一个通用 AI 网关,它不修改任何子系统代码,而是通过 YAML 配置文件将子系统的 API"翻译"成大模型能理解的 Tool。
设计原则
| 零侵入 | 子系统不改一行代码,网关侧通过配置适配 |
| 配置驱动 | 每个子系统一组 YAML,新系统接入只加配置 |
| 独立部署 | 网关作为独立微服务,技术栈不受子系统限制 |
| 双执行器 | 业务操作走 HTTP 代理,运维操作走 Agent/SSH |
| 安全可控 | 危险操作二次确认、运维命令白名单、审批流程、审计日志 |
一句话总结
用户说一句话 → 大模型理解意图 → 自动调用子系统 API 或执行运维命令 → 把结果用人话说回来。
三、整体架构
3.1 系统架构图
#mermaid-svg-YLF8omtylXn5InJG{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YLF8omtylXn5InJG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YLF8omtylXn5InJG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YLF8omtylXn5InJG .error-icon{fill:#552222;}#mermaid-svg-YLF8omtylXn5InJG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YLF8omtylXn5InJG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YLF8omtylXn5InJG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YLF8omtylXn5InJG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YLF8omtylXn5InJG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YLF8omtylXn5InJG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YLF8omtylXn5InJG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YLF8omtylXn5InJG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YLF8omtylXn5InJG .marker.cross{stroke:#333333;}#mermaid-svg-YLF8omtylXn5InJG svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YLF8omtylXn5InJG p{margin:0;}#mermaid-svg-YLF8omtylXn5InJG .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-YLF8omtylXn5InJG .cluster-label text{fill:#333;}#mermaid-svg-YLF8omtylXn5InJG .cluster-label span{color:#333;}#mermaid-svg-YLF8omtylXn5InJG .cluster-label span p{background-color:transparent;}#mermaid-svg-YLF8omtylXn5InJG .label text,#mermaid-svg-YLF8omtylXn5InJG span{fill:#333;color:#333;}#mermaid-svg-YLF8omtylXn5InJG .node rect,#mermaid-svg-YLF8omtylXn5InJG .node circle,#mermaid-svg-YLF8omtylXn5InJG .node ellipse,#mermaid-svg-YLF8omtylXn5InJG .node polygon,#mermaid-svg-YLF8omtylXn5InJG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YLF8omtylXn5InJG .rough-node .label text,#mermaid-svg-YLF8omtylXn5InJG .node .label text,#mermaid-svg-YLF8omtylXn5InJG .image-shape .label,#mermaid-svg-YLF8omtylXn5InJG .icon-shape .label{text-anchor:middle;}#mermaid-svg-YLF8omtylXn5InJG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YLF8omtylXn5InJG .rough-node .label,#mermaid-svg-YLF8omtylXn5InJG .node .label,#mermaid-svg-YLF8omtylXn5InJG .image-shape .label,#mermaid-svg-YLF8omtylXn5InJG .icon-shape .label{text-align:center;}#mermaid-svg-YLF8omtylXn5InJG .node.clickable{cursor:pointer;}#mermaid-svg-YLF8omtylXn5InJG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YLF8omtylXn5InJG .arrowheadPath{fill:#333333;}#mermaid-svg-YLF8omtylXn5InJG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YLF8omtylXn5InJG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YLF8omtylXn5InJG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YLF8omtylXn5InJG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YLF8omtylXn5InJG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YLF8omtylXn5InJG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YLF8omtylXn5InJG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YLF8omtylXn5InJG .cluster text{fill:#333;}#mermaid-svg-YLF8omtylXn5InJG .cluster span{color:#333;}#mermaid-svg-YLF8omtylXn5InJG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YLF8omtylXn5InJG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YLF8omtylXn5InJG rect.text{fill:none;stroke-width:0;}#mermaid-svg-YLF8omtylXn5InJG .icon-shape,#mermaid-svg-YLF8omtylXn5InJG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YLF8omtylXn5InJG .icon-shape p,#mermaid-svg-YLF8omtylXn5InJG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YLF8omtylXn5InJG .icon-shape rect,#mermaid-svg-YLF8omtylXn5InJG .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YLF8omtylXn5InJG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YLF8omtylXn5InJG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YLF8omtylXn5InJG :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
基础设施
服务器层
子系统层(零改动)
执行层(双执行器)
AI 层
网关层
前端层
自然语言 + Token
Tool Call
透传 Token
透传 Token
透传 Token
启动加载
SaaS 系统 Web 页面
AI 对话窗口组件
Nginx / API Gateway\\n负载均衡 + 路由
AI Gateway 通用网关\\n(独立微服务)
大模型服务\\nGPT-4 / Qwen / DeepSeek\\n(云端或本地私有化)
HttpProxyExecutor\\n业务 Tool → HTTP 代理
OpsExecutor\\n运维 Tool → Agent / SSH
子系统 A\\n如:订单管理
子系统 B\\n如:库存管理
子系统 C\\n如:客户管理
Agent\\n应用服务器
Agent\\n数据库服务器
注册中心
数据库\\n会话 / 审计
Tool YAML 配置
3.2 网关内部结构
AI Gateway 网关内部分为四个核心模块:
#mermaid-svg-JrP3j4I6L9dF3Ylq{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JrP3j4I6L9dF3Ylq .error-icon{fill:#552222;}#mermaid-svg-JrP3j4I6L9dF3Ylq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JrP3j4I6L9dF3Ylq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .marker.cross{stroke:#333333;}#mermaid-svg-JrP3j4I6L9dF3Ylq svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JrP3j4I6L9dF3Ylq p{margin:0;}#mermaid-svg-JrP3j4I6L9dF3Ylq .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .cluster-label text{fill:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .cluster-label span{color:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .cluster-label span p{background-color:transparent;}#mermaid-svg-JrP3j4I6L9dF3Ylq .label text,#mermaid-svg-JrP3j4I6L9dF3Ylq span{fill:#333;color:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .node rect,#mermaid-svg-JrP3j4I6L9dF3Ylq .node circle,#mermaid-svg-JrP3j4I6L9dF3Ylq .node ellipse,#mermaid-svg-JrP3j4I6L9dF3Ylq .node polygon,#mermaid-svg-JrP3j4I6L9dF3Ylq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .rough-node .label text,#mermaid-svg-JrP3j4I6L9dF3Ylq .node .label text,#mermaid-svg-JrP3j4I6L9dF3Ylq .image-shape .label,#mermaid-svg-JrP3j4I6L9dF3Ylq .icon-shape .label{text-anchor:middle;}#mermaid-svg-JrP3j4I6L9dF3Ylq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .rough-node .label,#mermaid-svg-JrP3j4I6L9dF3Ylq .node .label,#mermaid-svg-JrP3j4I6L9dF3Ylq .image-shape .label,#mermaid-svg-JrP3j4I6L9dF3Ylq .icon-shape .label{text-align:center;}#mermaid-svg-JrP3j4I6L9dF3Ylq .node.clickable{cursor:pointer;}#mermaid-svg-JrP3j4I6L9dF3Ylq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .arrowheadPath{fill:#333333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JrP3j4I6L9dF3Ylq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JrP3j4I6L9dF3Ylq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JrP3j4I6L9dF3Ylq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JrP3j4I6L9dF3Ylq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .cluster text{fill:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq .cluster span{color:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JrP3j4I6L9dF3Ylq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JrP3j4I6L9dF3Ylq rect.text{fill:none;stroke-width:0;}#mermaid-svg-JrP3j4I6L9dF3Ylq .icon-shape,#mermaid-svg-JrP3j4I6L9dF3Ylq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JrP3j4I6L9dF3Ylq .icon-shape p,#mermaid-svg-JrP3j4I6L9dF3Ylq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JrP3j4I6L9dF3Ylq .icon-shape rect,#mermaid-svg-JrP3j4I6L9dF3Ylq .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JrP3j4I6L9dF3Ylq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JrP3j4I6L9dF3Ylq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JrP3j4I6L9dF3Ylq :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
AI Gateway 通用网关
Tool 执行(双执行器)
核心处理
executor: http
executor: ops
Tool Call
Tool 注册中心\\nYAML 配置驱动
动态 Prompt 构建器\\n通用模板 + 子系统领域知识
大模型调用\\n意图识别 + Tool Calling
执行器路由
HttpProxyExecutor\\n业务操作
OpsExecutor\\n运维操作
SSE 接入层\\n提取 Token / 解析 system_id
会话管理 + 审计日志
关键设计点:
- 动态 Prompt:每个子系统有自己的领域知识(如业务术语、状态码含义),网关根据 system_id 动态拼装 Prompt,让大模型"懂"这个子系统
- Tool 注册中心:启动时扫描 YAML 目录,自动构建 Tool 列表,支持热加载
- 双执行器:业务 Tool 走 HTTP 代理调用子系统 API,运维 Tool 走 Agent/SSH 在服务器上执行命令
四、配置驱动:YAML 定义一切
这是整个方案最核心的设计——用 YAML 配置文件代替代码开发。
4.1 配置目录结构
tools/
├── order-system/ # 子系统:订单管理
│ ├── _system.yaml # 子系统元信息 + 领域知识
│ ├── query_order.yaml # 业务 Tool: 查询订单
│ ├── cancel_order.yaml # 业务 Tool: 取消订单
│ ├── ops_check_disk.yaml # 运维 Tool: 检查磁盘
│ └── ops_view_log.yaml # 运维 Tool: 查看日志
├── inventory-system/ # 子系统:库存管理
│ ├── _system.yaml
│ └── …
└── crm-system/ # 子系统:客户管理
├── _system.yaml
└── …
4.2 子系统元信息(_system.yaml)
system_id: order–system
display_name: 订单管理系统
service_name: order–service # 注册中心的服务名
domain_knowledge: |
## 业务知识
– 订单状态:0=待支付, 1=已支付, 2=已发货, 3=已完成, 4=已取消, 5=异常
– 支付方式:alipay=支付宝, wechat=微信, bank=银行卡
– 异常订单指状态为 5 的订单,需要人工介入处理
assistant_role: |
你是订单管理系统的 AI 助手,可以帮用户查询订单、处理异常、分析销售数据。
# 运维功能:服务器信息
servers:
– id: order–app–01
host: 192.168.1.101
agent_port: 9090
services:
– name: order–service
type: spring–boot
log_path: /opt/order–service/logs/
4.3 业务 Tool 定义
name: query_order
display_name: 查询订单
description: "查询订单列表,支持按状态、时间范围、客户筛选"
category: 订单管理
risk_level: low
requires_confirmation: false
executor: http # 业务 Tool
parameters:
type: object
properties:
status:
type: integer
description: "订单状态:0=待支付, 1=已支付, 2=已发货, 3=已完成, 4=已取消, 5=异常"
start_date:
type: string
description: "开始日期,格式 yyyy-MM-dd"
end_date:
type: string
description: "结束日期,格式 yyyy-MM-dd"
api:
method: POST
path: /order/list
request_mapping:
body:
orderStatus: "${status}"
startDate: "${start_date}"
endDate: "${end_date}"
response_mapping:
data_path: "$.data.records"
4.4 运维 Tool 定义
name: check_disk_space
display_name: 检查磁盘空间
description: "检查服务器磁盘使用情况"
category: 系统监控
risk_level: low
requires_confirmation: false
executor: ops # 运维 Tool
parameters:
type: object
properties:
server_id:
type: string
description: "目标服务器 ID"
ops:
command_template: "df -h"
timeout_seconds: 10
output_parser:
type: table
columns: ["filesystem", "size", "used", "avail", "use_percent", "mount"]
新子系统接入只需 3 步:建目录 → 写 _system.yaml → 为每个 API 写一个 Tool YAML。不改网关代码,不改子系统代码。
五、交互流程
5.1 业务操作时序
子系统 API大模型AI Gateway 网关API Gateway对话窗口用户子系统 API大模型AI Gateway 网关API Gateway对话窗口用户#mermaid-svg-P9j6uKPGcytaZ8rO{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-P9j6uKPGcytaZ8rO .error-icon{fill:#552222;}#mermaid-svg-P9j6uKPGcytaZ8rO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-P9j6uKPGcytaZ8rO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-P9j6uKPGcytaZ8rO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-P9j6uKPGcytaZ8rO .marker.cross{stroke:#333333;}#mermaid-svg-P9j6uKPGcytaZ8rO svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-P9j6uKPGcytaZ8rO p{margin:0;}#mermaid-svg-P9j6uKPGcytaZ8rO .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-P9j6uKPGcytaZ8rO text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-P9j6uKPGcytaZ8rO .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-P9j6uKPGcytaZ8rO .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-P9j6uKPGcytaZ8rO #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-P9j6uKPGcytaZ8rO .sequenceNumber{fill:white;}#mermaid-svg-P9j6uKPGcytaZ8rO #sequencenumber{fill:#333;}#mermaid-svg-P9j6uKPGcytaZ8rO #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-P9j6uKPGcytaZ8rO .messageText{fill:#333;stroke:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-P9j6uKPGcytaZ8rO .labelText,#mermaid-svg-P9j6uKPGcytaZ8rO .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .loopText,#mermaid-svg-P9j6uKPGcytaZ8rO .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-P9j6uKPGcytaZ8rO .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-P9j6uKPGcytaZ8rO .noteText,#mermaid-svg-P9j6uKPGcytaZ8rO .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-P9j6uKPGcytaZ8rO .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-P9j6uKPGcytaZ8rO .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-P9j6uKPGcytaZ8rO .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-P9j6uKPGcytaZ8rO .actorPopupMenu{position:absolute;}#mermaid-svg-P9j6uKPGcytaZ8rO .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-P9j6uKPGcytaZ8rO .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-P9j6uKPGcytaZ8rO .actor-man circle,#mermaid-svg-P9j6uKPGcytaZ8rO line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-P9j6uKPGcytaZ8rO :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}"帮我查一下今天的异常订单"POST /api/os-ai-gateway/chat/stream(Token + system_id + message)路由到 AI Gateway[SSE] event: thinkingSystem Prompt(含订单领域知识)+ Tools 定义 + 用户消息Tool Call: query_order(status=5, start_date=today)[SSE] event: tool_call"正在查询异常订单…"HTTP 代理: POST /api/order-service/order/list(透传 Token)路由到 order-service返回订单数据[SSE] event: tool_result将查询结果发给大模型生成自然语言回复[SSE] event: message_delta"今天共有 3 笔异常订单…"[SSE] event: done展示完整结果
5.2 危险操作二次确认
对于写操作(如取消订单、重启服务),通过 YAML 中的 requires_confirmation: true 触发前端确认弹窗:
子系统 API大模型AI Gateway 网关对话窗口用户子系统 API大模型AI Gateway 网关对话窗口用户#mermaid-svg-ObM3GKOXZCW8Dbs2{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .error-icon{fill:#552222;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .marker.cross{stroke:#333333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ObM3GKOXZCW8Dbs2 p{margin:0;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ObM3GKOXZCW8Dbs2 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ObM3GKOXZCW8Dbs2 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .sequenceNumber{fill:white;}#mermaid-svg-ObM3GKOXZCW8Dbs2 #sequencenumber{fill:#333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .messageText{fill:#333;stroke:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .labelText,#mermaid-svg-ObM3GKOXZCW8Dbs2 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .loopText,#mermaid-svg-ObM3GKOXZCW8Dbs2 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ObM3GKOXZCW8Dbs2 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .noteText,#mermaid-svg-ObM3GKOXZCW8Dbs2 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .actorPopupMenu{position:absolute;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-ObM3GKOXZCW8Dbs2 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ObM3GKOXZCW8Dbs2 .actor-man circle,#mermaid-svg-ObM3GKOXZCW8Dbs2 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-ObM3GKOXZCW8Dbs2 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}YAML 配置 requires_confirmation: true"取消订单 ORD-20260228-001"发送消息解析意图Tool Call: cancel_order(order_id=ORD-20260228-001)[SSE] event: confirmation_required"即将取消订单 ORD-20260228-001,确认?"弹出确认对话框点击"确认"POST /chat/confirmHTTP 代理调用取消接口取消成功"订单已成功取消"
5.3 运维操作流程
运维 Tool 通过部署在服务器上的轻量 Agent 执行命令,高风险操作需要审批:
Agent(服务器)大模型AI Gateway 网关用户Agent(服务器)大模型AI Gateway 网关用户#mermaid-svg-uGzOqx9wvSB7N8xk{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uGzOqx9wvSB7N8xk .error-icon{fill:#552222;}#mermaid-svg-uGzOqx9wvSB7N8xk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uGzOqx9wvSB7N8xk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uGzOqx9wvSB7N8xk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uGzOqx9wvSB7N8xk .marker.cross{stroke:#333333;}#mermaid-svg-uGzOqx9wvSB7N8xk svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uGzOqx9wvSB7N8xk p{margin:0;}#mermaid-svg-uGzOqx9wvSB7N8xk .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uGzOqx9wvSB7N8xk text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-uGzOqx9wvSB7N8xk .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-uGzOqx9wvSB7N8xk .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-uGzOqx9wvSB7N8xk #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-uGzOqx9wvSB7N8xk .sequenceNumber{fill:white;}#mermaid-svg-uGzOqx9wvSB7N8xk #sequencenumber{fill:#333;}#mermaid-svg-uGzOqx9wvSB7N8xk #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-uGzOqx9wvSB7N8xk .messageText{fill:#333;stroke:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uGzOqx9wvSB7N8xk .labelText,#mermaid-svg-uGzOqx9wvSB7N8xk .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .loopText,#mermaid-svg-uGzOqx9wvSB7N8xk .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-uGzOqx9wvSB7N8xk .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-uGzOqx9wvSB7N8xk .noteText,#mermaid-svg-uGzOqx9wvSB7N8xk .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-uGzOqx9wvSB7N8xk .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uGzOqx9wvSB7N8xk .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uGzOqx9wvSB7N8xk .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uGzOqx9wvSB7N8xk .actorPopupMenu{position:absolute;}#mermaid-svg-uGzOqx9wvSB7N8xk .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-uGzOqx9wvSB7N8xk .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uGzOqx9wvSB7N8xk .actor-man circle,#mermaid-svg-uGzOqx9wvSB7N8xk line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-uGzOqx9wvSB7N8xk :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}par[并行执行]"检查订单系统的服务器磁盘和内存"解析意图 + 运维 Tools并行调用: check_disk_space + check_memoryPOST /api/exec {cmd: "df -h"}磁盘信息POST /api/exec {cmd: "free -h"}内存信息汇总结果生成分析报告"服务器状态正常:磁盘使用 65%,内存使用 12G/32G…"
六、运维能力扩展
除了调用子系统 API,AI Gateway 还支持通过 Agent 在服务器上执行运维操作,覆盖完整的运维场景:
6.1 双执行器模型
#mermaid-svg-tQHSx3A3oMXXX7aA{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tQHSx3A3oMXXX7aA .error-icon{fill:#552222;}#mermaid-svg-tQHSx3A3oMXXX7aA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tQHSx3A3oMXXX7aA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tQHSx3A3oMXXX7aA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tQHSx3A3oMXXX7aA .marker.cross{stroke:#333333;}#mermaid-svg-tQHSx3A3oMXXX7aA svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tQHSx3A3oMXXX7aA p{margin:0;}#mermaid-svg-tQHSx3A3oMXXX7aA .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA .cluster-label text{fill:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA .cluster-label span{color:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA .cluster-label span p{background-color:transparent;}#mermaid-svg-tQHSx3A3oMXXX7aA .label text,#mermaid-svg-tQHSx3A3oMXXX7aA span{fill:#333;color:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA .node rect,#mermaid-svg-tQHSx3A3oMXXX7aA .node circle,#mermaid-svg-tQHSx3A3oMXXX7aA .node ellipse,#mermaid-svg-tQHSx3A3oMXXX7aA .node polygon,#mermaid-svg-tQHSx3A3oMXXX7aA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tQHSx3A3oMXXX7aA .rough-node .label text,#mermaid-svg-tQHSx3A3oMXXX7aA .node .label text,#mermaid-svg-tQHSx3A3oMXXX7aA .image-shape .label,#mermaid-svg-tQHSx3A3oMXXX7aA .icon-shape .label{text-anchor:middle;}#mermaid-svg-tQHSx3A3oMXXX7aA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tQHSx3A3oMXXX7aA .rough-node .label,#mermaid-svg-tQHSx3A3oMXXX7aA .node .label,#mermaid-svg-tQHSx3A3oMXXX7aA .image-shape .label,#mermaid-svg-tQHSx3A3oMXXX7aA .icon-shape .label{text-align:center;}#mermaid-svg-tQHSx3A3oMXXX7aA .node.clickable{cursor:pointer;}#mermaid-svg-tQHSx3A3oMXXX7aA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tQHSx3A3oMXXX7aA .arrowheadPath{fill:#333333;}#mermaid-svg-tQHSx3A3oMXXX7aA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tQHSx3A3oMXXX7aA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tQHSx3A3oMXXX7aA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tQHSx3A3oMXXX7aA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tQHSx3A3oMXXX7aA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tQHSx3A3oMXXX7aA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tQHSx3A3oMXXX7aA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tQHSx3A3oMXXX7aA .cluster text{fill:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA .cluster span{color:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tQHSx3A3oMXXX7aA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tQHSx3A3oMXXX7aA rect.text{fill:none;stroke-width:0;}#mermaid-svg-tQHSx3A3oMXXX7aA .icon-shape,#mermaid-svg-tQHSx3A3oMXXX7aA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tQHSx3A3oMXXX7aA .icon-shape p,#mermaid-svg-tQHSx3A3oMXXX7aA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tQHSx3A3oMXXX7aA .icon-shape rect,#mermaid-svg-tQHSx3A3oMXXX7aA .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tQHSx3A3oMXXX7aA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tQHSx3A3oMXXX7aA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tQHSx3A3oMXXX7aA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
运维通道
Tool 执行引擎
executor: http
executor: ops
优先
Agent 不可用
执行器路由\\n根据 YAML 中 executor 字段
HttpProxyExecutor\\n业务操作 → 调用 API
OpsExecutor\\n运维操作 → 执行命令
AgentChannel\\n优先:HTTP 调用 Agent
SshChannel\\n备选:SSH 直连
6.2 运维能力矩阵
| 系统监控 | 磁盘 / CPU / 内存 / 网络 | low |
| 日志分析 | 查看日志、搜索错误 | low |
| 性能定位 | JVM 线程栈、慢查询分析 | low |
| 代码定位 | 根据异常栈搜索源码、查看上下文 | low |
| 服务管理 | 重启 / 停止服务 | high(需审批) |
| 数据库 | 执行 SQL、连接数查看 | high(需审批) |
| 部署 | 发布 / 回滚 | high(需审批) |
6.3 安全机制
运维操作的安全通过四层机制保障:
命令白名单 → 角色权限 → 二次确认/审批 → 审计日志
- 命令白名单:Agent 只允许执行预定义的命令模式,拒绝 rm -rf / 等危险操作
- 角色权限:普通用户只能查看监控,运维人员可重启服务,管理员可执行数据库操作
- 审批流程:高风险操作需管理员审批通过后才执行
- 审计日志:所有运维操作全量记录,包括执行人、命令、结果、耗时
七、部署架构
7.1 部署拓扑
#mermaid-svg-22oLOAxi4qBmtYlC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-22oLOAxi4qBmtYlC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-22oLOAxi4qBmtYlC .error-icon{fill:#552222;}#mermaid-svg-22oLOAxi4qBmtYlC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-22oLOAxi4qBmtYlC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-22oLOAxi4qBmtYlC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-22oLOAxi4qBmtYlC .marker.cross{stroke:#333333;}#mermaid-svg-22oLOAxi4qBmtYlC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-22oLOAxi4qBmtYlC p{margin:0;}#mermaid-svg-22oLOAxi4qBmtYlC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-22oLOAxi4qBmtYlC .cluster-label text{fill:#333;}#mermaid-svg-22oLOAxi4qBmtYlC .cluster-label span{color:#333;}#mermaid-svg-22oLOAxi4qBmtYlC .cluster-label span p{background-color:transparent;}#mermaid-svg-22oLOAxi4qBmtYlC .label text,#mermaid-svg-22oLOAxi4qBmtYlC span{fill:#333;color:#333;}#mermaid-svg-22oLOAxi4qBmtYlC .node rect,#mermaid-svg-22oLOAxi4qBmtYlC .node circle,#mermaid-svg-22oLOAxi4qBmtYlC .node ellipse,#mermaid-svg-22oLOAxi4qBmtYlC .node polygon,#mermaid-svg-22oLOAxi4qBmtYlC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-22oLOAxi4qBmtYlC .rough-node .label text,#mermaid-svg-22oLOAxi4qBmtYlC .node .label text,#mermaid-svg-22oLOAxi4qBmtYlC .image-shape .label,#mermaid-svg-22oLOAxi4qBmtYlC .icon-shape .label{text-anchor:middle;}#mermaid-svg-22oLOAxi4qBmtYlC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-22oLOAxi4qBmtYlC .rough-node .label,#mermaid-svg-22oLOAxi4qBmtYlC .node .label,#mermaid-svg-22oLOAxi4qBmtYlC .image-shape .label,#mermaid-svg-22oLOAxi4qBmtYlC .icon-shape .label{text-align:center;}#mermaid-svg-22oLOAxi4qBmtYlC .node.clickable{cursor:pointer;}#mermaid-svg-22oLOAxi4qBmtYlC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-22oLOAxi4qBmtYlC .arrowheadPath{fill:#333333;}#mermaid-svg-22oLOAxi4qBmtYlC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-22oLOAxi4qBmtYlC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-22oLOAxi4qBmtYlC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-22oLOAxi4qBmtYlC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-22oLOAxi4qBmtYlC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-22oLOAxi4qBmtYlC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-22oLOAxi4qBmtYlC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-22oLOAxi4qBmtYlC .cluster text{fill:#333;}#mermaid-svg-22oLOAxi4qBmtYlC .cluster span{color:#333;}#mermaid-svg-22oLOAxi4qBmtYlC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-22oLOAxi4qBmtYlC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-22oLOAxi4qBmtYlC rect.text{fill:none;stroke-width:0;}#mermaid-svg-22oLOAxi4qBmtYlC .icon-shape,#mermaid-svg-22oLOAxi4qBmtYlC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-22oLOAxi4qBmtYlC .icon-shape p,#mermaid-svg-22oLOAxi4qBmtYlC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-22oLOAxi4qBmtYlC .icon-shape rect,#mermaid-svg-22oLOAxi4qBmtYlC .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-22oLOAxi4qBmtYlC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-22oLOAxi4qBmtYlC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-22oLOAxi4qBmtYlC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
云端(如有外网)
客户现场 / 云服务器
AI 推理层
数据层
应用层
接入层
业务 Tool
运维 Tool
运维 Tool
方案 A
方案 B
Nginx\\n反向代理 + SSL
API Gateway\\n路由 + 鉴权
注册中心\\n(Nacos / Eureka)
AI Gateway 网关\\n独立 JDK 21 进程
子系统 A\\n(JDK 8)
子系统 B\\n(JDK 8)
Agent\\n(子系统 A 服务器)
Agent\\n(子系统 B 服务器)
MySQL 5.7\\n现有业务库
MySQL 8\\nAI Gateway 专用
本地大模型\\nOllama + Qwen\\n(纯内网方案)
云端大模型 API\\nDeepSeek / GPT-4
7.2 两种大模型部署方案
| 方案 A:云端 API | 服务器可访问外网 | DeepSeek / GPT-4 / Qwen-Max | 效果最好,无需 GPU | 需要外网,有 API 费用 |
| 方案 B:本地私有化 | 纯内网环境 | Ollama + Qwen2.5 / DeepSeek | 数据不出内网,无 API 费用 | 需要 GPU 服务器 |
7.3 环境隔离
AI Gateway 网关与现有子系统的运行环境完全隔离:
| JDK | 21(独立安装) | 8 |
| MySQL | 8(独立实例,端口 3307) | 5.7(端口 3306) |
| Spring Boot | 3.x | 2.x |
两套环境互不干扰,AI Gateway 的安装和升级不影响现有业务系统。
八、接入一个新子系统需要做什么?
整个接入过程不需要修改网关代码,不需要修改子系统代码:
Step 1 确定子系统在注册中心的服务名称
↓
Step 2 在 tools/ 下创建子系统目录
↓
Step 3 编写 _system.yaml(服务名、领域知识、角色描述)
↓
Step 4 为每个需要 AI 调用的 API 编写 Tool YAML
↓
Step 5 (可选)编写运维 Tool YAML + 配置服务器信息
↓
Step 6 重启网关(或触发热加载)
↓
Step 7 前端传入对应 system_id 即可使用
典型工时:一个有 10 个 API 的子系统,约 1-2 天即可完成接入。
九、效果展示
接入后,用户在系统页面的 AI 对话窗口中可以这样交互:
👤 用户:帮我查一下今天所有异常订单
🤖 AI:正在查询异常订单…
⚙️ 调用工具: 查询订单 (status=异常, date=今天)
✅ 查询成功,返回 3 条记录
今天共有 3 笔异常订单:
| 订单号 | 客户 | 金额 | 异常原因 |
|——–|——|——|———-|
| ORD-001 | 张三 | ¥299 | 支付超时 |
| ORD-002 | 李四 | ¥1,580 | 库存不足 |
| ORD-003 | 王五 | ¥89 | 地址无效 |
建议处理:
– ORD-001:可自动重试支付
– ORD-002:需补货后重新发起
– ORD-003:需联系客户确认地址
👤 用户:订单系统服务器磁盘快满了吗?
🤖 AI:正在检查服务器磁盘…
🔧 执行运维命令: df -h (服务器: order-app-01)
✅ 执行完成
订单系统服务器磁盘使用情况:
| 分区 | 总容量 | 已用 | 可用 | 使用率 |
|——|——–|——|——|——–|
| / | 100G | 45G | 55G | 45% |
| /opt | 200G | 178G | 22G | 89% ⚠️ |
⚠️ /opt 分区使用率已达 89%,建议清理日志文件。
需要我帮你查看哪些日志文件占用空间最大吗?
十、总结
| 通用性 | 一套网关对接任意子系统,YAML 配置驱动 |
| 零侵入 | 子系统不改一行代码 |
| 双模式 | 业务操作(HTTP 代理)+ 运维操作(Agent/SSH) |
| 安全 | 二次确认 + 命令白名单 + 审批 + 审计 |
| 灵活部署 | 云端大模型 / 本地私有化,适配内外网 |
| 快速接入 | 新子系统 1-2 天完成接入 |
这套架构的本质是:把大模型的"理解能力"和现有系统的"执行能力"通过一个配置驱动的网关连接起来。大模型负责理解用户意图、拆解步骤、生成回复;网关负责将意图翻译为 API 调用或运维命令;子系统继续做它擅长的事情——执行业务逻辑。
三者各司其职,通过 YAML 配置松耦合连接,这就是 AI Gateway 的核心设计哲学。
如果你的 SaaS 系统也想拥有这样的 AI 对话能力,欢迎交流探讨。
网硕互联帮助中心






评论前必须登录!
注册