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

API وSDKدليل

أول طلب في C# مع openai-dotnet: نقطة النهاية، المفتاح، الرد

أرسل أول إكمال محادثة من تطبيق وحدة تحكم C#: عيّن Endpoint في مكتبة OpenAI .NET الرسمية، واقرأ المفتاح من متغيّر البيئة، واطبع الرد وسبب الإنهاء.

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

الغلاف: C# ومكتبة OpenAI .NET متصلتان بنقطة نهاية CheapTokens
في هذه الصفحة
  1. ما تحتاجه
  2. ابنِ تطبيق وحدة التحكم
  3. الشيفرة، سطرًا بسطر
  4. ما يجب أن تراه
  5. تبديل خدمة قائمة
  6. تكلفة طلب واحد
  7. إذا لم يعمل

لإرسال طلب من C# إلى CheapTokens، أبقِ مكتبة OpenAI الرسمية لـ .NET واضبط OpenAIClientOptions.Endpoint على https://api.cheaptokens.dev/v1. مرّر معرّف النموذج الكامل، مثل deepseek-ai/DeepSeek-V4-Flash-0731، واقرأ المفتاح من متغيّر بيئة. تبقى استدعاءات ChatClient وCompleteChat كما هي تمامًا في أمثلة OpenAI.

لنفترض أن لديك خدمة ASP.NET تتحدث إلى OpenAI، وتريد تجربة نقطة نهاية ونموذج آخرين دون المساس ببقية الشيفرة. قبل أن تربط أي شيء بها، تحقّق من الأمور الثلاثة التي غالبًا ما تخطئ (المفتاح، نقطة النهاية، معرّف النموذج) في تطبيق وحدة تحكم صغير. هذا ما نبنيه هنا. التفاصيل أدناه مأخوذة من README المكتبة على GitHub (openai/openai-dotnet، تم التحقق في 5 نوفمبر 2026) ومن وثائق CheapTokens: صفحة الوثائق تحتوي على نفس عنوان URL الأساسي.

ما تحتاجه#

تُسمّى الحزمة OpenAI على NuGet. أحدث إصدار مستقر في 5 نوفمبر 2026 هو 2.15.0 (مدخل سجل التغييرات مؤرّخ في 4 نوفمبر). تستهدف .NET 8 و.NET Standard 2.0، ويقول README إنها تعمل مع جميع تطبيقات .NET Standard 2.0، لذا فإن مشروعًا أقدم لا مشكلة فيه أيضًا.

ثلاث قيم تدخل في التطبيق:

  • عنوان URL الأساسي: https://api.cheaptokens.dev/v1 (متوافق مع OpenAI Chat Completions)؛
  • معرّف النموذج: deepseek-ai/DeepSeek-V4-Flash-0731. استخدم المعرّف الكامل، فالاسم المختصر من جدول الأسعار غير مقبول. يمتلك DeepSeek-V4-Flash نافذة سياق تبلغ 380K وما يصل إلى 32,768 رمز إخراج لكل إجابة، بسعر واحد في أي وقت من اليوم؛
  • مفتاح API من حسابك في CheapTokens، محفوظ في متغيّر بيئة. إذا لم تكن متأكدًا من كيفية تخزينه، اقرأ كيفية تخزين مفتاح API بأمان.

ابنِ تطبيق وحدة التحكم#

خطوة بخطوة

أنشئ المشروع وشغّله

أنشئ مشروع وحدة تحكم

bash
dotnet new console -o FirstRequest
cd FirstRequest

أضف الحزمة

bash
dotnet add package OpenAI

ضع المفتاح في متغيّر بيئة

في bash أو zsh:

bash
export CHEAPTOKENS_API_KEY=your-key

في Windows PowerShell:

powershell
$env:CHEAPTOKENS_API_KEY = "your-key"

الصق الشيفرة وشغّل

استبدل محتويات Program.cs بالشيفرة من القسم التالي، ثم شغّل dotnet run.

طرفية بالأوامر الخمسة التي تنشئ تطبيق وحدة التحكم وتشغّله
الأوامر الخمسة: إنشاء المشروع، الدخول إلى المجلد، إضافة الحزمة، تعيين المفتاح، التشغيل.

الشيفرة، سطرًا بسطر#

csharp
using System.ClientModel;
using OpenAI;
using OpenAI.Chat;

string? apiKey = Environment.GetEnvironmentVariable("CHEAPTOKENS_API_KEY");
if (string.IsNullOrEmpty(apiKey))
{
    Console.WriteLine("Set CHEAPTOKENS_API_KEY first.");
    return;
}

ChatClient client = new(
    model: "deepseek-ai/DeepSeek-V4-Flash-0731",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.cheaptokens.dev/v1")
    });

ChatCompletion completion = client.CompleteChat("Explain in two sentences what a token is.");

