Keural API
使用 API 金鑰傳送 OpenAI Chat Completions 格式的請求。
以 OpenAI Chat Completions 格式呼叫 Keural 中登錄的模型。
Base URL 的格式為 https://<各環境的公開 API 網域>/llm/v1。公開 API 網域依環境而異,請向管理員確認。
| 方法 | 路徑 | 說明 |
|---|---|---|
POST | /llm/v1/chat/completions | 建立對話(支援串流) |
GET | /llm/v1/models | 與金鑰連接的模型清單 |
GET | /llm/v1/models/{model} | 與金鑰連接的模型資訊 |
嵌入、圖像生成、語音與 Responses API 路徑均不支援,會回傳 404。
使用流程
| 步驟 | 操作 |
|---|---|
| 1. 發行金鑰 | 在 設定 → API 中選擇模型並取得金鑰。複製模型 ID 與金鑰。 |
| 2. 連接用戶端 | 在應用程式或程式碼中填入 Base URL、API 金鑰與模型 ID。 |
| 3. 使用與管理 | 在同一畫面確認用量,必要時重新發行或撤銷金鑰。 |
準備事項
| 項目 | 內容 |
|---|---|
| Keural 帳號 | 可登入的帳號 |
| API 選單 | 若設定中沒有 API 選單,請向管理員申請啟用此功能。 |
| 組織成員權限 | 要在組織工作區取得金鑰,組織管理員需先允許你使用 API。參見 組織成員的 API 權限。 |
| Base URL | 管理員提供的公開 API 位址 |
| 用戶端 | 支援 OpenAI API 相容連線的應用程式或 SDK |
發行 API 金鑰
- 在帳號選單中開啟 設定 → API。在桌面應用程式與行動應用程式中,它位於 工具 區域。
- 在 API keys 分頁中,選擇金鑰的歸屬(個人工作區或組織工作區)以及 Model ID。
- 如有需要,設定 New key expiration (optional, Korea time)。留空則在撤銷前一直有效。
- 按下 Issue key,再用 Copy key 複製金鑰並妥善保存。完整金鑰僅會在此時顯示一次。
- 金鑰與所選工作區及一個模型相連。用量歸屬於發行金鑰的人。
- 同一工作區、同一模型只能有一把金鑰。若需要新金鑰,請重新發行或撤銷現有金鑰。
- 若遺失金鑰,請重新發行。重新發行後,先前的金鑰會立即無法使用。
- 若沒有可發行的模型,請向管理員確認模型公開設定、方案與組織 API 權限。
組織成員的 API 權限
僅適用於組織擁有者與管理員。要讓成員在組織工作區中取得金鑰,需由管理員先行允許。所有成員的預設皆為封鎖。
組織管理 → Organization API 由以下三個區域組成。若沒有此選單,表示 API 功能已關閉,或此帳號沒有組織管理權限。
| 區域 | 作用 |
|---|---|
| API permissions by user | 為每位成員開啟或關閉 API 使用權限。 |
| Issued keys | 查看組織中發行之金鑰的狀態並撤銷。無法查看金鑰全文。 |
| API usage | 查看組織中發行之金鑰的請求數與權杖用量。 |
| 操作 | 結果 |
|---|---|
| 開啟權限 | 該成員可以在組織工作區中發行金鑰。 |
| 關閉權限 | 阻擋新的發行,以及既有金鑰的呼叫。已發行的金鑰不會自動刪除,如有需要,請在 Issued keys 中撤銷。 |
成員離開或被移出組織時,該成員在組織中取得的金鑰會自動撤銷。
連接到用戶端
請在相容 OpenAI API 的應用程式(聊天用戶端、IDE 擴充功能、自動化工具等)中,輸入以下三個值。
| 項目 | 輸入內容 | 應用程式中的項目名稱 |
|---|---|---|
| Base URL | 管理員提供的公開 API 位址(…/llm/v1) | Base URL、API Base、Endpoint、Host |
| API Key | 取得的金鑰(前後不要有空白) | API Key、Token、Secret Key、Authorization |
| Model | 發行畫面中的 Model ID。必須與金鑰連接的模型完全相符 | Model、Model ID、Model Name |
- 在應用程式設定中新增 OpenAI 相容連線(Connection)。
- 輸入 Base URL 與 API Key,然後儲存。
- 從模型清單中選擇模型。清單中只會顯示與金鑰相連的一個模型。
- 傳送簡短訊息,確認有收到回應。
請求格式如下。
| 類別 | 內容 |
|---|---|
| 對話請求 | POST <Base URL>/chat/completions |
| 模型查詢 | GET <Base URL>/models |
| 驗證標頭 | Authorization: Bearer <發行的金鑰> |
| 內容標頭 | Content-Type: application/json |
第一個請求
export KEURAL_API_KEY='your_issued_key'
export KEURAL_BASE_URL='https://<各環境的公開 API 網域>/llm/v1'
export MODEL_ID='發行畫面中的模型 ID'
curl "$KEURAL_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KEURAL_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL_ID\",\"messages\":[{\"role\":\"user\",\"content\":\"你好。\"}]}"請求本文中的 model 必須與金鑰連接的模型 ID 相同。若前面帶有 provider/模型ID 這樣的路徑,會比較最後一個 / 之後的部分。不同時會回傳 403。回應中的 model 一律包含金鑰的模型 ID。
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["KEURAL_API_KEY"],
base_url=os.environ["KEURAL_BASE_URL"],
)
res = client.chat.completions.create(
model=os.environ["MODEL_ID"],
messages=[{"role": "user", "content": "你好。"}],
)
print(res.choices[0].message.content)支援的請求欄位
頂層欄位僅接受以下 18 個。傳送其他欄位會回傳 400。值為 null 的選用欄位視為未傳送。
| 欄位 | 規則 |
|---|---|
model | 必填。金鑰的模型 ID |
messages | 必填。1 至 4,096 項 |
stream · stream_options | 僅在 stream: true 時傳送 stream_options。支援 include_usage。 |
tools | 最多 128 個。函式名稱為 [A-Za-z0-9_-],1 至 64 個字元 |
tool_choice | none · auto · required · 指定函式。required 需要存在 tools。 |
parallel_tool_calls | 模型不支援時回傳 400 |
response_format | text · json_object · json_schema |
max_tokens · max_completion_tokens | 只傳送其中一個。若都不傳送,則為 4,096(若模型上限較低則為該值)。超過模型上限會回傳 400。 |
temperature | 0 至 2。模型不支援時回傳 400 |
top_p | 0 至 1 |
frequency_penalty · presence_penalty | -2 至 2 |
stop | 字串,或最多 4 項的陣列 |
seed | 整數 |
user | 最多 256 個字元 |
n | 僅 1 |
訊息
| 角色 | 接受的欄位 |
|---|---|
system · developer | content、name |
user | content(字串,或文字與圖像片段的陣列)、name |
assistant | content、name、refusal、tool_calls |
tool | content、tool_call_id |
tool訊息對前面tool_calls中的每個id只回覆一次。- 圖像片段(
image_url)只能放在支援圖像的模型之user訊息中。可使用http或https位址,或 PNG、JPEG、GIF、WebP 的 base64 data URI。detail為auto、low或high。
本文
| 項目 | 限制 |
|---|---|
| Content-Type | application/json |
| 大小 | 1MiB |
| JSON 結構 | 一個頂層物件,巢狀深度不超過 64,不允許重複的鍵 |
| 請求時間 | 最長 600 秒 |
違反本文規則會回傳 400,且 param 為 body。
串流
在請求中加入 "stream": true 後,會以 SSE 回應。各區塊以 data: ... 事件傳送,最後會傳送 data: [DONE]。若加入 "stream_options": {"include_usage": true},則在 [DONE] 之前會額外傳送一個權杖用量區塊。
加入 include_usage 後,每個區塊都會包含 usage: null,最後一個用量區塊的 choices 為空陣列。非串流回應只有在輸入與輸出權杖都已確認時才會包含 usage。
回應的 id 格式為 chatcmpl-<x-request-id>。所有回應標頭都包含 x-request-id。
串流中發生錯誤時,會傳送含有錯誤 JSON 的 data: 事件,然後在沒有 [DONE] 的情況下結束連線。若單一區塊超過 1MiB,或回應超過 16MiB,則會以 503 結束。
curl -N "$KEURAL_BASE_URL/chat/completions" \
-H "Authorization: Bearer $KEURAL_API_KEY" \
-H 'Content-Type: application/json' \
-d "{\"model\":\"$MODEL_ID\",\"messages\":[{\"role\":\"user\",\"content\":\"你好。\"}],\"stream\":true,\"stream_options\":{\"include_usage\":true}}"使用限制
依使用者、組織與模型為單位,限制同時請求數、每分鐘請求數(RPM)與每分鐘權杖數(TPM)。實際數值依環境而異。
每分鐘權杖數會在接收請求時預先扣除。輸入以每 4 個英文字元計 1 個權杖,其他字元以每個字元計 1 個權杖,一張圖像計 2,000 個權杖。輸出依 max_tokens(最多 4,096)預先扣除,因此只設定所需的輸出上限,可以讓限額更有餘裕。
429 code | 原因 | Retry-After |
|---|---|---|
rate_limit_exceeded | 超過 RPM、TPM 或同時請求數 | RPM·TPM 為 60 秒,同時請求為 1 秒 |
api_busy | 伺服器處理容量已滿 | 無。請稍候再重試。 |
upstream_rate_limit | 模型供應商超出限制 | 無 |
金鑰管理
在 設定 → API → API keys 分頁中,可以確認已發行金鑰的狀態(有效、已過期、已撤銷),並進行重新發行或撤銷。
金鑰是以 krl_llm_ 開頭、共 51 個字元的字串。每個金鑰歸屬只能有一把金鑰,已存在時會重新發行。有效期限只能設定為今天之後的日期。
| 操作 | 結果 | 注意事項 |
|---|---|---|
| 重新發行 | 取得新金鑰。 | 先前的金鑰會立即失效。已連接應用程式中的金鑰也需一併更換。 |
| 撤銷 | 立即封鎖該金鑰。 | 金鑰外洩疑慮時使用。已撤銷的金鑰無法復原。 |
查看用量
透過 API 傳送的請求與消耗的權杖,可在以下兩個位置確認。
| 位置 | 內容 |
|---|---|
| 設定 → API → API usage 分頁 | 目前工作區中你發行之金鑰的用量 |
| 組織管理 → Organization API 下方的 API usage | 組織中發行之所有金鑰的用量(組織擁有者與管理員) |
查詢條件
| 條件 | 說明 |
|---|---|
| 開始時間 · 結束時間 | 以韓國時間為準。包含開始時間,不包含結束時間。留空時為最近 7 天,一次最多可查詢 90 天。 |
| Model ID | 僅查詢特定模型的請求。留空則為全部。 |
| 請求狀態 | 從 All · Running · Completed · Failed · Cancelled · Unknown 中選擇。 |
設定條件後按下 Search。若要反映最近的請求,請按下 Refresh。
畫面上顯示的值
- Applied time range (KST):實際查詢的時間範圍。開始與結束時間留空或超過 90 天時,會顯示伺服器調整後的時間範圍。
- Requests 與 Input tokens · Output tokens · Total tokens 的合計:只加總已確認的值。未確認的權杖以 Unconfirmed 顯示。
- 請求清單:每個請求顯示請求時間、Model ID、請求狀態,以及輸入、輸出、總權杖數。每頁顯示 20 筆,以 Previous 與 Next 翻頁。
按下列中的 Request details,即可顯示以下數值。
| 項目 | 說明 |
|---|---|
| 請求 ID | 洽詢時需提供的值 |
| 回應方式 | 串流或非串流回應 |
| 用量確認狀態 | Confirmed · Partially confirmed · Unconfirmed |
| 結束時間 · 回應時間(ms) | 請求結束的時間與耗時 |
| 快取讀取 · 快取建立 · 推理權杖 | 僅在模型回傳這些值時顯示 |
串流請求即使沒有 stream_options.include_usage,也會記錄用量。若請求中途中斷,可能會保留為 Partially confirmed 或 Unconfirmed。
錯誤格式
錯誤以 OpenAI 相容格式回傳。
{
"error": {
"message": "供人閱讀的錯誤說明",
"type": "authentication_error",
"code": "invalid_api_key",
"param": null
}
}type 由狀態碼決定,code 用於區分原因。
| 狀態 | type | code | 原因 |
|---|---|---|---|
400 | invalid_request_error | invalid_request | 違反欄位、值或本文規則。param 中為有問題的欄位 |
400 | invalid_request_error | upstream_rejected_request | 模型供應商拒絕了請求 |
401 | authentication_error | invalid_api_key | 金鑰格式錯誤、沒有金鑰、已過期、已撤銷或已重新發行,或 Authorization 標頭不只一個 |
403 | permission_error | api_disabled | Keural API 功能已關閉 |
403 | permission_error | model_api_disabled | 該模型的 API 公開已關閉 |
403 | permission_error | model_not_allowed | model 與金鑰的模型不同,或成員沒有 API 權限 |
404 | invalid_request_error | not_found | 不存在的路徑 |
405 | invalid_request_error | method_not_allowed | 方法錯誤。允許的方法請見 Allow 標頭 |
429 | rate_limit_error | 參見上方 使用限制 表格 | 超過限制 |
503 | server_error | upstream_timeout | 600 秒內回應未結束 |
503 | server_error | invalid_upstream_response | 供應商回應格式異常,或串流大小超過限制 |
503 | server_error | dependency_unavailable · unsupported_provider | 暫時性的內部問題。洽詢時請附上 x-request-id |
疑難排解
| 症狀 | 回應碼 | 確認項目 |
|---|---|---|
| 模型清單為空或連線失敗 | 404 · 405 | Base URL 是否以 …/llm/v1 結尾 |
| 驗證失敗 | 401 | 金鑰是否輸入錯誤或前後有空白,是否已過期、撤銷或重新發行 |
| 連線正常但無法使用模型 | 403 | 模型 ID 是否與金鑰的模型相符,組織 API 權限 |
| 回應緩慢或偶爾失敗 | 429 | 使用限制 |
| 一段時間沒有回應 | 5xx | 稍後再重試 |
| 用量看不到或與實際不符 | — | 查詢期間與金鑰所屬的工作區 |
問題仍未解決時,請附上以下資訊聯絡管理員。請勿傳送金鑰全文與提示詞內容。
- 發生時間
- 使用的模型 ID
- 用戶端應用程式的名稱與版本
- 回應標頭中的
x-request-id - 畫面上顯示的錯誤訊息