ai-proxy-multi
ai-proxy-multi 插件将插件配置转换为 OpenAI、DeepSeek、Gemini、Vertex AI 及其他 OpenAI 兼容 API 所需的请求格式,从而简化对 LLM 和向量嵌入模型的访问。它可在多个 AI 服务实例之间提供负载均衡、重试、故障转移和健康检查。
转发请求前,插件会根据请求 URI 和请求体识别客户端协议。当客户端使用 Anthropic Messages,而所选实例的服务提供方支持 OpenAI Chat Completions 而非原生 Anthropic Messages 时,插件会执行协议转换:将客户端请求转换为 OpenAI 格式,并将后端响应转换为 Anthropic 格式。该转换只支持 Anthropic Messages 的一部分功能。有关检测规则、字段映射、版本边界和限制,请参阅协议参考。
该插件还可以在访问日志而非错误日志中记录 LLM 请求信息,包括 Token 用量、模型和首字节响应时间。日志插件可以采集这些条目。
演示
以下演示展示了配置实例优先级和速率限制示例。它展示了如何在 API7 企业版中使用控制台配置两个具有不同优先级的模型,并对优先级较高的实例应用速率限制。在将 fallback_strategy 设置为 ["rate_limiting"] 的情况下,一旦高优先级实例的速率限制配额用完,插件应继续将请求转发到低优先级实例。
示例
以下示例演示了如何针对不同场景配置 ai-proxy-multi。
实例间负载均衡
以下示例配置两个模型进行负载均衡,将 80% 的流量转发到一个实例,20% 转发到另一个实例。如果首次尝试在两秒内返回 429 或 5xx,插件还会重试另一个实例。max_retries 和 retry_on_failure_within_ms 自 API7 企业版 3.9.14 和 APISIX 3.17.0 起可用。
为了演示和更易于区分,你将配置一个 OpenAI 实例和一个 DeepSeek 实例作为上游 LLM 服务。
创建路由如下,并根据需要更新你的模型服务提供方、模型、API Key 和端点:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
--data-binary @- <<EOF
{
"id": "ai-proxy-multi-route",
"uri": "/anything",
"methods": ["POST"],
"plugins": {
"ai-proxy-multi": {
"fallback_strategy": ["http_429", "http_5xx"],
"max_retries": 1,
"retry_on_failure_within_ms": 2000,
"instances": [
{
"name": "openai-instance",
"provider": "openai",
"weight": 8,
"auth": {
"header": {
"Authorization": "Bearer $OPENAI_API_KEY"
}
},
"options": {
"model": "gpt-4"
}
},
{
"name": "deepseek-instance",
"provider": "deepseek",
"weight": 2,
"auth": {
"header": {
"Authorization": "Bearer $DEEPSEEK_API_KEY"
}
},
"options": {
"model": "deepseek-chat"
}
}
]
}
}
}
EOF
❶ 将 openai-instance 的权重配置为 8。
❷ 将 deepseek-instance 的权重配置为 2。
services:
- name: ai-proxy-multi-service
labels:
docs-example: ai-kafka-logging
routes:
- name: ai-proxy-multi-route
uris:
- /anything
methods:
- POST
plugins:
ai-proxy-multi:
fallback_strategy:
- http_429
- http_5xx
max_retries: 1
retry_on_failure_within_ms: 2000
instances:
- name: openai-instance
provider: openai
weight: 8
auth:
header:
Authorization: "Bearer ${OPENAI_API_KEY}"
options:
model: gpt-4
- name: deepseek-instance
provider: deepseek
weight: 2
auth:
header:
Authorization: "Bearer ${DEEPSEEK_API_KEY}"
options:
model: deepseek-chat
将配置同步到网关:
adc sync -f adc.yaml
❶ 将 openai-instance 的权重配置为 8。
❷ 将 deepseek-instance 的权重配置为 2。
- Gateway API
- APISIX CRD
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: ai-proxy-multi-plugin-config
spec:
plugins:
- name: ai-proxy-multi
config:
fallback_strategy:
- http_429
- http_5xx
max_retries: 1
retry_on_failure_within_ms: 2000
instances:
- name: openai-instance
provider: openai
weight: 8
auth:
header:
Authorization: "Bearer YOUR_OPENAI_API_KEY"
options:
model: gpt-4
- name: deepseek-instance
provider: deepseek
weight: 2
auth:
header:
Authorization: "Bearer YOUR_DEEPSEEK_API_KEY"
options:
model: deepseek-chat
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: ai-proxy-multi-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /anything
method: POST
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: ai-proxy-multi-plugin-config
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
❶ 将 openai-instance 的权重配置为 8。
❷ 将 deepseek-instance 的权重配置为 2。
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: ai-proxy-multi-route
spec:
ingressClassName: apisix
http:
- name: ai-proxy-multi-route
match:
paths:
- /anything
methods:
- POST
plugins:
- name: ai-proxy-multi
enable: true
config:
fallback_strategy:
- http_429
- http_5xx
max_retries: 1
retry_on_failure_within_ms: 2000
instances:
- name: openai-instance
provider: openai
weight: 8
auth:
header:
Authorization: "Bearer YOUR_OPENAI_API_KEY"
options:
model: gpt-4
- name: deepseek-instance
provider: deepseek
weight: 2
auth:
header:
Authorization: "Bearer YOUR_DEEPSEEK_API_KEY"
options:
model: deepseek-chat
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
❶ 将 openai-instance 的权重配置为 8。
❷ 将 deepseek-instance 的权重配置为 2。
向该路由发送 10 个 POST 请求,请求体中包含系统提示和示例用户问题,以查看转发到 OpenAI 和 DeepSeek 的请求数量:
openai_count=0
deepseek_count=0
for i in {1..10}; do
model=$(curl -s "http://127.0.0.1:9080/anything" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "system", "content": "You are a mathematician" },
{ "role": "user", "content": "What is 1+1?" }
]
}' | jq -r '.model')
if [[ "$model" == *"gpt-4"* ]]; then
((openai_count++))
elif [[ "$model" == "deepseek-chat" ]]; then
((deepseek_count++))
fi
done
echo "OpenAI responses: $openai_count"
echo "DeepSeek responses: $deepseek_count"
你应该看到类似于以下的响应:
OpenAI responses: 8
DeepSeek responses: 2
对 Responses API 请求进行负载均衡
以下示例在 OpenAI Responses API 路由上配置 ai-proxy-multi,并将请求分配到两个 OpenAI 模型。
Responses 和 Embeddings 请求都包含 input。请保留 /v1/responses URI 后缀,使插件将该请求识别为 Responses,而不是 Embeddings。请参阅请求协议检测。
创建一条路由,并将 uri 设置为 /v1/responses:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
--data-binary @- <<EOF
{
"id": "ai-proxy-multi-responses-route",
"uri": "/v1/responses",
"methods": ["POST"],
"plugins": {
"ai-proxy-multi": {
"instances": [
{
"name": "openai-responses-primary",
"provider": "openai",
"weight": 1,
"auth": {
"header": {
"Authorization": "Bearer $OPENAI_API_KEY"
}
},
"options": {
"model": "gpt-4.1"
}
},
{
"name": "openai-responses-secondary",
"provider": "openai",
"weight": 1,
"auth": {
"header": {
"Authorization": "Bearer $OPENAI_API_KEY"
}
},
"options": {
"model": "gpt-4.1-mini"
}
}
]
}
}
}
EOF
services:
- name: ai-proxy-multi-service
routes:
- name: ai-proxy-multi-responses-route
uris:
- /v1/responses
methods:
- POST
plugins:
ai-proxy-multi:
instances:
- name: openai-responses-primary
provider: openai
weight: 1
auth:
header:
Authorization: "Bearer ${OPENAI_API_KEY}"
options:
model: gpt-4.1
- name: openai-responses-secondary
provider: openai
weight: 1
auth:
header:
Authorization: "Bearer ${OPENAI_API_KEY}"
options:
model: gpt-4.1-mini
将配置同步到网关:
adc sync -f adc.yaml
- Gateway API
- APISIX CRD
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: ai-proxy-multi-responses-plugin-config
spec:
plugins:
- name: ai-proxy-multi
config:
instances:
- name: openai-responses-primary
provider: openai
weight: 1
auth:
header:
Authorization: "Bearer <OPENAI_API_KEY>"
options:
model: gpt-4.1
- name: openai-responses-secondary
provider: openai
weight: 1
auth:
header:
Authorization: "Bearer <OPENAI_API_KEY>"
options:
model: gpt-4.1-mini
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: ai-proxy-multi-responses-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /v1/responses
method: POST
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: ai-proxy-multi-responses-plugin-config
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: ai-proxy-multi-responses-route
spec:
ingressClassName: apisix
http:
- name: ai-proxy-multi-responses-route
match:
paths:
- /v1/responses
methods:
- POST
plugins:
- name: ai-proxy-multi
enable: true
config:
instances:
- name: openai-responses-primary
provider: openai
weight: 1
auth:
header:
Authorization: "Bearer <OPENAI_API_KEY>"
options:
model: gpt-4.1
- name: openai-responses-secondary
provider: openai
weight: 1
auth:
header:
Authorization: "Bearer <OPENAI_API_KEY>"
options:
model: gpt-4.1-mini
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
使用 OpenAI Responses API 格式发送请求:
curl "http://127.0.0.1:9080/v1/responses" -X POST \
-H "Content-Type: application/json" \
-d '{
"input": "Write one sentence about API gateways."
}'
请求会被转发到已配置的某个 OpenAI 实例,并以 Responses API 格式返回响应。