Kembali ke blog

API & SDKPanduan

Permintaan pertama di Ruby dengan gem openai: base_url, kunci, usage

Skrip Ruby singkat: gem openai resmi, base_url kustom dan kunci dari env. Mencetak teks balasan dan penggunaan token.

Oleh CheapTokens TeamDiterbitkan 4 menit baca

Skrip Ruby dengan OpenAI::Client.new dan base_url kustom yang mengarah ke CheapTokens
Di halaman ini
  1. Yang Anda butuhkan sebelum memulai
  2. Skripnya
  3. Membaca apa yang dikembalikan
  4. Berapa biaya panggilan seperti ini
  5. Jika tidak berjalan
  6. Ke mana selanjutnya

Ya, gem openai resmi berfungsi dengan CheapTokens: berikan base_url: "https://api.cheaptokens.dev/v1" dan kunci Anda ke OpenAI::Client.new, panggil client.chat.completions.create, dan baca teks dari choices.first.message.content. Sisa halaman ini adalah skrip lengkap, cara membaca apa yang dikembalikan, dan apa yang harus diperiksa saat tidak berjalan.

Misalkan Anda memiliki rake task yang memberi label pada tiket dukungan, atau background job yang merangkum catatan sebelum menyimpannya. Anda ingin SDK resmi, bukan HTTP buatan sendiri, dan Anda ingin melihat berapa banyak token yang digunakan setiap panggilan. Itulah tepatnya skrip ini.

Yang Anda butuhkan sebelum memulai#

Halaman gem di RubyGems (diperiksa 8 November 2026) mencantumkan openai 0.120.0, dirilis 5 November 2026, Apache-2.0. Ini membutuhkan Ruby 3.3.0 atau lebih baru; jika Anda masih terjebak di Ruby 3.2, catatan gem itu sendiri mengarah ke lini 0.75.x. Paket ini masih 0.x dan bergerak cepat, jadi pin versinya.

Di Gemfile Anda:

ruby
gem "openai", "~> 0.120.0"

Lalu bundle install. Tanpa Bundler, gem install openai -v 0.120.0 melakukan hal yang sama.

Anda juga memerlukan API key dari akun CheapTokens Anda. Jauhkan dari kode: letakkan di variabel lingkungan, dan jika kata .gitignore baru bagi Anda, panduan menjaga kunci tetap aman ini adalah bacaan lima menit.

bash
export CHEAPTOKENS_API_KEY="sk-your-key"

Skripnya#

Buat ask.rb:

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

Jalankan dengan ruby ask.rb. Tiga hal perlu diperhatikan lebih teliti.

ENV.fetch alih-alih ENV[...]. Jika variabel tidak ada, fetch langsung berhenti dengan KeyError yang menyebutkannya. ENV[...] diam-diam meneruskan nil dan Anda mendapatkan error autentikasi yang membingungkan beberapa baris kemudian.

base_url: adalah satu-satunya baris yang berbeda dari contoh OpenAI di README gem. Sisanya adalah kode yang sama, itulah inti dari API yang kompatibel dengan OpenAI. Jika ide ini baru, apa itu base_url dan cara menggantinya menjelaskannya dengan analogi restoran.

Id model adalah yang lengkap, deepseek-ai/DeepSeek-V4-Flash-0731. Nama pendek dari tabel harga tidak diterima oleh API; ambil id dari dokumentasi CheapTokens atau dari GET /v1/models.

Terminal dengan baris Gemfile, kunci yang diekspor dan ruby ask.rb
Tiga perintah: pin gem, ekspor kunci, jalankan skrip.

Membaca apa yang dikembalikan#

Balasannya adalah objek, bukan hash, jadi Anda memanggil metode padanya. Teksnya ada di completion.choices.first.message.content; itu jalur yang juga digunakan README gem.

Dua baris lagi layak dicetak sejak hari pertama:

  • finish_reason memberi tahu Anda mengapa model berhenti. stop adalah akhir normal. length berarti batas panjang memotong jawaban. Jika Anda pernah melihatnya, mengapa jawaban terpotong dan cara memperbaikinya.
  • usage menyimpan token yang ditagih untuk panggilan tersebut: apa yang Anda kirim dan apa yang ditulis model. Skrip mencetak seluruh objek dengan puts completion.usage, sehingga Anda melihat kedua angka seperti yang dikembalikan API.

Mengapa mencatatnya? Karena token adalah tagihannya. Pertanyaan satu kalimat dengan jawaban satu kalimat sangat kecil, tetapi pekerjaan yang berjalan seribu kali sehari tidak. Token input vs output menjelaskan mengapa angka kedua biasanya lebih mahal per token.

Berapa biaya panggilan seperti ini#

DeepSeek-V4-Flash di CheapTokens adalah $0.015 per 1 juta token input dan $0.10 per 1 juta token output, dengan harga yang sama pada jam berapa pun. Ambil contoh pekerjaan pelabelan tiket: sekitar 300 token masuk, 150 token keluar per tiket. Satu tiket berbiaya $0.00002. Seribu tiket terlihat seperti ini, dengan harga referensi OpenRouter di kolom berikutnya:

Model Per permintaan 1.000 permintaan OpenRouter, 1.000 permintaan
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

300 token input dan 150 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.

Model ini mendukung hingga 380K token konteks dan hingga 32.768 token dalam satu jawaban, jadi pekerjaan merangkum jarang mencapai batas. Jika Anda lebih suka mencoba model kedua dengan skrip yang sama, ubah hanya string model: menjadi zai-org/GLM-5.3-Flash (konteks 390K, hingga 8.192 token output).

Jika tidak berjalan#

Sebagian besar kegagalan pertama kali adalah salah satu dari lima hal. Pilih yang cocok dengan layar Anda.

Pilih kasus Anda

Apa yang Anda lihat?

KeyError: key not found: "CHEAPTOKENS_API_KEY"

Variabel tidak diatur di terminal ini. Jalankan lagi baris export, atau buka shell baru dan periksa dengan echo $CHEAPTOKENS_API_KEY.

401 Unauthorized

Kuncinya ada tetapi salah: spasi atau tanda kutip yang terselip, tempelan yang terpotong, atau kunci lama. Salin lagi dari akun Anda.

404 Not Found

Periksa base_url terlebih dahulu: diakhiri dengan /v1 dan tidak ada jalur tambahan setelahnya. Lalu periksa id model: itu id lengkap dengan awalan deepseek-ai/.

cannot load such file -- openai

Gem tidak terpasang untuk Ruby ini. Jalankan bundle install dan mulai skrip dengan bundle exec ruby ask.rb.

Bundler can't find a version that works

Periksa ruby -v. Lini 0.120.x membutuhkan Ruby 3.3.0 atau lebih baru; pada 3.2 pin lini 0.75.x sebagai gantinya.

Kasus 401 dan 404 muncul dengan setiap SDK, bukan hanya Ruby; API 401 atau 404: kunci, base URL, atau id model yang salah membahasnya secara berurutan.

Cek cepat

Apa yang diberitahukan finish_reason "length" kepada Anda?

Tampilkan jawaban

Jawaban: Jawaban terpotong oleh batas panjang

stop adalah akhir normal; length berarti jawaban mencapai batas sebelum model selesai.

Ke mana selanjutnya#

Anda sekarang memiliki loop berguna terkecil: kirim, baca teks, catat token. Dari sini, bungkus panggilan dalam metode, dan tambahkan angka usage ke logger Anda. Pola yang sama ada di bahasa lain jika stack Anda campuran: Go, Java dan C#. Daftar lengkap model dan harga ada di halaman model, dan referensi API ada di dokumentasi.