← หน้าแรก ⚡ Console

🚀 คู่มือการใช้งาน

🌐 ข้อมูลเชื่อมต่อ

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 — ใช้ Terminal / PowerShell
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
  }'
Python — pip install openai
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)
JavaScript — Node.js (npm install openai) หรือ fetch
// วิธีที่ 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 — ใช้ cURL extension
<?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"];
Go — ใช้ net/http
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))
}
C# — ใช้ HttpClient
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);
Java — ใช้ HttpClient (Java 11+)
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());
Kotlin — ใช้ OkHttp
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())
📨 ตัวอย่าง Response ที่ได้รับ
{
  "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
  }
}
🎨 คู่มือสร้างภาพด้วย API

KNPLabs API รองรับการสร้างภาพจาก 3 กลุ่มโมเดล ใช้คนละ endpoint — ดูตารางด้านล่าง

📌 Endpoint ตามประเภทโมเดล

โมเดลEndpointราคา / ครั้ง
GPT Image 1, 1.5, Sora Image/v1/images/generations0.060 – 0.160 cr
Nano Banana (Gemini Image)/v1beta/models/{model}:generateContent0.198 – 0.660 cr
🆕 Seedream 5.0 (Doubao)/v1/images/generations— (per-request)
VEO 3.1 (Video)/v1/videos0.516 – 1.032 cr

⚠️ Image/Video models คิดราคา ต่อครั้ง (per-request) ไม่ใช่ต่อ token | VEO ไม่มีลายน้ำ

🖼️ GPT Image — /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

🎨 Nano Banana (Gemini Image) — /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 Image (xAI)

โมเดลที่รองรับ:

  • 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

📐 Aspect Ratio ที่รองรับ (Gemini Image)
Ratioคำอธิบาย
1:1สี่เหลี่ยม (Instagram)
9:16แนวตั้ง (TikTok / Reels)
16:9แนวนอน (YouTube)
4:3แนวนอน มาตรฐาน
3:4แนวตั้ง มาตรฐาน
3:2ภาพถ่าย แนวนอน
2:3ภาพถ่าย แนวตั้ง
5:4เกือบสี่เหลี่ยม แนวนอน
4:5เกือบสี่เหลี่ยม แนวตั้ง
21:9Ultrawide
🆕🎨 Seedream 5.0 (Doubao) — /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):

ResolutionAspect RatioSize (px)
2K1:12048×2048
2K4:32304×1728
2K3:41728×2304
2K16:92848×1600
2K9:161600×2848
2K3:22496×1664
2K2:31664×2496
2K21:93136×1344
3K1:13072×3072
3K4:33456×2592
3K3:42592×3456
3K16:94096×2304
3K9:162304×4096
3K3:23744×2496
3K2:32496×3744
3K21:94704×2016

⚠️ ส่ง size เป็น "2K" หรือ "3K" แล้วให้โมเดลกำหนดขนาดเอง หรือระบุพิกเซลตรงๆ เช่น "2048x2048"

💡 เคล็ดลับ (Image)
  • Prompt ภาษาอังกฤษมักให้ผลดีกว่าภาษาไทย
  • ระบุ style ชัดเจน เช่น "digital art", "oil painting", "3D render"
  • GPT Image ตอบ URL — Gemini Image ตอบ Base64 (inline)
  • GPT Image ใช้ OpenAI-compatible — Gemini Image ใช้ Native API
  • Seedream 5.0 ใช้ /v1/images/generations เหมือน GPT — ตอบ URL ความละเอียดสูง 2K/3K
  • Timeout ควรตั้ง 120–300 วินาที — การสร้างภาพความละเอียดสูงใช้เวลานาน
  • ทดสอบสร้างภาพได้ที่แท็บ 🧪 ทดสอบ API → 🎨 ทดสอบสร้างภาพ
🎬 Video Generation (VEO 3.1) — /v1/videos

โมเดลที่รองรับ:

