📘 Inter Images API 文件

Inter Images 是 Google Gemini 圖片模型(Nano Banana)相容的 API 中轉平台。請求與回應格式和 gemini-3.1-flash-image-preview/gemini-3-pro-image-preview 的 generateContent 完全相同, 只要把網址換成 Inter Images、金鑰換成 Inter Images API KEY 即可使用。平台另外擴充一個 IsNSFW 參數,用來指定一般或 R18 尺度。

Base URL:https://anyai.sbs/v1beta

🔐 驗證

到 會員中心 → API 金鑰 建立金鑰(格式 ii-…)。以下任一種方式帶入即可(與 Gemini 相同):

方式範例
HTTP 標頭(建議)x-goog-api-key: ii-xxxxxxxx
Query 參數?key=ii-xxxxxxxx
BearerAuthorization: Bearer ii-xxxxxxxx

⚠️ 金鑰等同帳號密碼,請放在後端伺服器,不要寫在公開的網頁前端或上傳到 GitHub。外洩時請立即撤銷。

🧠 模型與價格

呼叫時把模型 ID 放在網址路徑。以下單價為「每張圖片扣點」,送出時預扣,失敗自動退回。

模型 ID名稱一般 1K / 2K / 4KR18 1K / 2K / 4K
gemini-3.1-flash-image-previewNano Banana 2 10 / 15 / 25 10 / 15 / 25
gemini-3-pro-image-previewNano Banana Pro 15 / 20 / 30 15 / 20 / 30
gemini-2.5-flash-imageNano Banana 8 / 8 / 8 8 / 8 / 8

模型清單也可用 API 取得:GEThttps://anyai.sbs/v1beta/models

🎨 生成圖片:generateContent

POSThttps://anyai.sbs/v1beta/models/{模型ID}:generateContent

預設為同步模式:連線會等到圖片生成完成(最多 240 秒)才回應,回應格式與 Gemini 完全相同。 若想立即取得任務 ID 再自行輪詢,請看 非同步任務。

也支援 :streamGenerateContent(相容用途,完成後一次送出;加 ?alt=sse 以 SSE 格式回應)。

📝 請求欄位

欄位型別說明
contents[]array必填。對話內容,最後一則通常為 role: "user"。
contents[].parts[].textstring提示詞(文生圖描述,或對參考圖的修改指示)。
contents[].parts[].inlineDataobject參考圖:{"mimeType":"image/png","data":"<base64>"}。支援 png / jpeg / webp,最多 14 張。不支援 fileData。
generationConfig.responseModalitiesarray["IMAGE"] 或 ["TEXT","IMAGE"]。
generationConfig.imageConfig.aspectRatiostring1:1、2:3、3:2、3:4、4:3、4:5、5:4、9:16、16:9、21:9(另支援 1:4、4:1、1:8、8:1、9:21)。
generationConfig.imageConfig.imageSizestring1K(預設)、2K、4K(大寫 K)。影響扣點。
generationConfig.thinkingConfigobject選填,例如 {"includeThoughts": true}。
toolsarray選填,[{"google_search":{}}] 開啟搜尋 Grounding。
systemInstruction、safetySettingsobject / array選填,原樣轉給模型。
IsNSFWbooleanInter Images 擴充欄位。false(預設)=一般尺度;true=R18 尺度。詳見下節。

欄位名稱 camelCase(inlineData)與 snake_case(inline_data)兩種寫法都接受。

🔞 IsNSFW:一般/R18 尺度

IsNSFW尺度由誰生成說明
false(預設)一般尺度Inter Diffusion 節點 · Gemini Nano Banana受 Google 安全審查。被拒絕時平台原樣回傳模型的拒絕回覆並退回點數。
trueR18 尺度Inter Image Edit - NSFW 節點 · 本地 Qwen-Image-Edit Rapid AIO本地開源模型,不經 Google 安全審查。支援文生圖與 1–3 張參考圖改圖。

建議流程:先用 "IsNSFW": false 送出 → 若回應被安全審查拒絕(回應標頭 X-Inter-Status: rejected,本文含 promptFeedback.blockReason 或 finishReason: "IMAGE_SAFETY" 等)→ 點數已退回 → 改用 "IsNSFW": true 重新送出。

也可以用 HTTP 標頭 X-Is-NSFW: true 或 Query ?IsNSFW=true 指定。R18 尺度需帳號已開放權限。

{
  "contents": [{ "parts": [{ "text": "..." }] }],
  "generationConfig": { "imageConfig": { "aspectRatio": "3:4", "imageSize": "1K" } },
  "IsNSFW": true
}

📦 回應格式

成功時與 Gemini 相同,圖片在 candidates[0].content.parts[] 的 inlineData(base64):

