结论摘要十条
- 骨架不变、部署单元细化。两层架构沿用;AI 策略执行点按"环境 × 池"部署三类池共 8 个单元。顾磊"两个专用网关"由此落地,硬理由改为计费模型不同 + 故障域/SLA 不同。
- 阶段 0 盘点已完成,存量不是空白。全部内部 AI 流量今天经一个 one-api 分支的统一代理转发;另有 8 个服务在代码里直连火山方舟、百炼、Moonshot、百度千帆、智谱。存量南北向是 APISIX / Kong / ingress-nginx / ALB+WAF,没有 Higress(报告"存量 Higress"假设被湖仓证否)。
- 存量代理保留为过渡 provider,6 个月内退出代理职责。它有渠道优先级、重试、按 token 计费、用户额度、渠道余额查询,但缺用户/租户身份、契约化用量记录、OTel、环境隔离、配置版本化与 MCP。
- 身份:用户中心是权威源,AI 身份层只做协议适配。源码取证:用户中心令牌是对称密钥签名的 JWT,无 PKCE / JWKS / 发现文档 / RFC 8693;同时它已是多租户 SSO 联邦点。AI 侧部署 IdP 做"登录桥 + 协议适配 + 逐跳换发",不复制用户目录、不持有用户中心签名密钥。
- 角色与组织采纳"整理与思考"。全局管理员 / 个人开发者 / 应用管理员,Project → Application 两层;应用注册走飞书审批;编程池发虚拟 key,业务池走 JWT 与工作负载身份。
- 两处冲突按翟保延口径统一。故障转移拆两级:同模型跨 provider 默认开(L1),跨模型回退显式声明冻结(L2);"自动选最低单价"改为价目版本化 + 编译期排优先级 + 成本对照视图。
- "Token 套餐余量"三层落地。内部额度桶用网关预算;厂商余量与刷新时间由余额探针轮询;订阅/编码套餐自计数并标估算,订阅态直连流量不经网关需与需求方取舍。
- 契约先行。八类契约字段草案随文给出,与 ToolPermissionSet IR 做字段映射;新增 ModelRouteSet 与 RegistryEntry 两类 IR,三者一起编译成网关配置,配置版本号写进每条日志。
- 双轨节奏。轨 A 模型网关先接已在统一代理上的应用(零改动切流)再收编直连服务;轨 B MCP 网关先接已在生产、面向豆包/WorkBuddy 的票据归档 MCP 与发票查验/OCR MCP。
- 工程量重估为 18–24 人周。在"两件半"之上增加身份适配层与登录桥、计量对账流水线与看板、余额探针、ModelRouteSet 编译、注册中心/控制台 MVP、迁移;约一半是对接而非编码。
现状盘点阶段 0 · 研发本体湖仓 + 部署源码取证
湖仓批次 2026-09-04 前后;源码为线上部署 commit 的只读检出。以下只列结构事实,不列内部域名、仓库路径与人员。
模型调用出口 湖仓取证
| 出口 | 使用方 | 含义 |
|---|---|---|
| 统一代理(one-api 分支) | 协同平台智能助手、意图诊断、飞书审批、票税 AI 运维、合同条款等 5–6 个应用;会议纪要:全部内部 AI 流量经此转发 | 翟保延 S1 所说"已批准的 OpenAI 兼容代理";切流第一批 |
| 直连火山方舟 | ECCP AI 对账/LLM 基座、销项邮件票据、销项运维 Agent | 各持厂商 Key |
| 直连百炼 | 同上 ECCP 两服务、智能匹配 embedding、图片分类 | 与百炼上架分润对账直接相关 |
| 直连 Moonshot / 百度千帆 / 智谱 | 阿里 OCR MCP、速卖通/菜鸟 OCR、OCR demo | 票据识别线 |
| 未见 | OpenAI / Anthropic / Azure 直连痕迹;统一代理背后的渠道清单需从其数据库导出 | |
AI 资产与存量基础设施 湖仓取证
- Agent 运行时平台:xagent(管理后台 / runtime-gateway / OpenClaw 运行时 / 工作台,测试环境活跃开发)、agentos。AI 网关是它们的下游依赖,不是替代。
- 生产 MCP:票据归档与报销预处理 MCP(面向 WorkBuddy、千问办公、豆包)、阿里 OCR MCP;仓库另有发票查验、开票查询、蓝票开具、Apollo、K8s 等 MCP。
- 其他 AI 服务:云识别 OCR(生产 8 副本)、图片分类(6 副本)、商品分类助手、Dify、FastGPT、2026-05 一组含 ai-gateway/iam/policy-engine 的原型仓(已停更)。
- 南北向:阿里云 DNS/WAF/ALB 为主;APISIX(自研管理台)、Kong 3.9、ingress-nginx(ACK/TKE)、istio、traefik;业务网关 xforce-gateway、janus 等。无 Higress。
- 集群:14 个 K8s 集群源,跨阿里云/腾讯云/AWS/华为/火山/Azure China/本地;AI 工作负载集中在阿里云生产与 FAT 两个主集群。
SaaS 用户中心 源码取证 湖仓取证
| 事实 | 设计推论 |
|---|---|
| 组件:oauth2-server(生产 6 副本)、登录 UI、tenant-service、uc-data-auth(数据权限)、xforce-gateway(Spring Cloud Gateway) | 以这一套为"我司 SaaS 用户中心";低代码平台另有独立用户中心,不并入 |
| 令牌:对称密钥签名的 JWT(编码/解码共享同一 secret,8 小时),payload 携带 Base64 用户信息 | AI 网关不能持有该密钥;需"登录桥"在用户中心侧校验后换发 AI 侧非对称签名令牌 |
| 协议:/authorize(JSON 返 code)、/token(预注册机密客户端)、/user-token(凭 client 凭据按用户名代签);未发现 PKCE、JWKS、发现文档、RFC 8693、RFC 7662 | IDE / harness / 第三方入口所需标准 OAuth 能力由 AI IdP 提供;/user-token 只能作过渡桥且锁定调用方 |
| 联邦:按租户接入 Okta(OIDC)、Entra、CAS、SAML、钉钉、微信 | 客户身份体系已汇聚于此;AI 网关复用,不重复维护客户 IdP |
| 下游信任:xforce-gateway 向业务服务注入 tenantId / appId / userinfo 等头 | AI 网关到 SaaS 业务 API 的出向调用必须经 xforce-gateway;伪造头直连路径在网络层堵死 |
总体架构两层 · 环境 × 池 · 控制面自建
图 1 · 目标架构。虚线框为存量复用或控制面;实线框为新建。AI 策略执行点不承接公网,外部客户经存量南北向进入。
部署矩阵(环境 × 池)
| 池 | 使用方 | 凭据 | 计费 / 额度 | SLO | FAT | 预发 | 生产 |
|---|---|---|---|---|---|---|---|
| 编程 LLM 池 | 内部开发者个人、开发 Agent | 虚拟 key(绑定飞书/用户中心身份)或 CIMD | 套餐 / 额度桶;订阅类套餐自计数 | 99.9% | ✓ | — | ✓ |
| 业务 LLM 池 | 业务服务 | JWT(用户或工作负载)+ 任务上下文 | 按应用 × 租户 × 商品预算;评测流量独立 | 99.95% · P95 ≤ 30 ms | ✓ | ✓ | ✓ |
| MCP 池 | Agent / 助手 / 第三方入口 | 用户令牌(aud=ai-gateway)+ 能力授权 | 按调用方 × 工具限流;工具费用回填 | 同业务池;含覆写路径 P95 ≤ 100 ms | ✓ | ✓ | ✓ |
身份、权限与组织用户中心为权威源 · AI IdP 做协议适配
图 2 · 身份架构。左侧为身份来源,中间为 AI IdP,右侧为角色与组织;下方为逐跳换发链。
模型网关设计轨 A
故障转移两级 文档取证 同请求切换/流式未实测
| 级 | 内容 | 默认 | 机制 |
|---|---|---|---|
| L1 | 同模型跨 provider(百炼 ↔ 自建 Qwen;Azure ↔ OpenAI;多区域/多 Key) | 开 | failover 优先级组 + health.eviction(连续失败/5xx/自定义;驱逐 3 s 起倍增,可被 Retry-After 覆盖)+ retry 优先选不同后端 |
| L2 | 跨模型回退(gpt-4o → claude → 自建) | 关 | 只有在 IR 里显式声明候选集、等价要求、质量门槛、触发条件后才编译出来;回退留痕 |
retry.attempts=1、无 L2。重试所有权只在 agentgateway,SDK 与南北向关闭重试。成本最优调度 网关无按价选路 编译排序需自建
- 价目目录(input / output / cacheRead / cacheWrite / reasoning / image,USD 每百万 token,支持分层)版本化进策略仓;每条用量记录带
price_version。 - 编译流水线按"有效单价 × 预期缓存命中率"把同一别名下候选 provider 排成 L1 优先级组;人审 diff 后冻结。
- 成本对照视图:同一别名各 provider 的实际单价、P50/P95、成功率、缓存命中率、失败重试成本;每月复审。
- 人民币结算与厂商折扣在数据平台按价目版本折算(网关只算 USD)。
额度、套餐与余量 预算 API 余额探针
| 层 | 机制 |
|---|---|
| 内部额度桶(个人 key、应用/租户/商品) | 网关预算:USD 或 Tokens、滚动窗口、超限 Block/Audit;管理 API 返回已用/剩余/窗口;租户级预算走远程限流描述符或计量服务 |
| 厂商余量与刷新时间 | 余额探针轮询有接口的厂商(统一代理今天的"渠道余额"迁过来) |
| 订阅 / 编码套餐 | 无公开接口:按套餐窗口自计数并标"估算";订阅态客户端默认直连厂商不经网关——管控优先则改 API key 计费,成本上升,需与需求方确认 |
别名路由、协议、缓存、守卫、影子、配置治理
- 别名(intent-judge、ocr-multipage、audit-rules…)= 虚拟模型;映射在 ModelRouteSet 版本化;响应带实际模型与 route_version;换供应商不改代码不发版。
- 协议:OpenAI chat/responses、Anthropic messages 同一实例互转;流式结束帧 usage 完整性为 P0 补测。
- 缓存:前缀缓存开;无语义缓存,识别/查验路由天然无缓存命中。守卫:正则 mask/reject/audit、webhook、moderation;流式只能拒绝不能打码。影子:requestMirror 内建;实验标签与批量重放需自建评测服务。
- 配置治理:IR PR → 编译 → 校验 → 审批 → 发布 → 回滚;配置版本进日志代替"快照";目标形态热更新语义试点验证。
MCP 网关设计轨 B · 沿用第 07 章三注入点与 POC 结论
落地要点
- 入口即渠道:IR 增加
channel(internal / doubao / workbuddy / qianwen-office / cloud-market)参与 CEL 裁剪;同一业务方服务对内外暴露不同工具集。 - 登记表(B6):RegistryEntry 未登记/版本不匹配/schema 无效即不可发现不可调用,编译期保证。
- 业务结果(B5):业务方在
_meta.billableUnits返回,网关只搬运;tools/list 与健康检查不产生用量事件。 - 第三方入口授权页(B8):AI IdP 提供授权码 + PKCE 授权页,用户在页内走用户中心登录桥。
- 审批:拒绝 + 审批回执 + 同动作重试,回执绑定 actor/tool/参数哈希/策略版本/TTL/单次消费,对接飞书审批;网关合成 MRTR 结果被证否。
- 头保真(B9 改口):头值/自定义头/路径不改写,头名大小写不敏感;工具名前缀 conditional;会话绑定降 P2、异步任务号透传保留。
接入顺序
- 票据归档与报销预处理 MCP(已生产、外部渠道最复杂:WorkBuddy / 千问办公 / 豆包)
- 发票查验 / 开票查询 / 蓝票开具 MCP(走 OpenAPI,登记表 + IR + 换发)
- 阿里 OCR MCP
- 智能助手只读诊断工具(满足开工前置后)
- Apollo / K8s 运维类 MCP(写操作走审批)
场景时序 · 内部入口经 MCP 池调用发票查验
sequenceDiagram
autonumber
participant H as 助手/Agent
participant GW as MCP 池
participant PI as 策略处理器
participant IdP as AI IdP
participant M as 发票查验 MCP
participant XG as xforce-gateway
participant API as 业务 API
H->>GW: tools/list(用户令牌 aud=ai-gateway)
GW-->>H: 能力授权 ∩ 登记表 ∩ channel 的工具子集
H->>GW: tools/call invoice.verify{tenant_id:"X", files:[2]}
GW->>PI: inject tenant_id=jwt.tenant · constrain · 决策记录
GW->>IdP: RFC 8693 换发 aud=invoice-mcp(缓存)
GW->>M: tools/call(本跳令牌)
M->>GW: 出向路由(自己的令牌)
GW->>IdP: 过渡桥 /user-token(仅 IdP 可调)
GW->>XG: 用户中心令牌
XG->>API: 注入 tenantId / userinfo
API-->>M: 结果
M-->>GW: 结果 + _meta.billableUnits=2
GW->>PI: 用量事件持久化
GW-->>H: 结果
场景时序 · 第三方入口(豆包)连接票据归档 MCP
sequenceDiagram
autonumber
participant D as 豆包 / WorkBuddy
participant Pub as 公网入口(WAF/ALB/APISIX)
participant GW as MCP 池
participant IdP as AI IdP 授权页
participant UC as 用户中心登录(登录桥)
participant M as 票据归档 MCP
D->>Pub: 连接(无令牌)
Pub->>GW: 转发
GW-->>D: 401 + 资源元数据
D->>IdP: 授权码 + PKCE
IdP->>UC: 跳转登录(租户 SSO 联邦)
UC-->>IdP: 回调
IdP->>UC: 服务端校验令牌 + 取用户/租户
IdP-->>D: access_token(channel=doubao)
D->>GW: tools/list
GW-->>D: 外部渠道工具子集
D->>GW: tools/call(含被禁参数)
GW->>GW: 剥离参数 · 换发 aud=receipt-mcp
GW->>M: 调用
M-->>D: 结果(无被禁能力输出)
计量、对账与可观测性
| 链路 | 网关侧义务 | 平台侧产出 |
|---|---|---|
| 每请求 access log(JSON/OTLP,字段白名单)→ OTel Collector → 队列/对象存储 → 数据平台明细表 | 厂商 Request ID(响应头)、实际模型、token 与成本分项、config/policy/price 版本、三值化(值 / 不可用 / 未计) | 按任务 / 租户 / 应用 / 商品 / 厂商 × 模型的成本报表(P50/P90/最坏);月度厂商对账单(差异定位到单请求);评测报表(实验标签);审计导出(≥ 90 天、脱敏、TTL) |
| metrics(gen_ai_* 按 provider/model/池/应用标签)→ Prometheus/Grafana | 指标标签含池、应用、租户、别名 | "可视化统计视图":时间 × 模型 × 场景 × 应用 × 租户 |
| traces(W3C traceparent 贯穿 harness → 网关 → MCP → API/厂商) | 注入并透传;correlation id 进审计 | 接入现有链路系统(接收端阶段 0 确认) |
| 预算状态 + 余额探针 | 管理 API:已用 / 剩余 / 窗口 | 看板"余量与刷新时间" |
UsageRecord 字段草案:record_id · ts · env · pool · route_alias/route_version · requested/actual_model · provider · provider_request_id · tenant · sub · app_id · project_id · channel · product_id · task/run/session/trace · traffic_purpose · tokens{input,output,cache_read,cache_write,reasoning,image} · cost{USD 分项} · price_version · ttft · latency · status · error_code · retry_count · failover_hop · policy/config_version · guard_actions · bytes。
需求接纳58 条逐条评价 · 38 条验收 check
改写与分档要点
| 条目 | 原提法 | 接纳后 | 证据 |
|---|---|---|---|
| 顾磊二 | Provider/模型不可用自动切换、全程透明 | L1 同模型跨 provider 默认开;L2 跨模型显式声明冻结;非幂等路由禁止自动回退 | 文档取证 |
| 顾磊三后半 | Token 套餐余量与刷新时间 | 额度桶内建;厂商余量走探针;订阅套餐估算,订阅态直连需取舍 | 预算 API 探针 |
| 顾磊四 | 自动选单价最低 provider | 价目版本化 + 编译期排优先级 + 成本对照视图 | 无按价选路 |
| A3 | 继承截止时间;重试所有权唯一 | 按别名设超时上限;重试只在 agentgateway;错误契约映射表 | 文档取证 |
| B5 | 网关记录"识别成功 2 张" | 业务方 _meta.billableUnits,网关搬运不解释 | 需自建 |
| B9 | 头名大小写不改写 | 头值/自定义头/路径不改写;大小写不敏感(HTTP/2) | 源码取证 |
| C6 | P95 ≤ 30 ms | 不含处理器 ≤ 30 ms;含参数覆写 ≤ 100 ms;试点重测 | POC 单机 压测 |
| A12 | 热更新秒级生效、请求绑定快照 | GitOps + 校验 + 审批 + 回滚;配置版本进日志;目标形态试点验证 | 形态未取证 |
| 是否两个网关 | 面向个人 / 面向应用两个独立网关 | 同一产品两类池(凭据、计费、SLA 不同) | 设计 |
| 自研 vs 开源 | 完全自研?基于开源扩展?如何扩展? | 开源数据面不改源码(ExtMCP/ExtProc/webhook/CEL/RFC 8693);自建控制面(IR、编译、注册中心/控制台、身份适配、计量) | POC |
实施路线与工程量双轨 · 3 人并行约 8–10 周到试点切流
| 自建项 | 人周 | 说明 |
|---|---|---|
| 编译流水线(三类 IR → 配置 + 处理器 + 价目) | 2.0 | POC 编译器基础上扩 ModelRouteSet / RegistryEntry,接 CI 与审批 |
| 策略处理器生产化 | 2.5 | RDS、多副本、fail-closed、超时预算 |
| 身份适配层(登录桥 SPI、飞书联邦、CIMD、换发、过渡桥、撤权事件) | 3.0 | 与用户中心团队对接占一半 |
| 授权适配器(资源码 / 公司范围 → 权限快照;任务级能力授权) | 1.5 | 调用用户中心接口,不重算 RBAC |
| 计量与对账流水线(明细表、成本口径、对账单、看板) | 3.5 | 数据平台侧 |
| 余额探针 + 套餐窗口计数 | 0.5 | provider 适配器 |
| 注册中心 / 控制台 MVP | 3.5 | 可先 GitOps + 飞书审批 + 多维表格过渡 |
| 审批通道(飞书审批)对接 | 1.5 | 回执绑定与单次消费 |
| 迁移(底稿导出、改配、直连收编、NetworkPolicy、回退演练) | 2.5 | 逐应用 |
| 私有化打包与签名导出 | 1.0 | E1/E2 首版 |
| 合计 | 21.5(18–24) | 对接类约一半 |