model_idคำอธิบาย
veo_3_1VEO 3.1 มาตรฐาน
veo_3_1-4KVEO 3.1 ความละเอียด 4K
veo_3_1-fastVEO 3.1 สร้างเร็ว
veo_3_1-fast-4KVEO 3.1 สร้างเร็ว 4K
veo_3_1-componentsVEO 3.1 Components
veo_3_1-components-4KVEO 3.1 Components 4K
veo_3_1-fast-components-4KVEO 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):

FieldTypeคำอธิบาย
modelstringชื่อโมเดล เช่น veo_3_1
promptstringคำอธิบายวีดีโอ (ภาษาอังกฤษ)
sizestring16x9 แนวนอน | 9x16 แนวตั้ง | 1x1 สี่เหลี่ยม
secondsstring5 | 8 | 10
watermarkstringfalse

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 → ส่วน 🎬 ทดสอบสร้างวีดีโอ

🖼️→🎬 Image-to-Video — /v1/video/create

สร้างวีดีโอจากภาพ — ส่ง URL ภาพเข้าไปพร้อม prompt เพื่อให้ AI สร้างวีดีโอจากภาพนั้น

โมเดลที่รองรับ:

modelคำอธิบายภาพสูงสุด
veo3-fast-framesVEO 3 Fast — สร้างวีดีโอจากภาพ (Image→Video)2 ภาพ
veo3.1-componentsVEO 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):

FieldTypeRequiredคำอธิบาย
promptstringคำอธิบายวีดีโอ (ภาษาอังกฤษ)
modelstringveo3-fast-frames หรือ veo3.1-components
imagesarrayรายการ URL ภาพ เช่น ["https://...png", "https://...jpg"]
aspect_ratiostring16:9 | 9:16 | 1:1 (default: 16:9)
enhance_promptbooleanปรับปรุง prompt อัตโนมัติ (default: true)
enable_upsamplebooleanเพิ่มความละเอียด (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} เหมือนกัน

🎬 Sora-2 — /v1/videos

สร้างวีดีโอด้วย OpenAI Sora-2 — ใช้ endpoint /v1/videos แบบ multipart/form-data

⚠️ ใช้ endpoint /v1/videos ส่งแบบ multipart/form-data (เหมือน VEO)
⚡ เป็น async — ต้อง poll สถานะเหมือน VEO

📐 พารามิเตอร์ (form-data):

FieldTypeRequiredคำอธิบาย
modelstringsora-2
promptstringคำอธิบายวีดีโอ
secondsstring4 | 10 | 15 | 20 วินาที
sizestring720x1280 (แนวตั้ง) | 1280x720 (แนวนอน)
input_referencefileไฟล์ภาพอ้างอิง (Image-to-Video)
watermarkstringfalse
privatestringfalse

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

🎬 Grok Video — /v1/video/create

สร้างวีดีโอด้วยโมเดล Grok Video จาก xAI (รองรับทั้ง Text-to-Video และ Image-to-Video)

โมเดลที่รองรับ:

modelคำอธิบาย
grok-video-3Grok Video 3 (~5 วินาที)
grok-video-3-10sGrok Video 3 ความยาว 10 วินาที
grok-video-3-15sGrok 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>"
💡 เคล็ดลับ (Video)
  • VEO 3.1 ไม่มีลายน้ำ — ใช้ได้เลยไม่ต้องเสียค่าลิขสิทธิ์
  • Prompt ภาษาอังกฤษเท่านั้น — ภาษาอื่นอาจ error
  • การสร้างวีดีโอเป็น async — ต้อง poll สถานะทุก 10 วินาที
  • หากสร้างล้มเหลว เครดิตจะถูกคืนอัตโนมัติ
  • ทดสอบสร้างวีดีโอได้ที่แท็บ 🧪 ทดสอบ API → 🎬 ทดสอบสร้างวีดีโอ
🤖 ตั้งค่า OpenClaw IDE ใช้งานกับ KNPLabs API Gateway

