Di halaman ini
XUSS AI API
API produksi kompatibel OpenAI di atas platform hosting XUSS. Gunakan SDK, editor, atau klien chat OpenAI apa pun dan arahkan ke XUSS — tanpa lock-in vendor, satu kunci, bayar sesuai pemakaian dari saldo XUSS Anda.
- Base URL:
https://xuss.us/v1 - Autentikasi:
Authorization: Bearer xsk-…(buat kunci di panel) - Panel: https://xuss.us/panel/api
- Format: OpenAI Chat Completions (streaming, alat, visi, mode JSON)
Mulai cepat
1. Buat kunci API di panel: API → Kunci API → Buat kunci. Salin — hanya ditampilkan sekali. Kunci diawali xsk-.
2. Panggil API dari bahasa apa pun — pilih tab:
curl https://xuss.us/v1/chat/completions \
-H "Authorization: Bearer xsk-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "xuss/kitsune",
"messages": [{"role": "user", "content": "Halo!"}]
}'from openai import OpenAI
client = OpenAI(base_url="https://xuss.us/v1", api_key="xsk-YOUR_KEY")
r = client.chat.completions.create(
model="xuss/kitsune",
messages=[{"role": "user", "content": "Halo!"}],
)
print(r.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://xuss.us/v1", apiKey: "xsk-YOUR_KEY" });
const r = await client.chat.completions.create({
model: "xuss/kitsune",
messages: [{ role: "user", content: "Halo!" }],
});
console.log(r.choices[0].message.content);package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
body := []byte(`{"model":"xuss/kitsune","messages":[{"role":"user","content":"Halo!"}]}`)
req, _ := http.NewRequest("POST", "https://xuss.us/v1/chat/completions", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer xsk-YOUR_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(string(out))
}<?php
$ch = curl_init('https://xuss.us/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer xsk-YOUR_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'model' => 'xuss/kitsune',
'messages' => [['role' => 'user', 'content' => 'Halo!']],
]),
]);
$res = json_decode(curl_exec($ch), true);
echo $res['choices'][0]['message']['content'], PHP_EOL;Selesai — saldo XUSS Anda ditagih per token, tanpa langganan.
Autentikasi
Setiap permintaan memerlukan token bearer:
Authorization: Bearer xsk-YOUR_KEY
Content-Type: application/jsonKunci dibuat dan dicabut di Panel → API. Aturan:
- Kunci berupa
xsk-diikuti string acak panjang. Hanya karakter pertama yang disimpan untuk tampilan; nilai lengkap ditampilkan sekali saat dibuat. - Hingga 10 kunci aktif per akun.
- Setiap kunci dapat memiliki tanggal kedaluwarsa opsional dan batas belanja opsional (USD). Saat kunci kedaluwarsa atau mencapai batasnya, permintaan dengannya gagal dengan 401 (
key_expired) atau 402 (key_spend_limit_reached) sampai Anda membuat kunci baru atau menaikkan batasnya. - Membuat kunci di panel dilindungi Cloudflare Turnstile (captcha), jadi kunci tidak bisa dibuat oleh skrip.
- Mencabut kunci berlaku seketika.
- Kunci mewarisi akses akun Anda ke AI API. Jika API tidak diaktifkan untuk akun Anda, permintaan mengembalikan 403.
Jangan pernah menampilkan kunci di kode sisi klien atau repositori publik. Jika kunci bocor, cabut di panel dan buat yang baru.
Endpoint
| Metode | Jalur | Deskripsi |
|---|---|---|
| GET | /v1/models | Daftar model yang tersedia untuk kunci Anda, dengan harga dan kemampuan |
| POST | /v1/chat/completions | Buat chat completion (streaming atau tidak) |
| GET | /v1/tools | Daftar alat sisi server yang dapat dijalankan API untuk Anda |
| GET | /v1/skills | Daftar keterampilan referensi yang dapat dimuat asisten |
Semua menerima Authorization: Bearer xsk-….
Model
…
GET /v1/models mengembalikan model yang diekspos di API, termasuk jendela konteks, dukungan visi, dan harga per token:
{
"object": "list",
"data": [
{
"id": "xuss/kitsune",
"object": "model",
"owned_by": "xuss",
"context_window": 1048576,
"vision": true,
"pricing": {
"prompt": 0.00000029,
"completion": 0.00000129,
"input_cache_read": 0.0000000099
}
}
]
}Harga dinyatakan dalam USD per token. Kalikan dengan 1.000.000 untuk harga per juta seperti di panel.
Perutean model. Di balik satu id model, XUSS dapat merutekan permintaan ke kapasitas hulu yang berbeda agar layanan tetap cepat dan tersedia. Ini tidak terlihat oleh Anda:modelyang diminta selalu yang dikembalikan, dan model mengetahui namanya. Harga di/v1/modelsadalah harga yang Anda ditagih.
Chat completions
POST /v1/chat/completions
Body permintaan
| Field | Tipe | Catatan |
|---|---|---|
model | string | wajib — mis. xuss/kitsune |
messages | array | wajib — lihat Messages |
stream | boolean | true = Server-Sent Events |
temperature | number | 0–2, default 0.2 |
max_tokens | integer | membatasi panjang keluaran |
max_completion_tokens | integer | alias max_tokens |
tools | array | definisi fungsi/alat — lihat Alat |
tool_choice | string/object | diteruskan ke model |
response_format | object | {"type":"json_object"} untuk mode JSON |
top_p, stop, seed, presence_penalty, frequency_penalty, logit_bias, n, user, logprobs, top_logprobs | — | diteruskan |
messages mengikuti skema OpenAI (peran system, user, assistant, tool; array konten multimodal).
Respons
{
"id": "chatcmpl-3f9c1a...",
"object": "chat.completion",
"created": 1791000000,
"model": "xuss/kitsune",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Halo! Ada yang bisa dibantu?"},
"finish_reason": "stop",
"logprobs": null
}
],
"usage": {"prompt_tokens": 12, "completion_tokens": 7, "total_tokens": 19},
"system_fingerprint": "xuss"
}finish_reason adalah stop, length, atau tool_calls.
Messages
Array pesan OpenAI standar. Permintaan satu giliran minimal:
{"model": "xuss/kitsune", "messages": [{"role": "user", "content": "Halo"}]}Percakapan multi-giliran — kirim riwayat lengkap setiap kali:
{
"model": "xuss/kitsune",
"messages": [
{"role": "system", "content": "Kamu asisten yang ringkas."},
{"role": "user", "content": "Apa itu XUSS?"},
{"role": "assistant", "content": "XUSS adalah platform hosting."},
{"role": "user", "content": "Apakah punya AI API?"}
]
}Streaming
Setel "stream": true untuk menerima Server-Sent Events. Setiap baris adalah data: {json}; stream berakhir dengan data: [DONE].
Chunk-nya seperti ini:
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","created":…,"model":"xuss/kitsune","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}],"system_fingerprint":"xuss"}
data: {"id":"chatcmpl-…","choices":[{"index":0,"delta":{"content":"Senap "},"finish_reason":null}]}
data: {"id":"chatcmpl-…","choices":[{"index":0,"delta":{"content":"rak "},"finish_reason":null}]}
data: {"id":"chatcmpl-…","choices":[],"usage":{"prompt_tokens":14,"completion_tokens":9,"total_tokens":23}}
data: [DONE]Baca stream dalam bahasa apa pun:
curl -N https://xuss.us/v1/chat/completions \
-H "Authorization: Bearer xsk-YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"xuss/kitsune","stream":true,
"messages":[{"role":"user","content":"Tulis haiku tentang server"}]}'stream = client.chat.completions.create(
model="xuss/kitsune",
messages=[{"role": "user", "content": "Tulis haiku tentang server"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content if chunk.choices else None
if delta:
print(delta, end="", flush=True)const stream = await client.chat.completions.create({
model: "xuss/kitsune",
messages: [{ role: "user", content: "Tulis haiku tentang server" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}package main
import (
"bufio"
"bytes"
"fmt"
"net/http"
"strings"
)
func main() {
body := []byte(`{"model":"xuss/kitsune","stream":true,"messages":[{"role":"user","content":"Tulis haiku tentang server"}]}`)
req, _ := http.NewRequest("POST", "https://xuss.us/v1/chat/completions", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer xsk-YOUR_KEY")
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
sc := bufio.NewScanner(res.Body)
for sc.Scan() {
line := sc.Text()
if !strings.HasPrefix(line, "data: ") || strings.HasSuffix(line, "[DONE]") {
continue
}
fmt.Println(line[6:]) // parse JSON, read choices[0].delta.content
}
}<?php
$ch = curl_init('https://xuss.us/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer xsk-YOUR_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'model' => 'xuss/kitsune',
'stream' => true,
'messages' => [['role' => 'user', 'content' => 'Tulis haiku tentang server']],
]),
CURLOPT_WRITEFUNCTION => function ($ch, $chunk) {
foreach (explode("\n", $chunk) as $line) {
if (str_starts_with($line, 'data: ') && !str_contains($line, '[DONE]')) {
$j = json_decode(substr($line, 6), true);
echo $j['choices'][0]['delta']['content'] ?? '';
}
}
return strlen($chunk);
},
]);
curl_exec($ch);Saat model mendukung penalaran, chunk streaming dapat membawa field tambahanreasoning_contentdidelta. SDK standar mengabaikannya dan Anda tidak perlu menanganinya sebagai keluaran.
Prompt sistem dan identitas
Pesan system Anda dihormati. Model juga mengetahui nama tampilannya dan, saat ditanya model apa dirinya, menjawab hanya dengan nama itu — tidak pernah mengungkap penyedia atau rute hulu.
{
"model": "xuss/kitsune",
"messages": [
{"role": "system", "content": "Kamu asisten DevOps yang ringkas. Jawab dengan poin."},
{"role": "user", "content": "Bagaimana cara me-restart layanan systemd?"}
]
}Visi (gambar)
Kirim gambar sebagai bagian konten image_url OpenAI (data URL atau URL http(s) publik). Hanya model dengan "vision": true di /v1/models yang menerima gambar; mengirim gambar ke model tanpa visi mengembalikan catatan teks dan model hanya menjawab berdasarkan teks.
r = client.chat.completions.create(
model="xuss/kitsune",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Apa isi gambar ini?"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}},
],
}],
)Batas: hingga 8 bagian gambar, masing-masing hingga ~6 MB; gambar tidak dihitung ke anggaran teks.
Pemanggilan fungsi
Kirim tools bergaya OpenAI. Saat model memutuskan memanggil fungsi, finish_reason menjadi tool_calls dan pesan berisi tool_calls.
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
r = client.chat.completions.create(
model="xuss/kitsune",
messages=[{"role": "user", "content": "Cuaca di Tashkent?"}],
tools=tools,
)
call = r.choices[0].message.tool_calls[0]
print(call.function.name, call.function.arguments)Lalu kirim hasilnya kembali sebagai pesan tool:
messages = [
{"role": "user", "content": "Cuaca di Tashkent?"},
r.choices[0].message,
{"role": "tool", "tool_call_id": call.id, "content": '{"temp_c": 24, "sky": "clear"}'},
]
final = client.chat.completions.create(model="xuss/kitsune", messages=messages)Alat server (web + keterampilan)
Aktif per permintaan. Tambahkan "xuss_tools": true (semua) atau array yang diinginkan. XUSS lalu menjalankan alat tersebut untuk Anda di server — model memanggilnya, server menjalankannya dan melanjutkan, dan Anda mendapat jawaban akhir dalam respons yang sama. Tanpa loop di sisi klien.
r = client.chat.completions.create(
model="xuss/kitsune",
xuss_tools=True, # atau ["web_search", "read_skill"]
messages=[{"role": "user",
"content": "Cari di web rilis Python terbaru dan ringkas."}],
)
print(r.choices[0].message.content){
"model": "xuss/kitsune",
"xuss_tools": true,
"messages": [{"role": "user", "content": "Buka https://example.com dan beri judul halamannya."}]
}| Alat | Fungsinya |
|---|---|
web_search | Pencarian web (SearXNG): judul, URL, dan cuplikan |
fetch_url | Mengambil URL HTTP(S) di server dan mengembalikan teksnya (HTML diubah ke teks) |
browser_render | Membuka halaman di browser headless nyata: status HTTP, judul, teks terlihat, error konsol, permintaan gagal, metrik tata letak, eval JS opsional |
read_skill | Memuat salah satu keterampilan referensi di bawah (panduan lengkap) ke konteks model |
Ini hanya-baca: tanpa akses ke berkas, basis data, hosting, atau akun Anda. Alat yang mengubah sesuatu (manajemen berkas, DNS, basis data, dan seterusnya) tetap di tangan Anda dan sengaja tidak diekspos.
- Non-streaming: server menjalankan loop alat (hingga 6 putaran) dan mengembalikan jawaban akhir;
usage(dan penagihan) mencakup setiap putaran. - Streaming (
"stream": true): alat dijalankan di server, lalu jawaban akhir di-stream sebagai SSE seperti biasa. - Jika Anda juga mengirim
toolsAnda sendiri, model dapat memanggil keduanya — XUSS menjalankan miliknya dan mengembalikan panggilan alat Anda melaluitool_callsuntuk Anda jalankan (perilaku standar). - Temukan saat runtime:
GET /v1/tools(definisi) danGET /v1/skills(daftar di bawah).
Keterampilan yang tersedia
read_skill memuat dokumen referensi lengkap salah satunya ke konteks — cukup beri tahu model yang mana (mis. "gunakan keterampilan product-design").
| Id keterampilan | Mencakup |
|---|---|
telegram-bots | Telegram Bot API 10.3 lengkap: setiap metode/tipe, contoh aiogram 3, pembayaran/Stars, webhook, emoji/hadiah premium, pesan kaya & draf streaming |
product-design | situs/halaman/galeri/UI yang tampak sengaja didesain: token, aturan anti-slop, tata letak, galeri foto-wallpaper |
cybersecurity | menulis & mengaudit kode aman: injeksi/XSS/CSRF/IDOR, manajemen rahasia, keamanan bot, respons insiden |
telegram-miniapps | Telegram WebApp: autentikasi initData, variabel tema, MainButton/BackButton, Stars, deployment |
shop-bot | bot toko Telegram lengkap: katalog, keranjang, pesanan, panel admin, pengiriman, alur pembayaran |
payments | Click/Payme/Paylov/Uzum + Crypto Pay + Telegram Stars: invoice, verifikasi webhook, idempotensi |
php-web | situs PHP & WordPress: struktur, PDO, auth/CSRF, template, keamanan, deployment |
ai-integration | LLM di dalam aplikasi Anda: chat/streaming, RAG, prompting, batas biaya, keamanan kunci API |
python-backend | Python produksi: bot, FastAPI/Flask, disiplin asyncio, akses DB, layanan run, penanganan error |
node-backend | backend & bot Node/TypeScript: Express/Fastify/Telegraf, env, manajemen proses, error |
databases | MySQL/PostgreSQL/SQLite: desain skema, indeks, migrasi, transaksi, cadangan |
rest-api | desain API: auth, validasi, paginasi, satu bentuk error, batas laju, penandatanganan webhook |
deployment-ops | deploy proyek di hosting ini: domain/DNS/SSL, reverse proxy, port, cron, cadangan, log |
git-github | alur git, kunci deploy, webhook auto-deploy, kebersihan rahasia, rollback |
scraping-automation | scraper & pemantau etis: sumber terstruktur, backoff, dedupe, penjadwalan, peringatan |
seo | SEO teknis: judul, data terstruktur, sitemap, hreflang, pengindeksan (Google & Yandex) |
media-pipeline | pipeline gambar/video: pengubahan ukuran, WebP, thumbnail, kompresi, pratinjau ffmpeg |
i18n-localization | uz/ru/en + RTL: kamus string, format angka/tanggal/plural, bahasa bot, hreflang |
testing-quality | disiplin menjalankan/memverifikasi/men-debug, unit test, linting, kebiasaan review sebelum bilang "selesai" |
analytics-monitoring | pemeriksaan uptime, pelacakan error, statistik harian, analitik & peringatan yang aman privasi |
legal-templates | halaman privacy/terms/refund + persetujuan + alur penghapusan data (dasar praktis) |
react-best-practices | performa React/Next.js: waterfall, bundel, rendering, hidrasi, rerender |
mobile-design | UX mobile native: pola platform, psikologi sentuh, performa mobile |
senior-frontend | rekayasa frontend senior: arsitektur, komponen, review performa |
senior-backend | rekayasa backend senior: desain API/DB, penskalaan, review kode |
senior-security | arsitektur keamanan, pemodelan ancaman, implementasi kripto, audit |
ui-design-system | token desain, komponen, handoff; buat sistem token dari warna merek |
tgbot-clone | kloning fitur bot Telegram dengan aman: probe, petakan fitur, implementasi & uji |
product-layers | metode produk/UX berlapis: kebutuhan → strategi → model konseptual → permukaan |
find-skills | temukan & pasang keterampilan yang dapat dipakai ulang untuk proyek agen |
Keluaran terstruktur (mode JSON)
Setel response_format ke {"type":"json_object"} dan minta model mengeluarkan JSON. content balasan adalah string JSON.
r = client.chat.completions.create(
model="xuss/kitsune",
response_format={"type": "json_object"},
messages=[{"role": "user",
"content": "Kembalikan JSON dengan kunci a dan b, a=1, b=2"}],
)
import json
print(json.loads(r.choices[0].message.content)) # {'a': 1, 'b': 2}Selalu parsing secara defensif dan jelaskan bentuk persisnya di prompt.
Penagihan dan penghitungan token
- Biaya dipotong dari saldo XUSS Anda (isi ulang di panel).
- Ditagih per token dengan harga API model: input (cache miss), cache hit (lebih murah bila didukung), dan output.
usagesetiap permintaan melaporkanprompt_tokens,completion_tokens, dantotal_tokens.- Halaman API di panel menampilkan belanja, permintaan, token, rincian per model dan per kunci, serta log panggilan terbaru, dengan rentang pilihan (hari ini, 7/30/90 hari, bulan ini/lalu, sepanjang waktu).
- Permintaan ditolak dengan 402 saat saldo tidak cukup.
Rumus biaya (per permintaan):
cost = cache_miss_tokens × price_in
+ cache_hit_tokens × price_cache
+ completion_tokens × price_out(Harga per token; bagi 1.000.000 untuk per juta.)
Batas laju dan kuota
| Cakupan | Default |
|---|---|
| Per pengguna | 300 permintaan / menit |
| Per kunci API | 600 permintaan / menit |
Melebihi batas mengembalikan 429 dengan semantik Retry-After (mundur dan coba lagi). Body permintaan dibatasi 25 MB.
Error
Error mengikuti format error OpenAI:
{
"error": {
"message": "Model 'xuss/foo' not found",
"type": "invalid_request_error",
"param": "model",
"code": "model_not_found"
}
}| Status | type / code | Arti |
|---|---|---|
| 400 | invalid_request_error | Permintaan salah (field hilang/tidak valid, body tidak dapat diurai) |
| 401 | authentication_error · invalid_api_key, key_expired | Kunci API hilang, tidak valid, atau kedaluwarsa |
| 402 | insufficient_quota · key_spend_limit_reached | Saldo kosong atau kunci mencapai batas belanja |
| 403 | permission_error | API tidak diaktifkan untuk akun Anda, atau akun dinonaktifkan |
| 404 | invalid_request_error · model_not_found | Model tidak dikenal |
| 413 | invalid_request_error | Body permintaan terlalu besar (> 25 MB) |
| 422 | invalid_request_error | Muatan permintaan tidak valid (skema) |
| 429 | rate_limit_error · rate_limit_exceeded | Melebihi batas laju — perlambat |
| 500 / 502 | api_error · upstream_error | Masalah hulu sementara — coba lagi dengan backoff |
| 503 | api_error · service_unavailable | AI API sedang dinonaktifkan |
param diisi saat error menyangkut field permintaan tertentu. SDK standar membaca error.message (dan error.code) langsung.
Kegagalan sementara juga dikirim sebagai pesan asisten biasa yang diawali "The model is temporarily unavailable…" saat stream sudah dimulai.
Menggunakan dengan alat kompatibel OpenAI
Klien apa pun yang mendukung base URL OpenAI kustom dapat digunakan. Setel:
- Base URL:
https://xuss.us/v1 - Kunci API: kunci
xsk-…Anda - Model: mis.
xuss/kitsune
Contoh:
# open-webui / LibreChat / Cursor / Cline / Continue / LangChain:
# set the OpenAI base URL to https://xuss.us/v1 and paste your keyGaya variabel lingkungan (banyak alat menghormatinya):
export OPENAI_BASE_URL="https://xuss.us/v1"
export OPENAI_API_KEY="xsk-YOUR_KEY"LangChain (Python):
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="xuss/kitsune", base_url="https://xuss.us/v1",
api_key="xsk-YOUR_KEY")
print(llm.invoke("Halo").content)Parameter lanjutan
Berikut diterima dan diteruskan ke model saat didukung: top_p, stop, seed, presence_penalty, frequency_penalty, logit_bias, user, n, parallel_tool_calls, tool_choice.
FAQ
Apakah saya perlu langganan terpisah? Tidak. Anda membayar per token dari saldo XUSS.
Id model mana yang saya gunakan? Persis yang ada di GET /v1/models (mis. xuss/kitsune). Nama tampilan seperti "Kitsune" ditampilkan di panel.
Bisakah saya mengirim gambar? Ya, ke model bertanda "vision": true.
Apakah data saya digunakan untuk pelatihan? Tidak — permintaan diproksikan ke model untuk menghasilkan jawaban Anda dan tidak digunakan untuk pelatihan.
Apa yang terjadi jika penyedia lambat atau mati? Permintaan dicoba ulang secara transparan pada kapasitas alternatif; id model dan harga tetap sama.
Bagaimana cara merotasi kunci? Buat kunci baru, pindahkan aplikasi Anda, lalu cabut kunci lama di panel.
Dukungan
- Panel: https://xuss.us/panel/api
- Tiket & dukungan Telegram dari dasbor panel Anda
- Email: support@xuss.us