Gemini generateContent
Gemini 系模型的原生入口。thinkingConfig、imageConfig、安全设置都在这一侧完整保留
POST /v1beta/models/{model}:generateContent
· 流式 POST /v1beta/models/{model}:streamGenerateContent
Gemini 系模型的原生协议。Gemini 模型请优先用这个端点——它是唯一能拿到
thinkingConfig(思考)与 imageConfig(生图的比例与分辨率)的路径。从
Chat Completions 调 Gemini 也能通,但那是网关做的协议转换,这两组参数
都会在转换中丢失。
注意模型名出现在路径里,不在请求体里。
基本调用
建议用官方 SDK(Python google-genai、Node.js @google/genai),SSE 解析与重试由它处理。
curl -N -X POST "https://www.vibeapi.cn/v1beta/models/gemini-3.8-flash:streamGenerateContent" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{"role": "user", "parts": [{"text": "用一句话解释什么是幂等。"}]}],
"generationConfig": {"maxOutputTokens": 512}
}'from google import genai
from google.genai import types
client = genai.Client(
api_key="YOUR_API_KEY",
http_options=types.HttpOptions(base_url="https://www.vibeapi.cn"),
)
for chunk in client.models.generate_content_stream(
model="gemini-3.8-flash",
contents="用一句话解释什么是幂等。",
config=types.GenerateContentConfig(max_output_tokens=512),
):
if chunk.text:
print(chunk.text, end="", flush=True)import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: "YOUR_API_KEY",
httpOptions: { baseUrl: "https://www.vibeapi.cn" },
});
const stream = await ai.models.generateContentStream({
model: "gemini-3.8-flash",
contents: "用一句话解释什么是幂等。",
config: { maxOutputTokens: 512 },
});
for await (const chunk of stream) {
if (chunk.text) process.stdout.write(chunk.text);
}认证
Authorization: Bearer <API_KEY>,base 是 https://www.vibeapi.cn(不带 /v1,
Gemini 的路径前缀是 /v1beta)。
流式要求
请求超时上限 120 秒。:generateContent 在生成完成前没有数据下行,单次生成超过这个
时间会被中断。短输出不受影响;开启 thinking 的型号要等整段思考结束才返回,容易触发
上限。建议默认用 :streamGenerateContent,将各 chunk 的
candidates[0].content.parts[].text 拼接成完整文本。
与另外两套协议的差异
Gemini 的请求结构与 OpenAI / Anthropic 均不同,以下三处差异最大:
模型名在 URL 路径里,请求体里没有 model 字段。换模型要换 URL。
对话叫 contents 不叫 messages,角色是 user 和 model(不是 assistant),
每条消息的内容是 parts 数组(文本、图片、函数调用各是一个 part)。
采样参数包在 generationConfig 里,不是顶层字段;而 tools、safetySettings、
systemInstruction 是顶层的。
| Chat Completions | Messages | generateContent | |
|---|---|---|---|
| 模型名 | 请求体 model | 请求体 model | URL 路径 |
| 对话 | messages | messages | contents |
| 助手角色名 | assistant | assistant | model |
| 系统提示 | system 角色 | 顶层 system | 顶层 systemInstruction |
| 输出上限 | max_completion_tokens | max_tokens(必填) | generationConfig.maxOutputTokens |
| 流式 | stream: true | stream: true | 换端点 :streamGenerateContent |
请求体顶层字段
contentsarray必填对话数组。每项含
role(user/model)与parts数组。parts里可以混排{"text": ...}、{"inlineData": {"mimeType", "data"}}(内联 base64 图片)、{"functionCall": ...}、{"functionResponse": ...}。systemInstructionobject系统指引,形状与一条
contents相同(含parts)。toolsarray工具定义。既包括你自己的
functionDeclarations,也包括内置工具(如googleSearch、codeExecution)。内置工具不保证可用,也不保证与官方一致。toolConfigobject工具调用模式,
functionCallingConfig.mode取AUTO/ANY/NONE/VALIDATED。safetySettingsarray按类别设置安全阈值。接受,实际拦截强度取决于模型。
cachedContentstring引用服务端缓存的内容。依赖服务端存储,本网关不保证可用。
labelsobject自定义标签。接受。
generationConfig
maxOutputTokensinteger输出上限。思考 token 也算在内,带 thinking 的型号要留足空间。
temperaturenumber随机度。
topPnumber核采样阈值。
topKinteger只从概率最高的 K 个 token 里采样。
candidateCountinteger生成几个候选。实测只能为 1——传 2 会被 400 拒绝,提示当前模型只允许一个候选。 需要多个结果请并发多次调用。生图同样不支持这个参数。
stopSequencesarray停止序列。支持——实测命中后正常截断,
finishReason为STOP。seedinteger采样种子。实测不生效——固定种子 +
temperature: 0连续三次请求输出仍不相同; 不带种子的对照组同样不确定。需要可复现结果时,请改用 OpenAI 系模型 (Chat 页的seed实测可复现)。presencePenaltynumber按是否出现过惩罚重复。接受。
frequencyPenaltynumber按出现频次惩罚重复。接受。
logprobsinteger返回多少个候选 token 的概率。实测不可用,见下面的
responseLogprobs。responseLogprobsboolean是否返回对数概率。实测不可用——本网关会以 400 拒绝,提示对数概率不支持流式模式。
responseMimeTypestring响应 MIME 类型,如
application/json。配合responseSchema做结构化输出。responseSchemaobject用 Gemini 自己的 schema 方言约束输出结构,需配合
responseMimeType: "application/json"。支持——实测返回符合 schema 的纯 JSON。注意
maxOutputTokens要给足:部分型号(实测gemini-3-pro)会在 JSON 前先输出一句 前言,前言同样计入输出预算。预算不足时只会拿到那句前言,并以finishReason: "MAX_TOKENS"结束——看起来像 schema 没生效,实际是被截断了。 解析前检查finishReason比直接JSON.parse更可靠。responseJsonSchemaobject用标准 JSON Schema 约束输出结构,与
responseSchema二选一。responseModalitiesarray期望的输出模态,如
["TEXT"]、["TEXT","IMAGE"]。生图模型必须带IMAGE。thinkingConfigobject思考配置。
thinkingLevel控制思考深度,includeThoughts: true让思考内容随响应返回。 本网关实测可用:返回的parts里带thought: true标记的就是思考内容,usageMetadata.thoughtsTokenCount是思考消耗的 token。imageConfigobject生图配置,
aspectRatio比例、imageSize分辨率(1K/2K/4K等,每个模型支持 的档位不同)。这组参数只在原生端点有,走 Chat 兼容协议会整个丢掉。mediaResolutionstring输入媒体的处理分辨率,影响图片/视频输入的 token 消耗。接受。
speechConfigobject语音合成配置。本网关不提供语音模型,无效。
audioTimestampboolean音频输入的时间戳。本网关不提供音频输入,无效。
audioTranscriptionConfigobject音频转写配置。同上,无效。
routingConfigobjectGoogle 侧的模型路由配置。本网关自行路由,这个字段没有意义。
modelSelectionConfigobject模型选择配置。同上,没有意义。
enableEnhancedCivicAnswersboolean公民类问题的增强回答。接受。
modelArmorConfigobjectModel Armor 防护配置,属于 Vertex 侧能力。接受,多数情况无效。
SDK 里还有 httpOptions、abortSignal、automaticFunctionCalling 等字段,
它们是客户端行为,不会出现在 HTTP 请求体里。
响应字段
{
"candidates": [
{
"content": {
"role": "model",
"parts": [{ "text": "同一个操作执行多次和执行一次效果相同。" }]
},
"finishReason": "STOP"
}
],
"usageMetadata": {
"promptTokenCount": 12,
"candidatesTokenCount": 18,
"thoughtsTokenCount": 0,
"totalTokenCount": 30
}
}candidates[].content.partsarray产出的 part 数组,类型是混排的。带
thought: true的是思考内容,带inlineData的是生成的图片,带functionCall的是工具调用。 取正文要过滤掉thought的那些,直接拼所有text会把思考内容混进正文。candidates[].finishReasonstringSTOP正常结束 ·MAX_TOKENS撞到上限 ·SAFETY被安全策略拦截 ·RECITATION疑似复述。usageMetadata.thoughtsTokenCountinteger思考消耗的 token。计费但不出现在正文里,对账要看这个。
promptFeedbackobject输入被安全策略拦截时的说明。此时
candidates可能为空——要处理这种情况, 否则会在取candidates[0]时崩掉。
流式
流式换端点,不是加参数::streamGenerateContent。返回 SSE,每个 chunk 的形状与
非流式响应相同,只是 parts 里是增量文本,usageMetadata 在最后的 chunk 上。
真实响应示例
以下为真实调用与响应,逐条折叠。带 thought: true 的 part 是思考内容;
最后两条分别是结构化输出与不受支持参数的实际返回,可用于对照你自己的解析与错误处理。
请求 POST /v1beta/models/gemini-3-pro:generateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "9.11 和 9.9 哪个大?简答" } ] } ], "generationConfig": { "maxOutputTokens": 400, "thinkingConfig": { "includeThoughts": true } }}响应
{ "candidates": [ { "content": { "parts": [ { "text": "**Begin Comparing Numbers**\n\nI've started comparing the two numbers, 9.11 and 9.9. My focus is on determining which is larger, keeping the \"short answer\" constraint in mind. The initial analysis is underway.\n\n\n", "thought": true }, { "text": "9.9 大。" } ], "role": "model" }, "finishReason": "STOP" } ], "modelVersion": "gemini-3.1-pro-preview", "responseId": "XXXXXXXX", "usageMetadata": { "candidatesTokenCount": 5, "candidatesTokensDetails": [ { "modality": "TEXT", "tokenCount": 5 } ], "promptTokenCount": 269, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 269 } ], "serviceTier": "standard", "thoughtsTokenCount": 224, "totalTokenCount": 498 }}真实调用抓取并脱敏 · 2026-09-09
▸文本生成
请求 POST /v1beta/models/gemini-3-pro:generateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "用一句话解释幂等" } ] } ], "generationConfig": { "maxOutputTokens": 200 }}响应
{ "candidates": [ { "content": { "parts": [ { "text": "):**\n " } ], "role": "model" }, "finishReason": "MAX_TOKENS" } ], "modelVersion": "gemini-3.1-pro-preview", "responseId": "XXXXXXXX", "usageMetadata": { "candidatesTokenCount": 4, "candidatesTokensDetails": [ { "modality": "TEXT", "tokenCount": 4 } ], "promptTokenCount": 260, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 260 } ], "serviceTier": "standard", "thoughtsTokenCount": 192, "totalTokenCount": 456 }}▸流式(换端点)
请求 POST /v1beta/models/gemini-3-pro:streamGenerateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "用一句话解释幂等" } ] } ], "generationConfig": { "maxOutputTokens": 120 }}响应
data: {"candidates": [{"content": {"role": "model", "parts": [{"text": "幂等是指无论对"}]}}], "usageMetadata": {"candidatesTokenCount": 5, "candidatesTokensDetails": [{"modality": "TEXT", "tokenCount": 5}], "promptTokenCount": 260, "promptTokensDetails": [{"modality": "TEXT", "tokenCount": 260}], "serviceTier": "standard", "thoughtsTokenCount": 119, "totalTokenCount": 384}, "modelVersion": "gemini-3.1-pro-preview", "respons … }data: {"candidates": [{"content": {"role": "model", "parts": [{"thoughtSignature": "EtUFCtIFARFNMg/gSOadQVJMJ4QoxMB72NB8PjBnHzhIJjkdfQl4dtgCAOhdq1OOo1qhDZaQPOqImiLc53mv9NxIVorwogjBHNvhD5Hs3zbAwLIZV1zxpmjYD333pprI0CtNZfamORMQqKTPiF/FmI9P59L6Y4Qr5J69dk8yYZMpFLZS1wSkongVX/Hv8JgEFFyPB7AA777+2pGfT2P1/djajUE88x5dgKrkmYeqtFlsSnRNI7Yx+DWIYmNeaKK+tMYdbx5uvUkG9GYkOLlqpSozfO8wx5dt7isZsubs2YzGgfq9PP9a53rxf018dvhFSavSSbjGwY7jw6NG … }▸结构化输出 responseSchema
请求 POST /v1beta/models/gemini-3-pro:generateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "给出 1 到 3 的数组" } ] } ], "generationConfig": { "maxOutputTokens": 600, "responseMimeType": "application/json", "responseSchema": { "type": "OBJECT", "properties": { "nums": { "type": "ARRAY", "items": { "type": "INTEGER" } } } } }}响应
{ "candidates": [ { "content": { "parts": [ { "text": "{\n \"nums\": [1, 2, 3]\n}" } ], "role": "model" }, "finishReason": "STOP" } ], "modelVersion": "gemini-3.1-pro-preview", "responseId": "XXXXXXXX", "usageMetadata": { "candidatesTokenCount": 17, "candidatesTokensDetails": [ { "modality": "TEXT", "tokenCount": 17 } ], "promptTokenCount": 262, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 262 } ], "serviceTier": "standard", "thoughtsTokenCount": 273, "totalTokenCount": 552 }}▸函数调用
请求 POST /v1beta/models/gemini-3-pro:generateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "北京天气怎么样?用工具查" } ] } ], "tools": [ { "functionDeclarations": [ { "name": "get_weather", "description": "查询天气", "parameters": { "type": "OBJECT", "properties": { "city": { "type": "STRING" } }, "required": [ "city" ] } } ] } ], "generationConfig": { "maxOutputTokens": 200 }}响应
{ "candidates": [ { "content": { "parts": [ { "functionCall": { "args": { "city": "北京" }, "id": "call_XXXXXXXX", "name": "get_weather" }, "thoughtSignature": "EvoECvcEARFNMg+LBmXWr+xg1F1zNpe2h64nYqvnicr6bXfybBK6/QUhqQ/kSyREMFalbtyLVlN0h0Sjq7wde5rVA5LBdEPVgiaFXOOnQ1NHR3XbwExAKheFPD2EvJPHz5Y5AokHlTGd2+jripHcn0NsMM8q826wfJHRpLP57HhlOjiqGL2PKsuBmHhxlieS/paU4ql2VVWAU3z5S2hW0peOtIg/zFxE58l7kEfCU4jDEB1gq4woBKio0Nw+GODTEQ4lQAYO3HcHxuatYhWf6XeH4QNRNCrS3FRE6/P5sQNFJvD/cwQAx/KhMomIUZa2JljL0F3MBlpPpDCjoslGcbiV4doyEnqUyPAgR68xoUKzo2ve0PVElnW6BQ8hcV+PGS2eOtg7a0yoimqtGL1O9L9LJoxMgqrI4vUiZbR5AnKUPvzAtC3pwupRPfLtF+he8DhX0jJ3HfSC6Ff+ruJVKq3DflKBKzJMcqKHtsAXAXyk/1C16hvhN8tB91MsGh1bH9zMcKUceDvctPFfO6THcOOmL1srR+K+g0Ugkee3CehVQTrBOney0ZzqQPZmY6JLVgP1H6I6fxsbIn579dY4emqS …" } ], "role": "model" }, "finishReason": "STOP" } ], "modelVersion": "gemini-3.1-pro-preview", "responseId": "XXXXXXXX", "usageMetadata": { "candidatesTokenCount": 16, "candidatesTokensDetails": [ { "modality": "TEXT", "tokenCount": 16 } ], "promptTokenCount": 300, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 300 } ], "serviceTier": "standard", "thoughtsTokenCount": 112, "totalTokenCount": 428 }}▸图像生成(imageConfig)
请求 POST /v1beta/models/gemini-3.1-flash-image:generateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "一只橘猫坐在窗台上,水彩风格" } ] } ], "generationConfig": { "responseModalities": [ "TEXT", "IMAGE" ], "imageConfig": { "aspectRatio": "16:9", "imageSize": "1K" } }}响应
{ "candidates": [ { "content": { "role": "model", "parts": [ { "inlineData": { "mimeType": "image/png", "data": "…(图片 base64 已省略)" } } ] }, "finishReason": "STOP", "index": 0 } ], "usageMetadata": { "promptTokenCount": 42, "candidatesTokenCount": 1120, "totalTokenCount": 1162 }, "modelVersion": "gemini-3.1-flash-image"}▸candidateCount=2(会 400)HTTP 400
请求 POST /v1beta/models/gemini-3-pro:generateContent
{ "contents": [ { "role": "user", "parts": [ { "text": "用一句话解释幂等" } ] } ], "generationConfig": { "maxOutputTokens": 120, "candidateCount": 2 }}响应HTTP 400
{ "error": { "message": "Only one candidate can be specified in the current model (request id: ...)", "type": "upstream_error", "param": "", "code": 400 }}以上为真实调用抓取并脱敏 · 2026-09-09
能力边界
- 只保证文本与图像。语音合成、音频输入、实时(Live)接口不在提供范围内, 对应参数无效。
- 服务端缓存(
cachedContent)不保证可用。 - 内置工具不保证可用,也不保证与官方一致。
- 走 Chat 兼容协议会丢掉
thinkingConfig与imageConfig,生图务必用原生端点。
在线调试
填入你自己的 API Key 即可直接发起请求,参数表与响应结构由接口定义生成。
Authorization
BearerAuth
使用 Bearer Token 认证。
格式: Authorization: Bearer sk-xxxxxx
In: header
Path Parameters
模型名称
Request Body
application/json
Response Body
application/json
curl -X POST "https://www.vibeapi.cn/v1beta/models/string:generateContent" \ -H "Content-Type: application/json" \ -d '{}'{
"candidates": [
{
"content": {
"role": "string",
"parts": [
{}
]
},
"finishReason": "string",
"safetyRatings": [
{}
]
}
],
"usageMetadata": {
"promptTokenCount": 0,
"candidatesTokenCount": 0,
"totalTokenCount": 0
}
}官方文档
本页只写与本网关有关的部分,参数语义的权威定义以官方为准: