作者注:用“皇冠换红帽、再把粉心改蓝”的完整案例,讲清 Nano Banana 2.1 多轮编辑每轮要回传的对话历史、上一轮图片和思维签名,实现局部修改不丢前一轮成果。
很多开发者第一次用 gemini-nano-banana-2.1 改图时都会遇到同一个问题:第一轮改得很好,第二轮想再微调一个小地方,结果上一轮的修改被“冲掉”了,或者整张图的风格被重画了一遍。本文将介绍 Nano Banana 2.1 多轮编辑的正确回传方式,帮助你实现 2 轮连续改图而不丢细节。
这不是又一篇概念科普,而是围绕一个可复现的案例展开:第一轮把角色头上的皇冠换成红帽,第二轮只把粉色爱心改成蓝色,同时保住红帽。我们会给出两轮请求的完整代码,并说明每一轮到底要带什么数据。
核心价值:读完本文,你将弄清 Nano Banana 2.1 多轮编辑的工作机制,知道每轮请求必须回传的 3 个要素,并能直接套用代码完成局部连续编辑。

Nano Banana 2.1 多轮编辑核心要点
先把概念说准确。所谓 Nano Banana 2.1 的“原生多轮”编辑,更严谨的说法是“连续编辑”:每一轮都是一次独立的 API 请求,模型之所以能“记住”上一轮改了什么,是因为你在请求里把上下文完整带回去了,而不是服务端替你保存了会话。
| 要点 | 说明 | 价值 |
|---|---|---|
| 完整对话历史 | 第二轮请求的 contents 要包含第一轮的用户指令和模型回复 | 模型知道“之前做过什么”,不会从零重画 |
| 上一轮输出图片 | 模型回复中返回的图片要原样放回历史里 | 第二轮基于红帽版本继续改,而不是基于原图 |
| 思维签名 thought signature | 模型回复 part 上附带的签名字段需要原样回传 | 保留模型内部推理状态,提高局部修改的一致性 |
| 无状态请求 | 目前未验证服务端会自动记忆上下文 | 必须由客户端自己拼装历史,行为才可控 |
| 原生格式调用 | 使用 Gemini generateContent 原生格式构造 contents | 签名和图片 part 能按原结构回传,不丢字段 |
Nano Banana 2.1 多轮编辑为什么会“丢细节”
最常见的错误做法,是第二轮只发一句“把粉心改成蓝色”,再附上原始图片。这样模型看到的仍然是戴皇冠的原图,自然会把皇冠保留下来,第一轮的红帽也就消失了。另一种错误是只附上第一轮输出的图片、不带历史,此时模型虽然拿到了红帽版本,但并不知道这顶红帽是“刚刚刻意改出来、需要保留的”,容易在第二轮顺手改动帽子的颜色或形状。
真正稳定的做法,是把第一轮的完整交互当作对话历史传回去:用户说了什么、模型返回了哪张图、模型回复上附带的签名是什么。Google 官方文档对图片编辑的多轮场景也是这样描述的,模型通过历史中的签名延续推理上下文,从而只改你指定的局部。
Nano Banana 2.1 多轮编辑的请求结构
第二轮请求的 contents 是一个按时间顺序排列的数组,至少包含三段:第一轮的 user 消息(原图加指令)、第一轮的 model 回复(含输出图片和签名)、第二轮新的 user 指令。关键在于 model 回复那一段要“原样回放”,不能只抽出图片 base64 重新组装,否则签名字段很容易在转换中丢失。

