功能与支持模型

推荐使用 gemini-3.1-flash-image 或 gemini-3-pro-image,在连续请求中保持模型一致。示例接续Flash 文生图已经产生的 request.json 与 response.json,将海报背景改为浅绿色;不会重新执行第一轮生成。

多轮顺序为:原来的 user 内容 → 上一次完整的 model 内容 → 新的 user 修改指令。thoughtSignature 是不透明的上下文签名,可能出现在图片块或文本块上;必须原样保留在原来的 part,不自行生成、移动、解码或拼接。不要把原生 role=model 改为 assistant。

第一步:设置鉴权

使用请求头 Authorization: Bearer YOUR_API_KEY。将 YOUR_API_KEY 替换为青云TOP API 的 API Key,保留 Bearer 后的空格;基础地址为 https://top.qingyuntop.ai。

第二步:调用模型

POST https://top.qingyuntop.ai/v1beta/models/gemini-3.1-flash-image:generateContent

Content-Type 为 application/json。先确认本目录中存在上一轮成功请求的两个 JSON 文件。示例选择 candidates[0].content 作为继续编辑的分支,保留整个对象和其 parts 顺序。

请求参数

字段与类型位置、填写规则与限制
contents;object[]必填;JSON 顶层数组,至少一轮。单轮传 user;多轮依次传完整历史和新的 user 内容。
contents[].role;string单轮可省略,本目录显式填写 user;多轮需区分 user 与 model,不能使用 assistant。
contents[].parts;object[]必填;每轮至少一个内容块,按数组顺序解释。文本与图片放在独立 part 中,不在一个 part 同时填写 text 与 inlineData。
contents[].parts[].thoughtSignature;string仅在回传 model 历史且响应包含此字段时原样保留;无默认值。不能自行编写、重新编码或移到其他 part。
generationConfig.imageConfig;object可选;图像配置对象。本站本入口使用此字段,不把 responseFormat.image 或顶层 image_size 混入请求。

历史会随每一轮重新提交,不能省略原始用户输入;随着轮数增加,请求体大小和输入用量也会上升。完整 JSON 必须保持在 20 MB 以下。需要压缩历史时,可以用选定的最终图片发起新的独立编辑,不要伪造缺失的签名。

可切换代码示例

点击横向标签切换语言。cURL 使用 Bash,需支持 --fail-with-body;文件/历史示例还需 jq 和 base64。Python 需安装 requests;Node.js 需 20 或更新版本,保存为 .mjs。示例的 600 秒超时是客户端设置,不是生成时限承诺。建议每个示例使用独立目录;同名输出文件会覆盖。

set -euo pipefail
cat > request-template.json <<'JSON'
{
  "contents": [
    {
      "role": "user",
      "parts": [
        {
          "text": "保留刚才海报的咖啡杯和文字,将背景改为浅绿色,其他构图保持不变。"
        }
      ]
    }
  ],
  "generationConfig": {
    "responseModalities": [
      "TEXT",
      "IMAGE"
    ],
    "imageConfig": {
      "aspectRatio": "1:1",
      "imageSize": "1K"
    }
  }
}
JSON
jq --slurpfile previousRequest request.json --slurpfile previousResponse response.json 'if ($previousResponse[0].candidates[0].finishReason != "STOP" or $previousResponse[0].candidates[0].content.role != "model") then error("上一轮缺少完整 model 响应") else .contents = ($previousRequest[0].contents + [$previousResponse[0].candidates[0].content] + .contents) end' request-template.json > next-request.json
[ "$(wc -c < next-request.json)" -lt 20000000 ] || { echo "请求超过 20 MB,请压缩图片或缩短历史" >&2; exit 1; }
curl --fail-with-body --connect-timeout 30 --max-time 600 "https://top.qingyuntop.ai/v1beta/models/gemini-3.1-flash-image:generateContent" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @next-request.json \
  --output next-response.json

保存下一轮与分支

请求和响应保存为 next-request.json 与 next-response.json,Python/Node.js 还会保存新图片。继续第三轮时,使用这对最新文件作为“上一轮”输入,并修改新 user 指令;不要一直使用第一轮文件,也不要把多个候选的 model 内容混在同一分支。

responseId 仅供追踪;本入口不接受 previous_interaction_id 或 previous_response_id 来替代 contents。多轮教程推荐同步响应,以便直接保存完整 model 内容;流式回传需要保持内容块和签名的关联,不能只拼接文字。详见流式结果。

常见错误与参考

签名错误时检查是否漏传了整轮 model 内容、裁掉带签名的 part、修改签名字符或换用了模型。不要通过删除全部签名“修复”已有历史。没有完整上一轮响应时,使用已有最终图片开始新的编辑。官方参考:多轮编辑、思考签名。