Masuk

Dokumentasi

Panduan YupiAI Gateway

Hubungkan aplikasi Anda dengan Quick Setup atau panduan manual per aplikasi, buat dan edit gambar atau video lewat API di bagian Gambar & video, ubah teks menjadi suara atau rekaman menjadi teks di bagian Audio, lalu baca saldo, pemakaian, dan biaya per request di bagian Usage & billing. Konfigurasi aplikasi terakhir diperiksa 15 Agustus 2026; referensi Usage & billing 13 September 2026; referensi gambar dan video 24 September 2026; referensi audio 25 September 2026.

01. Pengenalan

Dasar API YupiAI

YupiAI menyediakan satu gateway untuk aplikasi yang memakai API OpenAI, OpenAI Responses, atau Anthropic Messages. Gunakan alamat endpoint yang sesuai dengan aplikasi.

API key baru diawali yupi_ai_. Key lama yang diawali rk_live_ tetap berlaku di semua endpoint tanpa perubahan konfigurasi.

Key yang sama membaca saldo (GET /v1/credits), informasi key (GET /v1/key), dan statistik pemakaian (GET /v1/usage). Setiap response inference menyertakan jumlah token dan kredit yang ditagih. Lihat Quick start usage & billing.

Endpoint Anthropic tidak memakai /v1

Claude Code menambahkan path /v1/messages secara otomatis. Isi ANTHROPIC_BASE_URL dengan https://gateway.euphy.cloud.

Uji koneksi

Request berikut memeriksa API key, saldo, endpoint, dan Model ID sekaligus.

Terminal · OpenAI Chat Completions
curl https://gateway.euphy.cloud/v1/chat/completions \
  -H "Authorization: Bearer yupi_ai_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "yupiai-glm5.2",
    "messages": [{ "role": "user", "content": "Balas: koneksi berhasil" }]
  }'

02. Quick Setup

Tutorial Quick Setup

Installer memandu Anda melalui pengaturan di terminal. Setiap perubahan tetap memerlukan pilihan atau persetujuan Anda.

macOS atau Linux

Terminal
curl -fsSL https://gateway.euphy.cloud/install.sh | bash

Windows

PowerShell
irm https://gateway.euphy.cloud/install.ps1 | iex
01

Tempel API key lengkap

Salin key yang diawali yupi_ai_ dari Dashboard. Key tampil utuh di layar, jadi bisa dicek dulu sebelum menekan Enter.
02

Pilih aplikasi

Ikuti pilihan yang ditampilkan oleh installer. Tekan Space untuk memilih dan Enter untuk melanjutkan.
03

Pilih model

Tekan Space untuk memilih model, lalu Enter untuk melanjutkan. Pilihan pertama menjadi default. Jika aplikasi yang dipilih hanya memakai satu model, gunakan tombol panah lalu tekan Enter.
04

Baca ringkasan hasil

Periksa status setiap langkah. Setelah selesai, buka ulang aplikasi agar konfigurasi dimuat.

Tinjau skrip sebelum menjalankan

Unduh skrip, baca isinya dengan editor teks, lalu jalankan file lokal.

macOS / Linux · mode tinjau
curl -fsSL https://gateway.euphy.cloud/install.sh -o /tmp/yupiai-install.sh
less /tmp/yupiai-install.sh
bash /tmp/yupiai-install.sh
Windows · mode tinjau
Invoke-WebRequest https://gateway.euphy.cloud/install.ps1 -OutFile "$env:TEMP\yupiai-install.ps1"
notepad "$env:TEMP\yupiai-install.ps1"
& "$env:TEMP\yupiai-install.ps1"

Uninstall dan reset

Uninstaller melepas YupiAI dari aplikasi Anda atau mengembalikan konfigurasi ke keadaan semula sebelum setup ulang, misalnya setelah mengganti API key.

Terminal
curl -fsSL https://gateway.euphy.cloud/uninstall.sh | bash
PowerShell
irm https://gateway.euphy.cloud/uninstall.ps1 | iex
01

Pilih tingkat pembersihan

Hapus konfigurasi membuang entri YupiAI dan menyimpan semua backup lama. Reset total juga menghapus file .bak-* lama sehingga instalasi berikutnya benar-benar mulai dari nol.
02

Pilih aplikasi

Aplikasi yang masih menyimpan konfigurasi YupiAI sudah tercentang otomatis. Space untuk mengubah pilihan, Enter untuk melanjutkan.
03

Konfirmasi

Layar terakhir menampilkan target dan tingkat pembersihannya sebelum ada satu file pun yang diubah.
04

Buka terminal baru

Variabel environment lama baru hilang di sesi terminal berikutnya. Restart juga aplikasi yang sedang berjalan.

Uninstaller hanya membuang entri YupiAI di konfigurasi tiap aplikasi dan variabel environment yang ditulis installer. Aplikasi seperti Claude Code, Codex, dan Continue tetap terpasang beserta pengaturan Anda.

Sebelum menulis file konfigurasi, uninstaller menyalinnya ke <file>.bak-YYYYmmdd-HHMMSS di folder yang sama. Untuk memulihkan, salin kembali file itu ke nama aslinya. Pengecualiannya auth.json di OpenCode dan Kilo Code serta kilo.db di Kilo Code. File tersebut tidak disalin agar API key YupiAI tidak tertinggal di backup; yang dihapus hanya entri YupiAI, key provider lain tetap ada.

Untuk melihat perubahan tanpa menerapkannya, jalankan mode dry-run:

macOS / Linux · dry-run
curl -fsSL https://gateway.euphy.cloud/uninstall.sh -o /tmp/yupiai-uninstall.sh
bash /tmp/yupiai-uninstall.sh --all --dry-run
Windows · dry-run
Invoke-WebRequest https://gateway.euphy.cloud/uninstall.ps1 -OutFile "$env:TEMP\yupiai-uninstall.ps1"
& "$env:TEMP\yupiai-uninstall.ps1" -All -DryRun

03. Model

Model dan Model ID

Katalog model dan tarifnya ada di halaman tersendiri, satu lembar data per model. Salin Model ID sesuai yang ditampilkan di sana.

Setiap lembar data memuat tarif terdaftar per kelas token, tarif efektif per beban kerja, batas akses per paket, dan potongan konfigurasi untuk tiap aplikasi. Model gambar dan video ada di tab Gambar dan Video pada katalog yang sama, dengan tarif per gambar, per megapiksel, atau per detik; cara memanggilnya ada di bagian Gambar & video.

Buka katalog model

04. Integrasi

Codex & Claude Code

Codex memakai Responses API, sedangkan Claude Code memakai Anthropic Messages. Ikuti konfigurasi yang sesuai.

Codex CLI, IDE extension, dan desktop

Daftarkan YupiAI di config.toml, lalu simpan API key sebagai environment variable.

Referensi: Referensi konfigurasi Codex

Edit file ~/.codex/config.toml pada macOS/Linux atau %USERPROFILE%\.codex\config.toml pada Windows.

config.toml
model = "yupiai-glm5.2"
model_provider = "yupiai"

[model_providers.yupiai]
name = "YupiAI Gateway"
base_url = "https://gateway.euphy.cloud/v1"
env_key = "YUPIAI_API_KEY"
env_key_instructions = "Masukkan API key YupiAI yang diawali yupi_ai_"
requires_openai_auth = false
supports_websockets = false
wire_api = "responses"
macOS / Linux
export YUPIAI_API_KEY="yupi_ai_xxxxxxxxxxxxxxxx"
codex
Windows PowerShell
[Environment]::SetEnvironmentVariable("YUPIAI_API_KEY", "yupi_ai_xxxxxxxxxxxxxxxx", "User")
# Tutup dan buka kembali terminal, lalu jalankan:
codex

Claude Code CLI & extension

Arahkan Anthropic Messages ke host gateway YupiAI.

Referensi: Panduan LLM gateway Claude Code

Edit ~/.claude/settings.json dan gabungkan nilai berikut ke object yang sudah ada.

settings.json
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://gateway.euphy.cloud",
    "ANTHROPIC_AUTH_TOKEN": "yupi_ai_xxxxxxxxxxxxxxxx",
    "ANTHROPIC_MODEL": "yupiai-glm5.2",
    "ANTHROPIC_CUSTOM_MODEL_OPTION": "yupiai-glm5.2",
    "ANTHROPIC_CUSTOM_MODEL_OPTION_NAME": "YupiAI yupiai-glm5.2",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "yupiai-glm5.2",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "yupiai-glm5.2",
    "ENABLE_TOOL_SEARCH": "false"
  }
}

Jangan gunakan format OpenAI di Claude Code

Claude Code membutuhkan endpoint Anthropic Messages. Base URL adalah host gateway tanpa /v1; token dikirim sebagai Bearer melalui ANTHROPIC_AUTH_TOKEN.

05. Integrasi

Cline, Roo Code & Kilo Code

Ketiga aplikasi mendukung provider OpenAI-compatible. Gunakan Base URL yang berakhir dengan /v1 dan Model ID dari katalog model.

Cline

Pilih OpenAI Compatible dari halaman provider, lalu verifikasi koneksi.

Referensi: Panduan OpenAI Compatible Cline

Buka Cline → Settings → API Provider. Isi nilai di atas, biarkan Azure Identity nonaktif, lalu klik Verify.

Roo Code

Buat API Configuration Profile dengan provider OpenAI Compatible.

Referensi: Panduan OpenAI Compatible Roo Code

01

Buka pengaturan provider

Di panel Roo Code, buka Settings lalu API Configuration Profile.
02

Pilih OpenAI Compatible

Isi Base URL https://gateway.euphy.cloud/v1 dan API key YupiAI.
03

Masukkan Model ID

Gunakan yupiai-glm5.2, simpan, lalu aktifkan profile.

Tool calling wajib

Roo Code hanya memakai native tool calling. Jika sebuah model tidak stabil saat menjalankan tool, ganti ke model YupiAI lain yang memang ditujukan untuk coding agent.

Kilo Code CLI

Daftarkan provider custom di konfigurasi global yang dipercaya, bukan di file proyek.

Referensi: Dokumentasi konfigurasi Kilo CLI

