|

Nano Banana Pro 多轮对话出图 API 实战:3步搭建上下文出图

作者注:深度解析 Nano Banana Pro (gemini-3-pro-image-preview) 多轮对话出图 API 的字段结构、contents 数组构造、thoughtSignature 机制与代码实战。

很多开发者第一次接入 Nano Banana Pro 都会遇到同一个困惑:在 gemini.google.com 网页端可以连续追问「把背景换成黄昏」「再加一只猫」,模型完美记得上一张图;但调用官方 API 时,模型却像断片一样什么都不记得。原因是 Gemini API 本身是无状态的,多轮上下文必须由调用方手动构造。本文将彻底讲清 Nano Banana Pro 多轮对话出图 API 的底层字段、Python SDK 与 REST 两套实现,以及关键的 thoughtSignature 机制,帮你 3 步搭建出像网页版一样流畅的上下文出图体验。

核心价值: 读完本文,你将掌握 contents 数组的正确构造方式、能在自己的应用里实现「基于上一张图继续编辑」的多轮工作流,并避免「图片忘记」「token 浪费」「signature 丢失」三大典型坑。

nano-banana-pro-multi-turn-conversation-api-guide 图示


Nano Banana Pro 多轮对话出图 核心要点

要点 说明 价值
API 无状态 gemini-3-pro-image-preview 接口本身不记得任何历史 多轮上下文需调用方主动维护
contents 数组 user/model 角色交替,每次请求携带完整历史 一次请求即可让模型「看到」过往对话
图片回传 之前生成的图片需以 inline_data 形式塞回 contents 模型据此进行持续编辑而非重新生成
thoughtSignature 加密的思考签名,跨轮保留推理上下文 关键编辑指令不会被遗忘
SDK 自动化 官方 Python SDK 的 chat 对象自动管理历史 从 REST 直接迁移可省 80% 代码

多轮对话出图 与 网页版 Agent 的本质区别

gemini.google.com 是 Google 官方搭建的 Agent 应用,它在前端帮你维护了一份完整的「对话状态」(包含每轮的文本、生成的图片、思考签名),每次你输入新消息时,这个 Agent 会把所有历史一次性打包发送给底层模型。这就是为什么网页端体验如此流畅——所有「记忆」工作都被 Agent 包揽了。

而当你直接调用 generateContent API 时,你拿到的是「赤裸」的模型调用接口。每次 HTTP 请求都是一次独立的推理,模型对你之前的对话毫无概念。要复现网页版的多轮体验,本质上就是在你的代码里自己实现一个 Agent——把历史 user 消息、model 响应(含图片和签名)按规范填入 contents,再发起请求。

nano-banana-pro-multi-turn-conversation-api-guide 图示


Nano Banana Pro 多轮对话出图 字段结构详解

contents 数组的核心规范

contents 是 Gemini API 表达对话历史的标准字段,它是一个 JSON 数组,每个元素代表一轮发言:

字段 类型 说明
role string "user""model",必须严格交替
parts array 该轮发言的内容片段,可以混合文本/图片/签名
parts[].text string 文本内容,如指令或对话
parts[].inline_data.mime_type string 图片格式,通常为 "image/png"
parts[].inline_data.data string 图片的 base64 编码数据
parts[].thought_signature string 模型生成的加密签名(仅在 model role 中出现)

一个完整的两轮对话请求体长这样:

{
  "contents": [
    {"role": "user", "parts": [{"text": "生成一只在沙滩奔跑的金毛犬"}]},
    {"role": "model", "parts": [
      {"inline_data": {"mime_type": "image/png", "data": "<第一轮生成图base64>"}},
      {"thought_signature": "<加密签名>"}
    ]},
    {"role": "user", "parts": [{"text": "把场景改成黄昏时分"}]}
  ],
  "generationConfig": {
    "responseModalities": ["TEXT", "IMAGE"],
    "imageConfig": {"aspectRatio": "16:9", "imageSize": "2K"}
  }
}

图片回传的两种方式

第二轮请求里,模型必须能「看到」第一轮生成的图片。Nano Banana Pro 支持两种回传姿势:

# 方式一:inline_data 内嵌 base64(适合小图,简单直接)
{
    "inline_data": {
        "mime_type": "image/png",
        "data": base64.b64encode(image_bytes).decode()
    }
}

# 方式二:file_data 引用 Files API 上传后的资源(适合大图或复用)
{
    "file_data": {
        "mime_type": "image/png",
        "file_uri": "files/abc123xyz"
    }
}

关键提示: inline_data 是直接调用最常用的方式,适合一次性场景;file_data 引用模式适合需要在多轮中复用同一张大图的场景,可显著降低请求体大小和上传开销。


