Chuyển đến nội dung
KeuralDocs
Nhà phát triển

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ẫnMô tả
POST/llm/v1/chat/completionsTạo phản hồi hội thoại (hỗ trợ streaming)
GET/llm/v1/modelsDanh 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ướcViệc cần làm
1. Cấp khóaTrong 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 clientNhậ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ụcChi tiết
Tài khoản KeuralTài khoản có thể đăng nhập.
Menu APINế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

  1. Ở 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ụ.
  2. Ở 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.
  3. 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.
  4. 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ầnChức năng
API permissions by userBật hoặc tắt quyền API của từng thành viên.
Issued keysXem 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 usageXem 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ácKết quả
Bật Allow API accessThà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 accessChặ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ậpTê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 KeyKhóa đã cấp (không có khoảng trắng ở đầu hoặc cuối)API Key, Token, Secret Key, Authorization
ModelModel 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óaModel, Model ID, Model Name
  1. Trong cài đặt ứng dụng, chọn thêm kết nối tương thích OpenAI (Connection).
  2. Nhập Base URL và API Key, rồi lưu.
  3. 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.
  4. 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ạiNội dung
Yêu cầu chatPOST <Base URL>/chat/completions
Truy vấn mô hìnhGET <Base URL>/models
Header xác thựcAuthorization: Bearer <khóa đã cấp>
Header nội dungContent-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ườngQuy tắc
modelBắt buộc. Model ID của khóa
messagesBắt buộc. Từ 1 đến 4.096 mục
stream · stream_optionsstream_options chỉ gửi khi stream: true. Hỗ trợ include_usage.
toolsTối đa 128. Tên hàm dùng [A-Za-z0-9_-], từ 1 đến 64 ký tự
tool_choicenone · auto · required · một hàm cụ thể. required yêu cầu có tools.
parallel_tool_callsNếu mô hình không hỗ trợ, trả về 400
response_formattext · json_object · json_schema
max_tokens · max_completion_tokensChỉ 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.
temperatureTừ 0 đến 2. Nếu mô hình không hỗ trợ, trả về 400
top_pTừ 0 đến 1
frequency_penalty · presence_penaltyTừ -2 đến 2
stopMột chuỗi hoặc mảng tối đa 4 phần tử
seedSố nguyên
userTối đa 256 ký tự
nChỉ 1

Tin nhắn

Vai tròTrường được nhận
system · developercontent, name
usercontent (chuỗi hoặc mảng phần văn bản và hình ảnh), name
assistantcontent, name, refusal, tool_calls
toolcontent, tool_call_id
  • Tin nhắn tool chỉ trả lời một lần cho mỗi id trong tool_calls trước đó.
  • Phần hình ảnh (image_url) chỉ đặt trong tin nhắn user của mô hình hỗ trợ hình ảnh. Dùng địa chỉ http hoặc https, hoặc data URI base64 của PNG, JPEG, GIF hoặc WebP. detail có thể là auto, low hoặc high.

Nội dung yêu cầu

MụcGiới hạn
Content-Typeapplication/json
Kích thước1 MiB
Cấu trúc JSONMộ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ầuTố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ã 429Nguyên nhânRetry-After
rate_limit_exceededVượt RPM, TPM hoặc số yêu cầu đồng thời60 giây với RPM và TPM; 1 giây với yêu cầu đồng thời
api_busyVượ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_limitNhà cung cấp mô hình vượt quá giới hạnKhô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ácKế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 xemNội dung
Cài đặt → API → API usageMứ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 usageMứ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ệnMô tả
Thời gian bắt đầu · Thời gian kết thúcTheo 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 IDChỉ 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ầuChọ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ụcMô tả
ID yêu cầuGiá trị cần cung cấp khi liên hệ hỗ trợ.
Chế độ phản hồiStreaming 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ậnChỉ 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áitypecodeNguyên nhân
400invalid_request_errorinvalid_requestTrường, giá trị hoặc quy tắc nội dung không hợp lệ. param chỉ ra trường có vấn đề
400invalid_request_errorupstream_rejected_requestNhà cung cấp mô hình từ chối yêu cầu
401authentication_errorinvalid_api_keySai đị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
403permission_errorapi_disabledTính năng Keural API đang tắt
403permission_errormodel_api_disabledViệc công khai mô hình cho API đang tắt
403permission_errormodel_not_allowedmodel khác với mô hình của khóa, hoặc thành viên không có quyền API
404invalid_request_errornot_foundĐường dẫn không tồn tại
405invalid_request_errormethod_not_allowedSai phương thức. Header Allow liệt kê các phương thức được phép
429rate_limit_errorBảng trong Giới hạn sử dụngVượt giới hạn
503server_errorupstream_timeoutKhông hoàn tất phản hồi trong 600 giây
503server_errorinvalid_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
503server_errordependency_unavailable · unsupported_providerLỗ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ứngMã phản hồiKiểm tra trước
Danh sách mô hình trống hoặc không kết nối được404 · 405Base URL có kết thúc bằng …/llm/v1 không
Xác thực thất bại401Lỗ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ình403Model 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ỗi429Giới hạn sử dụng
Tạm thời không có phản hồi5xxThử 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-id trong header phản hồi
  • Thông báo lỗi hiển thị trên màn hình

Trên trang này