Edit ~/.config/kilo/kilo.jsonc. Referensi environment variable hanya diproses dari konfigurasi global yang dipercaya. Simpan API key ke YUPIAI_API_KEY di shell yang menjalankan Kilo; tanpa variabel itu, Kilo mengirim request tanpa API key.

kilo.jsonc
{
  "$schema": "https://app.kilo.ai/config.json",
  "model": "yupiai/yupiai-glm5.2",
  "provider": {
    "yupiai": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "YupiAI Gateway",
      "options": {
        "apiKey": "{env:YUPIAI_API_KEY}",
        "baseURL": "https://gateway.euphy.cloud/v1"
      },
      "models": {
        "yupiai-glm5.2": {
          "name": "YupiAI yupiai-glm5.2",
          "tool_call": true
        }
      }
    }
  }
}

06. Integrasi

Agent lokal

Gunakan format konfigurasi resmi setiap aplikasi. Mulai dari satu model, lalu uji koneksi sebelum menambahkan model lain.

Continue

Tambahkan model provider OpenAI ke config.yaml schema v1.

Referensi: Referensi config.yaml Continue

~/.continue/config.yaml
name: YupiAI
version: 1.0.0
schema: v1
models:
  - name: YupiAI yupiai-glm5.2
    provider: openai
    model: yupiai-glm5.2
    apiBase: https://gateway.euphy.cloud/v1
    apiKey: yupi_ai_xxxxxxxxxxxxxxxx
    roles:
      - chat
      - edit
      - apply
    capabilities:
      - tool_use

Simpan file, lalu gunakan pemilih model Continue untuk memilih nama YupiAI yang baru ditambahkan.

OpenClaw

Tambahkan provider melalui models.providers, lalu pilih model dengan format provider/model.

Referensi: Referensi model provider OpenClaw

Simpan API key ke environment variable, lalu gabungkan blok berikut ke ~/.openclaw/openclaw.json.

openclaw.json (JSON5)
{
  models: {
    mode: "merge",
    providers: {
      yupiai: {
        baseUrl: "https://gateway.euphy.cloud/v1",
        apiKey: "${YUPIAI_API_KEY}",
        api: "openai-completions",
        models: [{ id: "yupiai-glm5.2", name: "YupiAI yupiai-glm5.2" }]
      }
    }
  },
  agents: {
    defaults: {
      model: { primary: "yupiai/yupiai-glm5.2" },
      models: { "yupiai/yupiai-glm5.2": {} }
    }
  }
}
Validasi
openclaw config validate
openclaw models set yupiai/yupiai-glm5.2
openclaw models list

Hermes Agent

Gunakan provider custom OpenAI-compatible.

Referensi: Dokumentasi provider Hermes Agent

Cara paling aman adalah menjalankan hermes model, pilih Custom Endpoint, lalu isi Base URL, key, dan model. Konfigurasi file ekuivalennya:

~/.hermes/config.yaml
model:
  default: "yupiai-glm5.2"
  provider: "custom"
  base_url: "https://gateway.euphy.cloud/v1"
  api_key: "yupi_ai_xxxxxxxxxxxxxxxx"

Batas context Hermes

Hermes saat ini mensyaratkan model dengan context window minimal 64K untuk alur agent. Pilih model YupiAI yang memenuhi kebutuhan tersebut.

Goose

Buat custom provider. Nilai base_url harus berupa endpoint chat/completions lengkap.

Referensi: Panduan custom provider Goose

Buat file yupiai.json di folder ~/.config/goose/custom_providers/. Di Windows gunakan %APPDATA%\Block\goose\config\custom_providers\.

yupiai.json
{
  "name": "yupiai",
  "engine": "openai",
  "display_name": "YupiAI Gateway",
  "description": "YupiAI OpenAI-compatible gateway",
  "api_key_env": "YUPIAI_API_KEY",
  "base_url": "https://gateway.euphy.cloud/v1/chat/completions",
  "models": [{ "name": "yupiai-glm5.2" }],
  "supports_streaming": true,
  "requires_auth": true
}
Jalankan
export YUPIAI_API_KEY="yupi_ai_xxxxxxxxxxxxxxxx"
goose session start --provider yupiai

OpenHands

Isi provider, model, API key, dan Base URL melalui Settings.

Referensi: Dokumentasi LLM OpenHands

Buka Settings → LLM. Isi provider, model, dan key; buka Advanced untuk Base URL. OpenHands menggunakan LiteLLM, sehingga prefix openai/ pada model diperlukan untuk endpoint OpenAI-compatible.

07. Integrasi

Aplikasi chat

LibreChat dan Chatbox mendukung endpoint OpenAI-compatible. Perhatikan perbedaan antara API Host dan API Path.

LibreChat

Daftarkan YupiAI sebagai custom endpoint di librechat.yaml.

Referensi: Referensi custom endpoint LibreChat

.env
YUPIAI_API_KEY=yupi_ai_xxxxxxxxxxxxxxxx
librechat.yaml
version: 1.3.5
cache: true
endpoints:
  custom:
    - name: "YupiAI"
      apiKey: "${YUPIAI_API_KEY}"
      baseURL: "https://gateway.euphy.cloud/v1"
      models:
        default: ["yupiai-glm5.2"]
        fetch: true
      titleConvo: true
      titleModel: "yupiai-glm5.2"
      modelDisplayLabel: "YupiAI"

Untuk Docker, mount librechat.yaml ke container API, lalu restart LibreChat. Opsi fetch: true mengambil katalog model dari YupiAI.

Chatbox

Isi API Host dan API Path secara terpisah agar /v1 tidak ditulis dua kali.

Referensi: Panduan provider Chatbox

Buka Settings → Model Provider → Add. Setelah menyimpan provider dan model, klik Check untuk menguji koneksi.

08. Gambar

Buat gambar

Kirim prompt, terima gambar sebagai base64. Endpoint ini juga tersedia di /v1/images/generations, jalur yang dipakai OpenAI SDK images.generate(), sehingga SDK itu cukup diarahkan ke base URL YupiAI.

Model yang dipakai harus menghasilkan gambar. Cari Model ID di katalog model pada tab Gambar, atau lewat GET /v1/images/models.

Terminal
curl -sS https://gateway.euphy.cloud/v1/images \
  -H "Authorization: Bearer $YUPIAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "image-model-id",
    "prompt": "kucing oranye tidur di ambang jendela, cahaya pagi",
    "n": 1,
    "aspect_ratio": "16:9"
  }' > response.json

# Simpan gambar pertama
jq -r '.data[0].b64_json' response.json | base64 --decode > gambar.png

Parameter

modelstringwajib
Model ID gambar.
promptstringwajib
Deskripsi gambar, maksimal 32.000 karakter.
ninteger
Jumlah gambar, 1 sampai batas model (maksimal 10). Penyedia bisa mengembalikan lebih sedikit; yang ditagih hanya gambar yang diterima.
sizestring
Tier ukuran (512, 1K, 2K, 4K) atau piksel WIDTHxHEIGHT, misalnya 1536x1024. width dan height diterima sebagai bentuk lain dari size.
resolutionstring
512, 1K, 2K, atau 4K.
aspect_ratiostring
Rasio W:H, misalnya 16:9 atau 1:1.
qualitystring
auto, low, medium, high, xhigh, atau max, sesuai yang didukung model.
output_formatstring
png, jpeg, webp, atau svg.
output_compressioninteger
0 sampai 100, untuk jpeg dan webp.
backgroundstring
auto, transparent, atau opaque. transparent membutuhkan output_format png atau webp.
seedinteger
Untuk hasil yang bisa diulang, bila model mendukungnya.
input_referencesarray
Gambar referensi untuk edit lewat JSON: [{ "type": "image_url", "image_url": { "url": "https://..." } }]. URL harus https atau http publik, atau data URL base64.
streamboolean
Kirim gambar parsial lewat Server-Sent Events, hanya pada model yang mendukung streaming. Model lain menjawab biasa.
response_formatstring
Hanya b64_json. Gateway tidak menyimpan gambar, jadi tidak ada URL.
negative_prompt, guidance, stepsstring, number
Diteruskan ke penyedia model yang menerimanya; ditolak bila tidak ada yang menerima.
provider.optionsobject
Parameter khusus penyedia: { "<provider_slug>": { ... } }.

Parameter yang diterima berbeda per model. Parameter yang tidak dikenal, atau tidak didukung model, ditolak dengan 400 yang menyebut namanya, sebelum kredit ditahan.

Response

200 · application/json
{
  "created": 1790000000,
  "data": [
    {
      "b64_json": "iVBORw0KGgoAAAANSUhEUgAA",
      "media_type": "image/png"
    }
  ],
  "usage": {
    "prompt_tokens": 0,
    "completion_tokens": 0,
    "total_tokens": 0,
    "cost": 40000,
    "cost_details": {
      "billing_source": "provider_cost",
      "is_estimate": false,
      "reserved_credits": 42000
    },
    "balance": {
      "before": 10000000,
      "after": 9960000,
      "reserved_credits": 42000
    }
  }
}
data[].b64_jsonstring
Gambar dalam base64.
data[].media_typestring
Format gambar, misalnya image/png.
usage.costnumber
Kredit yang ditagih untuk request ini.
usage.cost_detailsobject
billing_source, is_estimate, dan reserved_credits (kredit yang ditahan sebelum generasi).
usage.balanceobject
Saldo sebelum dan sesudah request.
x-yupiai-request-idheader
Id request, bisa dipakai di GET /v1/generation?id=.

Sumber tagihan

provider_costnormal
Tagihan adalah biaya generasi yang dilaporkan penyedia, dalam kredit.
estimateestimasi
Biaya dari penyedia tidak tersedia. Tagihan dihitung dari tarif model dan tidak pernah melebihi kredit yang ditahan. is_estimate bernilai true.
not_billedgratis
Generasi gagal atau ditolak dan tidak ditagih. Kredit yang ditahan kembali penuh.
pendingsementara
Tagihan final belum ditetapkan. Nilai cost sementara; cek lagi lewat GET /v1/generation?id=.

Streaming

Dengan "stream": true pada model yang mendukungnya, response berupa Server-Sent Events: beberapa event image_generation.partial_image berisi pratinjau, lalu satu image_generation.completed berisi gambar akhir dan usage dalam kredit, lalu data: [DONE]. Pratinjau tidak ditagih.

