# IC Lueur Ai — คู่มือเชื่อมต่อ API

> วิธีเรียกใช้ IC Lueur Ai จากโค้ดหรือจากเครื่องมือ AI เขียนไว้ให้ดาวน์โหลดไปส่งให้ AI assistant แล้วสั่งให้ช่วยเชื่อมต่อให้ได้เลย

ชื่อโมเดลและราคาที่ถูกต้องที่สุดอยู่ที่แคตตาล็อกสด ไม่ใช่ในไฟล์นี้ เอกสารฉบับเต็ม: https://www.ic-lueur.ai/th/docs/

## สรุปข้อมูลสำคัญ

- **Base URL:** `https://api.ic-lueur.ai/v1`
- **การยืนยันตัวตน:** ส่ง header `Authorization: Bearer YOUR_API_KEY` สร้างคีย์ได้ที่เมนู API keys ในพอร์ทัลสมาชิก คีย์จะแสดงครั้งเดียว ระบบเก็บเพียงค่าแฮช จึงกู้คืนคีย์ที่ทำหายไม่ได้ ให้สร้างใหม่
- **ชื่อโมเดล:** อย่าเดาชื่อโมเดล ให้เรียก `GET {BASE_URL}/models` ด้วยคีย์ของคุณ หรือดูแคตตาล็อกสาธารณะที่ https://www.ic-lueur.ai/api/models (ชื่อโมเดล ภูมิภาคที่ให้บริการ และราคาเป็นบาทต่อล้าน token)

## Endpoint

| Method และ path | ใช้ทำอะไร |
|---|---|
| `POST /chat/completions` | Chat Completions รูปแบบ OpenAI ใส่ `stream: true` เพื่อรับผลแบบ server-sent events |
| `GET /models` | รายชื่อโมเดลในแคตตาล็อก บางโมเดลอาจยังถูกปฏิเสธ ขึ้นอยู่กับ Routing Policy ขององค์กร |
| `POST /embeddings` | Embeddings |

ทุก path อยู่ต่อจาก base URL

## คำขอแรกของคุณ

สร้าง API key: สร้างคีย์ได้ที่เมนู API Keys ในพอร์ทัลสมาชิก โดยคีย์จะแสดงให้ดูแค่ครั้งเดียวตอนสร้าง อย่าลืมเก็บไว้ เพราะหลังจากนั้นจะไม่สามารถเปิดดูหรือกู้คืนคีย์เดิมได้

เชื่อมต่อ Client กับเรา: ตั้งค่า Base URL ให้เป็น Endpoint ของเรา แล้วใช้คีย์ที่สร้างไว้เป็น API key ส่วนชื่อโมเดลที่ใช้ได้ ดูได้จาก `GET /v1/models`

```bash
curl https://api.ic-lueur.ai/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "MODEL_ID_FROM_/models", "messages": [{"role": "user", "content": "Hello"}]}'
```

## กติกาสำหรับ AI assistant

- อ่าน base URL และ key จากไฟล์ตั้งค่าหรือ environment variable ห้ามฝังคีย์ไว้ในซอร์สโค้ดหรือ commit เข้า repo
- อ่านชื่อโมเดลจาก `GET /models` ห้ามสร้างหรือย่อชื่อเอง
- ส่งตัวเลือกของโมเดลเป็น field ระดับบนสุดของ request เท่านั้น `extra_body`, `kwargs`, `litellm_params` และ `custom_llm_provider` จะถูกปฏิเสธด้วย 400
- Error ใช้โครงสร้างเดียวกับ OpenAI คือ `{"error": {"message": "<message>"}}` แต่ค่า `type` และ `code` อาจไม่ตรงกับของ OpenAI ทุกกรณี ให้แยกประเภทจาก HTTP status และหากต้องแยก 429 สองกรณีให้ดูจากข้อความ
- เมื่อได้ 429 ให้รอตาม header `Retry-After` (ถ้ามี) ก่อนลองใหม่ และดูสาเหตุจากข้อความ 429 ไม่ถูกคิดเงิน
- อย่าลองซ้ำเมื่อได้ 402 ให้เติมเงินแทน