Nano Banana 2.1 多轮编辑快速上手
下面用 Python 和 requests 库直接调用 Gemini 原生 generateContent 格式。之所以不用 OpenAI 兼容的 chat 格式,是因为多轮编辑需要回传 thought signature 和图片 part,原生格式能最大程度保留这些字段的原始结构。
准备工作清单
| 准备项 | 说明 | 备注 |
|---|---|---|
| API Key | 在 API易 控制台创建 | 新用户有免费测试额度 |
| 模型名 | gemini-nano-banana-2.1 |
以控制台模型列表为准 |
| 原始图片 | 本例为戴皇冠、胸前有粉色爱心的角色图 | PNG 或 JPEG 均可 |
| 调用格式 | Gemini 原生 generateContent | 便于完整回传签名与图片 |
| 运行环境 | Python 3 + requests | 无需额外 SDK |
极简示例:第 1 轮把皇冠换成红帽
第一轮就是一次普通的图片编辑请求:一个 user 消息,里面放原图和指令。重点是把返回的 model 内容完整保存下来,下一轮要用。
import base64, requests
BASE_URL = "https://api.apiyi.com/v1" # API易 统一接口,原生格式路径以文档中心说明为准
API_KEY = "YOUR_API_KEY"
MODEL = "gemini-nano-banana-2.1"
URL = f"{BASE_URL}/models/{MODEL}:generateContent"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
img_b64 = base64.b64encode(open("origin.png", "rb").read()).decode()
user1 = {"role": "user", "parts": [
{"inline_data": {"mime_type": "image/png", "data": img_b64}},
{"text": "把角色头上的皇冠换成一顶红色的帽子,其他内容保持不变。"}]}
resp = requests.post(URL, headers=HEADERS, json={
"contents": [user1],
"generationConfig": {"responseModalities": ["TEXT", "IMAGE"]}}).json()
model1 = resp["candidates"][0]["content"] # 原样保存,含图片和 thoughtSignature
这里最值得注意的是最后一行:model1 直接取 candidates[0].content 整个对象,而不是只取其中的图片数据。这个对象里的 parts 可能同时包含文字、图片和 thoughtSignature 字段,原样保存就不会遗漏任何一项。
完整示例:第 2 轮只把粉心改蓝,保留红帽
第二轮的核心就是拼装 contents:[user1, model1, user2]。下面的完整代码包含两轮调用、签名检查和图片保存,可以直接运行。
查看 Nano Banana 2.1 两轮连续编辑完整代码
import base64
import requests
BASE_URL = "https://api.apiyi.com/v1" # 通过 API易 调用,原生格式路径以 docs.apiyi.com 为准
API_KEY = "YOUR_API_KEY"
MODEL = "gemini-nano-banana-2.1"
URL = f"{BASE_URL}/models/{MODEL}:generateContent"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
GEN_CONFIG = {"responseModalities": ["TEXT", "IMAGE"]}
def call(contents):
"""发送一次 generateContent 请求,返回 model 回复的完整 content 对象"""
r = requests.post(URL, headers=HEADERS,
json={"contents": contents, "generationConfig": GEN_CONFIG},
timeout=180)
r.raise_for_status()
return r.json()["candidates"][0]["content"]
def save_image(content, path):
"""从 model 回复中取出图片并保存"""
for part in content.get("parts", []):
data = part.get("inlineData") or part.get("inline_data")
if data:
open(path, "wb").write(base64.b64decode(data["data"]))
return True
return False
def has_signature(content):
"""检查回复中是否带有思维签名"""
return any("thoughtSignature" in p or "thought_signature" in p
for p in content.get("parts", []))
# ---------- 第 1 轮:皇冠 → 红帽 ----------
img_b64 = base64.b64encode(open("origin.png", "rb").read()).decode()
user1 = {"role": "user", "parts": [
{"inline_data": {"mime_type": "image/png", "data": img_b64}},
{"text": "把角色头上的皇冠换成一顶红色的帽子,其他内容保持不变。"}]}
model1 = call([user1])
save_image(model1, "round1_red_hat.png")
print("第 1 轮签名存在:", has_signature(model1))
# ---------- 第 2 轮:粉心 → 蓝心,保留红帽 ----------
user2 = {"role": "user", "parts": [
{"text": "在上一张图的基础上,只把胸前的粉色爱心改成蓝色。"
"红色帽子和其他所有细节保持不变。"}]}
# 关键:完整历史 + 原样回传的 model1(含上一轮图片与签名)
history = [user1, model1, user2]
model2 = call(history)
save_image(model2, "round2_blue_heart.png")
print("第 2 轮签名存在:", has_signature(model2))
# 如需第 3 轮,继续追加:history += [model2, user3]
🚀 快速开始:建议先在 API易 apiyi.com 用免费测试额度把上面两轮代码跑通,确认 round2 图片里红帽仍在、只有爱心变色,再接入自己的业务流程。
第 2 轮指令的写法技巧
连续编辑能不能“只改局部”,除了回传结构,指令写法也有影响。我们建议在第二轮指令里同时说清三件事:基于哪张图改、改哪里、哪些必须保持不变。例如“在上一张图的基础上,只把粉色爱心改成蓝色,红色帽子和其他细节保持不变”,比单纯一句“改成蓝色”要稳定得多。
另外,第二轮不要再重复附上原始图片。原图已经在 user1 里了,如果在 user2 里再放一次,模型可能会把它理解为新的参照对象,反而回到皇冠版本。
Nano Banana 2.1 多轮编辑三种回传方式对比
为了说明为什么必须“三要素齐全”,我们把常见的三种写法放在一起比较。下表是对不同回传方式行为的定性描述,便于你快速判断自己的代码属于哪一种。

