Bloga dön

API ve SDKKılavuz

async-openai ile Rust'ta ilk istek: temel URL, anahtar, kullanım

tokio ve async-openai ile CheapTokens'a bir sohbet tamamlama isteği gönderen ve yanıtı ve token sayılarını yazdıran küçük bir Rust programı.

Yazan: CheapTokens TeamYayınlanma tarihi: 4 dk okuma

Rust ilk istek: cargo add async-openai, anahtarı dışa aktarın, cargo run
Bu sayfada
  1. Neden tipli istekler yerine create_byot
  2. Projeyi kurun
  3. Program
  4. Geri gelen
  5. Bir isteğin maliyeti
  6. Modeli değiştirmek
  7. Çalışmazsa

CheapTokens'ı Rust'ta async-openai ile çağırmak için, temel URL'si https://api.cheaptokens.dev/v1 ve anahtarınızla bir OpenAIConfig oluşturun, ardından isteği create_byot ve bir JSON gövdesiyle gönderin. Yanıt metni ve token sayıları, geri gelen JSON'dan çıkar. Bu yaklaşık 25 satır koddur ve aynı program, tek bir dizeyi değiştirdiğinizde CheapTokens modeller sayfasındaki herhangi bir model için çalışır.

Crate'in docs.rs sayfası (8 Kasım 2026'da kontrol edildi) MIT lisansı altında 0.43.0 sürümünü listeliyor ve bu kılavuz o sürümü takip ediyor.

Programın akışı: ortamdan anahtar, OpenAIConfig, create_byot, JSON Value
Programın adım adım ne yaptığı

Neden tipli istekler yerine create_byot#

async-openai normalde size tipli bir istek oluşturucu sunar: bir struct doldurursunuz, o da size bir struct döndürür. Bu, bir ağ geçidi struct'ların bilmediği bir alan döndürene kadar rahattır. byot özelliği ("kendi tiplerini getir") herhangi bir JSON gövdesi alan ve düz serde_json::Value dahil olmak üzere serileştirebileceğiniz herhangi bir türü döndüren *_byot metotları ekler.

İlk istek için tam olarak istediğiniz şey budur. Bir curl çağrısına koyacağınız aynı JSON'u yazarsınız ve usage doğrudan yanıttan okursunuz, bakılacak bir tür yoktur.

Projeyi kurun#

Adım adım

Projeyi oluşturun ve anahtarı ayarlayın

Crate'leri ekleyin

Yeni bir projede (cargo new cheaptokens-rust), üç bağımlılık ekleyin. async-openai burada iki özelliğe ihtiyaç duyar: create_byot metotları için byot ve sohbet bölümü için chat-completion.

bash
cargo add async-openai --features byot,chat-completion
cargo add tokio --features macros,rt-multi-thread
cargo add serde_json

Anahtarı bir ortam değişkenine koyun

Anahtarı CheapTokens hesabınızda oluşturun ve kaynak kodun dışında tutun. Uzun versiyonunu istiyorsanız, bir API anahtarını güvenle nasıl saklayacağınıza bakın.

bash
export CHEAPTOKENS_API_KEY="paste-your-key-here"

Windows PowerShell'de aynı satır $env:CHEAPTOKENS_API_KEY="paste-your-key-here" şeklindedir.

Programı çalıştırın

Sonraki bölümdeki kodu src/main.rs içine yapıştırın ve başlatın.

bash
cargo run

Program#

rust
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(())
}

Üç satır tüm fikri taşır. with_api_base CheapTokens'ın girdiği yerdir: temel URL /v1 ile biter ve async-openai uç nokta yolunu kendisi ekler. with_api_key ortamdan okuduğumuz değeri alır. Ve model tam kimlik deepseek-ai/DeepSeek-V4-Flash-0731'dır — fiyat tablolarındaki kısa adlar API tarafından kabul edilmez.

Bir Value'yi eksik bir anahtarla indekslemek panik yerine null verir, böylece bir alan adındaki yazım hatası çökme yerine çıktıda null olarak görünür. Bir yanıtı keşfederken bu kullanışlıdır.