คู่มือนี้สอนวิธีตั้งค่า OpenClaw (เวอร์ชันล่าสุด) ให้เชื่อมต่อกับ KNPLabs API Gateway — ใช้ API Key เดียวเข้าถึงทุกโมเดล

📦 ขั้นตอนที่ 1: ติดตั้ง OpenClaw

1. ดาวน์โหลดและติดตั้ง OpenClaw จากเว็บไซต์ทางการ

2. เปิดโปรแกรมครั้งแรกเพื่อให้ระบบสร้างไฟล์ config เริ่มต้น

3. ปิดโปรแกรมก่อนแก้ไข config

📝 ขั้นตอนที่ 2: แก้ไขไฟล์ config หลัก (clawdbot.json)

เปิดไฟล์ config หลัก:

Windows: C:\Users\{ชื่อ}\.openclaw\openclaw.json
macOS:   ~/.openclaw/openclaw.json

ไฟล์นี้ประกอบด้วย 3 ส่วนหลัก:

  • agents — ตั้งค่าโมเดลหลักและ alias สำหรับสลับ
  • auth — กำหนด provider สำหรับ authentication
  • models — ตั้งค่า baseUrl, api type, และรายชื่อโมเดลแต่ละ provider

แก้ไขเนื้อหาทั้งหมดเป็น:

⚠️ สำคัญมาก — ต้องใช้ openai-completions ทุก provider

KNPLabs Gateway ใช้ OpenAI-compatible protocol เพียงอย่างเดียว — ไม่ว่าจะเป็น Claude, GPT, Gemini หรือ DeepSeek ต้องตั้ง "api": "openai-completions" ทุกตัว ห้ามใช้ anthropic-messages หรือ google-generative-ai

📋 คลิกดู/ซ่อน JSON config ตัวเต็ม
{
  "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" }

🔑 ขั้นตอนที่ 3: ตั้งค่า auth-profiles.json

เปิดไฟล์:

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 รวมทุกโมเดลไว้ที่เดียว

🚀 ขั้นตอนที่ 4: ตรวจสอบและเปิดใช้งาน

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

🧠 MCP Memory Server คืออะไร?

ปกติ AI จะ ลืมทุกอย่างเมื่อจบแชท แต่ถ้าเพิ่ม MCP Memory Server จะทำให้ AI:

  • จำชื่อ / ข้อมูลสำคัญของคุณได้ข้ามแชท
  • จำคำสั่ง / ความชอบของคุณได้
  • เหมือน ChatGPT Memory แต่ใช้กับ OpenClaw

💡 ไม่ยุ่งกับ API Gateway — MCP Memory ทำงานฝั่ง client (เครื่องคุณ) ไม่กระทบ API หรือเครดิตใดๆ

📦 ติดตั้งและตั้งค่า

ความต้องการ

  • Node.js 18+
  • OpenClaw ติดตั้งแล้ว

1. ตั้งค่า MCP Server ใน OpenClaw

เปิดไฟล์ openclaw.json แล้วเพิ่ม mcpServers:

{
  "mcpServers": {
    "memory": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-memory"]
    }
  }
}

2. รีสตาร์ท OpenClaw

แบบ App: ปิด OpenClaw แล้วเปิดใหม่

แบบ Gateway:

openclaw gateway restart

3. ทดสอบ

พิมพ์ในแชท:

จำว่าฉันชื่อ สมชาย อายุ 25 ปี ชอบกินอาหารไทย

แล้วเปิดแชทใหม่ ถาม:

ฉันชื่ออะไร?

ถ้า AI ตอบได้ว่า "สมชาย" แสดงว่า Memory ทำงานแล้ว! ✅

⚙ ตัวอย่าง Config เต็ม (กับ KNPLabs + 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"
    }
  ]
}
💡 หมายเหตุ:
  • Memory เก็บไว้ฝั่งเครื่องคุณ ไม่ได้ส่งขึ้น server
  • ไม่ใช้ credits เพิ่มเติม — ใช้แค่ค่า AI chat ปกติ
  • ลบ Memory ได้โดยเอา mcpServers.memory ออกจาก config
