圖片生成
以 OpenRouter/OpenAI 相容的 Images API 呼叫 GPT Image、Nano Banana、FLUX、Seedream 與 Recraft
Hakila 提供生圖 API,一把 API Key 就能呼叫 OpenAI、Google、xAI,以及經 OpenRouter 轉接的 FLUX、Seedream、Recraft。 有兩種請求格式,共用同一條管線:
| 端點 | 格式 | 適合 |
|---|---|---|
POST /v1/images | OpenRouter Image API | 新專案;用 aspect_ratio + resolution 描述尺寸,input_references 帶參考圖 |
POST /v1/images/generations | OpenAI Images | 寫死 OpenAI SDK 的工具(client.images.generate) |
POST /v1/images/edits | OpenAI Images(multipart 或 JSON) | client.images.edit,上傳圖片與遮罩 |
兩種格式都能用任何生圖模型,不限 OpenAI;Hakila 會把參數換算成各供應商的原生 API。
生圖模型在目錄中是獨立類型:GET /v1/models 回傳 type: image,也可以用
GET /v1/models?output_modalities=image 只列生圖模型。用錯端點會回 400。
支援的模型
種子目錄目前包含(單價以 GET /v1/images/models/{id}/endpoints 為準):
| 模型 id | 供應商 | 每次最多 | 參考圖 | 每張最高 |
|---|---|---|---|---|
openai/gpt-image-2.5-flare | OpenAI | 10 張 | 16 張(含遮罩) | $0.25 |
openai/gpt-image-2.5-sunburst | OpenAI | 10 張 | 16 張(含遮罩) | $0.25 |
openai/gpt-image-2 | OpenAI | 10 張 | 16 張(含遮罩) | $0.25 |
google/gemini-nano-banana-2.1 | Google(Nano Banana 2.1) | 4 張 | 14 張 | $0.16 |
google/gemini-3.1-flash-image | Google(Nano Banana 2) | 4 張 | 14 張 | $0.20 |
google/gemini-3-pro-image | Google(Nano Banana Pro) | 4 張 | 14 張 | $0.30 |
black-forest-labs/flux-3-image | OpenRouter | 4 張 | 10 張 | $0.607(4K) |
bytedance-seed/seedream-5-0-pro | OpenRouter | 4 張 | 14 張 | $0.09 |
bytedance-seed/seedream-5-0-lite | OpenRouter | 4 張 | 14 張 | $0.035 |
recraft/recraft-v4.1 | OpenRouter | 6 張 | 1 張 | $0.035 |
recraft/recraft-v4.1-vector | OpenRouter | 6 張 | 1 張 | $0.08(SVG) |
指定 openai/gpt-image-2 時,Hakila 會改用同價位的 openai/gpt-image-2.5-flare(回應標頭 X-Hakila-Adjusted-Params);
Flare 不在 API Key 的允許清單內時才用 openai/gpt-image-2。
xAI 的 x-ai/grok-imagine-image-2.0、x-ai/grok-imagine-image-quality 也在目錄中,但預設停用:
xAI 的內容審核較寬鬆,被擋下的生成仍會收費,平台管理者確認後才會開放。
「每張最高」是依張數或 tokens 計價的上限,用於送出前的預算檢查;實際費用依解析度、品質與 tokens 計算,
回應的 usage.cost(USD)與 usage.cost_points(點數)是這次實際扣的金額。
快速開始
curl https://api.hakila.ai/v1/images \
-H "Authorization: Bearer $HAKILA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemini-3.1-flash-image",
"prompt": "一隻戴著圓框眼鏡的柴犬在圖書館看書,水彩風格",
"aspect_ratio": "16:9",
"resolution": "2K"
}' | jq -r '.data[0].b64_json' | base64 --decode > shiba.png以圖生圖與編輯
在 /v1/images 帶 input_references 就是以參考圖生成或編輯;網址只接受 https:// 或 data: URL,單張 50 MB 以內。
{
"model": "openai/gpt-image-2.5-sunburst",
"prompt": "把背景換成夜晚的台北街景,保留人物不變",
"input_references": [
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } }
],
"mask": { "image_url": { "url": "data:image/png;base64,..." } }
}用 OpenAI SDK 時改呼叫 client.images.edit(image=[open("a.png", "rb")], mask=open("mask.png", "rb"), ...),
Hakila 接受 multipart 的 image、image[] 與 mask 欄位。遮罩只有支援 mask 的模型能用(目前是 OpenAI 系列),
透明處是要重畫的區域。
參數怎麼處理
每個模型能用的參數列在 GET /v1/images/models 的 supported_parameters(格式同 OpenRouter):
enum 給允許值、range 給上下限、boolean 表示支援;沒列出的就是不支援。Hakila 依下列規則處理:
| 情況 | 處理 | 例子 |
|---|---|---|
| 要求模型做不到的事 | 回 400 | 帶參考圖給不支援的模型、n 超過上限、background: transparent、enum 以外的 resolution |
aspect_ratio 不在清單 | 調到最接近的值 | 5:3 → 16:9 |
| 模型沒有這個旋鈕 | 忽略 | 對 Gemini 帶 quality、對 OpenAI 帶 seed |
| OpenAI 舊值 | 對應 | quality: hd → high、standard → medium |
| 用像素尺寸呼叫不吃像素的上游 | 換算 | 對 Gemini 帶 size: 1536x1024 → aspect_ratio: 3:2 + 最接近的 resolution(1K) |
所有調整與忽略都列在回應 header X-Hakila-Adjusted-Params,例如 aspect_ratio=5:3>16:9, seed=ignored。
provider.options 可以帶供應商專屬參數,但只有模型 allowed_passthrough_parameters 列出的欄位會送上游
(例如 Recraft 的 style),其餘忽略。
串流與交付方式
stream: true:回text/event-stream。生圖通常要 10~60 秒,等待期間每 10 秒送一行: keepalive避免連線被代理切斷; 每張圖完成時送一個image_generation.completed事件(OpenAI edits 為image_edit.completed),usage只在最後一個事件,最後是data: [DONE]。 目前沒有局部預覽圖(partial image)。response_format: "url":回傳 1 小時有效的簽名網址,不必在 JSON 裡傳 base64。圖片暫存 24 小時後刪除。- 預設為
b64_json。
計費、預算與張數上限
- 全有全無:上游失敗、逾時(預設 300 秒)或用戶端中途斷線都不扣點。
n > 1時 Hakila 可能拆成多個上游請求, 部分成功時只回傳並計費成功的張數。 - 送出前預算檢查:以「每張最高 × 張數(+參考圖單價)」預估,超過 API Key、人員、單位、組織任一層預算或儲值餘額時回
402,不會先產圖再超支。 - 每日張數上限:Console 可分別替 API Key 與組織設定每天最多幾張(台北時間 00:00 重置),超過回
429、code: image_quota_exceeded。 適合學校或團隊控管用量。 - 直連 OpenAI、Google 的價格由平台維護;OpenRouter 模型每天同步價格,並以 OpenRouter 回報的實際費用扣點。
- 不支援
hakila/auto、Preset 與 Response Cache。
內容安全
- 提示詞與參考圖送出前會先經過內容審核,未通過回
400、code: content_policy_violation,不扣點。 - 各供應商的安全設定一律用最嚴格等級;
moderation: low會被改回auto(記在X-Hakila-Adjusted-Params)。 - Hakila 會把組織、人員與你帶的
user一起雜湊成匿名識別碼送給上游,供應商可據此追蹤濫用,又不會拿到真實身分。 - 少數供應商(xAI)在生成後才擋下的圖片仍會收費,這種情況會照上游實際收費扣點,並在 Logs 標示「內容違規」。
紀錄與原圖保留
Logs 只記錄摘要(提示詞、參數、張數、格式、大小、費用),不存圖片本身。 工作區管理員可在 Console 的工作區設定開啟「生成圖片原圖保留天數」(1~90 天),之後的請求會保存原圖, 在 Log 明細中查看縮圖,到期自動刪除。預設不保留。
錯誤
錯誤形狀與 OpenAI 相容:{"error": {"message", "type", "code"}}。
| 狀態 | 原因 |
|---|---|
400 | 參數錯誤、模型不是生圖類型、要求了模型不支援的能力、內容審核未通過(content_policy_violation) |
402 | 預估費用超過預算或儲值餘額(insufficient_quota) |
429 | 超過每日張數上限(image_quota_exceeded) |
502 | 上游錯誤,或 response_format: url 時暫存失敗 |
503 | 平台尚未設定這個模型的能力描述或計價 |
504 | 生圖逾時 |
完整欄位見 API 參考。