跳转到主要内容
通过 Gemini 原生格式/v1beta generateContent)调用时,响应是 Google 的 candidates / parts 结构,与 OpenAI 兼容格式不同。本页讲清非流式(generateContent)与流式(streamGenerateContent)两种响应怎么解析。
请求侧(base_url 为 https://api.apiyi.com 不带 /v1x-goog-api-key 鉴权、thinking_level 思考控制)见 Gemini 原生格式调用指南。本页只讲响应侧。示例用轻量模型 gemini-3.1-flash-lite

非流式响应

端点 …:generateContent正文在 candidates[0].content.parts[]
取正文要遍历 parts 拼接每个 text
finishReason大写 STOP(不是 OpenAI 的小写 stop),其它取值如 MAX_TOKENSSAFETY。一个 part 可能只含 thoughtSignature 而无 text,遍历时要用 if "text" in p 过滤,否则会 KeyError。

thoughtSignature(思维签名)

Gemini 3 系列会在 part 上附带 thoughtSignature(加密的推理状态)——实测连轻量的 gemini-3.1-flash-lite 也会返回
  • 单轮:用不到,忽略即可。
  • 多轮 / 函数调用:要把上一轮响应里的 thoughtSignature 原样回传到下一轮的 contents 中,模型才能延续推理链。官方 google-genai SDK 自动处理;手写 REST 时注意不要丢弃该字段。详见 Gemini 函数调用
这正是原生格式与 OpenAI 兼容模式 的关键区别:兼容模式下推理模型无状态、不暴露签名;原生格式才有 thoughtSignature 且多轮需回传。

流式响应(SSE)

端点 …:streamGenerateContent,每行 data: {...},每块的增量在 candidates[0].content.parts[0].text
经 API易 网关,流式统一返回 SSE 的 data:(加不加 ?alt=sse 都一样),没有 [DONE] 终止符——以 finishReason == "STOP" 的那一块为结束。最后一块通常只含 thoughtSignature 而无 text
usageMetadata 每块都带,且是累计值candidatesTokenCount 随输出增长)——以最后一块为准即可,无需自己累加。

与 OpenAI 兼容格式的关键差异

usage 与计费

  • thoughtsTokenCount(思考 token)按输出价计费,可用 thinking_level 控档省钱。
  • 缓存命中 cachedContentTokenCount 的折扣见 Gemini 缓存计费
  • 各字段完整说明见 Gemini 原生格式调用指南 的「用量字段」一节。

相关链接