📘 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 尺度。
🔐 驗證
到 會員中心 → API 金鑰 建立金鑰(格式 ii-…)。以下任一種方式帶入即可(與 Gemini 相同):
| 方式 | 範例 |
|---|---|
| HTTP 標頭(建議) | x-goog-api-key: ii-xxxxxxxx |
| Query 參數 | ?key=ii-xxxxxxxx |
| Bearer | Authorization: Bearer ii-xxxxxxxx |
⚠️ 金鑰等同帳號密碼,請放在後端伺服器,不要寫在公開的網頁前端或上傳到 GitHub。外洩時請立即撤銷。
🧠 模型與價格
呼叫時把模型 ID 放在網址路徑。以下單價為「每張圖片扣點」,送出時預扣,失敗自動退回。
| 模型 ID | 名稱 | 一般 1K / 2K / 4K | R18 1K / 2K / 4K |
|---|---|---|---|
gemini-3.1-flash-image-preview | Nano Banana 2 | 10 / 15 / 25 | 10 / 15 / 25 |
gemini-3-pro-image-preview | Nano Banana Pro | 15 / 20 / 30 | 15 / 20 / 30 |
gemini-2.5-flash-image | Nano Banana | 8 / 8 / 8 | 8 / 8 / 8 |
模型清單也可用 API 取得:GEThttps://anyai.sbs/v1beta/models
🎨 生成圖片:generateContent
預設為同步模式:連線會等到圖片生成完成(最多 240 秒)才回應,回應格式與 Gemini 完全相同。 若想立即取得任務 ID 再自行輪詢,請看 非同步任務。
也支援 :streamGenerateContent(相容用途,完成後一次送出;加 ?alt=sse 以 SSE 格式回應)。
📝 請求欄位
| 欄位 | 型別 | 說明 |
|---|---|---|
contents[] | array | 必填。對話內容,最後一則通常為 role: "user"。 |
contents[].parts[].text | string | 提示詞(文生圖描述,或對參考圖的修改指示)。 |
contents[].parts[].inlineData | object | 參考圖:{"mimeType":"image/png","data":"<base64>"}。支援 png / jpeg / webp,最多 14 張。不支援 fileData。 |
generationConfig.responseModalities | array | ["IMAGE"] 或 ["TEXT","IMAGE"]。 |
generationConfig.imageConfig.aspectRatio | string | 1: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.imageSize | string | 1K(預設)、2K、4K(大寫 K)。影響扣點。 |
generationConfig.thinkingConfig | object | 選填,例如 {"includeThoughts": true}。 |
tools | array | 選填,[{"google_search":{}}] 開啟搜尋 Grounding。 |
systemInstruction、safetySettings | object / array | 選填,原樣轉給模型。 |
IsNSFW | boolean | Inter Images 擴充欄位。false(預設)=一般尺度;true=R18 尺度。詳見下節。 |
欄位名稱 camelCase(inlineData)與 snake_case(inline_data)兩種寫法都接受。
🔞 IsNSFW:一般/R18 尺度
| IsNSFW | 尺度 | 由誰生成 | 說明 |
|---|---|---|---|
false(預設) | 一般尺度 | Inter Diffusion 節點 · Gemini Nano Banana | 受 Google 安全審查。被拒絕時平台原樣回傳模型的拒絕回覆並退回點數。 |
true | R18 尺度 | 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-Status | completed/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_..." }💻 範例程式碼
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.pngimport 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"))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"));$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)。
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 回應。
🔎 查詢/取消任務
{
"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 已取消(後四者皆自動退點)。
💰 查詢餘額
{"points": 1234, "email": "..."}⚠️ 錯誤碼
錯誤格式與 Gemini 相同:{"error": {"code": 400, "message": "...", "status": "INVALID_ARGUMENT"}}
| HTTP | status | 原因 |
|---|---|---|
| 400 | INVALID_ARGUMENT | 請求格式錯誤、不支援的比例/解析度、參考圖過多或格式不符 |
| 401 | UNAUTHENTICATED | 未帶金鑰、金鑰錯誤或已撤銷 |
| 402 | RESOURCE_EXHAUSTED | 點數不足 |
| 403 | PERMISSION_DENIED | 帳號停權、未開放 R18 尺度 |
| 404 | NOT_FOUND | 模型或任務不存在 |
| 413 | INVALID_ARGUMENT | 請求本文過大(請壓縮參考圖) |
| 429 | RESOURCE_EXHAUSTED | 超過每分鐘請求上限,或同時進行中的任務太多 |
| 499 | CANCELLED | 任務已取消(已退點) |
| 502 | UNAVAILABLE | 生成失敗(已退點) |
| 503 | UNAVAILABLE | 目前沒有可用的生成節點/系統維護中(已退點) |
| 504 | DEADLINE_EXCEEDED | 同步等待逾時但任務仍在生成,請用回應訊息中的任務 ID 查詢結果 |
🧾 計費與退點
- 送出請求時依「模型 × 解析度 × 尺度」預扣點數,點數不足會直接回 402。
- 以下情況自動全額退點:安全審查駁回、生成失敗、排隊逾時、取消。
- 每一筆扣點/退點都記錄在 會員中心 → 點數紀錄。
- 點數可透過 兌換碼 儲值,或聯絡客服。
🚦 限制
| 項目 | 限制 |
|---|---|
| 每把金鑰每分鐘請求數 | 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"} 主動釋放(停止接單時) |