建立 Response
對齊 OpenAI Responses 規格(`POST https://api.openai.com/v1/responses`)。 OpenAI 模型:除了模型路由、金鑰與記帳,Hakila 會把請求、回應與 SSE 事件原樣透傳, 因此 `tools`、structured outputs、reasoning、`background`、`previous_response_id` 等能力 由上游 OpenAI 決定,不需要 Hakila 額外支援。 其他模型(Claude、Gemini、Grok、OpenRouter、地端服務…)走**轉換模式**:Hakila 把請求轉成各家協定, 回應與 SSE 事件再轉回 Responses 格式。轉換模式是無狀態的: - 每次都要帶完整歷史;`previous_response_id` 與 `background` 回 `400`,`store` 會被忽略,回應不能 retrieve - `function`、`custom`(例如 Codex 的 `apply_patch`)與 `namespace` 工具會轉換;`web_search` 等 OpenAI 內建工具會被移除, 移除的類型列在回應 header `X-Hakila-Dropped-Tools` - `reasoning.effort` 會換成各家的推理設定;Claude 的思考摘要以 `reasoning_summary_text` 事件送出, 需要原樣送回的推理資料加密放在 reasoning item 的 `encrypted_content`,下一輪原樣帶回即可延續推理 - 沒有前綴的 `model`(例如 `gpt-5.6`)在目錄中只有一個同名模型時補上開發商前綴(`openai/gpt-5.6`),官方 SDK 只換 `base_url` 即可使用;多個同名模型時回 `400`,沒有時回 `404` - `hakila/auto` 可用,候選可落在任何供應商;帶 `previous_response_id` 或 `background` 時只挑 OpenAI - `model` 仍須是平台目錄已啟用、且通過組織 ∩ API Key 允許清單的 id(見 `GET /v1/models`) - `"stream": true` 以 SSE 回傳事件(`response.output_text.delta`…),結尾為 `response.completed`,**沒有** `data: [DONE]` - `"background": true` 會立刻回 `queued`;此時不計費,等之後 `GET /v1/responses/{id}` 拿到 usage 才記一次帳 - 錯誤形狀與 OpenAI 一致(`error.message` / `type` / `param` / `code`) - 上游首字元逾時(預設 30 秒)回傳 `504` - 可引用工作區 Preset(`@preset/slug`、`model@preset/slug` 或 `preset` 欄位);Preset 的系統提示對應 `instructions` - `usage.input_tokens_details` 回報 Prompt Cache 讀取/寫入 tokens - 支援 Response Cache header(`background: true` 的請求不快取);命中時 response `id` 維持原值、`usage` 歸零
/v1/responses對齊 OpenAI Responses 規格(POST https://api.openai.com/v1/responses)。
OpenAI 模型:除了模型路由、金鑰與記帳,Hakila 會把請求、回應與 SSE 事件原樣透傳,
因此 tools、structured outputs、reasoning、background、previous_response_id 等能力
由上游 OpenAI 決定,不需要 Hakila 額外支援。
其他模型(Claude、Gemini、Grok、OpenRouter、地端服務…)走轉換模式:Hakila 把請求轉成各家協定, 回應與 SSE 事件再轉回 Responses 格式。轉換模式是無狀態的:
-
每次都要帶完整歷史;
previous_response_id與background回400,store會被忽略,回應不能 retrieve -
function、custom(例如 Codex 的apply_patch)與namespace工具會轉換;web_search等 OpenAI 內建工具會被移除, 移除的類型列在回應 headerX-Hakila-Dropped-Tools -
reasoning.effort會換成各家的推理設定;Claude 的思考摘要以reasoning_summary_text事件送出, 需要原樣送回的推理資料加密放在 reasoning item 的encrypted_content,下一輪原樣帶回即可延續推理 -
沒有前綴的
model(例如gpt-5.6)在目錄中只有一個同名模型時補上開發商前綴(openai/gpt-5.6),官方 SDK 只換base_url即可使用;多個同名模型時回400,沒有時回404 -
hakila/auto可用,候選可落在任何供應商;帶previous_response_id或background時只挑 OpenAI -
model仍須是平台目錄已啟用、且通過組織 ∩ API Key 允許清單的 id(見GET /v1/models) -
"stream": true以 SSE 回傳事件(response.output_text.delta…),結尾為response.completed,沒有data: [DONE] -
"background": true會立刻回queued;此時不計費,等之後GET /v1/responses/{id}拿到 usage 才記一次帳 -
錯誤形狀與 OpenAI 一致(
error.message/type/param/code) -
上游首字元逾時(預設 30 秒)回傳
504 -
可引用工作區 Preset(
@preset/slug、model@preset/slug或preset欄位);Preset 的系統提示對應instructions -
usage.input_tokens_details回報 Prompt Cache 讀取/寫入 tokens -
支援 Response Cache header(
background: true的請求不快取);命中時 responseid維持原值、usage歸零
Authorization
bearerAuth 在 Authorization 標頭帶入 Workspace API Key:
Authorization: Bearer sk-hakila-...
In: header
Header Parameters
true 啟用 Response Cache、false 停用。Preset 設為強制關閉時 true 無效;
未帶時依 Preset 設定(預設關閉)。
Value in
- "true"
- "false"
快取存活秒數(只取前導數字),範圍 1–86400;未帶時用 Preset 設定,否則 300。
啟用快取時先刪除同一個 cache key 的舊條目,再照常呼叫上游並存入新結果。
Value in
- "true"
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
只列出 Hakila 會檢查或改寫的欄位,其餘欄位(tools、text.format、reasoning、
include、max_output_tokens、metadata、store…)與 OpenAI Responses 規格完全相同,
OpenAI 模型原樣透傳,請以 OpenAI 官方文件 為準;
非 OpenAI 模型由 Hakila 轉換(見建立 Response 的說明)。
空的 tools/tool_choice/text.format 會在轉發前移除,避免上游回 400。
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/responses" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-5.6-luna", "input": "用一句話介紹 Hakila" }'{ "id": "resp_68a1b2c3", "object": "response", "status": "completed", "model": "gpt-5.6-luna", "output": [ { "id": "msg_1", "type": "message", "role": "assistant", "content": [ { "type": "output_text", "text": "Hakila 是統一的 AI Gateway。" } ] } ], "usage": { "input_tokens": 12, "output_tokens": 8, "total_tokens": 20 }}查詢生圖模型的計價與可透傳參數 GET
格式同 OpenRouter `/api/v1/images/models/{author}/{slug}/endpoints`。`pricing` 為 USD 計價項目, 另附 Hakila 點數版本 `pricing_points` 與預算預估用的 `max_cost_per_image`。 `allowed_passthrough_parameters` 是 `provider.options` 可以帶的欄位。
計算 input tokens POST
對齊 OpenAI `POST https://api.openai.com/v1/responses/input_tokens`。 用與建立回應相同的 input(文字、訊息、圖片、檔案、tools、conversation)計算 這次請求會送進模型的 input token 數,**不會產生回應**。 - **只支援 OpenAI**,路由、允許清單與錯誤形狀與 `POST /v1/responses` 相同 - 沒有前綴的 `model` 在目錄中只有一個同名模型時補上開發商前綴 - `hakila/auto` 可用,但候選只會落在 OpenAI - 回傳的 `input_tokens` 只是計數,**不計費**;請求仍會寫入用量紀錄,超支時回 `402` - 上游首字元逾時(預設 30 秒)回傳 `504`