💻 ติดตั้งและตั้งค่า Claude Code กับ KNPLabs API Gateway

Claude Code เป็น AI coding assistant แบบ terminal จาก Anthropic — ใช้ KNPLabs Gateway แทน API ตรงได้ง่ายๆ ด้วย environment variables

💡 หมายเหตุเรื่อง Credits — เครื่องมือ AI (เช่น OpenClaw, Claude Code, Gemini CLI) อาจส่ง request มากกว่า 1 ครั้งต่อ 1 คำถาม ขึ้นอยู่กับการตั้งค่าของเครื่องมือนั้นๆ ตรวจสอบการใช้งานได้ที่หน้า Dashboard

📋 ความต้องการของระบบ

  • Node.js เวอร์ชัน 18 ขึ้นไป
  • macOS, Linux หรือ Windows (ผ่าน WSL)
  • API Key จาก KNPLabs (ดูหัวข้อ 📡 การเชื่อมต่อ API)

🚀 ขั้นตอนที่ 1: ติดตั้ง Node.js

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

📦 ขั้นตอนที่ 2: ติดตั้ง Claude Code

npm install -g @anthropic-ai/claude-code

✅ ตรวจสอบว่าติดตั้งสำเร็จ:

claude --version

⚙️ ขั้นตอนที่ 3: ตั้งค่า Environment Variables ให้ชี้ไป KNPLabs

ตั้ง 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 ต่อท้าย)

🎬 ขั้นตอนที่ 4: เปิดใช้งาน

⚠️ สำคัญ — ต้อง 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 จะเห็นและแก้ไขไฟล์ทั้งหมดในนั้น

🎯 ขั้นตอนที่ 5: วิธีใช้งาน Claude Code

เมื่อเปิด 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

💡 เคล็ดลับ:

  • เมื่อ Claude เสนอแก้ไขไฟล์ จะถามก่อนเสมอ — กด y เพื่อยืนยัน หรือ n เพื่อปฏิเสธ
  • ใช้ /init ครั้งแรก เพื่อให้ Claude เข้าใจโปรเจกต์ → คำตอบจะดีขึ้นมาก
  • บอก Claude เป็นภาษาไทยหรืออังกฤษก็ได้ — เข้าใจทั้งสองภาษา
  • ถ้าเห็นข้อความต้อนรับจาก Claude แสดงว่าเชื่อมต่อสำเร็จ 🎉
❓ คำถามที่พบบ่อย (FAQ)
Q: เจอ "Invalid API Key · Please run /login" ทำอย่างไร?

ตรวจสอบว่าตั้ง environment variables ถูกต้อง:

echo $ANTHROPIC_AUTH_TOKEN  # ควรขึ้นต้นด้วย sk-
echo $ANTHROPIC_BASE_URL    # ควรเป็น https://api.knplabai.com/ai

ถ้ายังไม่ได้ แก้ไขใน ~/.bashrc แล้วรัน source ~/.bashrc

Q: แสดงสถานะ "offline" ทำอย่างไร?

ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต และยืนยันว่า ANTHROPIC_BASE_URL ถูกต้อง

ลอง: curl https://api.knplabai.com/ai/v1/models ดูว่าเซิร์ฟเวอร์ตอบกลับหรือไม่

Q: ขึ้น "fetch failed" ตลอดเวลา?

อาจเกิดจาก proxy หรือ firewall บล็อกการเชื่อมต่อ ลอง:

# ปิด proxy ชั่วคราว
unset http_proxy https_proxy
claude
Q: API Error ทำอย่างไร?

ตรวจสอบ credits คงเหลือในหน้า Dashboard ของ KNPLabs

ลองรีสตาร์ท Claude Code ด้วย claude ใหม่อีกครั้ง

Q: ต้องการเปลี่ยนโมเดลเป็นตัวอื่น?

ตั้ง environment variable:

