Skip to content

Gemini 3 Pro Image 多轮图片修改 API 文档

Gemini 3 Pro Image 的多轮图片修改功能支持你以"对话"的方式来生成并持续调整图片:你可以先用一句话描述想要的画面生成初稿,然后像和设计师沟通一样,在后续轮次里不断补充细节或提出修改要求,例如更换背景、调整风格与色调、添加或删除元素、改变人物姿态与表情等。系统会理解上下文并记住前几轮的修改结果,每一次调整都会基于上一张图继续迭代,因此不需要你反复从头描述。整体上,建议用聊天或多轮对话逐步打磨作品,从"先有大方向"到"再精修细节",效率更高、效果也更可控。

模型名称

  • 模型名称: gemini-3-pro-image
  • 别名: Nano Banana Pro(香蕉Pro)

请求地址

 https://www.dmxapi.cn/v1beta/models/gemini-3-pro-image:generateContent

WARNING

注意:请妥善保管API密钥,不要泄露给他人。

图片生成 调用示例

python
"""
================================================================================
Gemini 3 Pro Image 图片生成示例 - 01
================================================================================
功能说明:
    本脚本演示如何使用 Gemini 3 Pro Image API 根据文本提示生成图片。
    生成的图片会保存到本地,同时 base64 数据和思考签名也会保存以供后续多轮对话使用。
================================================================================
"""

import requests
import json
import base64
import os
from datetime import datetime

# ==============================================================================
# 配置区域
# ==============================================================================

# API 请求地址
url = "https://www.dmxapi.cn/v1beta/models/gemini-3-pro-image:generateContent"

# API 密钥(请妥善保管,不要泄露)
api_key = "sk-**********************************************************************"

# 请求头配置
headers = {
    "x-goog-api-key": api_key,          # API 认证密钥
    "Content-Type": "application/json"   # 内容类型为 JSON
}

# ==============================================================================
# 请求数据构建
# ==============================================================================

data = {
    # -------------------------------------------------------------------------
    # contents: 对话内容列表
    # -------------------------------------------------------------------------
    "contents": [{
        "role": "user",
        "parts": [
            {"text": "一只4B铅笔"}  # 图片生成提示词
        ]
    }],

    # -------------------------------------------------------------------------
    # tools: Google 搜索工具(可选)
    # -------------------------------------------------------------------------
    "tools": [
        {"google_search": {}}
    ],

    # -------------------------------------------------------------------------
    # generationConfig: 生成配置
    # -------------------------------------------------------------------------
    "generationConfig": {
        "responseModalities": ["TEXT", "IMAGE"]  # 响应模态:同时返回文本和图片
    }
}

# ==============================================================================
# 创建数据保存目录
# ==============================================================================

base64_folder = "base64_data"
if not os.path.exists(base64_folder):
    os.makedirs(base64_folder)
    print(f"已创建目录: {base64_folder}")

# 新增:思考签名保存目录
signature_folder = "signature_data"
if not os.path.exists(signature_folder):
    os.makedirs(signature_folder)
    print(f"已创建目录: {signature_folder}")

# ==============================================================================
# 发送 API 请求
# ==============================================================================

print("=" * 60)
print("正在发送请求到 Gemini API...")
print("=" * 60)

response = requests.post(url, headers=headers, json=data)
result = response.json()