Geri gelen#

Ağ geçidi OpenAI Chat Completions formatını konuşur, bu yüzden yanıt olağan şekle sahiptir (burada kısaltılmış, ... atladığımız alanları işaretler):

json
{
  "choices": [
    { "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" }
  ],
  "usage": { "prompt_tokens": 0, "completion_tokens": 0 }
}

usage içindeki sayılar isteğiniz için gerçek sayılardır, bu yüzden çalıştırdığınızda sıfırların yerini alırlar. prompt_tokens gönderdiğinizdir, completion_tokens modelin yazdığıdır. Farklı fiyatlardan faturalandırılırlar, bunları yazdırmanın amacı da budur. Fark size yeni geliyorsa, girdi vs çıktı tokenları bunu beş dakikada açıklar.

Kendin deneDeneyin: "max_tokens" değerini 5 yapın ve tekrar çalıştırın. finish_reason ne diyor?Cevabı göster

OpenAI Chat Completions formatında length der. Model sınırınıza ulaştı ve cümle ortada kesildi. Normal bir yanıtta stop der. Gerçek bir işte length görürseniz, max_tokens değerini artırın — bu makale düzeltmeyi ele alır.

Bir isteğin maliyeti#

Diyelim ki bu çağrıyı bir döngüde çalıştırıyorsunuz, içeri küçük bir soru ve dışarı kısa bir yanıt: her biri 300 girdi tokenı ve 200 çıktı tokenı. DeepSeek-V4-Flash'te bu, 1M girdi tokenı başına $0.015 ve 1M çıktı tokenı başına $0.10 canlı fiyatından, istek başına $0.000025 eder. Girdi ve çıktı birlikte sayıldığında bu OpenRouter'dan daha ucuzdur ve model 380K bağlamı korur ve 32.768 tokena kadar yanıt verir.

Aşağıdaki tablo aynı isteği her modelde, 1.000 ile çarpılmış olarak gösterir.

Model İstek başına 1.000 istek OpenRouter, 1.000 istek
GLM-5.3-Flash $0.000014 $0.014 $0.0267
DeepSeek-V4-Flash $0.000025 $0.0245 $0.049
MiniMax-M2.7 $0.000045 $0.045 $0.54

İstek başına 300 giriş ve 200 çıkış token'ı. 1M token başına fiyatlar günceldir ve tarifelerimizle birlikte değişir; OpenRouter sütunu aynı iş yükü için referans fiyatları gösterir.

Fiyatlar fiyatlandırma sayfasında bulunur.

Modeli değiştirmek#

Model değiştiğinde kod değişmez; yalnızca "model" içindeki dize değişir. Örneğin, zai-org/GLM-5.3-Flash 390K bağlama sahiptir ve 8.192 tokena kadar yanıt verir. Kodu hiç düzenlememek için, kimliği std::env::var("CHEAPTOKENS_MODEL") ile ikinci bir değişkenden okuyun. Anahtarınızın hangi kimlikleri gördüğünden emin değilseniz, GET /v1/models ile modelleri listeleyin.

Çalışmazsa#

  • En başta environment variable not found: anahtar bu terminalde dışa aktarılmamış. cargo run çalıştırdığınız aynı pencerede tekrar dışa aktarın.
  • API'den 401 hatası: anahtar yanlış veya etrafında kaçak bir boşluk ya da tırnak var.
  • 404 hatası: temel URL'nin /v1 ile bittiğini ve model kimliğinin deepseek-ai/ önekiyle tam olan olduğunu kontrol edin. API 401 veya 404: anahtar, temel URL, model kimliği bunu adım adım anlatır.
  • Derleyici create_byot bulamıyor: byot özelliği etkin değil. Kurulumdaki cargo add satırını tekrar çalıştırın.

Bunlardan hiçbiri olmayan bir bağlantı sorunu için, yaygın bağlantı hatalarına bakın.

Aynı ilk istek diğer diller için de mevcut: Go ve Ruby. API'nin kendisi hakkında daha fazlası için, CheapTokens belgelerini açın.