API & SDKPanduan
Permintaan pertama di Rust dengan async-openai: base URL, key, usage
Program Rust kecil dengan tokio dan async-openai yang mengirim satu chat completion ke CheapTokens dan mencetak balasan serta jumlah token.

Di halaman ini
Untuk memanggil CheapTokens dari Rust dengan async-openai, buat OpenAIConfig dengan base URL https:/ dan key Anda, lalu kirim permintaan dengan create_byot dan body JSON. Teks balasan dan jumlah token diambil dari JSON yang dikembalikan. Itu sekitar 25 baris kode, dan program yang sama berfungsi untuk model apa pun di halaman model CheapTokens setelah Anda mengubah satu string.
Halaman docs.rs crate ini (diperiksa 8 November 2026) mencantumkan versi 0.43.0 di bawah lisensi MIT, dan itulah versi yang diikuti panduan ini.

Mengapa create_byot alih-alih permintaan bertipe#
async-openai biasanya memberi Anda builder permintaan bertipe: Anda mengisi struct, dan ia mengembalikan struct. Itu nyaman sampai gateway mengembalikan field yang tidak dikenal oleh struct. Fitur byot ("bring your own types") menambahkan metode *_byot yang menerima body JSON apa pun dan mengembalikan tipe apa pun yang bisa Anda deserialisasi, termasuk serde_ biasa.
Untuk permintaan pertama, itulah yang Anda inginkan. Anda menulis JSON yang sama seperti yang akan Anda masukkan ke panggilan curl, dan Anda membaca usage langsung dari respons, tanpa perlu mencari tipe.
Siapkan proyek#
Langkah demi langkah
Buat proyek dan set key
Tambahkan crate
Di proyek baru (cargo new cheaptokens-), tambahkan tiga dependensi. async-openai membutuhkan dua fitur di sini: byot untuk metode create_byot dan chat-completion untuk bagian chat.
cargo add async-openai --features byot,chat-completion
cargo add tokio --features macros,rt-multi-thread
cargo add serde_jsonLetakkan key di variabel environment
Buat key di akun CheapTokens Anda dan jangan simpan di kode sumber. Jika Anda ingin versi panjangnya, lihat cara menyimpan API key dengan aman.
export CHEAPTOKENS_API_KEY="paste-your-key-here"Di Windows PowerShell baris yang sama adalah $env:CHEAPTOKENS_.
Jalankan program
Tempel kode dari bagian berikutnya ke src/main.rs dan jalankan.
cargo runProgramnya#
use async_openai::{config::OpenAIConfig, Client};
use serde_json::{json, Value};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let key = std::env::var("CHEAPTOKENS_API_KEY")?;
let config = OpenAIConfig::new()
.with_api_key(key)
.with_api_base("https://api.cheaptokens.dev/v1");
let client = Client::with_config(config);
let response: Value = client
.chat()
.create_byot(json!({
"model": "deepseek-ai/DeepSeek-V4-Flash-0731",
"messages": [
{"role": "user", "content": "Explain what a token is in one sentence."}
],
"max_tokens": 100
}))
.await?;
let choice = &response["choices"][0];
println!("{}", choice["message"]["content"].as_str().unwrap_or("(no text)"));
println!("finish_reason: {}", choice["finish_reason"]);
println!("input tokens: {}", response["usage"]["prompt_tokens"]);
println!("output tokens: {}", response["usage"]["completion_tokens"]);
Ok(())
}Tiga baris membawa seluruh idenya. with_api_base adalah tempat CheapTokens masuk: base URL diakhiri dengan /v1, dan async-openai menambahkan path endpoint sendiri. with_api_key mengambil nilai yang kita baca dari environment. Dan model adalah id lengkap deepseek- — nama pendek dari tabel harga tidak diterima oleh API.
Mengindeks Value dengan key yang tidak ada menghasilkan null alih-alih panic, jadi salah ketik nama field muncul sebagai null di output, bukan crash. Itu berguna saat Anda menjelajahi respons.
Apa yang dikembalikan#
Gateway berbicara dalam format OpenAI Chat Completions, jadi responsnya memiliki bentuk biasa (dipangkas di sini, tanda ... menandai field yang kita lewati):
{
"choices": [
{ "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" }
],
"usage": { "prompt_tokens": 0, "completion_tokens": 0 }
}Angka di usage adalah hitungan nyata untuk permintaan Anda, jadi mereka menggantikan nol saat Anda menjalankannya. prompt_tokens adalah yang Anda kirim, completion_ adalah yang ditulis model. Keduanya ditagih dengan harga berbeda, itulah inti mencetaknya. Jika perbedaan ini baru bagi Anda, input vs output token menjelaskannya dalam lima menit.
Coba sendiriCoba: set "max_tokens" ke 5 dan jalankan lagi. Apa kata finish_reason?Tampilkan jawaban
Dalam format OpenAI Chat Completions ia mengatakan length. Model mencapai batas Anda dan kalimatnya terpotong di tengah. Dengan jawaban normal ia mengatakan stop. Jika Anda melihat length di pekerjaan nyata, naikkan max_tokens — artikel ini membahas perbaikannya.
Berapa biaya satu permintaan#
Katakanlah Anda menjalankan panggilan ini dalam loop, pertanyaan kecil masuk dan jawaban singkat keluar: 300 token input dan 200 token output setiap kali. Pada DeepSeek-V4-Flash itu $0.000025 per permintaan, dari harga langsung $0.015 per 1M token input dan $0.10 per 1M token output. Dihitung bersama, input dan output, itu lebih murah daripada OpenRouter, dan model mempertahankan konteks 380K serta menjawab hingga 32.768 token.
Tabel di bawah menunjukkan permintaan yang sama pada setiap model, dikali 1.000.
| Model | Input $/1Jt | Output $/1Jt | Per permintaan | 1.000 permintaan | OpenRouter, 1.000 permintaan |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000014 | $0.014 | $0.0267 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000025 | $0.0245 | $0.049 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000045 | $0.045 | $0.54 |
300 token input dan 200 token output per permintaan. Harga per 1 juta token adalah harga saat ini dan berubah seiring tarif kami; kolom OpenRouter menunjukkan harga referensi untuk beban kerja yang sama.
Harga ada di halaman harga.
Mengganti model#
Kode tidak berubah saat model berubah; hanya string di "model" yang berubah. Misalnya, zai- memiliki konteks 390K dan menjawab hingga 8.192 token. Untuk menghindari mengedit kode sama sekali, baca id dari variabel kedua dengan std::env::var("CHEAPTOKENS_. Jika Anda tidak yakin id mana yang terlihat oleh key Anda, daftar model dengan GET /v1/models.
Jika tidak berhasil#
environment variable not foundtepat di awal: key tidak diekspor di terminal ini. Ekspor lagi di jendela yang sama tempat Anda menjalankancargo run.- Error 401 dari API: key salah atau ada spasi atau tanda kutip nyasar di sekitarnya.
- Error 404: periksa bahwa base URL diakhiri dengan
/v1dan id model adalah yang lengkap, dengan prefiksdeepseek-ai/. API 401 atau 404: key, base URL, id model membahasnya. - Compiler tidak menemukan
create_byot: fiturbyottidak diaktifkan. Jalankan lagi bariscargo adddari penyiapan.
Untuk masalah koneksi yang bukan salah satu dari itu, lihat error koneksi umum.
Permintaan pertama yang sama tersedia untuk bahasa lain: Go dan Ruby. Untuk lebih lanjut tentang API itu sendiri, buka dokumentasi CheapTokens.



