上游请求头
在 /v1/chat/completions、/v1/messages 和 /v1/responses 等标准协议端点上,AISIX 会从头构建上游请求。它选择上游凭证、重写模型名称,并且只发送服务提供方协议要求的请求头。调用方发送的请求头不会转发,因此调用方不能使用自己的凭证或 Trace 上下文访问上游服务提供方。
当上游需要更多上下文时,可以通过两个服务提供方密钥设置扩展默认行为:
request.default_headers添加由 AISIX 生成的请求头,其值可以引用当前请求,例如调用方 API Key 所属团队。request.forward_client_headers将指定的入站客户端请求头(例如anthropic-beta或 Trace 请求头)转发到上游。
这两项设置都位于服务提供方密钥上,因此引用该密钥的每个模型都会继承它们。
本指南的主要示例使用 AISIX Cloud。对于开源 AISIX 网关,请在 resources.yaml 的 provider_keys 下使用相同字段。
前置条 件
开始前请准备:
- 上游服务提供方凭证和端点。示例会围绕它们创建服务提供方密钥;该资源的其他字段参见服务提供方密钥。
- 对于 AISIX Cloud,需要环境、已关联网关和具有写入权限的 Admin Token。对于 On-Premises 部署,请按照 AISIX Cloud 快速入门操作。如需申请 Hybrid Cloud 访问权限,请联系 API7。
- 对于开源 AISIX 网关,需要一个加载声明式资源文件的网关。
导出 AISIX Cloud 连接信息和示例使用的值:
# AISIX_CP 是 Admin API 基础 URL;请包含 /api,且不要以斜杠结尾。
# 本地 On-Premises 快速入门使用 http://localhost:8080/api。
export AISIX_CP="YOUR_AISIX_CLOUD_ADMIN_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
export UPSTREAM_API_KEY="YOUR_UPSTREAM_API_KEY"
# AISIX_PROXY 是网关源地址;请不要包含末尾斜杠和端点路径。
# 本地快速入门使用 http://127.0.0.1:3000。
export AISIX_PROXY="YOUR_AISIX_GATEWAY_ORIGIN"
# 第一个示例创建密钥后设置,供更新示例使用。
export PK_ID="YOUR_PROVIDER_KEY_ID"
# 允许访问引用该服务提供方密钥的模型的调用方 API Key,
# 以及该模型的别名——用于文末的验证请求。
export AISIX_API_KEY="YOUR_CALLER_API_KEY"
export MODEL_ALIAS="YOUR_MODEL_ALIAS"
注入请求上下文请求头
当上游需要知道调用者身份时,使用 request.default_headers。内部模型服务可以据此应用租户配额、把成本归属到团队,或将自身访问日志与 AISIX 请求 ID 关联,而且无需为每个租户准备单独的上游凭证。
请求头值通常是字面字符串;如果包含 ${...} 引用,AISIX 会在认证调用方并选择模型后,按请求解析该引用:
curl -sS -X POST "$AISIX_CP/provider_keys" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"display_name": "internal-vllm",
"provider": "byo",
"adapter": "openai",
"api_key": "'"${UPSTREAM_API_KEY}"'",
"api_base": "https://models.internal.example.com/v1",
"allowed_environments": ["'"${ENV_ID}"'"],
"request": {
"default_headers": {
"x-tenant-id": "${request.api_key.team_id}",
"x-cost-center": "${request.api_key.name}",
"x-correlation-id": "${request.id}",
"x-upstream-tier": "premium"
}
}
}'
❶ 调用方 API Key 所属团队,可作为上游配额或路由决策的租户标识符。
❷ 控制台中显示的调用方 API Key 名称。
❸ 当前请求的关联 ID,与 AISIX 在 x-aisix-request-id 中发送并写入自身日志的值相同。
❹ 字面值,每个请求都会原样发送。
可用变量
| 变量 | 值 |
|---|---|
request.id | 当前请求的关联 ID。 |
request.api_key.id | 调用方 API Key 的标识符。 |
request.api_key.name | 调用方 API Key 的名称。 |
request.api_key.team_id | 调用方 API Key 所属团队。 |
request.api_key.user_id | 拥有调用方 API Key 的组织成员。 |
model.id | 解析后模型的标识符。 |
model.name | 解析后模型面向调用方的名称,而不是上游模型名称。 |
provider_key.id | 当前服务提供方密钥的标识符。 |
provider_key.name | 当前服务提供方密钥的名称。 |
只有这些变量可以解析。保存服务提供方密钥时,如果值引用了其他名称,AISIX Cloud Admin API 会拒绝该值,使拼写错误立即失败,而不是变成一个永远无法到达上游的请求头。在资源文件中,相同形式还用于环境变量插值,参见在资源文件中配置。
所有变量都不会暴露密钥。调用方 API Key、上游凭证和签名材料都不属于请求头值可以读取的请求上下文。
如果请求头引用的变量在某次请求中并非都有值,AISIX 会从该请求中删除整个请求头,而不是发送空值。如果调用方 API Key 不属于任何团队,上述示例的请求会包含 x-cost-center 和 x-correlation-id,但不会包含 x-tenant-id。空的 x-tenant-id 会让上游误以为租户是空字符串。