export ANTHROPIC_MODEL="claude-sonnet-4-6"

หรือดูรายชื่อโมเดลทั้งหมดได้ที่แท็บ 📋 รายการโมเดล

📌 หมายเหตุ
  • Claude Code ใช้ credits เหมือนกับการเรียก API ปกติ
  • ดูยอด credits คงเหลือได้ตลอดที่หน้า Dashboard
  • รองรับทุกโมเดลที่มีในระบบ KNPLabs
✨ ติดตั้งและตั้งค่า Gemini CLI กับ KNPLabs API Gateway

Gemini CLI เป็น AI coding assistant แบบ terminal จาก Google — เป็น open source ใช้ฟรี รองรับการใช้ผ่าน API proxy เชื่อมกับ KNPLabs Gateway ได้

💡 หมายเหตุเรื่อง Credits — เครื่องมือ AI (เช่น OpenClaw, Claude Code, Gemini CLI) อาจส่ง request มากกว่า 1 ครั้งต่อ 1 คำถาม ขึ้นอยู่กับการตั้งค่าของเครื่องมือนั้นๆ ตรวจสอบการใช้งานได้ที่หน้า Dashboard

📋 ความต้องการของระบบ

  • Node.js เวอร์ชัน 18 ขึ้นไป
  • macOS, Linux หรือ Windows (WSL)
  • API Key จาก KNPLabs

📦 ขั้นตอนที่ 1: ติดตั้ง Gemini CLI

วิธีที่ 1: ใช้ npx (ไม่ต้องติดตั้ง):

npx @google/gemini-cli

วิธีที่ 2: ติดตั้งผ่าน npm (แนะนำ):

npm install -g @google/gemini-cli

วิธีที่ 3: ติดตั้งผ่าน Homebrew (macOS/Linux):

brew install gemini-cli

✅ ตรวจสอบว่าติดตั้งสำเร็จ:

gemini --version

⚙️ ขั้นตอนที่ 2: ตั้งค่า Environment Variables ให้ชี้ไป KNPLabs

เพิ่มค่าเหล่านี้ใน ~/.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 ให้เอง)

📁 (ทางเลือก) ตั้งค่าผ่าน settings.json

สร้างไฟล์ ~/.gemini/settings.json เพื่อตั้งค่าถาวร:

{
  "apiEndpoint": "https://api.knplabai.com/ai"
}

💡 ใช้วิธีนี้ร่วมกับ export GEMINI_API_KEY — จะไม่ต้องตั้ง URL ทุกครั้ง

🎬 ขั้นตอนที่ 3: เปิดใช้งาน

⚠️ สำคัญ — ต้อง cd ไปโฟลเดอร์โปรเจกต์ก่อน

Gemini CLI จะทำงานกับไฟล์ใน โฟลเดอร์ปัจจุบัน เท่านั้น

# 1. เข้าไปยังโฟลเดอร์โปรเจกต์
cd /path/to/your/project

# 2. เปิด Gemini CLI
gemini

เมื่อเปิดครั้งแรกจะถามวิธี login — เลือก "Use Gemini API key"

ถ้าเห็น prompt > แสดงว่าเชื่อมต่อสำเร็จ 🎉

🎯 ขั้นตอนที่ 4: วิธีใช้งาน

พิมพ์อะไร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
❓ คำถามที่พบบ่อย (FAQ)
Q: ขึ้น "API key not valid" ทำอย่างไร?

ตรวจสอบว่าตั้ง environment variables ถูกต้อง:

echo $GEMINI_API_KEY            # ควรขึ้นต้นด้วย sk-
echo $GOOGLE_GEMINI_BASE_URL    # ควรเป็น https://api.knplabai.com/ai
Q: fetch failed หรือ connection error?

ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต และลอง:

# ปิด proxy ชั่วคราว
unset http_proxy https_proxy
gemini
Q: ต้องการเปลี่ยนโมเดลเป็นตัวอื่น?