## Streaming

ใช้ `stream: true` เพื่อรับคำตอบแบบ Streaming ได้ แต่ถ้าตัดการเชื่อมต่อระหว่างทาง คำขออาจยังทำงานต่อและมีค่าใช้จ่ายตามปกติ

- **รูปแบบ:** ใช้ server-sent events (SSE) แบบเดียวกับ OpenAI โดยข้อมูลจะทยอยส่งมาในรูปแบบ `data:` และจบสตรีมแบบเดียวกัน โดยช่อง `model` ในแต่ละ chunk จะแสดงชื่อโมเดลที่คุณเรียกใช้
- **ตัดการเชื่อมต่อก่อนจบ:** ถ้าตัดการเชื่อมต่อระหว่างทาง token ที่สร้างไปแล้วจะยังถูกคิดตามการใช้งานจริง เหมือนกับคำขอที่ทำงานจนจบ

## ข้อผิดพลาด

Error Response ใช้โครงสร้างเดียวกับ OpenAI คือ `{"error": {"message": "<ข้อความ>"}}` พร้อม HTTP status แต่ค่า type และ code อาจไม่ตรงกับของ OpenAI ทุกกรณี หากต้องแยกประเภท Error ให้ดูจาก HTTP status และข้อความใน message แทน

| Status | ชื่อ | ความหมาย |
|---|---|---|
| 400 | Bad Request | ไม่พบโมเดลที่เรียกใช้ หรือโมเดลนั้นยังไม่ได้ตั้งค่าไว้ ตรวจสอบชื่อโมเดลได้ที่ GET /v1/models หรือคำขอใส่ฟิลด์ที่เกตเวย์ไม่รับ ได้แก่ extra_body, kwargs, litellm_params หรือ custom_llm_provider ให้ส่งตัวเลือกของโมเดลเป็นฟิลด์ระดับบนสุดของ body แทน (OpenAI SDK ทำให้อยู่แล้วเมื่อใช้ extra_body ของ SDK) |
| 401 | Unauthorized | ไม่พบ API key หรือคีย์ที่ใช้ไม่ถูกต้องหรือถูกยกเลิกแล้ว |
| 402 | Insufficient Balance | ยอดเงินคงเหลือไม่พอสำหรับคำขอนี้ โดยระบบจะแจ้งยอดคงเหลือเป็นเงินบาท |
| 403 | Forbidden | องค์กรถูกระงับการใช้งาน คีย์ที่ใช้เป็นคีย์ของผู้ดูแลระบบ (Master key) ซึ่งใช้เรียกโมเดลไม่ได้ หรือผู้สร้างคีย์ใช้งานครบวงเงินรายวันหรือรายเดือนที่เจ้าของหรือ Admin ขององค์กรกำหนดไว้ |
| 413 | Payload Too Large | Prompt มีขนาดเกินที่กำหนดสำหรับโมเดลฟรีประจำสัปดาห์ |
| 429 | Rate Limit | ส่งคำขอเกินลิมิตที่กำหนดไว้ ให้ดู Retry-After และข้อความที่ระบบส่งกลับมาก่อนลองใหม่ |
| 503 | Service Unavailable | ระบบไม่สามารถตรวจสอบคีย์ได้ชั่วคราว หรือโมเดลนั้นยังไม่ได้ตั้งราคา จึงยังไม่สามารถทำคำขอนี้ได้ |

