Keural API
Kirim permintaan dengan format OpenAI Chat Completions menggunakan API key.
Panggil model yang terdaftar di Keural dengan format OpenAI Chat Completions.
Base URL memiliki bentuk https://<public API domain for each environment>/llm/v1. Domain API publik berbeda di setiap lingkungan, jadi tanyakan kepada administrator.
| Metode | Path | Keterangan |
|---|---|---|
POST | /llm/v1/chat/completions | Membuat percakapan (mendukung streaming) |
GET | /llm/v1/models | Daftar model yang terhubung ke kunci |
GET | /llm/v1/models/{model} | Informasi model yang terhubung ke kunci |
Path untuk embedding, pembuatan gambar, suara, dan Responses API tidak didukung. Permintaan ke path tersebut dikembalikan 404.
Alur penggunaan
| Tahap | Yang dilakukan |
|---|---|
| 1. Terbitkan kunci | Buka Pengaturan → API, pilih model, lalu terima kunci. Salin model ID dan kunci. |
| 2. Hubungkan klien | Masukkan Base URL, API key, dan model ID ke aplikasi atau kode. |
| 3. Pakai dan kelola | Lihat penggunaan di layar yang sama, dan terbitkan ulang atau cabut kunci jika perlu. |
Persiapan
| Item | Isi |
|---|---|
| Akun Keural | Akun yang dapat login |
| Menu API | Jika menu API tidak ada di Pengaturan, minta administrator mengaktifkan fitur ini. |
| Izin anggota organisasi | Untuk menerima kunci di workspace organisasi, admin organisasi harus mengizinkan penggunaan API Anda. Lihat Izin API anggota organisasi. |
| Base URL | Alamat API publik dari administrator |
| Klien | Aplikasi atau SDK yang mendukung koneksi kompatibel OpenAI API |
Menerbitkan API key
- Di menu akun, buka Pengaturan → API. Di aplikasi desktop dan mobile, menu ini ada di bagian Alat.
- Di tab API keys, pilih workspace pemilik kunci (pribadi atau organisasi) dan Model ID.
- Jika perlu, tentukan Tanggal kedaluwarsa kunci baru. Jika dikosongkan, kunci berlaku sampai dicabut.
- Klik Terbitkan kunci, lalu salin kunci dengan Salin kunci dan simpan. Kunci lengkap hanya ditampilkan sekali saat diterbitkan.
- Kunci terikat pada workspace yang dipilih dan satu model. Pemakaian dihitung atas nama orang yang menerbitkan kunci.
- Setiap workspace dan model hanya memiliki satu kunci. Jika memerlukan kunci baru, rotasi atau cabut kunci yang ada.
- Jika kunci hilang, terbitkan ulang. Setelah diterbitkan ulang, kunci lama langsung tidak dapat dipakai.
- Jika tidak ada model yang dapat diterbitkan, periksa pengaturan visibilitas model, paket, dan izin API organisasi bersama administrator.
Izin API anggota organisasi
Khusus pemilik dan admin organisasi. Agar anggota dapat menerima kunci di workspace organisasi, admin harus mengizinkannya terlebih dahulu. Nilai default untuk semua anggota adalah diblokir.
Manajemen organisasi → Organization API terdiri dari tiga bagian berikut. Jika menu ini tidak ada, fitur API nonaktif atau akun Anda tidak punya izin manajemen organisasi.
| Bagian | Yang dilakukan |
|---|---|
| API permissions by user | Mengaktifkan atau menonaktifkan izin penggunaan API untuk setiap anggota. |
| Issued keys | Memeriksa status kunci yang diterbitkan organisasi dan mencabutnya. Kunci lengkap tidak bisa dilihat. |
| API usage | Melihat jumlah permintaan dan penggunaan token dari kunci yang diterbitkan organisasi. |
| Tindakan | Hasil |
|---|---|
| Mengaktifkan izin | Anggota tersebut bisa menerbitkan kunci di workspace organisasi. |
| Menonaktifkan izin | Penerbitan baru dan panggilan dengan kunci yang sudah ada diblokir. Kunci yang sudah diterbitkan tidak dihapus otomatis, jadi cabut dari Issued keys jika perlu. |
Jika anggota keluar atau dikeluarkan dari organisasi, kunci yang diterimanya dari organisasi akan dicabut otomatis.
Menghubungkan ke klien
Masukkan tiga nilai berikut ke aplikasi yang kompatibel dengan OpenAI API (klien chat, ekstensi IDE, alat otomasi, dan lainnya).
| Nilai | Yang dimasukkan | Nama di setiap aplikasi |
|---|---|---|
| Base URL | Alamat API publik dari administrator (…/llm/v1) | Base URL, API Base, Endpoint, Host |
| API Key | Kunci yang diterbitkan (tanpa spasi di depan atau belakang) | API Key, Token, Secret Key, Authorization |
| Model | Model ID dari layar penerbitan. Harus sama persis dengan model yang terhubung ke kunci | Model, Model ID, Model Name |
- Di pengaturan aplikasi, tambahkan Koneksi kompatibel OpenAI (Connection).
- Masukkan Base URL dan API Key, lalu simpan.
- Pilih model dari daftar model. Daftar hanya menampilkan satu model, yaitu model yang terhubung ke kunci.
- Kirim pesan singkat dan pastikan respons diterima.
Format permintaan adalah sebagai berikut.
| Jenis | Isi |
|---|---|
| Permintaan chat | POST <Base URL>/chat/completions |
| Ambil model | GET <Base URL>/models |
| Header autentikasi | Authorization: Bearer <issued key> |
| Header konten | Content-Type: application/json |
Permintaan pertama
export KEURAL_API_KEY='kunci_yang_diterbitkan'
export KEURAL_BASE_URL='https://<domain API publik per lingkungan>/llm/v1'
export MODEL_ID='model ID dari layar penerbitan'
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\":\"Halo.\"}]}"Nilai model pada body permintaan harus sama dengan model ID yang terhubung ke kunci. Jika ada awalan path seperti provider/ID model, bagian setelah / terakhir yang dibandingkan. Jika tidak sama, API mengembalikan 403. Di respons, model selalu berisi model ID dari kunci.
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": "Halo."}],
)
print(res.choices[0].message.content)Field permintaan yang didukung
Hanya 18 field level atas berikut yang diterima. Field lain menghasilkan 400. Field opsional yang bernilai null diperlakukan sebagai tidak dikirim.
| Field | Aturan |
|---|---|
model | Wajib. Model ID dari kunci |
messages | Wajib. 1 sampai 4.096 item |
stream · stream_options | stream_options hanya dikirim saat stream: true. Mendukung include_usage. |
tools | Maksimal 128. Nama fungsi [A-Za-z0-9_-] 1 hingga 64 karakter |
tool_choice | none · auto · required · fungsi tertentu. required membutuhkan tools. |
parallel_tool_calls | Jika model tidak mendukung, 400 |
response_format | text · json_object · json_schema |
max_tokens · max_completion_tokens | Kirim salah satu saja. Jika tidak dikirim, 4.096 (atau lebih kecil jika batas model lebih rendah). Melebihi batas model menghasilkan 400 |
temperature | 0 hingga 2. Jika model tidak mendukung, 400 |
top_p | 0 hingga 1 |
frequency_penalty · presence_penalty | -2 sampai 2 |
stop | String atau array maksimal 4 |
seed | Integer |
user | Maksimal 256 karakter |
n | Hanya 1 |
Pesan
| Peran | Field yang diterima |
|---|---|
system · developer | content, name |
user | content (string atau array bagian teks·gambar), name |
assistant | content, name, refusal, tool_calls |
tool | content, tool_call_id |
- Pesan
toolhanya membalas satu kali untuk setiapidditool_callssebelumnya. - Bagian gambar (
image_url) hanya dimasukkan ke pesanuseruntuk model yang menerima gambar. Gunakan alamathttpatauhttps, atau data URI base64 berformat PNG, JPEG, GIF, atau WebP.detailberupaauto·low·high.
Body
| Item | Batas |
|---|---|
| Content-Type | application/json |
| Ukuran | 1 MiB |
| Struktur JSON | Satu objek level atas, kedalaman bersarang 64 atau kurang, tidak ada kunci yang sama dalam satu objek |
| Waktu permintaan | Maksimal 600 detik |
Jika aturan body dilanggar, hasilnya 400 dan param berisi body.
Streaming
Tambahkan "stream": true ke permintaan untuk menerima respons melalui SSE. Chunk dikirim sebagai event data: ..., dan di akhir dikirim data: [DONE]. Jika menambahkan "stream_options": {"include_usage": true}, satu chunk penggunaan token tambahan dikirim tepat sebelum [DONE].
Saat include_usage diisi, setiap chunk berisi usage: null, dan chunk penggunaan terakhir memiliki choices berupa array kosong. Respons non-streaming hanya berisi usage jika jumlah token input dan output sudah terkonfirmasi.
ID respons berformat chatcmpl-<x-request-id>. Setiap respons menyertakan header x-request-id.
Jika terjadi error saat streaming, event data: yang berisi JSON error dikirim, lalu koneksi berakhir tanpa [DONE]. Jika satu chunk melebihi 1 MiB atau respons melebihi 16 MiB, stream berakhir dengan 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\":\"Halo.\"}],\"stream\":true,\"stream_options\":{\"include_usage\":true}}"Batas penggunaan
Permintaan dibatasi per pengguna, organisasi, dan model, berdasarkan jumlah permintaan bersamaan, permintaan per menit (RPM), dan token per menit (TPM). Nilai sebenarnya berbeda di setiap lingkungan.
Token per menit dikurangi di muka saat permintaan diterima. Input dihitung 1 token per 4 karakter bahasa Inggris, dan 1 token per karakter untuk bahasa lain. Satu gambar dihitung 2.000 token. Output dikurangkan sebesar max_tokens (maksimal 4.096), jadi jika Anda hanya menetapkan batas output yang diperlukan, sisa kuota akan lebih besar.
Kode 429 | Penyebab | Retry-After |
|---|---|---|
rate_limit_exceeded | RPM · TPM · jumlah permintaan bersamaan terlampaui | RPM·TPM 60 detik, permintaan bersamaan 1 detik |
api_busy | Kapasitas pemrosesan server terlampaui | Tidak ada. Tunggu sebentar lalu coba lagi. |
upstream_rate_limit | Batas dari penyedia model terlampaui | Tidak ada |
Mengelola kunci
Pada tab API keys di Pengaturan → API, periksa status kunci (valid · kedaluwarsa · dicabut), lalu terbitkan ulang atau cabut kunci.
Kunci berupa string 51 karakter yang diawali krl_llm_. Setiap workspace hanya memiliki satu kunci. Jika sudah ada, kunci diterbitkan ulang. Tanggal kedaluwarsa hanya dapat ditetapkan setelah hari ini.
| Tindakan | Hasil | Catatan |
|---|---|---|
| Terbitkan ulang | Menerima kunci baru. | Kunci lama langsung tidak berlaku. Perbarui juga kunci di aplikasi yang sudah terhubung. |
| Cabut | Kunci langsung diblokir. | Gunakan saat ada dugaan kebocoran kunci. Kunci yang dicabut tidak dapat dipulihkan. |
Memeriksa penggunaan
Permintaan API dan penggunaan token dapat dilihat di dua tempat berikut.
| Lokasi | Isi |
|---|---|
| Pengaturan → API → tab API usage | Penggunaan kunci yang Anda terbitkan di workspace saat ini |
| Manajemen organisasi → Organization API, bagian bawah API usage | Penggunaan semua kunci yang diterbitkan di organisasi (pemilik dan admin organisasi) |
Kondisi pencarian
| Kondisi | Keterangan |
|---|---|
| Waktu mulai · waktu akhir | Waktu Korea (KST). Waktu mulai disertakan, waktu akhir tidak. Jika kosong, 7 hari terakhir ditampilkan, dan pencarian maksimal 90 hari sekaligus. |
| Model ID | Hanya menampilkan permintaan untuk model tertentu. Jika kosong, semua permintaan ditampilkan. |
| Status permintaan | Pilih dari Semua · Berjalan · Selesai · Gagal · Dibatalkan · Belum dipastikan. |
Atur kondisi, lalu klik Cari. Untuk memuat permintaan terbaru, klik Segarkan.
Nilai yang tampil di layar
- Rentang waktu yang diterapkan: rentang yang benar-benar dicari. Jika waktu dikosongkan atau melebihi 90 hari, rentang yang disesuaikan server akan ditampilkan.
- Jumlah permintaan dan Token input · Token output · Total token: hanya menjumlahkan nilai yang sudah terkonfirmasi. Token yang belum terkonfirmasi ditampilkan sebagai Belum dikonfirmasi.
- Daftar permintaan: setiap permintaan ditampilkan dalam satu baris dengan waktu permintaan, Model ID, status permintaan, serta token input, output, dan total. Setiap halaman menampilkan 20 permintaan. Pindah halaman dengan Sebelumnya dan Berikutnya.
Klik Detail permintaan pada baris untuk menampilkan nilai berikut.
| Item | Keterangan |
|---|---|
| ID permintaan | Nilai yang disampaikan saat menghubungi dukungan |
| Jenis respons | Streaming atau non-streaming |
| Status konfirmasi penggunaan | Terkonfirmasi · Sebagian terkonfirmasi · Belum dikonfirmasi |
| Waktu selesai · Latensi (ms) | Waktu permintaan selesai dan waktu yang dibutuhkan. |
| Token baca cache · Token pembuatan cache · Token penalaran | Hanya ditampilkan jika model mengembalikan nilai tersebut |
Permintaan streaming dicatat penggunaannya meskipun stream_options.include_usage tidak diisi. Jika permintaan terputus di tengah jalan, statusnya bisa tetap Sebagian terkonfirmasi atau Belum dikonfirmasi.
Format error
Error dikembalikan dalam format yang kompatibel dengan OpenAI.
{
"error": {
"message": "Deskripsi error yang bisa dibaca manusia",
"type": "authentication_error",
"code": "invalid_api_key",
"param": null
}
}type ditentukan oleh kode status, dan code menunjukkan penyebabnya.
| Status | type | code | Penyebab |
|---|---|---|---|
400 | invalid_request_error | invalid_request | Pelanggaran field, nilai, atau aturan body. param berisi field yang bermasalah |
400 | invalid_request_error | upstream_rejected_request | Penyedia model menolak permintaan |
401 | authentication_error | invalid_api_key | Format kunci salah, kunci tidak ada, kedaluwarsa·dicabut·dirotasi, atau header Authorization lebih dari satu |
403 | permission_error | api_disabled | Fitur Keural API nonaktif |
403 | permission_error | model_api_disabled | Akses API untuk model nonaktif |
403 | permission_error | model_not_allowed | model berbeda dengan model kunci, atau anggota tidak memiliki izin API |
404 | invalid_request_error | not_found | Path tidak ada |
405 | invalid_request_error | method_not_allowed | Method salah. Header Allow berisi method yang diizinkan |
429 | rate_limit_error | Tabel di Batas penggunaan di atas | Batas terlampaui |
503 | server_error | upstream_timeout | Respons tidak selesai dalam 600 detik |
503 | server_error | invalid_upstream_response | Format respons penyedia tidak normal, ukuran stream terlampaui |
503 | server_error | dependency_unavailable · unsupported_provider | Gangguan internal sementara. Hubungi dukungan dengan menyertakan x-request-id |
Pemecahan masalah
| Gejala | Kode respons | Yang perlu diperiksa |
|---|---|---|
| Daftar model kosong atau koneksi gagal | 404 · 405 | Apakah Base URL diakhiri dengan …/llm/v1 |
| Autentikasi gagal | 401 | Salah ketik atau spasi di depan dan belakang kunci, kedaluwarsa, dicabut, atau dirotasi |
| Terhubung, tetapi model tidak bisa dipakai | 403 | Apakah model ID sama dengan model kunci, dan izin API organisasi |
| Respons lambat atau sesekali gagal | 429 | Batas penggunaan |
| Respons tidak datang untuk sementara | 5xx | Coba lagi beberapa saat kemudian |
| Penggunaan tidak tampil atau berbeda dari yang sebenarnya | — | Rentang waktu pencarian dan workspace pemilik kunci |
Jika belum teratasi, hubungi administrator dengan menyertakan informasi berikut. Jangan kirim isi kunci atau prompt.
- Waktu kejadian
- Model ID yang dipakai
- Nama dan versi aplikasi klien
x-request-iddari header respons- Pesan error yang tampil di layar