Request yang aman diulang

Kirim header Idempotency-Key berisi string unik per gambar. Bila request yang sama terkirim dua kali, yang kedua tidak diproses dan tidak ditagih, tetapi dijawab 409 idempotent_replay karena gambar tidak disimpan. Gunakan key baru untuk gambar baru.

09. Gambar

Edit gambar

Unggah satu atau beberapa gambar beserta instruksi, terima gambar hasil edit. Bentuk request-nya multipart/form-data, sama dengan OpenAI SDK images.edit().

Hanya model yang menerima gambar masukan. Di katalog, model ini tertulis bisa edit, beserta batas jumlah gambarnya.

Terminal
curl -sS https://gateway.euphy.cloud/v1/images/edits \
  -H "Authorization: Bearer $YUPIAI_API_KEY" \
  -F model="image-model-id" \
  -F prompt="ganti latar menjadi pantai saat senja" \
  -F "image[]=@produk.png" \
  -F "image[]=@logo.png" > response.json

jq -r '.data[0].b64_json' response.json | base64 --decode > hasil.png

Field form

modeltextwajib
Model ID yang bisa edit gambar.
prompttextwajib
Instruksi edit, maksimal 32.000 karakter.
imagefilewajib
Gambar yang diedit. Untuk beberapa gambar, ulangi field image[] (atau image). Batas jumlahnya mengikuti model, maksimal 16.
n, size, resolution, aspect_ratio, quality, output_format, output_compression, background, seedtext
Sama dengan POST /v1/images. Angka dikirim sebagai teks, misalnya n=2.
streamtext
true atau false, untuk model yang mendukung streaming.
response_formattext
Hanya b64_json.
negative_prompt, guidance, stepstext
Diteruskan ke penyedia model yang menerimanya.

Batasan file

File harus PNG, JPEG, atau WebP. Jenisnya dibaca dari isi file, bukan dari nama atau Content-Type yang dikirim. Total unggahan maksimal 20 MB per request; kompres gambar besar sebelum dikirim. Gambar masukan ikut ditagih bila tarif model mencantumkannya.

mask tidak didukung

Penyedia model di gateway ini tidak menerima mask. Request dengan field mask ditolak dengan 400 unsupported_parameter tanpa potongan kredit. Jelaskan bagian yang ingin diubah di prompt.

Response-nya sama dengan Buat gambar. Endpoint ini hanya menerima multipart; body JSON dijawab 415 unsupported_media_type. Untuk edit lewat JSON, kirim gambar sebagai input_references ke POST https://gateway.euphy.cloud/v1/images.

10. Video

Buat video

Pembuatan video berjalan di latar belakang. Kirim request, simpan id job, pantau statusnya, lalu unduh video setelah selesai.

01

Buat job

POST https://gateway.euphy.cloud/v1/videos menjawab 202 dengan id dan polling_url. Kredit ditahan saat job dibuat.
02

Pantau status

Panggil GET https://gateway.euphy.cloud/v1/videos/{id} kira-kira tiap 30 detik sampai status completed, failed, cancelled, atau expired.
03

Unduh hasil

Saat completed, unsigned_urls berisi URL unduhan di gateway. Unduh dengan API key yang sama, lalu simpan filenya.
Terminal
# 1. Buat job
curl -sS https://gateway.euphy.cloud/v1/videos \
  -H "Authorization: Bearer $YUPIAI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: video-senja-001" \
  -d '{
    "model": "video-model-id",
    "prompt": "ombak pelan di pantai saat senja, kamera bergerak ke kiri",
    "duration": 8,
    "resolution": "1080p",
    "aspect_ratio": "16:9"
  }'

# 2. Pantau status dengan id dari langkah 1
curl -sS https://gateway.euphy.cloud/v1/videos/ID_JOB -H "Authorization: Bearer $YUPIAI_API_KEY"

# 3. Unduh setelah status completed
curl -sS -o video.mp4 "https://gateway.euphy.cloud/v1/videos/ID_JOB/content?index=0" \
  -H "Authorization: Bearer $YUPIAI_API_KEY"

Parameter

modelstringwajib
Model ID video.
promptstring
Deskripsi video. Wajib, kecuali request membawa frame_images atau input_references.
durationinteger
Durasi dalam detik, salah satu yang didukung model. Bila kosong, gateway memakai default_duration model, jadi harga sudah pasti sebelum job berjalan.
resolutionstring
Misalnya 720p atau 1080p, sesuai model.
aspect_ratiostring
Misalnya 16:9 atau 9:16.
sizestring
Piksel WIDTHxHEIGHT, misalnya 1280x720.
frame_imagesarray
Frame awal atau akhir: [{ "type": "image_url", "image_url": { "url": "..." }, "frame_type": "first_frame" }]. first_frame atau last_frame, masing-masing sekali.
input_referencesarray
Referensi gambar, video, atau audio (image_url, video_url, audio_url).
generate_audioboolean
Minta audio, pada model yang bisa menghasilkannya.
seedinteger
Untuk hasil yang bisa diulang, bila model mendukungnya.
previous_job_idstring
Melanjutkan video milik Anda yang sudah completed, dari model yang sama.
provider.optionsobject
Parameter khusus penyedia.

Status job

pending
Job sudah diterima dan menunggu diproses.
in_progress
Video sedang dibuat.
completed
Selesai. unsigned_urls berisi URL unduhan. usage muncul setelah tagihan final; bila belum ada, cek lagi sebentar kemudian.
failed
Gagal. Field error berisi alasannya.
cancelled
Dibatalkan penyedia.
expired
Tidak selesai dalam batas waktu penyedia.
202 · job dibuat
{
  "id": "gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
  "polling_url": "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
  "status": "pending"
}
200 · GET /v1/videos/{id} saat selesai
{
  "id": "gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
  "polling_url": "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
  "status": "completed",
  "unsigned_urls": [
    "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp/content?index=0"
  ],
  "usage": {
    "cost": 3200000,
    "cost_details": {
      "billing_source": "provider_cost",
      "is_estimate": false
    }
  }
}
200 · GET /v1/videos/{id} saat gagal
{
  "id": "gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
  "polling_url": "https://gateway.euphy.cloud/v1/videos/gen-vid-1790000000-Ab3dEf9hIjKlMnOp",
  "status": "failed",
  "usage": {
    "cost": 0,
    "cost_details": {
      "billing_source": "not_billed",
      "is_estimate": false
    }
  },
  "error": "Video generation failed"
}

Tagihan video

Kredit ditahan saat job dibuat, sesuai durasi dan resolusi yang diminta. Tagihan final ditetapkan satu kali saat job berakhir, berapa kali pun status dipantau. Job yang gagal, dibatalkan, atau kedaluwarsa tanpa biaya dari penyedia tidak ditagih, dan kredit yang ditahan kembali penuh.

Simpan video segera

GET https://gateway.euphy.cloud/v1/videos/{id}/content mendukung header Range. File hanya tersedia selama penyedia menyimpannya; setelah itu jawabannya 410 content_expired.

Kirim ulang POST /v1/videos dengan Idempotency-Key yang sama saat koneksi terputus: jawabannya job yang sama, tanpa render dan tagihan kedua. Id job milik akun lain dijawab 404, sama seperti id yang tidak ada.

11. Model

Model gambar dan video

Dua endpoint ini mendaftar model yang bisa dipanggil API key Anda, beserta parameter yang diterima dan tarifnya dalam kredit.

Model gambar: capabilities (image_generation, image_editing, streaming), supported_parameters, dan pricing dalam kredit per unit.

Model video: capabilities, supported_durations, default_duration, supported_resolutions, supported_aspect_ratios, generate_audio, dan pricing_skus dalam kredit.

GET https://gateway.euphy.cloud/v1/models juga menyertakan capabilities untuk setiap model. Tarif yang sama tampil di katalog model pada tab Gambar dan Video.

endpoint per kemampuan

text
/v1/chat/completions, /v1/messages, /v1/responses
image_generation
POST /v1/images
image_editing
POST /v1/images/edits, atau POST /v1/images dengan input_references
video_generation
POST /v1/videos
speech_generation
POST /v1/audio/speech
transcription
POST /v1/audio/transcriptions
audio_input, audio_output
/v1/chat/completions dengan input_audio, atau modalities ["text", "audio"]

Model yang dipanggil di endpoint yang tidak dilayaninya dijawab 400 unsupported_capability, dan pesannya menyebut endpoint yang benar. Tidak ada kredit yang dipotong.

12. Error

Error gambar dan video

Amplop error sama dengan endpoint lain. Semua error sebelum kredit ditahan tidak memotong saldo.

status · code

400 · unsupported_capability
Model tidak menghasilkan output yang diminta, misalnya model teks di /v1/images atau model tanpa gambar masukan di /v1/images/edits.
400 · unsupported_parameter
Parameter tidak dikenal atau tidak didukung model (termasuk mask). error.param menyebut namanya.
400 · invalid_parameter
Nilai parameter tidak valid, misalnya durasi yang tidak didukung atau jumlah gambar di atas batas model.
400 · missing_required_parameter
model, prompt, atau image tidak dikirim.
400 · invalid_image_typeedits
File bukan PNG, JPEG, atau WebP.
400 · invalid_multipartedits
Body multipart/form-data rusak atau terlalu banyak field.
413 · request_too_large
Body terlalu besar. Untuk edits, total unggahan maksimal 20 MB.
415 · unsupported_media_typeedits
Body bukan multipart/form-data.
402 · insufficient_quota
Saldo tidak cukup untuk kredit yang harus ditahan.
404 · not_foundvideo
Job tidak ada pada akun ini.
409 · idempotent_replay
Idempotency-Key sudah dipakai untuk request gambar yang sama.
409 · idempotency_key_reused
Idempotency-Key sudah dipakai untuk request dengan isi berbeda.
409 · idempotent_request_in_progressvideo
Request dengan key itu masih diproses. Ulangi sesuai retry-after.
409 · generation_not_readyvideo
Video belum selesai; pantau status dulu.
410 · content_expiredvideo
File video sudah tidak tersedia di penyedia.
429 · rate_limit_exceeded
Terlalu banyak request atau polling. Ikuti header retry-after.
429 · provider_rate_limited
Penyedia sedang membatasi request. Tidak ada kredit yang dipotong.
502 · generation_failed
Penyedia tidak mengembalikan hasil. Tidak ditagih kecuali penyedia menagih generasinya.
502 / 504 · provider_error, provider_timeout
Penyedia gagal atau tidak menjawab. Bila penyedia mungkin masih bekerja, kredit tetap ditahan sampai hasilnya pasti, lalu dikembalikan bila tidak ditagih.
503 · provider_unavailable, model_pricing_unavailable
Model sementara tidak bisa dilayani. Ulangi beberapa saat lagi.
contoh · 400 model tidak bisa edit
{
  "error": {
    "message": "Model image-model-id tidak mendukung edit gambar. Gunakan endpoint /v1/images. Tidak ada kredit yang dipotong.",
    "type": "invalid_request_error",
    "param": "model",
    "code": "unsupported_capability"
  }
}

