بلاگ پر واپس جائیں

API اور SDKگائیڈ

openai gem کے ساتھ Ruby میں پہلی درخواست: base_url، key، usage

ایک مختصر Ruby اسکرپٹ: سرکاری openai gem، ایک حسبِ ضرورت base_url اور env سے key۔ جواب کا متن اور token usage پرنٹ کرتا ہے۔

از CheapTokens Teamشائع شدہ 5 منٹ کا مطالعہ

Ruby اسکرپٹ جس میں OpenAI::Client.new اور CheapTokens کی طرف اشارہ کرتا حسبِ ضرورت base_url ہے
اس صفحہ پر
  1. شروع کرنے سے پہلے آپ کو کیا درکار ہے
  2. اسکرپٹ
  3. واپس آنے والے ڈیٹا کو پڑھنا
  4. ایسی کال کی لاگت
  5. اگر یہ نہ چلے
  6. آگے کہاں جائیں

ہاں، سرکاری openai gem CheapTokens کے ساتھ کام کرتا ہے: OpenAI::Client.new کو base_url: "https://api.cheaptokens.dev/v1" اور اپنی key دیں، client.chat.completions.create کال کریں، اور choices.first.message.content سے متن پڑھیں۔ اس صفحے کا باقی حصہ مکمل اسکرپٹ، واپس آنے والے ڈیٹا کو کیسے پڑھیں، اور جب یہ نہ چلے تو کیا چیک کریں، پر مشتمل ہے۔

فرض کریں آپ کے پاس ایک rake task ہے جو support tickets کو label کرتا ہے، یا ایک background job جو کسی note کو محفوظ کرنے سے پہلے اس کا خلاصہ بناتا ہے۔ آپ کو سرکاری SDK چاہیے، خود لکھا ہوا HTTP نہیں، اور آپ دیکھنا چاہتے ہیں کہ ہر کال میں کتنے tokens استعمال ہوئے۔ یہ اسکرپٹ بالکل یہی کرتا ہے۔

شروع کرنے سے پہلے آپ کو کیا درکار ہے#

RubyGems پر gem کا صفحہ (8 نومبر 2026 کو چیک کیا گیا) openai 0.120.0 دکھاتا ہے، جو 5 نومبر 2026 کو ریلیز ہوا، Apache-2.0۔ اسے Ruby 3.3.0 یا اس سے نیا درکار ہے؛ اگر آپ Ruby 3.2 پر پھنسے ہوئے ہیں، تو gem کے اپنے نوٹس 0.75.x لائن کی طرف اشارہ کرتے ہیں۔ پیکیج ابھی بھی 0.x ہے اور تیزی سے بدلتا ہے، اس لیے version کو pin کریں۔

اپنی Gemfile میں:

ruby
gem "openai", "~> 0.120.0"

پھر bundle install۔ Bundler کے بغیر، gem install openai -v 0.120.0 وہی کام کرتا ہے۔

آپ کو اپنے CheapTokens اکاؤنٹ سے ایک API key بھی درکار ہے۔ اسے کوڈ سے باہر رکھیں: اسے environment variable میں ڈالیں، اور اگر .gitignore لفظ آپ کے لیے نیا ہے، تو keys محفوظ رکھنے کی یہ گائیڈ پانچ منٹ کی پڑھائی ہے۔

bash
export CHEAPTOKENS_API_KEY="sk-your-key"

اسکرپٹ#

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

اسے ruby ask.rb سے چلائیں۔ تین چیزیں دوبارہ دیکھنے کے قابل ہیں۔

ENV[...] کی بجائے ENV.fetch۔ اگر variable موجود نہ ہو، تو fetch فوراً ایک KeyError کے ساتھ رک جاتا ہے جو اس کا نام بتاتا ہے۔ ENV[...] خاموشی سے nil پاس کر دیتا ہے اور چند سطروں بعد آپ کو ایک مبہم authentication error ملتا ہے۔

base_url: واحد سطر ہے جو gem کے README میں دیے گئے OpenAI مثالوں سے مختلف ہے۔ باقی سب وہی کوڈ ہے، جو OpenAI-compatible API کا پورا مقصد ہے۔ اگر یہ تصور نیا ہے، تو base_url کیا ہے اور کیسے تبدیل کریں اسے ریستوران کی مثال سے سمجھاتا ہے۔

model id مکمل والا ہے، deepseek-ai/DeepSeek-V4-Flash-0731۔ price table سے مختصر نام API قبول نہیں کرتا؛ ids CheapTokens docs سے یا GET /v1/models سے لیں۔

Terminal with the Gemfile line, the exported key and ruby ask.rb
The three commands: pin the gem, export the key, run the script.

واپس آنے والے ڈیٹا کو پڑھنا#

جواب ایک object ہے، hash نہیں، اس لیے آپ اس پر methods کال کرتے ہیں۔ متن completion.choices.first.message.content پر ہے؛ gem کا README بھی یہی path استعمال کرتا ہے۔

