Keural API
ส่งคำขอในรูปแบบ OpenAI Chat Completions ด้วย API key
เรียกใช้โมเดลที่ลงทะเบียนใน Keural ด้วยรูปแบบ OpenAI Chat Completions
Base URL มีรูปแบบ https://<public API domain for each environment>/llm/v1 โดเมน API สาธารณะแตกต่างกันในแต่ละสภาพแวดล้อม ให้สอบถามผู้ดูแลระบบ
| เมธอด | พาธ | คำอธิบาย |
|---|---|---|
POST | /llm/v1/chat/completions | สร้างการสนทนา (รองรับการสตรีม) |
GET | /llm/v1/models | แสดงรายการโมเดลที่เชื่อมกับคีย์ |
GET | /llm/v1/models/{model} | ดูข้อมูลโมเดลที่เชื่อมกับคีย์ |
ไม่รองรับพาธสำหรับ embedding, การสร้างภาพ, เสียง และ Responses API เรียกพาธเหล่านี้จะได้รับ 404
ขั้นตอนการใช้งาน
| ขั้นตอน | สิ่งที่ทำ |
|---|---|
| 1. ออกคีย์ | ไปที่ การตั้งค่า → API เลือกโมเดลแล้วรับคีย์ คัดลอก Model ID และคีย์ไว้ |
| 2. เชื่อมต่อไคลเอนต์ | ใส่ Base URL, API key และ Model ID ลงในแอปหรือโค้ด |
| 3. ใช้งานและจัดการ | ตรวจสอบการใช้งานในหน้าเดียวกัน และออกคีย์ใหม่หรือเพิกถอนเมื่อจำเป็น |
เตรียมการ
| รายการ | รายละเอียด |
|---|---|
| บัญชี Keural | บัญชีที่เข้าสู่ระบบได้ |
| เมนู API | หากไม่มีเมนู API ในการตั้งค่า ให้ขอผู้ดูแลระบบเปิดใช้ฟีเจอร์ |
| สิทธิ์ของสมาชิกองค์กร | หากต้องการออกคีย์ในพื้นที่ทำงานขององค์กร ผู้ดูแลระบบขององค์กรต้องอนุญาตการใช้ API ของคุณก่อน ดู สิทธิ์ API ของสมาชิกองค์กร |
| Base URL | ที่อยู่ API สาธารณะที่ผู้ดูแลระบบแจ้ง |
| ไคลเอนต์ | แอปหรือ SDK ที่รองรับการเชื่อมต่อแบบ OpenAI API |
ออก API key
- เปิดเมนูบัญชี เลือก การตั้งค่า → API ในแอปเดสก์ท็อปและแอปมือถือ เมนูนี้อยู่ในส่วน เครื่องมือ
- ในแท็บ API keys เลือกพื้นที่ทำงานที่คีย์จะสังกัด (ส่วนตัวหรือองค์กร) และ Model ID
- หากต้องการ ให้กำหนด วันหมดอายุของคีย์ใหม่ หากเว้นว่างไว้ คีย์จะใช้ได้โดยไม่มีวันหมดอายุจนกว่าจะเพิกถอน
- คลิก ออกคีย์ แล้วคลิก คัดลอกคีย์ เพื่อคัดลอกและเก็บรักษาคีย์ คีย์ฉบับเต็มจะแสดงเพียงครั้งเดียว
- คีย์ผูกกับพื้นที่ทำงานที่เลือกและโมเดลหนึ่งโมเดล การใช้งานจะนับให้ผู้ที่ออกคีย์
- พื้นที่ทำงานและโมเดลคู่เดียวกันจะมีคีย์ที่ใช้งานได้เพียงหนึ่งคีย์ หากต้องการคีย์ใหม่ ให้หมุนเวียนหรือเพิกถอนคีย์เดิม
- หากคีย์หายไป จะดูซ้ำไม่ได้ ให้ออกคีย์ใหม่ เมื่อออกคีย์ใหม่แล้ว คีย์เดิมจะใช้ไม่ได้ทันที
- หากขึ้นว่าไม่มีโมเดลที่ออกคีย์ได้ ให้ตรวจสอบกับผู้ดูแลระบบเรื่องการเปิดให้ใช้โมเดล แพลน และสิทธิ์ API ขององค์กร
สิทธิ์ API ของสมาชิกองค์กร
สำหรับเจ้าของและผู้ดูแลระบบขององค์กรเท่านั้น ในพื้นที่ทำงานขององค์กร สมาชิกจะออกคีย์ได้ก็ต่อเมื่อผู้ดูแลระบบอนุญาตก่อน ค่าเริ่มต้นของสมาชิกทุกคนคือถูกบล็อก
ไปที่ การจัดการองค์กร → Organization API เมนูนี้ประกอบด้วยสามส่วนต่อไปนี้ หากไม่มีเมนูนี้ แสดงว่าฟีเจอร์ API ปิดอยู่ หรือบัญชีนี้ไม่มีสิทธิ์จัดการองค์กร
| ส่วน | หน้าที่ |
|---|---|
| สิทธิ์ API ของแต่ละสมาชิก | เปิดหรือปิดการอนุญาตใช้ API ของสมาชิกแต่ละคน |
| Issued keys | ดูสถานะของคีย์ที่ออกในองค์กรและเพิกถอนได้ ไม่สามารถดูข้อความเต็มของคีย์ได้ |
| การใช้งาน API | ดูจำนวนคำขอและการใช้โทเค็นของคีย์ที่ออกในองค์กร |
| การดำเนินการ | ผลลัพธ์ |
|---|---|
| เปิดอนุญาต | สมาชิกนั้นออกคีย์ในพื้นที่ทำงานขององค์กรได้ |
| ปิดอนุญาต | การออกคีย์ใหม่และการเรียกใช้ด้วยคีย์เดิมจะถูกบล็อก คีย์ที่ออกไปแล้วจะไม่ถูกลบอัตโนมัติ หากจำเป็นให้เพิกถอนจาก 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 |
| Header การยืนยันตัวตน | Authorization: Bearer <issued key> |
| Header เนื้อหา | Content-Type: application/json |
คำขอแรก
export KEURAL_API_KEY='คีย์ที่ได้รับ'
export KEURAL_BASE_URL='https://<โดเมน API สาธารณะตามสภาพแวดล้อม>/llm/v1'
export MODEL_ID='Model 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 ในเนื้อหาคำขอต้องตรงกับ model ID ที่เชื่อมกับคีย์ หากมีพาธนำหน้า เช่น provider/model-ID ให้เปรียบเทียบส่วนหลัง / สุดท้าย หากไม่ตรงจะได้รับ 403 ในการตอบกลับ model จะเป็น 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 | จำเป็น model ID ของคีย์ |
messages | จำเป็น 1 ถึง 4,096 รายการ |
stream · stream_options | stream_options ส่งเฉพาะเมื่อ stream: true รองรับ 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ตอบกลับได้เพียงครั้งเดียวต่อidในtool_callsก่อนหน้า - ส่วนรูปภาพ (
image_url) ใส่ได้เฉพาะในข้อความuserของโมเดลที่รับรูปภาพ ใช้ที่อยู่httpหรือhttpsหรือ data URI แบบ base64 ที่เป็น PNG, JPEG, GIF หรือ WebPdetailใช้ได้auto·low·high
เนื้อหา (body)
| รายการ | ขีดจำกัด |
|---|---|
| Content-Type | application/json |
| ขนาด | 1 MiB |
| โครงสร้าง 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> ทุกการตอบกลับมี header x-request-id แนบมาด้วย
หากเกิดข้อผิดพลาดระหว่างสตรีม จะส่งอีเวนต์ data: ที่มี JSON ของข้อผิดพลาดมา แล้วการเชื่อมต่อจะปิดโดยไม่มี [DONE] หากชังค์เดียวเกิน 1 MiB หรือการตอบกลับเกิน 16 MiB สตรีมจะจบด้วย 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) ค่าจริงแตกต่างกันในแต่ละสภาพแวดล้อม
โทเค็นต่อนาทีจะถูกหักไว้ล่วงหน้าตั้งแต่รับคำขอ อินพุตนับ 1 โทเค็นต่อตัวอักษรภาษาอังกฤษ 4 ตัว และนับ 1 โทเค็นต่อตัวอักษรอื่น ๆ รูปภาพ 1 รูปนับ 2,000 โทเค็น เอาต์พุตหักเท่ากับ max_tokens (สูงสุด 4,096) ดังนั้นหากกำหนดขีดจำกัดเอาต์พุตเท่าที่จำเป็น โควตาคงเหลือจะมากขึ้น
รหัส 429 | สาเหตุ | Retry-After |
|---|---|---|
rate_limit_exceeded | เกิน RPM · TPM · จำนวนคำขอพร้อมกัน | RPM·TPM 60 วินาที, คำขอพร้อมกัน 1 วินาที |
api_busy | เซิร์ฟเวอร์รับคำขอเกินความจุ | ไม่มี ลองใหม่อีกครั้งในภายหลัง |
upstream_rate_limit | ผู้ให้บริการโมเดลเกินขีดจำกัด | ไม่มี |
การจัดการคีย์
ในแท็บ API keys ของ การตั้งค่า → API ตรวจสอบสถานะคีย์ (ใช้ได้ · หมดอายุ · เพิกถอนแล้ว) และหมุนเวียนหรือเพิกถอนคีย์ได้ที่นี่
คีย์เป็นสตริง 51 ตัวอักษรที่ขึ้นต้นด้วย krl_llm_ แต่ละพื้นที่ทำงานมีคีย์ได้หนึ่งคีย์ หากมีอยู่แล้ว จะหมุนเวียนคีย์แทนการออกใหม่ วันหมดอายุตั้งได้เฉพาะหลังวันนี้เท่านั้น
| การดำเนินการ | ผลลัพธ์ | หมายเหตุ |
|---|---|---|
| หมุนเวียน | ได้รับคีย์ใหม่ | คีย์เดิมใช้ไม่ได้ทันที ให้เปลี่ยนคีย์ในแอปที่เชื่อมต่อไว้ด้วย |
| เพิกถอน | บล็อกคีย์ทันที | ใช้เมื่อสงสัยว่าคีย์รั่วไหล คีย์ที่เพิกถอนแล้วไม่สามารถกู้คืนได้ |
ตรวจสอบการใช้งาน
คำขอที่ส่งผ่าน API และโทเค็นที่ใช้ไปดูได้จากสองที่
| ที่ | แสดงอะไร |
|---|---|
| การตั้งค่า → API → แท็บ API usage | การใช้งานของคีย์ที่คุณออกในพื้นที่ทำงานปัจจุบัน |
| การจัดการองค์กร → Organization API ด้านล่าง API usage | การใช้งานของคีย์ทั้งหมดที่ออกในองค์กร (สำหรับเจ้าของและผู้ดูแลระบบขององค์กร) |
เงื่อนไขการค้นหา
| เงื่อนไข | คำอธิบาย |
|---|---|
| เวลาเริ่ม · เวลาสิ้นสุด | เวลาเกาหลี (KST) รวมเวลาเริ่มแต่ไม่รวมเวลาสิ้นสุด หากเว้นว่างจะแสดง 7 วันล่าสุด และดูได้สูงสุด 90 วันต่อครั้ง |
| Model ID | ดูเฉพาะคำขอของโมเดลที่ระบุ หากเว้นว่างจะแสดงทั้งหมด |
| สถานะคำขอ | เลือกจาก ทั้งหมด · กำลังทำงาน · สำเร็จ · ล้มเหลว · ยกเลิก · ยังไม่ยืนยัน |
กำหนดเงื่อนไขแล้วคลิก ค้นหา หากต้องการดูคำขอที่เพิ่งส่งไป ให้คลิก รีเฟรช
ค่าที่แสดงบนหน้าจอ
- ช่วงเวลาที่ใช้ค้นหา (KST): ช่วงเวลาที่ค้นหาจริง หากเว้นเวลาว่างไว้ หรือเกิน 90 วัน จะแสดงช่วงที่เซิร์ฟเวอร์ปรับให้
- จำนวนคำขอ และ โทเค็นอินพุต · โทเค็นเอาต์พุต · โทเค็นรวม: รวมเฉพาะค่าที่ยืนยันแล้ว โทเค็นที่ยังไม่ยืนยันจะไม่นับเป็น 0 แต่แสดงเป็น ยังไม่ยืนยัน
- รายการคำขอ: แต่ละคำขอแสดงเป็นหนึ่งแถว ประกอบด้วยเวลาที่ส่ง Model ID สถานะคำขอ และโทเค็นอินพุต เอาต์พุต และรวม แต่ละหน้าแสดง 20 คำขอ เลื่อนหน้าด้วย ก่อนหน้า และ ถัดไป
คลิก รายละเอียดคำขอ ในแถวเพื่อดูค่าต่อไปนี้
| รายการ | คำอธิบาย |
|---|---|
| Request ID | ค่าที่ให้ไว้เมื่อติดต่อฝ่ายสนับสนุน |
| รูปแบบการตอบกลับ | สตรีมหรือไม่ใช่สตรีม |
| สถานะการยืนยันการใช้งาน | ยืนยันแล้ว · ยืนยันบางส่วน · ยังไม่ยืนยัน |
| เวลาสิ้นสุด · เวลาตอบสนอง (ms) | เวลาที่คำขอจบและเวลาที่ใช้ |
| โทเค็นอ่านแคช · โทเค็นสร้างแคช · โทเค็นการให้เหตุผล | แสดงเฉพาะเมื่อโมเดลส่งค่านี้กลับมา |
คำขอแบบสตรีมจะถูกบันทึกการใช้งานแม้ไม่ได้ใส่ stream_options.include_usage หากคำขอขาดหายกลางทาง สถานะอาจค้างเป็น ยืนยันบางส่วน หรือ ยังไม่ยืนยัน
รูปแบบข้อผิดพลาด
ข้อผิดพลาดจะถูกส่งกลับในรูปแบบที่เข้ากันได้กับ 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 | รูปแบบคีย์ผิด ไม่มีคีย์ คีย์หมดอายุ·ถูกเพิกถอน·ถูกหมุนเวียน หรือมี header 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 | เมธอดไม่ถูกต้อง header 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 | Model ID ตรงกับโมเดลของคีย์หรือไม่ และสิทธิ์ API ขององค์กร |
| ตอบกลับช้าหรือล้มเหลวเป็นครั้งคราว | 429 | ขีดจำกัดการใช้งาน |
| ไม่มีการตอบกลับชั่วคราว | 5xx | ลองใหม่อีกครั้งในภายหลัง |
| ไม่เห็นการใช้งาน หรือตัวเลขไม่ตรงกับที่ใช้จริง | — | ช่วงเวลาที่ค้นหาและพื้นที่ทำงานที่คีย์สังกัด |
หากยังไม่หายให้ติดต่อผู้ดูแลระบบ พร้อมข้อมูลต่อไปนี้เพื่อให้หาสาเหตุได้เร็วขึ้น ไม่ต้องส่งค่าคีย์ฉบับเต็มหรือเนื้อหา prompt
- เวลาที่เกิดเหตุ
- Model ID ที่ใช้
- ชื่อและเวอร์ชันของแอปไคลเอนต์
x-request-idจาก header การตอบกลับ- ข้อความข้อผิดพลาดที่แสดงบนหน้าจอ