Lewati ke konten
KeuralDocs
Pengembang

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.

MetodePathKeterangan
POST/llm/v1/chat/completionsMembuat percakapan (mendukung streaming)
GET/llm/v1/modelsDaftar 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

TahapYang dilakukan
1. Terbitkan kunciBuka Pengaturan → API, pilih model, lalu terima kunci. Salin model ID dan kunci.
2. Hubungkan klienMasukkan Base URL, API key, dan model ID ke aplikasi atau kode.
3. Pakai dan kelolaLihat penggunaan di layar yang sama, dan terbitkan ulang atau cabut kunci jika perlu.

Persiapan

ItemIsi
Akun KeuralAkun yang dapat login
Menu APIJika menu API tidak ada di Pengaturan, minta administrator mengaktifkan fitur ini.
Izin anggota organisasiUntuk menerima kunci di workspace organisasi, admin organisasi harus mengizinkan penggunaan API Anda. Lihat Izin API anggota organisasi.
Base URLAlamat API publik dari administrator
KlienAplikasi atau SDK yang mendukung koneksi kompatibel OpenAI API

Menerbitkan API key

  1. Di menu akun, buka Pengaturan → API. Di aplikasi desktop dan mobile, menu ini ada di bagian Alat.
  2. Di tab API keys, pilih workspace pemilik kunci (pribadi atau organisasi) dan Model ID.
  3. Jika perlu, tentukan Tanggal kedaluwarsa kunci baru. Jika dikosongkan, kunci berlaku sampai dicabut.
  4. 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.

BagianYang dilakukan
API permissions by userMengaktifkan atau menonaktifkan izin penggunaan API untuk setiap anggota.
Issued keysMemeriksa status kunci yang diterbitkan organisasi dan mencabutnya. Kunci lengkap tidak bisa dilihat.
API usageMelihat jumlah permintaan dan penggunaan token dari kunci yang diterbitkan organisasi.
TindakanHasil
Mengaktifkan izinAnggota tersebut bisa menerbitkan kunci di workspace organisasi.
Menonaktifkan izinPenerbitan 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).

NilaiYang dimasukkanNama di setiap aplikasi
Base URLAlamat API publik dari administrator (…/llm/v1)Base URL, API Base, Endpoint, Host
API KeyKunci yang diterbitkan (tanpa spasi di depan atau belakang)API Key, Token, Secret Key, Authorization
ModelModel ID dari layar penerbitan. Harus sama persis dengan model yang terhubung ke kunciModel, Model ID, Model Name
  1. Di pengaturan aplikasi, tambahkan Koneksi kompatibel OpenAI (Connection).
  2. Masukkan Base URL dan API Key, lalu simpan.
  3. Pilih model dari daftar model. Daftar hanya menampilkan satu model, yaitu model yang terhubung ke kunci.
  4. Kirim pesan singkat dan pastikan respons diterima.

Format permintaan adalah sebagai berikut.

JenisIsi
Permintaan chatPOST <Base URL>/chat/completions
Ambil modelGET <Base URL>/models
Header autentikasiAuthorization: Bearer <issued key>
Header kontenContent-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.

FieldAturan
modelWajib. Model ID dari kunci
messagesWajib. 1 sampai 4.096 item
stream · stream_optionsstream_options hanya dikirim saat stream: true. Mendukung include_usage.
toolsMaksimal 128. Nama fungsi [A-Za-z0-9_-] 1 hingga 64 karakter
tool_choicenone · auto · required · fungsi tertentu. required membutuhkan tools.
parallel_tool_callsJika model tidak mendukung, 400
response_formattext · json_object · json_schema
max_tokens · max_completion_tokensKirim salah satu saja. Jika tidak dikirim, 4.096 (atau lebih kecil jika batas model lebih rendah). Melebihi batas model menghasilkan 400
temperature0 hingga 2. Jika model tidak mendukung, 400
top_p0 hingga 1
frequency_penalty · presence_penalty-2 sampai 2
stopString atau array maksimal 4
seedInteger
userMaksimal 256 karakter
nHanya 1

Pesan

