在AI应用开发中,多模型调用已成为常态——GPT适合复杂推理,Claude擅长长文档分析,Gemini在多模态场景表现突出,国产模型在合规场景有天然优势。但不同厂商的接口规范、鉴权方式、返回格式各不相同,直连模式下业务代码需要维护多套调用逻辑,链路稳定性、密钥管理、成本控制等问题也随之而来。

AI网关正是在这个背景下出现的中间层——它不是简单的反向代理,而是融合了流量调度、协议适配、安全鉴权、状态管理、容错降级的综合中间件。本文以轻量化AI网关Aegisy为例,从架构设计和代码实现两个维度,拆解AI网关的核心模块。

一、四层架构:从入口到后端的完整链路

Aegisy的整体架构分为四层:接入层、核心调度层、模型适配层、运维管理层。每一层承担特定的工程职责。

1.1 接入层:统一入口,协议归一

接入层是流量的第一道关口,对外暴露标准化的/v1/messages接口。它完成三件事:

  • 统一鉴权:业务端只需持有Aegisy颁发的一枚API Key,无需管理各模型厂商的多套密钥

  • 协议统一:无论是POST常规请求还是SSE流式对话,都遵循同一套调用规范

  • 流量清洗:基础的请求校验、限流预处理

这一层的核心设计思路是屏蔽后端多模型的协议差异。业务代码只需要对接一个端点,无需感知下游模型分布。

1.2 核心调度层:智能路由与自动故障转移

这是保障服务高可用的关键模块,包含两大核心能力:

智能路由:基于负载、线路质量、地域等维度,将请求分发至不同上游节点,实现流量负载均衡,避免单条链路压力过大。

自动故障转移(Failover) :实时探测后端模型节点的健康状态。当某条上游链路出现超时、5xx错误或连接中断时,系统自动将请求切换至备用节点,全程对业务代码无感知。

从实现角度看,调度层维护了一个上游节点池,每个节点有对应的健康检查探针。探针周期性发送探测请求,根据响应时间、状态码等指标综合评估节点健康度。当健康度低于阈值时,该节点被标记为不可用,后续请求不再路由至此。

这套机制在日均50TB流量规模下,可将抖动控制在±2ms以内。

1.3 模型适配层:双向格式转换

模型适配层解决的是接口碎片化问题。它将网关的标准请求体翻译成各模型的原生接口格式,同时对返回结果做统一封装。

以消息结构为例:

  • OpenAI使用messages: [{role, content}]格式

  • Anthropic Claude将systemmessages分离

  • Google Gemini使用contents: [{parts}]结构

适配层的职责就是完成这些格式的双向转换。新增模型时,只需在适配层补充对应的转换规则,业务代码完全不需要改动。这就是所谓的“模型热插拔”。

1.4 运维管理层:可观测性与成本管控

运维管理层集成了会话持久化、用量统计、配额限制、日志记录等功能:

  • 会话持久化:为每一组对话分配唯一会话ID,上下文数据托管在网关内部。基于内存加轻量化持久化存储实现,兼顾响应速度与数据可靠性。无论用户是否重连、是否切换模型,多轮对话不中断。

  • 用量统计:实时记录调用次数、Token消耗,配合配额限制实现成本管控。

  • 日志审计:记录调用方身份、模型输入输出、响应延迟,满足问题排查需求。

二、代码实现:从调用示例看网关设计

2.1 基础调用:统一接口的标准用法

Aegisy对外提供/v1/messages统一接口。以下是一个标准的Python调用示例:

import requests
import json

url = "https://www.aegisy.cc/v1/messages"
headers = {
    "Authorization": "Bearer YOUR_AEGISY_API_KEY",
    "Content-Type": "application/json"
}

data = {
    "model": "gpt-4o",
    "messages": [
        {"role": "system", "content": "你是一个专业的代码审查助手"},
        {"role": "user", "content": "请审查以下Python代码的性能问题..."}
    ],
    "stream": False
}

response = requests.post(url, headers=headers, json=data)
print(json.dumps(response.json(), indent=2, ensure_ascii=False))

对应的curl命令:

curl -X POST https://www.aegisy.cc/v1/messages \
  -H "Authorization: Bearer YOUR_AEGISY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-3.5-sonnet",
    "messages": [{"role": "user", "content": "解释一下API网关的架构"}],
    "stream": false
  }'