13. Audio

Teks ke suara

Kirim teks, terima audio mentah dalam mp3 atau pcm. Jalur dan bentuk request sama dengan audio.speech.create() di OpenAI SDK, jadi SDK itu cukup diarahkan ke base URL YupiAI.

Model harus menghasilkan suara. Daftar model, pilihan suara, dan tarifnya ada di GET /v1/audio/models atau katalog model pada tab Audio.

Terminal
curl -sS https://gateway.euphy.cloud/v1/audio/speech \
  -H "Authorization: Bearer $YUPIAI_API_KEY" \
  -H "Content-Type: application/json" \
  -D headers.txt \
  --output suara.mp3 \
  -d '{
    "model": "tts-model-id",
    "input": "Selamat pagi, pesanan Anda sudah dikirim.",
    "voice": "ID_SUARA",
    "response_format": "mp3"
  }'

# Request id untuk mengecek tagihan final
grep -i x-yupiai-request-id headers.txt

Parameter

modelstringwajib
Model ID text-to-speech.
inputstringwajib
Teks yang diucapkan, maksimal 10.000 karakter per request. Pecah teks yang lebih panjang.
voicestring
ID suara. Model yang punya daftar suara (voices di GET /v1/audio/models) hanya menerima suara dari daftar itu. Sebagian penyedia mewajibkan voice.
response_formatstring
mp3 atau pcm. Bila tidak dikirim, penyedia memakai pcm. OpenAI SDK tidak mengirim field ini secara default, jadi tulis response_format secara eksplisit.
speednumber
0.25 sampai 4. Hanya dipakai model yang mendukungnya; model lain mengabaikannya.
input_referencesarray
Kloning suara, khusus model dengan voice_cloning: satu part input_audio berisi sampel suara (base64 atau data URI, maksimal 15 MB) dan paling banyak satu part text berisi transkripnya.
provider.optionsobject
Parameter khusus penyedia, dikelompokkan per slug penyedia, misalnya gaya bicara. Maksimal 8 KB.

Respons

Body berisi byte audio apa adanya dari penyedia, tanpa JSON dan tanpa konversi format. Content-Type bernilai audio/mpeg untuk mp3, atau audio/pcm;rate=24000;channels=1 untuk pcm (16-bit little-endian). Header x-yupiai-request-id adalah id yang diterima GET https://gateway.euphy.cloud/v1/generation?id=.

Memutar pcm

pcm tidak punya header, jadi pemutar biasa tidak mengenalinya. Bungkus menjadi WAV dengan ffmpeg -f s16le -ar 24000 -ac 1 -i suara.pcm suara.wav, atau pakai mp3.

Respons audio tidak membawa biaya. Penyedia mencatat biayanya beberapa detik setelah audio selesai, lalu gateway menagih angka itu. Cek tagihan final lewat GET https://gateway.euphy.cloud/v1/generation?id=REQUEST_ID.

14. Audio

Transkripsi

Ubah rekaman menjadi teks. Endpoint ini menerima upload multipart seperti audio.transcriptions.create() di OpenAI SDK, dan JSON dengan audio base64.

multipart/form-data dengan field file (maksimal 25 MB), atau JSON dengan input_audio (body maksimal 16 MB).

Terminal · multipart
curl -sS https://gateway.euphy.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer $YUPIAI_API_KEY" \
  -F model="stt-model-id" \
  -F language="id" \
  -F file=@rekaman.mp3

Parameter

modelstringwajib
Model ID transkripsi.
filefilemultipart
Satu file audio, maksimal 25 MB. Format dibaca dari isi file; nama file dan tipe MIME dari klien diabaikan.
input_audioobjectJSON
{ "data": base64, "format": "wav" }. Data URI juga diterima. Format dibaca dari isi audio, jadi format yang salah tulis tetap terkirim dengan benar.
languagestring
Kode ISO-639-1, misalnya id atau en. Bila kosong, penyedia mendeteksi bahasa sendiri.
temperaturenumber
0 sampai 1.
response_formatstring
json (default) atau verbose_json. verbose_json menambah language, duration, segments, dan words bila penyedia mendukungnya. text, srt, dan vtt tidak didukung penyedia.
timestamp_granularitiesarray
word dan/atau segment. Hanya berlaku dengan verbose_json. Di multipart, kirim sebagai timestamp_granularities[].
promptstring
Diterima agar kode OpenAI SDK tetap jalan, tetapi tidak diteruskan karena penyedia mengabaikannya.
provider.optionsobjectJSON
Parameter khusus penyedia per slug, misalnya diarisasi pembicara.

Format yang didukung: wav, mp3, flac, m4a, ogg (opus atau vorbis), webm, dan aac. Penyedia menghentikan pemrosesan setelah sekitar 60 detik, jadi rekaman yang sangat panjang lebih aman dipecah.

Respons

usage.cost adalah kredit yang ditagih. usage.seconds atau usage.input_tokens dan usage.output_tokens berasal dari penyedia, sesuai cara model itu ditarif.

200 · model bertarif per durasi
{
  "text": "Selamat pagi, ini adalah uji coba suara singkat.",
  "usage": {
    "seconds": 3.92,
    "cost": 13.0536,
    "cost_details": {
      "billing_source": "provider_cost",
      "is_estimate": false,
      "reserved_credits": 138.888889
    },
    "balance": {
      "before": 1000000,
      "after": 999986.9464,
      "reserved_credits": 138.888889
    }
  }
}
200 · model bertarif per token
{
  "text": "Hello there, this is a short speech test for the gateway.",
  "usage": {
    "total_tokens": 48,
    "input_tokens": 33,
    "output_tokens": 15,
    "cost": 116.25,
    "cost_details": {
      "billing_source": "provider_cost",
      "is_estimate": false,
      "reserved_credits": 267.5
    },
    "balance": {
      "before": 1000000,
      "after": 999883.75,
      "reserved_credits": 267.5
    }
  }
}

15. Audio

Audio di chat

Model chat tertentu bisa mendengar audio dan menjawab dengan suara lewat /v1/chat/completions. Lihat capabilities.audio_input dan capabilities.audio_output di GET /v1/models.

Audio sebagai input

Tambahkan part input_audio di pesan user. Audio dikirim sebagai base64 beserta formatnya; URL audio tidak didukung penyedia.

request · input_audio
{
  "model": "chat-audio-model-id",
  "messages": [{
    "role": "user",
    "content": [
      { "type": "text", "text": "Ringkas isi rekaman ini." },
      { "type": "input_audio", "input_audio": { "data": "UklGRiQA...", "format": "wav" } }
    ]
  }]
}

Jawaban berupa suara

Kirim modalities: ["text", "audio"] dan audio: { voice, format } dengan format wav, mp3, flac, opus, aac, atau pcm16. Penyedia hanya mengirim audio lewat stream, jadi stream: true wajib. Potongan audio datang di choices[0].delta.audio.data (base64) dan teksnya di delta.audio.transcript. Output audio hanya tersedia di endpoint ini, tidak di /v1/messages atau /v1/responses.

Python 3 · OpenAI SDK
import base64
import os
from openai import OpenAI

client = OpenAI(base_url="https://gateway.euphy.cloud/v1", api_key=os.environ["YUPIAI_API_KEY"])

stream = client.chat.completions.create(
    model="chat-audio-model-id",
    modalities=["text", "audio"],
    audio={"voice": "alloy", "format": "pcm16"},
    stream=True,
    messages=[{"role": "user", "content": "Sapa pelanggan dengan ramah."}],
)

pcm = bytearray()
for chunk in stream:
    if chunk.choices:
        audio = getattr(chunk.choices[0].delta, "audio", None) or {}
        if audio.get("data"):
            pcm += base64.b64decode(audio["data"])
    if chunk.usage:
        print("kredit:", chunk.usage.cost)

open("jawaban.pcm", "wb").write(pcm)

16. Audio

Tagihan audio

Audio ditagih sebesar biaya yang dilaporkan penyedia, dalam kredit. Satuan tarifnya berbeda per model: karakter atau token untuk suara, detik audio atau token untuk transkripsi.

Alur tagihan

Sebelum request dikirim, gateway menahan kredit dari tarif model: panjang teks untuk teks ke suara, dan durasi yang dibaca dari file audio untuk transkripsi. Durasi dibaca dari isi file, bukan dari keterangan klien, dan tidak pernah dianggap lebih pendek dari yang dimungkinkan ukuran file. Transkripsi ditahan minimal 10 detik karena sebagian penyedia menagih minimal 10 detik per request.

Setelah request selesai, tagihan adalah biaya yang dilaporkan penyedia untuk request itu, dan sisa kredit yang ditahan kembali ke saldo. Request yang gagal atau ditolak tanpa biaya tidak ditagih. Bila klien memutus stream suara di tengah jalan, tagihan mengikuti biaya yang dicatat penyedia: nol bila audio belum dibuat.

Untuk audio di chat, token audio masuk dan keluar dihitung penyedia dengan tarif audio model, dan usage.cost di akhir stream adalah tagihannya.

usage.cost_details.billing_source

provider_costnormal
Tagihan adalah biaya yang dilaporkan penyedia untuk request itu, dalam kredit.
estimateestimasi
Biaya dari penyedia tidak pernah tersedia. Tagihan dihitung dari durasi atau jumlah karakter yang diukur penyedia dan tarif model, tidak pernah melebihi kredit yang ditahan, dan ditandai is_estimate true.
not_billedgratis
Request gagal atau ditolak penyedia tanpa biaya. Kredit yang ditahan kembali penuh.
pendingsementara
Biaya final belum tercatat. Cek lagi lewat GET /v1/generation?id=.

