API Keural
Gửi yêu cầu theo định dạng OpenAI Chat Completions bằng khóa API.
Gọi các mô hình đã đăng ký trên Keural theo định dạng OpenAI Chat Completions.
Base URL có dạng https://<tên miền API công khai của bạn>/llm/v1. Tên miền API công khai khác nhau tùy theo môi trường; hãy hỏi quản trị viên.
| Phương thức | Đường dẫn | Mô tả |
|---|---|---|
POST | /llm/v1/chat/completions | Tạo phản hồi hội thoại (hỗ trợ streaming) |
GET | /llm/v1/models | Danh sách mô hình được kết nối với khóa |
GET | /llm/v1/models/{model} | Thông tin một mô hình được kết nối với khóa |
Không hỗ trợ đường dẫn cho embeddings, tạo ảnh, giọng nói hay Responses API. Gửi yêu cầu tới các đường dẫn này sẽ nhận 404.
Quy trình sử dụng
| Bước | Việc cần làm |
|---|---|
| 1. Cấp khóa | Trong Cài đặt → API, chọn mô hình và lấy khóa. Sao chép Model ID và khóa. |
| 2. Kết nối client | Nhập Base URL, khóa API và Model ID vào ứng dụng hoặc mã nguồn. |
| 3. Sử dụng và quản lý | Trên cùng màn hình, xem mức sử dụng và cấp lại hoặc thu hồi khóa khi cần. |
Chuẩn bị
| Mục | Chi tiết |
|---|---|
| Tài khoản Keural | Tài khoản có thể đăng nhập. |
| Menu API | Nếu trong Cài đặt không có API, hãy yêu cầu quản trị viên bật tính năng này. |
| Quyền thành viên tổ chức | Để cấp khóa trong không gian làm việc của tổ chức, quản trị viên tổ chức phải cho phép bạn. Xem Quyền API của thành viên tổ chức. |
| Base URL | Địa chỉ API công khai do quản trị viên hướng dẫn. |
| Client | Ứng dụng hoặc SDK hỗ trợ kết nối tương thích OpenAI API. |
Cấp khóa API
- Ở menu tài khoản góc dưới bên trái, mở Cài đặt → API. Trên ứng dụng máy tính và di động, mục này nằm trong nhóm Công cụ.
- Ở tab API keys, chọn không gian làm việc mà khóa thuộc về (cá nhân hoặc tổ chức) và Model ID.
- Nếu cần, đặt New key expiration (optional, Korea time). Nếu để trống, khóa không hết hạn cho đến khi bị thu hồi.
- Nhấn Issue key, rồi sao chép khóa bằng Copy key và lưu lại ở nơi an toàn. Khóa đầy đủ chỉ hiển thị một lần tại thời điểm này.
- Khóa được gắn với không gian làm việc đã chọn và một mô hình. Mức sử dụng được ghi cho người đã cấp khóa.
- Mỗi cặp không gian làm việc và mô hình chỉ có một khóa dùng được. Nếu đã có khóa, không thể cấp thêm; hãy cấp lại (Rotate) hoặc thu hồi (Revoke) khóa hiện có.
- Nếu mất khóa, không có cách nào xem lại. Hãy cấp lại; khi đó khóa cũ ngừng hoạt động ngay lập tức.
- Nếu thấy thông báo không có mô hình nào khả dụng, hãy kiểm tra với quản trị viên về cài đặt hiển thị mô hình, gói dịch vụ và quyền API của tổ chức.
Quyền API của thành viên tổ chức
Chỉ chủ sở hữu và quản trị viên tổ chức mới quản lý mục này. Để thành viên cấp khóa trong không gian làm việc của tổ chức, quản trị viên phải cho phép trước. Mặc định, tất cả thành viên đều bị chặn.
Quản lý tổ chức → Organization API gồm ba phần sau. Nếu không thấy menu này, tính năng API đang tắt hoặc tài khoản của bạn không có quyền quản trị tổ chức.
| Phần | Chức năng |
|---|---|
| API permissions by user | Bật hoặc tắt quyền API của từng thành viên. |
| Issued keys | Xem trạng thái các khóa đã cấp trong tổ chức và thu hồi. Không xem được nội dung khóa. |
| API usage | Xem số yêu cầu và mức sử dụng token của các khóa đã cấp trong tổ chức. |
| Thao tác | Kết quả |
|---|---|
| Bật Allow API access | Thành viên có thể cấp khóa trong không gian làm việc của tổ chức. |
| Tắt Allow API access | Chặn việc cấp mới và các lời gọi bằng khóa hiện có. Khóa đã cấp không tự động bị xóa; nếu cần, hãy thu hồi trong Issued keys. |
Khi thành viên rời tổ chức hoặc bị xóa khỏi tổ chức, các khóa họ nhận được trong tổ chức sẽ tự động bị thu hồi.
Kết nối với client
Nhập ba giá trị sau vào các ứng dụng tương thích OpenAI API (ứng dụng chat, tiện ích IDE, công cụ tự động hóa, v.v.).
| Giá trị | Nội dung nhập | Tên trên từng ứng dụng |
|---|---|---|
| Base URL | Địa chỉ API công khai do quản trị viên hướng dẫn (…/llm/v1) | Base URL, API Base, Endpoint, Host |
| API Key | Khóa đã cấp (không có khoảng trắng ở đầu hoặc cuối) | API Key, Token, Secret Key, Authorization |
| Model | Model ID ở màn hình cấp khóa. Phải khớp chính xác với mô hình được kết nối với khóa | Model, Model ID, Model Name |
- Trong cài đặt ứng dụng, chọn thêm kết nối tương thích OpenAI (Connection).
- Nhập Base URL và API Key, rồi lưu.
- Chọn một mô hình trong danh sách. Danh sách chỉ hiển thị mô hình được kết nối với khóa.
- Gửi một tin nhắn ngắn để kiểm tra có nhận được phản hồi không.
Định dạng yêu cầu như sau.
| Loại | Nội dung |
|---|---|
| Yêu cầu chat | POST <Base URL>/chat/completions |
| Truy vấn mô hình | GET <Base URL>/models |
| Header xác thực | Authorization: Bearer <khóa đã cấp> |
| Header nội dung | Content-Type: application/json |
Yêu cầu đầu tiên
export KEURAL_API_KEY='khóa_đã_cấp_của_bạn'
export KEURAL_BASE_URL='https://<tên-miền-api-của-bạn>/llm/v1'
export MODEL_ID='ID_mô_hình_trên_màn_hình_cấp_khóa'
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\":\"Xin chào.\"}]}"model trong nội dung yêu cầu phải khớp với mô hình được kết nối với khóa. Nếu có tiền tố đường dẫn như provider/ID_mô_hình, hệ thống so khớp phần sau dấu / cuối cùng. Nếu không khớp, API trả về 403. Phản hồi luôn chứa ID mô hình của khóa trong trường model.
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": "Xin chào."}],
)
print(res.choices[0].message.content)Các trường yêu cầu được hỗ trợ
API chỉ nhận 18 trường cấp cao nhất sau. Nếu gửi trường khác, API trả về 400. Trường tùy chọn có giá trị null được xử lý như không gửi.
| Trường | Quy tắc |
|---|---|
model | Bắt buộc. Model ID của khóa |
messages | Bắt buộc. Từ 1 đến 4.096 mục |
stream · stream_options | stream_options chỉ gửi khi stream: true. Hỗ trợ include_usage. |
tools | Tối đa 128. Tên hàm dùng [A-Za-z0-9_-], từ 1 đến 64 ký tự |
tool_choice | none · auto · required · một hàm cụ thể. required yêu cầu có tools. |
parallel_tool_calls | Nếu mô hình không hỗ trợ, trả về 400 |
response_format | text · json_object · json_schema |
max_tokens · max_completion_tokens | Chỉ gửi một trong hai. Nếu không gửi, giá trị là 4.096 (hoặc giới hạn của mô hình nếu thấp hơn). Vượt giới hạn mô hình sẽ trả về 400. |
temperature | Từ 0 đến 2. Nếu mô hình không hỗ trợ, trả về 400 |
top_p | Từ 0 đến 1 |
frequency_penalty · presence_penalty | Từ -2 đến 2 |
stop | Một chuỗi hoặc mảng tối đa 4 phần tử |
seed | Số nguyên |
user | Tối đa 256 ký tự |
n | Chỉ 1 |
Tin nhắn
| Vai trò | Trường được nhận |
|---|---|
system · developer | content, name |
user | content (chuỗi hoặc mảng phần văn bản và hình ảnh), name |
assistant | content, name, refusal, tool_calls |
tool | content, tool_call_id |
- Tin nhắn
toolchỉ trả lời một lần cho mỗiidtrongtool_callstrước đó. - Phần hình ảnh (
image_url) chỉ đặt trong tin nhắnusercủa mô hình hỗ trợ hình ảnh. Dùng địa chỉhttphoặchttps, hoặc data URI base64 của PNG, JPEG, GIF hoặc WebP.detailcó thể làauto,lowhoặchigh.
Nội dung yêu cầu
| Mục | Giới hạn |
|---|---|
| Content-Type | application/json |
| Kích thước | 1 MiB |
| Cấu trúc JSON | Một đối tượng cấp cao nhất, độ lồng tối đa 64, không trùng khóa |
| Thời gian yêu cầu | Tối đa 600 giây |
Vi phạm quy tắc nội dung sẽ trả về 400, với param là body.
Streaming
Nếu có "stream": true trong yêu cầu, phản hồi được gửi qua SSE. Mỗi đoạn được gửi dưới dạng sự kiện data: ..., và kết thúc bằng data: [DONE]. Nếu có "stream_options": {"include_usage": true}, một đoạn chứa mức sử dụng token được gửi thêm ngay trước [DONE].
Với include_usage, mọi đoạn đều chứa usage: null, và đoạn sử dụng cuối cùng có choices là mảng rỗng. Phản hồi không streaming chỉ có usage khi số token đầu vào và đầu ra đều đã được xác nhận.
id của phản hồi có dạng chatcmpl-<x-request-id>. Mọi phản hồi đều có header x-request-id.
Nếu lỗi xảy ra trong lúc streaming, sự kiện data: chứa JSON lỗi được gửi, rồi kết nối đóng mà không có [DONE]. Nếu một đoạn vượt quá 1 MiB hoặc phản hồi vượt quá 16 MiB, kết nối kết thúc với 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\":\"Xin chào.\"}],\"stream\":true,\"stream_options\":{\"include_usage\":true}}"Giới hạn sử dụng
Yêu cầu bị giới hạn theo người dùng, tổ chức và mô hình: số yêu cầu đồng thời, số yêu cầu mỗi phút (RPM) và số token mỗi phút (TPM). Giá trị thực tế khác nhau theo môi trường.
Token mỗi phút được trừ ngay khi nhận yêu cầu. Đầu vào tính 1 token cho mỗi 4 ký tự tiếng Anh, các ký tự khác tính 1 token mỗi ký tự; mỗi hình ảnh tính 2.000 token. Đầu ra được trừ theo max_tokens (tối đa 4.096), vì vậy nếu giới hạn đầu ra ở mức cần thiết, bạn sẽ còn nhiều dư địa trong hạn mức.
Mã 429 | Nguyên nhân | Retry-After |
|---|---|---|
rate_limit_exceeded | Vượt RPM, TPM hoặc số yêu cầu đồng thời | 60 giây với RPM và TPM; 1 giây với yêu cầu đồng thời |
api_busy | Vượt quá năng lực xử lý của máy chủ | Không có. Chờ một lát rồi thử lại. |
upstream_rate_limit | Nhà cung cấp mô hình vượt quá giới hạn | Không có |
Quản lý khóa
Ở tab API keys trong Cài đặt → API, bạn xem được trạng thái các khóa đã cấp (hợp lệ, hết hạn hoặc đã thu hồi), cấp lại hoặc thu hồi khóa.
Khóa là chuỗi 51 ký tự bắt đầu bằng krl_llm_. Mỗi không gian cấp chỉ có một khóa dùng được; nếu đã có khóa, hệ thống cấp lại chứ không cấp mới. Ngày hết hạn chỉ đặt được từ hôm nay trở đi.
| Thao tác | Kết quả | Lưu ý |
|---|---|---|
| Cấp lại (Rotate) | Nhận một khóa mới. | Khóa cũ ngừng hoạt động ngay. Cũng cập nhật khóa trong các ứng dụng đang kết nối. |
| Thu hồi (Revoke) | Khóa bị chặn ngay lập tức. | Dùng khi nghi ngờ khóa bị lộ. Khóa đã thu hồi không thể khôi phục. |
Xem mức sử dụng
Các yêu cầu gửi qua API và số token đã dùng được xem ở hai nơi.
| Nơi xem | Nội dung |
|---|---|
| Cài đặt → API → API usage | Mức sử dụng của các khóa bạn đã cấp trong không gian làm việc hiện tại |
| Quản lý tổ chức → Organization API, mục API usage | Mức sử dụng của mọi khóa đã cấp trong tổ chức (chủ sở hữu và quản trị viên tổ chức) |
Điều kiện truy vấn
| Điều kiện | Mô tả |
|---|---|
| Thời gian bắt đầu · Thời gian kết thúc | Theo giờ Hàn Quốc. Thời điểm bắt đầu được tính, thời điểm kết thúc không được tính. Nếu để trống, hệ thống hiển thị 7 ngày gần nhất; mỗi lần xem tối đa 90 ngày. |
| Model ID | Chỉ xem yêu cầu của một mô hình cụ thể. Để trống thì xem tất cả. |
| Trạng thái yêu cầu | Chọn trong Tất cả · Đang xử lý · Hoàn thành · Lỗi · Bị ngắt · Chưa xác định. |
Đặt điều kiện rồi nhấn Truy vấn. Để phản ánh các yêu cầu gần đây, nhấn Làm mới.
Giá trị hiển thị trên màn hình
- Khoảng thời gian truy vấn đã áp dụng: khoảng thời gian thực tế được truy vấn. Nếu bạn để trống thời gian bắt đầu hoặc kết thúc, hoặc vượt quá 90 ngày, màn hình hiển thị khoảng thời gian đã được máy chủ điều chỉnh.
- Số yêu cầu và tổng token đầu vào · token đầu ra · tổng token: chỉ cộng các giá trị đã xác nhận. Token chưa xác nhận không được tính là 0 mà hiển thị là Chưa xác nhận.
- Danh sách yêu cầu: mỗi yêu cầu là một dòng gồm thời điểm, Model ID, trạng thái và token đầu vào, đầu ra, tổng. Mỗi trang hiển thị 20 dòng; dùng Trước và Tiếp để chuyển trang.
Khi nhấn Chi tiết yêu cầu trên một dòng, các giá trị sau sẽ hiển thị.
| Mục | Mô tả |
|---|---|
| ID yêu cầu | Giá trị cần cung cấp khi liên hệ hỗ trợ. |
| Chế độ phản hồi | Streaming hoặc phản hồi thông thường |
| Trạng thái xác nhận mức sử dụng | Đã xác nhận · Xác nhận một phần · Chưa xác nhận |
| Thời điểm kết thúc · Thời gian phản hồi (ms) | Lúc yêu cầu kết thúc và thời gian đã mất |
| Đọc cache · Tạo cache · Token suy luận | Chỉ hiển thị khi mô hình trả về các giá trị này. |
Yêu cầu streaming vẫn ghi nhận mức sử dụng ngay cả khi không có stream_options.include_usage. Nếu yêu cầu bị ngắt giữa chừng, nó có thể ở trạng thái Xác nhận một phần hoặc Chưa xác nhận.
Định dạng lỗi
Lỗi được trả về theo định dạng tương thích OpenAI.
{
"error": {
"message": "Mô tả lỗi dễ hiểu cho người đọc",
"type": "authentication_error",
"code": "invalid_api_key",
"param": null
}
}type được xác định theo mã trạng thái, còn code cho biết nguyên nhân cụ thể.
| Trạng thái | type | code | Nguyên nhân |
|---|---|---|---|
400 | invalid_request_error | invalid_request | Trường, giá trị hoặc quy tắc nội dung không hợp lệ. param chỉ ra trường có vấn đề |
400 | invalid_request_error | upstream_rejected_request | Nhà cung cấp mô hình từ chối yêu cầu |
401 | authentication_error | invalid_api_key | Sai định dạng khóa, thiếu khóa, khóa đã hết hạn, bị thu hồi hoặc cấp lại, hoặc có nhiều header Authorization |
403 | permission_error | api_disabled | Tính năng Keural API đang tắt |
403 | permission_error | model_api_disabled | Việc công khai mô hình cho API đang tắt |
403 | permission_error | model_not_allowed | model khác với mô hình của khóa, hoặc thành viên không có quyền API |
404 | invalid_request_error | not_found | Đường dẫn không tồn tại |
405 | invalid_request_error | method_not_allowed | Sai phương thức. Header Allow liệt kê các phương thức được phép |
429 | rate_limit_error | Bảng trong Giới hạn sử dụng | Vượt giới hạn |
503 | server_error | upstream_timeout | Không hoàn tất phản hồi trong 600 giây |
503 | server_error | invalid_upstream_response | Định dạng phản hồi của nhà cung cấp bất thường, hoặc luồng vượt kích thước cho phép |
503 | server_error | dependency_unavailable · unsupported_provider | Lỗi nội bộ tạm thời. Liên hệ hỗ trợ và cung cấp x-request-id |
Xử lý sự cố
| Triệu chứng | Mã phản hồi | Kiểm tra trước |
|---|---|---|
| Danh sách mô hình trống hoặc không kết nối được | 404 · 405 | Base URL có kết thúc bằng …/llm/v1 không |
| Xác thực thất bại | 401 | Lỗi gõ hoặc khoảng trắng trong khóa; khóa đã hết hạn, bị thu hồi hoặc cấp lại chưa |
| Kết nối được nhưng không dùng được mô hình | 403 | Model ID có khớp với khóa không, và quyền API của tổ chức |
| Phản hồi chậm hoặc thỉnh thoảng lỗi | 429 | Giới hạn sử dụng |
| Tạm thời không có phản hồi | 5xx | Thử lại sau |
| Mức sử dụng không hiển thị hoặc không khớp với thực tế | — | Khoảng thời gian truy vấn và không gian làm việc mà khóa thuộc về |
Nếu vẫn không khắc phục được, hãy liên hệ quản trị viên và gửi kèm các thông tin dưới đây. Không gửi nội dung khóa và nội dung prompt.
- Thời điểm xảy ra
- Model ID đã dùng
- Tên và phiên bản ứng dụng client
- Giá trị
x-request-idtrong header phản hồi - Thông báo lỗi hiển thị trên màn hình