服务提供方兼容性
服务提供方兼容性同时取决于面向调用方的端点和模型别名背后的上游服务提供方配置。一个模型可以在通用聊天端点正常工作,但仍会被某个服务提供方专属端点拒绝。
AISIX 从两个层面判断兼容性。适配器协议族决定如何为上游服务提供方编码聊天类请求。端点规则决定所选代理路由是否接受模型的服务提供方或适配器协议族。
端点兼容性
请根据调用方 API 格式和服务提供方支持要求选择代理路由。
| 需求 | 路由 | 服务提供方支持 |
|---|---|---|
| 广泛聊天兼容性 | /v1/chat/completions | OpenAI、Anthropic、Bedrock、Vertex AI、Azure OpenAI,以及通过已配置适配器接入的 OpenAI 兼容服务提供方。 |
| 文本补全 | /v1/completions | 模型的服务提供方密钥使用 openai 适配器,且已配置的上游实现旧版 /completions 路由时可用。其他适配器返回 501 not_implemented。 |
| Anthropic 风格客户端 | /v1/messages | 使用 anthropic 适配器或声明 apis.messages 的服务提供方密钥,以及 Amazon Bedrock 和 Vertex AI 上的 Claude 模型会原生转发;其他受支持的上游使用转换。文本支持范围最广。图片、文档和工具调用支持取决于所选服务提供方适配器。签名的思考历史仍为 Anthropic 专属。 |
| Anthropic Token 计数 | /v1/messages/count_tokens | 目标服务提供方密钥使用 anthropic 适配器或声明 apis.messages(上游必须实现 Token 计数路由),或目标是 Amazon Bedrock 和 Vertex AI 上的 Claude 模型(使用平台自己的 Token 计数 API)。 |
| 流式文本聊 天 | 带 stream: true 的 /v1/chat/completions 或 /v1/messages | 服务提供方支持范围与所选端点一致。路由模型可以在 AISIX 发送响应字节之前执行故障转移,但响应流开始后不能切换目标。Chat Completions 音频输出是例外:AISIX 目前不会保留 delta.audio。 |
| 向量嵌入 | /v1/embeddings | 支持 OpenAI 兼容上游、Bedrock 上的 Amazon Titan 和 Cohere 向量嵌入模型,以及 Vertex AI 上的 Google 发布方向量嵌入模型。其他服务提供方和模型组合返回 501 not_implemented。 |
| OpenAI Responses API | /v1/responses | 声明 apis.responses 的服务提供方密钥,以及未配置 apis 声明的 OpenAI 密钥,会原生转发。其他上游在服务提供方适配器支持转换后的请求形态时使用 Responses 桥接。桥接路径会忽略没有 Chat 等价项的 OpenAI 专属字段。 |
| 聊天音频 | /v1/chat/completions | 当上游实现 OpenAI 聊天音频形态时,可通过 openai 或 azure-openai 适配器进行流式或非流式的音频输入和输出。每个符合条件的路由目标都必须满足相同要求。AISIX 会保留 input_audio、modalities、audio、message.audio 和流式 delta.audio。原生服务提供方在支持音频时会以自己的媒体块接收 input_audio 部分,音频输出字段不会跨服务提供方协议转换。 |
| 图片生成 | /v1/images/generations | 已配置服务提供方为 OpenAI 的模型。 |
| 图像编辑 | /v1/images/edits | 已配置服务提供方为 OpenAI 的模型。请求为 multipart/form-data;网关只改写 model 字段,其余表单内容原样转发。 |
| 视频生成 | /v1/videos 及其状态和内容路由 | 已配置服务提供方为 alibaba(Wan)、zhipuai 或 zhipu(CogVideoX)、volcengine(Ark Seedance)、runwayml 或 runway(Runway Gen 系列及由 Runway 托管的模型)、openai(Sora)的模型。仅支持文生视频。其他服务提供方返回 501 not_implemented。参见视频生成支持。 |
| 音频 | /v1/audio/transcriptions、/v1/audio/translations、/v1/audio/speech | OpenAI 风格上游音频路由。AISIX 会转发音频格式,不会在不同服务提供方协议族之间转换音频。 |
| 文件、批处理和微调 | /v1/files、/v1/batches、/v1/fine_tuning/jobs 及其相关路由 | 服务提供方密钥使用 openai 或 azure-openai 适配器的直接模型。Anthropic、Bedrock 和 Vertex AI 使用不同的文件和任务 API,不会通过这些路由进行转换。 |
| Realtime WebSocket | /v1/realtime | 使用 openai 或 azure-openai 适配器的直接模型。上游必须实现 OpenAI Realtime WebSocket 路径和事件协议;AISIX 会中继 Frame,不执行跨协议转换。 |
| Rerank | /v1/rerank | 支持 Cohere 和 Jina,或使用 openai 服务提供方值且实现 /v1/rerank 的 OpenAI 兼容上游。公开 OpenAI API 不提供此端点。 |
| 决策模型 | /v1/systemone、/v1/decisions | provider 为 typesafe(TypeSafe)、azure(Microsoft Foundry)、openai 或 openrouter 的服务提供方密钥。两个端点都可以访问其中任一上游;当调用方的格式与上游不同时,AISIX 会在 System One 与 Decisions 格式之间转换。其他服务提供方返回 400。 |
| 服务提供方原生路由 | 已配置的透传路由,按约定为 /passthrough/<provider>/*rest | 路由 target_url 指向的任意上游。请求需匹配路由配置的路径前缀或入站 host,且调用方 Key 必须在 allowed_routes 列表中授予路由名称。网关标准化有限。 |
视频生成支持
视频路由按模型别名自身的 provider 值分发,而不是按上游模型名称;AISIX 不维护模型 ID 允许列表,只会把别名中配置的上游模型名称按下表的固定映射转发出去,能否生成成功仍取决于该模型是否接受转发后的请求形态。这些路由接受直连别名和多目标模型;合议模型或语义路由别名会返回 400。交付方式描述 GET /v1/videos/{video_id}/content 如何返回成品文件:302 重定向到服务提供方的签名 URL,或由网关带凭证获取后再流式转发给调用方。
provider 值 | 视频模型 | seconds 映射为 | size 映射为 | 交付方式 |
|---|---|---|---|---|
alibaba | Wan 和 HappyHorse 文生视频,例如 wan2.7-t2v、wan2.2-t2v-plus 和 happyhorse-1.1-t2v | parameters.duration | parameters.size,格式为 WIDTH*HEIGHT;Wan 2.7 和 HappyHorse 改用 resolution 和 ratio 档位,请省略该字段 | 重定向 |
zhipuai、zhipu | CogVideoX,例如 cogvideox-3 | duration | size,原样转发 | 重定向 |
volcengine | Ark Seedance,例如 doubao-seedance-2-0-260128 | duration | 校验后丢弃;Ark 使用 resolution 和 ratio 档位 | 重定向 |
runwayml、runway | 文生视频端点上的 Runway Gen 系列和由 Runway 托管的模型,例如 gen4.5 和 veo3.1 | duration | ratio,格式为 WIDTH:HEIGHT | 重定向 |
openai | Sora:sora-2、sora-2-pro | seconds,以字符串形式发送,schema 接受 4、8 或 12 | size,原样转发;各模型接受的分辨率范围不同 | 网关流式传输 |
OpenAI 已于 2026 年 3 月 24 日弃用 Videos API 和 Sora 2 系列模型,并将于 2026 年 9 月 24 日将其从 API 中移除。
有两个 provider 值虽然其厂商发布了视频 API,但不在该允许列表内:alibaba-cn 和 zai 访问的 API 根路径与各自支持视频的对应值不同,因此视频别名必须使用 alibaba 或 zhipuai。
这些路由只建模文生视频。除 model、prompt、seconds 和 size 之外的请求字段会被忽略而不是拒绝,其中包括 input_reference,因此图生视频请求只会依据提示词生成。服务提供方用于列出、删除、混剪、编辑或延长视频的路由同样未建模。这些能力以及负向提示词、随机种子等服务提供方原生生成字段,请使用透传路由。
服务提供方专属支持
聊天和 Responses 路由支持流式文本输出。在兼容 OpenAI 的上游上,Chat Completions 中的音频输出以 delta.audio 流式返回;如需增量双向音频,请使用 Realtime WebSocket。下表说明额外端点支持和重要的服务提供方边界。
| 服务提供方配置 | 端点支持和边界 |
|---|---|
| OpenAI | 支持 Chat Completions、Responses、向量嵌入、图片生成、图像编辑、音频和 Sora 视频生成。公开 OpenAI API 不提供 Rerank 端点。 |
| Anthropic | 原生支持 Messages 和 Token 计数。Chat Completions 和 Responses 使用转换。不支持向量嵌入、图片生成和 Rerank。 |
| Amazon Bedrock | 支持 Chat Completions 和 Responses。Claude 模型还原生支持 /v1/messages 和 /v1/messages/count_tokens。向量嵌入仅限 Amazon Titan 和 Cohere 向量嵌入模型 ID。不支持图片生成和 Rerank。 |
| Google Vertex AI | 支持 Chat Completions 和 Responses。Claude 模型还原生支持 /v1/messages 和 /v1/messages/count_tokens。向量嵌入仅限 Google 发布方模型。不支持图片生成和 Rerank。 |
| Azure OpenAI | 支持 Chat Completions 和 Responses。Azure OpenAI 适配器未实现向量嵌入、图片生成或 Rerank。 |
| DeepSeek | 支持 Chat Completions。AISIX Cloud 会在目录中声明 DeepSeek 的原生 Responses 和兼容 Anthropic 的 Messages 路由;开源网关可在服务提供方密钥上声明相同路由。不支持图片生成和 Rerank。 |
| Gemini 和 Mistral | 支持 Chat Completions 和桥接的 Responses 请求。不支持图片生成和 Rerank。 |
| Groq | 当服务提供方密钥声明 apis.responses 时,支持 Chat Completions 和原生 Responses API。如果没有此声明,AISIX 会通过 Chat Completions 桥接 Responses。不支持图片生成和 Rerank。 |
| Together AI | 通过兼容 OpenAI 的基础地址支持 Chat Completions、桥接的 Responses、Embedding、音频转录、音频翻译和文本转语音。togetherai 服务提供方值不支持规范化图片生成、视频生成和 Rerank;这些 Together 原生路由请使用透传路由。 |
| Qwen | 通过 Model Studio 兼容 OpenAI 的基础地址支持 Chat Completions、服务提供方密钥声明 apis.responses 时的原生 Responses,以及 Embedding。如果没有此声明,AISIX 会通过 Chat Completions 桥接 Responses。原生 Messages 使用另一个地区 Base,且 Model Studio 未提供 Count Tokens 文档。仅服务提供方值恰好为 alibaba 时支持视频生成;alibaba-cn 不在视频路由允许列表中。规范化路由不支持图片生成和 Rerank。 |
| OpenRouter 和 Fireworks AI | 支持 Chat Completions、在服务提供方密钥声明 apis.responses 时支持各自的原生 Responses API,以及向量嵌入(当别名指向上游在其 OpenAI 兼容基础地址上发布的向量嵌入模型时)。如果没有此声明,AISIX 会通过 Chat Completions 桥接 Responses。不支持图片生成、视频生成和 Rerank:openrouter 和 fireworks-ai 服务提供方值不在这些路由的允许列表中。 |
| Cohere | 通过 Cohere 兼容 API 基础地址支持 Chat Completions、桥接的 Responses 和向量嵌入。支持 Rerank,因为 cohere 是 Rerank 路由接受的三个服务提供方值之一;AISIX 会通过同一个服务提供方密钥把请求发到 Cohere 原生 v2 rerank 端点。不支持图片生成和视频生成。 |
| Zhipu AI | 支持 Chat Completions、桥接的 Responses、转换后的 Messages、Embedding、音频转录、文本转语音、Realtime WebSocket 中继和规范化视频生成。原生图片生成、Rerank 和高级 CogVideoX 请求仍可通过透传路由访问;不支持规范化图片生成、音频翻译和 Rerank。 |
| Perplexity | 支持 Sonar Chat Completions 和桥接的 Responses。Perplexity 标准 Embedding 模型只有使用 API Base 包含 /v1 的独立服务提供方密钥时才能通过 /v1/embeddings 使用;Sonar Chat Base 不支持。图片生成、视频生成和 Rerank 不受支持。 |
| Cerebras | 支持 Chat Completions 和桥接的 Responses。上游未在配置的基础地址上提供 Embedding 模型,因此不可使用 Embedding。图片生成、视频生成和 Rerank 不受支持。 |
| Hugging Face | 当服务提供方密钥声明 apis.responses 时,支持 Chat Completions 和原生 Responses API。如果没有此声明,AISIX 会通过 Chat Completions 桥接 Responses。共享路由器的 OpenAI 兼容基础地址不提供 Embedding。图片生成、视频生成和 Rerank 不受支持。 |
| Moonshot AI | 支持 Chat Completions。声明 apis.responses 可使用 Moonshot 原生 Responses API,该 API 当前仅支持 kimi-k3;否则 AISIX 会通过 Chat Completions 桥接 Responses。原生 Messages 和其他服务提供方路由需要透传路由。不支持图片生成、视频生成和 Rerank。 |
| Baseten | 支持 Chat Completions 和桥接的 Responses 请求。当服务提 供方密钥的 api_base 指向提供 OpenAI 兼容 /v1/embeddings 路由的 Baseten 部署时,向量嵌入可用。不支持图片生成、视频生成和 Rerank,即使 Baseten 模型 ID 以 openai/ 开头也是如此——服务提供方值是 baseten,而不是 openai。 |
| Jina | 通过 Jina API 根地址上的 OpenAI 形态路由支持向量嵌入。原生支持 Rerank,因为 jina 是 Rerank 路由接受的三个服务提供方值之一,并且与向量嵌入共用相同的 API 根地址和服务提供方密钥。测试用 jina-ai/jina-vlm 模型在该根地址上支持 Chat Completions;Responses 和 Messages 通过此实验路由使用 AISIX 转换。其他 Jina 别名不支持这些 Chat 形态端点。不支持图片和视频生成:jina 服务提供方值不在这些路由的允许列表中。 |
| RunwayML | 仅支持视频生成,因为 runwayml(以及简写 runway)位于视频路由的服务提供方允许列表中。Chat Completions、Responses 和向量嵌入会在上游失败——Runway 不提供聊天或向量嵌入 API。不支持图片生成和 Rerank:runwayml 服务提供方值不在这些路由的允许列表中。对于网关尚未建模的 Runway 接口(例如图生视频),请使用透传路由。 |
| 火山引擎方舟 | 支持 Chat Completions、Embedding,以及服务提供方密钥声明 apis.responses 时在方舟 OpenAI 兼容 Base 上使用原生 Responses。同一密钥还可声明方舟独立的原生 Messages 和 Count Tokens Base。volcengine 位于视频路由允许列表中,因此支持视频生成。不支持规范化图片生成和 Rerank。BytePlus 也 支持原生 Responses,但没有 Messages 和 Count Tokens 协议面的文档。 |
| Cloudflare Workers AI | 支持 Chat Completions;当服务提供方密钥声明 apis.responses 且模型兼容时支持原生 Responses;当别名指向账户范围 OpenAI 兼容根地址上的 Embedding 模型时支持 Embedding。如果没有此声明,AISIX 会通过 Chat Completions 桥接 Responses。该服务提供方值不支持图片生成、视频生成和 Rerank。 |
| Databricks | 支持 Chat Completions、桥接的 Responses,以及当别名指向配置的 OpenAI 兼容根地址上的 Embedding 模型时支持 Embedding。其服务提供方值不支持图片生成、视频生成和 Rerank;服务提供方原生路由请使用透传路由。 |
| DeepInfra | 支持 Chat Completions、桥接的 Responses、Embedding,以及服务提供方密钥声明 apis.messages 时的原生 Messages 和 Count Tokens。兼容模型可以使用音频路由。其服务提供方值不支持图片生成、视频生成和 Rerank;服务提供方原生路由请使用透传。 |
| NVIDIA NIM | 托管 NVIDIA 服务提供方支持 Chat Completions、桥接的 Responses,以及别名指向兼容模型时的 Embedding。自行托管的 LLM NIM 可在服务提供方密钥声明两种 API 接口后使用原生 Responses、Messages 和 Token 计数。其他 NVIDIA API 可能需要使用各自端点的透传路由。 |
| SiliconFlow | 通过其 OpenAI 形态 API 根地址支持 Chat Completions、桥接的 Responses、转换后的 Messages、Embedding、音频转录和文本转语音。音频翻译会在上游失败 。siliconflow 服务提供方值不支持图片生成、视频生成和 Rerank;原生 Messages 和其他服务提供方路由仍可通过透传路由访问。 |
| W&B Inference | 支持 Chat Completions、桥接的 Responses 和转换后的 Messages。W&B Serverless Inference 不提供 Embedding、图片生成、视频生成或 Rerank 端点。其原生模型列表仍可通过透传路由访问。 |
| Amazon Nova API、Meta Llama API、Nebius Token Factory 和 Novita AI | 支持 Chat Completions 和桥接的 Responses。Messages 调用方可以使用 AISIX 中的 Chat 转换。Embedding 要求服务提供方配置的 API 根地址提供兼容模型和路由。这些服务提供方值不支持图片生成、视频生成和 Rerank。 |
| OVHcloud AI Endpoints 和 DigitalOcean Gradient AI | 支持 Chat Completions,并在服务提供方密钥声明 apis.responses 时支持各自的原生 Responses API。如果没有此声明,AISIX 会通过 Chat Completions 桥接 Responses。Messages 调用方可以使用 Chat 转换。Embedding 要求配置的 API 根地址提供兼容模型。这些服务提供方值不支持图片生成、视频生成和 Rerank。 |
| Snowflake Cortex | 支持 Chat Completions 以及 Responses 和 Messages 桥接。Snowflake 仅限 Claude 的原生 Messages 路由仍可通过透传路由访问。AISIX 规范化 Embedding 路由与 Snowflake 原生 POST /api/v2/cortex/inference:embed 协议不兼容;请使用带独立服务提供方密钥的透传路由调用,或使用其他 Embedding 服务提供方。snowflake-cortex 服务提供方值不支持图片生成、视频生成和 Rerank。 |
| MiniMax | 支持 Chat Completions、桥接的 Responses,以及服务提供方密钥声明 apis.messages 时的原生 Messages。MiniMax-M3 提供 Count Tokens 文档。OpenAI 兼容根地址未提供 Embedding 文档,且规范化图片生成、视频生成和 Rerank 不支持该服务提供方值。 |
| ModelScope | 支持 Chat Completions 和桥接的 Responses 请求。Embedding 取决于已配置的上游模型和路由,因为 AISIX 会转发 OpenAI 形态的请求体,而不执行服务提供方专属转换。其服务提供方值不支持图片生成、视频生成和 Rerank。 |
| xAI | 支持 Chat Completions、转换后的 Messages 和兼容 OpenAI 的 Realtime WebSocket 路由。在服务提供方密钥上声明 apis.responses 可使用 xAI 原生 Responses API;否则 AISIX 会通过 Chat Completions 桥接 Responses。规范化路由无法使用 Embedding 和 Rerank。包括媒体和模型列表 API 在内的其他 xAI 原生 HTTP 路由仍可通过透传访问。xAI 已将 Chat Completions 和兼容 Anthropic 的 Messages API 标记为弃用,并建议新集成使用 Responses。 |
| 其他公开 OpenAI 兼容服务提供方 | 必须提供 OpenAI 兼容 Chat Completions 路由。向量嵌入取决于上游路由。Rerank 还要求使用 Rerank 路由接受的服务提供方值。 |
| Ollama | 通过 BYO openai 适配器支持 Chat Completions,并在服务提供方密钥声明 apis.responses 时支持原生 Responses。Messages 请求默认使用 Chat 转换;由于 Token 计数不可用,Ollama 原生 Messages 格式请使用透传。Embedding 取决于已安装模型。图片生成、视频生成和 Rerank 不接受 byo 和 ollama 服务提供方值。 |
| vLLM | 当托管模型具备所需任务时,支持 Completions、Chat Completions、在服务提供方密钥声明 apis.responses 时支持原生 Responses,以及 Embedding、音频转录和音频翻译。经身份验证的 vLLM Messages、Token 计数和 Rerank 请使用透传。图片生成、视频生成、文本转语音和规范化 Rerank 不受支持。 |
| 私有 OpenAI 兼容端点 | 必须实现应用调用的每个上游路由。向量嵌入取决于私有端点,服务提供方专属路由还可能施加额外的服务提供方值限制。 |
端点规则
以上表格是主要路由参考。以下规则用于说明服务提供方身份、适配器协议族和端点行为不一致的情况。
- Chat Completions 是覆盖最广的标准化路由。对于非 OpenAI 上游,面向服务提供方的请求在网关后仍可以使用 Anthropic、Bedrock、Vertex AI、Azure OpenAI 或其他适配器专属格式。OpenAI 聊天音频字段仍仅适用于
openai和azure-openai适配器及兼容的上游模型。 - Responses 使用服务提供方专属处理。由 OpenAI 提供支持的模型以及声明
apis.responses的服 务提供方密钥会转发到上游 Responses API。其他服务提供方通过 Chat 适配器路径上的 Responses 桥接,并返回 Responses 形态的结果;没有 Chat 等价项的 OpenAI 特定字段会在此路径上被忽略。 - 图片生成是 OpenAI 服务提供方路由。OpenAI 兼容厂商可以为 Chat Completions 使用 OpenAI 适配器,但当其服务提供方值不是
openai时,仍会被此路由拒绝。 - 向量嵌入通过解析后的适配器进行分发。OpenAI 适配器会转发 OpenAI 请求形态,而 Bedrock 和 Vertex 适配器会为受支持的向量嵌入模型系列转换请求。音频仍使用 OpenAI 风格转发,不会在不同服务提供方协议族之间进行转换。
- Rerank 使用路由专属服务提供方允许列表。接受的服务提供方值为
openai、cohere和jina,但已配置上游必须提供/v1/rerank。openai值支持兼容的 Rerank 服务提供方,并不表示公开 OpenAI API 提供此端点。 - Anthropic Messages 支持原生 Anthropic 协议路由和转换后的上游。AISIX 可以将文本、图片、文档和工具调用历史转换为标准化请求,但所选服务提供方适配器决定哪些转换后的内容能到达上游。助手的
thinking历史块会作为不带签名的reasoning_content重放给其他服务提供方,redacted_thinking块会被丢弃。Token 计数要求服务提供方密钥使用anthropic适配器或声明apis.messages,且上游必须实现该路由;Amazon Bedrock 或 Vertex AI 上的 Claude 模型则由 AISIX 使用平台自己的 Token 计数 API 计数。
AISIX 会保留 reasoning_content,并将 reasoning 标准化到该规范字段。如果 OpenAI 兼容服务提供方从不同 的 delta 路径流式输出推理内容,请在服务提供方密钥上配置 response.reasoning_field。
内容转换边界
跨服务提供方的功能支持取决于面向调用方的端点和转换方向。不要假设一个方向的结果适用于所有服务提供方协议族组合。
当 Anthropic 形态的 /v1/messages 请求发送到受支持的非 Anthropic 上游时,AISIX 会将受支持的内容转换为标准化请求,包括文本、base64 和 URL 图片、文档、工具定义、工具调用和工具结果。所选服务提供方适配器可能只支持其中一部分内容,上游无法接受的内容会以 400 拒绝,而不是被丢弃,参见原生服务提供方的媒体内容。Amazon Bedrock 或 Vertex AI 上的 Claude 模型完全不经过转换:其 /v1/messages 请求会发往平台自己的 Messages API。助手的 thinking 历史会以不带签名的 reasoning_content 到达兼容 OpenAI 的上游,redacted_thinking 会被丢弃,因为其他服务提供方无法校验 Anthropic 的签名推理。上游推理内容会以 signature 为空的 thinking 块返回给调用方。详见 Anthropic 风格的 Messages API。
当 OpenAI 形态的 /v1/chat/completions 请求发送到其他服务提供方协议族时,可移植的文本和工具字段支持范围最广。图片、音频和文件内 容到达原生服务提供方的方式参见原生服务提供方的媒体内容。
如果应用依赖服务提供方专属内容,请优先选择匹配的面向调用方端点和服务提供方协议族。有关准确的 Anthropic 形态转换行为,请参阅 Anthropic Messages;有关反向转换,请参阅使用 OpenAI 客户端访问 Anthropic 上游。
原生服务提供方的媒体内容
对于原生服务提供方适配器——Anthropic、Vertex AI 上的 Claude 和 Gemini,以及所有 Amazon Bedrock 模型(InvokeModel 和 Converse 均如此)——Chat 请求中的 image_url、input_audio 和 file 内容会被转换为上游自己的媒体块。这适用于 /v1/chat/completions、经 Chat 转换到达这些服务提供方的 /v1/messages 和 /v1/responses 请求,以及 Bedrock 和 Vertex AI 上 Claude 的原生 Messages API。OpenAI 兼容适配器按调用方发送的原样转发这些内容。
内联数据(例如 data: URL、input_audio 或 file.file_data)会内联发送。上游无法接受的内容会以 400 拒绝,并指明 messages[i].content[j],绝不会被丢弃。例如,Claude 模型接受图片和 PDF 文档,但不接受音频。
上游能自行读取的媒体 URL 会以 URL 形式交给上游:发往 Anthropic API 的 https:// URL,以及发往 Gemini、且调用方的 format 或 URL 中的扩展名指明了媒体类型的 gs:// 或 https:// URL。其他 http:// 或 https:// URL 都由网关下载后内联发送,包括所有 Bedrock 模型、Vertex AI 上的 Claude、发往 Anthropic API 或 Gemini 的 http:// URL,以及 Gemini 无法判断类型的 https:// URL。发往无法读取它的上游的其他 scheme(例如发往 Bedrock 的 gs://)会以 400 拒绝。
下载内容的媒体类型依次取自调用方的 format 或 mime_type、响应的 Content-Type(application/octet-stream 和 binary/* 除外)、URL 中的扩展名,最后根据内容本身判断。都无法确定类型时,请求以 400 拒绝。
下载遵循以下规则:
- 默认只访问公网地址。 URL 由 API 调用方提供,因此下载受网关的服务端请求伪造(SSRF)防护
outbound.ssrf_protection约束。防护开启时(默认开启),环回地址、私有地址(RFC 1918)、CGNAT、链路本地地址(包括169.254.169.254元数据端点)、文档和基准测试地址段、多播和保留地址段,以及 IPv6 唯一本地和链路本地地址段都会被拒绝;域名解析出的每个地址和每一跳重定向(最多 10 跳)都会检查。直连时连接只会发往检查过的地址。如需访问某个主机,请把它列入outbound.ssrf_protection.allowed_hosts;也可以把outbound.ssrf_protection.enabled设为false关闭该检查。 - Fake-IP DNS 环境需要配置允许列表。 透明代理或 Fake-IP DNS 会把公网主机解析到
198.18.0.0/15,而下载会拒绝这个基准测试地址段。在这类环境中,请把提供媒体内容的主机加入outbound.ssrf_protection.allowed_hosts,或关闭 该检查。 - 使用代理环境变量。 与其他上游调用一样,下载会经过
HTTPS_PROXY、HTTP_PROXY或ALL_PROXY,除非NO_PROXY覆盖了该主机。防护开启时,网关会先自行解析主机并检查地址,再把请求交给代理,由代理再次解析主机。因此,即使代理能访问,网关本地无法解析的主机也会被拒绝;请把它加入allowed_hosts,或关闭该检查。 - 与其他上游调用一样校验证书。 下载会信任
upstream.tls.ca_file中的证书颁发机构,并遵循upstream.tls.verify,但从不出示上游客户端证书。调用方的请求头不会被转发。 - 限制大小。 每个 URL 的上限为
upstream.media_fetch.max_bytes,默认 50 MiB,下载超过上限时请求以400失败。同一请求的所有下载与其入站请求体一起计入proxy.request_body_limit_bytes,超过该限制时,请求会得到与超大请求体相同的413。参见限制请求体大小。 - 耗时计入请求预算。 下载与请求共享上游超时时间,下载耗时会计入随后的上游调用。超时或连接失败最多共尝试三次;HTTP 错误状态码和无法验证的证书不重试。
- 同一请求中每个 URL 只下载一次。 一个请求最多并发下载 8 个 URL,重复的 URL 只下载一次。跨请求不做缓存。
下载失败时,请求以该路由自己的错误格式返回 400,指明出错的内容及原因,且不包含 URL 的查询字符串和片段。重定向失败时,错误信息除了原始 URL,还会指出失败所在的重定向目标。证书无法验证时,错 误信息以 its TLS certificate could not be verified (see upstream.tls.ca_file) 结尾。地址被拒绝时,错误信息会指出该主机以及运维人员可以修改的设置:
the gateway does not download the media URL <url>: its host is not a publicly routable address. To allow it, an operator adds <host> to outbound.ssrf_protection.allowed_hosts, or turns the check off with outbound.ssrf_protection.enabled: false
下载的媒体使请求超过 proxy.request_body_limit_bytes 时,413 的错误信息会同时计入两部分,例如 the request body (277 bytes) plus downloaded media (168 bytes) exceeds the 400-byte request_body_limit_bytes limit。
在网关启动配置中配置下载:
upstream:
media_fetch:
enabled: true # false 表示对上游无法读取的 URL 直接返回 400
max_bytes: 52428800 # 每个 URL 50 MiB
outbound:
ssrf_protection:
enabled: true # false 表示关闭地址检查,此时忽略 allowed_hosts
allowed_hosts: ["media.internal", "10.0.0.5:9000"]
outbound.ssrf_protection 只约束 API 调用方提供的 URL,目前即上述媒体下载。运维人员配置的 URL,例如服务提供方密钥的 api_base、护栏、MCP 和 A2A 端点、JWKS 以及导出器,不受它检查。
allowed_hosts 的条目可以是主机(允许任意端口)或 host:port;带端口的 IPv6 地址写作 [addr]:port。条目无效时网关无法启动。通过环境变量设置时,请使用 AISIX_OUTBOUND__SSRF_PROTECTION__ENABLED 和 AISIX_OUTBOUND__SSRF_PROTECTION__ALLOWED_HOSTS。列表使用逗号分隔,例如 AISIX_OUTBOUND__SSRF_PROTECTION__ALLOWED_HOSTS="media.internal,10.0.0.5:9000";这里不接受 JSON 数组,使用 JSON 数组会导致网关无法启动。