Bloga dön

API ve SDKKılavuz

openai gem ile Ruby'de ilk istek: base_url, anahtar, usage

Kısa bir Ruby betiği: resmi openai gem'i, özel bir base_url ve ortam değişkeninden bir anahtar. Yanıt metnini ve token kullanımını yazdırır.

Yazan: CheapTokens TeamYayınlanma tarihi: 4 dk okuma

OpenAI::Client.new ve CheapTokens'a işaret eden özel base_url içeren Ruby betiği
Bu sayfada
  1. Başlamadan önce ihtiyacınız olanlar
  2. Betik
  3. Dönen yanıtı okumak
  4. Böyle bir çağrının maliyeti
  5. Çalışmazsa
  6. Sırada ne var

Evet, resmi openai gem'i CheapTokens ile çalışır: OpenAI::Client.new'ye base_url: "https://api.cheaptokens.dev/v1" ve anahtarınızı verin, client.chat.completions.create çağırın ve metni choices.first.message.content'ten okuyun. Bu sayfanın geri kalanı tam betik, dönen yanıtın nasıl okunacağı ve çalışmadığında nelerin kontrol edileceğidir.

Diyelim ki destek taleplerini etiketleyen bir rake göreviniz veya bir notu kaydetmeden önce özetleyen bir arka plan işiniz var. Elle yazılmış HTTP değil, resmi SDK'yı istiyorsunuz ve her çağrının kaç token kullandığını görmek istiyorsunuz. Bu betik tam olarak bunu yapıyor.

Başlamadan önce ihtiyacınız olanlar#

RubyGems'teki gem sayfası (8 Kasım 2026'da kontrol edildi) 5 Kasım 2026'da yayımlanan, Apache-2.0 lisanslı openai 0.120.0 sürümünü listeliyor. Ruby 3.3.0 veya daha yenisini gerektiriyor; Ruby 3.2'de takılıp kaldıysanız gem'in kendi notları 0.75.x serisine işaret ediyor. Paket hâlâ 0.x ve hızlı hareket ediyor, bu yüzden sürümü sabitleyin.

Gemfile dosyanızda:

ruby
gem "openai", "~> 0.120.0"

Ardından bundle install. Bundler olmadan gem install openai -v 0.120.0 aynı işi yapar.

Ayrıca CheapTokens hesabınızdan bir API anahtarına ihtiyacınız var. Anahtarı koddan uzak tutun: bir ortam değişkenine koyun ve .gitignore kelimesi size yeni geliyorsa, anahtarları güvende tutma rehberi beş dakikalık bir okumadır.

bash
export CHEAPTOKENS_API_KEY="sk-your-key"

Betik#

ask.rb oluşturun:

ruby
require "openai"

client = OpenAI::Client.new(
  api_key: ENV.fetch("CHEAPTOKENS_API_KEY"),
  base_url: "https://api.cheaptokens.dev/v1"
)

completion = client.chat.completions.create(
  model: "deepseek-ai/DeepSeek-V4-Flash-0731",
  messages: [
    { role: "user", content: "Explain in one sentence what a token is." }
  ]
)

choice = completion.choices.first
puts choice.message.content
puts "finish_reason: #{choice.finish_reason}"
puts completion.usage

ruby ask.rb ile çalıştırın. İkinci bir bakışı hak eden üç şey var.

ENV[...] yerine ENV.fetch. Değişken eksikse, fetch hemen durur ve onu adlandıran bir KeyError fırlatır. ENV[...] sessizce nil geçirir ve birkaç satır sonra kafa karıştırıcı bir kimlik doğrulama hatası alırsınız.

base_url:, gem'in README'sindeki OpenAI örneklerinden farklı olan tek satırdır. Geri kalan her şey aynı koddur; OpenAI uyumlu bir API'nin bütün amacı da budur. Kavram size yeni geliyorsa, base_url nedir ve nasıl değiştirilir bunu bir restoran benzetmesiyle açıklıyor.

Model kimliği tam olandır, deepseek-ai/DeepSeek-V4-Flash-0731. Bir fiyat tablosundaki kısa ad API tarafından kabul edilmez; kimlikleri CheapTokens dokümanlarından veya GET /v1/models üzerinden alın.

Gemfile satırı, dışa aktarılan anahtar ve ruby ask.rb içeren terminal
Üç komut: gem'i sabitle, anahtarı dışa aktar, betiği çalıştır.

Dönen yanıtı okumak#