if result.get("candidates"):
    print("\n" + "=" * 60)
    print("响应解析成功!")
    print("=" * 60 + "\n")

    for candidate in result["candidates"]:
        if "content" in candidate and "parts" in candidate["content"]:
            for part in candidate["content"]["parts"]:
                # 统一生成时间戳(同一 part 的多种数据共用)
                timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

                # -------------------------------------------------------------
                # 处理文本部分
                # -------------------------------------------------------------
                if "text" in part:
                    print("+" + "-" * 58 + "+")
                    print("| 文本内容                                                 |")
                    print("+" + "-" * 58 + "+")
                    print(part["text"])
                    print("+" + "-" * 58 + "+\n")

                # -------------------------------------------------------------
                # 处理图片部分(Base64 格式)
                # -------------------------------------------------------------
                if "inlineData" in part:
                    mime_type = part["inlineData"].get("mimeType", "image/png")
                    base64_data = part["inlineData"].get("data", "")

                    # 生成带时间戳的文件名
                    extension = mime_type.split("/")[-1]
                    filename = f"gemini_image_{timestamp}.{extension}"

                    # 解码 Base64 数据并保存图片到本地
                    image_data = base64.b64decode(base64_data)
                    with open(filename, "wb") as f:
                        f.write(image_data)

                    # 保存 Base64 数据到文件(供多轮对话使用)
                    base64_filename = os.path.join(base64_folder, f"gemini_base64_{timestamp}.txt")
                    with open(base64_filename, "w", encoding="utf-8") as f:
                        f.write(base64_data)

                    print("+" + "-" * 58 + "+")
                    print("| 图片信息                                                 |")
                    print("+" + "-" * 58 + "+")
                    print(f"| 图片文件: {filename:<46} |")
                    print(f"| Base64文件: {base64_filename:<44} |")
                    print(f"| MIME类型: {mime_type:<46} |")
                    print(f"| 数据长度: {len(base64_data):,} 字符{' ' * (39 - len(f'{len(base64_data):,}'))} |")
                    print("+" + "-" * 58 + "+")
                    print("| 图片和 Base64 数据已成功保存!                            |")
                    print("+" + "-" * 58 + "+\n")

                # -------------------------------------------------------------
                # 处理图片部分(URL 格式)
                # -------------------------------------------------------------
                if "fileData" in part:
                    file_uri = part["fileData"].get("fileUri", "")
                    mime_type = part["fileData"].get("mimeType", "")

                    print("+" + "-" * 58 + "+")
                    print("| 图片链接                                                 |")
                    print("+" + "-" * 58 + "+")
                    print(f"| URL: {file_uri[:50]:<52} |")
                    print(f"| MIME类型: {mime_type:<46} |")
                    print("+" + "-" * 58 + "+\n")

                # -------------------------------------------------------------
                # 处理思考签名部分(thoughtSignature)  ← 新增
                # - 用于多轮对话时保持思维链连续性,需原样回传
                # -------------------------------------------------------------
                if "thoughtSignature" in part:
                    thought_signature = part["thoughtSignature"]

                    # 保存思考签名到文件(供多轮对话使用)
                    signature_filename = os.path.join(
                        signature_folder, f"gemini_signature_{timestamp}.txt"
                    )
                    with open(signature_filename, "w", encoding="utf-8") as f:
                        f.write(thought_signature)

                    print("+" + "-" * 58 + "+")
                    print("| 思考签名 (thoughtSignature)                              |")
                    print("+" + "-" * 58 + "+")
                    print(f"| 签名文件: {signature_filename:<46} |")
                    print(f"| 签名长度: {len(thought_signature):,} 字符{' ' * (39 - len(f'{len(thought_signature):,}'))} |")
                    print("+" + "-" * 58 + "+")
                    print("| 思考签名已成功保存!(多轮对话需原样回传)                |")
                    print("+" + "-" * 58 + "+\n")

    # -------------------------------------------------------------------------
    # 额外:保存完整的 model parts(含思考签名),方便多轮对话直接复用  ← 新增
    # -------------------------------------------------------------------------
    full_timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    model_parts_filename = os.path.join(signature_folder, f"model_parts_{full_timestamp}.json")
    model_parts = result["candidates"][0].get("content", {}).get("parts", [])
    with open(model_parts_filename, "w", encoding="utf-8") as f:
        json.dump(model_parts, f, ensure_ascii=False, indent=2)
    print(f"完整 model parts(含签名)已保存: {model_parts_filename}\n")

