เริ่มเรียก AI Gateway ใน 3 ขั้นตอน
ถ้าแอปของคุณเรียก OpenAI อยู่แล้ว เปลี่ยนสองบรรทัดก็ใช้ Wisporta ได้ทันที
- 1
สร้าง API key
เข้า dashboard → API Keys → สร้าง key ใหม่ คีย์ขึ้นต้นด้วย sk- และระบบแสดงให้เห็นครั้งเดียวตอนสร้างเท่านั้น
- 2
ชี้ base URL มาที่ Wisporta
ใช้ client เดิมได้ เปลี่ยน base URL เป็น https://api.wisporta.com/v1 แล้วใส่ key ของ Wisporta แทน
- 3
เลือก model
ระบุเป็น provider/model เช่น openai/gpt-5.5 หรือใช้ alias สั้น ๆ เช่น claude-sonnet
curl https://api.wisporta.com/v1/chat/completions \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.5",
"messages": [
{ "role": "user", "content": "Hello!" }
]
}'ดูว่ามี model อะไรให้เรียก
GET /v1/models เป็น endpoint สาธารณะ ไม่ต้องใส่ API key คืนรายการ model ที่เปิดให้ใช้พร้อมราคาขายต่อ 1M tokens หน่วย pts
curl https://api.wisporta.com/v1/models
# → { "object": "list", "data": [ { "id": "openai/gpt-5.5", … } ] }ชื่อ model เรียกได้ 2 แบบ
openai/gpt-5.5provider/model — ระบุชัดเจนว่าจะใช้ provider ไหน แนะนำให้ใช้แบบนี้ใน production
claude-sonnet → anthropic/claude-sonnet-5ชื่อย่อที่ไม่มีเครื่องหมาย / — สะดวกตอนทดลอง แต่ปลายทางอาจเปลี่ยนได้เมื่อ catalog อัปเดต
พิมพ์ชื่อผิดจะได้ 400 model_not_found พร้อม suggestions ที่ใกล้เคียงที่สุดให้ใน response
provider ที่เปิดใช้งานอยู่
รายการนี้ดึงสดจาก /v1/models ทุกชั่วโมง
anthropic/claude-fable-5anthropic/claude-opus-4-8deepseek/deepseek-v4-prodeepseek/deepseek-v4-flashgoogle/gemini-3.1-progoogle/gemini-3.5-flashopenai/gpt-5.5openai/gpt-5.4Request body ของ /v1/chat/completions
โครงสร้างเดียวกับ OpenAI Chat Completions บวกพารามิเตอร์ strategy ที่เป็นของ Wisporta เอง
| พารามิเตอร์ | ชนิด | ค่าเริ่มต้น | ความหมาย |
|---|---|---|---|
modelต้องระบุ | string | — | ชื่อ model แบบเต็มหรือ alias |
messagesต้องระบุ | array | — | บทสนทนา แต่ละรายการมี role และ content — ต้องมีอย่างน้อย 1 รายการ |
stream | boolean | false | true = ส่งกลับเป็น SSE ทีละ token · ไม่ส่งมาถือว่า false |
strategy | "cost" | "latency" | "fallback" | "cost" | วิธีเลือกปลายทางเมื่อ model มีตัวสำรอง — cost ถูกสุด, latency เร็วสุด, fallback ไล่ตามลำดับสำรอง |
max_tokens | number | — | จำกัดจำนวน token ที่ให้ตอบ |
temperature | number (0–2) | — | ความสร้างสรรค์ 0–2 · บาง model ปฏิเสธพารามิเตอร์นี้ ระบบจะตัดออกให้เองไม่ต้องจัดการ |
role ที่รับมีเพียง system, user, assistant — ยังไม่รองรับ role tool
รับคำตอบทีละ token
ใส่ "stream": true จะได้ text/event-stream รูปแบบ chat.completion.chunk เหมือน OpenAI และปิดท้ายด้วย data: [DONE]
curl https://api.wisporta.com/v1/chat/completions \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [{ "role": "user", "content": "Tell me a joke" }],
"stream": true
}'
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"delta":{"content":"Why"},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"delta":{},"finish_reason":"stop"}]}
data: [DONE]Header ที่ควรอ่านจาก response
พอยท์คงเหลือและสถานะ model ติดมากับทุก response อยู่แล้ว ไม่ต้องยิง endpoint เพิ่มเพื่อเช็ก
| Header | ความหมาย |
|---|---|
| X-Credit-Balance | พอยท์คงเหลือของ organization ณ ตอนเริ่ม request |
| X-Credit-Expires-At | วันเวลาที่พอยท์จะหมดอายุ (ISO 8601) |
| X-Credit-Days-Left | จำนวนวันที่เหลือก่อนพอยท์หมดอายุ |
| X-Model-Deprecated | ส่งค่า true เมื่อ model ที่เรียกกำลังจะเลิกให้บริการ — ยังใช้ได้แต่ควรย้าย |
| X-Model-Replaced-By | ชื่อ model ที่ควรย้ายไปใช้แทน |
| Warning | ข้อความ 299 อ่านง่ายสำหรับ log ของคุณ |
Error handling
gateway ตอบ error กลับมา 2 รูปแบบ — client ที่ parse แค่รูปแบบเดียวจะพังกับอีกรูปแบบ
error เป็น string ตรง ๆ ใช้กับปัญหาเรื่องสิทธิ์ พอยท์ และ request ที่ผิดรูป
error เป็น object ใช้กับปัญหาเรื่อง model และ provider ต้นทาง
// flat — auth, points, malformed request
{
"error": "insufficient_credit",
"message": "Insufficient points. Please add points to continue.",
"balance": 0,
"currency": "THB"
}
// nested — model and upstream provider problems
{
"error": {
"type": "invalid_request_error",
"code": "model_not_found",
"message": "…",
"param": "model",
"suggestions": ["openai/gpt-5.5"]
}
}| code | HTTP | รูปแบบ | ความหมาย |
|---|---|---|---|
| invalid_request | 400 | flat | body ไม่ใช่ JSON หรือไม่ผ่าน validation (มีรายละเอียดใน details) |
| model_not_found | 400 | nested | ไม่มี model ชื่อนี้ — ดู suggestions ใน response |
| unauthorized | 401 | flat | API key ไม่ถูกต้อง ถูก revoke หรือไม่ได้ส่งมา |
| insufficient_credit | 402 | flat | พอยท์คงเหลือไม่พอ |
| credit_expired | 402 | flat | พอยท์หมดอายุแล้ว เติมใหม่เพื่อใช้งานต่อ |
| account_disabled | 403 | flat | บัญชีผู้ใช้ถูกระงับ |
| organization_disabled | 403 | flat | organization ถูกระงับ |
| too_many_requests | 429 | flat | มี request ของ organization นี้กำลังประมวลผลพร้อมกันเกิน 10 รายการ — รอให้รายการเดิมเสร็จแล้วส่งใหม่ |
| internal_error | 500 | flat | ระบบขัดข้องภายใน ลองใหม่อีกครั้ง |
| upstream_error | 502 | nested | provider ต้นทางตอบ error กลับมา |
| model_unavailable | 503 | nested | model ถูกปิดใช้งานชั่วคราว — response จะบอกตัวสำรองให้ถ้ามี |
| service_unavailable | 503 | flat | ไม่มี provider ที่พร้อมให้บริการสำหรับ model นี้ |
ใช้กับ SDK ของ OpenAI ได้ตรง ๆ
ไม่ต้องเปลี่ยน library ไม่ต้องเขียน HTTP client เอง — ตั้ง base_url และ api_key เท่านั้น
from openai import OpenAI
client = OpenAI(
base_url="https://api.wisporta.com/v1",
api_key="YOUR_WISPORTA_KEY",
)
response = client.chat.completions.create(
model="openai/gpt-5.5",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.wisporta.com/v1",
apiKey: process.env.WISPORTA_API_KEY,
});
const response = await client.chat.completions.create({
model: "openai/gpt-5.5",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);ข้อจำกัดที่ควรรู้
จำนวน request พร้อมกัน
หนึ่ง organization ประมวลผลได้ 10 request พร้อมกัน เกินกว่านั้นได้ 429 too_many_requests ทันที
พอยท์และการหมดอายุ
ระบบตัดพอยท์หลัง request สำเร็จ และพอยท์มีอายุ 30 วันนับจากการเติมครั้งล่าสุด — ดูรายละเอียดในคู่มือ Web App