Yanıt bir hash değil, bir nesnedir; bu yüzden üzerinde metot çağırırsınız. Metin completion.choices.first.message.content konumundadır; gem'in README'sinin kullandığı yol da budur.

İlk günden itibaren yazdırmaya değer iki satır daha var:

  • finish_reason modelin neden durduğunu söyler. stop normal bir bitiştir. length bir uzunluk sınırının yanıtı kestiği anlamına gelir. Bunu görürseniz, yanıtlar neden kesilir ve nasıl düzeltilir.
  • usage çağrının faturalandırıldığı token'ları tutar: gönderdiğiniz ve modelin yazdığı. Betik tüm nesneyi puts completion.usage ile yazdırır, böylece her iki sayıyı da API'nin döndürdüğü şekilde görürsünüz.

Neden kayıt tutmalı? Çünkü token'lar faturadır. Tek cümlelik bir soru ve tek cümlelik bir yanıt küçüktür, ama günde bin kez çalışan bir iş değildir. Girdi ve çıktı token'ları ikinci sayının neden genellikle token başına daha pahalı olduğunu açıklar.

Böyle bir çağrının maliyeti#

CheapTokens'ta DeepSeek-V4-Flash, 1M girdi token'ı başına $0.015 ve 1M çıktı token'ı başına $0.10; günün her saatinde aynı fiyat. Bir talep etiketleme işini ele alalım: talep başına yaklaşık 300 token girdi, 150 token çıktı. Bir talep $0.00002 tutar. Bin talep şöyle görünür, yan sütunda OpenRouter'ın referans fiyatıyla:

Model İstek başına 1.000 istek OpenRouter, 1.000 istek
GLM-5.3-Flash $0.000012 $0.012 $0.0225
DeepSeek-V4-Flash $0.00002 $0.0195 $0.042
MiniMax-M2.7 $0.000038 $0.0375 $0.45

İstek başına 300 giriş ve 150 çı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.

Model 380K token'a kadar bağlam ve tek yanıtta 32.768 token'a kadar destekler, bu yüzden bir özetleme işi nadiren duvara toslar. Aynı betikle ikinci bir modeli denemek isterseniz, yalnızca model: dizesini zai-org/GLM-5.3-Flash olarak değiştirin (390K bağlam, 8.192 çıktı token'ına kadar).

Çalışmazsa#

İlk çalıştırma hatalarının çoğu beş şeyden biridir. Ekranınıza uyanı seçin.

Durumunu seç

Ne görüyorsunuz?

KeyError: key not found: "CHEAPTOKENS_API_KEY"

Değişken bu terminalde ayarlanmamış. export satırını yeniden çalıştırın veya yeni bir kabuk açıp echo $CHEAPTOKENS_API_KEY ile kontrol edin.

401 Unauthorized

Anahtar orada ama yanlış: kaçak bir boşluk veya tırnak, kesik bir yapıştırma ya da eski bir anahtar. Hesabınızdan yeniden kopyalayın.

404 Not Found

Önce base_url kontrol edin: /v1 ile bitiyor ve ardından ekstra bir yol yok. Sonra model kimliğini kontrol edin: deepseek-ai/ önekiyle tam kimlik olmalı.

cannot load such file -- openai

Gem bu Ruby için kurulu değil. bundle install çalıştırın ve betiği bundle exec ruby ask.rb ile başlatın.

Bundler can't find a version that works

ruby -v kontrol edin. 0.120.x serisi Ruby 3.3.0 veya daha yenisini gerektirir; 3.2'de bunun yerine 0.75.x serisini sabitleyin.

401 ve 404 durumları yalnızca Ruby'de değil her SDK'da ortaya çıkar; API 401 veya 404: yanlış anahtar, base URL veya model kimliği bunları sırayla ele alır.

Hızlı kontrol

finish_reason "length" size ne söyler?

Cevabı göster

Cevap: Yanıt bir uzunluk sınırı tarafından kesildi

stop normal bir bitiştir; length yanıtın model bitmeden bir sınıra takıldığı anlamına gelir.

Sırada ne var#

Artık en küçük kullanışlı döngünüz var: gönder, metni oku, token'ları kaydet. Buradan itibaren çağrıyı bir metoda sarın ve usage sayılarını logger'ınıza ekleyin. Yığınınız karışıksa aynı desen diğer dillerde de var: Go, Java ve C#. Modellerin ve fiyatların tam listesi modeller sayfasında, API referansı ise dokümanlarda.