else:
    # -------------------------------------------------------------------------
    # 错误处理:响应中没有 candidates 字段
    # -------------------------------------------------------------------------
    print("\n" + "=" * 60)
    print("响应异常,完整内容如下:")
    print("=" * 60)
    print(json.dumps(result, indent=2, ensure_ascii=False))
    print("=" * 60 + "\n")

# ==============================================================================
# 脚本结束
# ==============================================================================
print("\n" + "=" * 60)
print("脚本执行完毕")
print("=" * 60)

返回示例

json
============================================================
正在发送请求到 Gemini API...
============================================================

============================================================
响应解析成功!
============================================================

+----------------------------------------------------------+
| 图片信息                                                 |
+----------------------------------------------------------+
| 图片文件: gemini_image_20260604_123835.jpeg              |
| Base64文件: base64_data\gemini_base64_20260604_123835.txt |
| MIME类型: image/jpeg                                     |
| 数据长度: 815,800 字符                                 |
+----------------------------------------------------------+
| 图片和 Base64 数据已成功保存!                            |
+----------------------------------------------------------+

+----------------------------------------------------------+
| 思考签名 (thoughtSignature)                              |
+----------------------------------------------------------+
| 签名文件: signature_data\gemini_signature_20260604_123835.txt |
| 签名长度: 738,356 字符                                 |
+----------------------------------------------------------+
| 思考签名已成功保存!(多轮对话需原样回传)                |
+----------------------------------------------------------+

完整 model parts(含签名)已保存: signature_data\model_parts_20260604_123835.json


============================================================
脚本执行完毕
============================================================

多轮对话 示例代码

python
"""
================================================================================
Gemini 3 Pro Image 多轮图片修改示例 - 02(含思考签名回传)
================================================================================
功能说明:
    本脚本演示如何使用 Gemini 3 Pro Image API 进行多轮对话式图片编辑。
    通过传递历史对话、之前生成的图片,以及思考签名(thoughtSignature),
    可以让大模型在原图基础上进行修改,并保持思维链连续性。
================================================================================
"""
import requests
import json
import base64
import os
from datetime import datetime

# ==============================================================================
# 配置区域
# ==============================================================================

# API 请求地址
url = "https://www.dmxapi.cn/v1beta/models/gemini-3-pro-image:generateContent"

# API 密钥(请妥善保管,不要泄露)
api_key = "sk-**********************************************************************"

# -----------------------------------------------------------------------------
# 上一轮生成的图片 base64 数据文件路径
# 注意:请替换为示例 01 实际生成的 base64 文件名(文件名带时间戳)
# -----------------------------------------------------------------------------
base64_file = r"base64_data\gemini_base64_20260604_123835.txt"
with open(base64_file, "r", encoding="utf-8") as f:
    previous_image_data = f.read().strip()

# -----------------------------------------------------------------------------
# 上一轮生成的思考签名文件路径(由脚本 01 保存)  ← 新增
# - 如果存在则读取,并在第 2 轮 model part 中原样回传
# 注意:请替换为示例 01 实际生成的签名文件名(文件名带时间戳)
# -----------------------------------------------------------------------------
signature_file = r"signature_data\gemini_signature_20260604_123835.txt"
previous_thought_signature = None
if os.path.exists(signature_file):
    with open(signature_file, "r", encoding="utf-8") as f:
        previous_thought_signature = f.read().strip()
    print(f"已读取上一轮思考签名: {signature_file}(长度 {len(previous_thought_signature):,} 字符)")
else:
    print(f"未找到思考签名文件,将不回传签名: {signature_file}")

# 请求头配置
headers = {
    "x-goog-api-key": api_key,          # API 认证密钥
    "Content-Type": "application/json"   # 内容类型为 JSON
}


# ==============================================================================
# 多轮对话数据构建
# ==============================================================================
#
# 对话结构说明:
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │  第 1 轮 (user)  : 用户发起初始请求                                          │
# │  第 2 轮 (model) : 模型返回的图片 + 思考签名(原样回传)                      │
# │  第 3 轮 (user)  : 用户基于上一轮图片,提出修改要求                           │
# └─────────────────────────────────────────────────────────────────────────────┘
#