GET https://gateway.euphy.cloud/v1/generation?id= menampilkan modality: "audio" dan usage_details: jumlah detik audio, karakter, atau token audio yang diukur penyedia. Tab Log di dashboard menampilkan angka yang sama.

Model audio

Model teks ke suara dan transkripsi yang bisa dipanggil API key Anda: type, endpoint, voices, voice_cloning, response_formats atau input_formats, dan pricing dalam kredit per satuan. Tambahkan ?type=speech atau ?type=transcription untuk menyaring.

17. Audio

Error audio

Amplop error sama dengan endpoint lain. Semua error sebelum kredit ditahan tidak memotong saldo.

status · code

400 · unsupported_capability
Model tidak melayani endpoint ini, misalnya model transkripsi di /v1/audio/speech, atau model chat tanpa output audio yang diminta menjawab dengan suara.
400 · unsupported_parameter
Parameter tidak didukung, misalnya response_format wav di speech, srt di transkripsi, instructions, stream_format, atau stream pada transkripsi. error.param menyebut namanya.
400 · invalid_parameter
Nilai tidak valid: voice di luar daftar model, speed, language, temperature, timestamp_granularities tanpa verbose_json, atau output audio di chat tanpa stream: true.
400 · missing_required_parameter
model, input, file, atau input_audio tidak dikirim.
400 · invalid_audio
Isi file bukan audio yang dikenali, atau base64 rusak.
400 · unsupported_audio_formattranskripsi
File audio dikenali tetapi formatnya tidak diterima penyedia transkripsi, misalnya AIFF.
400 · invalid_multipart
Body multipart rusak, field teks berisi file, atau terlalu banyak field.
413 · request_too_large
Upload lebih dari 25 MB, body JSON lebih dari 16 MB, atau sampel suara lebih dari 15 MB.
415 · unsupported_media_typetranskripsi
Body bukan multipart/form-data atau JSON.
402 · insufficient_quota
Saldo tidak cukup untuk kredit yang harus ditahan.
403 · model_not_found, model_not_permitted
Model tidak terdaftar, tidak aktif, atau di luar tier Anda.
409 · idempotent_replay
Idempotency-Key sudah dipakai untuk request yang sama. Gateway tidak menyimpan audio atau transkrip; kirim key baru.
409 · idempotency_key_reused
Idempotency-Key sudah dipakai untuk request dengan isi berbeda.
429 · rate_limit_exceeded, provider_rate_limited
Terlalu banyak request, di gateway atau di penyedia. Ikuti header retry-after. Tidak ada kredit yang dipotong.
502 · generation_failed
Penyedia menjawab tanpa audio atau tanpa transkrip. Tidak ditagih kecuali penyedia menagihnya.
502 / 504 · provider_error, provider_timeout
Penyedia gagal atau tidak menjawab. Bila penyedia mungkin sudah memproses, kredit tetap ditahan sampai hasilnya pasti, lalu dikembalikan bila tidak ditagih.
503 · provider_unavailable, model_pricing_unavailable
Model sementara tidak bisa dilayani, atau tarifnya belum tersinkron. Ulangi beberapa saat lagi.
contoh · 400 suara tidak tersedia
{
  "error": {
    "message": "voice nova tidak tersedia untuk model ini. Contoh yang tersedia: af_heart, am_adam. Daftar lengkap ada di GET /v1/audio/models.",
    "type": "invalid_request_error",
    "param": "voice",
    "code": "invalid_parameter"
  }
}

Retry yang aman

Gateway pindah ke API key lain hanya bila penyedia menolak request secara utuh tanpa memprosesnya. Koneksi yang putus setelah request terkirim tidak diulang, karena audio bisa sudah dibuat dan ditagih. Untuk mengulang dari sisi klien tanpa risiko tagihan ganda, kirim header Idempotency-Key.

18. Quick start

Quick start usage & billing

Alur dasar dari request pertama sampai laporan pemakaian. Semua endpoint di bagian ini memakai API key yang sama dengan inference, hanya membaca data milik akun pemilik key, dan tidak memotong kredit.

01

Siapkan API key

Buat key di Dashboard atau pakai key yang ada. Kirim di header Authorization: Bearer yupi_ai_.... Header x-api-key dan api-key juga diterima.
02

Kirim request inference

Panggil POST https://gateway.euphy.cloud/v1/chat/completions. Gateway menahan kredit (hold) sebelum meneruskan request, lalu menyesuaikannya setelah provider melaporkan pemakaian.
03

Baca token dan kredit dari response

Field usage berisi jumlah token dari provider ditambah cost, cost_details, dan balance. Header x-yupiai-request-id mengidentifikasi request.
04

Cek saldo

Panggil GET https://gateway.euphy.cloud/v1/credits. Field remaining_credits adalah saldo yang bisa dipakai.
05

Ambil statistik

Panggil GET https://gateway.euphy.cloud/v1/usage untuk ringkasan per model, provider, hari, dan key, atau GET https://gateway.euphy.cloud/v1/generation?id= untuk satu request.
Terminal · alur lengkap
# 1. Kirim request, simpan header dan body
curl -sS -D headers.txt https://gateway.euphy.cloud/v1/chat/completions \
  -H "Authorization: Bearer $YUPIAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "yupiai-glm5.2", "messages": [{ "role": "user", "content": "Halo" }] }' \
  | tee response.json

# 2. Kredit yang ditagih ada di usage.cost, request id di header
grep -i x-yupiai-request-id headers.txt

# 3. Saldo saat ini
curl -sS https://gateway.euphy.cloud/v1/credits -H "Authorization: Bearer $YUPIAI_API_KEY"

# 4. Statistik 30 hari terakhir
curl -sS https://gateway.euphy.cloud/v1/usage -H "Authorization: Bearer $YUPIAI_API_KEY"

19. Kredit

Token vs kredit

Token adalah satuan data yang diproses model. Kredit adalah satuan tagihan YupiAI. Setiap request dilaporkan dalam keduanya.

Dua satuan

Token
Dihitung provider dengan tokenizer model. Empat kelas: input baru, tulis cache, baca cache, dan output (termasuk reasoning). Gateway tidak mengubah angka token.
Kredit
Satuan saldo. Nilai dan pemakaian kredit dapat berbeda tergantung model yang digunakan serta pola penggunaan masing-masing user. Pemakaian dihitung berdasarkan jumlah token yang diproses dan harga atau multiplier token pada setiap model. Multiplier di katalog dinyatakan dalam kredit per token. Semua nominal di API dalam kredit.

Rumus harga token

Setiap model punya empat multiplier yang tercantum di katalog. Keempatnya di-snapshot ke reservasi saat request dibuat, sehingga perubahan tarif tidak memengaruhi request yang sedang berjalan.

Rumus
harga_token = (token_input_baru   × input_multiplier)
            + (token_tulis_cache  × cache_creation_multiplier)
            + (token_baca_cache   × cache_multiplier)
            + (token_output       × output_multiplier)

token_input_baru = prompt_tokens − cached_tokens − cache_write_tokens
token_output     = completion_tokens   # sudah termasuk reasoning_tokens

Contoh perhitungan

Multiplier: input 3, tulis cache 3,75, baca cache 0,3, output 15. Provider melaporkan 1.250 token prompt (1.000 cache hit) dan 450 token output (120 reasoning).

KelasToken× TarifKredit
Input baru2503750
Tulis cache03,750
Baca cache1.0000,3300
Output (termasuk 120 reasoning)450156.750
Harga token1.7007.800

Sumber tagihan

Harga token adalah harga tabel. Kredit yang dipotong dari saldo ditentukan oleh billing_source pada setiap request.

provider_costnormal
Provider melaporkan biaya request. Tagihan adalah biaya itu dalam kredit (contoh di atas: 7.790). Selisih terhadap harga tabel dicatat sebagai pricing_adjustment_credits (−10).
token_fallbackestimasi
Provider tidak melaporkan biaya yang kredibel. Tagihan adalah harga tabel, maksimal sebesar kredit yang di-hold. is_estimate bernilai true; nilai final ada di GET /v1/generation.
complimentarygratis
Paket free trial pada model free-trial. Semua kelas kredit 0; token tetap dicatat.

Cache dan reasoning

Tarif cache hanya berlaku pada token yang dilaporkan provider sebagai cache. Prompt yang berulang tidak otomatis menjadi cache hit. Token reasoning tidak punya tarif tersendiri: token tersebut termasuk dalam completion_tokens dan ditagih sebagai output.

20. Response

Usage dan kredit di response

Setiap response POST /v1/chat/completions menyertakan jumlah token dari provider dan laporan kredit YupiAI di field usage. Field kredit bersifat tambahan; client yang hanya membaca token tidak terpengaruh.

Field usage berikut ada di response non-streaming dan di chunk terakhir response streaming.

response · field usage
"usage": {
  "prompt_tokens": 1250,
  "completion_tokens": 450,
  "total_tokens": 1700,
  "prompt_tokens_details": {
    "cached_tokens": 1000,
    "cache_write_tokens": 0
  },
  "completion_tokens_details": {
    "reasoning_tokens": 120
  },
  "cost": 7790,
  "cost_details": {
    "input_credits": 750,
    "cache_write_credits": 0,
    "cache_read_credits": 300,
    "output_credits": 6750,
    "pricing_adjustment_credits": -10,
    "billing_source": "provider_cost",
    "is_estimate": false
  },
  "balance": {
    "before": 10000000,
    "after": 9992210,
    "reserved_credits": 66315
  }
}

usage