ใช้ flag -m ตอนเปิด:

gemini -m gemini-2.5-pro

หรือดูรายชื่อโมเดลทั้งหมดได้ที่แท็บ 📋 รายการโมเดล

Q: ใช้ร่วมกับ GitHub ได้ไหม?

ได้ครับ! Gemini CLI รองรับ GitHub integration:

# review pull request
gemini -C . "review PR #42 และสรุปการเปลี่ยนแปลง"
📌 หมายเหตุ
  • Gemini CLI ใช้ credits เหมือนกับการเรียก API ปกติ
  • ดูยอด credits คงเหลือได้ที่หน้า Dashboard
  • รองรับทุกโมเดล Gemini ที่มีในระบบ KNPLabs
  • ฟีเจอร์: อ่านโค้ด, แก้ bug, สร้าง test, เขียนเอกสาร, review PR
🔄 ตั้งค่า n8n Workflow ใช้งานกับ KNPLabs API Gateway

n8n เป็น workflow automation ที่รองรับ AI node ได้โดยตรง — แค่เปลี่ยน Base URL เป็นของ KNPLabs ก็ใช้ได้เลย

1️⃣ สร้าง Workflow ใหม่

เข้า n8n แล้วกดปุ่ม Create Workflow มุมขวาบน

Step 1

2️⃣ เลือก Trigger

เลือก Trigger manually เพื่อทดสอบด้วยตัวเอง

Step 2

3️⃣ เพิ่ม Node → เลือก AI

กดปุ่ม + แล้วเลือกหมวด AI

Step 3

4️⃣ เลือก OpenAI Node

เลือก OpenAI จากรายการ AI Nodes (เพราะ KNPLabs รองรับ OpenAI-compatible protocol)

Step 4

5️⃣ เลือก Action: Message a Model

เลือก Message a model ในหมวด TEXT ACTIONS

Step 5

6️⃣ สร้าง Credential ใหม่

กด + Create new credential แล้วกรอกข้อมูลดังนี้:

  • API Key: <YOUR_API_KEY>
  • Base URL: เปลี่ยนจาก https://api.openai.com/v1 เป็น https://api.knplabai.com/ai/v1
Step 6

7️⃣ ทดสอบการเชื่อมต่อ

ถ้าขึ้น Connection tested successfully แสดงว่า API Key และ Base URL ถูกต้อง

Step 7

8️⃣ ตั้งค่าและทดสอบ

ตั้งค่าในหน้า Message a model:

  • Model: เลือก By ID แล้วพิมพ์ชื่อโมเดล เช่น gpt-4o
  • Prompt (System): กำหนดบทบาทของ AI
  • Prompt (User): พิมพ์ข้อความที่ต้องการ
Step 8.1 Step 8.2

กด Execute step หรือ Execute workflow เพื่อทดสอบ — ผลลัพธ์จะแสดงที่ช่อง OUTPUT ทางขวา

Step 8.3

✅ ถ้าเห็นข้อความตอบกลับใน OUTPUT แสดงว่าเชื่อมต่อสำเร็จ 🎉

📌 หมายเหตุ
  • ใช้ node OpenAI ได้เลย ไม่ต้องลง plugin เพิ่ม
  • Base URL ต้องเป็น https://api.knplabai.com/ai/v1
  • ชื่อโมเดลเลือกแบบ By ID แล้วพิมพ์เอง เช่น gpt-4o, claude-sonnet-4-6
  • รองรับทุกโมเดลที่มีในระบบ KNPLabs ดูที่แท็บ 📋 รายการโมเดล
  • ใช้ credits เหมือนกับการเรียก API ปกติ
🔊 Text-to-Speech (TTS)

แปลงข้อความเป็นเสียงพูดคุณภาพสูง รองรับหลายเสียงและหลายรูปแบบไฟล์

โมเดลที่รองรับ

Modelคุณภาพ
gpt-4o-mini-ttsเร็ว คุณภาพดี แนะนำ
tts-1มาตรฐาน
tts-1-hdคุณภาพสูง