| 回传方式 | 第 2 轮请求内容 | 典型结果 | 推荐程度 |
|---|---|---|---|
| 方式 A:原图重发 | 原始图片 + 新指令 | 第一轮修改丢失,皇冠回归 | 不推荐 |
| 方式 B:单图续改 | 第一轮输出图片 + 新指令,无历史 | 红帽大体保留,但细节可能被顺手改动 | 简单场景可用 |
| 方式 C:完整历史回传 | user1 + model1(含图片和签名)+ user2 | 只改爱心颜色,红帽和其余细节保持 | 推荐 ✅ |
对比解读
方式 A 对标分析:方式 A 的优点是实现最简单,每轮都是独立请求。但模型完全看不到第一轮的成果,等于重新做了一次单轮编辑。相比之下,完整历史回传能让第二轮站在第一轮的结果上继续修改。
方式 B 对标分析:方式 B 在请求体积上比较省,只传一张图。但模型缺少“红帽是刻意改出来的”这一上下文,也拿不到签名,局部一致性没有保障。对于需要连续精修的设计稿、电商主图等场景,方式 C 仍然是更稳妥的选择。
💡 选择建议:如果你的业务需要连续改两轮以上,建议直接采用方式 C。可以在 API易 apiyi.com 用同一套代码把三种方式各跑一遍,对比输出图,差异会很直观。
Nano Banana 2.1 与同系列模型的选择
API易 上的 Nano Banana 系列有多个型号,连续编辑属于编辑能力的进阶用法。下表帮助你在同系列中定位。
| 模型 | 定位 | 连续编辑建议 | 可用平台 |
|---|---|---|---|
| gemini-nano-banana-2.1 | 本文主角,支持基于历史和签名的连续编辑 | 推荐按方式 C 回传 | API易 apiyi.com |
| Nano Banana 2(gemini-3.1-flash-image) | 同系列生图与编辑模型 | 同样使用原生格式拼装历史 | API易 apiyi.com |
| 其他 Nano Banana 型号 | 按速度、画质需求选型 | 参考系列开发指南 | API易 apiyi.com |
Nano Banana 2.1 多轮编辑常见坑排查
实际接入时,大部分“改丢了”的问题都能归结到几个固定原因。下面按出现频率整理成清单,排查时逐项核对即可。
- 签名丢失:把 model 回复转换成自己的数据结构后再拼回去,字段名大小写或嵌套层级变了,导致 thoughtSignature 没传上去。解决办法是直接保存并回传原始 content 对象。
- 角色写错:把第一轮的模型回复标成
user角色,模型会把自己的输出当成用户上传的新图。model 回复必须保持role: model。 - 顺序颠倒:contents 必须按时间顺序排列,user1、model1、user2 依次出现,不能把新指令放在最前面。
- 混用格式:前一轮用 OpenAI 兼容格式、后一轮改用原生格式,中间的字段转换容易丢签名。整个多轮流程建议统一使用 Gemini 原生格式。
- 历史过长:轮次越多,请求里携带的图片越多,体积和耗时都会上涨。超过两三轮的长流程,可以考虑在关键节点把当前结果当作新原图重新开始一段历史。
🎯 技术建议:排查时可以先打印 model1 的 parts 结构,确认 thoughtSignature 字段确实存在,再检查发出的第二轮请求体里是否原样包含它。API易 apiyi.com 的文档中心有 Gemini 原生格式与多轮对话的拼装示例,可对照核对。
常见问题 FAQ
Q1:什么是 Nano Banana 2.1 多轮编辑?
指用 gemini-nano-banana-2.1 对同一张图进行连续修改,每一轮都在上一轮结果上只改局部。准确地说是“连续编辑”:每轮是独立请求,由客户端回传完整历史、上一轮图片和思维签名来延续上下文。
Q2:多轮编辑和单轮编辑有什么区别?
单轮编辑只关心“原图加一条指令”。多轮编辑要求模型同时理解之前做过的修改,并在新一轮中保住它们。单轮编辑无需历史,多轮编辑则必须带上历史和签名,否则会退化成对原图的重新编辑。
Q3:服务端会自动记住上一轮的上下文吗?
目前没有验证服务端会自动记忆上下文,因此不要依赖这一点。稳妥做法是把每轮请求都当作无状态请求,由客户端自行维护 contents 数组,这也和 Google 官方文档提供的连续编辑方式一致。
Q4:Nano Banana 2.1 多轮编辑适合哪些场景?
主要适合以下场景:
– **电商主图精修**:先换背景,再单独调整商品颜色,保持构图不变
– **角色设计迭代**:先换配饰,再改服装细节,保持人物面部一致
– **营销海报调整**:先改主视觉元素,再微调局部色块,避免整图重绘
Q5:如何通过 API 快速调用 Nano Banana 2.1 多轮编辑?
推荐按以下步骤测试:
1. 访问 API易 apiyi.com 注册账号并创建 API Key
2. 领取新用户免费测试额度
3. 运行本文完整代码,base_url 使用 `https://api.apiyi.com/v1`,原生格式路径以文档中心说明为准
同一个 API Key 还能调用 Nano Banana 系列其他型号,方便横向对比连续编辑效果。
Q6:Nano Banana 2.1 多轮编辑有哪些限制?
– 请求体积:每多一轮就多携带一张图,请求更大、耗时更长
– 一致性边界:本文案例验证的是两轮连续编辑,更多轮次的稳定性需要结合自己的素材实测
– 替代方案:长流程可在关键节点把当前结果作为新原图,重新开始一段历史
Nano Banana 2.1 多轮编辑核心要点 Key Takeaways
- 本质是连续编辑:每轮都是独立请求,上下文由客户端回传维持
- 三要素缺一不可:完整对话历史、上一轮输出图片、思维签名
- 原样回传 model 内容:直接保存 candidates[0].content,避免签名丢失
- 使用原生格式:generateContent 的 contents 结构最适合回传图片与签名
- 指令写清保留项:第二轮明确“只改哪里、哪些不变”,局部修改更稳
- 不重复附原图:第二轮附原图容易让模型回到修改前的版本
- 低成本验证:用 API易 apiyi.com 免费额度先跑通两轮再上线
总结
Nano Banana 2.1 多轮编辑的核心要点:
- 机制:所谓多轮编辑是基于客户端回传的连续编辑,服务端自动记忆尚未验证,不应依赖
- 回传内容:第二轮请求必须包含 user1、原样的 model1(含图片和 thought signature)以及 user2
- 实践技巧:统一使用 Gemini 原生格式,指令中写明保留项,不在新一轮重复附上原图
掌握这三点后,“皇冠换红帽、再把粉心改蓝”这类两轮连续改图就能稳定复现,同样的结构也可以扩展到更多轮次。
推荐通过 API易 apiyi.com 快速验证效果,平台提供 OpenAI 兼容与 Gemini 原生格式接口,一个 API Key 即可调用 Nano Banana 系列及其他主流模型,按量计费,适合先小规模测试再逐步接入生产。
📚 参考资料
- Google Gemini API 图片生成与编辑文档:官方多轮图片编辑说明
- 链接:
ai.google.dev/gemini-api/docs/image-generation -
说明:介绍图片编辑的请求结构和连续编辑的对话方式
-
Google Gemini API 思维签名文档:thought signature 机制说明
- 链接:
ai.google.dev/gemini-api/docs/thought-signatures -
说明:解释签名的作用以及在多轮请求中如何回传
-
API易 文档中心:Nano Banana 系列开发指南、多轮对话实现指南、Gemini 原生格式调用指南
- 链接:
docs.apiyi.com - 说明:包含接入端点、原生格式路径和历史拼装示例,是本文代码落地的对照依据
作者:APIYI 技术团队
技术交流:欢迎在 API易 网站首页联系我们,更多 Nano Banana 系列接入资料可访问 docs.apiyi.com 文档中心
