功能与支持模型
推荐使用 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、修改签名字符或换用了模型。不要通过删除全部签名“修复”已有历史。没有完整上一轮响应时,使用已有最终图片开始新的编辑。官方参考:多轮编辑、思考签名。