Base URL: https://api.knplabai.com/ai
Endpoint: /v1/chat/completions
API Key: <YOUR_API_KEY> — สมัครและรับ key ได้ที่ /console
ℹ️ รองรับ OpenAI-compatible protocol — ใช้ได้กับ library ของ OpenAI โดยตรง เปลี่ยนแค่ base_url กับ api_key
curl -X POST https://api.knplabai.com/ai/v1/chat/completions \
-H "Accept: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"messages": [
{"role": "user", "content": "สวัสดี!"}
],
"stream": false
}'from openai import OpenAI
client = OpenAI(
api_key="<YOUR_API_KEY>",
base_url="https://api.knplabai.com/ai/v1"
)
response = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[
{"role": "user", "content": "สวัสดี!"}
],
stream=False
)
print(response.choices[0].message.content)// วิธีที่ 1: ใช้ OpenAI SDK
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "<YOUR_API_KEY>",
baseURL: "https://api.knplabai.com/ai/v1"
});
const response = await client.chat.completions.create({
model: "claude-sonnet-4-6",
messages: [{ role: "user", content: "สวัสดี!" }],
stream: false
});
console.log(response.choices[0].message.content);
// วิธีที่ 2: ใช้ fetch
const res = await fetch("https://api.knplabai.com/ai/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "claude-sonnet-4-6",
messages: [{ role: "user", content: "สวัสดี!" }],
stream: false
})
});
const data = await res.json();
console.log(data.choices[0].message.content);<?php
$ch = curl_init("https://api.knplabai.com/ai/v1/chat/completions");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <YOUR_API_KEY>",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"model" => "claude-sonnet-4-6",
"messages" => [
["role" => "user", "content" => "สวัสดี!"]
],
"stream" => false
])
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo $data["choices"][0]["message"]["content"];package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
body, _ := json.Marshal(map[string]interface{}{
"model": "claude-sonnet-4-6",
"messages": []map[string]string{
{"role": "user", "content": "สวัสดี!"},
},
"stream": false,
})
req, _ := http.NewRequest("POST",
"https://api.knplabai.com/ai/v1/chat/completions",
bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer <YOUR_API_KEY>")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
result, _ := io.ReadAll(resp.Body)
fmt.Println(string(result))
}using System.Net.Http;
using System.Text;
using System.Text.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Add(
"Authorization", "Bearer <YOUR_API_KEY>");
var body = JsonSerializer.Serialize(new {
model = "claude-sonnet-4-6",
messages = new[] {
new { role = "user", content = "สวัสดี!" }
},
stream = false
});
var response = await client.PostAsync(
"https://api.knplabai.com/ai/v1/chat/completions",
new StringContent(body, Encoding.UTF8, "application/json"));
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);import java.net.http.*;
import java.net.URI;
var client = HttpClient.newHttpClient();
String body = """
{
"model": "claude-sonnet-4-6",
"messages": [
{"role": "user", "content": "สวัสดี!"}
],
"stream": false
}""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.knplabai.com/ai/v1/chat/completions"))
.header("Authorization", "Bearer <YOUR_API_KEY>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
var response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
val client = OkHttpClient()
val json = """
{
"model": "claude-sonnet-4-6",
"messages": [
{"role": "user", "content": "สวัสดี!"}
],
"stream": false
}""".trimIndent()
val request = Request.Builder()
.url("https://api.knplabai.com/ai/v1/chat/completions")
.addHeader("Authorization", "Bearer <YOUR_API_KEY>")
.post(json.toRequestBody("application/json".toMediaType()))
.build()
val response = client.newCall(request).execute()
println(response.body?.string()){
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1677652288,
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "สวัสดีครับ! มีอะไรให้ช่วยไหมครับ?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}KNPLabs API รองรับการสร้างภาพจาก 3 กลุ่มโมเดล ใช้คนละ endpoint — ดูตารางด้านล่าง
| โมเดล | Endpoint | ราคา / ครั้ง |
|---|---|---|
| GPT Image 1, 1.5, Sora Image | /v1/images/generations | 0.060 – 0.160 cr |
| Nano Banana (Gemini Image) | /v1beta/models/{model}:generateContent | 0.198 – 0.660 cr |
| 🆕 Seedream 5.0 (Doubao) | /v1/images/generations | — (per-request) |
| VEO 3.1 (Video) | /v1/videos | 0.516 – 1.032 cr |
⚠️ Image/Video models คิดราคา ต่อครั้ง (per-request) ไม่ใช่ต่อ token | VEO ไม่มีลายน้ำ
/v1/images/generationsโมเดลที่รองรับ:
gpt-image-1.5-all — GPT Image 1.5 (💰0.156 cr/ครั้ง)gpt-image-1-all — GPT Image 1 (💰0.160 cr/ครั้ง)sora_image — Sora Image (💰0.060 cr/ครั้ง)cURL:
curl -X POST https://api.knplabai.com/ai/v1/images/generations \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-1.5-all",
"prompt": "A cute cat wearing a wizard hat, digital art",
"n": 1,
"size": "1024x1024"
}'
Python (OpenAI SDK):
from openai import OpenAI
client = OpenAI(
api_key="<YOUR_API_KEY>",
base_url="https://api.knplabai.com/ai/v1"
)
response = client.images.generate(
model="gpt-image-1.5-all",
prompt="A cute cat wearing a wizard hat, digital art",
n=1,
size="1024x1024"
)
print(response.data[0].url)
JavaScript (fetch):
const res = await fetch("https://api.knplabai.com/ai/v1/images/generations", {
method: "POST",
headers: {
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "gpt-image-1.5-all",
prompt: "A cute cat wearing a wizard hat",
n: 1,
size: "1024x1024"
})
});
const data = await res.json();
console.log(data.data[0].url);
📨 ตัวอย่าง Response:
{
"created": 1709000000,
"data": [
{
"url": "https://xxx.oss-xxx.aliyuncs.com/xxxxx.png",
"revised_prompt": "..."
}
]
}
📐 Size ที่รองรับ (GPT Image):
| Size | คำอธิบาย |
|---|---|
| 1024x1024 | สี่เหลี่ยม 1:1 |
| 1536x1024 | แนวนอน (Landscape) |
| 1024x1536 | แนวตั้ง (Portrait) |
⚠️ GPT Image รองรับเฉพาะ 3 ขนาดนี้เท่านั้น — ส่งค่าอื่นจะ error
/v1beta/models/{model}:generateContentโมเดลที่รองรับ:
gemini-3.1-flash-image-preview — Nano Banana2 (💰0.198 cr/ครั้ง)gemini-3-pro-image-preview — Nano Banana Pro (💰0.660 cr/ครั้ง)gemini-2.5-flash-image — Nano Banana (💰0.300 cr/ครั้ง)⚠️ Gemini Image ใช้ Gemini Native API (ไม่ใช่ OpenAI-compatible) — ใช้คนละ format กับ chat models
Endpoint:
POST https://api.knplabai.com/ai/v1beta/models/{MODEL}:generateContent?key=YOUR_API_KEY
⚠️ ส่ง API Key 2 ที่: ทั้ง ?key= ใน URL และ Authorization: Bearer ใน header
cURL:
curl -X POST \
"https://api.knplabai.com/ai/v1beta/models/gemini-2.5-flash-image:generateContent?key=<YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"contents": [{
"role": "user",
"parts": [{ "text": "สร้างรูปแมวใส่หมวกพ่อมด สไตล์ digital art" }]
}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {
"aspectRatio": "9:16"
}
}
}'
Python (requests):
import requests, base64
API_KEY = "<YOUR_API_KEY>"
MODEL = "gemini-2.5-flash-image"
url = f"https://api.knplabai.com/ai/v1beta/models/{MODEL}:generateContent?key={API_KEY}"
response = requests.post(url, json={
"contents": [{
"role": "user",
"parts": [{"text": "สร้างรูปแมวใส่หมวกพ่อมด"}]
}],
"generationConfig": {
"responseModalities": ["TEXT", "IMAGE"],
"imageConfig": {"aspectRatio": "9:16"}
}
}, headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}, timeout=300)
data = response.json()
for part in data["candidates"][0]["content"]["parts"]:
if "inlineData" in part:
img_bytes = base64.b64decode(part["inlineData"]["data"])
with open("output.png", "wb") as f:
f.write(img_bytes)
print("✅ บันทึกภาพแล้ว: output.png")
elif "text" in part:
print(part["text"])
JavaScript (fetch):
const API_KEY = "<YOUR_API_KEY>";
const MODEL = "gemini-2.5-flash-image";
const res = await fetch(
`https://api.knplabai.com/ai/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${API_KEY}`
},
body: JSON.stringify({
contents: [{ role: "user", parts: [{ text: "A cat with wizard hat" }] }],
generationConfig: {
responseModalities: ["TEXT", "IMAGE"],
imageConfig: { aspectRatio: "9:16" }
}
})
}
);
const data = await res.json();
const imgPart = data.candidates[0].content.parts
.find(p => p.inlineData);
if (imgPart) {
const imgSrc = `data:image/png;base64,${imgPart.inlineData.data}`;
// ใช้ใน
ได้เลย
}
📨 ตัวอย่าง Response:
{
"candidates": [{
"content": {
"parts": [
{
"inlineData": {
"mimeType": "image/png",
"data": "/9j/4AAQSkZJRgABAQAA..."
}
},
{
"text": "นี่คือรูปแมวใส่หมวกพ่อมดค่ะ"
}
]
}
}]
}
💡 ภาพอยู่ใน candidates[0].content.parts[i].inlineData.data เป็น Base64 — decode แล้วบันทึกเป็นไฟล์ได้เลย
โมเดลที่รองรับ:
grok-3-image (💰0.10 cr/ครั้ง)grok-4-image (💰0.16 cr/ครั้ง)grok-4.1-image (💰0.20 cr/ครั้ง)💡 Grok Image ใช้ endpoint เดียวกับ OpenAI (/v1/images/generations) และได้ผลลัพธ์เป็น URL แบบตรงไปตรงมาเหมือน GPT Image
Endpoint (OpenAI Compatible):
POST https://api.knplabai.com/ai/v1/images/generations
cURL:
curl -X POST "https://api.knplabai.com/ai/v1/images/generations" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-3-image",
"prompt": "a cute flying robot exploring a dense futuristic cyber-city",
"size": "960x1440",
"n": 1
}'
💡 ขนาดภาพ (size) ของ Grok ที่รองรับ: 960x960, 960x1440, 1440x960
| Ratio | คำอธิบาย |
|---|---|
| 1:1 | สี่เหลี่ยม (Instagram) |
| 9:16 | แนวตั้ง (TikTok / Reels) |
| 16:9 | แนวนอน (YouTube) |
| 4:3 | แนวนอน มาตรฐาน |
| 3:4 | แนวตั้ง มาตรฐาน |
| 3:2 | ภาพถ่าย แนวนอน |
| 2:3 | ภาพถ่าย แนวตั้ง |
| 5:4 | เกือบสี่เหลี่ยม แนวนอน |
| 4:5 | เกือบสี่เหลี่ยม แนวตั้ง |
| 21:9 | Ultrawide |
/v1/images/generationsโมเดลที่รองรับ:
doubao-seedream-5-0-260128 — Seedream 5.0 (Text-to-Image / Image-based)💡 Seedream 5.0 ใช้ endpoint เดียวกับ OpenAI (/v1/images/generations) — รองรับความละเอียดสูงในระดับ 2K และ 3K | ตอบ URL โดยตรง ไม่มี Base64
Endpoint:
POST https://api.knplabai.com/ai/v1/images/generations
cURL:
curl -X POST "https://api.knplabai.com/ai/v1/images/generations" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedream-5-0-260128",
"prompt": "A vibrant close-up portrait, model with sharp gaze, sculptural hat, rich color blocking, Vogue magazine cover aesthetic",
"size": "2048x2048",
"output_format": "jpeg",
"response_format": "url",
"watermark": false
}'
Python (requests):
import requests
API_KEY = "<YOUR_API_KEY>"
response = requests.post(
"https://api.knplabai.com/ai/v1/images/generations",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "doubao-seedream-5-0-260128",
"prompt": "A vibrant close-up portrait, Vogue magazine cover aesthetic",
"size": "2048x2048",
"output_format": "jpeg",
"response_format": "url",
"watermark": False
},
timeout=120
)
data = response.json()
print(data["data"][0]["url"])
JavaScript (fetch):
const res = await fetch("https://api.knplabai.com/ai/v1/images/generations", {
method: "POST",
headers: {
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "doubao-seedream-5-0-260128",
prompt: "A vibrant close-up portrait, Vogue magazine cover aesthetic",
size: "2048x2048",
output_format: "jpeg",
response_format: "url",
watermark: false
})
});
const data = await res.json();
console.log(data.data[0].url);
📨 ตัวอย่าง Response:
{
"created": 1775209143,
"model": "doubao-seedream-5-0-260128",
"data": [
{
"url": "https://xxx.volces.com/seedream/xxx.jpeg?...",
"size": "2k"
}
],
"usage": {
"generated_images": 1,
"output_tokens": 17800,
"total_tokens": 17800
}
}
💡 ภาพอยู่ใน data[0].url — Link มีอายุ 7 วัน กรุณา download เก็บไว้ทันที
📐 ขนาดภาพที่รองรับ (Seedream 5.0):
| Resolution | Aspect Ratio | Size (px) |
|---|---|---|
| 2K | 1:1 | 2048×2048 |
| 2K | 4:3 | 2304×1728 |
| 2K | 3:4 | 1728×2304 |
| 2K | 16:9 | 2848×1600 |
| 2K | 9:16 | 1600×2848 |
| 2K | 3:2 | 2496×1664 |
| 2K | 2:3 | 1664×2496 |
| 2K | 21:9 | 3136×1344 |
| 3K | 1:1 | 3072×3072 |
| 3K | 4:3 | 3456×2592 |
| 3K | 3:4 | 2592×3456 |
| 3K | 16:9 | 4096×2304 |
| 3K | 9:16 | 2304×4096 |
| 3K | 3:2 | 3744×2496 |
| 3K | 2:3 | 2496×3744 |
| 3K | 21:9 | 4704×2016 |
⚠️ ส่ง size เป็น "2K" หรือ "3K" แล้วให้โมเดลกำหนดขนาดเอง หรือระบุพิกเซลตรงๆ เช่น "2048x2048"
/v1/images/generations เหมือน GPT — ตอบ URL ความละเอียดสูง 2K/3K/v1/videosโมเดลที่รองรับ:
| model_id | คำอธิบาย |
|---|---|
| veo_3_1 | VEO 3.1 มาตรฐาน |
| veo_3_1-4K | VEO 3.1 ความละเอียด 4K |
| veo_3_1-fast | VEO 3.1 สร้างเร็ว |
| veo_3_1-fast-4K | VEO 3.1 สร้างเร็ว 4K |
| veo_3_1-components | VEO 3.1 Components |
| veo_3_1-components-4K | VEO 3.1 Components 4K |
| veo_3_1-fast-components-4K | VEO 3.1 Fast Components 4K |
✅ วีดีโอ VEO ไม่มีลายน้ำ (No Watermark)
⚡ การสร้างวีดีโอเป็น async — ต้อง poll สถานะจนเสร็จ (3 ขั้นตอน)
💰 หากสร้างล้มเหลว เครดิตจะถูกคืนอัตโนมัติ
ขั้นตอนที่ 1 — สร้าง Task:
POST https://api.knplabai.com/ai/v1/videos Content-Type: multipart/form-data Authorization: Bearer YOUR_API_KEY
พารามิเตอร์ (form-data):
| Field | Type | คำอธิบาย |
|---|---|---|
| model | string | ชื่อโมเดล เช่น veo_3_1 |
| prompt | string | คำอธิบายวีดีโอ (ภาษาอังกฤษ) |
| size | string | 16x9 แนวนอน | 9x16 แนวตั้ง | 1x1 สี่เหลี่ยม |
| seconds | string | 5 | 8 | 10 |
| watermark | string | false |
cURL:
curl -X POST "https://api.knplabai.com/ai/v1/videos" \ -H "Authorization: Bearer <YOUR_API_KEY>" \ -F "model=veo_3_1" \ -F "prompt=A cinematic aerial shot of a sunset over mountains" \ -F "size=16x9" \ -F "seconds=8" \ -F "watermark=false"
📨 Response (Task created):
{
"id": "video_abc123-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "pending",
"model": "veo_3_1"
}
ขั้นตอนที่ 2 — Poll สถานะ:
GET https://api.knplabai.com/ai/v1/videos/{task_id}
Authorization: Bearer YOUR_API_KEY
cURL:
curl "https://api.knplabai.com/ai/v1/videos/video_abc123-xxxx" \ -H "Authorization: Bearer <YOUR_API_KEY>"
📨 Response (สำเร็จ):
{
"id": "video_abc123-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "completed",
"progress": 100,
"model": "veo_3_1",
"video_url": "https://xxx.aliyuncs.com/flow/xxxxx.mp4"
}
💡 Poll ทุก 10 วินาที จนกว่า status จะเป็น completed — ค่า video_url จะอยู่ใน response
ขั้นตอนที่ 3 — ดาวน์โหลด (ถ้า video_url ไม่อยู่ใน status):
GET https://api.knplabai.com/ai/v1/videos/{task_id}/content
Authorization: Bearer YOUR_API_KEY
Python:
import requests, time
API_KEY = "<YOUR_API_KEY>"
BASE = "https://api.knplabai.com/ai"
headers = {"Authorization": f"Bearer {API_KEY}"}
# 1. สร้าง Task
resp = requests.post(f"{BASE}/v1/videos", headers=headers, data={
"model": "veo_3_1",
"prompt": "A cinematic aerial shot of sunset over mountains",
"size": "16x9",
"seconds": "8",
"watermark": "false"
})
task = resp.json()
task_id = task["id"]
print(f"✅ Task created: {task_id}")
# 2. Poll สถานะ
while True:
status_resp = requests.get(f"{BASE}/v1/videos/{task_id}", headers=headers)
data = status_resp.json()
status = data.get("status", "unknown")
progress = data.get("progress", 0)
print(f"📊 Status: {status} ({progress}%)")
if status == "completed":
video_url = data.get("video_url", "")
if not video_url:
# 3. ดึง URL จาก content endpoint
dl = requests.get(f"{BASE}/v1/videos/{task_id}/content", headers=headers)
video_url = dl.json().get("video_url", "")
print(f"🎬 Video URL: {video_url}")
break
elif status in ("failed", "error"):
print(f"❌ Failed: {data}")
break
time.sleep(10)
JavaScript (fetch):
const API_KEY = "<YOUR_API_KEY>";
const BASE = "https://api.knplabai.com/ai";
const headers = { "Authorization": `Bearer ${API_KEY}` };
// 1. สร้าง Task
const form = new FormData();
form.append("model", "veo_3_1");
form.append("prompt", "A cinematic sunset over mountains");
form.append("size", "16x9");
form.append("seconds", "8");
form.append("watermark", "false");
const createRes = await fetch(`${BASE}/v1/videos`, {
method: "POST", headers, body: form
});
const { id: taskId } = await createRes.json();
console.log("✅ Task:", taskId);
// 2. Poll สถานะทุก 10 วินาที
const poll = setInterval(async () => {
const res = await fetch(`${BASE}/v1/videos/${taskId}`, { headers });
const data = await res.json();
console.log("📊", data.status, data.progress + "%");
if (data.status === "completed") {
clearInterval(poll);
const videoUrl = data.video_url
|| (await (await fetch(`${BASE}/v1/videos/${taskId}/content`,
{ headers })).json()).video_url;
console.log("🎬 Video:", videoUrl);
} else if (data.status === "failed") {
clearInterval(poll);
console.error("❌ Failed:", data);
}
}, 10000);
📐 Size ที่รองรับ:
| Size | คำอธิบาย |
|---|---|
| 16x9 | แนวนอน (Landscape) — YouTube/Desktop |
| 9x16 | แนวตั้ง (Portrait) — TikTok/Reels |
| 1x1 | สี่เหลี่ยม (Square) — Instagram |
💡 ทดสอบสร้างวีดีโอได้ที่แท็บ 🧪 ทดสอบ API → ส่วน 🎬 ทดสอบสร้างวีดีโอ
/v1/video/createสร้างวีดีโอจากภาพ — ส่ง URL ภาพเข้าไปพร้อม prompt เพื่อให้ AI สร้างวีดีโอจากภาพนั้น
โมเดลที่รองรับ:
| model | คำอธิบาย | ภาพสูงสุด |
|---|---|---|
| veo3-fast-frames | VEO 3 Fast — สร้างวีดีโอจากภาพ (Image→Video) | 2 ภาพ |
| veo3.1-components | VEO 3.1 Components — สร้างจากภาพอ้างอิง (Reference) | 3 ภาพ |
⚠️ Endpoint นี้ใช้ JSON body (ไม่ใช่ form-data) และ endpoint เป็น /v1/video/create (ไม่ใช่ /v1/videos)
🖼️ ภาพต้องเป็น URL ที่เข้าถึงได้จากอินเทอร์เน็ต (https://...)
⚡ การสร้างเป็น async — ต้อง poll สถานะเหมือน Text-to-Video
ขั้นตอนที่ 1 — สร้าง Task:
POST https://api.knplabai.com/ai/v1/video/create Content-Type: application/json Authorization: Bearer <YOUR_API_KEY>
พารามิเตอร์ (JSON body):
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
| prompt | string | ✅ | คำอธิบายวีดีโอ (ภาษาอังกฤษ) |
| model | string | ✅ | veo3-fast-frames หรือ veo3.1-components |
| images | array | ✅ | รายการ URL ภาพ เช่น ["https://...png", "https://...jpg"] |
| aspect_ratio | string | ❌ | 16:9 | 9:16 | 1:1 (default: 16:9) |
| enhance_prompt | boolean | ❌ | ปรับปรุง prompt อัตโนมัติ (default: true) |
| enable_upsample | boolean | ❌ | เพิ่มความละเอียด (default: true) |
cURL:
curl -X POST "https://api.knplabai.com/ai/v1/video/create" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"prompt": "The cat in the image jumps gracefully onto a table",
"model": "veo3-fast-frames",
"images": [
"https://example.com/my-cat.png"
],
"enhance_prompt": true,
"enable_upsample": true,
"aspect_ratio": "16:9"
}'
📨 Response (Task created):
{
"id": "veo3-fast-frames:1762010543-twr7BEQ5wO",
"status": "pending",
"status_update_time": 1762010543957
}
ขั้นตอนที่ 2 — Poll สถานะ (เหมือน Text-to-Video):
GET https://api.knplabai.com/ai/v1/videos/{task_id}
Authorization: Bearer <YOUR_API_KEY>
💡 Poll ทุก 10 วินาที จนกว่า status จะเป็น completed
Python:
import requests, time
API_KEY = "<YOUR_API_KEY>"
BASE = "https://api.knplabai.com/ai"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"Accept": "application/json"
}
# 1. สร้าง Task (Image-to-Video)
resp = requests.post(f"{BASE}/v1/video/create", headers=headers, json={
"prompt": "The cat jumps gracefully onto a table",
"model": "veo3-fast-frames",
"images": [
"https://example.com/my-cat.png"
],
"enhance_prompt": True,
"enable_upsample": True,
"aspect_ratio": "16:9"
})
task = resp.json()
task_id = task["id"]
print(f"✅ Task created: {task_id}")
# 2. Poll สถานะ (ใช้ endpoint เดียวกับ Text-to-Video)
while True:
status_resp = requests.get(
f"{BASE}/v1/videos/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"}
)
data = status_resp.json()
status = data.get("status", "unknown")
print(f"📊 Status: {status}")
if status == "completed":
video_url = data.get("video_url", "")
if not video_url:
dl = requests.get(
f"{BASE}/v1/videos/{task_id}/content",
headers={"Authorization": f"Bearer {API_KEY}"}
)
video_url = dl.json().get("video_url", "")
print(f"🎬 Video URL: {video_url}")
break
elif status in ("failed", "error"):
print(f"❌ Failed: {data}")
break
time.sleep(10)
JavaScript (fetch):
const API_KEY = "<YOUR_API_KEY>";
const BASE = "https://api.knplabai.com/ai";
// 1. สร้าง Task (Image-to-Video)
const createRes = await fetch(`${BASE}/v1/video/create`, {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
prompt: "The cat jumps gracefully onto a table",
model: "veo3-fast-frames",
images: ["https://example.com/my-cat.png"],
enhance_prompt: true,
enable_upsample: true,
aspect_ratio: "16:9"
})
});
const { id: taskId } = await createRes.json();
console.log("✅ Task:", taskId);
// 2. Poll สถานะทุก 10 วินาที
const poll = setInterval(async () => {
const res = await fetch(`${BASE}/v1/videos/${taskId}`, {
headers: { "Authorization": `Bearer ${API_KEY}` }
});
const data = await res.json();
console.log("📊", data.status);
if (data.status === "completed") {
clearInterval(poll);
const videoUrl = data.video_url
|| (await (await fetch(`${BASE}/v1/videos/${taskId}/content`,
{ headers: { "Authorization": `Bearer ${API_KEY}` } })).json()).video_url;
console.log("🎬 Video:", videoUrl);
} else if (data.status === "failed") {
clearInterval(poll);
console.error("❌ Failed:", data);
}
}, 10000);
🖼️ ความแตกต่างจาก Text-to-Video:
• ใช้ endpoint /v1/video/create (ไม่ใช่ /v1/videos)
• ส่ง body เป็น JSON (ไม่ใช่ form-data)
• ต้องมี images array — URL ภาพที่เข้าถึงได้จากอินเทอร์เน็ต
• Poll สถานะใช้ /v1/videos/{task_id} เหมือนกัน
/v1/videosสร้างวีดีโอด้วย OpenAI Sora-2 — ใช้ endpoint /v1/videos แบบ multipart/form-data
⚠️ ใช้ endpoint /v1/videos ส่งแบบ multipart/form-data (เหมือน VEO)
⚡ เป็น async — ต้อง poll สถานะเหมือน VEO
📐 พารามิเตอร์ (form-data):
| Field | Type | Required | คำอธิบาย |
|---|---|---|---|
| model | string | ✅ | sora-2 |
| prompt | string | ✅ | คำอธิบายวีดีโอ |
| seconds | string | ❌ | 4 | 10 | 15 | 20 วินาที |
| size | string | ❌ | 720x1280 (แนวตั้ง) | 1280x720 (แนวนอน) |
| input_reference | file | ❌ | ไฟล์ภาพอ้างอิง (Image-to-Video) |
| watermark | string | ❌ | false |
| private | string | ❌ | false |
cURL:
curl -X POST "https://api.knplabai.com/ai/v1/videos" \ -H "Authorization: Bearer <YOUR_API_KEY>" \ -F "model=sora-2" \ -F "prompt=A cinematic drone shot flying through golden clouds at sunset" \ -F "seconds=10" \ -F "size=1280x720" \ -F "watermark=false" \ -F "private=false"
📨 Response:
{
"id": "video_5c6a605a-30c0-4a6a-9dbd-d1d6cfdd9980",
"object": "video",
"model": "sora-2",
"status": "queued",
"progress": 0,
"created_at": 1761622232,
"seconds": "10",
"size": "1280x720"
}
Python:
import requests, time
API_KEY = "<YOUR_API_KEY>"
BASE = "https://api.knplabai.com/ai"
headers = {"Authorization": f"Bearer {API_KEY}"}
# 1. สร้าง Task (multipart/form-data)
resp = requests.post(f"{BASE}/v1/videos", headers=headers, data={
"model": "sora-2",
"prompt": "A cinematic drone shot flying through golden clouds",
"seconds": "10",
"size": "1280x720",
"watermark": "false",
"private": "false"
})
task = resp.json()
task_id = task["id"]
print(f"✅ Task created: {task_id}")
# 2. Poll สถานะทุก 10 วินาที
while True:
data = requests.get(
f"{BASE}/v1/videos/{task_id}",
headers=headers
).json()
print(f"📊 Status: {data.get('status')}")
if data["status"] == "completed":
video_url = data.get("video_url", "")
if not video_url:
dl = requests.get(
f"{BASE}/v1/videos/{task_id}/content",
headers=headers
)
video_url = dl.json().get("video_url", "")
print(f"🎬 Video: {video_url}")
break
elif data["status"] in ("failed", "error"):
print(f"❌ Failed: {data}")
break
time.sleep(10)
💡 Poll สถานะใช้ /v1/videos/{task_id} เหมือน VEO
/v1/video/createสร้างวีดีโอด้วยโมเดล Grok Video จาก xAI (รองรับทั้ง Text-to-Video และ Image-to-Video)
โมเดลที่รองรับ:
| model | คำอธิบาย |
|---|---|
| grok-video-3 | Grok Video 3 (~5 วินาที) |
| grok-video-3-10s | Grok Video 3 ความยาว 10 วินาที |
| grok-video-3-15s | Grok Video 3 ความยาว 15 วินาที |
⚠️ Grok Video ใช้ Parameter และ Polling Endpoint ต่างจาก VEO!
• ไม่มีพารามิเตอร์ seconds (เวลาขึ้นอยู่กับรุ่นของ model ที่เลือก)
• ใช้ aspect_ratio แทน size แบบ VEO (เช่น "16:9", "9:16", "1:1")
• size ของ Grok หมายถึง Resolution (ส่งเป็น "720P" หรือ "1080P")
• Poll สถานะใช้ /v1/video/query?id= (ต่างจาก VEO ที่ใช้ /v1/videos/)
ขั้นตอนที่ 1 — สร้าง Task:
POST https://api.knplabai.com/ai/v1/video/create Content-Type: application/json Authorization: Bearer <YOUR_API_KEY>
cURL สร้าง Task:
curl -X POST "https://api.knplabai.com/ai/v1/video/create" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-video-3-10s",
"prompt": "A cinematic aerial shot of a futuristic neon city under heavy rain",
"aspect_ratio": "16:9",
"size": "720P"
}'
💡 หากต้องการทำ Image-to-Video เพิ่ม key "images": ["https://..."] ลงไปใน JSON ด้วย
ขั้นตอนที่ 2 — Poll สถานะ (Grok Video):
GET https://api.knplabai.com/ai/v1/video/query?id={task_id}
Authorization: Bearer <YOUR_API_KEY>
💡 Poll ทุก 10 วินาที จนกว่า status จะเป็น completed หรือ succeeded (หรือเช็ค data.status วางซ้อนอยู่ข้างใน ถ้า API ตอบแบบซ้อน object)
curl -G "https://api.knplabai.com/ai/v1/video/query" \ --data-urlencode "id=grok:abcd-1234-5678" \ -H "Authorization: Bearer <YOUR_API_KEY>"
คู่มือนี้สอนวิธีตั้งค่า OpenClaw (เวอร์ชันล่าสุด) ให้เชื่อมต่อกับ KNPLabs API Gateway — ใช้ API Key เดียวเข้าถึงทุกโมเดล
1. ดาวน์โหลดและติดตั้ง OpenClaw จากเว็บไซต์ทางการ
2. เปิดโปรแกรมครั้งแรกเพื่อให้ระบบสร้างไฟล์ config เริ่มต้น
3. ปิดโปรแกรมก่อนแก้ไข config
เปิดไฟล์ config หลัก:
Windows: C:\Users\{ชื่อ}\.openclaw\openclaw.json
macOS: ~/.openclaw/openclaw.json
ไฟล์นี้ประกอบด้วย 3 ส่วนหลัก:
agents — ตั้งค่าโมเดลหลักและ alias สำหรับสลับauth — กำหนด provider สำหรับ authenticationmodels — ตั้งค่า baseUrl, api type, และรายชื่อโมเดลแต่ละ providerแก้ไขเนื้อหาทั้งหมดเป็น:
⚠️ สำคัญมาก — ต้องใช้ openai-completions ทุก provider
KNPLabs Gateway ใช้ OpenAI-compatible protocol เพียงอย่างเดียว — ไม่ว่าจะเป็น Claude, GPT, Gemini หรือ DeepSeek ต้องตั้ง "api": "openai-completions" ทุกตัว ห้ามใช้ anthropic-messages หรือ google-generative-ai
{
"agents": {
"defaults": {
"model": {
"primary": "api-knplabs-claude/claude-sonnet-4-6"
},
"models": {
"api-knplabs-gpt/gpt-5.4": {
"alias": "GPT-5.4"
},
"api-knplabs-claude/claude-sonnet-4-6": {
"alias": "Claude Sonnet 4.6"
},
"api-knplabs-google/gemini-3-flash-preview": {
"alias": "Gemini 3 Flash"
},
"api-knplabs-deepseek/deepseek-v3.2": {
"alias": "Deepseek V3.2"
}
},
"workspace": "C:\\Users\\{ชื่อ}\\clawd",
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
}
},
"auth": {
"profiles": {
"api-knplabs-gpt:default": {
"provider": "api-knplabs-gpt",
"mode": "api_key"
},
"api-knplabs-claude:default": {
"provider": "api-knplabs-claude",
"mode": "api_key"
},
"api-knplabs-google:default": {
"provider": "api-knplabs-google",
"mode": "api_key"
},
"api-knplabs-deepseek:default": {
"provider": "api-knplabs-deepseek",
"mode": "api_key"
}
}
},
"models": {
"mode": "merge",
"providers": {
"api-knplabs-gpt": {
"baseUrl": "https://api.knplabai.com/ai/v1",
"api": "openai-completions",
"models": [
{
"id": "gpt-5.4",
"name": "GPT-5.4",
"reasoning": false,
"input": ["text"],
"contextWindow": 128000,
"maxTokens": 8192
}
]
},
"api-knplabs-claude": {
"baseUrl": "https://api.knplabai.com/ai/v1",
"api": "openai-completions",
"models": [
{
"id": "claude-sonnet-4-6",
"name": "Claude Sonnet 4.6",
"reasoning": false,
"input": ["text"],
"contextWindow": 200000,
"maxTokens": 8192
}
]
},
"api-knplabs-google": {
"baseUrl": "https://api.knplabai.com/ai/v1",
"api": "openai-completions",
"models": [
{
"id": "gemini-3-flash-preview",
"name": "Gemini 3 Flash",
"reasoning": false,
"input": ["text"],
"contextWindow": 2000000,
"maxTokens": 8192
}
]
},
"api-knplabs-deepseek": {
"baseUrl": "https://api.knplabai.com/ai/v1",
"api": "openai-completions",
"models": [
{
"id": "deepseek-v3.2",
"name": "Deepseek V3.2",
"reasoning": false,
"input": ["text"],
"contextWindow": 2000000,
"maxTokens": 8192
}
]
}
}
}
}
⚠️ จุดสำคัญ: baseUrl ทุก provider ต้องลงท้ายด้วย /ai/v1 | api ต้องเป็น openai-completions ทั้งหมด | cost ตั้งเป็น 0 (KNPLabs คิดจากระบบ credits แทน)
ตารางด้านล่างอธิบายว่าตำแหน่งไหนเปลี่ยนได้ ตำแหน่งไหนต้องคงไว้ตามเดิม:
| ตำแหน่งใน JSON | ตัวอย่างค่า | แก้ได้? | คำอธิบาย |
|---|---|---|---|
| agents.defaults.model.primary | api-knplabs-claude/claude-sonnet-4-6 | ✏️ ได้ | โมเดลหลักที่ Agent ใช้ — เปลี่ยนเป็น provider/model-id ตัวอื่นได้ |
| agents.defaults.models.alias | "GPT-5.4" | ✏️ ได้ | ชื่อย่อที่แสดงใน sidebar — ตั้งอะไรก็ได้ |
| agents.defaults.workspace | C:\Users\{ชื่อ}\clawd | ✏️ ได้ | โฟลเดอร์ทำงานของ Agent — เปลี่ยน {ชื่อ} เป็น Username ของคุณ |
| models.providers.*.models[].id | "claude-sonnet-4-6" | ⚠️ ระวัง | Model ID — ต้องตรงกับชื่อโมเดลใน หน้ารายการโมเดล เท่านั้น |
| models.providers.*.baseUrl | https://api.knplabai.com/ai/v1 | ❌ ห้ามแก้ | URL ของ Gateway — ค่านี้ต้องเหมือนกันทุก provider |
| models.providers.*.api | "openai-completions" | ❌ ห้ามแก้ | Protocol type — ต้องเป็น openai-completions เท่านั้น ทุกโมเดล |
💡 ตัวอย่างการเปลี่ยนโมเดลหลัก: ถ้าอยากให้ Agent เริ่มต้นด้วย GPT-5.4 แทน Claude
"primary": "api-knplabs-gpt/gpt-5.4"
💡 ตัวอย่างการเพิ่มโมเดลใหม่: เพิ่ม Grok 4.2 เข้าไปใน provider ที่มีอยู่
"api-knplabs-gpt": {
"models": [
{ "id": "gpt-5.4", ... },
{ "id": "grok-4.2", "name": "Grok 4.2", ... } ← เพิ่มตรงนี้
]
}
แล้วเพิ่ม alias ใน agents.defaults.models: "api-knplabs-gpt/grok-4.2": { "alias": "Grok 4.2" }
เปิดไฟล์:
Windows: C:\Users\{ชื่อ}\.openclaw\agents\main\agent\auth-profiles.json
macOS: ~/.openclaw/agents/main/agent/auth-profiles.json
ใส่ API Key ของคุณทุกช่อง (ใช้ key เดียวกันได้ทุก provider):
{
"version": 1,
"profiles": {
"api-knplabs-gpt:default": {
"type": "api_key",
"provider": "api-knplabs-gpt",
"key": "<YOUR_API_KEY>"
},
"api-knplabs-claude:default": {
"type": "api_key",
"provider": "api-knplabs-claude",
"key": "<YOUR_API_KEY>"
},
"api-knplabs-google:default": {
"type": "api_key",
"provider": "api-knplabs-google",
"key": "<YOUR_API_KEY>"
},
"api-knplabs-deepseek:default": {
"type": "api_key",
"provider": "api-knplabs-deepseek",
"key": "<YOUR_API_KEY>"
}
}
}
✅ ใช้ key เดียวกันทุก provider ได้เลย เพราะ KNPLabs Gateway รวมทุกโมเดลไว้ที่เดียว
1. ตรวจสอบว่าชื่อ provider ตรงกันทั้ง 2 ไฟล์ (เช่น api-knplabs-claude)
2. เปิด OpenClaw ใหม่อีกครั้ง
3. เลือกโมเดลจาก sidebar — ถ้าเห็นชื่อ alias ที่ตั้งไว้ (GPT-5.4, Claude Sonnet 4.6, Gemini 3 Flash ฯลฯ) แสดงว่า config ถูกต้อง
4. เข้าถึงเวอร์ชันเว็บได้ที่ http://127.0.0.1:18789/
💡 หากเปลี่ยนโมเดลหลักในอนาคต แก้ "primary" ใน agents.defaults.model เป็น provider/model-id ใหม่
💡 หมายเหตุเรื่อง Credits — เครื่องมือ AI (เช่น OpenClaw, Claude Code, Gemini CLI) อาจส่ง request มากกว่า 1 ครั้งต่อ 1 คำถาม ขึ้นอยู่กับการตั้งค่าของเครื่องมือนั้นๆ ตรวจสอบการใช้งานได้ที่หน้า Dashboard
ปกติ AI จะ ลืมทุกอย่างเมื่อจบแชท แต่ถ้าเพิ่ม MCP Memory Server จะทำให้ AI:
💡 ไม่ยุ่งกับ API Gateway — MCP Memory ทำงานฝั่ง client (เครื่องคุณ) ไม่กระทบ API หรือเครดิตใดๆ
เปิดไฟล์ openclaw.json แล้วเพิ่ม mcpServers:
{
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"]
}
}
}
แบบ App: ปิด OpenClaw แล้วเปิดใหม่
แบบ Gateway:
openclaw gateway restart
พิมพ์ในแชท:
จำว่าฉันชื่อ สมชาย อายุ 25 ปี ชอบกินอาหารไทย
แล้วเปิดแชทใหม่ ถาม:
ฉันชื่ออะไร?
ถ้า AI ตอบได้ว่า "สมชาย" แสดงว่า Memory ทำงานแล้ว! ✅
{
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-memory"]
}
},
"providers": [
{
"id": "knplabs",
"name": "KNPLabs Gateway",
"type": "openai",
"apiKey": "<YOUR_API_KEY>",
"baseUrl": "https://api.knplabai.com/ai/v1"
}
]
}
mcpServers.memory ออกจาก configClaude Code เป็น AI coding assistant แบบ terminal จาก Anthropic — ใช้ KNPLabs Gateway แทน API ตรงได้ง่ายๆ ด้วย environment variables
💡 หมายเหตุเรื่อง Credits — เครื่องมือ AI (เช่น OpenClaw, Claude Code, Gemini CLI) อาจส่ง request มากกว่า 1 ครั้งต่อ 1 คำถาม ขึ้นอยู่กับการตั้งค่าของเครื่องมือนั้นๆ ตรวจสอบการใช้งานได้ที่หน้า Dashboard
Ubuntu / Debian:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs node -v # ตรวจสอบเวอร์ชัน ≥ 18
macOS (Homebrew):
brew install node node -v # ตรวจสอบเวอร์ชัน ≥ 18
Windows:
# ติดตั้ง WSL ก่อน จากนั้นทำตามขั้นตอน Ubuntu # หรือดาวน์โหลดจาก https://nodejs.org
npm install -g @anthropic-ai/claude-code
✅ ตรวจสอบว่าติดตั้งสำเร็จ:
claude --version
ตั้ง 2 ค่านี้ใน terminal ก่อนรัน Claude Code:
Linux / macOS (เพิ่มใน ~/.bashrc หรือ ~/.zshrc):
# KNPLabs API Gateway config export ANTHROPIC_AUTH_TOKEN="<YOUR_API_KEY>" export ANTHROPIC_BASE_URL="https://api.knplabai.com/ai" # (optional) ระบุโมเดลเริ่มต้น export ANTHROPIC_MODEL="claude-sonnet-4-6"
Windows PowerShell:
$env:ANTHROPIC_AUTH_TOKEN="<YOUR_API_KEY>" $env:ANTHROPIC_BASE_URL="https://api.knplabai.com/ai" $env:ANTHROPIC_MODEL="claude-sonnet-4-6"
⚠️ สำคัญ: ANTHROPIC_BASE_URL ต้องชี้ไปที่ https://api.knplabai.com/ai (ไม่ต้องมี /v1 ต่อท้าย)
⚠️ สำคัญ — ต้อง cd ไปโฟลเดอร์โปรเจกต์ก่อนเปิด Claude Code
Claude Code จะทำงานกับไฟล์ใน โฟลเดอร์ปัจจุบัน เท่านั้น — ถ้าเปิดจาก home directory จะไม่เห็นไฟล์โปรเจกต์
# 1. เข้าไปยังโฟลเดอร์โปรเจกต์ก่อน cd /path/to/your/project # 2. เปิด Claude Code claude
💡 เช่น cd ~/my-website หรือ cd /var/www/my-app — Claude จะเห็นและแก้ไขไฟล์ทั้งหมดในนั้น
เมื่อเปิด Claude Code สำเร็จจะเห็น prompt ❯ — พิมพ์คำสั่งเป็นภาษาธรรมชาติได้เลย:
ตัวอย่างคำสั่งพื้นฐาน:
| พิมพ์อะไร | Claude Code ทำอะไร |
|---|---|
| สร้างไฟล์ hello.py ที่ print สวัสดี | สร้างไฟล์ใหม่ตาม spec → ถาม approve ก่อน save |
| อธิบายไฟล์ index.js ให้หน่อย | อ่านไฟล์แล้วอธิบายโครงสร้าง code |
| แก้ bug ในฟังก์ชัน login | หา bug, เสนอวิธีแก้, แก้ไข → ถาม approve |
| เขียน test สำหรับ utils.py | สร้าง unit test ใหม่ |
| refactor ให้ code อ่านง่ายขึ้น | ปรับปรุงโครงสร้าง code |
Slash Commands (คำสั่งพิเศษ):
| คำสั่ง | คำอธิบาย |
|---|---|
| /init | สร้างไฟล์ CLAUDE.md — สอน Claude เรื่องโปรเจกต์ของคุณ (แนะนำทำครั้งแรก) |
| /model | เปลี่ยนโมเดล AI ที่ใช้ |
| /cost | ดูค่าใช้จ่ายของ session นี้ |
| /clear | ล้างบทสนทนาทั้งหมด เริ่มใหม่ |
| /help | ดูคำสั่งทั้งหมด |
| Esc × 2 | ออกจาก Claude Code |
💡 เคล็ดลับ:
/init ครั้งแรก เพื่อให้ Claude เข้าใจโปรเจกต์ → คำตอบจะดีขึ้นมากตรวจสอบว่าตั้ง environment variables ถูกต้อง:
echo $ANTHROPIC_AUTH_TOKEN # ควรขึ้นต้นด้วย sk- echo $ANTHROPIC_BASE_URL # ควรเป็น https://api.knplabai.com/ai
ถ้ายังไม่ได้ แก้ไขใน ~/.bashrc แล้วรัน source ~/.bashrc
ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต และยืนยันว่า ANTHROPIC_BASE_URL ถูกต้อง
ลอง: curl https://api.knplabai.com/ai/v1/models ดูว่าเซิร์ฟเวอร์ตอบกลับหรือไม่
อาจเกิดจาก proxy หรือ firewall บล็อกการเชื่อมต่อ ลอง:
# ปิด proxy ชั่วคราว unset http_proxy https_proxy claude
ตรวจสอบ credits คงเหลือในหน้า Dashboard ของ KNPLabs
ลองรีสตาร์ท Claude Code ด้วย claude ใหม่อีกครั้ง
ตั้ง environment variable:
export ANTHROPIC_MODEL="claude-sonnet-4-6"
หรือดูรายชื่อโมเดลทั้งหมดได้ที่แท็บ 📋 รายการโมเดล
Gemini CLI เป็น AI coding assistant แบบ terminal จาก Google — เป็น open source ใช้ฟรี รองรับการใช้ผ่าน API proxy เชื่อมกับ KNPLabs Gateway ได้
💡 หมายเหตุเรื่อง Credits — เครื่องมือ AI (เช่น OpenClaw, Claude Code, Gemini CLI) อาจส่ง request มากกว่า 1 ครั้งต่อ 1 คำถาม ขึ้นอยู่กับการตั้งค่าของเครื่องมือนั้นๆ ตรวจสอบการใช้งานได้ที่หน้า Dashboard
วิธีที่ 1: ใช้ npx (ไม่ต้องติดตั้ง):
npx @google/gemini-cli
วิธีที่ 2: ติดตั้งผ่าน npm (แนะนำ):
npm install -g @google/gemini-cli
วิธีที่ 3: ติดตั้งผ่าน Homebrew (macOS/Linux):
brew install gemini-cli
✅ ตรวจสอบว่าติดตั้งสำเร็จ:
gemini --version
เพิ่มค่าเหล่านี้ใน ~/.bashrc หรือ ~/.zshrc:
Linux / macOS:
# KNPLabs API Gateway - Gemini CLI config export GEMINI_API_KEY="<YOUR_API_KEY>" export GOOGLE_GEMINI_BASE_URL="https://api.knplabai.com/ai"
Windows PowerShell:
$env:GEMINI_API_KEY="<YOUR_API_KEY>" $env:GOOGLE_GEMINI_BASE_URL="https://api.knplabai.com/ai"
⚠️ สำคัญ: ชื่อตัวแปรต้องเป็น GOOGLE_GEMINI_BASE_URL (ไม่ใช่ GEMINI_API_BASE) และ URL ต้องเป็น /ai เท่านั้น (Gemini CLI จะต่อ /v1beta ให้เอง)
สร้างไฟล์ ~/.gemini/settings.json เพื่อตั้งค่าถาวร:
{
"apiEndpoint": "https://api.knplabai.com/ai"
}
💡 ใช้วิธีนี้ร่วมกับ export GEMINI_API_KEY — จะไม่ต้องตั้ง URL ทุกครั้ง
⚠️ สำคัญ — ต้อง cd ไปโฟลเดอร์โปรเจกต์ก่อน
Gemini CLI จะทำงานกับไฟล์ใน โฟลเดอร์ปัจจุบัน เท่านั้น
# 1. เข้าไปยังโฟลเดอร์โปรเจกต์ cd /path/to/your/project # 2. เปิด Gemini CLI gemini
เมื่อเปิดครั้งแรกจะถามวิธี login — เลือก "Use Gemini API key"
ถ้าเห็น prompt > แสดงว่าเชื่อมต่อสำเร็จ 🎉
| พิมพ์อะไร | Gemini CLI ทำอะไร |
|---|---|
| อธิบายโครงสร้างโปรเจกต์นี้ | สแกนไฟล์ทั้งหมดแล้วสรุปโครงสร้าง |
| สร้าง REST API ด้วย Express.js | สร้างไฟล์และโค้ดให้ → ถาม approve |
| แก้ bug ใน app.js | วิเคราะห์โค้ดและเสนอวิธีแก้ |
| เขียน unit test สำหรับ utils.js | สร้าง test file ใหม่ |
คำสั่ง CLI ที่มีประโยชน์:
# ระบุโมเดลที่ต้องการ gemini -m gemini-2.5-pro # รวมหลายโฟลเดอร์ gemini -C /path/to/dir1 -C /path/to/dir2 # โหมด non-interactive (สำหรับ script) echo "อธิบายโค้ดนี้" | gemini
การใช้งานพื้นฐาน:
# เปิดในไดเรกทอรีปัจจุบัน gemini # รวมหลายไดเรกทอรี gemini -C /path/to/dir1 -C /path/to/dir2 # ระบุโมเดล gemini -m gemini-2.5-pro # โหมด non-interactive (สำหรับ script) echo "อธิบายโค้ดนี้" | gemini
ตัวอย่างคำสั่ง:
# เริ่มโปรเจกต์ใหม่ > สร้าง REST API ด้วย Express.js พร้อม auth # วิเคราะห์โค้ดที่มีอยู่ > อธิบายโครงสร้างของโปรเจกต์นี้ให้หน่อย # แก้ bug > ช่วยดู error ใน app.js และแนะนำวิธีแก้ # สร้าง test > เขียน unit test สำหรับ utils.js
ตรวจสอบว่าตั้ง environment variables ถูกต้อง:
echo $GEMINI_API_KEY # ควรขึ้นต้นด้วย sk- echo $GOOGLE_GEMINI_BASE_URL # ควรเป็น https://api.knplabai.com/ai
ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต และลอง:
# ปิด proxy ชั่วคราว unset http_proxy https_proxy gemini
ใช้ flag -m ตอนเปิด:
gemini -m gemini-2.5-pro
หรือดูรายชื่อโมเดลทั้งหมดได้ที่แท็บ 📋 รายการโมเดล
ได้ครับ! Gemini CLI รองรับ GitHub integration:
# review pull request gemini -C . "review PR #42 และสรุปการเปลี่ยนแปลง"
n8n เป็น workflow automation ที่รองรับ AI node ได้โดยตรง — แค่เปลี่ยน Base URL เป็นของ KNPLabs ก็ใช้ได้เลย
เข้า n8n แล้วกดปุ่ม Create Workflow มุมขวาบน
เลือก Trigger manually เพื่อทดสอบด้วยตัวเอง
กดปุ่ม + แล้วเลือกหมวด AI
เลือก OpenAI จากรายการ AI Nodes (เพราะ KNPLabs รองรับ OpenAI-compatible protocol)
เลือก Message a model ในหมวด TEXT ACTIONS
กด + Create new credential แล้วกรอกข้อมูลดังนี้:
<YOUR_API_KEY>https://api.openai.com/v1 เป็น https://api.knplabai.com/ai/v1
ถ้าขึ้น Connection tested successfully แสดงว่า API Key และ Base URL ถูกต้อง
ตั้งค่าในหน้า Message a model:
By ID แล้วพิมพ์ชื่อโมเดล เช่น gpt-4o
กด Execute step หรือ Execute workflow เพื่อทดสอบ — ผลลัพธ์จะแสดงที่ช่อง OUTPUT ทางขวา
✅ ถ้าเห็นข้อความตอบกลับใน OUTPUT แสดงว่าเชื่อมต่อสำเร็จ 🎉
https://api.knplabai.com/ai/v1gpt-4o, claude-sonnet-4-6แปลงข้อความเป็นเสียงพูดคุณภาพสูง รองรับหลายเสียงและหลายรูปแบบไฟล์
| Model | คุณภาพ |
|---|---|
gpt-4o-mini-tts | เร็ว คุณภาพดี แนะนำ |
tts-1 | มาตรฐาน |
tts-1-hd | คุณภาพสูง |
alloy · echo · fable · onyx · nova · shimmer
mp3 (default) · opus · aac · flac · wav · pcm
curl -X POST https://api.knplabai.com/ai/v1/audio/speech \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini-tts",
"input": "สวัสดีครับ นี่คือการทดสอบเสียงพูด",
"voice": "alloy"
}' \
--output speech.mp3
import requests
response = requests.post(
"https://api.knplabai.com/ai/v1/audio/speech",
headers={
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
},
json={
"model": "gpt-4o-mini-tts",
"input": "สวัสดีครับ นี่คือการทดสอบเสียงพูด",
"voice": "alloy"
}
)
with open("speech.mp3", "wb") as f:
f.write(response.content)
print("บันทึกไฟล์ speech.mp3 สำเร็จ!")
const fs = require('fs');
const res = await fetch('https://api.knplabai.com/ai/v1/audio/speech', {
method: 'POST',
headers: {
'Authorization': 'Bearer <YOUR_API_KEY>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gpt-4o-mini-tts',
input: 'สวัสดีครับ นี่คือการทดสอบเสียงพูด',
voice: 'alloy'
})
});
const buffer = Buffer.from(await res.arrayBuffer());
fs.writeFileSync('speech.mp3', buffer);
console.log('บันทึกไฟล์ speech.mp3 สำเร็จ!');
voice เพื่อเลือกเสียงที่ต้องการ"response_format": "wav" เพื่อเปลี่ยนรูปแบบไฟล์แปลงข้อความเป็น ตัวเลข (vector) ที่คอมพิวเตอร์เข้าใจ — ใช้สำหรับ:
| Model | ผู้พัฒนา | ขนาด Vector |
|---|---|---|
text-embedding-3-large | OpenAI | 3,072 |
text-embedding-3-small | OpenAI | 1,536 |
text-embedding-ada-002 | OpenAI | 1,536 |
gemini-embedding-exp-03-07 | กำหนดได้ |
curl -X POST https://api.knplabai.com/ai/v1/embeddings \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "text-embedding-3-large",
"input": "สวัสดีครับ นี่คือข้อความทดสอบ"
}'
curl -X POST https://api.knplabai.com/ai/v1/embeddings \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-embedding-exp-03-07",
"input": "สวัสดีครับ นี่คือข้อความทดสอบ",
"dimensions": 768
}'
import requests
response = requests.post(
"https://api.knplabai.com/ai/v1/embeddings",
headers={
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json"
},
json={
"model": "text-embedding-3-large",
"input": "สวัสดีครับ"
}
)
data = response.json()
embedding = data["data"][0]["embedding"]
print(f"ได้ vector {len(embedding)} มิติ")
print(embedding[:5]) # แสดง 5 ตัวแรก
const res = await fetch('https://api.knplabai.com/ai/v1/embeddings', {
method: 'POST',
headers: {
'Authorization': 'Bearer <YOUR_API_KEY>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'text-embedding-3-large',
input: 'สวัสดีครับ'
})
});
const data = await res.json();
const embedding = data.data[0].embedding;
console.log(`ได้ vector ${embedding.length} มิติ`);
{
"object": "list",
"data": [{
"object": "embedding",
"embedding": [0.0023, -0.0093, 0.0451, ...],
"index": 0
}],
"model": "text-embedding-3-large",
"usage": { "prompt_tokens": 8, "total_tokens": 8 }
}
/v1/embeddings — แค่เปลี่ยน modeldimensions เลือกขนาด vector ได้ (ไม่ใส่ก็ได้)OpenCode คือ AI coding assistant บน Terminal — รองรับ 3 provider ที่ทดสอบแล้วว่าใช้งานได้กับ KNPLabs API
npm install -g opencode-ai
ไฟล์: ~/.local/share/opencode/auth.json
{
"anthropic": {
"type": "api",
"key": "<YOUR_API_KEY>"
},
"openai": {
"type": "api",
"key": "<YOUR_API_KEY>"
},
"google": {
"type": "api",
"key": "<YOUR_API_KEY>"
}
}
💡 ใส่ทั้ง 3 provider ไว้ก่อน จะใช้ provider ไหนขึ้นกับ opencode.json
ไฟล์: ~/.config/opencode/opencode.json — เลือก 1 แบบ ตามโมเดลที่ต้องการ
รองรับ Claude Sonnet, Opus, Haiku — ส่งผ่าน https://api.knplabai.com/ai/v1
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"anthropic": {
"options": {
"baseURL": "https://api.knplabai.com/ai/v1"
}
}
},
"model": "anthropic/claude-sonnet-4-6"
}
🔑 Auth: ใช้ key ใน auth.json → "anthropic": { "key": "<YOUR_API_KEY>" }
📡 Endpoint ที่ใช้จริง: POST /ai/v1/messages (Anthropic native format)
| Model ID | คำอธิบาย |
|---|---|
| anthropic/claude-sonnet-4-6 | Claude Sonnet (แนะนำ) |
| anthropic/claude-opus-4-5 | Claude Opus (ทรงพลังสุด) |
| anthropic/claude-haiku-4-5 | Claude Haiku (เร็วสุด) |
opencode
เมื่อเปิด OpenCode แล้ว:
/models เพื่อดูรายการโมเดล| Provider | baseURL | apiKey ใน config |
|---|---|---|
| anthropic | /ai/v1 | ไม่ต้องใส่ (ใน auth.json) |
| openai | /ai/v1 | ต้องใส่ ใน options |
| /ai/v1beta | ไม่ต้องใส่ (ใน auth.json) |