# -----------------------------------------------------------------------------
# 构建第 2 轮 model 的 part:图片数据 + 思考签名
# -----------------------------------------------------------------------------
model_image_part = {
    "inline_data": {
        "mime_type": "image/jpeg",           # 图片 MIME 类型
        "data": previous_image_data          # 从文件读取的 base64 数据
    }
}

# 如果上一轮返回了思考签名,则原样附加到该 part 中  ← 新增
if previous_thought_signature:
    model_image_part["thoughtSignature"] = previous_thought_signature

data = {
    # -------------------------------------------------------------------------
    # contents: 对话内容列表,按时间顺序排列
    # -------------------------------------------------------------------------
    "contents": [
        # 第 1 轮:用户初始请求
        {
            "role": "user",
            "parts": [{"text": "一只4B铅笔"}]
        },
        # 第 2 轮:模型返回的图片(含思考签名)
        {
            "role": "model",
            "parts": [model_image_part]
        },
        # 第 3 轮:用户的修改请求
        {
            "role": "user",
            "parts": [{"text": "给铅笔加上小翅膀"}]
        }
    ],

    # -------------------------------------------------------------------------
    # tools: Google 搜索工具(可选)
    # -------------------------------------------------------------------------
    "tools": [
        {"google_search": {}}
    ],

    # -------------------------------------------------------------------------
    # generationConfig: 生成配置
    # -------------------------------------------------------------------------
    "generationConfig": {
        # 响应模态:同时返回文本和图片
        "responseModalities": ["TEXT", "IMAGE"],

        # 图片配置
        "imageConfig": {
            "aspectRatio": "16:9",           # 宽高比:16:9
            "imageSize": "2K"                # 图片分辨率:2K 高清
        }
    }
}


# ==============================================================================
# 创建数据保存目录
# ==============================================================================

base64_folder = "base64_data"
if not os.path.exists(base64_folder):
    os.makedirs(base64_folder)

signature_folder = "signature_data"
if not os.path.exists(signature_folder):
    os.makedirs(signature_folder)


# ==============================================================================
# 发送 API 请求
# ==============================================================================

print("=" * 60)
print("正在发送请求到 Gemini API...")
print("=" * 60)

response = requests.post(url, headers=headers, json=data)
result = response.json()

