兼容 Gemini
AnyInt 在 /gemini/v1beta 前缀下暴露 Gemini 兼容路由。请将这些路由视为提供商原生路由,并在生产使用前先在你的环境中验证。
AnyInt 在 /gemini/v1beta 前缀下暴露 Gemini 兼容路由。这些路由使用 Gemini 原生 contents[].parts[] 请求体,而不是 OpenAI messages。
已发布的路由
| 路由 | 用例 |
|---|---|
POST /gemini/v1beta/models/{model}:generateContent | 文本生成和原生函数调用 |
POST /gemini/v1beta/models/{model}:streamGenerateContent?alt=sse | 流式生成 |
POST /gemini/v1beta/models/{image_model}:generateContent | 文本加图像输出 |
身份验证
Authorization: Bearer <ANYINT_API_KEY>某些网关客户端也可以使用 Gemini 风格的 x-goog-api-key,但 AnyInt 文档化契约使用 Authorization: Bearer。除非你的集成已经验证过替代 header,否则请使用 Bearer。
何时使用 Gemini 兼容路由
- 你希望保留 Gemini 原生
contents[].parts[]负载 - 你需要
streamGenerateContent?alt=sse - 你希望使用 Gemini 原生的
tools.functionDeclarations - 你想使用已发布的 Gemini 图像生成路由,而不是通用聊天封装器
如果你想要一个统一的 SDK 集成,请改为从 OpenAI 兼容 API 开始。
文本生成示例
请求字段
| 字段 | 类型 | 必填 | 含义 | 示例 |
|---|---|---|---|---|
contents | 数组 | 是 | Gemini 原生格式的对话轮次。 | [{"role":"user","parts":[...]}] |
contents[].role | 字符串 | 推荐 | 消息角色。用户提示使用 user,历史模型轮次使用 model。 | user |
contents[].parts | 数组 | 是 | 该轮消息的内容部分。 | [{"text":"Hello"}] |
parts[].text | 字符串 | 文本输入必填 | 文本提示词内容。 | 解释 AnyInt。 |
parts[].inlineData | 对象 | 小型内联媒体字节必填 | Gemini 原生内联媒体 part。媒体来自本地文件且编码后的请求体仍在网关和模型限制内时使用。 | {"mimeType":"image/png","data":"..."} |
parts[].fileData | 对象 | 已上传或公网媒体文件必填 | Gemini 原生文件引用。fileUri 使用公网 HTTPS URL,不要发送本地文件路径。 | {"mimeType":"video/mp4","fileUri":"https://your-domain.com/sample.mp4"} |
tools | 数组 | 否 | Gemini 原生工具声明。 | [{"functionDeclarations":[...]}] |
generationConfig | 对象 | 否 | 生成控制项,例如 temperature、最大输出 token 或图像响应模态。 | {"temperature":0.7} |
safetySettings | 数组 | 否 | 所选模型支持时的 Gemini 兼容安全设置。 | [{"category":"...","threshold":"..."}] |
Generation config 字段
| 字段 | 类型 | 必填 | 含义 | 示例 |
|---|---|---|---|---|
temperature | 数字 | 否 | 采样随机性。 | 0.7 |
topP | 数字 | 否 | nucleus sampling 值。 | 1 |
topK | 整数 | 否 | 所选模型支持时,将采样限制到 top K token。 | 40 |
maxOutputTokens | 整数 | 否 | 最大生成 token 数。 | 512 |
stopSequences | 数组 | 否 | 结束生成的停止序列。 | ["END"] |
responseModalities | 数组 | 仅图像生成 | Gemini 图像输出示例需要包含 TEXT 和 IMAGE。 | ["TEXT","IMAGE"] |
curl https://api.anyint.ai/gemini/v1beta/models/gemini-3-flash-preview:generateContent \
-H "Authorization: Bearer $ANYINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{"text": "AnyInt 如何帮助多提供商团队?"}
]
}
]
}'最小的已发布请求体是 contents,且至少包含一个内容项和一个文本 part。
流式示例
curl "https://api.anyint.ai/gemini/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse" \
-H "Authorization: Bearer $ANYINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{"text": "流式输出一个关于 API 网关的简短回答。"}
]
}
]
}'该 alt=sse 查询参数在已发布的流式路由中是必需的。
流式响应行为
| 字段 | 含义 |
|---|---|
candidates[] | 模型返回的增量候选输出 |
candidates[].content.parts[] | 根据模型不同,包含生成文本或媒体 part |
usageMetadata | 提供方返回时的 token 使用元数据 |
finishReason | 该候选输出停止的原因 |
视频或文件输入
如果你需要 Gemini 原生的媒体理解,请使用 fileData.fileUri,并提供模型提供方可以直接抓取的 URL。这个 URL 应直接返回媒体字节,而不是 HTML 分享页,也不能依赖 Cookie、登录态或私有网络访问。
长视频或较大媒体分析建议使用 streamGenerateContent?alt=sse,这样客户端可以在提供方继续处理文件时持续收到增量事件。
curl "https://api.anyint.ai/gemini/v1beta/models/gemini-3.1-pro-preview:streamGenerateContent?alt=sse" \
-H "Authorization: Bearer $ANYINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{
"text": "描述视频在 00:00、00:30 和 01:00 可见的画面。如果无法访问视频,请直接说明。"
},
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": "https://your-domain.com/sample.mp4"
}
}
]
}
],
"generationConfig": {
"maxOutputTokens": 4096
}
}'本地视频文件请先上传到对象存储或其他公网 HTTPS 位置,再把 URL 放进 fileData.fileUri。不要传 /tmp/sample.mp4 这样的本地路径。
首次为集成添加媒体输入时,请先发一个小型验证请求,让模型回答你可以独立核对的时间点画面或物体。仅仅返回格式正确的 JSON,并不能证明提供方真的处理了媒体文件。
函数调用示例
函数声明字段
| 字段 | 类型 | 必填 | 含义 | 示例 |
|---|---|---|---|---|
tools[].functionDeclarations | 数组 | 是 | 模型可以调用的函数。 | [{"name":"get_weather",...}] |
name | 字符串 | 是 | 你的应用可识别的函数名。 | get_current_temperature |
description | 字符串 | 推荐 | 告诉模型何时使用该函数。 | 获取当前温度。 |
parameters | 对象 | 是 | 类 JSON Schema 的参数描述。 | {"type":"object","properties":{...}} |
parameters.properties | 对象 | 通常需要 | 函数参数字段。 | {"location":{"type":"string"}} |
parameters.required | 数组 | 否 | 必填参数名。 | ["location"] |
curl https://api.anyint.ai/gemini/v1beta/models/gemini-3-flash-preview:generateContent \
-H "Authorization: Bearer $ANYINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{"text": "伦敦的气温是多少?"}
]
}
],
"tools": [
{
"functionDeclarations": [
{
"name": "get_current_temperature",
"description": "获取给定位置的当前温度。",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,例如旧金山"
}
},
"required": ["location"]
}
}
]
}
]
}'这是已发布的 Gemini 原生工具模式。当你希望模型使用 functionDeclarations 而不是 OpenAI 风格的 tools 时,这就是正确的选择。
图像生成示例
已发布的图像生成模式要求 generationConfig.responseModalities 同时包含 TEXT 和 IMAGE。
curl https://api.anyint.ai/gemini/v1beta/models/gemini-3.1-flash-image-preview:generateContent \
-H "Authorization: Bearer $ANYINT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{"text": "为 AI 音乐发布会生成一张电影感海报。"}
]
}
],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"]
}
}'图像输入指南
面向客户的图像输入,优先使用 OpenAI 兼容 API 中的 messages[].content[] 内容块和 image_url。这是当前文档化的多模态聊天格式,也能通过 OpenAI 兼容路由调用支持图像的模型。
如果你的应用已经使用 Gemini 原生请求体,/gemini/v1beta 也支持通过 contents[].parts[].inlineData 传入内联图片字节:
IMAGE_DATA="$(base64 -i ./reference.png | tr -d '\n')"
curl https://api.anyint.ai/gemini/v1beta/models/gemini-3.1-flash-image-preview:generateContent \
-H "Authorization: Bearer $ANYINT_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"contents\": [
{
\"role\": \"user\",
\"parts\": [
{
\"text\": \"使用这张参考图,用一句话描述产品风格。\"
},
{
\"inlineData\": {
\"mimeType\": \"image/png\",
\"data\": \"$IMAGE_DATA\"
}
}
]
}
]
}"新集成请使用 Gemini 风格的 inlineData 字段名。不要通过 fileData.fileUri 传本地文件路径;请先上传文件、使用公网 HTTPS 文件 URL,或对小型内联媒体使用 inlineData。
不要假设 /gemini/v1/... 路由或原始 Google API 负载一定被 AnyInt 支持,除非它已经列在本页。
常见错误
- 忘记在流式路由上使用
alt=sse - 在
contents[]中遗漏role: "user" - 调用裸
/v1beta/...,而不是 AnyInt 的/gemini/v1beta/...前缀 - 调用
/gemini/v1/models/...,而不是已发布的/gemini/v1beta/models/...路由 - 在图像生成中省略
responseModalities - 发送 OpenAI 的
messages而不是 Gemini 的contents[].parts[] - 在
fileData.fileUri里发送本地文件路径 - 发送视频分享页、需要登录的 URL 或被私有网络阻断的 URL,而不是直接媒体 URL
- 只传裸 base64,而不是放进
inlineData.mimeType和inlineData.data