ai-proxy-multi
ai-proxy-multi 插件在 OpenAI、DeepSeek、Gemini、Gemini Enterprise Agent Platform 以及其他兼容的模型服务提供方实例 之间分发 LLM 和嵌入请求,并提供负载均衡、重试、故障转移和健康检查功能。
插件会将请求直接发送到所选实例的端点,无需配置上游。即使路由或服务已配置上游,插件也会绕过该上游,因此上游的健康状态不会影响这些请求。
转发请求前,插件会根据请求 URI 和请求体识别客户端协议。当客户端使用 Anthropic Messages,而所选实例的服务提供方支持 OpenAI Chat Completions 而非原生 Anthropic Messages 时,插件会执行协议转换:将客户端请求转换为 OpenAI 格式,并将后端响应转换为 Anthropic 格式。该转换只支持 Anthropic Messages 的一部分功能。有关检测规则、字段映射、版本边界和限制,请参阅协议参考。
该插件还可以在访问日志而非错误日志中记录 LLM 请求信息,包括 Token 用量、模型和首字节响应时间。日志插件可以采集这些条目。
演示
演示展示了如何在 API7 企业版控制台中配置实例优先级和限流。示例为两个模型分配不同的优先级,并对高优先级实例进行限流。当该实例耗尽配额,且 fallback_strategy 为 ["rate_limiting"] 时,请求会继续转发到低优先级实例。
示例
以下示例展示如何针对常见的路由和弹性场景配置 ai-proxy-multi。
请为每个实例设置唯一名称,即使实例的优先级不同。重命名实例时,还需更新对应的 AI 速率限制条目和语义后备引用。
实例间负载均衡
本示例按 80:20 的比例在两个模型之间分发流量。如果第一次尝试在两秒内返回 429 或 5xx,插件会在另一个实例上重试一次。max_retries 和 retry_on_failure_within_ms 字段在 API7 企业版 3.9.14 和 APISIX 3.17.0 中引入。
该示例使用 OpenAI 和 DeepSeek 实例,以便清楚区分所选的上游。
创建路由,并按需替换模型服务提供方相关的值:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<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.1-mini"
}
},
{
"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-load-balancing-service
labels:
docs-example: ai-proxy-multi-load-balancing
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.1-mini
- name: deepseek-instance
provider: deepseek
weight: 2
auth:
header:
Authorization: Bearer ${DEEPSEEK_API_KEY}
options:
model: deepseek-chat
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
同步这些服务前,请检查差异中是否有非预期的更改或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-load-balancing
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-load-balancing
❶ 将 openai-instance 的权重配置为 8。
❷ 将 deepseek-instance 的权重配置为 2。
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
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 <OPENAI_API_KEY>"
options:
model: gpt-4.1-mini
- name: deepseek-instance
provider: deepseek
weight: 2
auth:
header:
Authorization: "Bearer <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
backendRefs:
- name: httpbin-external-domain
port: 80
将配置应用到集群:
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 <OPENAI_API_KEY>"
options:
model: gpt-4.1-mini
- name: deepseek-instance
provider: deepseek
weight: 2
auth:
header:
Authorization: "Bearer <DEEPSEEK_API_KEY>"
options:
model: deepseek-chat
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
❶ 将 openai-instance 的权重配置为 8。
❷ 将 deepseek-instance 的权重配置为 2。
ADC 和 Gateway API 标签页包含一个常规后端。当插件自行处理请求时,不会访问该后端。请验证下文中插件特有的结果;仅收到后端响应并不能证明插件已运行。
使用系统提示词和示例用户问题发送 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}" \
-d @- <<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-responses-service
labels:
docs-example: ai-proxy-multi-responses
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
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
同步这些服务前,请检查差异中是否有非预期的更改或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-responses
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-responses
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
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
backendRefs:
- name: httpbin-external-domain
port: 80
将配置应用到集群:
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 格式返回响应。
按语义相似度路由
semantic 负载均衡算法通过比较请求提示词与分配给各实例的示例语句来选择实例。此功能自 API7 企业版 3.9.18 和 3.10.5 以及 APISIX 3.18.0 起可用。
导出向量嵌入请求和 LLM 请求所需的 API Key:
export EMBEDDING_API_KEY="<YOUR_EMBEDDING_API_KEY>"
export LLM_API_KEY="<YOUR_LLM_API_KEY>"
创建一条路由,分别配置适用于编程、翻译和通用提示词的实例。当所有得分均未达到配置的阈值,或向量嵌入请求失败时,也会使用通用实例作为后备实例:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "ai-proxy-multi-semantic-route",
"uri": "/anything",
"methods": ["POST"],
"plugins": {
"ai-proxy-multi": {
"balancer": {
"algorithm": "semantic"
},
"semantic_opts": {
"embeddings": {
"provider": "openai",
"model": "text-embedding-3-small",
"auth": {
"header": {
"Authorization": "Bearer $EMBEDDING_API_KEY"
}
}
},
"threshold": 0.5,
"fallback": "default",
"debugging": true
},
"instances": [
{
"name": "code",
"provider": "openai",
"weight": 1,
"auth": {
"header": {
"Authorization": "Bearer $LLM_API_KEY"
}
},
"options": {
"model": "gpt-4o"
},
"examples": [
"write a Python function",
"debug this code"
]
},
{
"name": "translate",
"provider": "openai",
"weight": 1,
"auth": {
"header": {
"Authorization": "Bearer $LLM_API_KEY"
}
},
"options": {
"model": "gpt-4o-mini"
},
"examples": [
"translate this sentence into English"
]
},
{
"name": "default",
"provider": "openai",
"weight": 1,
"auth": {
"header": {
"Authorization": "Bearer $LLM_API_KEY"
}
},
"options": {
"model": "gpt-4o-mini"
},
"examples": [
"what is the weather today",
"tell me a joke"
]
}
]
}
}
}
EOF
发送一个编程请求:
curl -i "http://127.0.0.1:9080/anything" -X POST \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "Help me debug this Python code"
}
]
}'
你应该会收到 HTTP/1.1 200 OK。响应头会显示选中的实例以及用于决策的得分:
X-AI-Semantic-Picked-Instance: code
X-AI-Semantic-Scores: code:0.8213,default:0.2451,translate:0.1904
得分取决于向量嵌入模型和示例语句。你可以据此选择一个阈值,将应按相似度路由的提示词与应使用 后备实例的提示词区分开。后备实例仍然需要配置 examples,因为它也会参与常规语义排序。
启用语义选择时,不会使用已配置的健康检查设置,且发生上游失败后不会重试。因此,fallback_strategy、fallback_http_statuses 和 max_retries 不会影响语义选择。选中实例的上游失败会直接返回给客户端。只有在没有实例达到阈值或向量嵌入请求失败时,才会使用语义后备实例。
调试响应头会暴露实例名称和得分。调优完成后,请禁用 semantic_opts.debugging,并在生产环境中使用为后备决策输出的 warning 日志。
在 Gemini API 和 Agent Platform 之间进行负载均衡
本示例在 Google AI Studio 中的 Gemini API 与 Gemini Enterprise Agent Platform(此前文档称为 Vertex AI)之间,对兼容 OpenAI Chat Completions 格式的请求进行负载均衡。实例权重会将大约 70% 的请求发送到 Google AI Studio,将 30% 的请求发送到 Agent Platform。第二个实例已发布的模型服务提供方标识符仍为 vertex-ai。API7 企业版 3.9.2 和 APISIX 3.15.0 开始支持此模型服务提供方。
在继续之前:
- 对于 Google AI Studio Gemini,请获取 Gemini API 密钥。
- 对于 Agent Platform,请按照 Agent Platform 设置说明启用结算和 Agent Platform API。创建服务账号,授予 Agent Platform User(
roles/aiplatform.user)角色,并创建 JSON 格式的服务账号密钥。插件必须使用下载的密钥,不会发现应用默认凭证(Application Default Credentials,ADC)或 Workload Identity Federation 凭证。
分别保存 API 密钥、供 ADC 示例使用的原始服务账号 JSON,以及供 Admin API 示例使用的 JSON 编码字符串:
export GEMINI_API_KEY="<GEMINI_API_KEY>"
export GCP_SA_JSON="$(cat credentials.json)"
export GCP_SA_JSON_STRING="$(jq -Rs . < credentials.json)"
创建路由,并替换项目相关的值:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "ai-proxy-multi-google-ai-route",
"uri": "/anything",
"methods": ["POST"],
"plugins": {
"ai-proxy-multi": {
"fallback_strategy": ["rate_limiting"],
"instances": [
{
"name": "gemini-instance",
"provider": "gemini",
"weight": 7,
"auth": {
"header": {
"Authorization": "Bearer $GEMINI_API_KEY"
}
},
"options": {
"model": "gemini-3.5-flash"
}
},
{
"name": "vertex-ai-instance",
"provider": "vertex-ai",
"weight": 3,
"auth": {
"gcp": {
"service_account_json": $GCP_SA_JSON_STRING
}
},
"override": {
"endpoint": "https://aiplatform.googleapis.com/v1beta1/projects/<GCP_PROJECT_ID>/locations/global/endpoints/openapi/chat/completions"
},
"options": {
"model": "google/gemini-3.5-flash"
}
}
]
}
}
}
EOF
❶ 将提供商配置为 gemini,以访问 Google AI Studio Gemini。
❷ 在 Authorization 请求头中替换为你的 Gemini API Key。
❸ 以 <model> 格式指定通过 Google AI Studio 使用的 Gemini 模型名称。
❹ 将模型服务提供方配置为 vertex-ai,以访问 Agent Platform。
❺ 以 JSON 字符串形式提供服务账号凭据。
❻ 将文档所述全局 Chat Completions 端点中的 <GCP_PROJECT_ID> 替换为你的项目 ID。
❼ 指定支持全局端点 Chat Completions 的 Agent Platform 模型。示例使用 google/gemini-3.5-flash,该模型支持 global 上默认的 Standard PayGo 消费模式。
services:
- name: ai-proxy-multi-google-service
labels:
docs-example: ai-proxy-multi-google
routes:
- name: ai-proxy-multi-route
uris:
- /anything
methods:
- POST
plugins:
ai-proxy-multi:
fallback_strategy:
- rate_limiting
instances:
- name: gemini-instance
provider: gemini
weight: 7
auth:
header:
Authorization: Bearer ${GEMINI_API_KEY}
options:
model: gemini-3.5-flash
- name: vertex-ai-instance
provider: vertex-ai
weight: 3
auth:
gcp:
service_account_json: ${GCP_SA_JSON}
override:
endpoint: https://aiplatform.googleapis.com/v1beta1/projects/<GCP_PROJECT_ID>/locations/global/endpoints/openapi/chat/completions
options:
model: google/gemini-3.5-flash
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
同步这些服务前,请检查差异中是否有非预期的更改或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-google
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-google
❶ 将提供商配置为 gemini,以访问 Google AI Studio Gemini。
❷ 在 Authorization 请求头中替换为你的 Gemini API Key。
❸ 以 <model> 格式指定通过 Google AI Studio 使用的 Gemini 模型名称。
❹ 将模型服务提供方配置为 vertex-ai,以访问 Agent Platform。
❺ 以 JSON 字符串形式提供服务账号凭据。
❻ 将文档所述全局 Chat Completions 端点中的 <GCP_PROJECT_ID> 替换为你的项目 ID。
❼ 指定支持全局端点 Chat Completions 的 Agent Platform 模型。示例使用 google/gemini-3.5-flash,该模型支持 global 上默认的 Standard PayGo 消费模式。
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
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:
- rate_limiting
instances:
- name: gemini-instance
provider: gemini
weight: 7
auth:
header:
Authorization: "Bearer <GEMINI_API_KEY>"
options:
model: gemini-3.5-flash
- name: vertex-ai-instance
provider: vertex-ai
weight: 3
auth:
gcp:
service_account_json: '{"type":"service_account","project_id":"<GCP_PROJECT_ID>","private_key_id":"...","private_key":"-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----","client_email":"<SERVICE_ACCOUNT_EMAIL>","client_id":"...","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/<URL_ENCODED_SERVICE_ACCOUNT_EMAIL>","universe_domain":"googleapis.com"}'
override:
endpoint: https://aiplatform.googleapis.com/v1beta1/projects/<GCP_PROJECT_ID>/locations/global/endpoints/openapi/chat/completions
options:
model: google/gemini-3.5-flash
---
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
backendRefs:
- name: httpbin-external-domain
port: 80
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
❶ 将提供商配置为 gemini,以访问 Google AI Studio Gemini。
❷ 在 Authorization 请求头中替换为你的 Gemini API Key。
❸ 以 <model> 格式指定通过 Google AI Studio 使用的 Gemini 模型名称。
❹ 将模型服务提供方配置为 vertex-ai,以访问 Agent Platform。
❺ 以 JSON 字符串形式提供服务账号凭据。
❻ 将文档所述全局 Chat Completions 端点中的 <GCP_PROJECT_ID> 替换为你的项目 ID。
❼ 指定支持全局端点 Chat Completions 的 Agent Platform 模型。示例使用 google/gemini-3.5-flash,该模型支持 global 上默认的 Standard PayGo 消费模式。
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:
- rate_limiting
instances:
- name: gemini-instance
provider: gemini
weight: 7
auth:
header:
Authorization: "Bearer <GEMINI_API_KEY>"
options:
model: gemini-3.5-flash
- name: vertex-ai-instance
provider: vertex-ai
weight: 3
auth:
gcp:
service_account_json: '{"type":"service_account","project_id":"<GCP_PROJECT_ID>","private_key_id":"...","private_key":"-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----","client_email":"<SERVICE_ACCOUNT_EMAIL>","client_id":"...","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/<URL_ENCODED_SERVICE_ACCOUNT_EMAIL>","universe_domain":"googleapis.com"}'
override:
endpoint: https://aiplatform.googleapis.com/v1beta1/projects/<GCP_PROJECT_ID>/locations/global/endpoints/openapi/chat/completions
options:
model: google/gemini-3.5-flash
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
❶ 将提供商配置为 gemini,以访问 Google AI Studio Gemini。
❷ 在 Authorization 请求头中替换为你的 Gemini API Key。
❸ 以 <model> 格式指定通过 Google AI Studio 使用的 Gemini 模型名称。
❹ 将模型服务提供方配置为 vertex-ai,以访问 Agent Platform。
❺ 以 JSON 字符串形式提供服务账号凭据。
❻ 将文档所述全局 Chat Completions 端点中的 <GCP_PROJECT_ID> 替换为你的项目 ID。
❼ 指定支持全局端点 Chat Completions 的 Agent Platform 模型。示例使用 google/gemini-3.5-flash,该模型支持 global 上默认的 Standard PayGo 消费模式。
向该路由发送 10 个 POST 请求,以查看负载均衡分布:
studio_count=0
vertex_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" == "gemini-3.5-flash" ]]; then
((studio_count++))
elif [[ "$model" == "google/gemini-3.5-flash" ]]; then
((vertex_count++))
fi
done
echo "Google AI Studio Gemini responses: $studio_count"
echo "Agent Platform responses: $vertex_count"
你应该看到类似于以下的响应:
Google AI Studio Gemini responses: 7
Agent Platform responses: 3
配置实例优先级和速率限制
本示例为两个模型分配不同的优先级,并对高优先级实例进行限流。当 fallback_strategy 设置为 ["rate_limiting"] 时,高优先级实例耗尽配额后,请求会转发到低优先级实例。
创建路由,并按需替换模型服务提供方相关的值:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "ai-proxy-multi-route",
"uri": "/anything",
"methods": ["POST"],
"plugins": {
"ai-proxy-multi": {
"fallback_strategy": ["rate_limiting"],
"instances": [
{
"name": "openai-instance",
"provider": "openai",
"priority": 1,
"weight": 0,
"auth": {
"header": {
"Authorization": "Bearer $OPENAI_API_KEY"
}
},
"options": {
"model": "gpt-4.1-mini"
}
},
{
"name": "deepseek-instance",
"provider": "deepseek",
"priority": 0,
"weight": 0,
"auth": {
"header": {
"Authorization": "Bearer $DEEPSEEK_API_KEY"
}
},
"options": {
"model": "deepseek-chat"
}
}
]
},
"ai-rate-limiting": {
"instances": [
{
"name": "openai-instance",
"limit": 10,
"time_window": 60
}
],
"limit_strategy": "total_tokens"
}
}
}
EOF
❶ 将 fallback_strategy 设置为 ["rate_limiting"]。
❷ 为 openai-instance 设置较高的优先级。
❸ 为 deepseek-instance 设置较低的优先级。
❹ 配置 10 个 Token 的配额。
❺ 将时间窗口配置为 60 秒。
❻ 将 limit_strategy 配置为 total_tokens。
services:
- name: ai-proxy-multi-priority-service
labels:
docs-example: ai-proxy-multi-priority
routes:
- name: ai-proxy-multi-route
uris:
- /anything
methods:
- POST
plugins:
ai-proxy-multi:
fallback_strategy:
- rate_limiting
instances:
- name: openai-instance
provider: openai
priority: 1
weight: 0
auth:
header:
Authorization: Bearer ${OPENAI_API_KEY}
options:
model: gpt-4.1-mini
- name: deepseek-instance
provider: deepseek
priority: 0
weight: 0
auth:
header:
Authorization: Bearer ${DEEPSEEK_API_KEY}
options:
model: deepseek-chat
ai-rate-limiting:
policy: local
instances:
- name: openai-instance
limit: 10
time_window: 60
limit_strategy: total_tokens
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
同步这些服务前,请检查差异中是否有非预期的更改或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-priority
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=ai-proxy-multi-priority
❶ 将 fallback_strategy 设置为 ["rate_limiting"]。
❷ 为 openai-instance 设置较高的优先级。
❸ 为 deepseek-instance 设置较低的优先级。
❹ 配置 10 个 Token 的配额。
❺ 将时间窗口配置为 60 秒。
❻ 将 limit_strategy 配置为 total_tokens。
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
name: httpbin-external-domain
namespace: aic
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
protocol: TCP
---
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:
- rate_limiting
instances:
- name: openai-instance
provider: openai
priority: 1
weight: 0
auth:
header:
Authorization: "Bearer <OPENAI_API_KEY>"
options:
model: gpt-4.1-mini
- name: deepseek-instance
provider: deepseek
priority: 0
weight: 0
auth:
header:
Authorization: "Bearer <DEEPSEEK_API_KEY>"
options:
model: deepseek-chat
- name: ai-rate-limiting
config:
policy: local
instances:
- name: openai-instance
limit: 10
time_window: 60
limit_strategy: total_tokens
---
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
backendRefs:
- name: httpbin-external-domain
port: 80
将配置应用到集群:
kubectl apply -f ai-proxy-multi-ic.yaml
❶ 将 fallback_strategy 设置为 ["rate_limiting"]。
❷ 为 openai-instance 设置较高的优先级。
❸ 为 deepseek-instance 设置较低的优先级。