เสียงที่เลือกได้ (voice)

alloy · echo · fable · onyx · nova · shimmer

รูปแบบไฟล์เสียง (response_format)

mp3 (default) · opus · aac · flac · wav · pcm

📤 ตัวอย่างการใช้งาน

cURL

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

Python

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 สำเร็จ!")

Node.js

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 สำเร็จ!');
💡 หมายเหตุ:
  • Response เป็นไฟล์เสียง (binary) ไม่ใช่ JSON — ต้องบันทึกเป็นไฟล์
  • เปลี่ยน voice เพื่อเลือกเสียงที่ต้องการ
  • เพิ่ม "response_format": "wav" เพื่อเปลี่ยนรูปแบบไฟล์
🧩 Embeddings คืออะไร?

แปลงข้อความเป็น ตัวเลข (vector) ที่คอมพิวเตอร์เข้าใจ — ใช้สำหรับ:

  • ค้นหาความหมาย (Semantic Search) — ค้น "สัตว์เลี้ยง" เจอ "แมว", "หมา"
  • RAG (ถาม AI จากเอกสาร) — เอา PDF/เว็บ สร้าง embedding แล้ว AI ค้นคำตอบจากเนื้อหา
  • แนะนำสินค้า — สินค้าที่ vector ใกล้กัน = คล้ายกัน
  • จัดกลุ่มข้อความ — แยกข้อความเป็นหมวดหมู่อัตโนมัติ

โมเดลที่รองรับ

Modelผู้พัฒนาขนาด Vector
text-embedding-3-largeOpenAI3,072
text-embedding-3-smallOpenAI1,536
text-embedding-ada-002OpenAI1,536
gemini-embedding-exp-03-07Googleกำหนดได้
📤 ตัวอย่างการใช้งาน

cURL (OpenAI Model)

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 (Gemini Model)

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
  }'

Python

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 ตัวแรก

Node.js

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} มิติ`);

Response ตัวอย่าง

{
  "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 }
}
💡 หมายเหตุ:
  • GPT และ Gemini ใช้ endpoint เดียวกัน /v1/embeddings — แค่เปลี่ยน model
  • Gemini มี dimensions เลือกขนาด vector ได้ (ไม่ใส่ก็ได้)
  • คิดค่าใช้งานตามจำนวน tokens ที่ใช้
💻 คู่มือตั้งค่า OpenCode กับ KNPLabs API

OpenCode คือ AI coding assistant บน Terminal — รองรับ 3 provider ที่ทดสอบแล้วว่าใช้งานได้กับ KNPLabs API

📦 ขั้นตอนที่ 1 — ติดตั้ง OpenCode

npm install -g opencode-ai

🔑 ขั้นตอนที่ 2 — ตั้งค่า Auth Key

ไฟล์: ~/.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

⚙️ ขั้นตอนที่ 3 — เลือก Provider ใน opencode.json

ไฟล์: ~/.config/opencode/opencode.json — เลือก 1 แบบ ตามโมเดลที่ต้องการ

✦ Claude — ใช้ Anthropic Provider

รองรับ 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-6Claude Sonnet (แนะนำ)
anthropic/claude-opus-4-5Claude Opus (ทรงพลังสุด)
anthropic/claude-haiku-4-5Claude Haiku (เร็วสุด)
🚀 ขั้นตอนที่ 4 — เริ่มใช้งาน
opencode

เมื่อเปิด OpenCode แล้ว:

  1. พิมพ์ /models เพื่อดูรายการโมเดล
  2. เลือก provider และโมเดลที่ต้องการ
  3. เริ่มเขียนโค้ดได้เลย!
💡 สรุปสั้น:
ProviderbaseURLapiKey ใน config
anthropic/ai/v1ไม่ต้องใส่ (ใน auth.json)
openai/ai/v1ต้องใส่ ใน options
google/ai/v1betaไม่ต้องใส่ (ใน auth.json)