Console.WriteLine(completion.Content[0].Text);
Console.WriteLine($"finish_reason: {completion.FinishReason}");

يعرض README هذا النمط لـ "وكيل أو LLM مستضاف ذاتيًا متوافق مع OpenAI": تذهب نقطة النهاية إلى OpenAIClientOptions، والمفتاح إلى ApiKeyCredential (يوجد في System.ClientModel، ومن هنا أول using). الفحص في الأعلى من عندنا: يعطي رسالة واضحة إذا لم يكن المتغيّر معيَّنًا.

CompleteChat بسلسلة نصية عادية يرسل رسالة مستخدم واحدة وينتظر الإجابة كاملة. نص الرد موجود في completion.Content[0].Text. سبب الإنهاء موجود في completion.FinishReason.

التدفق: المفتاح من متغيّر البيئة، ChatClient مع Endpoint، CompleteChat، النص وFinishReason
ما يحدث في البرنامج من المفتاح إلى الرد المطبوع.

ما يجب أن تراه#

يجب أن تحصل على شرح قصير للرموز وسطر يحمل سبب الإنهاء؛ بعد نهاية طبيعية يكون Stop (يقارن README بين FinishReason وChatFinishReason.Stop). تتغيّر صياغة الرد من تشغيل إلى آخر.

السطر الثاني هو الجدير بالقراءة. يقارن README بين FinishReason وChatFinishReason.Stop (أنهى النموذج من تلقاء نفسه) وChatFinishReason.ToolCalls (يريد النموذج استدعاء أداة). أي شيء غير Stop في محادثة عادية يعني أن الإجابة انتهت لسبب آخر، والمشتبه به المعتاد هو حد الطول. إذا رأيت ردًا يتوقف في منتصف الجملة، تشرح هذه المقالة finish_reason وmax_tokens.

تبديل خدمة قائمة#

إذا كانت خدمتك تنشئ بالفعل ChatClient لـ OpenAI، فستغيّر أمرين: سلسلة النموذج والخيارات. تستمر بقية الاستدعاءات في العمل.

قارن

نفس العميل، سطران متغيّران

قبل

csharp
ChatClient client = new(
    model: "your-current-model",
    credential: new ApiKeyCredential(apiKey));

بعد

csharp
ChatClient client = new(
    model: "deepseek-ai/DeepSeek-V4-Flash-0731",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.cheaptokens.dev/v1")
    });

للطلبات القصيرة يوجد خيار ثانٍ: zai-org/GLM-5.3-Flash (سياق 390K، وما يصل إلى 8,192 رمز إخراج). تغيّر فقط سلسلة model. قائمة المعرّفات التي يمكن لمفتاحك استخدامها على بُعد طلب واحد، انظر اسرد النماذج باستخدام GET /v1/models.

تكلفة طلب واحد#

لنفترض أن خدمة تتعامل مع 1,000 طلب يوميًا، كل منها نحو 300 رمز إدخال و400 رمز إخراج. يكلّف طلب واحد كهذا $0.000045 على DeepSeek-V4-Flash. يعرض الجدول أدناه نفس الـ 1,000 طلب على النماذج الثلاثة إلى جانب OpenRouter. في المجموع، مع احتساب الإدخال والإخراج معًا، يكون DeepSeek-V4-Flash أرخص من OpenRouter. الأسعار الحالية على صفحة الأسعار، وصفحة DeepSeek تسرد ما يقدّمه النموذج.

النموذج لكل طلب 1,000 طلبات OpenRouter، 1,000 طلبات
GLM-5.3-Flash $0.000022 $0.022 $0.0433
DeepSeek-V4-Flash $0.000045 $0.0445 $0.077
MiniMax-M2.7 $0.000075 $0.075 $0.90

300 رمز إدخال و400 رمز إخراج لكل طلب. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.

إذا لم يعمل#

  • 401. المفتاح مفقود أو خاطئ. اطبع ما إذا كان المتغيّر معيَّنًا (يفعل الفحص في الشيفرة ذلك) وتأكد من أن dotnet run بدأ في نفس الطرفية التي شغّلت فيها export (أو $env:): المتغيّر موجود في تلك الجلسة فقط.
  • 404. غالبًا معرّف النموذج: اسم مختصر بدلًا من deepseek-ai/DeepSeek-V4-Flash-0731 الكامل، أو نقطة نهاية بدون /v1 (تحقّق أيضًا من أن OpenAIClientOptions يُمرَّر فعليًا إلى ChatClient). التفاصيل في API 401 أو 404: مفتاح أو عنوان URL أساسي أو معرّف نموذج خاطئ.
  • error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. سطر using System.ClientModel; مفقود في أعلى Program.cs.

نفس الفكرة بلغة أخرى: نسخة Go مع openai-go.