{
  "candidates": [{
    "content": { "role": "model", "parts": [
      { "inlineData": { "mimeType": "image/png", "data": "iVBORw0KGgo..." } }
    ]},
    "finishReason": "STOP"
  }],
  "modelVersion": "gemini-3.1-flash-image-preview",
  "responseId": "task_2610213xYz..."
}

平台會額外加上回應標頭:

標頭說明
X-Inter-Task-Id任務 ID,可用來查詢或向客服反映。
X-Inter-Statuscompleted/rejected(安全審查拒絕)/failed 等。
X-Inter-Cost本次實際扣點(退點後為 0)。
X-Inter-Balance目前點數餘額。

安全審查拒絕時,HTTP 狀態仍為 200(與 Gemini 相同),本文是模型原始的拒絕回覆,例如:

{ "promptFeedback": { "blockReason": "PROHIBITED_CONTENT" }, "modelVersion": "gemini-3.1-flash-image-preview", "responseId": "task_..." }

💻 範例程式碼

bash
curl -s "https://anyai.sbs/v1beta/models/gemini-3.1-flash-image-preview:generateContent" \
  -H "x-goog-api-key: $INTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{ "parts": [
      { "text": "把這張照片改成吉卜力動畫風格" },
      { "inlineData": { "mimeType": "image/jpeg", "data": "'"$(base64 -w0 photo.jpg)"'" } }
    ]}],
    "generationConfig": { "responseModalities": ["IMAGE"], "imageConfig": { "aspectRatio": "3:4", "imageSize": "2K" } },
    "IsNSFW": false
  }' | jq -r '.candidates[0].content.parts[] | select(.inlineData) | .inlineData.data' | base64 -d > out.png
python
import base64, requests

API = "https://anyai.sbs/v1beta/models/gemini-3.1-flash-image-preview:generateContent"
KEY = "ii-你的金鑰"

def generate(prompt, images=(), nsfw=False, ratio="1:1", size="1K"):
    parts = [{"text": prompt}]
    for path in images:
        parts.append({"inlineData": {"mimeType": "image/png",
                      "data": base64.b64encode(open(path, "rb").read()).decode()}})
    body = {"contents": [{"parts": parts}],
            "generationConfig": {"responseModalities": ["IMAGE"],
                                 "imageConfig": {"aspectRatio": ratio, "imageSize": size}},
            "IsNSFW": nsfw}
    r = requests.post(API, json=body, headers={"x-goog-api-key": KEY}, timeout=300)
    r.raise_for_status()
    status = r.headers.get("X-Inter-Status")
    if status == "rejected" and not nsfw:
        print("被安全審查拒絕(已退點),改用 R18 尺度重送")
        return generate(prompt, images, True, ratio, size)
    for part in r.json()["candidates"][0]["content"]["parts"]:
        if "inlineData" in part:
            return base64.b64decode(part["inlineData"]["data"])
    raise RuntimeError("沒有輸出圖片:%s" % r.text[:300])

open("out.png", "wb").write(generate("a cyberpunk cat, neon rain", ratio="16:9"))
javascript
const API = "https://anyai.sbs/v1beta/models/gemini-3.1-flash-image-preview:generateContent";

const res = await fetch(API, {
  method: "POST",
  headers: { "Content-Type": "application/json", "x-goog-api-key": process.env.INTER_API_KEY },
  body: JSON.stringify({
    contents: [{ parts: [{ text: "a watercolor fox in a snowy forest" }] }],
    generationConfig: { responseModalities: ["IMAGE"], imageConfig: { aspectRatio: "4:3", imageSize: "1K" } },
    IsNSFW: false,
  }),
});
console.log(res.headers.get("X-Inter-Status"), res.headers.get("X-Inter-Balance"));
const data = await res.json();
const img = data.candidates?.[0]?.content?.parts?.find(p => p.inlineData);
if (img) require("fs").writeFileSync("out.png", Buffer.from(img.inlineData.data, "base64"));
php
$body = [
  'contents' => [['parts' => [['text' => 'a cozy cabin, golden hour']]]],
  'generationConfig' => ['responseModalities' => ['IMAGE'], 'imageConfig' => ['aspectRatio' => '16:9', 'imageSize' => '2K']],
  'IsNSFW' => false,
];
$ch = curl_init('https://anyai.sbs/v1beta/models/gemini-3.1-flash-image-preview:generateContent');
curl_setopt_array($ch, [
  CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 300,
  CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'x-goog-api-key: ii-你的金鑰'],
  CURLOPT_POSTFIELDS => json_encode($body),
]);
$j = json_decode(curl_exec($ch), true);
foreach ($j['candidates'][0]['content']['parts'] ?? [] as $p) {
  if (isset($p['inlineData'])) file_put_contents('out.png', base64_decode($p['inlineData']['data']));
}

🧩 官方 Google Gen AI SDK 用法