Nano Banana Pro 多轮对话出图 快速上手

极简示例(Python SDK 自动管理)

如果你使用官方 Python SDK,最简洁的写法只需要 10 行:

from google import genai

client = genai.Client(api_key="YOUR_API_KEY")
chat = client.chats.create(model="gemini-3-pro-image-preview")

# 第一轮:生成初始图
r1 = chat.send_message("生成一只在沙滩奔跑的金毛犬")

# 第二轮:基于第一张图继续编辑(chat 对象自动携带历史)
r2 = chat.send_message("把场景改成黄昏时分,加一只飞翔的海鸥")

# 第三轮:继续追加修改
r3 = chat.send_message("再把狗的颜色换成深棕色")

chat 对象内部维护了完整的 contents 列表(包括每轮的 thoughtSignature),开发者无需关心字段细节。每次 send_message 都会自动把历史打包发送。

查看 OpenAI 兼容接口完整调用示例

如果你使用 API易 apiyi.com 这类 OpenAI 兼容平台调用 Nano Banana Pro,可以直接复用 OpenAI SDK:

import openai
import base64

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://vip.apiyi.com/v1"
)

# 维护一个本地的 messages 列表(即 contents 概念)
messages = [
    {"role": "user", "content": "生成一只在沙滩奔跑的金毛犬"}
]

# 第一轮
response1 = client.chat.completions.create(
    model="gemini-3-pro-image-preview",
    messages=messages
)
img1_url = response1.choices[0].message.content  # 提取图片URL或base64

# 把模型响应加入历史
messages.append({"role": "assistant", "content": img1_url})

# 第二轮:追加新指令
messages.append({"role": "user", "content": "把场景改成黄昏时分"})
response2 = client.chat.completions.create(
    model="gemini-3-pro-image-preview",
    messages=messages
)

# 第三轮继续追加...
messages.append({"role": "assistant", "content": response2.choices[0].message.content})
messages.append({"role": "user", "content": "再加一只飞翔的海鸥"})
response3 = client.chat.completions.create(
    model="gemini-3-pro-image-preview",
    messages=messages
)

关键点:在 OpenAI 兼容模式下,messages 数组等同于原生 contents,role 字段从 "model" 改为 "assistant",平台层会自动转换。

建议: 对于多轮编辑场景,推荐使用 SDK 的 chat 对象或维护本地 messages 列表,避免每次手动拼接 contents。可在 API易 apiyi.com 注册免费额度,先用 SDK 跑通再考虑 REST 优化。


Nano Banana Pro 多轮对话出图 REST 手动构造

不依赖 SDK 的纯 REST 实现

某些场景(例如服务端中转、ComfyUI 节点、低代码平台)无法使用官方 SDK,需要直接构造 REST 请求。以下是完整的 curl 调用:

# 第一轮:纯文本指令生成图
curl -X POST \
  "https://vip.apiyi.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \
  -H "x-goog-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {"role": "user", "parts": [{"text": "生成一只在沙滩奔跑的金毛犬"}]}
    ],
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"]
    }
  }'

# 响应中会有: parts[0].inline_data.data (base64图片)
# 以及 parts[0].thought_signature

第二轮请求时,必须把第一轮的整个 model 响应(包括图片和签名)原样塞回 contents:

curl -X POST \
  "https://vip.apiyi.com/v1beta/models/gemini-3-pro-image-preview:generateContent" \
  -H "x-goog-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      {"role": "user", "parts": [{"text": "生成一只在沙滩奔跑的金毛犬"}]},
      {"role": "model", "parts": [
        {"inline_data": {"mime_type": "image/png", "data": "<第一轮返回的base64>"}},
        {"thought_signature": "<第一轮返回的signature>"}
      ]},
      {"role": "user", "parts": [{"text": "把场景改成黄昏时分"}]}
    ],
    "generationConfig": {
      "responseModalities": ["TEXT", "IMAGE"]
    }
  }'

三种调用模式对比

调用方式 历史管理 适合场景 学习成本
官方 Python SDK (chat 对象) 自动 后端服务、Notebook 实验 ⭐ 最低
OpenAI 兼容接口 (messages 数组) 半自动 已有 OpenAI 项目迁移 ⭐⭐ 较低
原生 REST (contents 数组) 完全手动 ComfyUI、低代码、跨语言 ⭐⭐⭐ 中等

nano-banana-pro-multi-turn-conversation-api-guide 图示

数据说明: 上图展示了 Agent 自动管理 vs API 手动管理的核心差异,可通过 API易 apiyi.com 平台直接对比两种调用方式的实际表现差异。


Nano Banana Pro 多轮对话出图 thoughtSignature 机制

