Tài liệu API AI
1 khoá sk- gọi mọi model (Claude / GPT / Gemini…). Tương thích OpenAI & Anthropic — dùng thẳng thư viện openai hoặc anthropic.
1. Hai nhóm API — dùng domain nào?
Có 2 domain khác nhau cho 2 mục đích — đừng nhầm:
| Bạn muốn | Domain | Cần khoá? |
|---|---|---|
| Gọi AI (chat, ảnh, video…) | https://aiapi.cloudmoon.net/v1 | ✅ Có (sk-) |
| Tra bảng giá / trạng thái model (công khai) | https://cloudmoon.net/api/ai | ❌ Không |
• aiapi.cloudmoon.net = cổng AI — nơi THỰC SỰ gọi model, luôn cần khoá sk-. Mục 2–13 dùng domain này.
• cloudmoon.net/api/ai = thông tin công khai — giá + trạng thái, không cần khoá, để dựng web bán lại. Mục 14.
2. Lấy khoá & Base URL
Base URL (điền vào tool / SDK):
Lấy khoá sk- ở trang API keys (cần đăng nhập + nạp Xu). Một tài khoản tạo nhiều khoá, tất cả dùng chung số dư Xu; mỗi khoá đặt được hạn mức riêng + khoá theo IP.
Kiểm tra khoá hợp lệ (ping nhanh — trả HTTP 200 là OK):
Nên gọi API từ backend/server — đừng nhúng khoá vào frontend công khai.
3. Xác thực
Chuẩn OpenAI — gửi header Authorization: Bearer:
Chuẩn Anthropic (SDK anthropic) — dùng x-api-key (cũng chấp nhận):
4. Chat (chuẩn OpenAI) — POST /chat/completions
Cách gọi phổ biến nhất, dùng cho tất cả model.
Kết quả mẫu:
Câu trả lời ở choices[0].message.content. Token thực dùng ở usage — căn cứ trừ Xu.
5. Chat (chuẩn Anthropic) — POST /messages
Dành cho ai quen SDK anthropic. Bắt buộc max_tokens. Trả về khối content.
Kết quả mẫu:
Không rành thì cứ dùng mục 4 (OpenAI) — bao hết mọi model.
6. Streaming (nhận token dần)
Thêm "stream": true để chữ hiện dần như ChatGPT. Server trả SSE — mỗi dòng một data:, kết thúc data: [DONE].
SDK tự gộp: Python stream=True rồi for chunk in resp; JS { stream: true } rồi for await.
7. Hội thoại nhiều lượt & tham số
Gửi cả lịch sử trong messages (vai system / user / assistant) để model nhớ ngữ cảnh:
Tham số hay dùng (thêm vào body):
| Tham số | Kiểu | Ý nghĩa |
|---|---|---|
temperature | 0–2 | Càng cao càng sáng tạo (mặc định ~1) |
max_tokens | số | Giới hạn độ dài trả lời |
top_p | 0–1 | Nucleus sampling (thay cho temperature) |
stop | chuỗi / mảng | Gặp chuỗi này thì dừng |
stream | bool | Trả token dần (mục 6) |
response_format | object | {"type":"json_object"} ép trả JSON hợp lệ |
seed | số | Cố gắng tái lập cùng kết quả |
tools / tool_choice | mảng | Function calling (mục 8) |
8. Function calling (tools) — cho model tự gọi hàm
Khai báo hàm ở tools; model quyết định gọi hàm nào + trả về arguments. Bạn chạy hàm rồi gửi kết quả lại.
B1. Gửi kèm tools:
B2. Model trả về ý định gọi hàm (finish_reason: "tool_calls"):
B3. Chạy hàm của bạn, gửi kết quả lại bằng message vai tool:
Lượt cuối model dùng kết quả hàm để trả lời bằng chữ. Dùng cho chatbot tra cứu, đặt lịch, gọi API nội bộ…
9. Vision — gửi ảnh cho model đọc
Với model hỗ trợ ảnh đầu vào (Gemini, GPT, Claude…), chèn image_url vào content:
Ảnh gửi dạng data URL base64 (data:image/png;base64,...) hoặc HTTPS URL công khai. Model không hỗ trợ vision sẽ báo lỗi.
10. Responses API — POST /responses (cho Codex / IDE)
Chuẩn "Responses" của OpenAI, dùng cho một số IDE/agent (Codex…).
Cấu hình Codex (custom provider) — config.toml:
env_key = TÊN biến môi trường chứa khoá (đặt khoá thật vào CLOUDMOON_API_KEY), không phải khoá.
11. Tích hợp vào công cụ có sẵn (không cần code)
Nhiều IDE / app chat cho nhập endpoint tùy chỉnh — trỏ vào cổng AI + dán khoá + chọn model là chạy.
Claude Code (Anthropic CLI) — đặt biến môi trường rồi mở Claude Code:
Cursor — Settings → Models:
| Mục trong Cursor | Giá trị |
|---|---|
| OpenAI API Key | sk-YOUR_KEY |
| Override OpenAI Base URL (bật) | https://aiapi.cloudmoon.net/v1 |
| Add model | google/gemini-2.5-flash-lite, openai/gpt-5.6-sol… |
Agent/Composer cần model hỗ trợ tool-call (Claude / GPT đều được). Tab autocomplete vẫn dùng model riêng của Cursor.
Codex — dùng Responses API, cấu hình config.toml (xem mục 10).
App chat bên thứ 3 (Cherry Studio, ChatBox, LibreChat, Jan…) — chọn 1 trong 2 chuẩn (cổng hỗ trợ cả hai):
| Base URL nhập vào app | Chuẩn | App gọi |
|---|---|---|
https://aiapi.cloudmoon.net/v1 | OpenAI | /chat/completions |
https://aiapi.cloudmoon.net | Anthropic | /v1/messages |
Dán khoá sk-, chọn model theo bảng giá (dùng đúng id có dấu /).
12. Sinh ảnh & video sắp có
Endpoint theo chuẩn OpenAI, sẽ mở khi có model ảnh/video. Định dạng dự kiến:
POST https://aiapi.cloudmoon.net/v1/images/generations — sinh ảnh, trừ Xu mỗi ảnh
POST https://aiapi.cloudmoon.net/v1/videos/generations — sinh video dạng job bất đồng bộ, trừ Xu theo giây
Ảnh/video render lâu → gọi bất đồng bộ (job + poll) tránh timeout. Theo dõi model mở bán ở bảng giá / trạng thái.
13. Danh sách model — GET /models
Dùng đúng id trả về trong request. Muốn xem kèm GIÁ mà không cần khoá → mục 14.
14. Theo dõi usage — GET /dashboard/billing/usage
Tổng tiêu dùng trong kỳ. Xem số dư còn lại + chi tiết từng lượt (model, token, chi phí) ở Nhật ký.
15. API công khai (không cần khoá) — cloudmoon.net/api/ai
Dựng web bán lại / hiện bảng giá — không cần đăng nhập, CORS mở.
GET https://cloudmoon.net/api/ai/pricing — bảng giá (xem trang)
GET https://cloudmoon.net/api/ai/status — model nào đang chạy (xem trang)
Đơn vị = Xu (1 xu = 1đ). input/output_per_1m_vnd = Xu / 1 triệu token; ảnh/video có per_request_vnd.
16. Tính phí (Xu)
Trừ theo token thực dùng (input + output), đơn giá theo bảng giá — Xu / 1 triệu token, 1 xu = 1đ. Ảnh trừ theo mỗi ảnh, video theo mỗi giây. Số token trả về trong usage mỗi response. Hết số dư → 402. Chi tiết từng lượt: Nhật ký.
17. Timeout, retry & thực hành tốt
Timeout client khuyên đặt: chat/text 60–180s · streaming giữ tới [DONE] · ảnh (sắp có) 180–360s · video submit 60s, poll 300s.
Retry: gặp 429/500/502/503/504 → thử lại tối đa 2–3 lần, chờ tăng dần 1s → 3s → 8s + jitter. Đừng bắn lại 20–50 request cùng lúc.
| Mã | Ý nghĩa | Xử lý |
|---|---|---|
401 | Sai / thiếu khoá sk- | Kiểm tra header Authorization |
402 | Hết số dư Xu | Nạp thêm |
404 | Model / endpoint không tồn tại | Lấy id đúng ở GET /models |
429 | Gọi quá nhanh (rate limit) | Giảm concurrency + retry backoff |
5xx / 503 | Model tạm gián đoạn | Xem trạng thái, retry hoặc đổi model |
Thực hành tốt:
- Tái dùng client SDK (một instance) thay vì khởi tạo mới mỗi request.
- Streaming (
stream:true) cho app chat — user thấy chữ chảy dần, UX mượt hơn. - Không retry
402(chờ nạp) hay422/prompt-lỗi (sửa prompt); chỉ retry429/5xx. - Đặt
max_tokenshợp lý để kiểm soát chi phí + độ trễ.
18. Khuyến nghị bảo mật
- Chỉ lưu khoá ở biến môi trường phía server — không nhúng vào frontend / GitHub.
- Tạo khoá riêng cho production / staging / local để dễ thu hồi.
- Đặt hạn mức + khoá theo IP cho từng khoá ở API keys.
- Nghi lộ khoá → bấm "Thu hồi & tạo lại" (khoá cũ chết ngay, nhận khoá mới giữ nguyên cài đặt).
19. Bảng endpoint
| Method | Endpoint | Mục đích |
|---|---|---|
| POST | /chat/completions | Chat chuẩn OpenAI (mọi model) + tools + vision |
| POST | /messages | Chat chuẩn Anthropic |
| POST | /responses | Responses API (Codex/IDE) |
| GET | /models | Danh sách model gọi được |
| GET | /dashboard/billing/usage | Tổng usage theo kỳ |
| POST | /images/generations sắp có | Sinh ảnh |
| POST | /videos/generations sắp có | Sinh video (job) |
| GET | cloudmoon.net/api/ai/pricing | Bảng giá công khai (không key) |
| GET | cloudmoon.net/api/ai/status | Trạng thái model (không key) |