prompt_tokensnumber
Total token input, termasuk token cache.
completion_tokensnumber
Total token output, termasuk token reasoning.
total_tokensnumber
prompt_tokens + completion_tokens.
prompt_tokens_details.cached_tokensnumber
Token input yang dibaca dari cache.
prompt_tokens_details.cache_write_tokensnumber
Token input yang ditulis ke cache. Tidak semua provider melaporkannya.
completion_tokens_details.reasoning_tokensnumber
Token reasoning, bagian dari completion_tokens. Hanya ada jika provider melaporkannya.
costnumber
Total kredit yang ditagih. Menggantikan field cost provider yang berdenominasi USD.
cost_detailsobject
Kredit per kelas token, pricing_adjustment_credits, billing_source, dan is_estimate. Lihat Token vs kredit.
balance.beforenumber
Saldo tepat sebelum request ini menahan kredit.
balance.afternumber
before dikurangi cost. Berbeda dari saldo di ledger hanya jika request lain milik Anda settlement di antaranya.
balance.reserved_creditsnumber
Kredit yang ditahan untuk request ini. Dilepas saat settlement.

Response tanpa field usage

Jika provider tidak melaporkan usage, response tidak memiliki field usage. Gateway tidak mengarang jumlah token. Request tetap ditagih dari estimasi reservasi; nilai final tersedia di GET /v1/generation.

Header response

x-yupiai-request-idselalu
ID request gateway (UUID), ada di setiap response sukses termasuk streaming. Dipakai di GET /v1/generation?id=.
x-yupiai-costnon-streaming
Total kredit sebagai string desimal. Tidak ada pada response streaming karena biaya belum diketahui saat header dikirim.
header response · non-streaming
HTTP/1.1 200 OK
content-type: application/json
x-yupiai-request-id: 6f4d5e2c-9a1b-4c3d-8e7f-0a1b2c3d4e5f
x-yupiai-cost: 7790

Streaming

Kirim "stream": true. Gateway mengaktifkan stream_options.include_usage ke provider, sehingga tidak perlu parameter tambahan. Chunk konten diteruskan tanpa perubahan.

Usage dikirim satu kali di chunk terakhir sebelum data: [DONE]. Chunk itu membawa finish_reason dengan delta kosong, dan objek usage-nya sama dengan response non-streaming, termasuk cost, cost_details, dan balance.

SSE · dua event terakhir
data: {"id":"gen-1757671200-Ab3dEf9h","provider":"Anthropic","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":"stop"}],"usage":{"prompt_tokens":1250,"completion_tokens":450,"total_tokens":1700,"prompt_tokens_details":{"cached_tokens":1000,"cache_write_tokens":0},"completion_tokens_details":{"reasoning_tokens":120},"cost":7790,"cost_details":{"input_credits":750,"cache_write_credits":0,"cache_read_credits":300,"output_credits":6750,"pricing_adjustment_credits":-10,"billing_source":"provider_cost","is_estimate":false},"balance":{"before":10000000,"after":9992210,"reserved_credits":66315}}}

data: [DONE]
openai SDK · membaca usage di akhir stream
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://gateway.euphy.cloud/v1",
  apiKey: process.env.YUPIAI_API_KEY,
});

const stream = await client.chat.completions.create({
  model: "yupiai-glm5.2",
  messages: [{ role: "user", content: "Halo" }],
  stream: true,
});

for await (const chunk of stream) {
  const text = chunk.choices[0]?.delta?.content;
  if (text) process.stdout.write(text);
  if (chunk.usage) {
    // Chunk terakhir. Field kredit adalah tambahan YupiAI di luar tipe SDK;
    // di TypeScript, cast: chunk.usage as typeof chunk.usage & { cost: number; cost_details: any; balance: any }
    const usage = chunk.usage;
    console.log("\ntoken :", usage.total_tokens);
    console.log("kredit:", usage.cost, usage.cost_details.billing_source);
    console.log("saldo :", usage.balance.after);
  }
}

Jika client menutup koneksi sebelum stream selesai, chunk usage tidak terkirim. Request tetap settlement dari token yang sudah terkirim, dengan outcome: cancelled, dan dapat dibaca di GET /v1/generation.

Endpoint Anthropic dan Responses

Body POST /v1/messages (Claude Code) dan POST /v1/responses (Codex) mengikuti skema vendor tanpa field tambahan, karena SDK di sisi itu melakukan validasi ketat. Jumlah token ada di field usage masing-masing dialek.

Kredit dibaca dari header x-yupiai-cost (non-streaming) atau dari GET /v1/generation dengan header x-yupiai-request-id. Pada response non-streaming, id body (msg_... atau resp_...) juga diterima. Pada streaming, kedua dialek membuat id sendiri, sehingga hanya header yang berlaku.

21. Saldo

Cek saldo kredit

Gunakan endpoint ini untuk membaca saldo kredit akun pemilik API key.

Autentikasi dengan API key di header Authorization: Bearer, x-api-key, atau api-key. Tidak ada parameter.

Terminal
curl -sS https://gateway.euphy.cloud/v1/credits \
  -H "Authorization: Bearer $YUPIAI_API_KEY"
response · 200
{
  "data": {
    "total_credits": 10000000,
    "total_usage": 1550000,
    "remaining_credits": 8450000,
    "reserved_credits": 66315,
    "pending_requests": 1,
    "tier": "pro",
    "expires_at": "2026-10-12T00:00:00+00:00",
    "cycle_started_at": "2026-09-12T00:00:00+00:00",
    "is_expired": false
  }
}

data

total_creditsnumber
Total kredit pada siklus pembelian saat ini.
total_usagenumber
Kredit yang sudah keluar dari siklus ini, termasuk yang sedang ditahan.
remaining_creditsnumber
Saldo yang bisa dipakai. total_credits dikurangi total_usage.
reserved_creditsnumber
Bagian total_usage yang ditahan untuk request yang belum settlement.
pending_requestsnumber
Jumlah request yang masih menahan kredit.
tierstring
Paket aktif: free_trial, starter, pro, business, atau user (tanpa paket).
expires_atstring | null
Akhir masa aktif paket, ISO 8601.
cycle_started_atstring | null
Awal siklus pembelian saat ini.
is_expiredboolean
true jika masa aktif sudah lewat. Endpoint ini tetap bisa dibaca; inference ditolak dengan 403.

Saldo berubah setelah settlement

Kredit ditahan saat request dimulai dan disesuaikan beberapa detik setelah response selesai. Jika saldo belum berubah setelah sebuah request, periksa pending_requests.

22. API key

Ambil informasi API key

Gunakan endpoint ini untuk membaca label, pemakaian, dan status akun dari API key yang dipakai.

Autentikasi dengan API key yang ingin diperiksa, di header Authorization: Bearer, x-api-key, atau api-key. Tidak ada parameter.

Terminal
curl -sS https://gateway.euphy.cloud/v1/key \
  -H "Authorization: Bearer $YUPIAI_API_KEY"
response · 200
{
  "data": {
    "id": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
    "label": "Key Produksi",
    "key_prefix": "yupi_ai_ab12",
    "created_at": "2026-09-01T08:30:00+00:00",
    "limit": null,
    "limit_reset": null,
    "limit_remaining": 8450000,
    "usage": 1550000,
    "usage_daily": 12000,
    "usage_weekly": 90000,
    "usage_monthly": 400000,
    "is_free_tier": false,
    "balance": 8450000,
    "tier": "pro",
    "expires_at": "2026-10-12T00:00:00+00:00",
    "requests": 812,
    "requests_daily": 9,
    "requests_weekly": 60,
    "requests_monthly": 250,
    "last_used_at": "2026-09-12T10:00:00+00:00",
    "is_expired": false
  }
}

data

idstring
ID key (UUID). Nilai untuk parameter api_key di /v1/usage.
labelstring
Nama key yang diberikan di Dashboard.
key_prefixstring
12 karakter pertama key. Key lengkap tidak pernah dikembalikan.
created_atstring
Waktu key dibuat, ISO 8601.
limitnull
Selalu null. Tidak ada batas pengeluaran per key; batasnya adalah saldo akun.
limit_resetnull
Selalu null.
limit_remainingnumber
Kredit yang masih bisa dipakai key ini: saldo akun, atau 0 jika paket kedaluwarsa.
usagenumber
Kredit yang dipakai key ini sepanjang masa. Request yang di-refund tidak dihitung.
usage_dailynumber
Kredit sejak 00:00 UTC hari ini.
usage_weeklynumber
Kredit sejak Senin 00:00 UTC minggu ini.
usage_monthlynumber
Kredit sejak tanggal 1 pukul 00:00 UTC bulan ini.
is_free_tierboolean
true jika akun tidak memiliki paket berbayar (starter, pro, business).
balancenumber
Saldo akun saat ini. Sama dengan remaining_credits di /v1/credits.
tierstring
Paket aktif akun pemilik key.
expires_atstring | null
Akhir masa aktif paket, ISO 8601.
is_expiredboolean
true jika masa aktif sudah lewat.
requestsnumber
Jumlah request key ini sepanjang masa. requests_daily, requests_weekly, dan requests_monthly memakai jendela yang sama dengan usage_*.
last_used_atstring | null
Waktu settlement request terakhir key ini. null jika belum pernah dipakai.

Key yang dicabut atau akun yang dinonaktifkan menerima 401, bukan data. Response 200 berarti key aktif. Lihat Error response.

23. Statistik

Ambil statistik pemakaian

Gunakan endpoint ini untuk mengambil total token dan kredit dalam satu rentang waktu, dipecah per model, provider, hari, dan API key.

Default 30 hari terakhir. Hanya request yang sudah settlement yang dihitung. Request yang ditolak sebelum reservasi (key tidak valid, kredit habis, model tidak ada) tidak tercatat.

Parameter query

fromstringopsional
Awal rentang, ISO 8601 atau YYYY-MM-DD (UTC). Default 30 hari sebelum to.
tostringopsional
Akhir rentang. Nilai YYYY-MM-DD mencakup hari itu secara penuh. Default sekarang. Rentang maksimal 93 hari.
datestringopsional
Satu hari UTC (YYYY-MM-DD). Mengabaikan from dan to.
modelstringopsional
Satu Model ID, misalnya yupiai-glm5.2.
providerstringopsional
Satu provider sesuai nama yang dilaporkan upstream, misalnya Anthropic.
api_keystring (UUID)opsional
Satu key milik Anda, memakai id dari GET /v1/key. Key milik akun lain menghasilkan 404.
Terminal
# 30 hari terakhir
curl -sS https://gateway.euphy.cloud/v1/usage \
  -H "Authorization: Bearer $YUPIAI_API_KEY"