什么是 thoughtSignature

thoughtSignature 是 Gemini 3 系列引入的「加密思考签名」。它是模型对自己内部推理状态的一个紧凑编码,肉眼不可读,但模型在下一轮可以用它快速恢复上下文。具体作用:

  • 保留细节决策: 例如第一轮里模型「决定」用浅色调,第二轮通过签名继承这个风格
  • 提升一致性: 角色、场景、构图在多轮编辑中保持稳定
  • 节省 token: 避免在 prompt 里反复重申「保持原风格」

何时必须携带 signature

场景 是否必须携带 signature
单轮独立请求(一次性出图) ❌ 不需要
多轮编辑(基于上一张图修改) ✅ 必须
跨会话恢复历史 ✅ 必须(需自行持久化)
仅文本对话(无图片) ✅ 必须,用于推理连续性

实战:手动管理 signature 的代码模式

import requests
import base64
import json

API_BASE = "https://vip.apiyi.com/v1beta"
MODEL = "gemini-3-pro-image-preview"
HEADERS = {
    "x-goog-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json"
}

class NanoBananaChat:
    """手动维护 contents + signature 的极简 chat 客户端"""
    def __init__(self):
        self.contents = []

    def send(self, text: str, attach_image_b64: str = None) -> dict:
        # 构造本轮 user message
        user_parts = [{"text": text}]
        if attach_image_b64:
            user_parts.append({
                "inline_data": {"mime_type": "image/png", "data": attach_image_b64}
            })
        self.contents.append({"role": "user", "parts": user_parts})

        # 发起请求
        resp = requests.post(
            f"{API_BASE}/models/{MODEL}:generateContent",
            headers=HEADERS,
            json={
                "contents": self.contents,
                "generationConfig": {"responseModalities": ["TEXT", "IMAGE"]}
            }
        ).json()

        # 把 model 响应(含 signature)原样追加回 contents
        model_parts = resp["candidates"][0]["content"]["parts"]
        self.contents.append({"role": "model", "parts": model_parts})
        return model_parts

# 使用示例
chat = NanoBananaChat()
parts1 = chat.send("生成一只在沙滩奔跑的金毛犬")
parts2 = chat.send("把场景改成黄昏时分")  # 自动携带历史和signature
parts3 = chat.send("再加一只飞翔的海鸥")

优化建议: 通过 API易 apiyi.com 接入时,平台层会原样透传 thought_signature 字段,开发者只需保证「把整个 model parts 数组追加回 contents」即可,无需关心签名的具体内容。

nano-banana-pro-multi-turn-conversation-api-guide 图示


Nano Banana Pro 多轮对话出图 实战场景

场景 1:渐进式品牌图设计

营销团队常见需求:基于一张产品概念图,逐步调整文案、配色、排版。多轮对话出图 API 的优势在于每次只需描述「增量变化」,不必从头描述整张图:

chat = client.chats.create(model="gemini-3-pro-image-preview")

chat.send_message("设计一张深蓝渐变背景的咖啡品牌海报,左侧放产品图")
chat.send_message("把标题文案改成「Awaken Your Morning」")
chat.send_message("右下角加一个二维码占位")
chat.send_message("整体风格再现代一点,去掉装饰花边")

场景 2:基于参考图的多轮编辑

Nano Banana Pro 支持单次最多 14 张参考图。结合多轮对话,可以构建强大的图像融合工作流:

# 上传一张人像 + 一张服装参考图
chat.send_message([
    "把第一张图的人物穿上第二张图里的服装",
    {"inline_data": {"mime_type": "image/png", "data": person_b64}},
    {"inline_data": {"mime_type": "image/png", "data": outfit_b64}}
])

# 后续微调
chat.send_message("把领口改成 V 字领")
chat.send_message("背景换成简洁的灰色")

场景 3:跨会话恢复历史

如果用户在前端关闭页面后重新打开,希望继续上次对话,需要把 contents 数组持久化到数据库:

import json

# 保存
with open(f"sessions/{user_id}.json", "w") as f:
    json.dump(chat.get_history(), f)

# 恢复
with open(f"sessions/{user_id}.json") as f:
    history = json.load(f)
restored_chat = client.chats.create(
    model="gemini-3-pro-image-preview",
    history=history
)
restored_chat.send_message("继续上次的,把背景再亮一点")

上下文窗口限制

资源 限制
输入上下文 64K tokens
输出上下文 32K tokens
单请求最大参考图数量 14 张
推荐历史轮数 不超过 8-10 轮
单图最大分辨率 2K (默认 1K)