if result.get("candidates"):
    print("\n" + "=" * 60)
    print("响应解析成功!")
    print("=" * 60 + "\n")

    for candidate in result["candidates"]:
        if "content" in candidate and "parts" in candidate["content"]:
            for part in candidate["content"]["parts"]:
                # 统一时间戳
                timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

                # -------------------------------------------------------------
                # 处理文本部分
                # -------------------------------------------------------------
                if "text" in part:
                    print("+" + "-" * 58 + "+")
                    print("| 文本内容                                                 |")
                    print("+" + "-" * 58 + "+")
                    print(part["text"])
                    print("+" + "-" * 58 + "+\n")

                # -------------------------------------------------------------
                # 处理图片部分(Base64 格式)
                # -------------------------------------------------------------
                if "inlineData" in part:
                    mime_type = part["inlineData"].get("mimeType", "image/png")
                    base64_data = part["inlineData"].get("data", "")

                    extension = mime_type.split("/")[-1]
                    filename = f"gemini_image_{timestamp}.{extension}"

                    # 解码 Base64 数据并保存图片
                    image_data = base64.b64decode(base64_data)
                    with open(filename, "wb") as f:
                        f.write(image_data)

                    # 保存本轮 base64 数据(供下一轮继续使用)
                    base64_filename = os.path.join(base64_folder, f"gemini_base64_{timestamp}.txt")
                    with open(base64_filename, "w", encoding="utf-8") as f:
                        f.write(base64_data)

                    print("+" + "-" * 58 + "+")
                    print("| 图片信息                                                 |")
                    print("+" + "-" * 58 + "+")
                    print(f"| 文件名称: {filename:<46} |")
                    print(f"| Base64文件: {base64_filename:<44} |")
                    print(f"| MIME类型: {mime_type:<46} |")
                    print(f"| 数据长度: {len(base64_data):,} 字符{' ' * (39 - len(f'{len(base64_data):,}'))} |")
                    print("+" + "-" * 58 + "+")
                    print("| 图片已成功保存到本地!                                    |")
                    print("+" + "-" * 58 + "+\n")

                # -------------------------------------------------------------
                # 处理图片部分(URL 格式)
                # -------------------------------------------------------------
                if "fileData" in part:
                    file_uri = part["fileData"].get("fileUri", "")
                    mime_type = part["fileData"].get("mimeType", "")

                    print("+" + "-" * 58 + "+")
                    print("| 图片链接                                                 |")
                    print("+" + "-" * 58 + "+")
                    print(f"| URL: {file_uri[:50]:<52} |")
                    print(f"| MIME类型: {mime_type:<46} |")
                    print("+" + "-" * 58 + "+\n")

                # -------------------------------------------------------------
                # 处理思考签名部分(thoughtSignature)  ← 新增
                # - 保存本轮返回的签名,供再下一轮对话继续回传
                # -------------------------------------------------------------
                if "thoughtSignature" in part:
                    thought_signature = part["thoughtSignature"]

                    signature_filename = os.path.join(
                        signature_folder, f"gemini_signature_{timestamp}.txt"
                    )
                    with open(signature_filename, "w", encoding="utf-8") as f:
                        f.write(thought_signature)

                    print("+" + "-" * 58 + "+")
                    print("| 思考签名 (thoughtSignature)                              |")
                    print("+" + "-" * 58 + "+")
                    print(f"| 签名文件: {signature_filename:<46} |")
                    print(f"| 签名长度: {len(thought_signature):,} 字符{' ' * (39 - len(f'{len(thought_signature):,}'))} |")
                    print("+" + "-" * 58 + "+")
                    print("| 思考签名已保存!(下一轮对话可继续回传)                  |")
                    print("+" + "-" * 58 + "+\n")

else:
    # -------------------------------------------------------------------------
    # 错误处理
    # -------------------------------------------------------------------------
    print("\n" + "=" * 60)
    print("响应异常,完整内容如下:")
    print("=" * 60)
    print(json.dumps(result, indent=2, ensure_ascii=False))
    print("=" * 60 + "\n")


# ==============================================================================
# 脚本结束
# ==============================================================================
print("\n" + "=" * 60)
print("脚本执行完毕")
print("=" * 60)

返回示例

json
已读取上一轮思考签名: signature_data\gemini_signature_20260604_123835.txt(长度 738,356 字符)
============================================================
正在发送请求到 Gemini API...
============================================================

============================================================
响应解析成功!
============================================================

+----------------------------------------------------------+
| 图片信息                                                 |
+----------------------------------------------------------+
| 文件名称: gemini_image_20260604_124234.jpeg              |
| Base64文件: base64_data\gemini_base64_20260604_124234.txt |
| MIME类型: image/jpeg                                     |
| 数据长度: 3,066,852 字符                               |
+----------------------------------------------------------+
| 图片已成功保存到本地!                                    |
+----------------------------------------------------------+

+----------------------------------------------------------+
| 思考签名 (thoughtSignature)                              |
+----------------------------------------------------------+
| 签名文件: signature_data\gemini_signature_20260604_124234.txt |
| 签名长度: 3,221,988 字符                               |
+----------------------------------------------------------+
| 思考签名已保存!(下一轮对话可继续回传)                  |
+----------------------------------------------------------+


============================================================
脚本执行完毕
============================================================

© 2026 DMXAPI gemini多轮图片修改

一个 Key 用全球大模型