跳到主要内容

a6-plugin-ai-proxy

概览

ai-proxy 插件将 Apache APISIX 变为 AI 网关。客户端可以将受支持协议的请求发送到 APISIX,而无需自行处理服务提供方身份认证和端点选择。插件会检测客户端协议、选择兼容的服务提供方端点,在适配器可用时转发原生格式或进行格式转换,并处理响应流式传输。

适用场景

  • 将 Chat Completions、Responses API、Embeddings、Anthropic Messages 或 Bedrock Converse 请求代理到兼容的服务提供方
  • 在网关集中管理 API Key,而不是将其分发给客户端
  • 为 LLM 调用增加可观测性,包括 Token 数和延迟
  • ai-prompt-templateai-prompt-decorator 或内容审核插件组合,构建完整的 AI 网关处理链

支持的服务提供方

服务提供方端点行为
OpenAIopenaihttps://api.openai.com 上自动选择 /v1/chat/completions/v1/responses/v1/embeddings
DeepSeekdeepseekhttps://api.deepseek.com/chat/completions
Azure OpenAIazure-openai通过 override.endpoint 自定义
Anthropicanthropichttps://api.anthropic.com 上自动选择 /v1/chat/completions/v1/messages
AIMLAPIaimlapihttps://api.aimlapi.com/v1/chat/completions
OpenRouteropenrouterhttps://openrouter.ai/api/v1/chat/completions
Geminigeminihttps://generativelanguage.googleapis.com/v1beta/openai/chat/completions
Vertex AIvertex-aihttps://aiplatform.googleapis.com
Amazon BedrockbedrockBedrock Runtime 的区域和模型专属端点
OpenAI 兼容openai-compatible通过 override.endpoint 自定义

插件配置参考

字段类型是否必填默认值说明
providerstring10 个受支持服务提供方之一
authobject认证配置(见下文)
optionsobject模型和生成参数
options.modelstring模型名称(提供方相关)
options.temperaturenumber采样温度
options.top_pnumber核采样
options.max_tokensinteger生成的最大 Token 数
options.streamboolean覆盖传出请求的 stream 字段;对于 Bedrock Converse,请在客户端请求中设置 stream: true
overrideobject服务提供方端点和请求体覆盖设置
override.endpointstring服务提供方的协议和主机,或包含路径及查询参数的完整 URL
provider_confobjectVertex AI 或 Amazon Bedrock 的服务提供方专属配置
provider_conf.project_idstringVertex AI 的 GCP 项目 ID;除非已配置 override.endpoint,否则必须与 region 一起提供
provider_conf.regionstringVertex AI 的 GCP 区域;Amazon Bedrock 的必填 AWS 区域
loggingobject日志选项
logging.summariesbooleanfalse记录模型、耗时和 Token
logging.payloadsbooleanfalse记录请求/响应体
timeoutinteger30000请求超时时间(毫秒)
keepalivebooleantrue保持连接
keepalive_timeoutinteger60000连接复用超时时间(毫秒)
keepalive_poolinteger30连接复用池大小
ssl_verifybooleantrue校验 SSL 证书

按服务提供方配置身份认证

OpenAI / DeepSeek / AIMLAPI / OpenRouter

{
"auth": {
"header": {
"Authorization": "Bearer sk-your-api-key"
}
}
}

Anthropic

{
"auth": {
"header": {
"x-api-key": "your-anthropic-api-key"
}
}
}

原生 Anthropic Messages 请求还需要 anthropic-version 请求头。请在 auth.header 中配置该请求头,或要求客户端发送它。

Azure OpenAI

{
"auth": {
"header": {
"api-key": "your-azure-key"
}
},
"override": {
"endpoint": "https://YOUR-RESOURCE.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2024-02-15-preview"
}
}

Gemini

{
"auth": {
"header": {
"Authorization": "Bearer your-gemini-key"
}
}
}

Vertex AI (GCP 服务账户)

{
"auth": {
"gcp": {
"service_account_json": "{ ... }",
"max_ttl": 3600,
"expire_early_secs": 60
}
},
"provider_conf": {
"project_id": "your-project-id",
"region": "us-central1"
}
}

service_account_json 也可以通过 GCP_SERVICE_ACCOUNT 环境变量设置。

Amazon Bedrock

{
"auth": {
"aws": {
"access_key_id": "your-access-key-id",
"secret_access_key": "your-secret-access-key",
"session_token": "your-session-token"
}
},
"provider_conf": {
"region": "us-east-1"
},
"options": {
"model": "your-model-id"
}
}

使用临时 AWS 凭证时必须提供会话令牌。

自定义 OpenAI 兼容 API

{
"auth": {
"header": {
"Authorization": "Bearer your-token"
}
},
"override": {
"endpoint": "https://your-custom-llm.com/v1/chat/completions"
}
}

分步操作:路由到 OpenAI

1. 创建启用 ai-proxy 的路由

a6 route create -f - <<'EOF'
{
"id": "openai-chat",
"uri": "/v1/chat/completions",
"methods": ["POST"],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": {
"header": {
"Authorization": "Bearer sk-your-openai-key"
}
},
"options": {
"model": "gpt-4",
"temperature": 0.7,
"max_tokens": 1024
}
}
}
}
EOF

2. 发出请求