关键设计点:切换模型只需修改model字段——gpt-4oclaude-3.5-sonnetgemini-1.5-pro——接口地址、鉴权方式、消息结构完全不变。这正是统一API抽象层的价值:将模型与业务解耦,后续新增模型或替换供应商时,上层业务代码零改造。

2.2 流式输出:SSE协议的统一封装

流式对话是大模型的核心场景之一。不同厂商的SSE格式差异很大——OpenAI发data: [DONE],Claude发event: message_stop,各家格式不统一。

Aegisy在接入层对SSE协议做了统一封装,业务端只需要按照标准方式处理流式响应:

import requests
import json

url = "https://www.aegisy.cc/v1/messages"
headers = {
    "Authorization": "Bearer YOUR_AEGISY_API_KEY",
    "Content-Type": "application/json"
}

data = {
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "写一篇关于AI网关的技术文章"}],
    "stream": True
}

response = requests.post(url, headers=headers, json=data, stream=True)

for line in response.iter_lines():
    if line:
        line = line.decode('utf-8')
        if line.startswith('data: '):
            chunk = line[6:]
            if chunk.strip() and chunk != '[DONE]':
                try:
                    content = json.loads(chunk)
                    print(content.get('choices', [{}])[0].get('delta', {}).get('content', ''), end='')
                except json.JSONDecodeError:
                    pass

设计要点:网关在模型适配层将各厂商的原始SSE格式统一转换为标准格式,业务端只需适配一套解析逻辑。流式传输的稳定性也由核心调度层保障——当某条链路出现波动时,故障转移机制可以在用户无感知的情况下切换备用通道。

2.3 会话持久化:跨模型上下文保持

多轮对话场景中,会话状态的保持至关重要。Aegisy在运维管理层实现了独立的会话存储:

import requests

url = "https://www.aegisy.cc/v1/messages"
headers = {
    "Authorization": "Bearer YOUR_AEGISY_API_KEY",
    "Content-Type": "application/json"
}

# 第一轮:使用GPT-4o
data = {
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "我的项目使用Python FastAPI框架"}],
    "session_id": "user_12345",  # 唯一会话ID
    "stream": False
}
response = requests.post(url, headers=headers, json=data)

# 第二轮:切换到Claude,上下文自动继承
data = {
    "model": "claude-3.5-sonnet",
    "messages": [{"role": "user", "content": "基于上面的项目背景,推荐一个数据库方案"}],
    "session_id": "user_12345",  # 同一个会话ID
    "stream": False
}
response = requests.post(url, headers=headers, json=data)

实现原理:网关层为每个session_id维护独立的对话历史存储,上下文数据托管在网关内部。切换模型时,网关从存储中加载历史上下文,将其注入到新模型的请求中。整个过程对业务代码透明。

三、架构对比:直连 vs 网关方案

对比维度 原生接口直连 Aegisy网关方案
接口适配 每接入一个模型,新增一套调用代码 统一/v1/messages接口,改model字段即可
鉴权方式 每个模型独立Key,分散管理 单一API Key,集中管控
链路稳定性 单点链路,故障需人工介入 多路冗余 + 自动故障转移
会话管理 连接断开即丢失上下文 网关层独立会话存储
模型扩展 新增模型需修改业务代码 适配层加规则,业务代码零改动
可观测性 无用量统计、无日志 实时用量、配额管控、日志审计

四、总结

AI网关的核心价值可以概括为一句话:在业务应用与底层模型之间插入一个统一的治理层

从架构上看,接入层解决协议归一,调度层解决高可用,适配层解决接口碎片化,运维层解决可观测性——四层各司其职,共同将碎片化的AI能力收敛为标准化服务。

从代码实现上看,开发者只需掌握一套调用语法、持有单一API Key,即可调用GPT、Claude、Gemini等不同模型。切换模型、新增模型、故障转移、会话保持——这些原本需要业务代码处理的复杂逻辑,全部被网关层接管。

对于个人开发者和小型团队而言,这种轻量化网关的价值尤为直接:无需服务器部署、无需配置反向代理、无需编写协议转换代码。技术新手可快速上手,资深开发者也能将精力从底层运维转向业务逻辑开发

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