Hakila Docs
Images

生成或編輯圖片(OpenRouter 形狀)

對齊 [OpenRouter Image API](https://openrouter.ai/docs/api/api-reference/images/create-image)。 `model` 必須是 `type: image`、已啟用、且通過組織 ∩ API Key 允許清單的 id(用 `GET /v1/images/models` 查詢)。 帶 `input_references` 就是以圖生圖/編輯;同一個端點涵蓋文字生圖與編輯。 **參數處理**(依模型的 `supported_parameters`): - 明確不支援的要求回 `400`:參考圖或遮罩、超過上限的 `n`、透明背景、enum 以外的值 - `aspect_ratio` 不在清單時自動調到最接近的支援值 - 模型沒有對應旋鈕的參數(`quality`、`seed`、`output_compression`…)直接忽略 - 所有調整與忽略列在回應 header `X-Hakila-Adjusted-Params`(例如 `aspect_ratio=5:3>16:9, seed=ignored`) **計費與限制**: - 全有全無:上游失敗或用戶端中途斷線不扣點;`n > 1` 部分成功時只算成功送達的張數 - 送出前以「每張最高費用 × 張數」預估,超過任何一層預算或儲值餘額回 `402` - API Key 與組織可設每日張數上限(台北時間 00:00 重置),超過回 `429`(`code: image_quota_exceeded`) - 提示詞與參考圖會先經過內容審核,未通過回 `400`(`code: content_policy_violation`); 各供應商的安全設定一律用最嚴格等級,`moderation: low` 會被改回 `auto` - 不支援 `hakila/auto`、Preset 與 Response Cache

POST/v1/images

對齊 OpenRouter Image API。 model 必須是 type: image、已啟用、且通過組織 ∩ API Key 允許清單的 id(用 GET /v1/images/models 查詢)。 帶 input_references 就是以圖生圖/編輯;同一個端點涵蓋文字生圖與編輯。

參數處理(依模型的 supported_parameters):

  • 明確不支援的要求回 400:參考圖或遮罩、超過上限的 n、透明背景、enum 以外的值
  • aspect_ratio 不在清單時自動調到最接近的支援值
  • 模型沒有對應旋鈕的參數(quality、seed、output_compression…)直接忽略
  • 所有調整與忽略列在回應 header X-Hakila-Adjusted-Params(例如 aspect_ratio=5:3>16:9, seed=ignored)

計費與限制:

  • 全有全無:上游失敗或用戶端中途斷線不扣點;n > 1 部分成功時只算成功送達的張數
  • 送出前以「每張最高費用 × 張數」預估,超過任何一層預算或儲值餘額回 402
  • API Key 與組織可設每日張數上限(台北時間 00:00 重置),超過回 429(code: image_quota_exceeded)
  • 提示詞與參考圖會先經過內容審核,未通過回 400(code: content_policy_violation); 各供應商的安全設定一律用最嚴格等級,moderation: low 會被改回 auto
  • 不支援 hakila/auto、Preset 與 Response Cache

Authorization

bearerAuth
AuthorizationBearer <token>

在 Authorization 標頭帶入 Workspace API Key: Authorization: Bearer sk-hakila-...

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

/v1/images 用 OpenRouter 欄位;/v1/images/generations、/v1/images/edits 另接受 OpenAI 的 size、images、image。 哪些欄位有效依模型的 supported_parameters(GET /v1/images/models)。

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/images" \  -H "Content-Type: application/json" \  -d '{    "model": "google/gemini-3.1-flash-image",    "prompt": "一隻戴著圓框眼鏡的柴犬在圖書館看書,水彩風格",    "aspect_ratio": "16:9",    "resolution": "2K"  }'
{  "created": 1791273600,  "data": [    {      "b64_json": "iVBORw0KGgoAAAANSUhEUgAA...",      "media_type": "image/png"    }  ],  "usage": {    "prompt_tokens": 18,    "completion_tokens": 1290,    "total_tokens": 1308,    "cost": 0.0774,    "cost_points": 0.25542  }}

文字轉語音 POST

對齊 OpenAI Audio Speech 規格(`POST https://api.openai.com/v1/audio/speech`)。 `model` 必須是平台目錄中 `type: tts`、已啟用、且通過組織 ∩ API Key 允許清單的 id。 成功時回應本體就是音訊位元組,`Content-Type` 依 `response_format`。 - **OpenAI**(`openai/gpt-4o-mini-tts`、`openai/tts-1*`):原樣轉發,`voice`/`instructions`/`speed`/`stream_format: sse` 由上游處理;沒帶 `voice` 時補 `alloy` - **Gemini**(`google/gemini-*-tts*`):Hakila 翻譯成原生 `generateContent`(`responseModalities: ["AUDIO"]`), `voice` → `prebuiltVoiceConfig.voiceName`(預設 `Kore`)、`instructions` 併入提示、`language` → `languageCode`、 `speakers` → `multiSpeakerVoiceConfig`;只支援 `response_format` `wav`(預設,由 Hakila 補檔頭)與 `pcm` - **xAI**(`x-ai/tts`):翻譯成 `POST /v1/tts`,`voice` → `voice_id`(預設 `eve`)、`language`(預設 `auto`)、 `response_format` → `output_format.codec`(`mp3`/`wav`/`pcm`/`mulaw`/`alaw`)、`sample_rate`、`speed`;`instructions` 忽略 - **Azure AI Speech**(`azure/neural-tts`、`azure/neural-hd-tts`、`azure/mai-voice-2`、`azure/mai-voice-2-flash`):翻譯成 SSML,`voice` 為完整語音名稱, 且須屬於模型的語音家族(標準 Neural/Dragon 與 DragonHD/MAI-Voice-2/MAI-Voice-2 Flash,不符回 `400`); `speed` → `prosody rate`、`language` → `xml:lang`、`style`/`style_degree`/`role` → `mstts:express-as`; `input` 以 `<speak` 開頭時視為完整 SSML 原樣送出(仍檢查 `<voice name>` 的家族);`response_format` 支援 `mp3`/`wav`/`pcm`/`opus` - 後台新增的 OpenAI 相容供應商(自架服務等)走 OpenAI 相容 `/audio/speech` - Anthropic 沒有 TTS API;把 chat/embedding 模型帶進來會回 `400` 並提示正確端點 - 沒有前綴的 `model` 會在已啟用的 tts 模型中比對名稱並補上開發商前綴;有多個同名模型時回 `400`,找不到時回 `404` - 不支援 `hakila/auto`、Preset 與 Response Cache - 計費:OpenAI/xAI/Azure 以 `input` 字元數記在 `prompt_tokens`(單價為 USD / 1M 字元); Gemini 使用真實 usage(文字輸入 tokens/音訊輸出 tokens)。上游錯誤或沒有回音訊時不計費 - 上游首字元逾時(預設 30 秒)回傳 `504`

生成圖片(OpenAI 形狀) POST

對齊 [OpenAI Images generations](https://platform.openai.com/docs/api-reference/images/create), 給寫死 OpenAI SDK 的工具使用。與 `/v1/images` 共用同一條管線,任何生圖模型都能用(不限 OpenAI)。 - `size` 接受像素尺寸(`1536x1024`)、解析度等級(`2K`)或 `auto`;非 OpenAI 模型會換算成 `aspect_ratio` + `resolution` - `quality: standard/hd` 會對應成 `medium/high` - 回應形狀同 OpenAI(`data[].b64_json`、`output_format`、`size`、`usage.input_tokens`…),另附 `usage.cost` 與 `cost_points` - 串流事件為 `image_generation.completed`