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

في هذه الصفحة
نعم، تعمل حزمة openai الرسمية مع CheapTokens: مرّر base_ ومفتاحك إلى OpenAI::Client.، واستدعِ client.، واقرأ النص من choices.. بقية هذه الصفحة هي السكربت الكامل، وكيفية قراءة ما يعود، وما يجب فحصه عندما لا يعمل.
لنفترض أن لديك مهمة 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 الخاص بك:
gem "openai", "~> 0.120.0"ثم bundle install. بدون Bundler، يقوم gem install openai - بالمثل.
تحتاج أيضًا إلى مفتاح API من حسابك في CheapTokens. أبقِه خارج الكود: ضعه في متغير بيئة، وإذا كانت كلمة .gitignore جديدة عليك، فإن هذا الدليل حول الحفاظ على أمان المفاتيح قراءة تستغرق خمس دقائق.
export CHEAPTOKENS_API_KEY="sk-your-key"السكربت#
أنشئ 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.usageشغّله باستخدام ruby ask.rb. هناك ثلاثة أمور تستحق نظرة ثانية.
ENV.fetch بدلًا من ENV[...]. إذا كان المتغير مفقودًا، يتوقف fetch فورًا مع KeyError يسمّيه. يمرّر ENV[...] بهدوء nil وتحصل على خطأ مصادقة محيّر بعد بضعة أسطر.
base_url: هو السطر الوحيد الذي يختلف عن أمثلة OpenAI في README الخاص بالحزمة. كل شيء آخر هو نفس الكود، وهذا هو بيت القصيد من واجهة API المتوافقة مع OpenAI. إذا كانت الفكرة جديدة، فإن ما هو base_url وكيفية التبديل يشرحها بتشبيه مطعم.
معرّف النموذج هو المعرّف الكامل، deepseek-. الاسم المختصر من جدول الأسعار لا تقبله واجهة API؛ خذ المعرّفات من وثائق CheapTokens أو من GET /v1/models.

قراءة ما يعود#
الرد كائن، وليس hash، لذا تستدعي دوال عليه. يوجد النص في completion.؛ وهذا هو المسار الذي يستخدمه README الخاص بالحزمة أيضًا.
هناك سطران آخران يستحقان الطباعة من اليوم الأول:
finish_reasonيخبرك لماذا توقف النموذج.stopهو نهاية طبيعية.lengthيعني أن حد الطول قطع الإجابة. إذا رأيت ذلك يومًا، لماذا تُقطع الإجابات وكيفية إصلاح ذلك.usageيحمل الرموز التي تمت محاسبتك عليها لهذا الاستدعاء: ما أرسلته وما كتبه النموذج. يطبع السكربت الكائن بأكمله باستخدامputs completion.، لذا ترى كلا الرقمين كما أعادتهما واجهة API.usage
لماذا تسجّلها؟ لأن الرموز هي الفاتورة. سؤال من جملة واحدة مع إجابة من جملة واحدة صغير جدًا، لكن مهمة تعمل ألف مرة يوميًا ليست كذلك. رموز الإدخال مقابل الإخراج تشرح لماذا يكلف الرقم الثاني عادةً أكثر لكل رمز.
كم يكلف استدعاء كهذا#
DeepSeek-V4-Flash على CheapTokens بسعر $0.015 لكل مليون رمز إدخال و$0.10 لكل مليون رمز إخراج، بنفس السعر في أي ساعة من اليوم. خذ مهمة تصنيف تذاكر: حوالي 300 رمز إدخال، و150 رمز إخراج لكل تذكرة. تكلف التذكرة الواحدة $0.00002. ألف تذكرة تبدو هكذا، مع سعر OpenRouter المرجعي في العمود التالي:
| النموذج | الإدخال $/1M | الإخراج $/1M | لكل طلب | 1,000 طلبات | OpenRouter، 1,000 طلبات |
|---|---|---|---|---|---|
| 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 رمز إدخال و150 رمز إخراج لكل طلب. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.
يأخذ النموذج حتى 380 ألف رمز من السياق وحتى 32,768 رمزًا في إجابة واحدة، لذا نادرًا ما تصطدم مهمة التلخيص بحائط. إذا كنت تفضل تجربة نموذج ثانٍ بنفس السكربت، فغيّر فقط سلسلة model: إلى zai- (سياق 390 ألف، وحتى 8,192 رمز إخراج).
إذا لم يعمل#
معظم إخفاقات التشغيل الأول تكون واحدة من خمسة أشياء. اختر ما يطابق شاشتك.
اختر حالتك
ماذا ترى؟
اختر خيارًا لعرض الإجابة
KeyError: key not found: "CHEAPTOKENS_API_KEY"
المتغير غير معيّن في هذه الطرفية. شغّل سطر export مرة أخرى، أو افتح shell جديدًا وتحقق باستخدام echo $CHEAPTOKENS_.
401 Unauthorized
المفتاح موجود لكنه خاطئ: مسافة أو علامة اقتباس شاذة، أو لصق مبتور، أو مفتاح قديم. انسخه مرة أخرى من حسابك.
404 Not Found
تحقق من base_url أولًا: ينتهي بـ /v1 وليس له مسار إضافي بعده. ثم تحقق من معرّف النموذج: إنه المعرّف الكامل مع بادئة deepseek-ai/.
cannot load such file -- openai
الحزمة غير مثبتة لهذا Ruby. شغّل bundle install وابدأ السكربت باستخدام bundle exec ruby ask..
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 في الوثائق.