پہلے دن سے دو مزید سطریں پرنٹ کرنا قابلِ قدر ہے:

  • finish_reason بتاتا ہے کہ model کیوں رکا۔ stop ایک معمول کا اختتام ہے۔ length کا مطلب ہے کہ length limit نے جواب کاٹ دیا۔ اگر آپ کو یہ کبھی نظر آئے، تو جوابات کیوں کٹ جاتے ہیں اور اسے کیسے ٹھیک کریں۔
  • usage میں وہ tokens ہوتے ہیں جن کی اس کال پر بلنگ ہوئی: جو آپ نے بھیجا اور جو model نے لکھا۔ اسکرپٹ پورا object puts completion.usage سے پرنٹ کرتا ہے، تاکہ آپ دونوں نمبر ویسے ہی دیکھیں جیسے API نے واپس کیے۔

انہیں log کیوں کریں؟ کیونکہ tokens ہی بل ہیں۔ ایک جملے کا سوال اور ایک جملے کا جواب بہت چھوٹا ہے، لیکن ایک job جو دن میں ہزار بار چلتا ہے، نہیں۔ Input vs output tokens سمجھاتا ہے کہ دوسرے نمبر کی فی token قیمت عام طور پر زیادہ کیوں ہوتی ہے۔

ایسی کال کی لاگت#

CheapTokens پر DeepSeek-V4-Flash فی 1M input tokens $0.015 اور فی 1M output tokens $0.10 ہے، دن کے کسی بھی وقت وہی قیمت۔ ایک ticket-labeling job لیں: تقریباً 300 tokens in، 150 tokens out فی ticket۔ ایک ticket کی لاگت $0.00002 ہے۔ ایک ہزار tickets ایسے دکھتے ہیں، اگلے کالم میں OpenRouter کی reference price کے ساتھ:

ماڈل فی درخواست 1,000 درخواستیں OpenRouter، 1,000 درخواستیں
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 ان پٹ اور 150 آؤٹ پٹ ٹوکنز۔ فی 1M ٹوکنز کی قیمتیں موجودہ ہیں اور ہمارے ٹیرف کے ساتھ تبدیل ہوتی ہیں؛ OpenRouter کالم اسی ورک لوڈ کے لیے حوالہ جاتی قیمتیں دکھاتا ہے۔

model 380K tokens تک context اور ایک جواب میں 32,768 tokens تک لیتا ہے، اس لیے summarizing job شاذ و نادر ہی حد سے ٹکراتا ہے۔ اگر آپ اسی اسکرپٹ سے دوسرا model آزمانا چاہیں، تو صرف model: string کو zai-org/GLM-5.3-Flash میں بدلیں (390K context، 8,192 output tokens تک)۔

اگر یہ نہ چلے#

پہلی بار چلانے کی زیادہ تر ناکامیاں پانچ چیزوں میں سے ایک ہوتی ہیں۔ وہ چنیں جو آپ کی اسکرین سے میل کھائے۔

اپنا کیس منتخب کریں

آپ کو کیا نظر آتا ہے؟

KeyError: key not found: "CHEAPTOKENS_API_KEY"

variable اس terminal میں سیٹ نہیں ہے۔ export سطر دوبارہ چلائیں، یا نیا shell کھولیں اور echo $CHEAPTOKENS_API_KEY سے چیک کریں۔

401 Unauthorized

key موجود ہے لیکن غلط ہے: کوئی اضافی space یا quote، ادھورا paste، یا پرانی key۔ اسے اپنے اکاؤنٹ سے دوبارہ کاپی کریں۔

404 Not Found

پہلے base_url چیک کریں: یہ /v1 پر ختم ہوتا ہے اور اس کے بعد کوئی اضافی path نہیں۔ پھر model id چیک کریں: یہ deepseek-ai/ prefix کے ساتھ مکمل id ہے۔

cannot load such file -- openai

gem اس Ruby کے لیے انسٹال نہیں ہے۔ bundle install چلائیں اور اسکرپٹ bundle exec ruby ask.rb سے شروع کریں۔

Bundler can't find a version that works

ruby -v چیک کریں۔ 0.120.x لائن کو Ruby 3.3.0 یا اس سے نیا درکار ہے؛ 3.2 پر اس کے بجائے 0.75.x لائن pin کریں۔

401 اور 404 کے کیسز ہر SDK میں آتے ہیں، صرف Ruby میں نہیں؛ API 401 یا 404: غلط key، base URL یا model id انہیں ترتیب سے چلتا ہے۔

فوری جانچ

finish_reason "length" آپ کو کیا بتاتا ہے؟

جواب دکھائیں

جواب: جواب length limit سے کاٹ دیا گیا

stop ایک معمول کا اختتام ہے؛ length کا مطلب ہے کہ model کے مکمل ہونے سے پہلے جواب حد سے ٹکرا گیا۔

آگے کہاں جائیں#

اب آپ کے پاس سب سے چھوٹا کارآمد loop ہے: بھیجیں، متن پڑھیں، tokens log کریں۔ یہاں سے، کال کو ایک method میں لپیٹیں، اور اپنے logger میں usage نمبر شامل کریں۔ اگر آپ کا stack ملا جلا ہے تو یہی pattern دوسری زبانوں میں بھی موجود ہے: Go، Java اور C#۔ models اور قیمتوں کی مکمل فہرست models page پر ہے، اور API reference docs میں ہے۔