PeranField yang diterima
system · developercontent, name
usercontent (string atau array bagian teks·gambar), name
assistantcontent, name, refusal, tool_calls
toolcontent, tool_call_id
  • Pesan tool hanya membalas satu kali untuk setiap id di tool_calls sebelumnya.
  • Bagian gambar (image_url) hanya dimasukkan ke pesan user untuk model yang menerima gambar. Gunakan alamat http atau https, atau data URI base64 berformat PNG, JPEG, GIF, atau WebP. detail berupa auto · low · high.

Body

ItemBatas
Content-Typeapplication/json
Ukuran1 MiB
Struktur JSONSatu objek level atas, kedalaman bersarang 64 atau kurang, tidak ada kunci yang sama dalam satu objek
Waktu permintaanMaksimal 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 429PenyebabRetry-After
rate_limit_exceededRPM · TPM · jumlah permintaan bersamaan terlampauiRPM·TPM 60 detik, permintaan bersamaan 1 detik
api_busyKapasitas pemrosesan server terlampauiTidak ada. Tunggu sebentar lalu coba lagi.
upstream_rate_limitBatas dari penyedia model terlampauiTidak 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.

TindakanHasilCatatan
Terbitkan ulangMenerima kunci baru.Kunci lama langsung tidak berlaku. Perbarui juga kunci di aplikasi yang sudah terhubung.
CabutKunci 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.

LokasiIsi
Pengaturan → API → tab API usagePenggunaan kunci yang Anda terbitkan di workspace saat ini
Manajemen organisasi → Organization API, bagian bawah API usagePenggunaan semua kunci yang diterbitkan di organisasi (pemilik dan admin organisasi)

Kondisi pencarian

KondisiKeterangan
Waktu mulai · waktu akhirWaktu Korea (KST). Waktu mulai disertakan, waktu akhir tidak. Jika kosong, 7 hari terakhir ditampilkan, dan pencarian maksimal 90 hari sekaligus.
Model IDHanya menampilkan permintaan untuk model tertentu. Jika kosong, semua permintaan ditampilkan.
Status permintaanPilih 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.

ItemKeterangan
ID permintaanNilai yang disampaikan saat menghubungi dukungan
Jenis responsStreaming atau non-streaming
Status konfirmasi penggunaanTerkonfirmasi · Sebagian terkonfirmasi · Belum dikonfirmasi
Waktu selesai · Latensi (ms)Waktu permintaan selesai dan waktu yang dibutuhkan.
Token baca cache · Token pembuatan cache · Token penalaranHanya 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.

StatustypecodePenyebab
400invalid_request_errorinvalid_requestPelanggaran field, nilai, atau aturan body. param berisi field yang bermasalah
400invalid_request_errorupstream_rejected_requestPenyedia model menolak permintaan
401authentication_errorinvalid_api_keyFormat kunci salah, kunci tidak ada, kedaluwarsa·dicabut·dirotasi, atau header Authorization lebih dari satu
403permission_errorapi_disabledFitur Keural API nonaktif
403permission_errormodel_api_disabledAkses API untuk model nonaktif
403permission_errormodel_not_allowedmodel berbeda dengan model kunci, atau anggota tidak memiliki izin API
404invalid_request_errornot_foundPath tidak ada
405invalid_request_errormethod_not_allowedMethod salah. Header Allow berisi method yang diizinkan
429rate_limit_errorTabel di Batas penggunaan di atasBatas terlampaui
503server_errorupstream_timeoutRespons tidak selesai dalam 600 detik
503server_errorinvalid_upstream_responseFormat respons penyedia tidak normal, ukuran stream terlampaui
503server_errordependency_unavailable · unsupported_providerGangguan internal sementara. Hubungi dukungan dengan menyertakan x-request-id

Pemecahan masalah

GejalaKode responsYang perlu diperiksa
Daftar model kosong atau koneksi gagal404 · 405Apakah Base URL diakhiri dengan …/llm/v1
Autentikasi gagal401Salah ketik atau spasi di depan dan belakang kunci, kedaluwarsa, dicabut, atau dirotasi
Terhubung, tetapi model tidak bisa dipakai403Apakah model ID sama dengan model kunci, dan izin API organisasi
Respons lambat atau sesekali gagal429Batas penggunaan
Respons tidak datang untuk sementara5xxCoba 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-id dari header respons
  • Pesan error yang tampil di layar

Di halaman ini