场景建议: 当对话超过 8-10 轮时,建议主动「截断」前面的历史或用 LLM 摘要替代,否则 token 会快速逼近 64K 上限。生产环境务必加入 token 计数器,提前在客户端做截断决策。


常见问题

Q1: 我直接调 API 没有上下文,要怎么实现网页版那种连续对话?

API 是无状态的,必须由你的代码维护一份本地的 contents 数组(或 SDK 里的 chat 对象)。每次请求把完整历史(包括用户文本、模型生成的图片、thought_signature)一起发回去,模型才会「记得」之前的对话。最简单的方式是用官方 Python SDK 的 client.chats.create(),由 SDK 自动管理。

Q2: 上一轮生成的图片,下一轮要传什么字段?

要把图片以 inline_data 的形式(base64 编码 + mime_type)放入「上一轮 model 角色」的 parts 数组中。同时务必把模型返回的 thought_signature 也一并带回。如果使用 API易 apiyi.com 等 OpenAI 兼容接口,平台会自动处理这些字段映射,开发者只需维护标准的 messages 列表。

Q3: thoughtSignature 必须传吗?不传会怎样?

强烈建议传。不传的话,模型在多轮编辑时可能「忘记」上一轮的关键决策(如风格、配色、构图),导致每次都像在重新生成。官方文档明确指出多轮场景下 signature 必须保留。SDK 会自动处理,REST 模式下需要手动把 model parts 完整追加回 contents。

Q4: 历史太长了怎么办?token 超 64K 会报错吗?

会的,超过 64K 输入 token 会被拒绝。常见优化策略:

  1. 截断: 只保留最近 4-6 轮历史
  2. 图片下采样: 历史图片传 1K 而不是 2K 分辨率
  3. 摘要替代: 用 LLM 把前几轮压缩成一段文字描述
  4. 分段会话: 当对话主题切换时主动开新会话

Q5: 如何快速测试 Nano Banana Pro 多轮出图效果?

推荐使用 API易 apiyi.com 这类支持 Gemini 模型的聚合平台快速验证:

  1. 注册账号获取 API Key 和免费额度
  2. 选择 gemini-3-pro-image-preview 模型
  3. 用本文的 Python SDK 示例代码连续发起 3-5 轮编辑
  4. 对比每轮输出的连贯性,判断是否符合业务需求

总结

Nano Banana Pro 多轮对话出图 API 的核心要点:

  1. 无状态本质: API 不记忆任何历史,必须由调用方维护 contents 数组
  2. 角色交替: user 与 model 严格交替,每轮 parts 可混合 text/image/signature
  3. 图片回传: 上一轮生成的图必须以 inline_data 形式塞回,否则模型「看不到」
  4. 签名机制: thought_signature 是多轮一致性的关键,REST 模式下必须手动携带
  5. SDK 简化: 官方 Python SDK 的 chat 对象可自动管理上述所有细节

对于希望快速实现网页版体验的开发者,最佳路径是使用官方 SDK 的 chat 对象或 OpenAI 兼容接口的 messages 模式,避免手动构造 REST 带来的复杂度。

推荐通过 API易 apiyi.com 接入 Nano Banana Pro 多轮对话出图能力,平台支持原生 Gemini 字段与 OpenAI 兼容双模式调用,提供免费测试额度,便于快速验证多轮编辑效果并平滑迁移现有项目。


📚 参考资料

  1. Gemini API 图像生成官方文档: 多轮对话出图的权威说明

    • 链接: ai.google.dev/gemini-api/docs/image-generation
    • 说明: 包含 contents 字段规范、Python SDK 与 REST 完整示例
  2. Gemini 3 Pro Image Preview 模型卡: 模型能力与限制说明

    • 链接: ai.google.dev/gemini-api/docs/models/gemini-3-pro-image-preview
    • 说明: 上下文窗口、分辨率、参考图数量等关键参数
  3. Google AI Developers Forum – Multi-turn Nano Banana: 社区实战示例

    • 链接: discuss.ai.google.dev/t/multi-turn-nano-banana-example
    • 说明: 真实开发者讨论的多轮对话最佳实践
  4. Vertex AI Gemini 3 Pro Image 文档: 企业级部署参考

    • 链接: docs.cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/3-pro-image
    • 说明: 包含 thought_signature 与 file_data 引用的高级用法
  5. API易 Nano Banana Pro 接入文档: 国内开发者快速上手

    • 链接: help.apiyi.com
    • 说明: 包含 OpenAI 兼容接口、原生 Gemini 接口双模式示例

作者: APIYI 技术团队
技术交流: 欢迎在评论区分享你在多轮对话出图中遇到的实战问题,更多 Nano Banana Pro 配置技巧可访问 API易 docs.apiyi.com 文档中心

类似文章