ব্লগে ফিরে যান

API ও SDKগাইড

openai জেম দিয়ে Ruby-তে প্রথম অনুরোধ: base_url, কী, usage

একটি সংক্ষিপ্ত Ruby স্ক্রিপ্ট: অফিসিয়াল openai জেম, একটি কাস্টম base_url এবং env থেকে একটি কী। উত্তর টেক্সট এবং টোকেন usage প্রিন্ট করে।

CheapTokens Team দ্বারাপ্রকাশিত হয়েছে 8 মিনিট পড়ার সময়

OpenAI::Client.new এবং CheapTokens-এ নির্দেশ করা একটি কাস্টম base_url সহ Ruby স্ক্রিপ্ট
এই পৃষ্ঠায়
  1. শুরু করার আগে যা প্রয়োজন
  2. স্ক্রিপ্ট
  3. ফেরত আসা ডেটা পড়া
  4. এই ধরনের একটি কলের খরচ
  5. যদি এটি চালু না হয়
  6. এরপর কোথায় যাবেন

হ্যাঁ, অফিসিয়াল openai জেমটি CheapTokens-এর সাথে কাজ করে: OpenAI::Client.new-এ base_url: "https://api.cheaptokens.dev/v1" এবং আপনার কী পাস করুন, client.chat.completions.create কল করুন, এবং choices.first.message.content থেকে টেক্সট পড়ুন। এই পৃষ্ঠার বাকি অংশে সম্পূর্ণ স্ক্রিপ্ট, ফেরত আসা ডেটা কীভাবে পড়বেন, এবং এটি চালু না হলে কী পরীক্ষা করবেন তা দেওয়া আছে।

ধরুন আপনার একটি rake টাস্ক আছে যা সাপোর্ট টিকিট লেবেল করে, অথবা একটি ব্যাকগ্রাউন্ড জব যা একটি নোট সংরক্ষণের আগে সারসংক্ষেপ করে। আপনি অফিসিয়াল SDK চান, হাতে লেখা HTTP নয়, এবং প্রতিটি কলে কত টোকেন ব্যবহৃত হয়েছে তা দেখতে চান। এটিই এই স্ক্রিপ্ট।

শুরু করার আগে যা প্রয়োজন#

RubyGems-এ জেম পৃষ্ঠাটি (৮ নভেম্বর ২০২৬-এ পরীক্ষিত) openai 0.120.0 তালিকাভুক্ত করে, যা ৫ নভেম্বর ২০২৬-এ প্রকাশিত, Apache-2.0। এটির জন্য Ruby 3.3.0 বা নতুনতর প্রয়োজন; যদি আপনি Ruby 3.2-এ আটকে থাকেন, জেমের নিজস্ব নোট 0.75.x লাইন নির্দেশ করে। প্যাকেজটি এখনও 0.x এবং দ্রুত পরিবর্তিত হয়, তাই সংস্করণ পিন করুন।

আপনার Gemfile-এ:

ruby
gem "openai", "~> 0.120.0"

তারপর bundle install। Bundler ছাড়া, gem install openai -v 0.120.0 একই কাজ করে।

আপনার CheapTokens অ্যাকাউন্ট থেকে একটি API কী-ও প্রয়োজন। এটি কোডের বাইরে রাখুন: এটি একটি পরিবেশ ভেরিয়েবলে রাখুন, এবং যদি .gitignore শব্দটি আপনার কাছে নতুন হয়, কী নিরাপদে রাখার এই গাইডটি পাঁচ মিনিটের পড়া।

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। যদি ভেরিয়েবলটি অনুপস্থিত থাকে, fetch অবিলম্বে একটি KeyError দিয়ে থেমে যায় যা এটির নাম বলে। ENV[...] চুপচাপ nil পাস করে এবং কয়েক লাইন পরে আপনি একটি বিভ্রান্তিকর প্রমাণীকরণ ত্রুটি পান।

base_url: একমাত্র লাইন যা জেমের README-তে OpenAI উদাহরণ থেকে আলাদা। বাকি সব একই কোড, যা একটি OpenAI-সামঞ্জস্যপূর্ণ API-এর পুরো উদ্দেশ্য। যদি ধারণাটি নতুন হয়, base_url কী এবং কীভাবে পরিবর্তন করবেন একটি রেস্তোরাঁর উপমা দিয়ে এটি ব্যাখ্যা করে।

মডেল আইডিটি সম্পূর্ণ, deepseek-ai/DeepSeek-V4-Flash-0731। একটি মূল্য সারণী থেকে সংক্ষিপ্ত নাম API গ্রহণ করে না; আইডি CheapTokens ডকস বা GET /v1/models থেকে নিন।

Gemfile লাইন, এক্সপোর্ট করা কী এবং ruby ask.rb সহ টার্মিনাল
তিনটি কমান্ড: জেম পিন করুন, কী এক্সপোর্ট করুন, স্ক্রিপ্ট চালান।

ফেরত আসা ডেটা পড়া#

উত্তরটি একটি অবজেক্ট, হ্যাশ নয়, তাই আপনি এটিতে মেথড কল করেন। টেক্সট completion.choices.first.message.content-এ থাকে; জেমের README-ও এই পথটি ব্যবহার করে।

