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.

Di halaman ini
Ya, gem openai resmi berfungsi dengan CheapTokens: berikan base_ dan kunci Anda ke OpenAI::Client., panggil client., dan baca teks dari choices.. 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:
gem "openai", "~> 0.120.0"Lalu bundle install. Tanpa Bundler, gem install openai - 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.
export CHEAPTOKENS_API_KEY="sk-your-key"Skripnya#
Buat ask.rb:
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.usageJalankan 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-. Nama pendek dari tabel harga tidak diterima oleh API; ambil id dari dokumentasi CheapTokens atau dari GET /v1/models.

Membaca apa yang dikembalikan#
Balasannya adalah objek, bukan hash, jadi Anda memanggil metode padanya. Teksnya ada di completion.; itu jalur yang juga digunakan README gem.
Dua baris lagi layak dicetak sejak hari pertama:
finish_reasonmemberi tahu Anda mengapa model berhenti.stopadalah akhir normal.lengthberarti batas panjang memotong jawaban. Jika Anda pernah melihatnya, mengapa jawaban terpotong dan cara memperbaikinya.usagemenyimpan token yang ditagih untuk panggilan tersebut: apa yang Anda kirim dan apa yang ditulis model. Skrip mencetak seluruh objek denganputs completion., sehingga Anda melihat kedua angka seperti yang dikembalikan API.usage
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 | Input $/1Jt | Output $/1Jt | Per permintaan | 1.000 permintaan | OpenRouter, 1.000 permintaan |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000012 | $0.012 | $0.0225 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00002 | $0.0195 | $0.042 |
| MiniMax-M2.7 | $0.05 | $0.15 | $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- (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?
Pilih opsi untuk melihat jawabannya
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_.
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..
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.