# Satu model, rentang tanggal tertentu
curl -sS "https://gateway.euphy.cloud/v1/usage?from=2026-09-01&to=2026-09-12&model=yupiai-glm5.2" \
  -H "Authorization: Bearer $YUPIAI_API_KEY"

# Satu provider, satu key
curl -sS "https://gateway.euphy.cloud/v1/usage?provider=Anthropic&api_key=aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee" \
  -H "Authorization: Bearer $YUPIAI_API_KEY"
response · 200
{
  "data": {
    "from": "2026-08-13T12:00:00.000Z",
    "to": "2026-09-12T12:00:00.000Z",
    "filters": {
      "model": null,
      "provider": null,
      "api_key": null
    },
    "summary": {
      "requests": 6,
      "successful_requests": 4,
      "failed_requests": 1,
      "cancelled_requests": 1,
      "unknown_requests": 0,
      "streamed_requests": 4,
      "prompt_tokens": 3400,
      "cached_tokens": 2000,
      "cache_write_tokens": 100,
      "completion_tokens": 1000,
      "reasoning_tokens": 200,
      "total_tokens": 4400,
      "credits": 9080,
      "average_credits_per_request": 1513.33333333,
      "cost_details": {
        "input_credits": 1840,
        "cache_write_credits": 250,
        "cache_read_credits": 400,
        "output_credits": 5440,
        "pricing_adjustment_credits": 1150,
        "estimated_requests": 1,
        "complimentary_requests": 0
      },
      "average_latency_ms": 840
    },
    "pending": {
      "requests": 1,
      "reserved_credits": 66315
    },
    "by_model": [
      {
        "model": "yupiai-glm5.2",
        "requests": 4,
        "successful_requests": 2,
        "failed_requests": 1,
        "cancelled_requests": 1,
        "unknown_requests": 0,
        "streamed_requests": 3,
        "prompt_tokens": 3000,
        "cached_tokens": 2000,
        "cache_write_tokens": 100,
        "completion_tokens": 900,
        "reasoning_tokens": 200,
        "total_tokens": 3900,
        "credits": 9000,
        "average_credits_per_request": 2250,
        "cost_details": {
          "input_credits": 1800,
          "cache_write_credits": 250,
          "cache_read_credits": 400,
          "output_credits": 5400,
          "pricing_adjustment_credits": 1150,
          "estimated_requests": 0,
          "complimentary_requests": 0
        },
        "average_latency_ms": 1200
      },
      {
        "model": "CHEAP_yupiai-glm5.2",
        "requests": 2,
        "successful_requests": 2,
        "failed_requests": 0,
        "cancelled_requests": 0,
        "unknown_requests": 0,
        "streamed_requests": 1,
        "prompt_tokens": 400,
        "cached_tokens": 0,
        "cache_write_tokens": 0,
        "completion_tokens": 100,
        "reasoning_tokens": 0,
        "total_tokens": 500,
        "credits": 80,
        "average_credits_per_request": 40,
        "cost_details": {
          "input_credits": 40,
          "cache_write_credits": 0,
          "cache_read_credits": 0,
          "output_credits": 40,
          "pricing_adjustment_credits": 0,
          "estimated_requests": 1,
          "complimentary_requests": 0
        },
        "average_latency_ms": 300
      }
    ],
    "by_provider": [
      {
        "provider": "Anthropic",
        "requests": 3,
        "successful_requests": 2,
        "failed_requests": 0,
        "cancelled_requests": 1,
        "unknown_requests": 0,
        "streamed_requests": 3,
        "prompt_tokens": 3000,
        "cached_tokens": 2000,
        "cache_write_tokens": 100,
        "completion_tokens": 900,
        "reasoning_tokens": 200,
        "total_tokens": 3900,
        "credits": 9000,
        "average_credits_per_request": 3000,
        "cost_details": {
          "input_credits": 1800,
          "cache_write_credits": 250,
          "cache_read_credits": 400,
          "output_credits": 5400,
          "pricing_adjustment_credits": 1150,
          "estimated_requests": 0,
          "complimentary_requests": 0
        },
        "average_latency_ms": 1200
      },
      {
        "provider": "Google",
        "requests": 3,
        "successful_requests": 2,
        "failed_requests": 1,
        "cancelled_requests": 0,
        "unknown_requests": 0,
        "streamed_requests": 1,
        "prompt_tokens": 400,
        "cached_tokens": 0,
        "cache_write_tokens": 0,
        "completion_tokens": 100,
        "reasoning_tokens": 0,
        "total_tokens": 500,
        "credits": 80,
        "average_credits_per_request": 26.66666667,
        "cost_details": {
          "input_credits": 40,
          "cache_write_credits": 0,
          "cache_read_credits": 0,
          "output_credits": 40,
          "pricing_adjustment_credits": 0,
          "estimated_requests": 1,
          "complimentary_requests": 0
        },
        "average_latency_ms": 300
      }
    ],
    "by_date": [
      {
        "date": "2026-09-10",
        "requests": 3,
        "successful_requests": 2,
        "failed_requests": 1,
        "cancelled_requests": 0,
        "unknown_requests": 0,
        "streamed_requests": 1,
        "prompt_tokens": 400,
        "cached_tokens": 0,
        "cache_write_tokens": 0,
        "completion_tokens": 100,
        "reasoning_tokens": 0,
        "total_tokens": 500,
        "credits": 80,
        "average_credits_per_request": 26.66666667,
        "cost_details": {
          "input_credits": 40,
          "cache_write_credits": 0,
          "cache_read_credits": 0,
          "output_credits": 40,
          "pricing_adjustment_credits": 0,
          "estimated_requests": 1,
          "complimentary_requests": 0
        },
        "average_latency_ms": 300
      },
      {
        "date": "2026-09-11",
        "requests": 3,
        "successful_requests": 2,
        "failed_requests": 0,
        "cancelled_requests": 1,
        "unknown_requests": 0,
        "streamed_requests": 3,
        "prompt_tokens": 3000,
        "cached_tokens": 2000,
        "cache_write_tokens": 100,
        "completion_tokens": 900,
        "reasoning_tokens": 200,
        "total_tokens": 3900,
        "credits": 9000,
        "average_credits_per_request": 3000,
        "cost_details": {
          "input_credits": 1800,
          "cache_write_credits": 250,
          "cache_read_credits": 400,
          "output_credits": 5400,
          "pricing_adjustment_credits": 1150,
          "estimated_requests": 0,
          "complimentary_requests": 0
        },
        "average_latency_ms": 1200
      }
    ],
    "by_api_key": [
      {
        "api_key": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
        "label": "Key Produksi",
        "key_prefix": "yupi_ai_ab12",
        "requests": 4,
        "successful_requests": 2,
        "failed_requests": 1,
        "cancelled_requests": 1,
        "unknown_requests": 0,
        "streamed_requests": 3,
        "prompt_tokens": 3000,
        "cached_tokens": 2000,
        "cache_write_tokens": 100,
        "completion_tokens": 900,
        "reasoning_tokens": 200,
        "total_tokens": 3900,
        "credits": 9000,
        "average_credits_per_request": 2250,
        "cost_details": {
          "input_credits": 1800,
          "cache_write_credits": 250,
          "cache_read_credits": 400,
          "output_credits": 5400,
          "pricing_adjustment_credits": 1150,
          "estimated_requests": 0,
          "complimentary_requests": 0
        },
        "average_latency_ms": 1200
      },
      {
        "api_key": "bbbbbbbb-cccc-4ddd-8eee-ffffffffffff",
        "label": "Key Staging",
        "key_prefix": "yupi_ai_cd34",
        "requests": 2,
        "successful_requests": 2,
        "failed_requests": 0,
        "cancelled_requests": 0,
        "unknown_requests": 0,
        "streamed_requests": 1,
        "prompt_tokens": 400,
        "cached_tokens": 0,
        "cache_write_tokens": 0,
        "completion_tokens": 100,
        "reasoning_tokens": 0,
        "total_tokens": 500,
        "credits": 80,
        "average_credits_per_request": 40,
        "cost_details": {
          "input_credits": 40,
          "cache_write_credits": 0,
          "cache_read_credits": 0,
          "output_credits": 40,
          "pricing_adjustment_credits": 0,
          "estimated_requests": 1,
          "complimentary_requests": 0
        },
        "average_latency_ms": 300
      }
    ]
  }
}

Field response

Setiap baris by_model, by_provider, by_date, dan by_api_key memuat field yang sama dengan summary ditambah kunci grupnya: model, provider, date, atau api_key dengan label dan key_prefix. Baris diurutkan dari kredit terbesar; by_date diurutkan berdasarkan tanggal.

summary

requestsnumber
Request yang sudah settlement dalam rentang waktu.
successful_requestsnumber
Request dengan outcome completed.
failed_requestsnumber
Request dengan outcome error (ditolak provider setelah reservasi).
cancelled_requestsnumber
Request dengan outcome cancelled (stream diputus client).
unknown_requestsnumber
Request yang settlement-nya dilakukan proses pemulihan tanpa mengetahui akhirnya.
streamed_requestsnumber
Request dengan stream: true.
prompt_tokensnumber
Total token input, termasuk token cache.
cached_tokensnumber
Token input yang dibaca dari cache.
cache_write_tokensnumber
Token input yang ditulis ke cache.
completion_tokensnumber
Total token output, termasuk token reasoning.
reasoning_tokensnumber
Token reasoning, bagian dari completion_tokens.
total_tokensnumber
prompt_tokens + completion_tokens.
creditsnumber
Total kredit yang ditagih.
average_credits_per_requestnumber
credits dibagi requests.
cost_detailsobject
Total kredit per kelas token (input_credits, cache_write_credits, cache_read_credits, output_credits, pricing_adjustment_credits) serta estimated_requests dan complimentary_requests.
average_latency_msnumber | null
Rata-rata waktu dari request dikirim ke provider sampai response selesai.

field lain

from, tostring
Rentang yang dipakai, ISO 8601, setelah default diterapkan.
filtersobject
model, provider, dan api_key yang diterapkan. null jika tidak difilter.
pendingobject
Request yang masih menahan kredit dalam rentang ini: requests dan reserved_credits. Belum masuk summary.

Riwayat harian

Gunakan GET /v1/activity untuk data yang sama dalam bentuk baris per hari UTC, model, dan provider. Parameter query sama dengan /v1/usage.