สำหรับ 429 อาจเกิดได้จากหลายสาเหตุ ถ้าต้องการแยกว่าเกิดจากอะไร ให้ดูคำขึ้นต้นของข้อความที่ระบบส่งกลับมาแทนการดูแค่ status code และเทียบแบบตรงตัวพิมพ์เล็ก-ใหญ่ ได้แก่ ลิมิตของคีย์ขึ้นต้นด้วย `rate limit exceeded:` (ตัวพิมพ์เล็ก) ภูมิภาคที่ใช้ได้ไม่ว่างชั่วคราวขึ้นต้นด้วย `no region available` ส่วนลิมิตของโมเดลฟรีขึ้นต้นด้วย `QUOTA_EXCEEDED`, `REQUEST_LIMIT_EXCEEDED` หรือ `RATE_LIMIT_EXCEEDED` (ตัวพิมพ์ใหญ่)

## ลิมิตคำขอ

**ทุกคีย์มีลิมิตจำนวนคำขอต่อนาที.** แต่ละ API key ตั้งลิมิตจำนวนคำขอต่อนาทีได้เองจากการแก้ไขคีย์ในพอร์ทัลสมาชิก ถ้าไม่ได้ตั้งไว้ ระบบจะใช้ลิมิตเริ่มต้นของ Gateway ที่ 60 คำขอต่อนาที ถ้าส่งคำขอเกินลิมิต ระบบจะตอบกลับเป็น `429` พร้อม `Retry-After` โดยคำขอนั้นจะไม่เสียเงินและไม่นับรวมใน Usage

## โมเดลฟรีประจำสัปดาห์

โมเดลไหนก็ตามอาจมีช่วงเวลาที่ฟรีชั่วคราวได้ — คำขอแบบเดิม ไม่เสียเงิน ตลอดช่วงที่ยังฟรีอยู่

| ลิมิต | ค่า | หมายเหตุ |
|---|---|---|
| Rate limit | 15 คำขอ / นาที ต่อคีย์ | ลิมิตนี้นับแยกจากลิมิตปกติของคีย์ และจะจำกัดมากกว่าปกติ |
| โควตารายสัปดาห์ | 1,000,000 tokens หรือ 1,000 คำขอ | นับรวมต่อองค์กร โดยจะยึดตามลิมิตที่ถึงก่อน |
| รีเซ็ตโควตา | ทุกวันจันทร์ | เวลา 00:00 น. (เวลาไทย) |
| ขนาด Prompt สูงสุด | 32,000 tokens | ถ้าเกินจากนี้ ระบบจะไม่รับคำขอนั้น และจะไม่มีการคิดเงิน |
| ขนาด Output สูงสุด | 16,000 tokens | ตอบได้สูงสุด 16,000 tokens หรือตาม max_tokens ที่ตั้งไว้ |
| เมื่อโควตาหมด | ใช้งานได้อีกครั้งวันจันทร์ | หากเปิด Auto-fallback ไว้ ระบบจะสลับไปใช้ยอดคงเหลือให้อัตโนมัติ |

## คำขอถูกประมวลผลที่ไหน

**ตอนนี้คำขอถูกส่งไปที่ไหน.** คำขอส่วนใหญ่ประมวลผลที่สิงคโปร์และโตเกียว บางโมเดลให้บริการจากภูมิภาค global ของผู้ให้บริการ ซึ่งอาจอยู่นอกเอเชีย เช่น สหรัฐอเมริกา และองค์กรที่ใช้ Routing Policy แบบ available จะเข้าถึงผู้ให้บริการในจีนแผ่นดินใหญ่ได้ด้วย<br /><br />ข้อมูลบัญชี ยอดเงิน และใบกำกับภาษีจัดเก็บบน AWS ในประเทศไทย ไม่ว่าคำขอจะถูกประมวลผลที่ไหน

- **strict (เข้มงวด):** ใช้เฉพาะภูมิภาคกรุงเทพฯ และไม่ส่งต่อไปภูมิภาคอื่น ตอนนี้ยังไม่มีโมเดลที่ให้บริการจากกรุงเทพฯ คำขอภายใต้ strict จึงจะถูกปฏิเสธด้วย 400
- **regional (ตามภูมิภาค):** ค่าเริ่มต้น ระบบจะเลือกภูมิภาคที่ใกล้ที่สุดก่อน โดยเรียงจากกรุงเทพฯ สิงคโปร์ และโตเกียว หากโมเดลไม่มีให้บริการในภูมิภาคเหล่านี้ ระบบจะส่งไปยังภูมิภาค global ของผู้ให้บริการโมเดล ซึ่งอาจอยู่นอกเอเชีย
- **available (ทุกภูมิภาค):** เปิดให้เฉพาะองค์กรที่แจ้งขอเป็นลายลักษณ์อักษร ครอบคลุมทุกภูมิภาคเดียวกับ regional และรวมผู้ให้บริการในจีนแผ่นดินใหญ่ด้วย โมเดลสร้างภาพและวิดีโอที่ให้บริการนอกกรุงเทพฯ สิงคโปร์ และโตเกียว ต้องใช้ Routing Policy นี้

## เชื่อมต่อเครื่องมือ

ใช้ Base URL และ API Key เพื่อเชื่อมต่อเครื่องมือที่รองรับ OpenAI API ตั้งค่าเพียงไม่กี่ขั้นตอนก็เริ่มใช้งานได้

- **Base URL:** `https://api.ic-lueur.ai/v1`
- **API Key:** `YOUR_API_KEY`

### Code Editor & IDE Extension

เชื่อมต่อ AI Coding Tools ด้วย Base URL และ API Key ชุดเดียว

#### Roo Code (VS Code Extension)

1. ติดตั้ง Roo Code จาก VS Code Marketplace (RooVeterinaryInc.roo-cline)
2. คลิกไอคอน Roo Code ใน Activity Bar
3. เปิด Settings → เลือก API Provider เป็น OpenAI Compatible
4. วาง Base URL และ API key
5. พิมพ์ชื่อโมเดล เช่น claude-sonnet-4-6 แล้วกด Save

เคล็ดลับ: Roo Code ใช้ได้ใน Windsurf และ VSCodium ด้วย — ขั้นตอนเหมือนกัน

#### Cline (VS Code Extension)

1. ติดตั้ง Cline จาก VS Code Marketplace (saoudrizwan.claude-dev)
2. คลิกไอคอน Cline ใน Activity Bar
3. เปิด Settings (ไอคอนเฟือง) → เลือก API Provider เป็น OpenAI Compatible
4. วาง Base URL และ API key
5. พิมพ์ชื่อโมเดลแล้วกด Save

เคล็ดลับ: Cline ใช้ได้ใน Windsurf และ VSCodium ด้วย — ขั้นตอนเหมือนกัน

#### Continue.dev (VS Code + JetBrains)

1. ติดตั้ง Continue extension (continue.continue)
2. เปิด ~/.continue/config.json (สร้างอัตโนมัติเมื่อใช้ครั้งแรก)
3. เพิ่ม model block ด้านล่างใน "models": [...]
4. บันทึกไฟล์ — Continue โหลดใหม่อัตโนมัติ

```jsonc
// ~/.continue/config.json  (เพิ่มใน "models": [...])
{
  "title": "IC Lueur Ai",
  "provider": "openai",
  "model": "claude-sonnet-4-6",
  "apiBase": "https://api.ic-lueur.ai/v1",
  "apiKey": "YOUR_API_KEY"
}
```

#### VS Code (Custom Provider)

1. เปิด VS Code แล้วกด ⌘⇧P (หรือ Ctrl+Shift+P)
2. ค้นหา Preferences: Open User Settings (JSON)
3. เพิ่ม block ด้านล่างลงใน settings.json
4. บันทึกไฟล์

```jsonc
// settings.json
{
  "languageModels": {
    "openAI": {
      "baseURL": "https://api.ic-lueur.ai/v1",
      "apiKey": "YOUR_API_KEY"
    }
  }
}
```

### AI Chat Client

เชื่อมต่อแอปแชต AI ที่รองรับ OpenAI API ได้ง่าย ๆ

#### Cherry Studio (Desktop App)

1. เปิด Cherry Studio ไปที่ Settings → Providers
2. กด + Add Provider
3. เลือก Type เป็น OpenAI Compatible
4. วาง Base URL และ API key
5. กด Check เพื่อดึงรายการโมเดล แล้วกด Save

#### NextChat (Web + Self-host)

1. เปิด NextChat แล้วคลิกไอคอน Settings (มุมล่างซ้าย)
2. เลื่อนไปที่ API Settings
3. เปิด Custom Endpoint แล้ววาง Base URL
4. กรอก API key แล้วกด Save

เคล็ดลับ: ถ้า self-host ให้ตั้ง OPENAI_API_URL ใน .env แทนการใช้ UI

#### LibreChat (Self-hosted)

1. เปิดไฟล์ .env ของ LibreChat
2. ตั้ง OPENAI_REVERSE_PROXY เป็น Base URL
3. ตั้ง OPENAI_API_KEY เป็น API key ของคุณ
4. รีสตาร์ท container (docker compose restart)

```bash
# .env
OPENAI_REVERSE_PROXY=https://api.ic-lueur.ai/v1
OPENAI_API_KEY=YOUR_API_KEY
```

#### LobeChat (Web + Desktop)

1. เปิด LobeChat ไปที่ Settings → มองหา Provider
2. พอกดเข้าไป แล้วเลือก OpenAI
3. วาง Base URL และ API key
4. กด Check เพื่อดึงรายการโมเดลอัตโนมัติ

เคล็ดลับ: ถ้า dropdown โมเดลว่าง ให้กด Check อีกครั้ง — ระบบจะดึงจาก /v1/models ใหม่

### CLI & SDK

ตั้งค่า CLI และ SDK ให้เรียกใช้งานโมเดลผ่าน IC Lueur Ai

#### Claude Code (CLI)

1. ตั้ง environment variable 2 ตัวด้านล่างใน shell profile (~/.zshrc หรือ ~/.bashrc)
2. โหลด shell ใหม่หรือเปิด terminal หน้าต่างใหม่
3. รัน claude — จะ route ผ่าน IC Lueur Ai ทันที

```bash
export ANTHROPIC_BASE_URL="https://api.ic-lueur.ai/v1"
export ANTHROPIC_API_KEY="YOUR_API_KEY"

claude
```

เคล็ดลับ: Claude Code ใช้ Anthropic API format ดังนั้น ANTHROPIC_BASE_URL จึงชี้ตรงไปที่ gateway ของเรา

#### cURL (Terminal)

1. รันคำสั่งด้านล่าง — เปลี่ยน YOUR_API_KEY เป็น key จาก Member Portal
2. ผลลัพธ์จะเป็น JSON format เดียวกับ OpenAI

```bash
curl https://api.ic-lueur.ai/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [{"role": "user", "content": "สวัสดี"}]
  }'
```

#### OpenAI SDK (Python / Node.js)

1. ติดตั้ง openai package (pip install openai หรือ npm install openai)
2. สร้าง client ด้วย 2 parameter ที่ highlight ด้านล่าง
3. ใช้ client ได้เหมือน OpenAI สำหรับ Chat Completions และ Embeddings — method เดิม response รูปแบบเดิม

```python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.ic-lueur.ai/v1",  # ← เปลี่ยนตรงนี้
    api_key="YOUR_API_KEY",  # ← และตรงนี้
)

response = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "สวัสดี"}],
)
print(response.choices[0].message.content)
```

```typescript
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.ic-lueur.ai/v1",  // ← เปลี่ยนตรงนี้
  apiKey: "YOUR_API_KEY",  // ← และตรงนี้
});

const res = await client.chat.completions.create({
  model: "claude-sonnet-4-6",
  messages: [{ role: "user", content: "สวัสดี" }],
});
console.log(res.choices[0].message.content);
```

### ระบบอัตโนมัติ & no-code

เชื่อมต่อ IC Lueur Ai กับ Workflow และเครื่องมือ no-code

#### Make (No-code)

1. ใน Make สร้าง scenario เพิ่มโมดูล HTTP แล้วเลือก Make a request
2. ตั้ง URL เป็น https://api.ic-lueur.ai/v1/chat/completions, Method เป็น POST และ Authentication type เป็น No authentication
3. ที่ Headers เพิ่ม Authorization ค่า Bearer YOUR_API_KEY
4. ตั้ง Body content type เป็น application/JSON, Body input method เป็น JSON string วาง body ตามที่แสดง และตั้ง Parse response เป็น Yes
5. กด Run once: คำตอบอยู่ที่ data → choices → 1 → message → content

```json
{
  "model": "app/ชื่อผู้ช่วยของคุณ",
  "messages": [{ "role": "user", "content": "{{escapeJSON(1.text)}}" }]
}
```

เคล็ดลับ: escapeJSON ทำให้ข้อความที่มีเครื่องหมายคำพูดหรือบรรทัดใหม่ไม่ทำให้คำขอพัง คู่มือฉบับเต็มพร้อมวิธีแก้ปัญหาอยู่ใน Member Portal ที่ ผู้ช่วย AI → ผู้ช่วยของคุณ → วิธีเชื่อมต่อ

#### n8n (No-code)

1. ใน n8n เพิ่มโหนด HTTP Request: Method POST, URL https://api.ic-lueur.ai/v1/chat/completions
2. เก็บคีย์ไว้ใน credential แบบ Header Auth: Name Authorization, Value Bearer YOUR_API_KEY
3. ตั้ง Body เป็น JSON แล้ววาง body ตามที่แสดง (เปลี่ยน $json.text เป็นช่องที่เก็บข้อความของคุณ)
4. กด Execute step: คำตอบอยู่ที่ choices[0].message.content

```json
{
  "model": "app/ชื่อผู้ช่วยของคุณ",
  "messages": [{ "role": "user", "content": {{ JSON.stringify($json.text) }} }]
}
```

เคล็ดลับ: อย่าใส่เครื่องหมายคำพูดครอบ {{ JSON.stringify(...) }} เพราะนี่คือสิ่งที่ทำให้ข้อความที่มีเครื่องหมายคำพูดหรือบรรทัดใหม่ส่งผ่านได้ ถ้าผู้ช่วยตอบเป็น JSON ให้เพิ่มโหนด Edit Fields โหมด JSON ด้วย {{ JSON.parse($json.choices[0].message.content) }}

#### Google Sheets (Apps Script)

1. ใน Member Portal สร้างผู้ช่วย AI แล้วเปิดผู้ช่วยนั้นไปที่แท็บ วิธีเชื่อมต่อ → Google Sheets
2. ทำสำเนาชีตสำเร็จรูป (หรือวางสคริปต์ในชีตใหม่ ขั้นตอนอยู่ที่เดียวกัน)
3. ในชีตกดเมนู “ผู้ช่วย AI by IC Lueur → 1. ตั้งค่าและเริ่มใช้งาน” แล้วกรอกค่า 3 อย่างด้านล่าง
4. วางข้อความที่คอลัมน์ A: สถานะและคำตอบจะถูกเติมให้เอง

```text
Base URL:  https://api.ic-lueur.ai/v1
Assistant: app/ชื่อผู้ช่วยของคุณ
API key:   YOUR_API_KEY   (คีย์ที่สร้างเฉพาะชีตนี้)
```

เคล็ดลับ: ครั้งแรกที่ใช้ Google จะขอสิทธิ์หนึ่งครั้ง และอาจขึ้นว่ายังไม่ได้ยืนยันแอป: คู่มือใน Portal มีภาพของทุกหน้าจอ

## ขอความช่วยเหลือ

ส่งอีเมลที่ support-d@ic-lueur.ai หรือใช้แบบฟอร์มที่ https://www.ic-lueur.ai/th/contact/ ทีมงานตอบเป็นภาษาไทยและอังกฤษในเวลาทำการ
