跳到主要内容

API 指南

Nano Banana 2 API 接入

本页展示 YingTu 当前使用的 API 设置,代码示例不会包含你的真实 Key。

打开 LaoZhang 令牌页

快速开始

  1. 1

    创建或选择一个 LaoZhang API Key。

  2. 2

    复制模型 ID 与代码示例。

  3. 3

    先执行一个小请求并检查响应,再扩大调用。

请求信息

生成接口
POST /v1beta/models/gemini-3.1-flash-image:generateContent
编辑接口
POST /v1beta/models/gemini-3.1-flash-image:generateContent
Base URL
https://api2.laozhang.ai
认证方式
Bearer API Key
请求格式
Gemini native
参考图
支持
参考图数量
YingTu 最多选择 5 张(不是上游提供方上限)
验证状态
尚未验证——目前没有可核对的验证日期。
打开 API 文档

Python 示例

替换占位 Key 与你自己的提示词;需要参考图时按文档使用编辑接口。

文生图示例

cURL
export LAOZHANG_API_KEY="replace-with-your-key"

curl --fail-with-body --max-time 500 \
  -X POST 'https://api2.laozhang.ai/v1beta/models/gemini-3.1-flash-image:generateContent' \
  -H "Authorization: Bearer ${LAOZHANG_API_KEY}" \
  -H "Content-Type: application/json" \
  --data '{"contents":[{"parts":[{"text":"浅色石材桌面上的哑光陶瓷咖啡杯商品图,柔和窗光,自然阴影,极简陈列,保留真实材质细节。"}]}],"generationConfig":{"responseModalities":["IMAGE"],"imageConfig":{"imageSize":"2K"}}}'

# The JSON response can contain base64 image data or an image URL.
# If this request times out, check request and billing logs before retrying.

参考图编辑示例

gemini-3.1-flash-image · edit
import base64
import mimetypes
import os
import sys

import requests

API_KEY = os.environ.get("LAOZHANG_API_KEY")
if not API_KEY:
    raise RuntimeError("Set the LAOZHANG_API_KEY environment variable before running this example.")

API_URL = "https://api2.laozhang.ai/v1beta/models/gemini-3.1-flash-image:generateContent"
REQUEST_TIMEOUT_SECONDS = 500

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

def encode_image(image_path):
    mime_type = mimetypes.guess_type(image_path)[0] or "image/jpeg"
    with open(image_path, "rb") as image_file:
        data = base64.b64encode(image_file.read()).decode("ascii")
    return {"mime_type": mime_type, "data": data}

reference_1 = encode_image("image_1.jpg")  # Replace with your image path

payload = {
    "contents": [{
        "parts": [
            {"text": "浅色石材桌面上的哑光陶瓷咖啡杯商品图,柔和窗光,自然阴影,极简陈列,保留真实材质细节。"},
            {"inline_data": reference_1}
        ]
    }],
    "generationConfig": {
        "responseModalities": ["IMAGE"],
        "imageConfig": {
            "imageSize": "2K"
        }
    }
}

try:
    response = requests.post(
        API_URL,
        headers=headers,
        json=payload,
        timeout=REQUEST_TIMEOUT_SECONDS,
    )
except requests.Timeout as error:
    print(
        "Request timed out after 500 seconds. The result status may be unknown; "
        "check call and billing logs before retrying.",
        file=sys.stderr,
    )
    raise SystemExit(1) from error

if response.status_code != 200:
    print(f"API error {response.status_code}: {response.text}", file=sys.stderr)
    raise SystemExit(1)

try:
    result = response.json()
except ValueError as error:
    print("API returned a non-JSON response.", file=sys.stderr)
    raise SystemExit(1) from error

if not isinstance(result, dict):
    print("API returned an unexpected JSON shape.", file=sys.stderr)
    raise SystemExit(1)

image_part = None
for candidate in result.get("candidates", []):
    for part in candidate.get("content", {}).get("parts", []):
        inline_data = part.get("inlineData") or part.get("inline_data")
        if inline_data and inline_data.get("data"):
            image_part = inline_data
            break
    if image_part:
        break

if not image_part:
    response_id = result.get("responseId", "not provided")
    print(f"No image data in response. responseId={response_id}", file=sys.stderr)
    raise SystemExit(1)

mime_type = image_part.get("mimeType") or image_part.get("mime_type") or "image/png"
encoded_image = image_part["data"]
if encoded_image.startswith("data:"):
    header, encoded_image = encoded_image.split(",", 1)
    mime_type = header[5:].split(";", 1)[0] or mime_type

extension_by_mime = {
    "image/jpeg": "jpg",
    "image/png": "png",
    "image/webp": "webp",
    "image/gif": "gif",
}
extension = extension_by_mime.get(mime_type, "bin")
output_path = f"output.{extension}"

with open(output_path, "wb") as output_file:
    output_file.write(base64.b64decode(encoded_image, validate=True))

print(f"Image saved: {output_path} ({mime_type})")
正式调用前,请在 LaoZhang 账户确认实时价格、余额和模型权限。

请求参数摘要

以下字段与当前 YingTu 客户端及代码示例保持一致。

model
必填。使用本页显示的精确模型 ID。
prompt
必填。填写图片指令,不要把 API Key 写进提示词。
输出控制
generationConfig.imageConfig.aspectRatioimageSize;自动纵横比不会发送。
参考图
可选。YingTu 浏览器最多 5 张,以 contents[].parts[].inline_data 发送。

响应与超时处理

图片响应
客户端从 candidates[].content.parts[].inlineDatainline_data 读取 base64 图片,并保留返回的 MIME 类型。
非图片响应
没有图片数据时不会判为成功;存在时会显示拦截原因、结束原因或 response ID。

客户端 500 秒超时

现有 YingTu 客户端在 500 秒后终止等待;此时上游结果与扣费状态仍可能未知。

不自动重试

YingTu 不会自动重试。再次发起付费调用前,先检查请求与计费日志。

常见错误路径

认证
确认环境变量中是预期的 Key,并通过 Bearer 认证头发送。
权限或余额
在 LaoZhang 检查模型权限、当前余额、计费和账户限制。
限流
降低并发,并先查看返回的上游或账户消息。
非图片或空结果
检查拦截原因、结束原因、API 消息与 response ID;仅在响应说明原因时再针对性调整提示词。
超时
最终状态可能未知;再次请求前先检查调用与计费日志。

已知限制

使用生成结果前,请重点检查以下内容。

  • 检查下载文件的实际尺寸;配置的输出控制不能替代结果核验。
  • 使用前检查主体身份、Logo、包装、颜色与细小品牌元素。
  • 可用性与延迟会随上游容量变化。
  • 实时价格、余额、权限和扣费以 LaoZhang 账户为准。

API 常见问题

API Key 应放在哪里?

使用代码示例中的环境变量。不要提交、打印,也不要把完整 Key 写入提示词。

超时是否代表请求失败?

不一定。500 秒后 YingTu 停止等待,但上游结果或扣费仍可能未知;重试前先检查日志。

参考图数量是提供方上限吗?

不是。本页显示的是 YingTu 当前限制,不代表上游提供方最大值。

在哪里确认价格和权限?

当前价格、余额、模型权限和扣费以 LaoZhang 账户为准。

价格与计费

本页显示参考价格;实时价格、余额、权限和扣费以 LaoZhang 账户为准。

模型信息
模型 ID
gemini-3.1-flash-image
参考价格
$0.055/ 次
输出尺寸
512 / 1K / 2K / 4K
API 类型
Gemini native

在图片工作室测试

以下是图片工作室当前可用的设置。

YingTuLaoZhang