Baris diurutkan dari tanggal terbaru. Field usage adalah kredit. Key digabung kecuali difilter dengan api_key.

Terminal
curl -sS "https://gateway.euphy.cloud/v1/activity?date=2026-09-11" \
  -H "Authorization: Bearer $YUPIAI_API_KEY"
response · 200
{
  "data": [
    {
      "date": "2026-09-11",
      "model": "yupiai-glm5.2",
      "provider_name": "Anthropic",
      "requests": 3,
      "prompt_tokens": 3000,
      "completion_tokens": 900,
      "reasoning_tokens": 200,
      "cached_tokens": 2000,
      "cache_write_tokens": 100,
      "usage": 9000
    },
    {
      "date": "2026-09-10",
      "model": "CHEAP_yupiai-glm5.2",
      "provider_name": "Google",
      "requests": 2,
      "prompt_tokens": 400,
      "completion_tokens": 100,
      "reasoning_tokens": 0,
      "cached_tokens": 0,
      "cache_write_tokens": 0,
      "usage": 80
    },
    {
      "date": "2026-09-10",
      "model": "yupiai-glm5.2",
      "provider_name": "Google",
      "requests": 1,
      "prompt_tokens": 0,
      "completion_tokens": 0,
      "reasoning_tokens": 0,
      "cached_tokens": 0,
      "cache_write_tokens": 0,
      "usage": 0
    }
  ]
}

data[]

datestring
Hari UTC, YYYY-MM-DD.
modelstring
Model ID.
provider_namestring | null
Provider yang melayani request. null untuk request sebelum kolom ini ada.
requestsnumber
Jumlah request yang settlement.
prompt_tokens, completion_tokens, reasoning_tokens, cached_tokens, cache_write_tokensnumber
Total token per kelas, sama dengan summary di /v1/usage.
usagenumber
Total kredit untuk hari, model, dan provider tersebut.

24. Request

Lihat detail satu request

Gunakan endpoint ini untuk membaca catatan ledger satu request: token per kelas, kredit yang ditagih, sumber tagihan, dan saldo sebelum serta sesudahnya.

Parameter id menerima header x-yupiai-request-id (ada di setiap response), field id response Chat Completions (gen-...), atau id response non-streaming Anthropic (msg_...) dan Responses (resp_...).

Terminal
curl -sS "https://gateway.euphy.cloud/v1/generation?id=6f4d5e2c-9a1b-4c3d-8e7f-0a1b2c3d4e5f" \
  -H "Authorization: Bearer $YUPIAI_API_KEY"
response · 200
{
  "data": {
    "id": "6f4d5e2c-9a1b-4c3d-8e7f-0a1b2c3d4e5f",
    "generation_id": "gen-1757671200-Ab3dEf9h",
    "api_key": "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
    "model": "yupiai-glm5.2",
    "provider_name": "Anthropic",
    "created_at": "2026-09-12T10:00:00+00:00",
    "settled_at": "2026-09-12T10:00:03+00:00",
    "status": "settled",
    "outcome": "completed",
    "cancelled": false,
    "streamed": true,
    "latency": 1432,
    "tokens_prompt": 1250,
    "tokens_completion": 450,
    "native_tokens_cached": 1000,
    "native_tokens_cache_write": 0,
    "native_tokens_reasoning": 120,
    "total_cost": 7790,
    "cost_details": {
      "input_credits": 750,
      "cache_write_credits": 0,
      "cache_read_credits": 300,
      "output_credits": 6750,
      "pricing_adjustment_credits": -10,
      "billing_source": "provider_cost",
      "is_estimate": false
    },
    "reserved_credits": 66315,
    "balance_before": 10000000,
    "balance_after": 9992210,
    "is_complimentary": false,
    "is_refunded": false,
    "billing_review_required": false,
    "modality": "text",
    "usage_details": null
  }
}

data

idstring
ID request gateway. Sama dengan header x-yupiai-request-id.
generation_idstring | null
ID generasi di sisi provider (gen-...). null jika request gagal sebelum diterima provider.
api_keystring
ID key yang dipakai.
model, provider_namestring
Model ID dan provider yang melayani request.
statusstring
pending, settled, atau refunded. Selama pending, total_cost dan cost_details bernilai null.
outcomestring | null
completed, cancelled, error, atau unknown. Field cancelled bernilai true untuk outcome cancelled.
streamed, latencyboolean | null, number | null
Request streaming atau tidak, dan durasi dalam milidetik dari dikirim ke provider sampai response selesai.
tokens_prompt, tokens_completionnumber | null
Token input total dan token output, sesuai laporan provider.
native_tokens_cached, native_tokens_cache_write, native_tokens_reasoningnumber | null
Token baca cache, tulis cache, dan reasoning.
total_costnumber | null
Kredit yang ditagih.
cost_detailsobject | null
Kredit per kelas token, pricing_adjustment_credits, billing_source, dan is_estimate. Sama dengan response inference.
reserved_creditsnumber
Kredit yang ditahan saat request dimulai.
balance_before, balance_afternumber | null
Saldo tepat sebelum hold dan tepat setelah settlement, dari ledger.
is_complimentary, is_refunded, billing_review_requiredboolean
Request free trial, request yang di-refund admin, dan request yang sedang ditinjau tim YupiAI.

ID yang tidak ada dan ID milik akun lain menerima jawaban yang sama: 404 not_found. Request yang belum settlement mengembalikan status: "pending"; ulangi permintaan beberapa detik kemudian.

25. Error

Error response

Endpoint usage & billing dan POST /v1/chat/completions memakai amplop error OpenAI. Gunakan error.code untuk logika program; error.message ditujukan untuk manusia.

amplop error
{
  "error": {
    "message": "API key telah dicabut (revoked). Silakan buat key baru di dashboard YupiAI.",
    "type": "authentication_error",
    "param": null,
    "code": "invalid_api_key"
  }
}

status · code

401 · missing_api_key
Tidak ada API key di header Authorization, x-api-key, atau api-key.
401 · invalid_api_key
Prefix bukan yupi_ai_ (atau rk_live_ lama), key tidak ditemukan, key dicabut (revoked), atau akun dinonaktifkan. Pesan menyebutkan alasannya.
402 · insufficient_quotainference
Saldo tidak cukup untuk menahan kredit request. Tidak ada yang dipotong.
403 · subscription_expiredinference
Masa aktif paket sudah lewat. Endpoint pembacaan tetap menjawab 200 dengan is_expired: true.
400 · invalid_queryusage, activity
from, to, atau date tidak valid; rentang lebih dari 93 hari; to tidak lebih akhir dari from; atau model, provider, api_key bukan pengenal yang valid. error.param menyebut parameternya.
400 · missing_required_parametergeneration
Parameter id kosong.
404 · not_foundusage, generation
api_key atau id tidak ada pada akun ini.
429 · rate_limit_exceeded
Endpoint pembacaan dibatasi 30 request per menit per akun dan mengirim header retry-after: 10. Inference memakai limiter terpisah.
502 · gateway_unavailable
Ledger tidak dapat dihubungi. Ulangi beberapa detik kemudian. Endpoint pembacaan tidak menjawab dengan angka nol.
contoh · 401 tanpa header
{
  "error": {
    "message": "Unauthorized: Header API key tidak ada. Kirim API key YupiAI lewat salah satu header: 'Authorization: Bearer yupi_ai_...', 'x-api-key: yupi_ai_...', atau 'api-key: yupi_ai_...'.",
    "type": "authentication_error",
    "param": null,
    "code": "missing_api_key"
  }
}
contoh · 402 kredit tidak cukup (inference)
{
  "error": {
    "message": "Forbidden: Kredit tidak cukup untuk menyelesaikan permintaan ini. Silakan top up di dashboard YupiAI.",
    "type": "permission_error",
    "param": null,
    "code": "insufficient_quota"
  }
}
contoh · 400 rentang terlalu panjang
{
  "error": {
    "message": "Rentang waktu maksimal 93 hari.",
    "type": "invalid_request_error",
    "param": "from",
    "code": "invalid_query"
  }
}
contoh · 429 batas polling
HTTP/1.1 429 Too Many Requests
retry-after: 10

{
  "error": {
    "message": "Terlalu banyak permintaan ke endpoint usage. Silakan coba lagi sebentar.",
    "type": "rate_limit_error",
    "param": null,
    "code": "rate_limit_exceeded"
  }
}

Hindari polling saldo pada setiap request

Saldo setelah request sudah ada di usage.balance.after pada response inference. Panggil /v1/credits saat pengguna membuka layar saldo, bukan pada setiap panggilan model, agar tidak terkena batas 429.

26. Catatan

Status kompatibilitas Cursor

Panduan lama yang memakai Override OpenAI Base URL dan Model ID kustom tidak lagi menjadi jalur utama.

Pilih integrasi yang didokumentasikan

Dokumentasi Cursor saat ini menjelaskan BYOK untuk provider yang mereka dukung, tetapi tidak menjamin gateway OpenAI-compatible dengan Model ID YupiAI. Gunakan Cline, Roo Code, atau Codex untuk konfigurasi yang lebih konsisten.

Jika Cursor masih menampilkan Override OpenAI Base URL, Anda dapat mencoba https://gateway.euphy.cloud/v1. Konfigurasi ini bersifat eksperimental dan tidak berlaku untuk Tab Completion.

Referensi: Dokumentasi API Keys Cursor

27. Kebijakan

Masa aktif dan saldo

Pembelian baru menambah kredit dan masa aktif yang tersisa. Saat masa aktif berakhir, sisa kredit kedaluwarsa dan API berhenti tanpa membuat tagihan lanjutan.

Contoh auto-stack

AksiKreditHari
Beli Starter+1.000.000+30
Beli Pro+2.500.000+30
Total sebelum dipakai3.500.00060

Tidak ada auto-debit

Saat kredit atau masa aktif habis, request baru ditolak. Setiap request menahan kredit lebih dulu (lihat reserved_credits di Cek saldo kredit). Saldo hanya dapat menjadi negatif jika biaya yang dilaporkan provider melampaui kredit yang ditahan; request berikutnya ditolak sampai top-up.

Butuh panduan lain?

Gunakan Quick Setup atau pilih panduan manual sesuai aplikasi Anda.