VibeAPIVibeAPI 开发者文档

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,角色是 usermodel(不是 assistant), 每条消息的内容是 parts 数组(文本、图片、函数调用各是一个 part)。

采样参数包在 generationConfig,不是顶层字段;而 toolssafetySettingssystemInstruction 是顶层的。

Chat CompletionsMessagesgenerateContent
模型名请求体 model请求体 modelURL 路径
对话messagesmessagescontents
助手角色名assistantassistantmodel
系统提示system 角色顶层 system顶层 systemInstruction
输出上限max_completion_tokensmax_tokens(必填)generationConfig.maxOutputTokens
流式stream: truestream: true换端点 :streamGenerateContent

请求体顶层字段

contentsarray必填

对话数组。每项含 roleuser / model)与 parts 数组。parts 里可以混排 {"text": ...}{"inlineData": {"mimeType", "data"}}(内联 base64 图片)、 {"functionCall": ...}{"functionResponse": ...}

systemInstructionobject

系统指引,形状与一条 contents 相同(含 parts)。

toolsarray

工具定义。既包括你自己的 functionDeclarations,也包括内置工具(如 googleSearchcodeExecution)。内置工具不保证可用,也不保证与官方一致。

toolConfigobject

工具调用模式,functionCallingConfig.modeAUTO / ANY / NONE / VALIDATED

safetySettingsarray

按类别设置安全阈值。接受,实际拦截强度取决于模型。

cachedContentstring

引用服务端缓存的内容。依赖服务端存储,本网关不保证可用。

labelsobject

自定义标签。接受

generationConfig

maxOutputTokensinteger

输出上限。思考 token 也算在内,带 thinking 的型号要留足空间。

temperaturenumber

随机度。

topPnumber

核采样阈值。

topKinteger

只从概率最高的 K 个 token 里采样。

candidateCountinteger

生成几个候选。实测只能为 1——传 2 会被 400 拒绝,提示当前模型只允许一个候选。 需要多个结果请并发多次调用。生图同样不支持这个参数。

stopSequencesarray

停止序列。支持——实测命中后正常截断,finishReasonSTOP

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

音频转写配置。同上,无效。

routingConfigobject

Google 侧的模型路由配置。本网关自行路由,这个字段没有意义。

modelSelectionConfigobject

模型选择配置。同上,没有意义。

enableEnhancedCivicAnswersboolean

公民类问题的增强回答。接受

modelArmorConfigobject

Model Armor 防护配置,属于 Vertex 侧能力。接受,多数情况无效。

SDK 里还有 httpOptionsabortSignalautomaticFunctionCalling 等字段, 它们是客户端行为,不会出现在 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[].finishReasonstring

STOP 正常结束 · 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 兼容协议会丢掉 thinkingConfigimageConfig,生图务必用原生端点。

在线调试

填入你自己的 API Key 即可直接发起请求,参数表与响应结构由接口定义生成。

POST
/v1beta/models/{model}:generateContent

Authorization

BearerAuth

AuthorizationBearer <token>

使用 Bearer Token 认证。 格式: Authorization: Bearer sk-xxxxxx

In: header

Path Parameters

model*string

模型名称

Request Body

application/json

contents?
generationConfig?
safetySettings?
tools?
systemInstruction?

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
  }
}

官方文档

本页只写与本网关有关的部分,参数语义的权威定义以官方为准: