Base URL & identity
Gọi tất cả endpoint theo đường dẫn tương đối của site này (ví dụ /v1/models), hoặc tuyệt đối:
- Không bắt buộc API key — server nhận diện bạn qua cookie
uid, tự đặt ở yêu cầu đầu tiên. Với curl / SDK nên dùng Bearer API key ổn định (xem API keys). - Cookie/key này quyết định quyền truy cập các cuộc trò chuyện & tệp của bạn (người khác không đọc được).
API keys (khuyên dùng cho client)
POST Bearer key giúp script/SDK của bạn có định danh ổn định — không cần cookie. Tạo mà không cần tài khoản:
curl -s -c cookie.txt /v1/auth/api-keys \
-H "content-type: application/json" \
-d '{"name": "my-script"}'
Phản hồi — bạn có thể sao chép lại bất cứ lúc nào trong dashboard:
{
"id": 3,
"key": "sk-kilg-xJ2...",
"prefix": "sk-kilg-xJ2",
"expires": "2026-09-25T00:00:00Z"
}
| Endpoint | Mô tả |
|---|---|
POST/v1/auth/api-keys | Tạo key. Body: {"name": "...", "ttl_days": 30} (tuỳ chọn). Key không bao giờ hết hạn trừ khi bạn truyền ttl_days (7 / 30 / 90 / 365). |
GET/v1/auth/api-keys | Danh sách key của bạn (kèm full key để sao chép lại). |
DELETE/v1/auth/api-keys/{id} | Thu hồi key — ngưng hoạt động ngay lập tức. |
Dùng key
Gửi Authorization: Bearer <key> ở mọi endpoint /v1. Key thay thế hoàn toàn cookie uid:
x-api-key: <key> cũng dùng được — đó là header Anthropic SDK gửi, nên key của SDK này không cần cấu hình thêm. Cùng một credential, cùng quyền; nếu có cả hai header, Authorization được ưu tiên.
curl /v1/chat/completions \
-H "authorization: Bearer sk-kilg-..." \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-5", "messages": [{"role": "user", "content": "hi"}]}
# Python (openai SDK)
from openai import OpenAI
client = OpenAI(
base_url="v1",
api_key="sk-kilg-...",
)
r = client.chat.completions.create(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "hi"}],
)
print(r.choices[0].message.content)
Models
GET/v1/models — danh sách chat + image models. GET /v1/images/models — chỉ image models.
curl -s /v1/models
Model được liệt kê theo thời gian chạy và tự cập nhật.
Chat completions
POST/v1/chat/completions — OpenAI-compatible, hỗ trợ stream: true (SSE).
curl -s /v1/chat/completions \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"stream": true,
"messages": [
{"role": "user", "content": "Giải thích SSH tunnel dễ hiểu"}
]
}'
Tuỳ chọn
| Trường | Mô tả |
|---|---|
system | System prompt (hoặc message đầu role: system). |
max_tokens / max_completion_tokens | , never \"stop\". Not applied to a turn that returns tool calls — a half-truncated call is unparseable.">Giới hạn độ dài câu trả lời. Có hiệu lực cả khi streaming lẫn không; câu bị cắt báo finish_reason: \"length\", không phải \"stop\". Không áp dụng cho lượt trả về tool call — một call bị cắt giữa chừng sẽ không parse được. |
web_search | true để bật tìm kiếm web (nguồn được nối vào câu trả lời). |
image_generation | {"imageGenerationModel": "flux-1.1-pro", "imageGenerationRatio": "1:1", "imageCount": 1} để sinh ảnh trong câu trả lời. |
conversation_id | Key conversation muốn nối tiếp (hoặc header X-Conversation-Id). |
conversation_id (memory) | Nên dùng: gửi X-Conversation-Id (hoặc conversation_id) duy nhất cho mỗi phiên và tái dùng nó ở mọi lượt của phiên đó. Không gửi thì server tự suy ra key từ TOÀN BỘ lịch sử trong request — phiên mới sẽ không bao giờ dính lịch sử phiên cũ, còn client nào replay lại lịch sử thì vẫn giữ một thread duy nhất. Xem Memory. |
incognito | true để bỏ hoàn toàn việc lưu trữ (xem Ẩn danh). |
include_name | true để model biết tên hiển thị của bạn (lấy từ hồ sơ; bỏ qua khi ẩn danh). |
avatar_share | true để gửi kèm ảnh đại diện (chỉ loại ảnh) vào tin nhắn đầu cuộc hội thoại mới, chỉ để tham khảo - model được dặn không nhận xét trừ khi được hỏi. Bỏ qua khi ẩn danh. |
File đính kèm: trong user message dùng {"type": "file", "url": "..."} hoặc {"type": "file_id", "file_id": "..."} (xem Files).
Responses (OpenAI)
POST/v1/responses — API mới hơn của OpenAI, dành cho client chỉ nói Responses (Agents SDK và các client tương tự). Cùng model, cùng streaming, cùng bộ nhớ hội thoại với Chat completions.
curl -s /v1/responses \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"input": "Giải thích SSH tunnel dễ hiểu"
}'
from openai import OpenAI
client = OpenAI(
base_url=v1,
api_key="sk-kilg-...",
)
r = client.responses.create(
model="claude-sonnet-5",
input="hi",
)
print(r.output_text)
Tuỳ chọn
| Trường | Mô tả |
|---|---|
input | Một chuỗi thuần, hoặc danh sách item (input_text, input_image, input_file). |
stream | true để nhận SSE (response.created, response.output_text.delta, response.completed). |
instructions | System prompt, ý nghĩa giống system của Chat completions. |
previous_response_id | Nối tiếp một response đã lưu thay vì gửi lại lịch sử. Phải là id của chính bạn. |
store | Mặc định true. Response đã lưu đọc bằng GET /v1/responses/{id} và xoá bằng DELETE. |
tools, tool_choice, web_search, image_generation | Nhận với ý nghĩa giống như trên Chat completions. |
Response đã lưu
| Endpoint | Mô tả |
|---|---|
POST/v1/responses | Tạo response; trả về id khi bật store. |
GET/v1/responses/{id} | Đọc lại một response đã lưu. |
POST/v1/responses/{id}/input_items | Nối thêm item vào một response đã lưu. |
DELETE/v1/responses/{id} | Xoá một response đã lưu. |
id của người khác trả về 404, không bao giờ lộ nội dung của họ.
Messages (Anthropic)
POST/v1/messages — giống Messages API của Anthropic (content blocks, streaming SSE).
curl -s /v1/messages \
-H "content-type: application/json" \
-d '{
"model": "gpt-5.5",
"max_tokens": 2048,
"system": "Trả lời bằng tiếng Việt",
"messages": [{"role": "user", "content": "Viết đoạn thơ ngắn về lập trình viên"}]
}'
POST/v1/messages/count_tokens — ước lượng token.
Cũng hỗ trợ incognito và include_name như chat completions.
Files
POST/v1/files — upload (multipart file), max 25MB; chấp nhận ảnh, text, PDF, Office.
curl -s /v1/files -F "[email protected]"
Trả về id + url. Sau đó: GET /v1/files (danh sách, kèm media_type), GET /v1/files/{id} (chi tiết), DELETE /v1/files/{id} (xoá khỏi danh sách; bản remote vẫn còn). Tệp chỉ chủ sở hữu (uid cookie) xem được; upload kèm header X-Incognito: 1 sẽ không bao giờ xuất hiện trong danh sách.
| Endpoint | Mô tả |
|---|---|
POST/v1/files | Upload một file (multipart file). |
GET/v1/files | Danh sách file của bạn. |
GET/v1/files/{id} | Chi tiết file. |
DELETE/v1/files/{id} | Xoá file khỏi danh sách (bản remote vẫn còn). |
Hồ sơ
GET/v1/profile — tên hiển thị + avatar của bạn (theo cookie uid). Mặc định: {"name": "", "avatar": {"kind": "none", "preset": "", "url": ""}}.
PUT/v1/profile — cập nhật. {"name": "Nyx"} (tối đa 40 ký tự, tự trim) hoặc {"avatar": {"kind": "preset", "preset": "#4c9eea"}} (một trong các màu preset) hoặc {"avatar": {"kind": "image", "file_id": "..."}} (file bạn đã upload qua /v1/files; phải là ảnh, tối đa 2MB). Gửi {"avatar": {"kind": "none"}} để xoá avatar.
Có tên hiển thị thì mới dùng được tuỳ chọn include_name (xem Chat completions).
Chat ẩn danh
Gửi incognito: true trong body để bỏ hoàn toàn việc lưu trữ — không ghi gì vào DB và không xuất hiện trong GET /v1/conversations. Client tự gửi toàn bộ lịch sử; mỗi lượt dùng chatId mới.
Memory & phiên làm việc
Conversation được lưu theo identity, không phải theo từng API key: mọi key tạo từ cùng một tài khoản/trình duyệt dùng chung một danh sách conversation. Nếu muốn mỗi API key có memory hoàn toàn riêng, nhờ quản trị viên bật MEMORY_SCOPE=key — khi đó conversation tạo bởi key này sẽ không nhìn thấy bởi key khác.
Một phiên chỉ nối tiếp khi dùng cùng conversation key. Hãy gửi X-Conversation-Id (hoặc trường conversation_id trong body) duy nhất cho mỗi phiên và tái dùng ở mọi lượt. Không gửi thì server tự suy key từ toàn bộ lịch sử trong request — phiên MỚI có nội dung khác sẽ luôn bắt đầu conversation mới và không bao giờ thấy ngữ cảnh của phiên cũ.
Client tự giữ lịch sử? Mọi câu trả lời đều mang header X-Conversation-Id của conversation nó rơi vào, nên client chỉ gửi tin nhắn mới mỗi lượt vẫn đọc header một lần rồi ghim lại được — nếu không, mỗi lượt lại sinh key mới và lịch sử của chính bạn không bao giờ tới được model. Nếu bạn gửi lại toàn bộ lịch sử mỗi lượt thì không cần header này.
Hình ảnh
POST/v1/images/generations — sinh ảnh (OpenAI-compatible).
curl -s /v1/images/generations \
-H "content-type: application/json" \
-d '{"model": "flux-1.1-pro", "prompt": "mèo đang code, phong cách pixel art", "n": 1, "size": "1024x1024"}'
Kết quả: data[].b64_json hoặc data[].url. Model hay dùng: flux-1.1-pro, flux-schnell, gpt-image-1, dall-e-3, imagen-4, sdxl.
Video
GET/v1/videos/models — danh sách video model (id, label, thời lượng tối thiểu/tối đa, tỉ lệ khung hình).
POST/v1/videos/generations — đưa một job sinh video vào hàng đợi. Theo cơ chế ticket: lệnh gọi trả về ngay và bạn theo dõi trạng thái sau.
curl -s /v1/videos/generations \
-H "content-type: application/json" \
-d '{"model": "video-ltx-2.5", "prompt": "phối cảnh thời gian của một thành phố về đêm", "duration": 5, "aspect_ratio": "16:9"}'
Phản hồi: {"ticket": "vid_...", "model": "video-ltx-2.5", "status": "queued"}.
| Trường | Mô tả |
|---|---|
prompt | Bắt buộc. Nội dung video cần tạo. |
model | Tuỳ chọn. Mặc định video-ltx-2.5. Model hay dùng: video-ltx-2.5 (nhanh, có âm thanh đồng bộ), video-ltx-2.3 (tiết kiệm hạn mức hơn), video-wan-2.2-5b / video-wan-2.2-14b (14b = chất lượng cao nhất), video-minimax-h3 (có nhạc nền, hỗ trợ khung hình kết thúc). |
duration | Giây — mỗi model có giới hạn riêng (xem /v1/videos/models). |
aspect_ratio | Mặc định 16:9; tỉ lệ được hỗ trợ tuỳ model. |
image / end_image | Khung hình đầu/cuối tuỳ chọn ({"url": "..."} hoặc url file đã upload). Image-to-video tuỳ model. |
seed | Số nguyên tuỳ chọn để tái lập kết quả. |
GET/v1/videos/status/{ticket} — hỏi trạng thái tới khi xong:
curl -s /v1/videos/status/vid_xxx
Trả về {"status": "queued|running|done|failed", "progress": 0.0-1.0, ...}. Khi xong sẽ có url (bản gốc) và media_url (đi qua proxy). Ticket không tồn tại → 404 — ticket lưu trong bộ nhớ và mất khi khởi động lại.
Đọc văn bản
GET/v1/tts/voices — 8 giọng phổ biến + giọng tốt nhất mỗi vùng: {"popular": [...], "all": [{"locale": ..., "voice": ..., "gender": ...}]}.
POST/v1/tts — đọc văn bản, trả về audio/mpeg (kèm header X-Edge-Voice). Body: {"text": "...", "voice": "vi-VN-HoaiMyNeural", "rate": 1.0, "pitch": 1.0}. Voice không bắt buộc — tự nhận diện theo ngôn ngữ văn bản (vi/en). Text tối đa 5000 ký tự.
curl -s /v1/tts \
-H "content-type: application/json" \
-d '{"text": "Xin chào KilgoreAI"}' \
-o gioi-thieu.mp3
Conversations
Mọi chat tự lưu theo cookie uid + X-Conversation-Id. Server không trả lại key nó tự suy ra, nên muốn nối tiếp cuộc trò chuyện, client phải tự chọn id và gửi ở mọi lượt (xem Memory & phiên làm việc).
| Endpoint | Mô tả |
|---|---|
GET/v1/conversations | Danh sách cuộc trò chuyện của bạn (id, title, model, last_active). |
GET/v1/conversations/{key} | Chi tiết + toàn bộ tin nhắn. |
PATCH/v1/conversations/{key} | {"title": "..."} đổi tên · {"system": "..."} đặt system prompt · {"truncate": 3} cắt lịch sử còn 3 lượt. |
DELETE/v1/conversations/{key} | Xoá cuộc trò chuyện. |
POST/v1/conversations/{key}/fork | Nhân bản cuộc trò chuyện tới một chỉ mục tin nhắn: {"up_to": 3} → conversation id mới. |
Góp ý & đề xuất
| Endpoint | Mô tả |
|---|---|
POST/v1/conversations/{key}/feedback | Đánh giá một tin nhắn like/dislike (kèm lời nhắn tuỳ chọn): {"idx": 3, "vote": "like"|"dislike"|null, "text": "..."}. idx là chỉ mục tin nhắn trong cuộc trò chuyện; chỉ tin nhắn của assistant mới đánh giá được. |
POST/v1/suggestions | Gửi góp ý hoặc đề xuất tính năng: {"type": "feedback"|"suggestion", "text": "..."} (text 1-2000 ký tự). |
GET/v1/my-suggestions | Danh sách góp ý của bạn + phản hồi của admin. |
POST/v1/my-feedback/read | Đánh dấu đã đọc phản hồi của admin (xoá badge chuông). |
Trạng thái
GET/v1/health — trạng thái dịch vụ: {"status": "ok", "models": [...], "image_models": [...], "memory": {"conversations": N}}.
Giới hạn
{"error": {"message", "type", "code"}}. Nếu máy chủ bật RATE_LIMIT_PER_MIN, các endpoint sinh nội dung trả 429 kèm header Retry-After khi vượt hạn mức mỗi phút.account_fallback_failed.