官方 SDK 只要把 base URL 指到 Inter Images 即可(IsNSFW 為擴充欄位,SDK 不支援時請改用 HTTP 標頭 X-Is-NSFW: true)。

python
from google import genai
from google.genai import types

client = genai.Client(
    api_key="ii-你的金鑰",
    http_options=types.HttpOptions(base_url="https://anyai.sbs",
                                   headers={"X-Is-NSFW": "false"}, timeout=300_000),
)
resp = client.models.generate_content(
    model="gemini-3.1-flash-image-preview",
    contents="a red panda barista, studio lighting",
    config=types.GenerateContentConfig(
        response_modalities=["IMAGE"],
        image_config=types.ImageConfig(aspect_ratio="1:1", image_size="1K")),
)
for part in resp.candidates[0].content.parts:
    if part.inline_data:
        open("out.png", "wb").write(part.inline_data.data)

⏱️ 非同步任務

在網址加上 ?async=true(或本文 "async": true),API 會立即回傳任務資訊(點數已預扣):

{
  "name": "tasks/task_2610213xYzAbCdEf",
  "done": false,
  "metadata": { "taskId": "task_2610213xYzAbCdEf", "status": "queued", "model": "gemini-3.1-flash-image-preview", "isNSFW": false, "cost": 10 }
}

之後每 3–5 秒查詢一次任務,done: true 時 response 就是完整的 Gemini 回應。

🔎 查詢/取消任務

GEThttps://anyai.sbs/v1beta/tasks/{taskId}
{
  "name": "tasks/task_...", "done": true,
  "metadata": { "status": "completed", "cost": 10, "refunded": false, ... },
  "response": { "candidates": [ ... ] }      // 完成時
  // 失敗/駁回時另有 "error": { "code": 400, "status": "REJECTED", "message": "..." }
}

任務狀態:queued 排隊中 → processing 生成中 → completed 完成;或 rejected 安全駁回、failed 失敗、expired 排隊逾時、cancelled 已取消(後四者皆自動退點)。

GEThttps://anyai.sbs/v1beta/tasks?pageSize=20  最近的任務
POSThttps://anyai.sbs/v1beta/tasks/{taskId}:cancel  取消排隊中的任務(退點)

💰 查詢餘額

GEThttps://anyai.sbs/v1beta/balance → {"points": 1234, "email": "..."}

⚠️ 錯誤碼

錯誤格式與 Gemini 相同:{"error": {"code": 400, "message": "...", "status": "INVALID_ARGUMENT"}}

HTTPstatus原因
400INVALID_ARGUMENT請求格式錯誤、不支援的比例/解析度、參考圖過多或格式不符
401UNAUTHENTICATED未帶金鑰、金鑰錯誤或已撤銷
402RESOURCE_EXHAUSTED點數不足
403PERMISSION_DENIED帳號停權、未開放 R18 尺度
404NOT_FOUND模型或任務不存在
413INVALID_ARGUMENT請求本文過大(請壓縮參考圖)
429RESOURCE_EXHAUSTED超過每分鐘請求上限,或同時進行中的任務太多
499CANCELLED任務已取消(已退點)
502UNAVAILABLE生成失敗(已退點)
503UNAVAILABLE目前沒有可用的生成節點/系統維護中(已退點)
504DEADLINE_EXCEEDED同步等待逾時但任務仍在生成,請用回應訊息中的任務 ID 查詢結果

🧾 計費與退點

🚦 限制

項目限制
每把金鑰每分鐘請求數30
每個帳號同時進行中的任務8
單筆參考圖數量14 張(R18 尺度實際使用前 3 張)
單筆請求大小30 MB(含 base64)
同步等待上限240 秒
每次生成張數1 張(candidateCount 只支援 1)
結果保留2 小時,請自行下載保存(之後只保留文字紀錄)

🖥️ 生產端 API(PC 生產 APP 用)

生成節點(Inter Diffusion/Inter Image Edit - NSFW)使用管理員核發的生產端 KEY(iip-…),以 Authorization: Bearer 驗證。一般開發者不需要使用。

端點說明
GET/api/worker/ping驗證 KEY、回報上線,取得節點資訊、建議輪詢秒數與佇列數
GET/api/worker/tasks未完成(排隊中)任務清單(摘要)
POST/api/worker/claim{"limit":1} 領取任務,回傳完整 Gemini 請求本文(含參考圖),並取得租約
POST/api/worker/heartbeat{"task_ids":[...]} 延長租約
POST/api/worker/complete{"task_id","response":<Gemini 回應>} 回傳結果並標記完成
POST/api/worker/reject{"task_id","reason","response"} 安全審查拒絕(原樣轉回用戶並退點)
POST/api/worker/fail{"task_id","error","retryable"} 生成失敗;retryable=true 放回佇列
POST/api/worker/release{"task_id"} 主動釋放(停止接單時)
預覽