প্রথম দিন থেকেই আরও দুটি লাইন প্রিন্ট করা মূল্যবান:

  • finish_reason আপনাকে বলে মডেল কেন থেমেছে। stop একটি স্বাভাবিক সমাপ্তি। length মানে একটি দৈর্ঘ্য সীমা উত্তরটি কেটে দিয়েছে। যদি আপনি কখনও এটি দেখেন, কেন উত্তর কেটে যায় এবং কীভাবে ঠিক করবেন।
  • usage কলে বিল করা টোকেন ধারণ করে: আপনি যা পাঠিয়েছেন এবং মডেল যা লিখেছে। স্ক্রিপ্টটি puts completion.usage দিয়ে পুরো অবজেক্ট প্রিন্ট করে, তাই আপনি API যেভাবে ফেরত দিয়েছে সেই দুটি সংখ্যাই দেখেন।

কেন লগ করবেন? কারণ টোকেনই বিল। এক বাক্যের প্রশ্নের এক বাক্যের উত্তর ছোট, কিন্তু দিনে হাজার বার চলা একটি জব নয়। ইনপুট বনাম আউটপুট টোকেন ব্যাখ্যা করে কেন দ্বিতীয় সংখ্যাটি সাধারণত প্রতি টোকেনে বেশি খরচ করে।

এই ধরনের একটি কলের খরচ#

CheapTokens-এ DeepSeek-V4-Flash প্রতি 1M ইনপুট টোকেনে $0.015 এবং প্রতি 1M আউটপুট টোকেনে $0.10, দিনের যেকোনো সময় একই মূল্যে। একটি টিকিট-লেবেলিং জব ধরুন: প্রতি টিকিটে প্রায় 300 টোকেন ইন, 150 টোকেন আউট। একটি টিকিটের খরচ $0.00002। এক হাজার টিকিট দেখতে এমন, পরের কলামে OpenRouter-এর রেফারেন্স মূল্যসহ:

মডেল প্রতি অনুরোধে ১,০০০টি অনুরোধ OpenRouter, ১,০০০টি অনুরোধ
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

প্রতি অনুরোধে ৩০০ ইনপুট এবং ১৫০ আউটপুট টোকেন। প্রতি 1M টোকেনের দাম বর্তমান এবং আমাদের ট্যারিফের সাথে পরিবর্তিত হয়; OpenRouter কলামটি একই ওয়ার্কলোডের জন্য রেফারেন্স মূল্য দেখায়।

মডেলটি 380K টোকেন পর্যন্ত কনটেক্সট এবং একটি উত্তরে 32,768 টোকেন পর্যন্ত নেয়, তাই একটি সারসংক্ষেপণ জব খুব কমই দেয়ালে ধাক্কা খায়। যদি আপনি একই স্ক্রিপ্ট দিয়ে দ্বিতীয় মডেল চেষ্টা করতে চান, শুধু model: স্ট্রিংটি zai-org/GLM-5.3-Flash-এ পরিবর্তন করুন (390K কনটেক্সট, 8,192 আউটপুট টোকেন পর্যন্ত)।

যদি এটি চালু না হয়#

প্রথম-রানের বেশিরভাগ ব্যর্থতা পাঁচটি জিনিসের একটি। আপনার স্ক্রিনের সাথে মেলে এমনটি বেছে নিন।

আপনার কেস বেছে নিন

আপনি কী দেখেন?

KeyError: key not found: "CHEAPTOKENS_API_KEY"

এই টার্মিনালে ভেরিয়েবলটি সেট করা নেই। export লাইনটি আবার চালান, অথবা একটি নতুন শেল খুলে echo $CHEAPTOKENS_API_KEY দিয়ে পরীক্ষা করুন।

401 Unauthorized

কী আছে কিন্তু ভুল: একটি অতিরিক্ত স্পেস বা উদ্ধৃতি, একটি কাটা পেস্ট, বা একটি পুরনো কী। আপনার অ্যাকাউন্ট থেকে এটি আবার কপি করুন।

404 Not Found

প্রথমে base_url পরীক্ষা করুন: এটি /v1 দিয়ে শেষ হয় এবং এর পরে কোনো অতিরিক্ত পাথ নেই। তারপর মডেল আইডি পরীক্ষা করুন: এটি deepseek-ai/ উপসর্গসহ সম্পূর্ণ আইডি।

cannot load such file -- openai

এই 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 লাইন পিন করুন।

401 এবং 404 কেসগুলি প্রতিটি SDK-তে আসে, শুধু Ruby-তে নয়; API 401 বা 404: ভুল কী, base URL বা মডেল আইডি ক্রমানুসারে সেগুলি আলোচনা করে।

দ্রুত যাচাই

finish_reason "length" আপনাকে কী বলে?

উত্তর দেখান

উত্তর: উত্তরটি একটি দৈর্ঘ্য সীমা দ্বারা কেটে দেওয়া হয়েছিল

stop একটি স্বাভাবিক সমাপ্তি; length মানে মডেল শেষ হওয়ার আগেই উত্তরটি একটি সীমায় পৌঁছেছে।

এরপর কোথায় যাবেন#

এখন আপনার কাছে সবচেয়ে ছোট কার্যকর লুপ আছে: পাঠান, টেক্সট পড়ুন, টোকেন লগ করুন। এখান থেকে, কলটিকে একটি মেথডে মুড়ে দিন, এবং আপনার লগারে usage সংখ্যাগুলি যোগ করুন। আপনার স্ট্যাক মিশ্র হলে অন্যান্য ভাষায় একই প্যাটার্ন আছে: Go, Java এবং C#। মডেল এবং মূল্যের সম্পূর্ণ তালিকা মডেল পৃষ্ঠায়, এবং API রেফারেন্স ডকসে।