計算 input tokens
對齊 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`
/v1/responses/input_tokens對齊 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
Authorization
bearerAuth 在 Authorization 標頭帶入 Workspace API Key:
Authorization: Bearer sk-hakila-...
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
與建立回應相同的 input 契約。Hakila 只改寫 model(正規化、換成上游名稱),
其餘欄位(input、instructions、tools、conversation、previous_response_id、
reasoning、text、truncation…)原樣轉發。
空的 tools/tool_choice/text.format 會在轉發前移除。
完整欄位請見 OpenAI input token counts。
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/responses/input_tokens" \ -H "Content-Type: application/json" \ -d '{ "model": "openai/gpt-5.6-luna", "input": "用一句話介紹 Hakila" }'{ "object": "response.input_tokens", "input_tokens": 12}建立 Response POST
對齊 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` 歸零
取回 Response GET
對齊 OpenAI `GET /v1/responses/{response_id}`,query 參數(`include`、`stream`、 `starting_after`、`include_obfuscation`)原樣轉發。 - 回應存在上游,請求本身沒有 `model`,因此一律使用這把金鑰可用的 OpenAI 金鑰 - 取回不重複計費;只有 `background` 建立當下沒算過帳的那一筆,會在這裡補記一次