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

في هذه الصفحة
لإرسال طلب من C# إلى CheapTokens، أبقِ مكتبة OpenAI الرسمية لـ .NET واضبط OpenAIClientOptions. على https:/. مرّر معرّف النموذج الكامل، مثل deepseek-، واقرأ المفتاح من متغيّر بيئة. تبقى استدعاءات 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:/(متوافق مع OpenAI Chat Completions)؛/ api. cheaptokens. dev/ v1 - معرّف النموذج:
deepseek-. استخدم المعرّف الكامل، فالاسم المختصر من جدول الأسعار غير مقبول. يمتلك DeepSeek-V4-Flash نافذة سياق تبلغ 380K وما يصل إلى 32,768 رمز إخراج لكل إجابة، بسعر واحد في أي وقت من اليوم؛ai/ DeepSeek- V4- Flash- 0731 - مفتاح API من حسابك في CheapTokens، محفوظ في متغيّر بيئة. إذا لم تكن متأكدًا من كيفية تخزينه، اقرأ كيفية تخزين مفتاح API بأمان.
ابنِ تطبيق وحدة التحكم#
خطوة بخطوة
أنشئ المشروع وشغّله
أنشئ مشروع وحدة تحكم
dotnet new console -o FirstRequest
cd FirstRequestأضف الحزمة
dotnet add package OpenAIضع المفتاح في متغيّر بيئة
في bash أو zsh:
export CHEAPTOKENS_API_KEY=your-keyفي Windows PowerShell:
$env:CHEAPTOKENS_API_KEY = "your-key"الصق الشيفرة وشغّل
استبدل محتويات Program.cs بالشيفرة من القسم التالي، ثم شغّل dotnet run.

الشيفرة، سطرًا بسطر#
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.، ومن هنا أول using). الفحص في الأعلى من عندنا: يعطي رسالة واضحة إذا لم يكن المتغيّر معيَّنًا.
CompleteChat بسلسلة نصية عادية يرسل رسالة مستخدم واحدة وينتظر الإجابة كاملة. نص الرد موجود في completion.. سبب الإنهاء موجود في completion..

ما يجب أن تراه#
يجب أن تحصل على شرح قصير للرموز وسطر يحمل سبب الإنهاء؛ بعد نهاية طبيعية يكون Stop (يقارن README بين FinishReason وChatFinishReason.). تتغيّر صياغة الرد من تشغيل إلى آخر.
السطر الثاني هو الجدير بالقراءة. يقارن README بين FinishReason وChatFinishReason. (أنهى النموذج من تلقاء نفسه) وChatFinishReason. (يريد النموذج استدعاء أداة). أي شيء غير Stop في محادثة عادية يعني أن الإجابة انتهت لسبب آخر، والمشتبه به المعتاد هو حد الطول. إذا رأيت ردًا يتوقف في منتصف الجملة، تشرح هذه المقالة finish_reason وmax_tokens.
تبديل خدمة قائمة#
إذا كانت خدمتك تنشئ بالفعل ChatClient لـ OpenAI، فستغيّر أمرين: سلسلة النموذج والخيارات. تستمر بقية الاستدعاءات في العمل.
قارن
نفس العميل، سطران متغيّران
قبل
ChatClient client = new(
model: "your-current-model",
credential: new ApiKeyCredential(apiKey));بعد
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- (سياق 390K، وما يصل إلى 8,192 رمز إخراج). تغيّر فقط سلسلة model. قائمة المعرّفات التي يمكن لمفتاحك استخدامها على بُعد طلب واحد، انظر اسرد النماذج باستخدام GET /v1/models.
تكلفة طلب واحد#
لنفترض أن خدمة تتعامل مع 1,000 طلب يوميًا، كل منها نحو 300 رمز إدخال و400 رمز إخراج. يكلّف طلب واحد كهذا $0.000045 على DeepSeek-V4-Flash. يعرض الجدول أدناه نفس الـ 1,000 طلب على النماذج الثلاثة إلى جانب OpenRouter. في المجموع، مع احتساب الإدخال والإخراج معًا، يكون DeepSeek-V4-Flash أرخص من OpenRouter. الأسعار الحالية على صفحة الأسعار، وصفحة DeepSeek تسرد ما يقدّمه النموذج.
| النموذج | الإدخال $/1M | الإخراج $/1M | لكل طلب | 1,000 طلبات | OpenRouter، 1,000 طلبات |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000022 | $0.022 | $0.0433 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000045 | $0.0445 | $0.077 |
| MiniMax-M2.7 | $0.05 | $0.15 | $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.



