Bloga dön

BaşlarkenKılavuz

Python'da requests ile CheapTokens'a ilk istek, SDK yok

Yalnızca requests kullanan 20 satırlık bir Python betiği: bir sohbet tamamlama, zaman aşımı, HTTP hata işleme ve yazdırılan yanıt, finish_reason ve kullanım.

Yazan: CheapTokens TeamYayınlanma tarihi: 3 dk okuma

requests ile CheapTokens sohbet tamamlama uç noktasını çağıran Python betiği
Bu sayfada
  1. Betiğin tamamı
  2. Her satır ne yapıyor
  3. Yanıtı okuyun
  4. Çalışmadığında
  5. Bir çağrının maliyeti
  6. Buradan nereye

OpenAI uyumlu bir API ile konuşmak için openai paketine ihtiyacınız yok. Tek bir requests.post çağrısı, bir Bearer anahtarı ve bir JSON gövdesi yeterli; ayrıca kablo üzerinden tam olarak neyin geçtiğini görürsünüz. Bu kılavuz, CheapTokens (https://api.cheaptokens.dev/v1/chat/completions) için bu betiği oluşturur ve sonunda yanıtı, finish_reason ve token kullanımını yazdırır.

Yalnızca requests kurulu olan kilitli bir makinedeyseniz, küçük bir cron işi bir SDK'yı çekmemeliyse ya da SDK'nın sizin için ne yaptığını anlamak istiyorsanız bu yaklaşım size uygun. İlk istek kılavuzu SDK, curl ve Node yollarını kapsar; bu ise saf Python olanı.

Betiğin tamamı#

Önce anahtarınızı bir ortam değişkenine koyun (bir API anahtarını güvenle nasıl saklayacağınıza bakın), sonra bunu ask.py olarak kaydedin:

python
import os
import requests

url = "https://api.cheaptokens.dev/v1/chat/completions"
headers = {"Authorization": f"Bearer {os.environ['CHEAPTOKENS_API_KEY']}"}
payload = {
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "messages": [
        {"role": "user", "content": "Explain what a token is in two sentences."}
    ],
    "max_tokens": 200,
}

try:
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    r.raise_for_status()
except requests.exceptions.Timeout:
    raise SystemExit("No reply within 30 seconds - try again or raise the timeout")
except requests.exceptions.HTTPError as e:
    raise SystemExit(f"HTTP {e.response.status_code}: {e.response.text}")

data = r.json()
choice = data["choices"][0]
print(choice["message"]["content"])
print("finish_reason:", choice["finish_reason"])
print("usage:", data["usage"])

python ask.py komutunu çalıştırın. Model kimliği tam ağ geçidi kimliğidir, deepseek-ai/DeepSeek-V4-Flash-0731; oraya ne yazacağınızdan emin değilseniz GET /v1/models ile modelleri listeleyin. Başka bir model denemek için zai-org/GLM-5.3-Flash yazın ve başka hiçbir şeyi değiştirmeyin: tek bakiye tüm modelleri kapsar.

Tek bir isteğin yolu: anahtar, POST, raise_for_status, choices, usage
Betiğinizden yazdırılan yanıta tek istek

Her satır ne yapıyor#

Betiğin dayandığı beş fikir şunlardır. requests Quickstart'ı (canlı dokümanlar, 2 Kasım 2026'da kontrol edildi) bunların çoğunu açıklar ve OpenAI'nin Chat Completions referansı yanıttaki alanları tanımlar.

Bilgi kartları

Betikteki beş şey

İnsanların atladığı madde üçüncüsüdür. Bir cron işinde sonsuza kadar takılan bir betik, 30 saniye sonra yüksek sesle başarısız olan bir betikten çok daha kötüdür.

Yanıtı okuyun#

Başarılı bir yanıt JSON'dur. Chat Completions referansına göre önemsediğiniz kısımlar:

  • choices[0].message.content metindir. null olabilir, bu yüzden üzerinde körü körüne string metotları çağırmayın.
  • choices[0].finish_reason modelin neden durduğunu söyler: stop (bitirdi), length (max_tokens sınırı kesti), tool_calls, content_filter.
  • usage.prompt_tokens, usage.completion_tokens ve usage.total_tokens faturalandırıldığınız şeylerdir: girdi, çıktı ve toplamları.

Yanıt şu şekle sahiptir (sayılar yer tutucudur):

json
{
  "choices": [
    {
      "message": {"role": "assistant", "content": "A token is a small piece of text..."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 18, "completion_tokens": 52, "total_tokens": 70}
}
Kendin deneDeneyin: max_tokens değerini 5 yapın ve betiği yeniden çalıştırın. finish_reason ne diyor?Cevabı göster

length diyor: model max_tokens sınırınız tarafından durduruldu, bu yüzden yanıt cümle ortasında bitiyor. Sınırı yükseltin ve tekrar stop elde edin. Tüm hikâye AI yanıtı kesildi mi? finish_reason "length" sorununu düzeltin yazısında.

Çalışmadığında#

Betik çoğu hatayı tek satır çıktıya dönüştürür. Her birinin genellikle ne anlama geldiği şöyledir:

Eşleştir

Her mesajı olağan nedeniyle eşleştirin

  • HTTP 401Anahtar eksik, yanlış yazılmış veya göndermek istediğiniz anahtar değil
  • HTTP 404URL yolu veya model kimliği yanlış
  • requests.exceptions.TimeoutZaman aşımı içinde hiç bayt gelmedi
  • KeyError: 'CHEAPTOKENS_API_KEY'Ortam değişkeni bu terminalde ayarlanmamış

Gerçek hata gövdeleri ve anahtar, temel URL ve model kimliğinin adım adım kontrolü için API 401 veya 404 hatası: yanlış anahtar, temel URL veya model kimliği yazısını kullanın. İki küçük tuzak daha: KeyError: 'choices' görürseniz, bir hata gövdesini başarı olarak ayrıştırmışsınız demektir, bu da raise_for_status() atlandığı anlamına gelir. Ve makinenizde bir ~/.netrc dosyası varsa, requests ayarladığınız Authorization başlığı yerine onun kimlik bilgilerini kullanabilir.

Bir çağrının maliyeti#

Yukarıdaki yanıttaki yer tutucu sayılarla (yaklaşık 18 token girdi, 52 çıktı), DeepSeek-V4-Flash'e bir çağrı $0.0000055 tutar. Bu, hissedemeyeceğiniz bir sayı, o yüzden büyütün. Betiğinizin günde 1.000 destek talebini özetlediğini varsayalım, her biri yaklaşık 800 token girdi ve 300 çıktı:

Model İstek başına 1.000 istek OpenRouter, 1.000 istek
GLM-5.3-Flash $0.000028 $0.028 $0.0517
DeepSeek-V4-Flash $0.000042 $0.042 $0.098
MiniMax-M2.7 $0.000085 $0.085 $1.02

İstek başına 800 giriş ve 300 çı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 model başına sabittir, yoğun saat yoktur, bu yüzden aynı betik gece 3'te de öğlen de aynı maliyettedir. Güncel model başına fiyatlar fiyatlandırma sayfasında ve dokümanlar uç noktaları listeler.

Buradan nereye#

Bu çalıştığında, olağan sonraki adımlar birçok girdi üzerinde döngü, 429 üzerinde yeniden deneme (429 Too Many Requests: geri çekilmeli yeniden denemeler yazısına bakın) veya aynı çağrının akışlı hâlidir. HTTP'yi kendiniz yönetmek istemiyorsanız, SDK yolu tek bir base_url değişikliği uzaklıkta.