curl "http://127.0.0.1:9080/v1/chat/completions" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is 1+1?"}
]
}'

网关添加身份认证信息并将请求转发到 OpenAI,客户端无需接触提供商 API Key。

常见模式

流式响应

{
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": {
"header": {
"Authorization": "Bearer sk-your-key"
}
},
"options": {
"model": "gpt-4",
"stream": true,
"stream_options": {
"include_usage": true
}
}
}
}
}

该路由强制所有请求使用流式传输,并要求 OpenAI 在最后一个服务器发送事件中包含 Token 用量。如需让客户端逐个请求选择,请从路由中省略这两个流式选项,只在需要流式传输的请求中发送 stream: true。对于在请求体中启用流式传输的 OpenAI Chat Completions 请求,APISIX 会自动添加 stream_options.include_usage: true

Azure OpenAI

{
"plugins": {
"ai-proxy": {
"provider": "azure-openai",
"auth": {
"header": {
"api-key": "your-azure-key"
}
},
"options": {
"model": "gpt-4"
},
"override": {
"endpoint": "https://myresource.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2024-02-15-preview"
},
"timeout": 60000
}
}
}

Embeddings 端点

a6 route create -f - <<'EOF'
{
"id": "embeddings",
"uri": "/v1/embeddings",
"methods": ["POST"],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": {
"header": {
"Authorization": "Bearer sk-your-key"
}
},
"options": {
"model": "text-embedding-3-small"
}
}
}
}
EOF

openai 服务提供方会检测 input 字段,并自动选择 https://api.openai.com/v1/embeddings

启用日志

{
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": {
"header": {
"Authorization": "Bearer sk-your-key"
}
},
"options": {
"model": "gpt-4"
},
"logging": {
"summaries": true,
"payloads": false
}
}
}
}

具有多条路由的模型路由

插件本身不会按模型路由。请创建多条路由,并使用 vars 匹配请求正文中的模型字段:

# Route requests for gpt-4 to OpenAI
a6 route create -f - <<'EOF'
{
"id": "openai-gpt4",
"uri": "/v1/chat/completions",
"methods": ["POST"],
"vars": [["post_arg.model", "==", "gpt-4"]],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer sk-openai-key" } },
"options": { "model": "gpt-4" }
}
}
}
EOF

# Route requests for deepseek-chat to DeepSeek
a6 route create -f - <<'EOF'
{
"id": "deepseek-chat",
"uri": "/v1/chat/completions",
"methods": ["POST"],
"vars": [["post_arg.model", "==", "deepseek-chat"]],
"plugins": {
"ai-proxy": {
"provider": "deepseek",
"auth": { "header": { "Authorization": "Bearer sk-deepseek-key" } },
"options": { "model": "deepseek-chat" }
}
}
}
EOF

使用ai-proxy-multi进行负载平衡

对于跨提供商的负载平衡、故障转移和基于优先级的路由, 改用ai-proxy-multi

{
"plugins": {
"ai-proxy-multi": {
"balancer": {
"algorithm": "roundrobin"
},
"fallback_strategy": ["rate_limiting", "http_429", "http_5xx"],
"instances": [
{
"name": "openai-primary",
"provider": "openai",
"priority": 1,
"weight": 8,
"auth": {
"header": { "Authorization": "Bearer sk-openai-key" }
},
"options": { "model": "gpt-4" }
},
{
"name": "deepseek-backup",
"provider": "deepseek",
"priority": 0,
"weight": 2,
"auth": {
"header": { "Authorization": "Bearer sk-deepseek-key" }
},
"options": { "model": "deepseek-chat" }
}
]
}
}
}

访问日志变量

变量说明
$request_typetraditional_httpai_chatai_stream
$llm_time_to_first_token首个 Token 返回耗时(毫秒)
$llm_model提供方实际使用的模型
$request_llm_model客户端请求的模型
$llm_prompt_tokens提示词 Token 数量
$llm_completion_tokens补全 Token 数量

配置同步示例

version: "1"
routes:
- id: openai-chat
uri: /v1/chat/completions
methods:
- POST
plugins:
ai-proxy:
provider: openai
auth:
header:
Authorization: Bearer sk-your-openai-key
options:
model: gpt-4
max_tokens: 1024
temperature: 0.7
logging:
summaries: true

故障排查

症状原因解决方法
502 Bad Gateway端点或提供商配置错误确认 provider 与目标 API 一致;使用 Azure 或自定义端点时检查 override.endpoint
上游返回 401API Key 无效检查 auth.header,并确认密钥对该提供商有效
请求超时LLM 响应缓慢增大 timeout(默认 30,000 毫秒),或使用流式响应
流式响应中没有 Token 用量上游数据流未包含用量数据确认服务提供方和模型会返回流式用量;APISIX 会为 OpenAI Chat Completions 自动请求该数据
Azure 返回 404URL 缺少 API 版本override.endpoint 中加入 ?api-version=YYYY-MM-DD-preview
Vertex AI 认证失败服务账号 JSON 无效通过 auth.gcp.service_account_jsonGCP_SERVICE_ACCOUNT 环境变量配置

本文根据 api7/a6 仓库中的 a6-plugin-ai-proxy/SKILL.md 生成。可在 AI Agent Skills 页面浏览全部 Skill。