العودة إلى المدونة

API وSDKدليل

أول طلب في Ruby باستخدام حزمة openai: base_url والمفتاح والاستخدام

سكربت Ruby قصير: حزمة openai الرسمية، وbase_url مخصص ومفتاح من متغير البيئة. يطبع نص الرد واستخدام الرموز.

بواسطة CheapTokens Teamنُشر في 4 دقيقة قراءة

سكربت Ruby مع OpenAI::Client.new وbase_url مخصص يشير إلى CheapTokens
في هذه الصفحة
  1. ما تحتاجه قبل البدء
  2. السكربت
  3. قراءة ما يعود
  4. كم يكلف استدعاء كهذا
  5. إذا لم يعمل
  6. إلى أين تذهب بعد ذلك

نعم، تعمل حزمة openai الرسمية مع CheapTokens: مرّر base_url: "https://api.cheaptokens.dev/v1" ومفتاحك إلى OpenAI::Client.new، واستدعِ client.chat.completions.create، واقرأ النص من choices.first.message.content. بقية هذه الصفحة هي السكربت الكامل، وكيفية قراءة ما يعود، وما يجب فحصه عندما لا يعمل.

لنفترض أن لديك مهمة rake تصنّف تذاكر الدعم، أو مهمة خلفية تلخّص ملاحظة قبل حفظها. تريد SDK الرسمية، لا HTTP مكتوبًا يدويًا، وتريد رؤية عدد الرموز التي استخدمها كل استدعاء. هذا بالضبط ما يفعله هذا السكربت.

ما تحتاجه قبل البدء#

تسرد صفحة الحزمة على RubyGems (تم الفحص في 8 نوفمبر 2026) الإصدار openai 0.120.0، الصادر في 5 نوفمبر 2026، برخصة 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 بالمثل.

تحتاج أيضًا إلى مفتاح API من حسابك في CheapTokens. أبقِه خارج الكود: ضعه في متغير بيئة، وإذا كانت كلمة .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.fetch بدلًا من ENV[...]. إذا كان المتغير مفقودًا، يتوقف fetch فورًا مع KeyError يسمّيه. يمرّر ENV[...] بهدوء nil وتحصل على خطأ مصادقة محيّر بعد بضعة أسطر.

base_url: هو السطر الوحيد الذي يختلف عن أمثلة OpenAI في README الخاص بالحزمة. كل شيء آخر هو نفس الكود، وهذا هو بيت القصيد من واجهة API المتوافقة مع OpenAI. إذا كانت الفكرة جديدة، فإن ما هو base_url وكيفية التبديل يشرحها بتشبيه مطعم.

معرّف النموذج هو المعرّف الكامل، deepseek-ai/DeepSeek-V4-Flash-0731. الاسم المختصر من جدول الأسعار لا تقبله واجهة API؛ خذ المعرّفات من وثائق CheapTokens أو من GET /v1/models.

طرفية تعرض سطر Gemfile والمفتاح المصدَّر وruby ask.rb
الأوامر الثلاثة: ثبّت الحزمة، صدّر المفتاح، شغّل السكربت.

قراءة ما يعود#

الرد كائن، وليس hash، لذا تستدعي دوال عليه. يوجد النص في completion.choices.first.message.content؛ وهذا هو المسار الذي يستخدمه README الخاص بالحزمة أيضًا.

هناك سطران آخران يستحقان الطباعة من اليوم الأول:

  • finish_reason يخبرك لماذا توقف النموذج. stop هو نهاية طبيعية. length يعني أن حد الطول قطع الإجابة. إذا رأيت ذلك يومًا، لماذا تُقطع الإجابات وكيفية إصلاح ذلك.
  • usage يحمل الرموز التي تمت محاسبتك عليها لهذا الاستدعاء: ما أرسلته وما كتبه النموذج. يطبع السكربت الكائن بأكمله باستخدام puts completion.usage، لذا ترى كلا الرقمين كما أعادتهما واجهة API.

لماذا تسجّلها؟ لأن الرموز هي الفاتورة. سؤال من جملة واحدة مع إجابة من جملة واحدة صغير جدًا، لكن مهمة تعمل ألف مرة يوميًا ليست كذلك. رموز الإدخال مقابل الإخراج تشرح لماذا يكلف الرقم الثاني عادةً أكثر لكل رمز.

كم يكلف استدعاء كهذا#

DeepSeek-V4-Flash على CheapTokens بسعر $0.015 لكل مليون رمز إدخال و$0.10 لكل مليون رمز إخراج، بنفس السعر في أي ساعة من اليوم. خذ مهمة تصنيف تذاكر: حوالي 300 رمز إدخال، و150 رمز إخراج لكل تذكرة. تكلف التذكرة الواحدة $0.00002. ألف تذكرة تبدو هكذا، مع سعر OpenRouter المرجعي في العمود التالي:

النموذج لكل طلب 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 رمز إخراج لكل طلب. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.

يأخذ النموذج حتى 380 ألف رمز من السياق وحتى 32,768 رمزًا في إجابة واحدة، لذا نادرًا ما تصطدم مهمة التلخيص بحائط. إذا كنت تفضل تجربة نموذج ثانٍ بنفس السكربت، فغيّر فقط سلسلة model: إلى zai-org/GLM-5.3-Flash (سياق 390 ألف، وحتى 8,192 رمز إخراج).

إذا لم يعمل#

معظم إخفاقات التشغيل الأول تكون واحدة من خمسة أشياء. اختر ما يطابق شاشتك.

اختر حالتك

ماذا ترى؟

KeyError: key not found: "CHEAPTOKENS_API_KEY"

المتغير غير معيّن في هذه الطرفية. شغّل سطر export مرة أخرى، أو افتح shell جديدًا وتحقق باستخدام 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 في الوثائق.