<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yusuf Khalidd</title>
    <description>The latest articles on DEV Community by Yusuf Khalidd (@yusuf_khalidd).</description>
    <link>https://dev.to/yusuf_khalidd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821724%2F0310c456-f78f-4e57-a40e-62fa6c7bebaa.png</url>
      <title>DEV Community: Yusuf Khalidd</title>
      <link>https://dev.to/yusuf_khalidd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yusuf_khalidd"/>
    <language>en</language>
    <item>
      <title>كيفية اختبار واجهات برمجة تطبيقات راست (Rust API)؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Wed, 13 May 2026 08:49:06 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/kyfy-khtbr-wjht-brmj-ttbyqt-rst-rust-api-4d28</link>
      <guid>https://dev.to/yusuf_khalidd/kyfy-khtbr-wjht-brmj-ttbyqt-rst-rust-api-4d28</guid>
      <description>&lt;p&gt;لغة Rust تمنحك خادم HTTP سريعًا وآمنًا من حيث الأنواع بسرعة، لكنها لا تمنحك دائمًا حلقة تغذية راجعة سريعة لاختبار عقد الـ API. &lt;code&gt;cargo test&lt;/code&gt; مهم، لكنه يدور حول الكود لا حول HTTP الفعلي. لاختبار أكواد الحالة، شكل JSON، الرؤوس، JWT، وطلبات الواجهة الأمامية قبل اكتمال المعالج، تحتاج أداة تعمل خارج سلسلة أدوات Rust وتتحدث مع الخادم قيد التشغيل.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;هذا الدليل يوضح سير عمل عملي لاختبار واجهة برمجة تطبيقات Rust داخل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;: توصيل Apidog بخادم Axum أو Actix، إنشاء طلبات، التحقق من JSON المُسلسل بواسطة Serde، التعامل مع JWT، إنشاء mocks للواجهة الأمامية، ثم تشغيل كل ذلك في CI. إذا كنت تستخدم Postman أو &lt;code&gt;curl&lt;/code&gt;، فستحصل أيضًا على مواصفات OpenAPI، عناوين mock قابلة للمشاركة، وبيئات عمل جماعية. يمكنك قراءة &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;قصة ترحيل Postman&lt;/a&gt; لاحقًا؛ هنا نركز على Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  ملخص سريع
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;شغّل خادم Rust محليًا باستخدام &lt;code&gt;cargo run&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أضف &lt;code&gt;http://localhost:3000&lt;/code&gt; كـ &lt;code&gt;baseUrl&lt;/code&gt; في بيئة Apidog.&lt;/li&gt;
&lt;li&gt;أنشئ طلب &lt;code&gt;GET /healthz&lt;/code&gt; كاختبار دخان.&lt;/li&gt;
&lt;li&gt;اختبر JSON القادم من Serde باستخدام assertions بعد كل طلب.&lt;/li&gt;
&lt;li&gt;خزّن JWT في متغير &lt;code&gt;{{token}}&lt;/code&gt; وطبّق Bearer Auth على مستوى المجلد.&lt;/li&gt;
&lt;li&gt;استخدم Mock endpoints حتى تعمل الواجهة الأمامية قبل اكتمال المعالج.&lt;/li&gt;
&lt;li&gt;احفظ الطلبات كسيناريو اختبار وشغّلها في CI باستخدام &lt;code&gt;apidog-cli&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  لماذا تختبر Rust API خارج &lt;code&gt;cargo test&lt;/code&gt;؟
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cargo test&lt;/code&gt; ممتاز لاختبارات الوحدة والتكامل داخل Rust، لكنه ليس دائمًا أفضل طبقة لاختبار عقد HTTP العام.&lt;/p&gt;

&lt;p&gt;إذا أردت التأكد من أن المعالج يعيد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status code صحيحًا&lt;/li&gt;
&lt;li&gt;JSON بالشكل المتوقع&lt;/li&gt;
&lt;li&gt;Headers صحيحة&lt;/li&gt;
&lt;li&gt;رسالة خطأ واضحة عند الإدخال غير الصحيح&lt;/li&gt;
&lt;li&gt;سلوكًا ثابتًا أمام الواجهة الأمامية&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;فستحتاج عادة إلى كتابة اختبارات HTTP داخل Rust أو استخدام &lt;code&gt;curl&lt;/code&gt; يدويًا. هذا يعمل، لكنه يصبح مكلفًا مع تغيّر المعالجات.&lt;/p&gt;

&lt;p&gt;Apidog يضيف طبقة عقد فوق الخادم قيد التشغيل:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;الطلبات محفوظة وقابلة لإعادة التشغيل.&lt;/li&gt;
&lt;li&gt;التأكيدات موجودة بجانب الطلب.&lt;/li&gt;
&lt;li&gt;الفريق كله يرى نفس العقود.&lt;/li&gt;
&lt;li&gt;يمكن تشغيل نفس السيناريو في CI.&lt;/li&gt;
&lt;li&gt;يمكن توليد OpenAPI من الطلبات المحفوظة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الفكرة: اترك &lt;code&gt;cargo test&lt;/code&gt; لاختبار كود Rust، واستخدم Apidog لاختبار واجهة HTTP كما يراها العملاء.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 1: أضف خادم Rust كبيئة في Apidog
&lt;/h2&gt;

&lt;p&gt;ابدأ بخادم Axum بسيط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nn"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;net&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[tokio::main]&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/healthz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"ok"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"0.0.0.0:3000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;شغّله:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ مشروعًا جديدًا.&lt;/li&gt;
&lt;li&gt;افتح إدارة البيئات.&lt;/li&gt;
&lt;li&gt;أضف بيئة باسم &lt;code&gt;Rust Local&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المتغير&lt;/th&gt;
&lt;th&gt;القيمة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;baseUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;اتركها فارغة الآن&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apiVersion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;أضف بيئة ثانية باسم &lt;code&gt;Rust Staging&lt;/code&gt; واستخدم عنوان URL التجريبي. بهذه الطريقة يمكنك التبديل بين المحلي والتجريبي بدون تعديل كل طلب يدويًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 2: أنشئ أول طلب
&lt;/h2&gt;

&lt;p&gt;داخل المشروع، أنشئ مجلدًا باسم &lt;code&gt;Rust API&lt;/code&gt;، ثم أضف طلبًا جديدًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;GET&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;{{baseUrl}}/healthz&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;اضغط &lt;strong&gt;Send&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;النتيجة المتوقعة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 OK
ok
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;احفظ الطلب باسم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;health-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا الطلب هو أبسط اختبار دخان. إذا فشل، لا تكمل بقية الاختبارات قبل إصلاح الاتصال بالخادم.&lt;/p&gt;

&lt;p&gt;إذا ظهر خطأ &lt;code&gt;connection refused&lt;/code&gt;، تحقق من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أن الخادم يعمل.&lt;/li&gt;
&lt;li&gt;أن المنفذ صحيح.&lt;/li&gt;
&lt;li&gt;أن الخادم مربوط بـ &lt;code&gt;0.0.0.0:3000&lt;/code&gt; وليس فقط &lt;code&gt;127.0.0.1:3000&lt;/code&gt;، خصوصًا إذا كنت تستخدم Docker أو بيئة محلية مختلفة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 3: اختبر طلب واستجابة JSON باستخدام Serde
&lt;/h2&gt;

&lt;p&gt;أضف مسارًا لإنشاء مستخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nn"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;serde&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Deserialize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Deserialize)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;CreateUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Serialize)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CreateUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="py"&gt;.name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="py"&gt;.email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في Apidog، أنشئ طلبًا جديدًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;{{baseUrl}}/users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body: JSON
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada Lovelace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ada@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أرسل الطلب واحفظه باسم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create-user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أضف assertions في تبويب &lt;strong&gt;Tests&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status is 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Body has id, name, email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada Lovelace&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+@&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الآن إذا تغيّر شكل الاستجابة لاحقًا بسبب &lt;code&gt;serde&lt;/code&gt;، مثل إضافة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[serde(rename_all&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"camelCase"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;فسيفشل اختبار العقد قبل أن يصل التغيير إلى الإنتاج.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 4: غطِّ حالات رفض Serde
&lt;/h2&gt;

&lt;p&gt;لا تختبر المسار السعيد فقط. اختبر المدخلات الخاطئة أيضًا.&lt;/p&gt;

&lt;p&gt;أنشئ الطلبات التالية في Apidog:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الطلب&lt;/th&gt;
&lt;th&gt;Body&lt;/th&gt;
&lt;th&gt;المتوقع&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-user-missing-email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": "Ada" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;422&lt;/code&gt;، مع رسالة عن الحقل المفقود&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-user-extra-field&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": "Ada", "email": "a@b.c", "admin": true }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; إذا لم تستخدم &lt;code&gt;deny_unknown_fields&lt;/code&gt;، أو &lt;code&gt;422&lt;/code&gt; إذا استخدمته&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-user-wrong-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": 1, "email": "a@b.c" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;422&lt;/code&gt;، مع رسالة عن النوع غير الصحيح&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;مثال assertion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status is 422&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذه الاختبارات توثق سياسة التحقق الفعلية. إذا قررت لاحقًا إضافة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[serde(deny_unknown_fields)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;فسيتغير سلوك &lt;code&gt;extra-field&lt;/code&gt;، وسيظهر ذلك فورًا في Apidog وCI.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 5: اختبر المسارات المحمية بواسطة JWT
&lt;/h2&gt;

&lt;p&gt;غالبًا ما تكون واجهات Rust الإنتاجية محمية بطبقة مصادقة. مثال مبسط باستخدام JWT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;http&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum_extra&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PrivateCookieJar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DecodingKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Validation&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;me&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PrivateCookieJar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StatusCode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jar&lt;/span&gt;
        &lt;span class="nf"&gt;.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.ok_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UNAUTHORIZED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="nf"&gt;.value&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;DecodingKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;b"secret"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;Validation&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.map_err&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nn"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UNAUTHORIZED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="py"&gt;.claims.sub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Ada"&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"ada@example.com"&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بدل إنشاء JWT يدويًا لكل طلب، أضف &lt;strong&gt;Pre-Request Script&lt;/strong&gt; على مستوى المجلد في Apidog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم من إعدادات المجلد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth Type: &lt;code&gt;Bearer Token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Token: &lt;code&gt;{{token}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الآن ترث كل الطلبات داخل المجلد نفس إعداد المصادقة، ويتم توليد JWT جديد قبل التشغيل.&lt;/p&gt;

&lt;p&gt;للمزيد حول اختبار JWT، راجع &lt;a href="http://apidog.com/blog/test-jwt-authentication-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية اختبار مصادقة JWT في واجهات برمجة التطبيقات&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 6: اختبر Streaming و Server-Sent Events
&lt;/h2&gt;

&lt;p&gt;يدعم Axum وActix التدفق كجزء أساسي من HTTP. في Axum، يمكن أن يعيد المعالج &lt;code&gt;Sse&lt;/code&gt; مبنيًا على &lt;code&gt;futures::Stream&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;تنسيق SSE عادة يكون:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data: { ... }

data: { ... }

event: done
data: {}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ طلب &lt;code&gt;GET&lt;/code&gt; لنقطة SSE.&lt;/li&gt;
&lt;li&gt;أرسله.&lt;/li&gt;
&lt;li&gt;إذا كان &lt;code&gt;Content-Type&lt;/code&gt; هو &lt;code&gt;text/event-stream&lt;/code&gt;، ستظهر الاستجابة في وضع streaming.&lt;/li&gt;
&lt;li&gt;راقب كل frame مع زمن وصوله.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ما يجب اختباره:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أول event يصل ضمن الزمن المتوقع.&lt;/li&gt;
&lt;li&gt;event معين مثل &lt;code&gt;event: done&lt;/code&gt; يصل قبل إغلاق الاتصال.&lt;/li&gt;
&lt;li&gt;الاتصال لا يبقى مفتوحًا للأبد.&lt;/li&gt;
&lt;li&gt;يمكن ضبط timeout للطلب حتى يفشل الاختبار عند التدفق غير المنتهي.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كنت تستخدم WebSocket بدل SSE، استخدم نوع طلب WebSocket في Apidog واحفظ تسلسل الرسائل والاستجابات بنفس الفكرة.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 7: أنشئ Mock API لتطوير الواجهة الأمامية بالتوازي
&lt;/h2&gt;

&lt;p&gt;الواجهة الأمامية لا تحتاج انتظار اكتمال كل معالج Rust. يمكنها العمل ضد mock ثابت طالما أن العقد واضح.&lt;/p&gt;

&lt;p&gt;في Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح طلب &lt;code&gt;create-user&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;اختر &lt;strong&gt;Smart Mock&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;فعّله.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;سيُنشئ Apidog endpoint مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mock.apidog.com/m1/&amp;lt;projectId&amp;gt;/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ويمكن للواجهة الأمامية إرسال &lt;code&gt;POST&lt;/code&gt; إليه بنفس شكل الطلب الحقيقي.&lt;/p&gt;

&lt;p&gt;لـ mock ديناميكي، استخدم &lt;strong&gt;Advanced Mock&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;النتيجة: الواجهة الأمامية تحصل على &lt;code&gt;id&lt;/code&gt; و&lt;code&gt;createdAt&lt;/code&gt; واقعيين بدون انتظار معالج Rust.&lt;/p&gt;

&lt;p&gt;عندما يصبح المعالج جاهزًا، تغيّر الواجهة الأمامية &lt;code&gt;baseUrl&lt;/code&gt; من mock إلى:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ولا تحتاج لتغيير شكل الطلب.&lt;/p&gt;

&lt;p&gt;لنفس النمط في بيئات أخرى، راجع &lt;a href="http://apidog.com/blog/test-spring-boot-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;بناء واختبار واجهة برمجة تطبيقات Spring Boot&lt;/a&gt; و&lt;a href="http://apidog.com/blog/how-to-test-an-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل اختبار واجهة برمجة التطبيقات العام&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 8: احفظ الطلبات كسيناريو CI
&lt;/h2&gt;

&lt;p&gt;حوّل الطلبات إلى سيناريو اختبار قابل للتشغيل بدون واجهة رسومية.&lt;/p&gt;

&lt;p&gt;مثال تسلسل:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;health-check&lt;/code&gt;&lt;br&gt;&lt;br&gt;
تأكيد &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;create-user&lt;/code&gt;&lt;br&gt;&lt;br&gt;
تأكيد &lt;code&gt;200&lt;/code&gt;، ثم خزّن &lt;code&gt;body.id&lt;/code&gt; في متغير.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;create-user-missing-email&lt;/code&gt;&lt;br&gt;&lt;br&gt;
تأكيد &lt;code&gt;422&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;me&lt;/code&gt;&lt;br&gt;&lt;br&gt;
يستخدم JWT من Pre-Request Script، ثم يؤكد &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;طلب SSE&lt;br&gt;&lt;br&gt;
يؤكد أن التدفق يكتمل خلال 5 ثوانٍ.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال لتخزين &lt;code&gt;id&lt;/code&gt; بعد إنشاء المستخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم يمكن استخدامه لاحقًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Returned id matches created user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;صدّر السيناريو كملف JSON وضعه في المستودع:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tests/apidog/contract.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API contract tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;cargo build --release&lt;/span&gt;
    &lt;span class="s"&gt;./target/release/myserver &amp;amp;&lt;/span&gt;
    &lt;span class="s"&gt;sleep 2&lt;/span&gt;
    &lt;span class="s"&gt;apidog-cli run tests/apidog/contract.json --env "Rust Local"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الآن كل Pull Request يلمس معالجًا يحصل على اختبار عقد فعلي ضد binary قيد التشغيل.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 9: أنشئ OpenAPI من الطلبات المحفوظة
&lt;/h2&gt;

&lt;p&gt;بعد استقرار الطلبات:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح قائمة &lt;strong&gt;Export&lt;/strong&gt; في Apidog.&lt;/li&gt;
&lt;li&gt;اختر OpenAPI 3.1.&lt;/li&gt;
&lt;li&gt;صدّر المواصفة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ستحصل على ملف مواصفات مبني من الطلبات والأمثلة التي اختبرتها فعليًا.&lt;/p&gt;

&lt;p&gt;يمكنك أيضًا تشغيل التصدير من CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog-cli &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; openapi &lt;span class="nt"&gt;--output&lt;/span&gt; openapi.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم أضف &lt;code&gt;openapi.json&lt;/code&gt; إلى المستودع حتى يستخدمه من يحتاج إلى توليد عملاء TypeScript أو Swift أو Kotlin أو Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل يعمل Apidog مع Axum وActix-web؟
&lt;/h3&gt;

&lt;p&gt;نعم. Apidog يتعامل مع HTTP، لذلك يعمل مع Axum وActix-web وRocket وWarp وPoem وLoco. النقطة المهمة في التطوير المحلي هي ربط الخادم بـ &lt;code&gt;0.0.0.0&lt;/code&gt; عند الحاجة.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف أختبر المعالجات التي تتعطل؟
&lt;/h3&gt;

&lt;p&gt;يمكنك وضع &lt;code&gt;CatchPanicLayer&lt;/code&gt; من &lt;code&gt;tower-http&lt;/code&gt; أمام الـ router لتحويل panic إلى &lt;code&gt;500&lt;/code&gt;. بعدها أنشئ طلبًا في Apidog يؤدي إلى هذا المسار وتأكد من status code.&lt;/p&gt;

&lt;p&gt;إذا لم تغلف حالات panic، قد يسقط الاتصال ويظهر خطأ شبكة. هذا أيضًا سلوك عقد يمكن توثيقه.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكن تشغيل Apidog ضد binary داخل Docker؟
&lt;/h3&gt;

&lt;p&gt;نعم. اجعل &lt;code&gt;baseUrl&lt;/code&gt; يشير إلى المنفذ المكشوف للحاوية. إذا كنت تستخدم Docker Compose، تأكد أن مشغل Apidog يستطيع الوصول إلى نفس الشبكة أو استخدم المنفذ المربوط بالمضيف.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا عن gRPC؟
&lt;/h3&gt;

&lt;p&gt;Apidog يدعم نوع طلب gRPC. استورد ملفات &lt;code&gt;.proto&lt;/code&gt;، اختر service وmethod، املأ request body، ثم أرسل. نفس مفاهيم البيئات والمصادقة وسيناريوهات الاختبار تنطبق أيضًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يغني ذلك عن &lt;code&gt;cargo test&lt;/code&gt;؟
&lt;/h3&gt;

&lt;p&gt;لا. استخدم &lt;code&gt;cargo test&lt;/code&gt; لاختبارات منطق Rust الداخلي. استخدم Apidog لاختبار العقد التشغيلي عبر HTTP.&lt;/p&gt;

&lt;p&gt;الطبقتان تكملان بعضهما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cargo test&lt;/code&gt; يكتشف دالة مكسورة.&lt;/li&gt;
&lt;li&gt;Apidog يكتشف JSON خاطئًا، status code مختلفًا، header مفقودًا، أو سلوك مصادقة غير متوقع.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  هل Apidog مجاني لمشاريع Rust مفتوحة المصدر؟
&lt;/h3&gt;

&lt;p&gt;نعم. عميل Apidog مجاني للأفراد والفرق الصغيرة، وتتضمن الطبقة المجانية سيناريوهات الاختبار، المحاكاة، وتصدير OpenAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;واجهات Rust تحتاج اختبارًا لا ينتظر المترجم في كل مرة. باستخدام Apidog يمكنك بناء مجموعة طلبات تتحقق من HTTP الحقيقي، JSON الحقيقي، JWT، mocks للواجهة الأمامية، وسيناريو CI يعمل ضد binary فعلي.&lt;/p&gt;

&lt;p&gt;ابدأ بـ &lt;code&gt;GET /healthz&lt;/code&gt;، أضف طلبات JSON، غطِّ حالات Serde الفاشلة، ثم شغّل السيناريو في CI. بعد ذلك يصبح كل تغيير في Axum أو Actix اختبار عقد واضحًا بدل مفاجأة في وقت التشغيل.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;قم بتنزيل Apidog&lt;/a&gt; ووجهه إلى خادم Rust الخاص بك. الإعداد يستغرق دقائق، والنتيجة عقد API مستقل عن &lt;code&gt;cargo&lt;/code&gt; وقابل للمشاركة مع الفريق.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>حدود معدل استخدام API GPT: المستويات، قيود الاستخدام، وكيفية اختبارها باستخدام Apidog</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Wed, 13 May 2026 07:09:01 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/hdwd-mdl-stkhdm-api-gpt-lmstwyt-qywd-lstkhdm-wkyfy-khtbrh-bstkhdm-apidog-36c7</link>
      <guid>https://dev.to/yusuf_khalidd/hdwd-mdl-stkhdm-api-gpt-lmstwyt-qywd-lstkhdm-wkyfy-khtbrh-bstkhdm-apidog-36c7</guid>
      <description>&lt;p&gt;تقوم بنشر دالة تستدعي واجهة برمجة تطبيقات GPT. تعمل في بيئة الاختبار، ثم تظهر في الإنتاج أخطاء &lt;code&gt;429 Too Many Requests&lt;/code&gt; عند أول موجة مستخدمين. قبل تعديل الكود، تحتاج إلى معرفة الحد الذي اصطدمت به فعليًا: عدد الطلبات في الدقيقة، الرموز في الدقيقة، حد يومي، أو حد مرتبط بالمستوى أو النموذج.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 يوضح هذا الدليل كيفية قراءة حدودك الحالية لأي نموذج GPT من رؤوس الاستجابة، ثم اختبارها عمليًا باستخدام طلبات محفوظة وسيناريو تحميل صغير في Apidog. النتيجة: سير عمل قابل للإعادة كلما ظهرت مشكلة في حدود المعدل.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;إذا كنت تستخدم OpenAI في الإنتاج، فتعامل مع حدود المعدل كجزء من تصميم النظام، لا كخطأ طارئ. تختلف حدود GPT-5.5 عن GPT-4.1، وتُحسب نماذج الصور والصوت والتضمينات بطرق مختلفة، وقد يتغير مستوى استخدامك بعد تغييرات الفوترة أو الإنفاق. يوفر Apidog مكانًا واحدًا لإرسال الطلبات، فحص رؤوس الاستجابة، ومحاكاة التزامن قبل نشر التغييرات.&lt;/p&gt;

&lt;h2&gt;
  
  
  القيود الأربعة التي تحتاج إلى قياسها
&lt;/h2&gt;

&lt;p&gt;تطبق OpenAI عدة حدود على كل مفتاح API. في تطبيق إنتاجي، راقب هذه الأبعاد تحديدًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RPM&lt;/strong&gt;: عدد الطلبات في الدقيقة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TPM&lt;/strong&gt;: إجمالي رموز الإدخال والإخراج في الدقيقة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RPD&lt;/strong&gt;: عدد الطلبات في اليوم، ويظهر غالبًا في المستويات المجانية أو الأولى.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IPM / TPD / حدود الدفعات&lt;/strong&gt;: حدود خاصة بنقاط نهاية الصور، الصوت، التضمينات، والـ Batch API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;عند تجاوز الحد، تحصل عادةً على HTTP &lt;code&gt;429&lt;/code&gt; مع جسم JSON مشابه:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rate limit reached for gpt-5.5 in organization org-abc on tokens per min (TPM): Limit 30000, Used 28432, Requested 3120."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tokens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"param"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate_limit_exceeded"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لا تتعامل مع &lt;code&gt;429&lt;/code&gt; كخطأ واحد. اقرأ الحقول التالية أولًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type&lt;/code&gt;: هل المشكلة في &lt;code&gt;tokens&lt;/code&gt; أم &lt;code&gt;requests&lt;/code&gt;؟&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;message&lt;/code&gt;: يوضح البعد الذي تم تجاوزه، مثل &lt;code&gt;TPM&lt;/code&gt; أو &lt;code&gt;RPM&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;code&lt;/code&gt;: غالبًا &lt;code&gt;rate_limit_exceeded&lt;/code&gt;، لكنه قد يشير أحيانًا إلى مشكلة حصة أو فوترة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;للمرجع العام حول HTTP 429 راجع &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429" rel="noopener noreferrer"&gt;وثائق MDN 429&lt;/a&gt; و&lt;a href="https://datatracker.ietf.org/doc/html/rfc6585#section-4" rel="noopener noreferrer"&gt;مواصفات RFC 6585&lt;/a&gt;. وللسلوك الخاص بـ OpenAI، راجع &lt;a href="https://platform.openai.com/docs/guides/rate-limits" rel="noopener noreferrer"&gt;صفحة حدود المعدل الرسمية&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف تعمل المستويات
&lt;/h2&gt;

&lt;p&gt;يقع مفتاح GPT API ضمن مستوى استخدام OpenAI. المستوى يحدد الحدود الفعلية مثل RPM وTPM. الانتقال بين المستويات يعتمد عادةً على:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;إجمالي الإنفاق.&lt;/li&gt;
&lt;li&gt;مرور مدة معينة منذ أول دفعة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;صورة تقريبية لمستويات نماذج النصوص:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المستوى&lt;/th&gt;
&lt;th&gt;عتبة الإنفاق&lt;/th&gt;
&lt;th&gt;عتبة الانتظار&lt;/th&gt;
&lt;th&gt;طلبات نصية في الدقيقة&lt;/th&gt;
&lt;th&gt;رموز نصية في الدقيقة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;مجاني&lt;/td&gt;
&lt;td&gt;لا يوجد&lt;/td&gt;
&lt;td&gt;لا يوجد&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;40k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5 دولارات مدفوعة&lt;/td&gt;
&lt;td&gt;لا يوجد&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;30k–200k حسب النموذج&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;50 دولارًا مدفوعة&lt;/td&gt;
&lt;td&gt;7 أيام&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;450k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;100 دولار مدفوعة&lt;/td&gt;
&lt;td&gt;7 أيام&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;250 دولارًا مدفوعة&lt;/td&gt;
&lt;td&gt;14 يومًا&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1,000 دولار مدفوعة&lt;/td&gt;
&lt;td&gt;30 يومًا&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;2M+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;هذه الأرقام توضيحية. لا تبنِ تصميم الإنتاج عليها مباشرة. اقرأ الحدود الحالية من لوحة التحكم أو من رؤوس الاستجابة قبل تقدير السعة.&lt;/p&gt;

&lt;p&gt;تبعات عملية مهمة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;الترقية قد تحدث تلقائيًا&lt;/strong&gt; بعد تجاوز عتبة الإنفاق ومدة الانتظار.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;قد تعود إلى مستوى أقل&lt;/strong&gt; إذا فشلت الفوترة أو أصبح الحساب غير نشط لفترة طويلة.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;الحدود مرتبطة بالمنظمة غالبًا&lt;/strong&gt;، وليس بالمفتاح فقط. مفتاحك قد يتأثر باستخدام مفاتيح أخرى داخل نفس المنظمة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;للمقارنة مع موفري نماذج آخرين، راجع &lt;a href="http://apidog.com/blog/openai-api-user-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;شرح حدود معدل استخدام OpenAI API&lt;/a&gt;، و&lt;a href="http://apidog.com/blog/claude-api-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل حدود معدل استخدام Claude API&lt;/a&gt;، و&lt;a href="http://apidog.com/blog/grok-3-api-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل حدود معدل استخدام Grok-3 API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  اقرأ حدودك الحالية من رؤوس الاستجابة
&lt;/h2&gt;

&lt;p&gt;كل استجابة من واجهة GPT API تحتوي غالبًا على رؤوس تحدد الحدود الحالية. راقب هذه الرؤوس:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;x-ratelimit-limit-requests&lt;/code&gt;: حد الطلبات.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x-ratelimit-remaining-requests&lt;/code&gt;: الطلبات المتبقية في النافذة الحالية.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x-ratelimit-limit-tokens&lt;/code&gt;: حد الرموز.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt;: الرموز المتبقية.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x-ratelimit-reset-requests&lt;/code&gt;: متى تتم إعادة تعبئة حاوية الطلبات.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x-ratelimit-reset-tokens&lt;/code&gt;: متى تتم إعادة تعبئة حاوية الرموز.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال قيم قد تراها:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;x-ratelimit-limit-requests: 500
x-ratelimit-remaining-requests: 499
x-ratelimit-limit-tokens: 30000
x-ratelimit-remaining-tokens: 29840
x-ratelimit-reset-requests: 6s
x-ratelimit-reset-tokens: 1m30s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذه القيم هي المصدر العملي للحقيقة عند اختبار نموذج أو مفتاح أو منظمة.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 1: إنشاء طلب GPT في Apidog
&lt;/h2&gt;

&lt;p&gt;افتح Apidog، أنشئ مشروعًا جديدًا، ثم أضف طلبًا جديدًا.&lt;/p&gt;

&lt;p&gt;استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.openai.com/v1/chat/completions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في تبويب &lt;strong&gt;Headers&lt;/strong&gt; أضف:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المفتاح&lt;/th&gt;
&lt;th&gt;القيمة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Authorization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Bearer {{OPENAI_API_KEY}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;استخدم متغير البيئة &lt;code&gt;{{OPENAI_API_KEY}}&lt;/code&gt; بدل لصق المفتاح داخل الطلب. بهذه الطريقة يمكنك التبديل بين مفاتيح شخصية، مفاتيح فريق، أو بيئات مختلفة دون تعديل الطلب نفسه.&lt;/p&gt;

&lt;p&gt;في تبويب &lt;strong&gt;Body&lt;/strong&gt; اختر JSON واستخدم طلبًا صغيرًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ping"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;اضغط &lt;strong&gt;Send&lt;/strong&gt;، ثم افتح تبويب &lt;strong&gt;Headers&lt;/strong&gt; في الاستجابة وابحث عن:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-ratelimit-limit-requests
x-ratelimit-remaining-requests
x-ratelimit-limit-tokens
x-ratelimit-remaining-tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;احفظ هذه القيم. ستستخدمها كأساس في اختبارات التحميل التالية.&lt;/p&gt;

&lt;p&gt;إذا أردت إعدادًا أوسع يتضمن المصادقة، التدفق، واستدعاءات الأدوات، راجع &lt;a href="http://apidog.com/blog/how-to-test-chatgpt-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل اختبار ChatGPT API باستخدام Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 2: تأكيد حد RPM بانفجار طلبات صغير
&lt;/h2&gt;

&lt;p&gt;قراءة الرؤوس تخبرك بالحد النظري. لاختبار السلوك عند الاقتراب من الحد، شغّل انفجارًا صغيرًا من الطلبات.&lt;/p&gt;

&lt;p&gt;في Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح الطلب المحفوظ.&lt;/li&gt;
&lt;li&gt;افتح القائمة بجوار &lt;strong&gt;Send&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;اختر &lt;strong&gt;Run in Test Scenario&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;اضبط السيناريو مثلًا على:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الإعداد&lt;/th&gt;
&lt;th&gt;القيمة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Iterations&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delay between iterations&lt;/td&gt;
&lt;td&gt;0ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;استخدم طلبًا صغيرًا مثل &lt;code&gt;ping&lt;/code&gt; حتى يكون الاختبار أقرب إلى اختبار RPM وليس TPM.&lt;/p&gt;

&lt;p&gt;النتائج المحتملة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ظهور 429 أثناء الاختبار&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
هذا يؤكد أن حد الطلبات يبدأ عند النقطة التي تشير إليها الرؤوس.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;نجاح كل الطلبات&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
قد يكون حد RPM أعلى مما توقعت. راجع رؤوس الاستجابة للحصول على القيمة الفعلية.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;بعد التشغيل، رتّب النتائج حسب رمز الحالة وافتح أي استجابة &lt;code&gt;429&lt;/code&gt;. اقرأ &lt;code&gt;message&lt;/code&gt; لمعرفة هل السبب &lt;code&gt;requests per min&lt;/code&gt; أم شيء آخر.&lt;/p&gt;

&lt;p&gt;للتعامل مع أخطاء 429 بعد ظهورها، راجع &lt;a href="http://apidog.com/blog/rate-limit-exceeded-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل تجاوز حد المعدل&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 3: افصل RPM عن TPM
&lt;/h2&gt;

&lt;p&gt;اختبار الانفجار السابق يستخدم طلبات صغيرة، لذلك يقيس غالبًا حد RPM. لاختبار TPM، استخدم طلبات أقل ولكن بحمولة نصية أكبر.&lt;/p&gt;

&lt;p&gt;عدّل الجسم مثلًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;3,000 tokens of context here&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Summarise the above in one sentence."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم شغّل سيناريو أخف:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الإعداد&lt;/th&gt;
&lt;th&gt;القيمة&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Iterations&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delay between iterations&lt;/td&gt;
&lt;td&gt;0ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;إذا كان حد TPM منخفضًا، سترى أخطاء &lt;code&gt;429&lt;/code&gt; بسبب الرموز قبل الوصول إلى حد الطلبات.&lt;/p&gt;

&lt;p&gt;قاعدة القرار:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إذا ظهرت المشكلة بسبب &lt;strong&gt;RPM&lt;/strong&gt;: قلل التزامن، أضف طابورًا، أو وزّع الطلبات زمنيًا.&lt;/li&gt;
&lt;li&gt;إذا ظهرت المشكلة بسبب &lt;strong&gt;TPM&lt;/strong&gt;: قلل حجم الموجه، قص السياق، استخدم التخزين المؤقت عند الإمكان، أو قسّم الطلب إلى مراحل أصغر.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 4: محاكاة مستخدمين متزامنين
&lt;/h2&gt;

&lt;p&gt;اختبار الانفجار جيد لتأكيد الحد، لكنه لا يشبه الإنتاج دائمًا. في الإنتاج لديك:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مستخدمون متزامنون.&lt;/li&gt;
&lt;li&gt;أحجام طلبات مختلفة.&lt;/li&gt;
&lt;li&gt;انفجارات قصيرة فوق حمل ثابت.&lt;/li&gt;
&lt;li&gt;موجهات قصيرة وطويلة حسب الحالة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في Apidog، أنشئ سيناريو اختبار يتناوب بين عدة نسخ من الطلب:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;طلب صغير.&lt;/li&gt;
&lt;li&gt;طلب متوسط.&lt;/li&gt;
&lt;li&gt;طلب كبير.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;يمكنك استخدام سكربتات JavaScript قبل وبعد الطلب من أجل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;اختيار طول رسالة عشوائي لكل تكرار.&lt;/li&gt;
&lt;li&gt;قراءة &lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt; بعد كل استجابة.&lt;/li&gt;
&lt;li&gt;إيقاف السيناريو إذا انخفضت الرموز المتبقية تحت عتبة محددة.&lt;/li&gt;
&lt;li&gt;تسجيل زمن الاستجابة للاستجابات &lt;code&gt;200&lt;/code&gt; منفصلًا عن &lt;code&gt;429&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال منطق بسيط بعد الاستجابة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remainingTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ratelimit-remaining-tokens&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remainingTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;remainingTokens&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Remaining tokens are below threshold:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;remainingTokens&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد انتهاء السيناريو، استخدم تقرير رموز الحالة لمعرفة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;متى بدأت &lt;code&gt;429&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;هل المشكلة مرتبطة بالطلبات أم الرموز.&lt;/li&gt;
&lt;li&gt;هل p95 latency يتدهور قبل ظهور التقييد.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;احفظ هذا السيناريو داخل مشروع الفريق. عند ظهور مشكلة لاحقًا، أعد تشغيله وقارن النتائج بدل التخمين.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا تفعل عند ظهور 429
&lt;/h2&gt;

&lt;p&gt;بعد تحديد الحد الذي اصطدمت به، طبّق العلاج المناسب.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. استخدم التراجع وإعادة المحاولة
&lt;/h3&gt;

&lt;p&gt;عند ظهور &lt;code&gt;429&lt;/code&gt;، لا تعِد المحاولة فورًا. اقرأ رؤوس إعادة التعيين واستخدمها لتحديد الانتظار.&lt;/p&gt;

&lt;p&gt;مثال Python مبسط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;

        &lt;span class="n"&gt;reset_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-ratelimit-reset-tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;reset_requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-ratelimit-reset-requests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# fallback بسيط إذا لم تتمكن من تحويل قيمة الرأس
&lt;/span&gt;        &lt;span class="n"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rate limited. Retry in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s. reset_tokens=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reset_tokens&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, reset_requests=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reset_requests&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدام &lt;code&gt;2 ** attempt&lt;/code&gt; أفضل من إعادة المحاولة الفورية، لكن الأفضل هو الاعتماد على &lt;code&gt;x-ratelimit-reset-*&lt;/code&gt; عندما تستطيع تحويله إلى مدة قابلة للاستخدام.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. ضع الطلبات في قائمة انتظار
&lt;/h3&gt;

&lt;p&gt;إذا كانت حركة المرور متقطعة، ضع الطلبات في queue وصرّفها بمعدل أقل من الحد الأقصى.&lt;/p&gt;

&lt;p&gt;النمط العملي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;اضبط حدًا داخليًا أقل من حد OpenAI الحقيقي.&lt;/li&gt;
&lt;li&gt;استخدم عامل أمان مثل 70% أو 80% من الحد.&lt;/li&gt;
&lt;li&gt;افصل بين محدد RPM ومحدد TPM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال شبه منطقي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;allowed_rpm = openai_rpm_limit * 0.8
allowed_tpm = openai_tpm_limit * 0.8

قبل إرسال أي طلب:
  - تحقق من عدد الطلبات المستخدمة في آخر دقيقة
  - تحقق من عدد الرموز المتوقع استخدامها
  - إذا تجاوزت الحد الداخلي، انتظر أو أدخل الطلب في queue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للتعمق في أنماط التنفيذ، راجع &lt;a href="http://apidog.com/blog/how-to-implement-api-rate-limiting?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية تنفيذ تحديد معدل واجهة برمجة التطبيقات&lt;/a&gt; و&lt;a href="http://apidog.com/blog/implementing-rate-limiting-in-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تنفيذ تحديد المعدل في واجهات برمجة التطبيقات&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. استخدم Batch API للأعمال غير المتزامنة
&lt;/h3&gt;

&lt;p&gt;إذا كان عبء العمل لا يحتاج استجابة فورية، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إثراء بيانات ليلية.&lt;/li&gt;
&lt;li&gt;تصنيف مستندات.&lt;/li&gt;
&lt;li&gt;إعادة بناء تضمينات.&lt;/li&gt;
&lt;li&gt;معالجة ملفات كبيرة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;فانقله إلى Batch API بدل استهلاك حصتك المتزامنة الخاصة بتجربة المستخدم.&lt;/p&gt;

&lt;p&gt;للتفريق بين التقييد وتحديد المعدل، راجع &lt;a href="http://apidog.com/blog/throttle-vs-rate-limit?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;التقييد مقابل تحديد المعدل&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  أخطاء GPT 429 الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Rate limit reached ... on requests per min (RPM)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;المشكلة: عدد الاستدعاءات في الدقيقة كبير جدًا.&lt;/p&gt;

&lt;p&gt;الحلول:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;قلل التزامن.&lt;/li&gt;
&lt;li&gt;لا تستخدم &lt;code&gt;map&lt;/code&gt; متوازية على كل السجلات دفعة واحدة.&lt;/li&gt;
&lt;li&gt;استخدم worker pool بحجم محسوب.&lt;/li&gt;
&lt;li&gt;أضف queue أمام استدعاءات GPT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;قاعدة بسيطة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;max_workers = floor(RPM / 2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم عامل أمان، خصوصًا إذا كانت هناك خدمات أخرى تشارك نفس المنظمة أو المفتاح.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Rate limit reached ... on tokens per min (TPM)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;المشكلة: الطلبات تستهلك رموزًا كثيرة.&lt;/p&gt;

&lt;p&gt;الحلول:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;قلل طول system prompt.&lt;/li&gt;
&lt;li&gt;لا ترسل مستندات كاملة داخل السياق دون تقطيع.&lt;/li&gt;
&lt;li&gt;قلل &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;اختصر نتائج RAG.&lt;/li&gt;
&lt;li&gt;خزّن الأجزاء الثابتة عند توفر آلية مناسبة.&lt;/li&gt;
&lt;li&gt;قسّم الطلب الكبير إلى طلبات أصغر إذا كان ذلك مناسبًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;You exceeded your current quota, please check your plan and billing details&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;هذا يبدو مثل &lt;code&gt;429&lt;/code&gt;، لكنه غالبًا ليس مشكلة rate limit تشغيلية. تحقق من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;حد الإنفاق الشهري.&lt;/li&gt;
&lt;li&gt;بطاقة الدفع.&lt;/li&gt;
&lt;li&gt;الرصيد المدفوع مسبقًا.&lt;/li&gt;
&lt;li&gt;حالة الفوترة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الحل هنا في لوحة الفوترة، وليس في إعادة المحاولة أو تقليل التزامن.&lt;/p&gt;

&lt;h2&gt;
  
  
  قائمة تحقق سريعة قبل نشر ميزة تستخدم GPT
&lt;/h2&gt;

&lt;p&gt;استخدم هذه القائمة قبل الإطلاق:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] أرسلت طلبًا واحدًا لكل نموذج مستخدم وقرأت رؤوس &lt;code&gt;x-ratelimit-*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] خزّنت قيم RPM وTPM الحالية في وثائق الفريق.&lt;/li&gt;
&lt;li&gt;[ ] شغّلت اختبار RPM بطلب صغير.&lt;/li&gt;
&lt;li&gt;[ ] شغّلت اختبار TPM بطلب كبير.&lt;/li&gt;
&lt;li&gt;[ ] أضفت retry مع backoff.&lt;/li&gt;
&lt;li&gt;[ ] أضفت queue أو limiter إذا كانت الحركة متقطعة.&lt;/li&gt;
&lt;li&gt;[ ] قللت &lt;code&gt;max_tokens&lt;/code&gt; إلى سقف واقعي.&lt;/li&gt;
&lt;li&gt;[ ] عزلت مفاتيح الإنتاج عن مفاتيح الاختبار عند الحاجة.&lt;/li&gt;
&lt;li&gt;[ ] حفظت سيناريو Apidog في مشروع مشترك للفريق.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;هل يكلف Apidog أي شيء لاختبار حدود معدل GPT؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
لا للاختبارات الأساسية. تغطي الخطة المجانية اختبار الطلبات الفردية وتشغيل اختبارات متزامنة صغيرة. تحتاج إلى خطة مدفوعة إذا أردت أحمالًا أكبر، مساحات عمل جماعية، أو تشغيلات مجدولة. راجع &lt;a href="https://apidog.com/pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تسعير Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يمكنني اختبار حدود المعدل دون استهلاك رموز حقيقية؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
جزئيًا. أرخص فحص هو طلب صغير جدًا مع &lt;code&gt;max_tokens: 1&lt;/code&gt;. ستستهلك رموزًا قليلة وتعود الرؤوس كاملة. لاختبار منطق إعادة المحاولة دون استدعاء OpenAI، استخدم خادمًا وهميًا في Apidog يحاكي استجابة &lt;code&gt;429&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;لماذا يبدو مفتاحي من المستوى الأول أبطأ من مفتاح زميل في المستوى نفسه؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
لأن الحدود غالبًا على مستوى المنظمة، لا المفتاح فقط. إذا كان مفتاحك داخل منظمة مشتركة مع استخدام كثيف، فأنت تشارك نفس الحصة. شغّل نفس الطلب من المفتاحين وقارن &lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;كيف أعرف حد كل نموذج؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
أرسل طلبًا رخيصًا لكل نموذج واقرأ رؤوس الاستجابة. لا تعتمد على جداول عامة فقط. قد تختلف حدود نموذجين قريبين في الاسم أو في إصدار اللقطة، مثل &lt;code&gt;gpt-5.5&lt;/code&gt; و&lt;code&gt;gpt-5.5-0901&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل تُحتسب طلبات البث بشكل مختلف؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
نعم بالنسبة إلى TPM. قد يحجز طلب البث رموزًا بناءً على &lt;code&gt;max_tokens&lt;/code&gt;، حتى لو كان الإكمال الفعلي أقصر. اجعل &lt;code&gt;max_tokens&lt;/code&gt; قريبًا من الحد الواقعي. يغطي &lt;a href="http://apidog.com/blog/how-to-test-chatgpt-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل اختبار ChatGPT API باستخدام Apidog&lt;/a&gt; هذا السلوك بمزيد من التفصيل.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يمكنني مشاركة اختبار حد المعدل مع فريقي؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
نعم. احفظ الطلب وسيناريو الاختبار في مشروع Apidog مشترك. يمكن لكل عضو تشغيل الاختبار بمفتاحه عبر تبديل البيئة، مما يجعل تشخيص "هل المشكلة في مفتاحي أم في المفتاح العام؟" أسرع بكثير.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GPT-5.5 Pro ضد Instant: متى يكون دفع 6 أضعاف التكلفة مستحقًا؟</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 12 May 2026 06:56:00 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/gpt-55-pro-dd-instant-mt-ykwn-df-6-df-ltklf-msthqan-13g5</link>
      <guid>https://dev.to/yusuf_khalidd/gpt-55-pro-dd-instant-mt-ykwn-df-6-df-ltklf-msthqan-13g5</guid>
      <description>&lt;p&gt;تقدم OpenAI نوعين من GPT-5.5: إصدار Instant بسعر 5 دولارات للمدخلات و30 دولارًا للمخرجات لكل مليون رمز، وإصدار Pro بسعر 30 دولارًا للمدخلات و180 دولارًا للمخرجات. هذا يعني علاوة ثابتة قدرها 6 أضعاف. القرار الهندسي العملي هو: متى تستحق هذه العلاوة، ومتى تكون إنفاقًا زائدًا بلا عائد؟&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;سيركز هذا الدليل على طريقة تنفيذية لاتخاذ القرار: حساب التكلفة على أعباء عمل واقعية، مقارنة الدقة حسب نوع المهمة، تقدير تكلفة الكمون، وبناء مجموعة اختبار في Apidog يمكنك استخدامها لمقارنة Instant وPro على طلباتك الفعلية.&lt;/p&gt;

&lt;h2&gt;
  
  
  خلاصة القول (TL;DR)
&lt;/h2&gt;

&lt;p&gt;استخدم GPT-5.5 Instant كخيار افتراضي للدردشة، التلخيص، التصنيف، QA، واستدعاء الأدوات الواضحة. انتقل إلى Pro فقط عندما تكون تكلفة الإجابة الخاطئة أعلى من علاوة الرموز البالغة 6 أضعاف للمحادثة الكاملة.&lt;/p&gt;

&lt;p&gt;أمثلة مناسبة لـ Pro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;صياغة أو مراجعة العقود القانونية&lt;/li&gt;
&lt;li&gt;الفرز الطبي أو التلخيص السريري عالي المخاطر&lt;/li&gt;
&lt;li&gt;تحليل المستندات المالية&lt;/li&gt;
&lt;li&gt;تخطيط الوكلاء متعدد الخطوات&lt;/li&gt;
&lt;li&gt;إعادة هيكلة كود عبر عدة ملفات&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا لم تستطع تحديد تكلفة الخطأ بالدولار لميزة معينة، فابدأ بـ Instant وقِس قبل الترقية إلى Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  مقدمة
&lt;/h2&gt;

&lt;p&gt;التسعير الجديد يجعل قرار اختيار النموذج قابلًا للنمذجة بدل الاعتماد على الانطباع. على سبيل المثال، فريق يعالج 100,000 رسالة دعم يوميًا قد يدفع 4,500 دولار شهريًا على Instant أو 27,000 دولار شهريًا على Pro لنفس الحجم. الفرق الشهري 22,500 دولار لميزة واحدة، ويجب تبريره برقم واضح.&lt;/p&gt;

&lt;p&gt;سنغطي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;كيف تحسب تكلفة Instant وPro لكل ميزة.&lt;/li&gt;
&lt;li&gt;أين يظهر فارق الدقة فعليًا.&lt;/li&gt;
&lt;li&gt;كيف تقيس الكمون والتكلفة على طلباتك.&lt;/li&gt;
&lt;li&gt;كيف تبني مجموعة اختبار في Apidog قبل اعتماد القرار في الإنتاج.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;إذا كنت جديدًا على عائلة 5.5، فابدأ من &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-instant?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل الوصول وواجهة برمجة التطبيقات لـ GPT-5.5 Instant&lt;/a&gt;، ثم راجع &lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل تتبع إنفاق واجهة برمجة تطبيقات OpenAI&lt;/a&gt; لربط التكلفة بالميزات. ولتفاصيل المعلمات والبث والمخرجات المنظمة، راجع &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;شرح مرجع واجهة برمجة تطبيقات GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  النموذجان وراء عائلة GPT-5.5
&lt;/h2&gt;

&lt;p&gt;يتشارك Instant وPro نفس واجهة API ونفس شكل الطلب. الاختلاف العملي يظهر في:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;معرف النموذج&lt;/li&gt;
&lt;li&gt;ميزانية التفكير الافتراضية&lt;/li&gt;
&lt;li&gt;السعر لكل رمز&lt;/li&gt;
&lt;li&gt;الكمون المتوقع&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-59.png" alt="" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;معرفات النماذج:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant: &lt;code&gt;gpt-5.5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pro: &lt;code&gt;gpt-5.5-pro&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يدعم كلاهما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;سياق إدخال حتى 272,000 رمز&lt;/li&gt;
&lt;li&gt;مخرجات حتى 128,000 رمز&lt;/li&gt;
&lt;li&gt;نفس قيم &lt;code&gt;reasoning_effort&lt;/code&gt;:
&lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;البث عبر واجهة Responses API&lt;/li&gt;
&lt;li&gt;نفس شكل الطلب تقريبًا&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا يعني أنك تستطيع تبديل النموذج من طبقة توجيه واحدة دون إعادة كتابة تكامل API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-60.png" alt="" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  مقارنة الأسعار
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;النموذج&lt;/th&gt;
&lt;th&gt;إدخال / مليون رمز&lt;/th&gt;
&lt;th&gt;إخراج / مليون رمز&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
&lt;td&gt;5$&lt;/td&gt;
&lt;td&gt;30$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;30$&lt;/td&gt;
&lt;td&gt;180$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Batch يخفض التكلفة إلى النصف:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;النموذج&lt;/th&gt;
&lt;th&gt;إدخال Batch&lt;/th&gt;
&lt;th&gt;إخراج Batch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;2.50$&lt;/td&gt;
&lt;td&gt;15$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;15$&lt;/td&gt;
&lt;td&gt;90$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;والتخزين المؤقت للطلبات يخفض رموز الإدخال المخزنة مؤقتًا إلى:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant: 0.50$ لكل مليون رمز&lt;/li&gt;
&lt;li&gt;Pro: 3$ لكل مليون رمز&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كان عبء العمل غير فوري، استخدم Batch. وإذا كان لديك system prompt ثابت، فعّل التخزين المؤقت.&lt;/p&gt;

&lt;h3&gt;
  
  
  مقارنة الكمون
&lt;/h3&gt;

&lt;p&gt;Instant عند:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reasoning_effort = minimal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;قد يعيد الرمز الأول خلال 200 إلى 400 مللي ثانية للطلبات القصيرة.&lt;/p&gt;

&lt;p&gt;Pro عند:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reasoning_effort = high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;قد يستغرق 8 إلى 30 ثانية قبل أول رمز، لأنه ينفذ تفكيرًا داخليًا أطول قبل الصياغة. أشارت TechCrunch إلى هذا الفارق في &lt;a href="https://techcrunch.com/2026/05/05/openai-releases-gpt-5-5-instant-a-new-default-model-for-chatgpt/" rel="noopener noreferrer"&gt;ملاحظات إصدار GPT-5.5 Pro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;القاعدة العملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;واجهات الدردشة التفاعلية: ابدأ بـ Instant.&lt;/li&gt;
&lt;li&gt;المعالجة غير المتزامنة أو عالية المخاطر: قيّم Pro.&lt;/li&gt;
&lt;li&gt;لا تفصل اختيار النموذج عن &lt;code&gt;reasoning_effort&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  فارق الدقة: أين يتفوق إصدار Pro؟
&lt;/h2&gt;

&lt;p&gt;حسب الأرقام المنشورة من OpenAI، يتفوق Pro في المهام متعددة الخطوات حيث تتراكم الأخطاء، بينما يتقارب مع Instant في المهام الفردية مثل الاسترجاع، التنسيق، والتلخيص البسيط.&lt;/p&gt;

&lt;p&gt;أمثلة منشورة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPQA Diamond:
Pro حوالي 87% مقابل 71% لـ Instant.&lt;/li&gt;
&lt;li&gt;SWE-bench Verified:
Pro حوالي 78% مقابل 61% لـ Instant.&lt;/li&gt;
&lt;li&gt;MMLU وHellaSwag:
كلاهما في التسعينات العليا، والفارق صغير.&lt;/li&gt;
&lt;li&gt;في طلبات طبية وقانونية عدائية، يقلل Pro الإجابات الخاطئة الواثقة بنحو 40% مقارنة بـ Instant وفق مقياس داخلي منشور.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  متى تختار Pro؟
&lt;/h3&gt;

&lt;p&gt;استخدم Pro عندما يحتاج النموذج إلى الاحتفاظ بعدة قيود في الذاكرة العاملة أثناء التفكير، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مراجعة عقد كامل&lt;/li&gt;
&lt;li&gt;تحليل مخاطر قانونية&lt;/li&gt;
&lt;li&gt;تشخيص تفريقي&lt;/li&gt;
&lt;li&gt;تخطيط وكيل متعدد الخطوات&lt;/li&gt;
&lt;li&gt;إصلاح كود عبر عدة ملفات&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  متى يكفي Instant؟
&lt;/h3&gt;

&lt;p&gt;Instant مناسب غالبًا لـ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;دعم العملاء&lt;/li&gt;
&lt;li&gt;استرداد إجابات FAQ&lt;/li&gt;
&lt;li&gt;تلخيص محتوى منخفض المخاطر&lt;/li&gt;
&lt;li&gt;تصنيف المشاعر&lt;/li&gt;
&lt;li&gt;توجيه النية&lt;/li&gt;
&lt;li&gt;استدعاء أدوات محددة جيدًا&lt;/li&gt;
&lt;li&gt;إكمال كود داخل ملف واحد&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  اختبار سريع للمقارنة بين Instant وPro
&lt;/h2&gt;

&lt;p&gt;استخدم نفس الطلب وقارن النموذجين. شكل API واحد، والاختلاف في &lt;code&gt;model&lt;/code&gt; و&lt;code&gt;reasoning.effort&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Analyze this contract clause for unilateral termination risk:
&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Either party may terminate this agreement for convenience upon
thirty (30) days written notice, provided that the terminating party
shall pay any amounts then due.&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;

&lt;span class="n"&gt;instant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;pro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSTANT:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PRO:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في اختبار كهذا، قد يعطي Instant إجابة قصيرة وسريعة تشير إلى حق الإنهاء الأساسي. بينما قد يعطي Pro تحليلًا أطول يشمل المخاطر، ثغرات تعريف “المبالغ المستحقة”، وتعديلات تعاقدية مقترحة. الاختلاف هنا ليس في شكل API، بل في عمق التحليل والتكلفة والكمون.&lt;/p&gt;

&lt;h2&gt;
  
  
  بناء تقييم محلي على طلباتك
&lt;/h2&gt;

&lt;p&gt;لا تعتمد على المعايير العامة فقط. شغّل النموذجين على 50 إلى 200 طلب من حركة المرور الحقيقية أو القريبة منها.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;PROMPTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eval_prompts.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;CONFIGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latency_s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROMPTS&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;effort&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CONFIGS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;t0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;latency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;

            &lt;span class="n"&gt;input_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_tokens&lt;/span&gt;
            &lt;span class="n"&gt;output_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_tokens&lt;/span&gt;

            &lt;span class="n"&gt;rate_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
            &lt;span class="n"&gt;rate_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;

            &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;input_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rate_in&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="n"&gt;output_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rate_out&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;

            &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;output_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد التشغيل:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;قيّم المخرجات بشكل أعمى.&lt;/li&gt;
&lt;li&gt;احسب الدقة لكل نموذج.&lt;/li&gt;
&lt;li&gt;احسب التكلفة لكل طلب.&lt;/li&gt;
&lt;li&gt;احسب الكمون.&lt;/li&gt;
&lt;li&gt;قرر لكل ميزة، لا لكل منتج كامل.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;لإعداد سير عمل تقييم API للوكلاء، راجع &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل اختبار واجهة برمجة تطبيقات وكلاء الذكاء الاصطناعي&lt;/a&gt;. ولتوليد حالات اختبار من آثار الإنتاج، راجع &lt;a href="http://apidog.com/blog/ai-api-test-generation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;توليد الاختبارات المدعوم بالذكاء الاصطناعي&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  حساب التكلفة: متى تكون 6 أضعاف مستحقة؟
&lt;/h2&gt;

&lt;h3&gt;
  
  
  الميزة 1: روبوت دعم العملاء
&lt;/h3&gt;

&lt;p&gt;الحجم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100,000 رسالة يوميًا&lt;/li&gt;
&lt;li&gt;متوسط الطلب: 800 رمز&lt;/li&gt;
&lt;li&gt;متوسط الاستجابة: 250 رمز&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الاستهلاك اليومي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;80 مليون رمز إدخال&lt;/li&gt;
&lt;li&gt;25 مليون رمز إخراج&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;تكلفة Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80M * 5$ / 1M = 400$
25M * 30$ / 1M = 750$

الإجمالي اليومي = 1,150$
الإجمالي الشهري ≈ 34,500$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;تكلفة Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80M * 30$ / 1M = 2,400$
25M * 180$ / 1M = 4,500$

الإجمالي اليومي = 6,900$
الإجمالي الشهري ≈ 207,000$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;العلاوة الشهرية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;207,000$ - 34,500$ = 172,500$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الحكم: استخدم Instant. غالبًا ستحصل على عائد أعلى من تحسين الاسترجاع وsystem prompt بدل دفع علاوة Pro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-61.png" alt="" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  الميزة 2: مساعد مراجعة الكود
&lt;/h3&gt;

&lt;p&gt;الحجم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5,000 تعليق مراجعة يوميًا&lt;/li&gt;
&lt;li&gt;متوسط الطلب: 8,000 رمز&lt;/li&gt;
&lt;li&gt;متوسط الاستجابة: 1,200 رمز&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الاستهلاك اليومي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40 مليون رمز إدخال&lt;/li&gt;
&lt;li&gt;6 مليون رمز إخراج&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40M * 5$ = 200$
6M * 30$ = 180$

الإجمالي اليومي = 380$
الإجمالي الشهري ≈ 11,400$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40M * 30$ = 1,200$
6M * 180$ = 1,080$

الإجمالي اليومي = 2,280$
الإجمالي الشهري ≈ 68,400$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;العلاوة الشهرية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;68,400$ - 11,400$ = 57,000$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا اكتشف Pro خمسة أخطاء حقيقية إضافية لكل 1,000 مراجعة، وكل خطأ يوفر ساعة مهندس كبير بسعر 150$، فالقيمة اليومية تكون:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 أخطاء * 5 مجموعات من 1000 مراجعة = 25 خطأ يوميًا
25 * 150$ = 3,750$ يوميًا
≈ 112,500$ شهريًا
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في هذه الحالة، قد يستحق Pro. لكن القرار يعتمد على قياس معدل اكتشاف الأخطاء، لا على الافتراض.&lt;/p&gt;

&lt;h3&gt;
  
  
  الميزة 3: ملخصات قانونية
&lt;/h3&gt;

&lt;p&gt;الحجم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 وثيقة يوميًا&lt;/li&gt;
&lt;li&gt;متوسط الطلب: 40,000 رمز&lt;/li&gt;
&lt;li&gt;متوسط الاستجابة: 3,000 رمز&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الاستهلاك اليومي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 مليون رمز إدخال&lt;/li&gt;
&lt;li&gt;1.5 مليون رمز إخراج&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20M * 5$ = 100$
1.5M * 30$ = 45$

الإجمالي اليومي = 145$
الإجمالي الشهري ≈ 4,350$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20M * 30$ = 600$
1.5M * 180$ = 270$

الإجمالي اليومي = 870$
الإجمالي الشهري ≈ 26,100$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;العلاوة الشهرية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;26,100$ - 4,350$ = 21,750$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في العقود القانونية، بند تعويض مفقود قد يكلف أكثر من علاوة Pro السنوية. الحكم: استخدم Pro، وإذا لم تكن النتائج فورية فاستخدم Batch لتخفيض التكلفة إلى النصف.&lt;/p&gt;

&lt;h2&gt;
  
  
  قاعدة التعادل العملية
&lt;/h2&gt;

&lt;p&gt;استخدم هذه القاعدة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;اختر Pro عندما تكون القيمة المتوقعة للأخطاء التي يمنعها
أكبر من علاوة التكلفة مقارنة بـ Instant.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;صيغة مبسطة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;قيمة التحسن = عدد الطلبات * فرق الدقة * تكلفة الخطأ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كانت:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;قيمة التحسن &amp;gt; تكلفة Pro الإضافية
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;فاستخدام Pro مبرر.&lt;/p&gt;

&lt;p&gt;مثال:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100,000 طلب شهريًا
فرق الدقة = 1%
تكلفة الخطأ = 50$

قيمة التحسن = 100,000 * 0.01 * 50
= 50,000$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كانت علاوة Pro أقل من 50,000$ شهريًا، فهو خيار منطقي. إذا كانت أعلى، ابقَ على Instant أو استخدم التصعيد الانتقائي.&lt;/p&gt;

&lt;h2&gt;
  
  
  اختبر المفاضلة بين Pro وInstant باستخدام Apidog
&lt;/h2&gt;

&lt;p&gt;لا تنقل قرار النموذج إلى الإنتاج بناءً على معيار عام. أنشئ مجموعة اختبار تراجع صغيرة في Apidog وشغّلها عند كل تغيير في prompt أو نموذج.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-58.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. أنشئ مشروعًا جديدًا
&lt;/h3&gt;

&lt;p&gt;افتح Apidog وأنشئ مشروعًا لاختبارات GPT-5.5.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. أضف طلبين إلى Responses API
&lt;/h3&gt;

&lt;p&gt;Endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.openai.com/v1/responses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الرؤوس:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{OPENAI_KEY}}
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;اجعل &lt;code&gt;OPENAI_KEY&lt;/code&gt; متغير بيئة بدل لصقه داخل الطلب.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. طلب Instant
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minimal"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{prompt}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;سمّه مثلًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt55-instant-minimal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. طلب Pro
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{prompt}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;سمّه:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt55-pro-high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. اربط &lt;code&gt;{{prompt}}&lt;/code&gt; بملف بيانات
&lt;/h3&gt;

&lt;p&gt;استخدم ملفًا يحتوي على 50 إلى 200 طلب اختبار. كل صف يمثل prompt واحدًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. التقط المقاييس
&lt;/h3&gt;

&lt;p&gt;أضف اختبارات أو post-processing لتسجيل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;response.usage.input_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response.usage.output_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;زمن الاستجابة&lt;/li&gt;
&lt;li&gt;نص الاستجابة&lt;/li&gt;
&lt;li&gt;حالة نجاح مخطط الإخراج إذا كنت تستخدم JSON schema&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. قارن النتائج
&lt;/h3&gt;

&lt;p&gt;شغّل الطلبين كدفعة واحدة على نفس البيانات. استخدم عرض الفروقات في Apidog لمقارنة الردود جنبًا إلى جنب، ثم صدّر النتائج إلى CSV واحسب التكلفة لكل طلب.&lt;/p&gt;

&lt;p&gt;احتفظ بهذه المجموعة كاختبار تراجع. عند تغيير prompt أو إصدار نموذج جديد، أعد التشغيل وقارن النتائج. يمكنك استخدام مساحة عمل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; للاحتفاظ بالسجل، أو &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تنزيل Apidog&lt;/a&gt; لإعداد سير العمل محليًا. ولشرح أكثر تفصيلًا، راجع &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل اختبار واجهة البرمجة لمهندسي ضمان الجودة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  تقنيات عملية لتقليل التكلفة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. وجّه حسب الميزة، لا حسب المستخدم
&lt;/h3&gt;

&lt;p&gt;لا تجعل قاعدة مثل “كل مستخدم مدفوع يحصل على Pro”. الأفضل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature = legal_summary  -&amp;gt; Pro
feature = support_chat   -&amp;gt; Instant
feature = code_review    -&amp;gt; Instant ثم تصعيد عند الحاجة
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أضف وسمًا لكل استدعاء API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"code_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model_policy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"escalate_on_failure"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. استخدم Pro كمسار تصعيد
&lt;/h3&gt;

&lt;p&gt;نمط عملي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أرسل الطلب إلى Instant.&lt;/li&gt;
&lt;li&gt;تحقق من النتيجة:

&lt;ul&gt;
&lt;li&gt;هل فشل JSON schema؟&lt;/li&gt;
&lt;li&gt;هل الثقة منخفضة؟&lt;/li&gt;
&lt;li&gt;هل استدعاء الأداة غير صالح؟&lt;/li&gt;
&lt;li&gt;هل المهمة عالية المخاطر؟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;إذا فشل التحقق، أعد الطلب إلى Pro.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;بهذا تدفع تكلفة Pro فقط على 5% إلى 15% من الطلبات بدل 100%.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. فعّل التخزين المؤقت للطلبات
&lt;/h3&gt;

&lt;p&gt;إذا كان system prompt ثابتًا وطويلًا، فتأكد من أن البادئة لا تتغير حرفيًا بين الطلبات. راقب:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;response.usage.cached_tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وانشئ تنبيهًا إذا انخفض معدل cache hit.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. استخدم Batch للمهام غير الفورية
&lt;/h3&gt;

&lt;p&gt;استخدم Batch لأي مهمة لا تحتاج نتيجة فورية، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;توليد محتوى ليلي&lt;/li&gt;
&lt;li&gt;تلخيص أسبوعي&lt;/li&gt;
&lt;li&gt;تصنيف بأثر رجعي&lt;/li&gt;
&lt;li&gt;معالجة مستندات كبيرة&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batch يعطي نفس النموذج ونفس نوع النتائج بنصف السعر، مقابل وقت إنجاز أطول.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. لا تملأ نافذة السياق بلا داعٍ
&lt;/h3&gt;

&lt;p&gt;يدعم كلا النموذجين حتى 272,000 رمز إدخال، لكن التكلفة تزيد خطيًا. وبعد حوالي 180,000 رمز، قد تتدهور جودة الاسترجاع في المهام الطويلة. الأفضل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تقسيم المستندات&lt;/li&gt;
&lt;li&gt;استخدام retrieval&lt;/li&gt;
&lt;li&gt;تمرير المقاطع ذات الصلة فقط&lt;/li&gt;
&lt;li&gt;تلخيص السياق قبل الطلب النهائي&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  أخطاء شائعة
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;اختيار النموذج داخل كود العميل بدل طبقة توجيه مركزية.&lt;/li&gt;
&lt;li&gt;مقارنة النماذج على benchmarks فقط، لا على طلباتك.&lt;/li&gt;
&lt;li&gt;استخدام &lt;code&gt;reasoning_effort=high&lt;/code&gt; دائمًا مع Pro.&lt;/li&gt;
&lt;li&gt;نسيان &lt;code&gt;max_output_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;عدم مراقبة &lt;code&gt;cached_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;استخدام Pro لكل مستخدم مدفوع بدل استخدامه للمهام عالية المخاطر فقط.&lt;/li&gt;
&lt;li&gt;تجاهل الكمون في واجهات المستخدم التفاعلية.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال على حد آمن للمخرجات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_output_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لاختيار نماذج أخرى عبر العائلات، راجع &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل واجهة برمجة تطبيقات Gemini 3 Flash Preview&lt;/a&gt;، و&lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;خيارات الوصول المجاني إلى واجهة برمجة تطبيقات GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  حالات استخدام واقعية
&lt;/h2&gt;

&lt;h3&gt;
  
  
  فرز مطالبات التأمين
&lt;/h3&gt;

&lt;p&gt;النمط:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant لملخصات الاستقبال الأولية.&lt;/li&gt;
&lt;li&gt;Pro للأسئلة المعقدة المتعلقة بالسياسة.&lt;/li&gt;
&lt;li&gt;حوالي 12% من المطالبات تصل إلى Pro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;النتيجة: إنفاق أقل مقارنة باستخدام Pro لكل شيء، مع دقة أعلى في الحالات الصعبة.&lt;/p&gt;

&lt;h3&gt;
  
  
  مساعد مراجعة الكود
&lt;/h3&gt;

&lt;p&gt;النمط:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant لكل Pull Request للتحقق من الأسلوب والأخطاء الواضحة.&lt;/li&gt;
&lt;li&gt;Pro عندما يلمس التغيير أكثر من ثلاثة ملفات أو مسارات حساسة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;القرار هنا يعتمد على قياس عدد الأخطاء الإضافية التي يكتشفها Pro مقارنة بتكلفته السنوية.&lt;/p&gt;

&lt;h3&gt;
  
  
  ملخصات قبول المستشفى
&lt;/h3&gt;

&lt;p&gt;النمط:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pro مع &lt;code&gt;reasoning_effort=high&lt;/code&gt; لكل ملخص عالي المخاطر.&lt;/li&gt;
&lt;li&gt;Batch للملخصات غير الفورية.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في هذا النوع من المهام، تكلفة الخطأ أعلى بكثير من تكلفة الرموز، لذلك يكون النقاش حول تقليل التكلفة عبر Batch والتخزين المؤقت، لا حول استخدام Instant بدل Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;العلاوة البالغة 6 أضعاف بين Instant وPro ليست مشكلة بحد ذاتها. هي إشارة تجبرك على حساب قيمة الإجابة الصحيحة.&lt;/p&gt;

&lt;p&gt;القاعدة العملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;اجعل Instant هو الافتراضي.&lt;/li&gt;
&lt;li&gt;استخدم Pro فقط عندما تعرف تكلفة الخطأ.&lt;/li&gt;
&lt;li&gt;وجّه حسب الميزة، لا حسب المستخدم.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;reasoning_effort&lt;/code&gt; كجزء من قرار النموذج.&lt;/li&gt;
&lt;li&gt;فعّل التخزين المؤقت وBatch عندما يسمح عبء العمل.&lt;/li&gt;
&lt;li&gt;ابنِ مجموعة اختبار تراجع في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; قبل تثبيت القرار في الإنتاج.&lt;/li&gt;
&lt;li&gt;أعد التقييم مع كل إصدار نموذج أو تغيير أسعار.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;للبدء، شغّل مقارنة التكلفة والدقة على طلباتك الخاصة. راجع أيضًا &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-instant?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل الوصول إلى GPT-5.5 Instant&lt;/a&gt; و&lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل إسناد إنفاق OpenAI لكل ميزة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;س: هل GPT-5.5 Pro أفضل بـ 6 أضعاف من Instant؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: لا. هو أغلى بـ 6 أضعاف لكل رمز. في بعض المهام عالية المخاطر ومتعددة الخطوات يكون أفضل بوضوح، لكن في كثير من المهام اليومية يكون الفرق غير كافٍ لتبرير التكلفة.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: هل يمكنني استخدام نفس كود API لكلا النموذجين؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: نعم. غيّر فقط &lt;code&gt;model&lt;/code&gt; من &lt;code&gt;gpt-5.5&lt;/code&gt; إلى &lt;code&gt;gpt-5.5-pro&lt;/code&gt;. راجع &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل واجهة برمجة تطبيقات GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: هل يعمل &lt;code&gt;reasoning_effort&lt;/code&gt; بنفس الطريقة على النموذجين؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: يقبل نفس القيم على كليهما، لكن تأثيره أكبر على Pro بسبب قدرة التفكير الأعلى.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: ما مقدار التوفير من التخزين المؤقت؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: رموز الإدخال المخزنة مؤقتًا تنخفض من 30$ إلى 3$ لكل مليون في Pro، ومن 5$ إلى 0.50$ في Instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: هل أبدأ بـ Pro ثم أخفّض إلى Instant؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: الأفضل العكس: ابدأ بـ Instant وصعّد إلى Pro عند فشل التحقق أو ارتفاع المخاطر.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: ما عقوبة الكمون في Pro؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: عند &lt;code&gt;reasoning_effort=high&lt;/code&gt; قد يستغرق أول رمز 8 إلى 30 ثانية، وقد تصل الاستجابة الكاملة إلى 20 إلى 60 ثانية للردود الطويلة.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: هل Batch يعطي نفس الإجابات؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: نعم. Batch خصم على وقت التسليم، وليس تبديلًا للنموذج. نفس النموذج ونصف السعر، مع نافذة إنجاز قد تصل إلى 24 ساعة.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;س: متى أعيد تقييم القرار؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ج: عند كل إعلان نموذج جديد، أو تغيير أسعار، أو تعديل كبير في prompt. استخدم مجموعة اختبار تراجع قابلة لإعادة التشغيل مثل الموضحة في &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل اختبار واجهة برمجة وكلاء الذكاء الاصطناعي&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>التحقق من استجابات API في اختبارات بلاي رايت</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 12 May 2026 06:21:48 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/lthqq-mn-stjbt-api-fy-khtbrt-bly-ryt-jno</link>
      <guid>https://dev.to/yusuf_khalidd/lthqq-mn-stjbt-api-fy-khtbrt-bly-ryt-jno</guid>
      <description>&lt;p&gt;تنجح اختبارات Playwright لديك: يتم النقر على زر تسجيل الدخول، تظهر لوحة التحكم، ويرسم الرسم البياني. ثم يبلغ عميل عن خطأ: أرقام الرسم البياني غير صحيحة. عند الفحص تجد أن الـ API أعادت &lt;code&gt;200 OK&lt;/code&gt; مع حمولة مشوهة، لكن اختبار E2E لم يلتقط ذلك لأنه تحقق فقط من ظهور عناصر الواجهة. هذه هي الفجوة التي لا تسدها اختبارات المتصفح وحدها. تحتاج إلى تأكيدات API تتحقق من العقد، المخطط، ودلالات الاستجابة. أدوات مثل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; تساعدك على اختبار مواصفات OpenAPI وسيناريوهات API وتشغيلها بجانب Playwright داخل CI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  ملخص سريع
&lt;/h2&gt;

&lt;p&gt;أفضل نمط عملي هو تشغيل طبقتين من الاختبارات:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Playwright&lt;/strong&gt; لتدفقات الواجهة، اعتراض الشبكة، وفحوصات API الخفيفة عند حدود إجراء المستخدم.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apidog&lt;/strong&gt; للتحقق العميق من مخططات الاستجابة، السيناريوهات المتسلسلة، ومسارات الأخطاء.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;اجعل مصدر الحقيقة واحدًا: ملف &lt;code&gt;openapi.yaml&lt;/code&gt; أو &lt;code&gt;openapi.json&lt;/code&gt;. استخدمه في Playwright لتوليد fixtures وطلبات متوقعة، واستورده في Apidog لبناء السيناريوهات والتأكيدات. بعد ذلك شغّل المجموعتين في CI بحيث يفشل أي تغيير غير متوافق في العقد بسرعة.&lt;/p&gt;

&lt;h2&gt;
  
  
  لماذا لا تكفي اختبارات Playwright وحدها؟
&lt;/h2&gt;

&lt;p&gt;توثيق Playwright يوضح أن اختبار API ممكن عبر أداة &lt;a href="https://playwright.dev/docs/api-testing" rel="noopener noreferrer"&gt;&lt;code&gt;request&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا جيد كبداية، لكنه لا يكفي عند التوسع. غالبًا تنتهي بمئات الاختبارات التي تتحقق من status code فقط، بينما تتسرب أخطاء مثل:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;تراجع شكل الحمولة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
تغير الحقل من &lt;code&gt;total_count&lt;/code&gt; إلى &lt;code&gt;totalCount&lt;/code&gt;. الواجهة قد تعرض صفرًا أو تحول القيمة ضمنيًا، فيمر اختبار UI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;انحراف منطق العمل&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
نقطة نهاية الخصم تعيد &lt;code&gt;10%&lt;/code&gt; بدل &lt;code&gt;15%&lt;/code&gt;. الواجهة تعرض ما وصلها، والاختبار ينجح رغم أن النتيجة خاطئة.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ضعف تغطية مسارات الأخطاء&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
اختبارات Playwright تميل إلى happy path. لكنها لا تغطي عادةً حالات &lt;code&gt;401&lt;/code&gt;، &lt;code&gt;409&lt;/code&gt;، &lt;code&gt;429&lt;/code&gt;، أو الفشل الجزئي.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;الحل العملي: لا تجعل Playwright مسؤولًا عن كل شيء. استخدمه للواجهة، واستخدم Apidog لاختبار API كسيناريوهات مستقلة مبنية على نفس OpenAPI spec. إذا أردت تجهيز الأداة أولًا، يمكنك &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تنزيل Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;للاطلاع على سياق أوسع حول اختيار أدوات اختبار API، راجع &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أدوات اختبار واجهة برمجة التطبيقات لمهندسي ضمان الجودة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  البنية المقترحة
&lt;/h2&gt;

&lt;p&gt;استخدم هذا التقسيم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo/
├─ openapi.yaml
├─ fixtures/
│  └─ order.json
├─ tests/
│  ├─ fixtures/
│  │  └─ api.ts
│  ├─ orders.spec.ts
│  └─ dashboard.spec.ts
└─ apidog/
   └─ scenarios/
      └─ checkout.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;القواعد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;openapi.yaml&lt;/code&gt; هو العقد الرسمي.&lt;/li&gt;
&lt;li&gt;ملفات &lt;code&gt;fixtures/&lt;/code&gt; هي بيانات الاختبار المشتركة.&lt;/li&gt;
&lt;li&gt;Playwright يقرأ fixtures لتنفيذ UI/API smoke checks.&lt;/li&gt;
&lt;li&gt;Apidog يستورد نفس OpenAPI ويبني عليها السيناريوهات.&lt;/li&gt;
&lt;li&gt;CI يشغّل Playwright و Apidog معًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;للمزيد حول نهج التصميم أولًا، راجع &lt;a href="http://apidog.com/blog/api-platform-design-first-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;سير عمل واجهة برمجة التطبيقات القائمة على التصميم أولاً&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  إنشاء fixture مشترك في Playwright
&lt;/h2&gt;

&lt;p&gt;ابدأ بملف fixture واحد يجهز &lt;code&gt;APIRequestContext&lt;/code&gt;، يجلب token جديدًا، ويحمّل بيانات الطلب من &lt;code&gt;fixtures/order.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/fixtures/api.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;APIRequestContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readFileSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ApiFixtures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;APIRequestContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;extend&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ApiFixtures&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;playwright&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playwright&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newContext&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.staging.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;extraHTTPHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/auth/token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qa@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QA_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fixtures&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد ذلك، استورد &lt;code&gt;test&lt;/code&gt; من هذا الملف بدلًا من &lt;code&gt;@playwright/test&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/orders.spec.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./fixtures/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST /orders returns a valid order with 15 percent discount&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SAVE15&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toMatchObject&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;discount_pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;total_cents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total_cents&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeLessThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtotal_cents&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا الاختبار لا يكتفي بـ &lt;code&gt;201&lt;/code&gt;. بل يتحقق من دلالة مهمة: &lt;code&gt;discount_pct&lt;/code&gt; يجب أن تكون &lt;code&gt;15&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ربط نفس البيانات داخل Apidog
&lt;/h2&gt;

&lt;p&gt;في Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;افتح المشروع.&lt;/li&gt;
&lt;li&gt;اختر &lt;strong&gt;Import&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;استورد &lt;code&gt;openapi.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أنشئ سيناريو مثل &lt;code&gt;Checkout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أضف خطوة &lt;code&gt;POST /orders&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;استخدم نفس حمولة &lt;code&gt;fixtures/order.json&lt;/code&gt; كـ body أو Data Set.&lt;/li&gt;
&lt;li&gt;فعّل JSON Schema validation مقابل مكوّن &lt;code&gt;Order&lt;/code&gt; في OpenAPI.&lt;/li&gt;
&lt;li&gt;أضف تأكيدًا على &lt;code&gt;discount_pct = 15&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;بهذا تحصل على طبقتين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright يلتقط التأكيد الدلالي المرتبط بتدفق المستخدم.&lt;/li&gt;
&lt;li&gt;Apidog يلتقط أي انحراف في المخطط، الحقول المطلوبة، الأنواع، أو enum values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كنت تستخدم Postman حاليًا وتفكر في الانتقال، راجع &lt;a href="http://apidog.com/blog/best-self-hosted-postman-alternatives-2026-2?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;بدائل Postman المستضافة ذاتيًا&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  إعداد سير عمل Apidog + Playwright
&lt;/h2&gt;

&lt;h3&gt;
  
  
  الخطوة 1: اجعل OpenAPI هو العقد
&lt;/h3&gt;

&lt;p&gt;ضع ملف المواصفات في جذر المستودع:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وتعامل معه ككود:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;كل تغيير يمر عبر PR.&lt;/li&gt;
&lt;li&gt;التغييرات الكاسرة تحتاج مراجعة واضحة.&lt;/li&gt;
&lt;li&gt;لا تعدّل fixtures بمعزل عن spec.&lt;/li&gt;
&lt;li&gt;إذا لم يكن لديك spec، أنشئ مسودة من إطار العمل المستخدم مثل FastAPI أو NestJS، ثم حسّنها يدويًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يمكن لـ Apidog أيضًا المساعدة في بناء مواصفات من حركة API عند استيراد ملفات HAR.&lt;/p&gt;

&lt;h3&gt;
  
  
  الخطوة 2: ثبّت Playwright
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init playwright@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أضف سكريبتات الاختبار:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:e2e"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"playwright test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:e2e:smoke"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"playwright test --grep @smoke"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال &lt;code&gt;playwright.config.ts&lt;/code&gt; مختصر:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;testDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tests&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;workers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APP_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://staging.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on-first-retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  الخطوة 3: ابنِ سيناريوهات Apidog
&lt;/h3&gt;

&lt;p&gt;أنشئ سيناريو لكل رحلة حرجة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التسجيل.&lt;/li&gt;
&lt;li&gt;تسجيل الدخول.&lt;/li&gt;
&lt;li&gt;إنشاء طلب.&lt;/li&gt;
&lt;li&gt;الدفع.&lt;/li&gt;
&lt;li&gt;رد الأموال.&lt;/li&gt;
&lt;li&gt;webhook delivery.&lt;/li&gt;
&lt;li&gt;idempotency checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;داخل كل سيناريو:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;نفّذ request.&lt;/li&gt;
&lt;li&gt;خزّن قيمًا مثل &lt;code&gt;order_id&lt;/code&gt; أو &lt;code&gt;payment_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;استخدمها في الخطوات التالية.&lt;/li&gt;
&lt;li&gt;شغّل schema validation.&lt;/li&gt;
&lt;li&gt;أضف assertions لمنطق العمل.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال تدفق:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /auth/token
POST /orders
GET /orders/{id}
POST /payments
GET /payments/{id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم صدّر السيناريو للتشغيل عبر CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog-cli run ./apidog/scenarios/checkout.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  استخدام page.route لعزل الواجهة
&lt;/h2&gt;

&lt;p&gt;عندما تريد اختبار UI دون الاعتماد على backend مباشر، استخدم &lt;code&gt;page.route&lt;/code&gt; مع نفس fixtures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/dashboard.spec.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./fixtures/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dashboard renders cached order list when offline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/api/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fulfill&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order-row&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا مفيد لعزل الواجهة، لكنه ليس بديلًا لاختبار API الحقيقي. لذلك شغّل في Apidog سيناريو &lt;code&gt;GET /orders&lt;/code&gt; مقابل backend الفعلي أو mock server.&lt;/p&gt;

&lt;h2&gt;
  
  
  تشغيل Playwright و Apidog في GitHub Actions
&lt;/h2&gt;

&lt;p&gt;أضف workflow يشغّل المجموعتين:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;playwright&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx playwright install --with-deps&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx playwright test&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;APP_BASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APP_BASE_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.API_BASE_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;QA_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.QA_PASSWORD }}&lt;/span&gt;

  &lt;span class="na"&gt;apidog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm i -g apidog-cli&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apidog-cli run ./apidog/scenarios/checkout.json --reporters cli,junit&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.API_BASE_URL }}&lt;/span&gt;
          &lt;span class="na"&gt;QA_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.QA_PASSWORD }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أي فشل في Playwright أو Apidog يمنع الدمج.&lt;/p&gt;

&lt;p&gt;تغطي &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;وثائق GitHub Actions&lt;/a&gt; إعداد المصفوفات، التخزين المؤقت، وتشغيل jobs بالتوازي.&lt;/p&gt;

&lt;h2&gt;
  
  
  اكتشاف انحراف العقد مبكرًا
&lt;/h2&gt;

&lt;p&gt;أضف مهمة يومية تقارن المواصفات الحالية بالنسخة المستخدمة في الاختبارات. الفكرة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi-diff old-openapi.yaml openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا تغيّر نوع حقل أو اختفى حقل مطلوب، افشل البناء قبل تشغيل الاختبارات.&lt;/p&gt;

&lt;p&gt;هذا يلتقط فئة أخطاء مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 OK
لكن body لا يطابق العقد
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وهي المشكلة التي لا تلتقطها اختبارات UI غالبًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  تقنيات عملية لتحسين الاستقرار
&lt;/h2&gt;

&lt;h3&gt;
  
  
  فعّل Playwright trace
&lt;/h3&gt;

&lt;p&gt;في &lt;code&gt;playwright.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on-first-retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;عند الفشل تحصل على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;network timeline.&lt;/li&gt;
&lt;li&gt;DOM snapshots.&lt;/li&gt;
&lt;li&gt;console logs.&lt;/li&gt;
&lt;li&gt;screenshots.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ادمج ذلك مع تقارير Apidog لتعرف هل الانهيار بدأ من الواجهة أم من API.&lt;/p&gt;

&lt;h3&gt;
  
  
  استخدم mock server من Apidog
&lt;/h3&gt;

&lt;p&gt;عندما تكون بيئة staging غير مستقرة، شغّل mock server من OpenAPI spec، ثم وجّه تطبيقك إليه محليًا.&lt;/p&gt;

&lt;p&gt;النمط المقترح:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright يعمل ضد mock server عند الحاجة لعزل UI.&lt;/li&gt;
&lt;li&gt;Apidog يعمل ضد backend الحقيقي للتحقق من العقد.&lt;/li&gt;
&lt;li&gt;نفس fixtures تُستخدم في الحالتين.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;للمزيد حول توليد اختبارات API، راجع &lt;a href="http://apidog.com/blog/ai-api-test-generation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;إنشاء اختبارات واجهة برمجة التطبيقات بمساعدة الذكاء الاصطناعي&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  لا ترفع retries أكثر من اللازم
&lt;/h3&gt;

&lt;p&gt;استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا احتاج الاختبار إلى 5 محاولات، فالمشكلة ليست في CI فقط. لديك test flaky أو backend غير مستقر. في سيناريوهات Apidog، اجعل retry لكل request محدودًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  افشل عند انحراف المخطط
&lt;/h3&gt;

&lt;p&gt;لا تجعل schema mismatch مجرد warning. يجب أن يفشل CI.&lt;/p&gt;

&lt;p&gt;إذا احتجت إلى فترة انتقالية، اجعلها صريحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ALLOW_SCHEMA_DRIFT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;واطلب تعليقًا في PR يشرح السبب.&lt;/p&gt;

&lt;h3&gt;
  
  
  صنّف الاختبارات
&lt;/h3&gt;

&lt;p&gt;استخدم tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;checkout @smoke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استراتيجية تشغيل مقترحة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@smoke&lt;/code&gt; على كل push.&lt;/li&gt;
&lt;li&gt;regression على PR إلى &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;سيناريوهات Apidog الكاملة ليلًا.&lt;/li&gt;
&lt;li&gt;الاختبارات ذات الحالة stateful تعمل serial.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;serial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  أخطاء شائعة يجب تجنبها
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;الاكتفاء بـ &lt;code&gt;status === 200&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;تخزين bearer tokens داخل fixtures.&lt;/li&gt;
&lt;li&gt;استخدام fixtures مختلفة بين Playwright و Apidog.&lt;/li&gt;
&lt;li&gt;تجاهل تشغيل Apidog CLI في CI.&lt;/li&gt;
&lt;li&gt;اعتبار &lt;code&gt;page.route&lt;/code&gt; بديلًا لاختبار API الحقيقي.&lt;/li&gt;
&lt;li&gt;تعديل OpenAPI بدون تحديث السيناريوهات.&lt;/li&gt;
&lt;li&gt;بناء assertions كثيرة داخل اختبار UI بدل نقلها إلى طبقة API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;للاختبارات غير الحتمية، خصوصًا مع وكلاء الذكاء الاصطناعي، راجع &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية اختبار واجهة برمجة تطبيقات وكلاء الذكاء الاصطناعي&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  مقارنة الأدوات
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المكدس&lt;/th&gt;
&lt;th&gt;نقاط القوة&lt;/th&gt;
&lt;th&gt;نقاط الضعف&lt;/th&gt;
&lt;th&gt;الأفضل لـ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Playwright وحده&lt;/td&gt;
&lt;td&gt;أداة واحدة، سريع، مدمج مع اختبارات UI&lt;/td&gt;
&lt;td&gt;تحقق محدود من المخطط، سيناريوهات API متسلسلة أصعب&lt;/td&gt;
&lt;td&gt;فرق صغيرة وواجهات API بسيطة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright + Postman&lt;/td&gt;
&lt;td&gt;نظام Postman ناضج، Newman CLI&lt;/td&gt;
&lt;td&gt;احتمال وجود مصدرين للحقيقة وانحراف collections عن OpenAPI&lt;/td&gt;
&lt;td&gt;فرق تستخدم Postman بالفعل&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright + Apidog&lt;/td&gt;
&lt;td&gt;OpenAPI كمصدر واحد، schema validation، mock server، CLI لـ CI&lt;/td&gt;
&lt;td&gt;أداتان للتعلم، ويتطلب انضباطًا في المواصفات&lt;/td&gt;
&lt;td&gt;فرق تريد اختبارًا موجهًا بالمواصفات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cypress + cy-api&lt;/td&gt;
&lt;td&gt;مألوف لمستخدمي Cypress&lt;/td&gt;
&lt;td&gt;اختبار API أقل مرونة، والاعتماد على plugins&lt;/td&gt;
&lt;td&gt;مشاريع Cypress الحالية&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pact&lt;/td&gt;
&lt;td&gt;عقود قوية بين الخدمات&lt;/td&gt;
&lt;td&gt;منحنى تعلم أعلى ولا يركز على UI&lt;/td&gt;
&lt;td&gt;منظمات microservices كثيرة المستهلكين&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;إذا كنت تنتقل من أدوات أقدم، راجع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/soapui-groovy-script-alternatives-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;بدائل سكريبت SoapUI Groovy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/readyapi-alternatives-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;بدائل ReadyAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/best-rest-client-vscode-extensions-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ملحقات REST client لـ VSCode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  حالات استخدام واقعية
&lt;/h2&gt;

&lt;h3&gt;
  
  
  checkout في التجارة الإلكترونية
&lt;/h3&gt;

&lt;p&gt;Playwright يتحقق من رحلة المستخدم من السلة إلى صفحة التأكيد. Apidog يتحقق من سلسلة API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /orders
POST /payments
GET /inventory
POST /refunds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا تغيّر حقل مثل &lt;code&gt;error_code&lt;/code&gt; إلى &lt;code&gt;errorCode&lt;/code&gt;، يلتقط Apidog انحراف المخطط بسرعة، بينما قد يعرض Playwright رسالة عامة مثل "فشل الدفع".&lt;/p&gt;

&lt;h3&gt;
  
  
  لوحة تحكم SaaS للرسوم البيانية
&lt;/h3&gt;

&lt;p&gt;Playwright يتحقق من ظهور الرسم البياني. Apidog يتحقق من أن endpoints التجميع تعيد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;المجاميع الصحيحة.&lt;/li&gt;
&lt;li&gt;النسب المئوية.&lt;/li&gt;
&lt;li&gt;السلاسل الزمنية المتوقعة.&lt;/li&gt;
&lt;li&gt;الحقول المطلوبة حسب OpenAPI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بهذا لا تمر شاشة جميلة فوق بيانات خاطئة.&lt;/p&gt;

&lt;h3&gt;
  
  
  webhooks في fintech
&lt;/h3&gt;

&lt;p&gt;Playwright يغطي البوابة المرئية. Apidog يغطي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;webhook delivery.&lt;/li&gt;
&lt;li&gt;retry behavior.&lt;/li&gt;
&lt;li&gt;idempotency.&lt;/li&gt;
&lt;li&gt;signature validation.&lt;/li&gt;
&lt;li&gt;رفض webhook مكرر.&lt;/li&gt;
&lt;li&gt;نافذة eventual consistency أقل من 30 ثانية.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;Playwright ممتاز لاختبارات المتصفح، لكنه ليس كافيًا لاختبار API بعمق. الإعداد العملي هو:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI spec واحد كمصدر حقيقة.&lt;/li&gt;
&lt;li&gt;fixtures مشتركة بين Playwright و Apidog.&lt;/li&gt;
&lt;li&gt;Playwright لتدفقات UI وnetwork stubbing.&lt;/li&gt;
&lt;li&gt;Apidog للتحقق من schema، السيناريوهات المتسلسلة، ومسارات الأخطاء.&lt;/li&gt;
&lt;li&gt;CI واحد يشغّل المجموعتين ويفشل عند أي انحراف.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ابدأ برحلة حرجة واحدة مثل التسجيل أو الدفع. اربط fixture في Playwright، أنشئ سيناريو Apidog مطابقًا، ثم شغّلهما معًا في CI. بعد ذلك وسّع التغطية endpoint تلو الآخر.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل يمكنني التحقق من API داخل Playwright بدون Apidog؟
&lt;/h3&gt;

&lt;p&gt;نعم. يمكنك استخدام أداة &lt;code&gt;request&lt;/code&gt; في Playwright مع &lt;code&gt;expect&lt;/code&gt;. هذا مناسب لفحوصات بسيطة مثل status code وبعض الحقول. لكن للتحقق من المخطط، السيناريوهات المتسلسلة، المحاكاة، ومسارات الأخطاء على نطاق أوسع، أداة مخصصة مثل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; ستكون أكثر عملية. راجع مقارنة &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أدوات اختبار واجهة برمجة التطبيقات لمهندسي ضمان الجودة&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل أحتاج إلى OpenAPI spec؟
&lt;/h3&gt;

&lt;p&gt;نعم إذا أردت الفائدة الكاملة. بدون OpenAPI يمكنك تشغيل Playwright و Apidog جنبًا إلى جنب، لكنك ستفقد المصدر المشترك للحقيقة وستضطر لصيانة الأمثلة في أكثر من مكان.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف أتعامل مع المصادقة؟
&lt;/h3&gt;

&lt;p&gt;اجلب token جديدًا في بداية الاختبار:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/auth/token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم خزّنه في Playwright fixture وفي متغير بيئة داخل Apidog. لا تحفظ tokens ثابتة داخل المستودع.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكن أن يحل Apidog محل Playwright؟
&lt;/h3&gt;

&lt;p&gt;لا. Apidog يختبر API workflows، لكنه لا يشغّل متصفحًا ولا يتحقق من عناصر الواجهة. استخدم Playwright للنصوص المرئية، النقرات، التنقل، والتخطيط. استخدم Apidog للعقد والمخططات وسلاسل API.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا أفعل إذا لم تكن بيئة staging مستقرة؟
&lt;/h3&gt;

&lt;p&gt;استخدم mock server من Apidog مبنيًا على OpenAPI. شغّل Playwright ضد mock server لعزل الواجهة، وشغّل سيناريوهات Apidog ضد backend الحقيقي عندما تكون البيئة متاحة.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف أحافظ على سرعة CI؟
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;شغّل &lt;code&gt;@smoke&lt;/code&gt; على كل push.&lt;/li&gt;
&lt;li&gt;شغّل regression على PRs.&lt;/li&gt;
&lt;li&gt;شغّل سيناريوهات Apidog الكاملة ليلًا.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;workers: 4&lt;/code&gt; في Playwright.&lt;/li&gt;
&lt;li&gt;شغّل سيناريوهات Apidog بالتوازي إذا كان CLI يدعم ذلك في إعدادك.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  هل أحتاج إلى خطة مدفوعة من Apidog لتشغيل CI؟
&lt;/h3&gt;

&lt;p&gt;تحقق من صفحة الأسعار الحالية قبل الاعتماد على نطاق واسع. عادةً يمكن للفرق الصغيرة البدء بالطبقة المجانية، لكن قرار الترخيص يعتمد على حجم الفريق، التعاون، واحتياجات التشغيل.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>OpenAI Daybreak ضد Claude Mythos: مقارنة شاملة</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 12 May 2026 06:10:40 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/openai-daybreak-dd-claude-mythos-mqrn-shml-ogk</link>
      <guid>https://dev.to/yusuf_khalidd/openai-daybreak-dd-claude-mythos-mqrn-shml-ogk</guid>
      <description>&lt;p&gt;أطلق اثنان من أهم مختبرات الذكاء الاصطناعي في العالم منصات للأمن السيبراني خلال خمسة أسابيع فقط. أعلنت Anthropic عن Claude Mythos في 7 أبريل 2026، ثم تبعتها OpenAI بمنصة Daybreak في 11 مايو 2026.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;على السطح، تبدو المنصتان متشابهتين: نماذج متقدمة لاكتشاف الثغرات، توليد إثباتات الاستغلال، ومساعدة فرق الدفاع على التحرك بسرعة أكبر. عمليًا، الاختلافات مهمة جدًا: من يمكنه الوصول، كيف يتم منح الصلاحيات، ما الذي تستطيع النماذج فعله، وكيف تتعامل كل شركة مع إطلاق قدرات أمنية عالية الخطورة.&lt;/p&gt;

&lt;p&gt;هذا الدليل يقارن بين Claude Mythos و OpenAI Daybreak من زاوية عملية: أيهما يمكنك استخدامه، متى تختاره، وكيف تدمجه في سير عمل فريقك.&lt;/p&gt;

&lt;h2&gt;
  
  
  الإجابة المختصرة
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/claude-mythos/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;&lt;strong&gt;Claude Mythos&lt;/strong&gt;&lt;/a&gt; هو نموذج بحثي متطور من Anthropic، محجوب عمدًا خلف كونسورتيوم قائم على الدعوات فقط باسم Project Glasswing. وفق الأرقام المنشورة، هو النموذج الأقوى في اكتشاف الثغرات واستنساخها. لكن غالبًا لن تستطيع الوصول إليه.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg53ejm1mpjr5wpgax6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg53ejm1mpjr5wpgax6z.png" alt="Claude Mythos" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openai.com/daybreak/" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenAI Daybreak&lt;/strong&gt;&lt;/a&gt; هي منصة مبنية حول GPT-5.5، بثلاثة مستويات وصول، ومكون إضافي لأمن Codex، ونظام شركاء أوسع. قدراتها المنشورة أكثر تحفظًا، لكنها أقرب إلى منتج يمكن لفريق أمني استخدامه فعليًا.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcg0hd6agifvzz7qe8dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcg0hd6agifvzz7qe8dm.png" alt="OpenAI Daybreak" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الخلاصة العملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;إذا أردت أعلى قدرة خام لاكتشاف الثغرات: &lt;strong&gt;Mythos يتقدم نظريًا&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;إذا أردت أداة يمكن نشرها هذا الربع داخل فريقك: &lt;strong&gt;Daybreak يتقدم عمليًا&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  مقارنة سريعة
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الميزة&lt;/th&gt;
&lt;th&gt;Claude Mythos&lt;/th&gt;
&lt;th&gt;OpenAI Daybreak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;تاريخ الإطلاق&lt;/td&gt;
&lt;td&gt;7 أبريل 2026&lt;/td&gt;
&lt;td&gt;11 مايو 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;المورد&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;النوع&lt;/td&gt;
&lt;td&gt;نموذج بحثي متطور&lt;/td&gt;
&lt;td&gt;منصة: نماذج متعددة + Codex Security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التوفر العام&lt;/td&gt;
&lt;td&gt;لا، Project Glasswing فقط&lt;/td&gt;
&lt;td&gt;نعم، مع مستويات تحقق&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;المستويات&lt;/td&gt;
&lt;td&gt;نموذج بحثي واحد&lt;/td&gt;
&lt;td&gt;GPT-5.5 / وصول موثوق للأمن السيبراني / GPT-5.5-Cyber&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;منصة الكود&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;مكون إضافي لأمن Codex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;معدل نجاح CTF&lt;/td&gt;
&lt;td&gt;73% في CTFs مستوى الخبراء&lt;/td&gt;
&lt;td&gt;لم يتم الكشف عنه علنًا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;اكتشاف الثغرات غير المعلنة&lt;/td&gt;
&lt;td&gt;الآلاف في اختبار ما قبل الإصدار&lt;/td&gt;
&lt;td&gt;القدرة مدعاة، دون أرقام عامة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;استنساخ الثغرات&lt;/td&gt;
&lt;td&gt;83% نجاح في المحاولة الأولى&lt;/td&gt;
&lt;td&gt;لم يتم الكشف عنه علنًا&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;الشركاء&lt;/td&gt;
&lt;td&gt;حوالي 40 منظمة منها AWS وApple وMicrosoft وGoogle وCrowdStrike وPalo Alto&lt;/td&gt;
&lt;td&gt;أكثر من 20 بائعًا منهم Cisco وCloudflare وSnyk وTenable وFortinet وZscaler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;نموذج الوصول&lt;/td&gt;
&lt;td&gt;دعوة فقط عبر Project Glasswing&lt;/td&gt;
&lt;td&gt;تقديم + تدقيق للمستويات المرتفعة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;حالة الاستخدام الأساسية&lt;/td&gt;
&lt;td&gt;البحث في ثغرات البنية التحتية الحيوية&lt;/td&gt;
&lt;td&gt;سير عمل تطوير آمن ومستمر&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;التسعير&lt;/td&gt;
&lt;td&gt;لم يتم الكشف عنه&lt;/td&gt;
&lt;td&gt;تسعير منصة OpenAI للمستويات المتاحة&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ما هو Claude Mythos؟
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/claude-mythos/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;معاينة Claude Mythos&lt;/a&gt; هي نموذج Anthropic متقدم يتجاوز عائلة &lt;a href="https://www.anthropic.com/news/claude-4" rel="noopener noreferrer"&gt;Claude 4&lt;/a&gt; العامة. النموذج متعدد الأغراض، لكنه موجه بقوة نحو التفكير طويل الأمد وأمن البرمجيات.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63yboehol4qv4b5v1z4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63yboehol4qv4b5v1z4r.png" alt="Claude Mythos preview" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;الأرقام المنشورة حول Mythos قوية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;حقق &lt;strong&gt;73%&lt;/strong&gt; في تحديات CTF على مستوى الخبراء.&lt;/li&gt;
&lt;li&gt;حدد الآلاف من الثغرات غير المعلنة في اختبارات ما قبل الإصدار عبر أنظمة تشغيل ومتصفحات رئيسية.&lt;/li&gt;
&lt;li&gt;استنسخ الثغرات وأنتج استغلالات عاملة في المحاولة الأولى بنسبة &lt;strong&gt;83%&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لكن هذه القدرة تأتي مع مخاطرة. لذلك لم تطلق Anthropic النموذج للعامة. بدلًا من ذلك، أنشأت &lt;strong&gt;Project Glasswing&lt;/strong&gt;: كونسورتيوم خاص يستخدم Mythos لتعزيز البرمجيات الحيوية قبل أن تتوفر قدرات مشابهة للمهاجمين.&lt;/p&gt;

&lt;p&gt;يشمل Project Glasswing شركات مثل AWS وApple وMicrosoft وGoogle وCrowdStrike وPalo Alto Networks، إضافة إلى حوالي 40 منظمة أخرى عبر الدعوة فقط.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا يعني ذلك عمليًا؟
&lt;/h3&gt;

&lt;p&gt;إذا لم تكن ضمن Project Glasswing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;لا يوجد مسار تسجيل عام.&lt;/li&gt;
&lt;li&gt;لا توجد صفحة تسعير.&lt;/li&gt;
&lt;li&gt;لا توجد قائمة انتظار معلنة.&lt;/li&gt;
&lt;li&gt;لا يمكنك بناء خطة أمنية تعتمد على الوصول إلى Mythos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;يمكنك فقط متابعة التقارير العامة، مثل تقييمات AISI، واستخدام نماذج Claude العامة في المهام الأمنية المصرح بها.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما هو OpenAI Daybreak؟
&lt;/h2&gt;

&lt;p&gt;Daybreak ليست نموذجًا واحدًا، بل منصة تجمع بين مستويات قدرات مختلفة وأداة وكيلية تعتمد على Codex ونظام شركاء واسع.&lt;/p&gt;

&lt;p&gt;المستويات الثلاثة هي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.5&lt;/strong&gt;: النموذج العام، متاح لمستخدمي OpenAI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.5 مع وصول موثوق للأمن السيبراني&lt;/strong&gt;: للمدافعين المعتمدين، مع معدلات رفض أقل لأعمال أمنية مشروعة مثل تحليل البرمجيات الخبيثة والهندسة العكسية.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.5-Cyber&lt;/strong&gt;: معاينة محدودة لفرق الهجوم المصرح بها واختبار الاختراق في بيئات مسموح بها.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الطبقة التشغيلية هي &lt;strong&gt;Codex Security&lt;/strong&gt;. الفكرة العملية:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;توصيله بمستودع الكود.&lt;/li&gt;
&lt;li&gt;بناء نموذج تهديد من قاعدة الكود.&lt;/li&gt;
&lt;li&gt;مراقبة مستمرة للثغرات.&lt;/li&gt;
&lt;li&gt;إرسال النتائج إلى أدوات الأمان الحالية.&lt;/li&gt;
&lt;li&gt;إنشاء تصحيحات والتحقق منها داخل نفس الحلقة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;غطينا المنصة بمزيد من التفصيل في: &lt;a href="http://apidog.com/blog/what-is-openai-daybreak?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ما هو OpenAI Daybreak&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;باختصار: Daybreak مصممة لفرق الأمن التي تريد دمج الذكاء الاصطناعي داخل سير العمل اليومي، وليس فقط استدعاء نموذج بحثي يدويًا عند الحاجة.&lt;/p&gt;

&lt;h2&gt;
  
  
  القدرة: أين يتفوق Mythos؟
&lt;/h2&gt;

&lt;p&gt;على مستوى المقاييس المنشورة، Mythos يتقدم.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. اكتشاف الثغرات
&lt;/h3&gt;

&lt;p&gt;وجد Mythos آلاف الثغرات غير المعلنة في اختبارات ما قبل الإصدار على أنظمة التشغيل والمتصفحات.&lt;/p&gt;

&lt;p&gt;تدعي OpenAI قدرة مشابهة في GPT-5.5-Cyber، لكنها لم تنشر أرقامًا قابلة للمقارنة.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. استنساخ الثغرات
&lt;/h3&gt;

&lt;p&gt;ينتج Mythos استغلالات عاملة في المحاولة الأولى بنسبة 83% من الوقت.&lt;/p&gt;

&lt;p&gt;هذا مهم لفرق:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Red Teaming&lt;/li&gt;
&lt;li&gt;اختبار الاختراق&lt;/li&gt;
&lt;li&gt;التحقق من قابلية الاستغلال&lt;/li&gt;
&lt;li&gt;ترتيب أولويات الإصلاح&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. التفكير طويل الأمد
&lt;/h3&gt;

&lt;p&gt;يمكن لـ Mythos تنفيذ مهام متعددة المراحل: اكتشاف، استغلال، وما بعد الاستغلال، مع الحفاظ على السياق.&lt;/p&gt;

&lt;p&gt;هذا النوع من العمل قد يستغرق أيامًا من محلل بشري محترف.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. التقييم المستقل
&lt;/h3&gt;

&lt;p&gt;أكد &lt;a href="https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities" rel="noopener noreferrer"&gt;تقييم معهد سلامة الذكاء الاصطناعي في المملكة المتحدة لقدرات Mythos السيبرانية&lt;/a&gt; قفزة كبيرة مقارنة بالجيل السابق. نشر AISI أيضًا تقييمًا لقدرات GPT-5.5 السيبرانية، لكن الأرقام الرئيسية المنشورة تميل لصالح Mythos.&lt;/p&gt;

&lt;p&gt;إذا كان سؤالك هو: "أي نموذج أفضل في العثور على الثغرات واستغلالها الآن؟" فالإجابة هي &lt;strong&gt;Mythos&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  التوفر وسير العمل: أين يتفوق Daybreak؟
&lt;/h2&gt;

&lt;p&gt;القدرة التي لا تستطيع الوصول إليها لا تساعد فريقك.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. التوزيع
&lt;/h3&gt;

&lt;p&gt;يمكن لأي شخص لديه حساب OpenAI استخدام GPT-5.5 في أعمال أمنية مشروعة اليوم.&lt;/p&gt;

&lt;p&gt;أما الوصول الموثوق للأمن السيبراني فيتطلب طلبًا وتحققًا. ومع ذلك، يوجد مسار واضح.&lt;/p&gt;

&lt;p&gt;في المقابل، Mythos متاح بالدعوة فقط، ولا يوجد مسار عام للوصول إليه.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. تكامل سير العمل
&lt;/h3&gt;

&lt;p&gt;Codex Security منتج مصمم للاتصال بالمستودعات والأدوات الأمنية والعمل باستمرار.&lt;/p&gt;

&lt;p&gt;سير عمل Daybreak أقرب إلى هذا النمط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository
   ↓
Codex Security
   ↓
Threat model + vulnerability scan
   ↓
Security tools / tickets / pull requests
   ↓
Patch generation + verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أما Mythos عبر Glasswing فهو أقرب إلى برنامج بحث ثغرات موجّه لشركاء محددين، وليس منتجًا عامًا مدمجًا في أدوات المطورين.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. النظام البيئي
&lt;/h3&gt;

&lt;p&gt;Daybreak يأتي مع تكاملات عبر طبقات متعددة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نقاط النهاية: CrowdStrike وSentinelOne&lt;/li&gt;
&lt;li&gt;السحابة: Cloudflare وAkamai&lt;/li&gt;
&lt;li&gt;الهوية: Okta&lt;/li&gt;
&lt;li&gt;أمان الكود: Snyk وSemgrep وSocket&lt;/li&gt;
&lt;li&gt;إدارة الثغرات: Qualys وRapid7 وTenable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Project Glasswing لديه شركاء كبار، لكن نطاقه أضيق وأقل توجهًا لسير عمل المطور اليومي.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. الخدمة الذاتية
&lt;/h3&gt;

&lt;p&gt;يمكن لفريقك التعامل مع Daybreak كمنتج:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;إنشاء حساب.&lt;/li&gt;
&lt;li&gt;استخدام GPT-5.5.&lt;/li&gt;
&lt;li&gt;التقديم للوصول الموثوق إذا كنت تحتاجه.&lt;/li&gt;
&lt;li&gt;ربط المستودعات.&lt;/li&gt;
&lt;li&gt;دمج النتائج مع أدوات الأمن الحالية.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;لا يوجد مسار مشابه لـ Mythos.&lt;/p&gt;

&lt;p&gt;لذلك، بالنسبة لمعظم فرق الأمن والهندسة: &lt;strong&gt;Daybreak هو الخيار القابل للتنفيذ&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف تقرر بينهما؟
&lt;/h2&gt;

&lt;p&gt;استخدم هذا القرار العملي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;هل أنت شريك في Project Glasswing؟
├─ نعم
│  ├─ استخدم Mythos للبحث العميق عن الثغرات في الأنظمة الحيوية
│  └─ استخدم Daybreak لسير العمل الدفاعي اليومي
└─ لا
   ├─ قيّم Daybreak الآن
   ├─ استخدم Claude Code أو GPT-5.5 للمهام الأمنية المصرح بها
   └─ تابع Mythos عبر التقارير العامة فقط
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;صياغة "Mythos مقابل Daybreak" جذابة إعلاميًا، لكنها غير دقيقة لمعظم الفرق.&lt;/p&gt;

&lt;p&gt;في الواقع، الخيار العملي هو:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Daybreak الآن، أو انتظار وصول Mythos غير مضمون.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  الفلسفة: رهانان مختلفان على السلامة
&lt;/h2&gt;

&lt;p&gt;الاختلاف الأعمق ليس تقنيًا فقط، بل يتعلق بطريقة إطلاق القدرات الخطيرة.&lt;/p&gt;

&lt;h3&gt;
  
  
  رهان Anthropic
&lt;/h3&gt;

&lt;p&gt;هذه القدرة قوية وخطيرة جدًا للإطلاق العام. الأفضل استخدامها بشكل خاص مع شركاء موثوقين لتأمين البرمجيات الحيوية قبل أن يحصل المهاجمون على قدرات مشابهة.&lt;/p&gt;

&lt;p&gt;في هذا النموذج، &lt;strong&gt;Project Glasswing هو المنتج الحقيقي&lt;/strong&gt;، وليس Mythos وحده.&lt;/p&gt;

&lt;h3&gt;
  
  
  رهان OpenAI
&lt;/h3&gt;

&lt;p&gt;يمكن توسيع الوصول بأمان عبر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;التحقق من المستخدمين&lt;/li&gt;
&lt;li&gt;تقسيم مستويات الوصول&lt;/li&gt;
&lt;li&gt;فرض ضوابط أمان الحساب&lt;/li&gt;
&lt;li&gt;دمج القدرات داخل سير عمل دفاعي&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في هذا النموذج، &lt;strong&gt;النظام التشغيلي والحوكمة هما الضمان&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;كلا النهجين منطقي. نهج Anthropic يقلل انتشار القدرات الهجومية، لكنه يحد من الفائدة الدفاعية لفئة صغيرة. نهج OpenAI يتيح قدرات أكثر لعدد أكبر من المدافعين، لكنه يعتمد على قوة نظام التحقق.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا عن Claude Code لأعمال الأمن؟
&lt;/h2&gt;

&lt;p&gt;إذا لم تتمكن من الوصول إلى Mythos، يمكنك استخدام Claude Code مع عائلة Claude 4 العامة في مهام أمنية مشروعة.&lt;/p&gt;

&lt;p&gt;أمثلة عملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مراجعة كود بحثًا عن أنماط خطرة.&lt;/li&gt;
&lt;li&gt;شرح مسارات تنفيذ معقدة.&lt;/li&gt;
&lt;li&gt;توليد فرضيات حول نقاط الضعف.&lt;/li&gt;
&lt;li&gt;كتابة اختبارات تحقق للمدخلات.&lt;/li&gt;
&lt;li&gt;اقتراح تصحيحات للكود.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال طلب آمن ومفيد:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;راجع هذا المسار البرمجي وحدد أين قد يحدث تجاوز صلاحيات.
لا تكتب كود استغلال.
اقترح اختبارات وحدة وتعديلات تحقق من الصلاحيات.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;غطينا واجهة Claude الأوسع هنا: &lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;احصل على وصول مجاني غير محدود إلى واجهة برمجة تطبيقات Claude&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;بالنسبة لفرق الأمن المستثمرة في Anthropic، هذا هو المسار الواقعي إلى أن يتغير توفر Glasswing أو يتم إطلاق نموذج لاحق للعامة.&lt;/p&gt;

&lt;p&gt;المسار المكافئ في OpenAI هو استخدام &lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;واجهة برمجة تطبيقات GPT-5.5&lt;/a&gt; للمهام الأمنية قبل التقديم للوصول الموثوق للأمن السيبراني.&lt;/p&gt;

&lt;h2&gt;
  
  
  خطة تنفيذ لفريق أمني صغير
&lt;/h2&gt;

&lt;p&gt;إذا كنت تريد تجربة هذا النوع من الأدوات دون انتظار Mythos، ابدأ بخطة بسيطة:&lt;/p&gt;

&lt;h3&gt;
  
  
  الأسبوع 1: تحديد النطاق
&lt;/h3&gt;

&lt;p&gt;اختر مستودعًا واحدًا فقط:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;خدمة API داخلية&lt;/li&gt;
&lt;li&gt;خدمة مصادقة&lt;/li&gt;
&lt;li&gt;خدمة دفع&lt;/li&gt;
&lt;li&gt;خدمة تتعامل مع بيانات حساسة&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تبدأ بكل المستودعات.&lt;/p&gt;

&lt;h3&gt;
  
  
  الأسبوع 2: إنشاء خط أساس
&lt;/h3&gt;

&lt;p&gt;وثّق:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نقاط النهاية الحساسة&lt;/li&gt;
&lt;li&gt;نماذج الصلاحيات&lt;/li&gt;
&lt;li&gt;التبعيات الحرجة&lt;/li&gt;
&lt;li&gt;آخر ثغرات معروفة&lt;/li&gt;
&lt;li&gt;الاختبارات الأمنية الموجودة&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال قائمة فحص:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; [ ] هل كل endpoint يتطلب مصادقة؟
&lt;span class="p"&gt;-&lt;/span&gt; [ ] هل يوجد تحقق تفصيلي من الصلاحيات؟
&lt;span class="p"&gt;-&lt;/span&gt; [ ] هل يتم التحقق من schema للطلبات؟
&lt;span class="p"&gt;-&lt;/span&gt; [ ] هل توجد حدود rate limiting؟
&lt;span class="p"&gt;-&lt;/span&gt; [ ] هل توجد اختبارات للمدخلات غير الصالحة؟
&lt;span class="p"&gt;-&lt;/span&gt; [ ] هل التبعيات محدثة؟
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  الأسبوع 3: دمج Daybreak أو أدوات مكافئة
&lt;/h3&gt;

&lt;p&gt;ابدأ بالمهام الدفاعية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مراجعة الكود.&lt;/li&gt;
&lt;li&gt;توليد اختبارات.&lt;/li&gt;
&lt;li&gt;اقتراح تصحيحات.&lt;/li&gt;
&lt;li&gt;تلخيص المخاطر.&lt;/li&gt;
&lt;li&gt;ترتيب الأولويات.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تستخدم النموذج لتوليد استغلالات ضد أنظمة لا تملكها أو لا تملك تصريحًا لاختبارها.&lt;/p&gt;

&lt;h3&gt;
  
  
  الأسبوع 4: تحويل النتائج إلى سير عمل
&lt;/h3&gt;

&lt;p&gt;لا تجعل النتائج تبقى في محادثة AI فقط. اربطها بعملية التطوير:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Finding → Issue → Owner → Pull Request → Security Review → Regression Test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الهدف ليس "استخدام نموذج ذكي"، بل تقليل زمن اكتشاف الثغرة وإصلاحها.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا يعني هذا لمطوري واجهات برمجة التطبيقات API؟
&lt;/h2&gt;

&lt;p&gt;تستهدف كثير من الهجمات الإنتاجية واجهات برمجة التطبيقات:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تجاوز المصادقة&lt;/li&gt;
&lt;li&gt;الترخيص المعطل&lt;/li&gt;
&lt;li&gt;حقن المدخلات&lt;/li&gt;
&lt;li&gt;انحراف العقد بين التوثيق والتنفيذ&lt;/li&gt;
&lt;li&gt;ثغرات التبعيات في خدمات backend&lt;/li&gt;
&lt;li&gt;اختلاف السلوك بين البيئات&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzu8fp170kz9mphzlnelt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzu8fp170kz9mphzlnelt.png" alt="API security" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;لا Mythos ولا Daybreak هما أداة متخصصة فقط في أمان API. كلاهما يمكنه تحليل كود API، لكنهما يتعاملان معه كجزء من قاعدة كود أوسع.&lt;/p&gt;

&lt;p&gt;لذلك، لأمان API عملي، استخدم طبقتين:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;أداة تصميم واختبار API&lt;/strong&gt; مثل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;نموذج أمني&lt;/strong&gt; مثل Daybreak أو، إن توفر، Mythos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog يساعدك في اكتشاف مشاكل مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;انحراف العقد contract drift&lt;/li&gt;
&lt;li&gt;مخططات request/response المعطلة&lt;/li&gt;
&lt;li&gt;تغيرات السلوك بين الإصدارات&lt;/li&gt;
&lt;li&gt;أخطاء الاختبار في خوادم MCP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يمكنك بناء هذا المسار:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API spec
   ↓
Contract-first development
   ↓
Automated API tests
   ↓
AI security review
   ↓
Patch + regression test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;اقرأ أيضًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تطوير واجهات برمجة التطبيقات المبني على العقد أولًا&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;اختبار خادم MCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الفكرة العملية: استخدم Apidog لضبط العقد والسلوك، واستخدم Daybreak أو Mythos لاكتشاف العيوب المنطقية القابلة للاستغلال في التنفيذ.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل Claude Mythos متاح للجمهور؟
&lt;/h3&gt;

&lt;p&gt;لا. Mythos محدود لشركاء Project Glasswing. لم تعلن Anthropic عن جدول زمني لإطلاق عام. اعتبارًا من مايو 2026، لا توجد عملية تقديم للأفراد أو المؤسسات الأصغر.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني الحصول على وصول موثوق للأمن السيبراني في OpenAI؟
&lt;/h3&gt;

&lt;p&gt;نعم، مع التحقق. يمكنك التقديم عبر منصة OpenAI. يعتمد القبول على حالات استخدام دفاعية مشروعة. يتطلب الوصول الفردي إلى GPT-5.5-Cyber تمكين أمان الحساب المتقدم بحلول 1 يونيو 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل Mythos أكثر قدرة من GPT-5.5-Cyber؟
&lt;/h3&gt;

&lt;p&gt;وفق المقاييس المنشورة، نعم. حقق Mythos نسبة 73% في تحديات CTF للمحترفين، وينتج استغلالات عاملة في المحاولة الأولى بنسبة 83% من الوقت. لم تنشر OpenAI أرقامًا مكافئة لـ GPT-5.5-Cyber.&lt;/p&gt;

&lt;p&gt;قد تتغير الفجوة مع نضوج Daybreak وإطلاق OpenAI نماذج سيبرانية أكثر قدرة.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل Mythos وDaybreak منتجان متنافسان؟
&lt;/h3&gt;

&lt;p&gt;من ناحية التموضع، نعم. عمليًا، ليس تمامًا.&lt;/p&gt;

&lt;p&gt;Mythos نموذج بحثي خلف كونسورتيوم خاص. Daybreak منصة يمكن لفريقك التقديم لاستخدامها ودمجها في سير العمل.&lt;/p&gt;

&lt;p&gt;لذلك، معظم الفرق لا تختار بين المنتجين مباشرة، بل تختار بين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;استخدام Daybreak الآن&lt;/li&gt;
&lt;li&gt;أو انتظار وصول Mythos العام، إن حدث&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  هل يمكن استخدام أي من النموذجين للأمن الهجومي ضد أطراف ثالثة؟
&lt;/h3&gt;

&lt;p&gt;لا. كلاهما يتضمن ضمانات ضد استغلال أنظمة لا تملكها أو لا تملك تصريحًا لاختبارها.&lt;/p&gt;

&lt;p&gt;يدعم GPT-5.5-Cyber فرق Red Teaming واختبار الاختراق داخل بيئات مصرح بها. ويُستخدم Mythos عبر Glasswing لاكتشاف الثغرات دفاعيًا في أنظمة الشركاء.&lt;/p&gt;

&lt;p&gt;الاستخدام الهجومي ضد أطراف ثالثة محظور بغض النظر عن مستوى الوصول.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف يقارن هذا مع Microsoft Security Copilot؟
&lt;/h3&gt;

&lt;p&gt;يركز Microsoft Security Copilot على عمليات مركز العمليات الأمنية SOC، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;فرز التنبيهات&lt;/li&gt;
&lt;li&gt;الاستجابة للحوادث&lt;/li&gt;
&lt;li&gt;استخبارات التهديدات&lt;/li&gt;
&lt;li&gt;التحقيقات التشغيلية&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;أما Daybreak وMythos فيركزان أكثر على اكتشاف الثغرات على مستوى الكود ومعالجتها.&lt;/p&gt;

&lt;p&gt;هما يغطيان أجزاء مختلفة من سير عمل الأمان. سياق ذو صلة: &lt;a href="http://apidog.com/blog/what-is-gpt-realtime-2-and-how-to-use-the-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ما هو GPT Realtime 2 وكيفية استخدام واجهة برمجة التطبيقات&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;هذه أول مرة يطلق فيها مختبران رائدان في الذكاء الاصطناعي منصات أمن سيبراني متنافسة في الربع نفسه. لكن الاختلافات العملية كبيرة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mythos&lt;/strong&gt; أقوى وفق المقاييس المنشورة، لكنه غير متاح لمعظم الفرق.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daybreak&lt;/strong&gt; أقل وضوحًا من ناحية الأرقام العامة، لكنه قابل للتقييم والنشر.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code وGPT-5.5&lt;/strong&gt; يوفران مسارات عملية للمهام الأمنية اليومية المصرح بها.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;أمان API&lt;/strong&gt; يحتاج أدوات متخصصة بجانب نماذج الذكاء الاصطناعي.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;القرار العملي لفريقك:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;قيّم Daybreak الآن إذا كان متاحًا لك.&lt;/li&gt;
&lt;li&gt;استخدم نماذج عامة في مراجعة الكود والاختبارات الأمنية المصرح بها.&lt;/li&gt;
&lt;li&gt;تابع Mythos عبر التقارير العامة، ولا تبنِ خطتك على وصول غير مضمون.&lt;/li&gt;
&lt;li&gt;اربط أي نموذج أمني بسير عمل واضح: اكتشاف، تذكرة، تصحيح، اختبار رجعي.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;خطط للأدوات التي يمكنك نشرها، لا للنماذج التي قد لا تحصل عليها.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>كيفية تتبع تكلفة استخدام API أوبن إيه آي (OpenAI) لكل ميزة: دليل لتحديد مصادر التكلفة</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Tue, 12 May 2026 02:42:27 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/kyfy-ttb-tklf-stkhdm-api-wbn-yh-ay-openai-lkl-myz-dlyl-lthdyd-msdr-ltklf-anp</link>
      <guid>https://dev.to/yusuf_khalidd/kyfy-ttb-tklf-stkhdm-api-wbn-yh-ay-openai-lkl-myz-dlyl-lthdyd-msdr-ltklf-anp</guid>
      <description>&lt;p&gt;فاتورة OpenAI تقول إنك أنفقت 4,237 دولارًا الشهر الماضي. لكنها لا تقول إن 3,100 دولار جاءت من نقطة نهاية تلخيص خرجت عن السيطرة، و700 دولار من عميل يدفع 50 دولارًا شهريًا، و437 دولارًا من ميزة لا يستخدمها أحد. إذا كنت تشحن ميزات تعتمد على نماذج اللغة الكبيرة، فأنت تحتاج إلى إسناد التكلفة لكل طلب، لا إلى رقم إجمالي في لوحة الفوترة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;يوضح هذا الدليل طريقة عملية لإسناد تكلفة OpenAI API: وسم كل طلب ببيانات وصفية، تسجيل التوكنات والتكلفة، التجميع حسب الميزة والمسار والعميل، تعيين حدود ميزانية، واختبار الغلاف قبل الإنتاج.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 يمنحك Apidog رؤية على مستوى الطلب واختبار السيناريوهات للتحقق من أن غلاف تتبع التكلفة يعمل قبل نشره. استخدمه لإعادة تشغيل الطلبات الموسومة، تأكيد شكل السجل، والتحقق من أن كل استدعاء يحمل البيانات الوصفية التي يتوقعها مستودع البيانات.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  باختصار
&lt;/h2&gt;

&lt;p&gt;نفّذ الآتي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;وسّم كل استدعاء OpenAI بـ &lt;code&gt;feature&lt;/code&gt; و&lt;code&gt;route&lt;/code&gt; و&lt;code&gt;customer_id&lt;/code&gt; و&lt;code&gt;environment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;سجّل حدث JSON لكل طلب يحتوي على التوكنات، النموذج، زمن الاستجابة، والتكلفة المحسوبة.&lt;/li&gt;
&lt;li&gt;خزّن الأحداث في BigQuery أو ClickHouse أو Snowflake أو Postgres.&lt;/li&gt;
&lt;li&gt;اجمع الإنفاق حسب الميزة، العميل، والمسار.&lt;/li&gt;
&lt;li&gt;عيّن حدودًا لكل مفتاح مشروع في OpenAI.&lt;/li&gt;
&lt;li&gt;أضف تنبيهات مبنية على مستودع البيانات.&lt;/li&gt;
&lt;li&gt;اختبر الغلاف باستخدام &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; قبل الاعتماد على الأرقام.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  لماذا لا تكفي لوحة تحكم فواتير OpenAI
&lt;/h2&gt;

&lt;p&gt;لوحة تحكم OpenAI تعرض إجمالي الإنفاق، تفصيلًا حسب النموذج، وحدود الاستخدام. هذا مفيد للفوترة، لكنه غير كافٍ لاتخاذ قرارات هندسية أو منتجية.&lt;/p&gt;

&lt;p&gt;المشكلات العملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;لا يوجد سياق للإنفاق&lt;/strong&gt;: ترى أنك أنفقت 312 دولارًا أمس، لكن لا تعرف هل السبب عميل واحد، ميزة جديدة، أم وظيفة خلفية.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;لا يوجد تفصيل لكل ميزة&lt;/strong&gt;: OpenAI تميّز الطلبات حسب مفتاح API والنموذج، لا حسب &lt;code&gt;feature&lt;/code&gt; أو &lt;code&gt;route&lt;/code&gt; أو &lt;code&gt;customer_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تأخر في بيانات الاستخدام&lt;/strong&gt;: بيانات لوحة التحكم قد تتأخر عشرات الدقائق أو ساعات.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;تنبيهات محدودة&lt;/strong&gt;: لا يوجد تنبيه أصلي مثل: "أرسل تنبيهًا إذا تجاوزت ميزة الدردشة 50 دولارًا في الساعة".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;لا يوجد إسناد للعملاء&lt;/strong&gt;: لا يمكنك حساب تكلفة العميل X أو هامش الربح لكل عميل من لوحة التحكم وحدها.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;مفاتيح المشاريع تساعد جزئيًا فقط&lt;/strong&gt;: تعطيك بُعدًا واحدًا للإسناد، لكنها لا تحل إسناد الميزة أو العميل أو المسار.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;تستطيع استخدام &lt;a href="https://platform.openai.com/docs/api-reference/usage" rel="noopener noreferrer"&gt;واجهة استخدام OpenAI&lt;/a&gt; للمصالحة والتجميع، لكنها لا تعطيك حدثًا تفصيليًا لكل طلب. لذلك تحتاج إلى طبقة إسناد داخل التطبيق.&lt;/p&gt;

&lt;p&gt;للسياق حول التسعير، راجع &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تفاصيل تسعير GPT-5.5&lt;/a&gt;. ولمشكلة مشابهة في أدوات المطورين، راجع &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;فاتورة استخدام GitHub Copilot لفرق واجهات برمجة التطبيقات&lt;/a&gt;. ولأساسيات OpenAI API، راجع &lt;a href="https://platform.openai.com/docs/api-reference" rel="noopener noreferrer"&gt;المرجع الرسمي لـ OpenAI API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  نموذج بيانات إسناد التكلفة
&lt;/h2&gt;

&lt;p&gt;اجعل كل طلب OpenAI ينتج حدثًا واحدًا منظّمًا. هذا الحدث هو مصدر الحقيقة للوحات التحكم والتنبيهات والتقارير.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;العمود&lt;/th&gt;
&lt;th&gt;النوع&lt;/th&gt;
&lt;th&gt;مثال&lt;/th&gt;
&lt;th&gt;لماذا هو مهم&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;request_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;uuid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7a91...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الثبات، إزالة التكرار، إعادة المحاولات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;timestamptz&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-05-06T14:23:01Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;السلاسل الزمنية والتنبيهات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;support-chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الميزة التي أطلقت الاستدعاء&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;route&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/v1/chat/answer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;مسار HTTP أو وظيفة الخلفية&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;customer_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cust_4291&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الإنفاق لكل عميل&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;فصل الإنتاج عن التطوير&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;التسعير يختلف حسب النموذج&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompt_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;15234&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;توكنات الإدخال&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;completion_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;812&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;توكنات الإخراج&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reasoning_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;توكنات الاستدلال، وتُحاسب كمخرجات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cached_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;12000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;توكنات التخزين المؤقت&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;latency_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2341&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ربط التكلفة بتجربة المستخدم&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cost_usd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;numeric&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.045672&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;التكلفة المحسوبة وقت الطلب&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompt_cache_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system-v3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;تتبع فعالية التخزين المؤقت&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error_code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;429&lt;/code&gt; أو &lt;code&gt;null&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;تحليل الأخطاء وإعادة المحاولات&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;احسب التكلفة وقت الكتابة، لا وقت الاستعلام. بهذه الطريقة تبقى البيانات التاريخية مرتبطة بالسعر الذي كان معمولًا به عند تنفيذ الطلب.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;PRICING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;# USD per 1M tokens, as of May 2026
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;180.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.4-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compute_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PRICING&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;input_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
    &lt;span class="n"&gt;cache_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
    &lt;span class="n"&gt;output_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cache_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;output_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ملاحظة مهمة: توكنات الاستدلال &lt;code&gt;reasoning_tokens&lt;/code&gt; تُحاسب كسعر مخرجات. تعيدها OpenAI في &lt;code&gt;usage.completion_tokens_details.reasoning_tokens&lt;/code&gt;. إذا تجاهلت ذلك، ستقلل التكلفة الفعلية لطلبات التفكير.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  تنفيذ غلاف OpenAI في Python
&lt;/h2&gt;

&lt;p&gt;اجعل كل استدعاء للنموذج يمر عبر دالة واحدة. هذه الدالة تستقبل البيانات الوصفية، تنفذ الطلب، تستخرج &lt;code&gt;usage&lt;/code&gt;، تحسب التكلفة، وتكتب سجل JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm.cost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_attribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;openai_kwargs&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature, route, customer_id, and environment are required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;error_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;openai_kwargs&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;error_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown_error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;

    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;latency_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

        &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="n"&gt;cached_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="n"&gt;cost_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai.request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%dT%H:%M:%SZ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gmtime&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;environment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latency_ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم الغلاف من موقع الاستدعاء:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_with_attribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support-chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1/chat/answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;أجب كمساعد دعم فني.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_question&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لا تجعل &lt;code&gt;feature&lt;/code&gt; أو &lt;code&gt;customer_id&lt;/code&gt; قيمًا اختيارية. إذا غابت، ارفع خطأ. الوسم الناقص يعني إسنادًا خاطئًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  تنفيذ الفكرة في Node.js
&lt;/h2&gt;

&lt;p&gt;الفكرة نفسها تنطبق على Node.js: غلّف SDK، استخرج &lt;code&gt;response.usage&lt;/code&gt;، احسب التكلفة، واكتب سجل JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PRICING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.00&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;180.00&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.00&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.4-mini&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.00&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;computeCostUsd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;completionTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PRICING&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cachedTokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;completionTokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;inputCost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cacheCost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;outputCost&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callWithAttribution&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;requestId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;openaiArgs&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;feature, route, customerId, and environment are required&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;errorCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;openaiArgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errorCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown_error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completionTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;prompt_tokens_details&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;cached_tokens&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;reasoning_tokens&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;costUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computeCostUsd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;promptTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;completionTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai.request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;completionTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;started&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;costUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;error_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errorCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كنت تستخدم Kafka أو Pub/Sub أو NATS، انشر الحدث هناك بدلًا من &lt;code&gt;stdout&lt;/code&gt;. المهم أن يصل الحدث نفسه إلى مستودع البيانات ونظام التنبيه.&lt;/p&gt;

&lt;h2&gt;
  
  
  تخزين الأحداث والاستعلام عنها
&lt;/h2&gt;

&lt;p&gt;اشحن السجلات إلى مستودع البيانات عبر المسار الموجود لديك: Vector، Fluent Bit، Logstash، OTLP collector، أو أي ناقل سجلات آخر.&lt;/p&gt;

&lt;p&gt;بعدها يصبح التحليل SQL عاديًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  الإنفاق حسب الميزة
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;DATE_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_latency_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cache_hit_rate&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  الإنفاق حسب العميل
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_cost_per_request&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;MONTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  أكثر المسارات تكلفة
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_output_tokens&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;اربط هذه الاستعلامات بـ Grafana أو Metabase أو Looker أو Superset. أنشئ ثلاث لوحات أساسية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;الإنفاق لكل ميزة بمرور الوقت.&lt;/li&gt;
&lt;li&gt;الإنفاق لكل عميل بمرور الوقت.&lt;/li&gt;
&lt;li&gt;أعلى 20 مسارًا حسب إنفاق آخر 24 ساعة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  اختبار الغلاف باستخدام Apidog
&lt;/h2&gt;

&lt;p&gt;لا تنتظر الإنتاج لاكتشاف أن &lt;code&gt;customer_id&lt;/code&gt; فارغ أو أن &lt;code&gt;cost_usd&lt;/code&gt; لا يُسجل عند بعض المسارات. اختبر الغلاف كما تختبر أي عقد API.&lt;/p&gt;

&lt;p&gt;استخدم &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; بهذا التسلسل:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ سيناريو يرسل طلبًا إلى نقطة نهاية الذكاء الاصطناعي في خدمتك.&lt;/li&gt;
&lt;li&gt;مرّر &lt;code&gt;customer_id&lt;/code&gt; و&lt;code&gt;feature&lt;/code&gt; معروفين.&lt;/li&gt;
&lt;li&gt;نفّذ الطلب.&lt;/li&gt;
&lt;li&gt;التقط سجل JSON من &lt;code&gt;stdout&lt;/code&gt; أو OTLP أو نقطة نهاية السجلات الداخلية.&lt;/li&gt;
&lt;li&gt;أضف تأكيدات للتأكد من وجود الحقول التالية:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;route&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;customer_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompt_tokens &amp;gt; 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cost_usd &amp;gt; 0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;شغّل السيناريو عبر بيئات التطوير والإنتاج باستخدام متغيرات بيئة Apidog.&lt;/li&gt;
&lt;li&gt;أعد تشغيل الطلبات الموسومة وتأكد من أن إعادة المحاولة لا تضاعف التكلفة إذا كانت تستخدم &lt;code&gt;request_id&lt;/code&gt; نفسه.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال على تأكيد منطقي تريد تطبيقه في الاختبار:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai.request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;support-chat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cust_test_001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;above&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;above&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للاطلاع على مقاربات أوسع لاختبار واجهات برمجة التطبيقات، راجع &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أدوات اختبار واجهات برمجة التطبيقات لمهندسي ضمان الجودة&lt;/a&gt;. ولنهج "العقد أولًا"، راجع &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تطوير واجهة برمجة التطبيقات العقد أولًا&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  حدود الميزانية والتنبيهات
&lt;/h2&gt;

&lt;p&gt;استخدم طبقتين من الحماية.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. حدود OpenAI الأصلية
&lt;/h3&gt;

&lt;p&gt;أنشئ مفاتيح مشروع منفصلة حسب البيئة أو الميزة، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prod-support-chat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prod-summarization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prod-agent-workflows&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;staging-all&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ثم عيّن حدًا صارمًا لكل مفتاح في لوحة OpenAI. هذا يمنع ميزة واحدة من استنزاف ميزانية المؤسسة كلها.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. تنبيهات من مستودع البيانات
&lt;/h3&gt;

&lt;p&gt;شغّل استعلامًا كل 10 دقائق. إذا تجاوزت ميزة ما 3 أضعاف متوسط إنفاقها الساعي خلال آخر 7 أيام، أرسل تنبيهًا إلى Slack أو PagerDuty أو Opsgenie.&lt;/p&gt;

&lt;p&gt;مثال مبسط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;hourly&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_hourly_spend&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;hourly&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="n"&gt;current_hour&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;current_spend&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_spend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_hourly_spend&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;current_hour&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_spend&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_hourly_spend&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الحدود الأصلية تحميك من الكوارث. التنبيهات المبنية على البيانات تلتقط الانحراف البطيء قبل أن يتحول إلى فاتورة كبيرة.&lt;/p&gt;

&lt;h2&gt;
  
  
  تحسينات متقدمة لتقليل التكلفة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  التخزين المؤقت للمطالبات
&lt;/h3&gt;

&lt;p&gt;إذا كان جزء كبير من المطالبة ثابتًا، اجعله في البداية وضع المتغيرات في النهاية. هذا يزيد فرصة الاستفادة من prompt caching.&lt;/p&gt;

&lt;p&gt;تتبع هذا المؤشر لكل ميزة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cache_hit_rate&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cache_hit_rate&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;راجع &lt;a href="https://platform.openai.com/docs/guides/prompt-caching" rel="noopener noreferrer"&gt;وثائق التخزين المؤقت للمطالبات من OpenAI&lt;/a&gt; لمعرفة قواعد الأهلية.&lt;/p&gt;

&lt;h3&gt;
  
  
  استخدام Batch API للأعمال غير المتزامنة
&lt;/h3&gt;

&lt;p&gt;أي مهمة لا تحتاج استجابة فورية يمكن تشغيلها عبر Batch API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تلخيص ليلي.&lt;/li&gt;
&lt;li&gt;تقييمات.&lt;/li&gt;
&lt;li&gt;إعادة معالجة مستندات.&lt;/li&gt;
&lt;li&gt;تعبئة embeddings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استمر في الوسم، وأضف &lt;code&gt;batch_job_id&lt;/code&gt; إلى الحدث حتى تستطيع إسناد التكلفة إلى عبء العمل الأصلي.&lt;/p&gt;

&lt;h3&gt;
  
  
  ضبط جهد الاستدلال
&lt;/h3&gt;

&lt;p&gt;إذا كنت تستخدم وضع التفكير، راجع &lt;code&gt;reasoning.effort&lt;/code&gt;. المستويات الأعلى قد ترفع توكنات الإخراج. اختبر الجودة مقابل التكلفة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;شغّل نفس السيناريو على &lt;code&gt;low&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;شغّله على &lt;code&gt;medium&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;قارن الجودة والتكلفة.&lt;/li&gt;
&lt;li&gt;استخدم الخيار الأقل تكلفة إذا كانت الجودة مقبولة.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;للتفاصيل العملية، راجع &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام GPT-5.5 API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ضبط حجم السياق
&lt;/h3&gt;

&lt;p&gt;المطالبات الطويلة مكلفة. بدلًا من إدخال قاعدة المعرفة كاملة في السياق، استخدم RAG بميزانية استرجاع واضحة.&lt;/p&gt;

&lt;p&gt;راقب تضخم المطالبة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;DATE_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WEEK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_prompt_tokens&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا ارتفع &lt;code&gt;avg_prompt_tokens&lt;/code&gt; أسبوعًا بعد أسبوع بدون تغيير منتجي واضح، فالمطالبة تتضخم.&lt;/p&gt;

&lt;h3&gt;
  
  
  مراقبة الطلبات القريبة من الحدود الكبيرة
&lt;/h3&gt;

&lt;p&gt;إذا كانت هناك مضاعفات سعرية عند تجاوز حد معين من التوكنات، أضف تحذيرًا داخل الغلاف:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;250000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai.large_prompt_warning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;راجع &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;منشور تسعير GPT-5.5&lt;/a&gt; لتفاصيل التسعير.&lt;/p&gt;

&lt;h2&gt;
  
  
  حدود إنفاق لكل عميل
&lt;/h2&gt;

&lt;p&gt;إذا كان منتجك B2B SaaS، أضف حدًا شهريًا لكل &lt;code&gt;customer_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;مثال تحقق قبل استدعاء OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assert_customer_ai_budget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;monthly_limit_usd&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;current_spend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_month_to_date_ai_spend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;current_spend&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;monthly_limit_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;AiQuotaExceeded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;تم تجاوز حصة الذكاء الاصطناعي الشهرية&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم استخدمه قبل الغلاف:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;assert_customer_ai_budget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;monthly_limit_usd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ai_budget_usd&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_with_attribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support-chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1/chat/answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;عند تجاوز الحد، أعد &lt;code&gt;429&lt;/code&gt; أو رسالة واضحة داخل المنتج. هذا يحوّل ميزات الذكاء الاصطناعي من خطر على الهامش إلى منتج يمكن تسعيره.&lt;/p&gt;

&lt;h2&gt;
  
  
  أخطاء شائعة يجب تجنبها
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;حساب &lt;code&gt;reasoning_tokens&lt;/code&gt; كسعر إدخال. الصحيح أنها تُحاسب كمخرجات.&lt;/li&gt;
&lt;li&gt;الاعتماد على لوحة OpenAI للتنبيهات الفورية. استخدم مستودع البيانات.&lt;/li&gt;
&lt;li&gt;وضع الوسوم داخل SDK بدل موقع الاستدعاء. الوسم يجب أن يأتي من الميزة.&lt;/li&gt;
&lt;li&gt;نسيان وظائف الخلفية مثل Cron وworkers وwebhooks.&lt;/li&gt;
&lt;li&gt;أخذ عينات من الطلبات. لا تفعل ذلك؛ سجّل كل طلب.&lt;/li&gt;
&lt;li&gt;ترك &lt;code&gt;customer_id&lt;/code&gt; فارغًا. استخدم &lt;code&gt;internal&lt;/code&gt; أو &lt;code&gt;system&lt;/code&gt; إذا لم يوجد عميل.&lt;/li&gt;
&lt;li&gt;حساب التكلفة وقت الاستعلام فقط. خزّن &lt;code&gt;cost_usd&lt;/code&gt; مع الحدث.&lt;/li&gt;
&lt;li&gt;عدم اختبار شكل السجل قبل الإنتاج.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  البدائل والأدوات
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;النهج&lt;/th&gt;
&lt;th&gt;ما يبرع فيه&lt;/th&gt;
&lt;th&gt;تكلفته&lt;/th&gt;
&lt;th&gt;متى تستخدمه&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI usage API&lt;/td&gt;
&lt;td&gt;أصلي، لا يتطلب إعدادًا&lt;/td&gt;
&lt;td&gt;مجاني&lt;/td&gt;
&lt;td&gt;مشروع واحد أو احتياجات بسيطة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helicone&lt;/td&gt;
&lt;td&gt;وكيل مباشر، لوحات تحكم، تخزين مؤقت، تكلفة لكل مستخدم&lt;/td&gt;
&lt;td&gt;طبقة مجانية؛ مدفوع يبدأ من 20 دولارًا شهريًا&lt;/td&gt;
&lt;td&gt;تريد لوحة مستضافة بسرعة وتقبل وكيلًا في المسار&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Langfuse&lt;/td&gt;
&lt;td&gt;مفتوح المصدر، تتبع وتكلفة&lt;/td&gt;
&lt;td&gt;استضافة ذاتية مجانية؛ سحابة تبدأ من 29 دولارًا شهريًا&lt;/td&gt;
&lt;td&gt;تريد تتبعًا وتكلفة في أداة واحدة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangSmith&lt;/td&gt;
&lt;td&gt;تكامل مع LangChain، تقييم وتكلفة&lt;/td&gt;
&lt;td&gt;يبدأ من 39 دولارًا لكل مستخدم شهريًا&lt;/td&gt;
&lt;td&gt;تستخدم LangChain بالفعل&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;مستودع بيانات مخصص&lt;/td&gt;
&lt;td&gt;تحكم كامل، لا يوجد وكيل، أبعاد مخصصة&lt;/td&gt;
&lt;td&gt;وقت هندسي&lt;/td&gt;
&lt;td&gt;فرق كبيرة أو متطلبات بيانات صارمة&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;الوكيل مثل Helicone يضيف قفزة في المسار الحرج. Langfuse يعطيك تحكمًا أكبر لكنك تدير جزءًا من المكدس. المسار المخصص يناسب الفرق التي لديها مستودع بيانات ومراقبة جاهزة. OpenAI usage API جيد للمصالحة، لكنه لا يكفي لإسناد تكلفة المنتج.&lt;/p&gt;

&lt;p&gt;للمزيد حول مراقبة تكاليف LLM، راجع &lt;a href="https://www.helicone.ai/blog/monitor-and-optimize-llm-costs" rel="noopener noreferrer"&gt;دليل Helicone حول تتبع تكاليف LLM&lt;/a&gt; و&lt;a href="https://langfuse.com/docs/model-usage-and-cost" rel="noopener noreferrer"&gt;وثائق Langfuse حول تتبع التكلفة&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;إذا كنت تدير هذا على مستوى منصة API، راجع &lt;a href="http://apidog.com/blog/api-platform-microservices-architecture?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;منصات واجهات برمجة التطبيقات لهندسة الخدمات المصغرة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  حالات استخدام واقعية
&lt;/h2&gt;

&lt;h3&gt;
  
  
  B2B SaaS مع إنفاق LLM لكل عميل
&lt;/h3&gt;

&lt;p&gt;شركة تبيع منتجًا لذكاء المبيعات. كل عميل يشغّل استدعاءات GPT-5.5 عند طلب موجز. بدون إسناد، تعرف الشركة أنها تنفق 80 ألف دولار شهريًا على OpenAI. مع الإسناد لكل عميل، تكتشف أن 12٪ من العملاء يسببون 71٪ من الإنفاق. النتيجة: تسعير متدرج، حصص مرنة، ورسوم تجاوز.&lt;/p&gt;

&lt;h3&gt;
  
  
  أدوات مطورين داخلية
&lt;/h3&gt;

&lt;p&gt;منظمة هندسية تمنح المطورين مساعد دردشة داخليًا. باستخدام &lt;code&gt;customer_id = dev_email&lt;/code&gt;، يرى فريق المنصة أن ثلاثة مطورين يمثلون 50٪ من الإنفاق الداخلي. اثنان منهم يشغلان حلقات وكلاء آلية لم يتم إيقافها. إيقافها يوفر 1,800 دولار شهريًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  توقع تكلفة ميزة جديدة
&lt;/h3&gt;

&lt;p&gt;فريق منتج يريد شحن ميزة تلخيص. باستخدام بيانات تاريخية لكل ميزة، يحسب:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;متوسط توكنات الإدخال لكل طلب.&lt;/li&gt;
&lt;li&gt;متوسط توكنات الإخراج.&lt;/li&gt;
&lt;li&gt;عدد الطلبات لكل مستخدم نشط.&lt;/li&gt;
&lt;li&gt;عدد المستخدمين المتوقع.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الناتج: 0.04 دولار لكل مستخدم نشط يوميًا، أو 1.20 دولار شهريًا. يمكن عندها تسعير الميزة بوضوح بدل التخمين.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;لوحة فواتير OpenAI تجيب على سؤال: "كم دفعنا؟".&lt;br&gt;&lt;br&gt;
إسناد التكلفة يجيب على سؤال: "من تسبب في التكلفة، ولماذا؟".&lt;/p&gt;

&lt;p&gt;نفّذ الحد الأدنى التالي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;وسّم كل طلب بـ &lt;code&gt;feature&lt;/code&gt; و&lt;code&gt;route&lt;/code&gt; و&lt;code&gt;customer_id&lt;/code&gt; و&lt;code&gt;environment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;احسب &lt;code&gt;cost_usd&lt;/code&gt; وقت الطلب.&lt;/li&gt;
&lt;li&gt;سجّل حدث JSON واحدًا لكل استدعاء.&lt;/li&gt;
&lt;li&gt;خزّن الأحداث في مستودع البيانات.&lt;/li&gt;
&lt;li&gt;ابنِ لوحات للإنفاق حسب الميزة والعميل والمسار.&lt;/li&gt;
&lt;li&gt;عيّن حدودًا لكل مفتاح مشروع.&lt;/li&gt;
&lt;li&gt;اختبر الغلاف باستخدام &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; قبل الإنتاج.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;قم بتنزيل Apidog&lt;/a&gt; واستخدمه للتحقق من غلاف إسناد التكلفة بشكل شامل: شغّل نقاط نهاية الذكاء الاصطناعي بطلبات موسومة، تأكد من حمولة السجل، وأعد تشغيل السيناريوهات عبر البيئات.&lt;/p&gt;

&lt;p&gt;لقراءة ذات صلة بإدارة التكاليف، راجع &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تفاصيل تسعير GPT-5.5&lt;/a&gt; و&lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;فاتورة استخدام GitHub Copilot لفرق واجهات برمجة التطبيقات&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;
&lt;h3&gt;
  
  
  هل تحسب توكنات الاستدلال كمدخلات أم مخرجات؟
&lt;/h3&gt;

&lt;p&gt;كمخرجات. تعيد OpenAI هذه التوكنات تحت:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage.completion_tokens_details.reasoning_tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أضفها إلى &lt;code&gt;completion_tokens&lt;/code&gt; عند حساب التكلفة. راجع &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تفاصيل تسعير GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما مدى دقة &lt;code&gt;response.usage&lt;/code&gt; مقارنة بلوحة OpenAI؟
&lt;/h3&gt;

&lt;p&gt;أعداد التوكنات في &lt;code&gt;response.usage&lt;/code&gt; هي المصدر المناسب للحساب على مستوى الطلب. قد يحدث انحراف في التكلفة إذا استخدمت جدول أسعار قديمًا، لذلك ثبّت الأسعار في الكود وحدّثها عند تغيير التسعير.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل تكفي مفاتيح مشروع OpenAI للإسناد؟
&lt;/h3&gt;

&lt;p&gt;لا. مفاتيح المشروع تعطيك إسنادًا على مستوى المشروع أو البيئة. لا تعطيك إسنادًا لكل ميزة أو عميل أو مسار. استخدمها للحدود والفصل، واستخدم البيانات الوصفية داخل التطبيق للإسناد التفصيلي.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا عن إعادة المحاولات؟
&lt;/h3&gt;

&lt;p&gt;إذا فشل الطلب قبل تشغيل النموذج، فلن تحصل عادةً على &lt;code&gt;usage&lt;/code&gt; ولن تسجل تكلفة. إذا نجح الطلب ثم أعدته طبقة التطبيق، قد تسجل التكلفة مرتين. مرّر &lt;code&gt;request_id&lt;/code&gt; نفسه في إعادة المحاولة واجعل طبقة التخزين تزيل التكرار.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يجب أخذ عينات من الطلبات لتقليل حجم السجلات؟
&lt;/h3&gt;

&lt;p&gt;لا. سجل JSON واحد لكل طلب ليس عبئًا كبيرًا، وأخذ العينات يفسد إسناد التكلفة لكل عميل ومسار.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يعمل هذا مع مزودي LLM آخرين؟
&lt;/h3&gt;

&lt;p&gt;نعم. أضف عمود &lt;code&gt;provider&lt;/code&gt; مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openai
anthropic
google
deepseek
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم استخدم جدول تسعير مختلفًا لكل مزود. المخطط ولوحات التحكم تبقى نفسها. كنقطة مقارنة، راجع &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تسعير DeepSeek V4 API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل ينطبق على embeddings والصور؟
&lt;/h3&gt;

&lt;p&gt;نعم، لكن مع حساب تكلفة مختلف. embeddings تُحسب عادةً حسب توكنات الإدخال. الصور تُحسب حسب عدد الصور والدقة. أضف عمودًا مثل &lt;code&gt;endpoint&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chat
embeddings
image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم فرّع دالة حساب التكلفة حسب نوع الاستدعاء.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>دليل اختبار خادم MCP: يدوي + آلي باستخدام Apidog</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Mon, 11 May 2026 08:56:22 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/dlyl-khtbr-khdm-mcp-ydwy-aly-bstkhdm-apidog-bem</link>
      <guid>https://dev.to/yusuf_khalidd/dlyl-khtbr-khdm-mcp-ydwy-aly-bstkhdm-apidog-bem</guid>
      <description>&lt;p&gt;منشور "Ableton Live MCP" على Show HN وصل إلى 118 نقطة و78 تعليقًا هذا الأسبوع. النمط صار مألوفًا: مطوّر يبني خادم Model Context Protocol لأداة غير متوقعة، مستخدمو Claude Desktop يجربونه، ثم تبدأ موجة "هل أبني واحدًا لـ X؟". خلال أقل من عام، انتقل MCP من تجربة مرتبطة بـ Anthropic إلى طبقة تكامل عملية للوكلاء.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;لكن النمو السريع كشف فجوة واضحة: اختبار خوادم MCP ما زال بدائيًا. تشغيل JSON-RPC يدويًا عبر &lt;code&gt;stdio&lt;/code&gt; مناسب لتجربة "hello world"، لكنه ينهار عندما يحتوي الخادم على 12 أداة، و3 مطالبات، وتكاملات خارجية غير مستقرة. في هذا الدليل سنبني طريقة عملية لاختبار خادم MCP يدويًا، ثم تحويل نفس الاختبارات إلى مجموعة آلية في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، بحيث تتعامل مع خادم MCP مثل أي API: عقد واضح، نماذج mock، وتأكّدات regression في CI.&lt;/p&gt;

&lt;p&gt;إذا كنت تعمل على وكلاء بشكل أوسع، فاقرأ أيضًا &lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل agents.md&lt;/a&gt;. الاتفاقيات الموجودة فيه تساعدك على توثيق عقود خادم MCP ومشاركتها مع الفريق.&lt;/p&gt;

&lt;h2&gt;
  
  
  باختصار
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; هو Model Context Protocol من Anthropic: JSON-RPC 2.0 عبر &lt;code&gt;stdio&lt;/code&gt; أو HTTP، ويكشف ثلاث بدائيات: الأدوات، الموارد، والمطالبات.&lt;/li&gt;
&lt;li&gt;اختبار خادم MCP يعني التحقق من استجابات &lt;code&gt;initialize&lt;/code&gt; و&lt;code&gt;tools/list&lt;/code&gt; و&lt;code&gt;tools/call&lt;/code&gt; و&lt;code&gt;resources/read&lt;/code&gt; و&lt;code&gt;prompts/get&lt;/code&gt; مقابل عقد واضح.&lt;/li&gt;
&lt;li&gt;ابدأ يدويًا: شغّل الخادم من الطرفية، أرسل طلبات JSON-RPC، وتأكد من الشكل قبل إدخال العملاء.&lt;/li&gt;
&lt;li&gt;انتقل إلى الأتمتة: خزّن الطلبات في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، أضف تأكيدات JSONPath، ثم شغّل المجموعة في CI.&lt;/li&gt;
&lt;li&gt;استخدم mock server في Apidog لمحاكاة واجهات API الخارجية التي يعتمد عليها خادم MCP.&lt;/li&gt;
&lt;li&gt;يمكنك &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تنزيل Apidog&lt;/a&gt; لتجميع الطلبات، المحاكاة، وتشغيل الاختبارات في مكان واحد.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ما هو MCP عمليًا؟
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;مواصفات بروتوكول سياق النموذج&lt;/a&gt; تعرّف بروتوكول JSON-RPC 2.0 بواجهة صغيرة. العميل، مثل Claude Desktop أو Cursor أو وكيلك الخاص، يشغّل خادم MCP، ينفّذ مصافحة &lt;code&gt;initialize&lt;/code&gt;، ثم يستدعي الأدوات أو يقرأ الموارد أو يجلب المطالبات.&lt;/p&gt;

&lt;p&gt;أغلب الاختبارات ستدور حول هذه الاستدعاءات:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt;: التفاوض على إصدار البروتوكول والإمكانيات.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt;: إرجاع الأدوات المتاحة، مع JSON Schema لوسائط كل أداة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt;: استدعاء أداة باسمها وتمرير الوسائط.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources/list&lt;/code&gt; و&lt;code&gt;resources/read&lt;/code&gt;: كشف وقراءة محتوى معرّف عبر URI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prompts/list&lt;/code&gt; و&lt;code&gt;prompts/get&lt;/code&gt;: كشف قوالب المطالبات التي يستطيع العميل استخدامها.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;النقل يكون غالبًا بأحد شكلين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stdio&lt;/code&gt;: إطارات JSON-RPC مفصولة بأسطر جديدة عبر &lt;code&gt;stdin/stdout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;HTTP قابل للتدفق: غالبًا &lt;code&gt;POST /&lt;/code&gt; مع SSE للتدفق.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;معظم الخوادم المحلية تستخدم &lt;code&gt;stdio&lt;/code&gt;. الخوادم البعيدة تميل إلى HTTP.&lt;/p&gt;

&lt;p&gt;سبب أهمية الاختبار بسيط: أي خطأ في شكل &lt;code&gt;tools/list&lt;/code&gt; أو &lt;code&gt;tools/call&lt;/code&gt; قد يكسر Claude Desktop وCursor وأي عميل MCP آخر في نفس اللحظة.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما الذي يجب اختباره؟
&lt;/h2&gt;

&lt;p&gt;غطِّ ستة محاور رئيسية.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. امتثال البروتوكول
&lt;/h3&gt;

&lt;p&gt;تأكد من أن &lt;code&gt;initialize&lt;/code&gt; يعيد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;protocolVersion&lt;/code&gt; المتوقعة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capabilities&lt;/code&gt; التي يدعمها الخادم فعليًا.&lt;/li&gt;
&lt;li&gt;معلومات الخادم الأساسية إن كانت مطلوبة في تطبيقك.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال طلب:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"initialize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. صحة المخطط
&lt;/h3&gt;

&lt;p&gt;في &lt;code&gt;tools/list&lt;/code&gt;، تحقق من أن كل أداة تحتوي على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inputSchema&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ولا تكتفِ بوجود &lt;code&gt;inputSchema&lt;/code&gt;. تأكد أنه JSON Schema صالح، وأن الحقول المطلوبة مذكورة في &lt;code&gt;required&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. سلوك الأدوات
&lt;/h3&gt;

&lt;p&gt;لكل أداة، اختبر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مسار النجاح.&lt;/li&gt;
&lt;li&gt;وسيطة مفقودة.&lt;/li&gt;
&lt;li&gt;نوع غير صحيح.&lt;/li&gt;
&lt;li&gt;فشل في API خارجي.&lt;/li&gt;
&lt;li&gt;timeout إن كان ممكنًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الاستجابة الناجحة يجب أن تحتوي على &lt;code&gt;content&lt;/code&gt; بشكل صحيح:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Weather in Tokyo: 22°C"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أما خطأ تنفيذ الأداة فيجب أن يكون نتيجة عادية مع &lt;code&gt;isError: true&lt;/code&gt;، وليس JSON-RPC protocol error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Missing required argument: city"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. الوصول إلى الموارد
&lt;/h3&gt;

&lt;p&gt;اختبر أن كل URI يظهر في &lt;code&gt;resources/list&lt;/code&gt; يمكن قراءته عبر &lt;code&gt;resources/read&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;وتأكد من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نوع المحتوى.&lt;/li&gt;
&lt;li&gt;الترميز.&lt;/li&gt;
&lt;li&gt;pagination إن كان المورد يدعم صفحات.&lt;/li&gt;
&lt;li&gt;السلوك عند طلب URI غير موجود.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. عرض المطالبات
&lt;/h3&gt;

&lt;p&gt;في &lt;code&gt;prompts/get&lt;/code&gt;، تحقق من أن الاستجابة تحتوي على &lt;code&gt;messages&lt;/code&gt; سليمة، وأن الوسائط تُحقن في الأماكن الصحيحة.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. أوضاع الفشل
&lt;/h3&gt;

&lt;p&gt;اختبر الحالات التي تحدث في الإنتاج:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API خارجي متوقف.&lt;/li&gt;
&lt;li&gt;credentials غير صالحة.&lt;/li&gt;
&lt;li&gt;rate limit.&lt;/li&gt;
&lt;li&gt;timeout.&lt;/li&gt;
&lt;li&gt;بيانات upstream بشكل غير متوقع.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الاختبار اليدوي باستخدام stdio
&lt;/h2&gt;

&lt;p&gt;ابدأ بأبسط إعداد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;الطرفية.&lt;/li&gt;
&lt;li&gt;ملف خادم MCP.&lt;/li&gt;
&lt;li&gt;MCP Inspector أو JSON-RPC خام.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا لم تبنِ خادمًا بعد، استخدم &lt;a href="https://modelcontextprotocol.io/quickstart" rel="noopener noreferrer"&gt;البدء السريع الرسمي لـ MCP SDK&lt;/a&gt; في Python أو TypeScript. مثال الطقس كافٍ لبناء مجموعة اختبار أولية.&lt;/p&gt;

&lt;p&gt;شغّل الخادم عبر المفتش:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @modelcontextprotocol/inspector node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;المفتش يفتح واجهة محلية تتحدث MCP مع خادمك، وتعرض الطلبات والاستجابات. استخدمه للتحقق سريعًا من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أن الخادم يبدأ بدون أخطاء.&lt;/li&gt;
&lt;li&gt;أن &lt;code&gt;initialize&lt;/code&gt; ينجح.&lt;/li&gt;
&lt;li&gt;أن &lt;code&gt;tools/list&lt;/code&gt; يعرض الأدوات.&lt;/li&gt;
&lt;li&gt;أن &lt;code&gt;tools/call&lt;/code&gt; يعيد محتوى مفهومًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بعد ذلك، شغّل نفس التدفق يدويًا عبر &lt;code&gt;stdio&lt;/code&gt; لالتقاط الطلبات التي ستنقلها لاحقًا إلى &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-04-01","capabilities":{}}}'&lt;/span&gt; | node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;احفظ الطلب والاستجابة. كرر ذلك مع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في النهاية، سيكون لديك 6 إلى 12 زوجًا من الطلبات والاستجابات تمثل العقد الفعلي لخادمك.&lt;/p&gt;

&lt;h2&gt;
  
  
  نقاط يجب الانتباه لها أثناء الاختبار اليدوي
&lt;/h2&gt;

&lt;h3&gt;
  
  
  كتل المحتوى
&lt;/h3&gt;

&lt;p&gt;نتيجة الأداة يجب أن تعيد &lt;code&gt;content&lt;/code&gt; كمصفوفة. أمثلة صحيحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base64..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يمكن خلط أكثر من نوع في استجابة واحدة، لكن العملاء قد يعرضونها بطرق مختلفة. لذلك اختبرها مع العميل الحقيقي مرة واحدة على الأقل قبل الإصدار.&lt;/p&gt;

&lt;h3&gt;
  
  
  أخطاء الأداة
&lt;/h3&gt;

&lt;p&gt;لا تستخدم JSON-RPC error لفشل منطقي داخل الأداة. استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Upstream API failed"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON-RPC error يجب أن يبقى لأخطاء البروتوكول، مثل method غير معروف أو payload غير صالح.&lt;/p&gt;

&lt;h2&gt;
  
  
  من اليدوي إلى الآلي: بناء مجموعة اختبار في Apidog
&lt;/h2&gt;

&lt;p&gt;الاختبار اليدوي يكشف الأخطاء الواضحة. لكنه لا يجيب بسرعة على سؤال مثل:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;هل التغيير الأخير كسر &lt;code&gt;inputSchema&lt;/code&gt; للأداة السابعة؟&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;الحل: حوّل الطلبات التي حفظتها إلى مجموعة اختبار آلية في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;النمط العملي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ مشروعًا.&lt;/li&gt;
&lt;li&gt;أضف طلبات JSON-RPC.&lt;/li&gt;
&lt;li&gt;أضف تأكيدات JSONPath.&lt;/li&gt;
&lt;li&gt;استخدم mock server للأنظمة الخارجية.&lt;/li&gt;
&lt;li&gt;شغّل المجموعة في CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. إنشاء مشروع Apidog لخادم MCP
&lt;/h2&gt;

&lt;p&gt;افتح Apidog وأنشئ مشروعًا جديدًا.&lt;/p&gt;

&lt;p&gt;إذا كان خادم MCP لديك يعمل عبر HTTP، اضبط Base URL مباشرة على endpoint الخاص به.&lt;/p&gt;

&lt;p&gt;إذا كان يعمل عبر &lt;code&gt;stdio&lt;/code&gt; فقط، استخدم غلاف HTTP رقيق أثناء الاختبار. الفكرة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apidog يرسل HTTP request.&lt;/li&gt;
&lt;li&gt;wrapper يستقبل JSON-RPC.&lt;/li&gt;
&lt;li&gt;wrapper يمرره إلى خادم MCP عبر &lt;code&gt;stdio&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;يعيد الاستجابة إلى Apidog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يمكنك استخدام المفتش الرسمي أو كتابة wrapper بسيط في Node.js. نفس النمط مفيد عند اختبار خدمات غير HTTP، كما في &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;اختبار واجهة برمجة التطبيقات بدون Postman في 2026&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. حفظ الطلبات الكنسية
&lt;/h2&gt;

&lt;p&gt;أنشئ طلبًا لكل استدعاء مهم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال طلب &lt;code&gt;tools/call&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;احفظ نسخة لمسار النجاح ونسخًا أخرى لحالات الفشل.&lt;/p&gt;

&lt;p&gt;مثال لمدخل غير صالح:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. إضافة تأكيدات JSONPath
&lt;/h2&gt;

&lt;p&gt;الهدف ليس فقط إرسال الطلب. الهدف هو التأكد من شكل الاستجابة.&lt;/p&gt;

&lt;h3&gt;
  
  
  تأكيدات &lt;code&gt;initialize&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;أضف تأكيدات مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.protocolVersion&lt;/code&gt; يساوي الإصدار المتوقع.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.capabilities&lt;/code&gt; موجود.&lt;/li&gt;
&lt;li&gt;لا توجد &lt;code&gt;$.error&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  تأكيدات &lt;code&gt;tools/list&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;تأكد من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;وجود &lt;code&gt;$.result.tools&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أن &lt;code&gt;$.result.tools&lt;/code&gt; مصفوفة.&lt;/li&gt;
&lt;li&gt;أن عدد الأدوات أكبر من صفر.&lt;/li&gt;
&lt;li&gt;أن كل أداة تحتوي على &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أن كل أداة تحتوي على &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أن كل أداة تحتوي على &lt;code&gt;inputSchema&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال checks عملية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.result.tools exists
$.result.tools[0].name exists
$.result.tools[0].description exists
$.result.tools[0].inputSchema exists
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  تأكيدات &lt;code&gt;tools/call&lt;/code&gt; لمسار النجاح
&lt;/h3&gt;

&lt;p&gt;تأكد من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; غير موجود أو يساوي &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content&lt;/code&gt; مصفوفة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].type&lt;/code&gt; موجود.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].text&lt;/code&gt; يحتوي على قيمة متوقعة إن كانت الاستجابة نصية.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  تأكيدات &lt;code&gt;tools/call&lt;/code&gt; لمسار الفشل
&lt;/h3&gt;

&lt;p&gt;لوسيطة مفقودة مثلًا، تأكد من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; يساوي &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].type&lt;/code&gt; يساوي &lt;code&gt;text&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].text&lt;/code&gt; يطابق regex ثابتًا بدل مقارنة النص الكامل.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تجعل الاختبار هشًا بمقارنة رسالة خطأ كاملة قد تتغير لاحقًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. محاكاة واجهات API الخارجية
&lt;/h2&gt;

&lt;p&gt;معظم خوادم MCP تغلف أنظمة خارجية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weather API&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Linear&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;قاعدة بيانات داخلية&lt;/li&gt;
&lt;li&gt;منصة مراقبة&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تجعل CI يعتمد على هذه الخدمات مباشرة. ستواجه:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rate limits.&lt;/li&gt;
&lt;li&gt;تكلفة أعلى.&lt;/li&gt;
&lt;li&gt;نتائج غير حتمية.&lt;/li&gt;
&lt;li&gt;فشل عابر خارج سيطرتك.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استخدم mock server في Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;عرّف endpoint الخارجي كمسار mock.&lt;/li&gt;
&lt;li&gt;أعد JSON واقعيًا يشبه الإنتاج.&lt;/li&gt;
&lt;li&gt;اجعل خادم MCP يقرأ Base URL من متغير بيئة.&lt;/li&gt;
&lt;li&gt;في CI، وجّه المتغير إلى mock URL.&lt;/li&gt;
&lt;li&gt;في الإنتاج، وجّهه إلى API الحقيقي.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;UPSTREAM_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://mock.apidog.local npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يجعل مجموعة الاختبار سريعة وحتمية. نغطي نفس الفكرة في &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تطوير واجهة برمجة التطبيقات القائم على العقد أولًا&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. تشغيل المجموعة في CI
&lt;/h2&gt;

&lt;p&gt;بعد حفظ الطلبات والتأكيدات، شغّلها مع كل push أو pull request.&lt;/p&gt;

&lt;p&gt;مثال GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MCP server tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start MCP HTTP wrapper&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node test/wrapper.js &amp;amp;&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Apidog suite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx apidog run --project-id $APIDOG_PROJECT --env ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_PROJECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_PROJECT }}&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا، أي تغيير يكسر &lt;code&gt;tools/list&lt;/code&gt; أو &lt;code&gt;inputSchema&lt;/code&gt; أو سلوك أداة سيظهر قبل الدمج.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف تبدو تغطية اختبار جيدة؟
&lt;/h2&gt;

&lt;p&gt;لخادم MCP متوسط، استخدم هذا الحد الأدنى:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;طلب &lt;code&gt;initialize&lt;/code&gt; واحد مع تأكيدات البروتوكول.&lt;/li&gt;
&lt;li&gt;طلب &lt;code&gt;tools/list&lt;/code&gt; واحد مع تأكيدات الشكل وJSON Schema.&lt;/li&gt;
&lt;li&gt;من 2 إلى 4 طلبات &lt;code&gt;tools/call&lt;/code&gt; لكل أداة:

&lt;ul&gt;
&lt;li&gt;مسار النجاح.&lt;/li&gt;
&lt;li&gt;وسيطة مفقودة.&lt;/li&gt;
&lt;li&gt;نوع غير صالح.&lt;/li&gt;
&lt;li&gt;فشل upstream.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;طلب &lt;code&gt;resources/list&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;طلب &lt;code&gt;resources/read&lt;/code&gt; لكل عائلة موارد.&lt;/li&gt;

&lt;li&gt;طلب &lt;code&gt;prompts/list&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;طلب &lt;code&gt;prompts/get&lt;/code&gt; لكل قالب مطالبة.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;لخادم يحتوي على 10 أدوات و3 موارد و4 مطالبات، قد تصل المجموعة إلى 50-70 طلبًا. هذا طبيعي. مع mock server، يجب أن تعمل المجموعة خلال ثوانٍ.&lt;/p&gt;

&lt;h2&gt;
  
  
  أخطاء شائعة عند اختبار خوادم MCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  تخطي &lt;code&gt;initialize&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;بعض الخوادم تبني سجل الأدوات أثناء المصافحة. إذا بدأت مباشرة بـ &lt;code&gt;tools/list&lt;/code&gt;، قد تحصل على فشل غير واقعي.&lt;/p&gt;

&lt;p&gt;اجعل &lt;code&gt;initialize&lt;/code&gt; أول خطوة في كل سيناريو.&lt;/p&gt;

&lt;h3&gt;
  
  
  التأكيد على نص الخطأ الكامل
&lt;/h3&gt;

&lt;p&gt;رسائل الأخطاء تتغير. الأفضل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أكد على &lt;code&gt;isError: true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;استخدم error code إن كان موجودًا.&lt;/li&gt;
&lt;li&gt;أو استخدم regex ثابتًا بدل مطابقة النص كاملًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ترك mock يبتعد عن الإنتاج
&lt;/h3&gt;

&lt;p&gt;إذا كان mock يعيد شكلًا لا يعيده API الحقيقي، فالاختبارات ستنجح بينما التكامل مكسور.&lt;/p&gt;

&lt;p&gt;حدّث fixtures من استجابات حقيقية عند كل إصدار مهم.&lt;/p&gt;

&lt;h3&gt;
  
  
  نسيان Streaming
&lt;/h3&gt;

&lt;p&gt;خوادم MCP عبر HTTP قد تبث النتائج عبر Server-Sent Events. إن كان خادمك يستخدم SSE، فعّل دعم التدفق في الطلبات المحفوظة داخل Apidog، ثم أكد على النتيجة المجمعة.&lt;/p&gt;

&lt;h3&gt;
  
  
  عدم اختبار التزامن
&lt;/h3&gt;

&lt;p&gt;عملاء MCP قد يرسلون عدة &lt;code&gt;tools/call&lt;/code&gt; بالتوازي داخل agent loop. إذا كان خادمك يستخدم حالة مشتركة بدون حماية، فقد تنجح اختبارات الطلب الواحد ويفشل الإنتاج.&lt;/p&gt;

&lt;p&gt;أضف اختبارًا يشغّل عدة استدعاءات للأداة نفسها بالتوازي.&lt;/p&gt;

&lt;h3&gt;
  
  
  خلط أخطاء البروتوكول مع أخطاء الأداة
&lt;/h3&gt;

&lt;p&gt;فشل الأداة يجب أن يعود داخل &lt;code&gt;result&lt;/code&gt; مع &lt;code&gt;isError: true&lt;/code&gt;. أما JSON-RPC error فهو لفشل البروتوكول نفسه. الخلط بينهما قد يجعل Claude Desktop يغلق الاتصال. هذا شبيه بمشاكل العقود التي تظهر في &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تطوير منصة API القائم على العقد أولًا&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  حالات استخدام واقعية
&lt;/h2&gt;

&lt;p&gt;فريق بنى خادم MCP داخليًا لواجهة إدارة الحوادث اكتشف ثلاثة تراجعات في أسبوع واحد عبر تأكيدات Apidog على شكل &lt;code&gt;tools/list&lt;/code&gt;. بدون الاختبار، كانت الأخطاء ستصل إلى كل مهندس يستخدم Claude Desktop داخل الشركة.&lt;/p&gt;

&lt;p&gt;مطور مستقل يبني خادم MCP مفتوح المصدر لـ Notion استخدم mock server في Apidog لتشغيل الاختبارات في CI بدون استهلاك rate limits من Notion. المجموعة تعمل على كل pull request، وتستخدم fixtures مخزنة في المستودع.&lt;/p&gt;

&lt;p&gt;فريق منصة يدير 14 خادم MCP داخليًا أنشأ workspace مشتركة في Apidog لعقود الخوادم. كل خادم جديد يبدأ من مجموعة اختبار أساسية، والمراجعون يقارنون تغييرات المخطط قبل الدمج.&lt;/p&gt;

&lt;p&gt;فريق آخر يبني خادم MCP لمنصة مراقبة داخلية يستخدم environments في Apidog لتشغيل نفس المجموعة ضد التطوير والإنتاج، بدون إعادة كتابة الطلبات.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخاتمة
&lt;/h2&gt;

&lt;p&gt;MCP أصبح شائعًا بسرعة، لكن اختبار خوادمه ما زال غالبًا يدويًا وهشًا. لا تنتظر أن ينضج النظام البيئي. تعامل مع خادم MCP كواجهة API حقيقية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;صمّم عقدًا واضحًا.&lt;/li&gt;
&lt;li&gt;اختبر &lt;code&gt;initialize&lt;/code&gt; و&lt;code&gt;tools/list&lt;/code&gt; و&lt;code&gt;tools/call&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;غطِّ الموارد والمطالبات.&lt;/li&gt;
&lt;li&gt;حاكِ الأنظمة الخارجية.&lt;/li&gt;
&lt;li&gt;شغّل التأكيدات في CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الخلاصة العملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;خادم MCP هو JSON-RPC API؛ اختبره بنفس جدية REST API.&lt;/li&gt;
&lt;li&gt;ابدأ بالمفتش الرسمي وطلبات &lt;code&gt;stdio&lt;/code&gt; الخام.&lt;/li&gt;
&lt;li&gt;انقل الطلبات إلى &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;أضف تأكيدات JSONPath.&lt;/li&gt;
&lt;li&gt;استخدم mock server للـ upstream APIs.&lt;/li&gt;
&lt;li&gt;شغّل المجموعة مع كل push.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الخطوة التالية: افتح &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، أنشئ مشروعًا، الصق طلبات JSON-RPC التي التقطتها، أضف تأكيدات &lt;code&gt;tools/list&lt;/code&gt;، ثم شغّل المجموعة. خلال ساعة ستعرف إن كان عقد خادم MCP لديك جاهزًا للشحن.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ما هو MCP؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP، أو Model Context Protocol، هو مواصفة مفتوحة من Anthropic لكيفية استدعاء عملاء الذكاء الاصطناعي للأدوات والموارد والمطالبات الخارجية. يعتمد على JSON-RPC 2.0 عبر &lt;code&gt;stdio&lt;/code&gt; أو HTTP قابل للتدفق. &lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;المواصفات الكاملة لـ MCP&lt;/a&gt; منشورة على &lt;a href="http://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يمكنني اختبار خادم MCP بدون غلاف HTTP؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;نعم. &lt;a href="https://github.com/modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;المفتش الرسمي لـ MCP&lt;/a&gt; يتحدث &lt;code&gt;stdio&lt;/code&gt; مباشرة ويوفر واجهة للاختبار اليدوي. للاختبار الآلي في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، استخدم HTTP wrapper رقيقًا أثناء CI فقط.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;كيف أحاكي واجهات API الخارجية التي يستدعيها خادم MCP؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;عرّف كل endpoint خارجي كـ mock في Apidog، ثم وجّه إعدادات خادم MCP إلى mock URL أثناء الاختبارات. في الإنتاج، استخدم URL الحقيقي. نفس النمط موضح في &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أدوات اختبار واجهة برمجة التطبيقات لمهندسي ضمان الجودة&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ماذا عن نتائج الأدوات المتدفقة؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;خوادم MCP عبر HTTP قد تستخدم Server-Sent Events. يدعم Apidog SSE في الطلبات المحفوظة؛ فعّل التدفق في إعدادات الطلب، ثم أكد على النتيجة بعد تجميعها.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يجب اختبار إصدار البروتوكول؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;نعم. ثبّت &lt;code&gt;protocolVersion&lt;/code&gt; في &lt;code&gt;initialize&lt;/code&gt; وأضف تأكيدًا عليه. عدم التطابق قد يسبب مشاكل توافق صامتة مع العملاء.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل أختبر خادمي مقابل Claude Desktop الحقيقي؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;نعم، مرة واحدة على الأقل قبل كل إصدار. لكن لا تجعله حلقة regression الأساسية. استخدم &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; للاختبارات الآلية، وClaude Desktop لاختبار smoke نهائي.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;أين أجد أمثلة لخوادم MCP حقيقية؟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;راجع &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;مستودع خوادم MCP الرسمي&lt;/a&gt;. يحتوي على تطبيقات مرجعية لأنظمة الملفات، GitHub، Slack، Postgres، وغيرها. اقرأ تعريفات الأدوات لفهم شكل MCP الجيد.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ما هو Maigret: ماسح OSINT لا يتعطل</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Mon, 11 May 2026 06:11:50 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/m-hw-maigret-msh-osint-l-yttl-444n</link>
      <guid>https://dev.to/yusuf_khalidd/m-hw-maigret-msh-osint-l-yttl-444n</guid>
      <description>&lt;p&gt;معظم أدوات استخبارات المصادر المفتوحة (OSINT) تتقادم بسرعة: تتغير صفحات الويب، تنتقل المواقع إلى نقاط نهاية جديدة، تظهر اختبارات Captcha أقوى، ثم تتعطل الأداة بعد عام أو عامين. يُعد &lt;a href="https://github.com/soxoj/maigret" rel="noopener noreferrer"&gt;Maigret&lt;/a&gt; استثناءً عمليًا: يعمل منذ سنوات، يدعم أكثر من 3000 موقع، ويوفر حزمة بايثون، وبوت تيليجرام، وواجهة ويب. الأهم للمهندسين أن بنيته الداخلية تقدم نموذجًا جيدًا لبناء ماسح لا ينهار عند تغير المواقع.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;هذا الدليل موجه للمهندسين. سنفكك ما يفعله Maigret، متى يكون استخدامه مشروعًا، كيف تعمل قاعدة توقيعات المواقع، وكيف يمكن نقل الأنماط نفسها إلى اختبار واجهات برمجة التطبيقات باستخدام &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;إذا لم تكن قد قرأته بعد، فإن منشورنا &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;اختبار واجهات برمجة التطبيقات بدون Postman في عام 2026&lt;/a&gt; يغطي أفكار مطابقة الأنماط واكتشاف الانحراف في سياق اختبار API.&lt;/p&gt;

&lt;h2&gt;
  
  
  خلاصة القول TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;يستخدم Maigret اسم مستخدم واحدًا للبحث عن حسابات عامة عبر أكثر من 3000 موقع.&lt;/li&gt;
&lt;li&gt;يعتمد على قاعدة بيانات توقيعات للمواقع، لا على منطق مبرمج يدويًا لكل حالة.&lt;/li&gt;
&lt;li&gt;يميز بين “الحساب موجود” و“الحساب غير موجود” باستخدام عدة إشارات: نصوص وجود، نصوص غياب، رؤوس، وأنماط URL.&lt;/li&gt;
&lt;li&gt;الاستخدام المشروع يشمل الصحافة الاستقصائية، استعادة الحسابات، البحث عن المفقودين بموافقة، مراقبة إساءة استخدام العلامة التجارية، واختبارات الاختراق المرخصة.&lt;/li&gt;
&lt;li&gt;استخدامه على أشخاص دون موافقة أو أساس قانوني قد يتحول إلى تحرش أو مطاردة رقمية.&lt;/li&gt;
&lt;li&gt;أنماطه المعمارية مفيدة جدًا لاختبار API: توقيعات، تأكيدات متعددة الإشارات، اختبارات انحدار، واكتشاف انحراف.&lt;/li&gt;
&lt;li&gt;يمكنك تطبيق الفكرة نفسها في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; عبر تعريف توقعات دقيقة لكل endpoint وتشغيلها دوريًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ما هو Maigret وما ليس هو
&lt;/h2&gt;

&lt;p&gt;Maigret أداة بايثون مرخصة بموجب MIT ويصونها &lt;a href="https://github.com/soxoj" rel="noopener noreferrer"&gt;soxoj&lt;/a&gt;. يصفها README بأنها أداة “لجمع ملف كامل عن شخص ما باستخدام اسم المستخدم من أكثر من 3000 موقع”.&lt;/p&gt;

&lt;p&gt;الاستخدام الأساسي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;maigret
maigret username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يشغّل الأمر بحثًا عبر المواقع الموجودة في قاعدة البيانات، ثم ينتج تقريرًا بالحسابات العامة التي تم العثور عليها.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc1p0grz3hi19mncedf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc1p0grz3hi19mncedf5.png" alt="واجهة أو مخرجات Maigret" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ثلاث نقاط مهمة:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maigret يستخدم البيانات العامة فقط.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
لا يحتاج إلى تسجيل دخول، ولا مفاتيح API، ولا بيانات اعتماد. إذا كان الملف الشخصي ظاهرًا للزوار المجهولين، يمكن للأداة قراءته.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;له استخدامات مشروعة.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
يستخدمه صحفيون، متطوعو بحث عن مفقودين، فرق مكافحة احتيال، فرق حماية علامة تجارية، وفرق red-team ضمن نطاق مصرح به.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;يمكن إساءة استخدامه.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
تشغيله على فرد خاص دون موافقة أو مبرر قانوني قد يخالف قوانين الملاحقة والتحرش في عدة ولايات قضائية.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;سنركز هنا على الهندسة وأنماط الاختبار القابلة لإعادة الاستخدام، لا على استهداف الأشخاص.&lt;/p&gt;

&lt;h2&gt;
  
  
  التثبيت والتشغيل السريع
&lt;/h2&gt;

&lt;p&gt;للتجربة محليًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;--version&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;maigret
maigret example_user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لتشغيل فحص أوسع يشمل جميع المواقع المتاحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret example_user &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لتحديث قاعدة بيانات المواقع قبل تشغيل جاد:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;--update&lt;/span&gt;
maigret example_user &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لإخراج تقرير بصيغة HTML أو JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret example_user &lt;span class="nt"&gt;--html&lt;/span&gt;
maigret example_user &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;الفكرة الهندسية هنا ليست الأمر نفسه، بل طريقة تصميم النظام: قاعدة توقيعات قابلة للتحديث، محرك فحص عام، ومخرجات قابلة للتحليل.&lt;/p&gt;

&lt;h2&gt;
  
  
  قاعدة بيانات توقيعات المواقع
&lt;/h2&gt;

&lt;p&gt;أقوى فكرة في Maigret هي أنه لا يكتب منطقًا خاصًا لكل موقع داخل الكود. بدلًا من ذلك، يصف كل موقع داخل قاعدة بيانات JSON.&lt;/p&gt;

&lt;p&gt;كل توقيع يجيب عن أسئلة مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ما رابط الملف الشخصي؟&lt;/li&gt;
&lt;li&gt;كيف يبدو الرد عندما يكون الحساب موجودًا؟&lt;/li&gt;
&lt;li&gt;كيف يبدو الرد عندما لا يكون الحساب موجودًا؟&lt;/li&gt;
&lt;li&gt;ما النصوص التي تؤكد الوجود؟&lt;/li&gt;
&lt;li&gt;ما النصوص التي تؤكد الغياب؟&lt;/li&gt;
&lt;li&gt;هل يحتاج الموقع إلى رؤوس HTTP خاصة؟&lt;/li&gt;
&lt;li&gt;هل يطبق الموقع Captcha أو rate limit؟&lt;/li&gt;
&lt;li&gt;ما البيانات العامة التي يمكن استخراجها من الصفحة؟&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال مبسط لفكرة التوقيع:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleSite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urlMain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/{username}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"presenseStrs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@{username}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"absenceStrs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"User not found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This profile does not exist"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"User-Agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"social"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"global"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ملاحظة: المثال للتوضيح وليس توقيعًا رسميًا من Maigret.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;هذا النمط هو نفسه الذي تحتاجه في اختبار API. بدلًا من كتابة اختبارات مبعثرة داخل ملفات كثيرة، عرّف “توقيع” كل endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET /users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم شغّل محرك اختبار عام يقرأ هذه التوقيعات ويتحقق منها. هذا هو جوهر تطوير API المبني على العقد، وقد تناولناه أيضًا في &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تطوير API المبني على العقد أولاً&lt;/a&gt; و&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل اختبار خادم MCP&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  كيف يميز Maigret بين وجود الحساب وعدم وجوده
&lt;/h2&gt;

&lt;p&gt;الطريقة الساذجة هي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://example.com/user/&amp;lt;username&amp;gt;
إذا عاد 200 =&amp;gt; الحساب موجود
إذا عاد 404 =&amp;gt; الحساب غير موجود
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لكن الويب الحقيقي لا يعمل بهذه البساطة. كثير من المواقع تعيد &lt;code&gt;200 OK&lt;/code&gt; حتى عندما لا يكون المستخدم موجودًا، وتعرض رسالة مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أو تعيد صفحة عامة، أو Captcha، أو redirect.&lt;/p&gt;

&lt;p&gt;لذلك يستخدم Maigret عدة إشارات:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;قالب URL.&lt;/li&gt;
&lt;li&gt;نصوص يجب أن تظهر عند وجود الحساب.&lt;/li&gt;
&lt;li&gt;نصوص يجب أن تظهر عند غياب الحساب.&lt;/li&gt;
&lt;li&gt;أحيانًا regex لاستخراج اسم المستخدم أو حقول إضافية.&lt;/li&gt;
&lt;li&gt;رؤوس HTTP مخصصة.&lt;/li&gt;
&lt;li&gt;تصنيف الموقع حسب الفئة أو البلد.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;المنطق العملي يكون قريبًا من:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;classify_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;presence_strs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;absence_strs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;has_presence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;presence_strs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;has_absence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;absence_strs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;has_presence&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;has_absence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;has_absence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not_found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;النقطة المهمة: &lt;strong&gt;رمز الحالة وحده لا يكفي&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;في اختبار API، افعل الشيء نفسه. لا تكتفِ بـ &lt;code&gt;200 OK&lt;/code&gt;. تحقق من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status code&lt;/li&gt;
&lt;li&gt;content type&lt;/li&gt;
&lt;li&gt;الحقول المطلوبة&lt;/li&gt;
&lt;li&gt;الحقول الممنوعة&lt;/li&gt;
&lt;li&gt;شكل الخطأ&lt;/li&gt;
&lt;li&gt;headers المهمة&lt;/li&gt;
&lt;li&gt;قيم business-critical&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال assertion منطقي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user response contract&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، يمكنك تطبيق الفكرة نفسها عبر تأكيدات status code، body، schema، والحقول المطلوبة في الطلب نفسه.&lt;/p&gt;

&lt;h2&gt;
  
  
  البحث المتكرر واستخراج المعلومات
&lt;/h2&gt;

&lt;p&gt;بعد أن يجد Maigret حسابًا، لا يتوقف عند “تم العثور على الحساب”. يقوم بخطوتين إضافيتين:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;استخراج معلومات عامة من صفحة الملف الشخصي&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
مثل اسم ظاهر، روابط، أسماء مستخدمين أخرى، أو معرفات عامة.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;إعادة استخدام المعرفات المكتشفة في جولة بحث جديدة&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
مثلًا: اسم مستخدم يؤدي إلى حساب، الحساب يعرض اسمًا آخر، الاسم الآخر يقود إلى خدمة أخرى.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;هذا يسمى بحثًا متكررًا أو recursive enrichment.&lt;/p&gt;

&lt;p&gt;تصور مبسط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username
  -&amp;gt; profile on Site A
      -&amp;gt; linked username on Site B
          -&amp;gt; profile on Site B
              -&amp;gt; public email or alias
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في سياق API، النمط نفسه مفيد:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/123
  -&amp;gt; returns organizationId
      -&amp;gt; GET /organizations/{organizationId}
          -&amp;gt; returns planId
              -&amp;gt; GET /plans/{planId}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;عندما تكتشف حقلًا جديدًا في استجابة API، لا تتجاهله. اسأل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;هل هو موثق؟&lt;/li&gt;
&lt;li&gt;هل يشير إلى endpoint آخر؟&lt;/li&gt;
&lt;li&gt;هل يحتاج إلى اختبار؟&lt;/li&gt;
&lt;li&gt;هل يجب إضافته إلى contract؟&lt;/li&gt;
&lt;li&gt;هل كسره سيؤثر على عميل آخر؟&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  التعامل مع Captcha وRate Limits
&lt;/h2&gt;

&lt;p&gt;Maigret لا يحاول كسر دفاعات المواقع. يتعامل مع القيود بلطف، ويستخدم إشارات الاستجابة لاكتشاف:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rate limit&lt;/li&gt;
&lt;li&gt;Captcha&lt;/li&gt;
&lt;li&gt;حظر Tor أو I2P&lt;/li&gt;
&lt;li&gt;الحاجة إلى User-Agent معين&lt;/li&gt;
&lt;li&gt;headers مثل &lt;code&gt;Retry-After&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استراتيجياته تشمل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تدوير User-Agent.&lt;/li&gt;
&lt;li&gt;احترام رؤوس retry.&lt;/li&gt;
&lt;li&gt;استخدام نطاقات جوال أو صفحات مبسطة عندما تكون متاحة.&lt;/li&gt;
&lt;li&gt;تسجيل الحالة كـ Captcha detected بدلًا من محاولة تجاوز دفاع قوي.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا درس مهم لاختبار API.&lt;/p&gt;

&lt;p&gt;لا تبنِ مشغّل اختبارات يضرب API بلا حدود. صممه ليحترم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;429&lt;/span&gt; &lt;span class="ne"&gt;Too Many Requests&lt;/span&gt;
&lt;span class="na"&gt;Retry-After&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;60&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال تعامل بسيط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requestWithBackoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchFn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchFn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Retry-After&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fetchFn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يحمي اختباراتك من حظر IP الفريق، ويحافظ على سلوك متوافق مع شروط الخدمة.&lt;/p&gt;

&lt;h2&gt;
  
  
  مشكلة انحراف التوقيع
&lt;/h2&gt;

&lt;p&gt;أي قاعدة تضم آلاف التوقيعات ستنحرف مع الوقت. المواقع تغير:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;بنية URL.&lt;/li&gt;
&lt;li&gt;نصوص صفحات الخطأ.&lt;/li&gt;
&lt;li&gt;شكل الملف الشخصي.&lt;/li&gt;
&lt;li&gt;سياسات Captcha.&lt;/li&gt;
&lt;li&gt;أسماء الحقول.&lt;/li&gt;
&lt;li&gt;العلامة التجارية بالكامل.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا لم تحدّث التوقيع، تحصل على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;false positive: يظن أن الحساب موجود وهو غير موجود.&lt;/li&gt;
&lt;li&gt;false negative: يفشل في العثور على حساب موجود.&lt;/li&gt;
&lt;li&gt;unknown results كثيرة بلا فائدة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يعالج Maigret ذلك عبر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تحديث تلقائي من مستودع GitHub المركزي كل 24 ساعة.&lt;/li&gt;
&lt;li&gt;مساهمات المجتمع عبر pull requests.&lt;/li&gt;
&lt;li&gt;خيار &lt;code&gt;--update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;اختبارات مدمجة تتحقق من صحة التوقيعات مقابل أسماء مستخدمين معروفة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا الجزء هو الأهم لمهندسي API: &lt;strong&gt;كل contract يحتاج إلى اختبار انحدار دوري&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;في API، احفظ استجابة معروفة وصحيحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-01T00:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم شغّل اختبارًا دوريًا يتحقق من أن endpoint ما زال يعيد نفس الشكل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requiredFields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;createdAt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;requiredFields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;responseBody&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Missing field: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;field&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يدعم &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; هذا النمط عبر حفظ الطلبات، تعريف التأكيدات، تشغيلها دوريًا، ومقارنة النتائج لاكتشاف الانحراف. يغطي &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;دليل DeepSeek V4 API&lt;/a&gt; مثالًا عمليًا على التعامل مع API لبائع محدد.&lt;/p&gt;

&lt;h2&gt;
  
  
  وضع الملخص بالذكاء الاصطناعي
&lt;/h2&gt;

&lt;p&gt;توفر Maigret علامة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret username &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;تستخدم هذه العلامة نقطة نهاية LLM متوافقة مع OpenAI لتلخيص النتائج. أنت توفر مفتاح API، وMaigret يرسل النتائج الخام ليحصل على ملخص قابل للقراءة.&lt;/p&gt;

&lt;p&gt;النمط الهندسي هنا مهم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;القواعد الحتمية تقرر هل الحساب موجود أم لا.&lt;/li&gt;
&lt;li&gt;النموذج اللغوي لا يقرر الحقيقة.&lt;/li&gt;
&lt;li&gt;النموذج يلخص فقط نتائج تم حسابها مسبقًا.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;هذا يقلل الهلوسة. النموذج يعمل كـ postprocessor، لا كـ judge.&lt;/p&gt;

&lt;p&gt;في مراقبة API، يمكنك تطبيق البنية نفسها:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;شغّل تأكيدات حتمية في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;اجمع نتائج التشغيل.&lt;/li&gt;
&lt;li&gt;أرسل الملخص إلى LLM لصياغة تقرير Slack أو بريد إلكتروني.&lt;/li&gt;
&lt;li&gt;لا تجعل LLM يقرر النجاح أو الفشل.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ناقشنا هذه الفكرة في &lt;a href="http://apidog.com/blog/computer-use-vs-structured-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;استخدام الحاسوب مقابل واجهات برمجة التطبيقات المنظمة&lt;/a&gt;: الطبقة المنظمة يجب أن تأتي أولًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  حالات الاستخدام المشروعة
&lt;/h2&gt;

&lt;p&gt;استخدم Maigret فقط في سياقات واضحة ومصرح بها. أمثلة مقبولة:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. استعادة حساباتك الشخصية
&lt;/h3&gt;

&lt;p&gt;إذا استخدمت اسم مستخدم قديمًا منذ سنوات، يمكنك البحث عن الحسابات العامة المرتبطة به قبل إغلاقها أو تحديث إعدادات الخصوصية.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret old_username &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. مراقبة إساءة استخدام العلامة التجارية
&lt;/h3&gt;

&lt;p&gt;يمكن للشركات البحث عن أسماء منتجاتها أو علاماتها لاكتشاف حسابات انتحال.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret brand_name &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. البحث عن المفقودين بموافقة
&lt;/h3&gt;

&lt;p&gt;تستخدم بعض فرق البحث والإنقاذ أدوات OSINT بموافقة الأسرة وبالتنسيق مع جهات إنفاذ القانون.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. اختبارات الاختراق المرخصة
&lt;/h3&gt;

&lt;p&gt;ضمن عقد red-team أو pentest، يمكن استخدام Maigret لتحديد سطح التعرض العام للمؤسسة.&lt;/p&gt;

&lt;p&gt;القاعدة هنا: &lt;strong&gt;النطاق مكتوب ومصرح به&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. الصحافة الاستقصائية
&lt;/h3&gt;

&lt;p&gt;يستخدم الصحفيون أدوات OSINT ضمن مراجعة تحريرية وقانونية، خصوصًا عند التحقيق في احتيال، جرائم منظمة، أو قضايا مصلحة عامة.&lt;/p&gt;

&lt;p&gt;ما لا يدخل ضمن الاستخدام المشروع:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;البحث عن شخص بدافع الفضول.&lt;/li&gt;
&lt;li&gt;مراقبة شريك سابق.&lt;/li&gt;
&lt;li&gt;بناء قاعدة بيانات عن أشخاص لم يوافقوا.&lt;/li&gt;
&lt;li&gt;استهداف أفراد خاصين دون أساس قانوني.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  أنماط من Maigret يمكنك تطبيقها على اختبار API
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. استخدم توقيعات كبيانات
&lt;/h3&gt;

&lt;p&gt;بدلًا من كتابة اختبار مخصص لكل endpoint، عرّف السلوك المتوقع كبيانات.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/orders/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"internalNotes"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يسهل إضافة endpoints جديدة دون إعادة بناء نظام الاختبار.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. لا تثق في status code وحده
&lt;/h3&gt;

&lt;p&gt;اختبر عدة إشارات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status code + content-type + schema + required fields + forbidden fields
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;toContain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toHaveProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toHaveProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. حدّث التوقيعات مركزيًا
&lt;/h3&gt;

&lt;p&gt;كما يحدّث Maigret قاعدة المواقع من GitHub، يجب أن تمتلك مصدرًا مركزيًا لعقود API. مشاريع &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; تدعم التعاون والمزامنة، وهذا يقلل تشتت العقود بين الفرق.&lt;/p&gt;

&lt;p&gt;راجع أيضًا &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;اختبار API بدون Postman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokopqqrevpf1iclqlvqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokopqqrevpf1iclqlvqp.png" alt="واجهة Apidog لاختبار API" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. شغّل اختبارات الانحراف دوريًا
&lt;/h3&gt;

&lt;p&gt;لا تنتظر أن يكتشف المستخدمون تغيرًا في API. شغّل اختبارات مجدولة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;كل ساعة / كل يوم / قبل النشر / بعد النشر
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وتحقق من:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;هل تغير schema؟&lt;/li&gt;
&lt;li&gt;هل اختفى حقل؟&lt;/li&gt;
&lt;li&gt;هل تغير نوع البيانات؟&lt;/li&gt;
&lt;li&gt;هل تغير شكل الخطأ؟&lt;/li&gt;
&lt;li&gt;هل زاد زمن الاستجابة؟&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. استخدم LLM للتلخيص فقط
&lt;/h3&gt;

&lt;p&gt;اجعل القواعد الحتمية تقرر:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pass / fail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم استخدم LLM لصياغة تقرير مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;فشل اختبار GET /orders/{id} لأن الحقل total لم يعد موجودًا.
بدأ الفشل في تشغيل 02:10 UTC.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لا تجعل النموذج يقرر صحة العقد.&lt;/p&gt;

&lt;h2&gt;
  
  
  المزالق الشائعة عند تشغيل Maigret
&lt;/h2&gt;

&lt;h3&gt;
  
  
  افتراض أن التشغيل الافتراضي كامل
&lt;/h3&gt;

&lt;p&gt;التشغيل الافتراضي لا يفحص كل شيء دائمًا. إذا كنت تحتاج إلى فحص أوسع، استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret username &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لكن توقع وقت تشغيل أطول.&lt;/p&gt;

&lt;h3&gt;
  
  
  تجاهل tags
&lt;/h3&gt;

&lt;p&gt;يمكن تضييق البحث حسب الفئة أو البلد باستخدام:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret username &lt;span class="nt"&gt;--tags&lt;/span&gt; social
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا مفيد عندما يكون النطاق الجغرافي أو نوع المواقع مهمًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  تخطي التحديث
&lt;/h3&gt;

&lt;p&gt;قاعدة توقيعات قديمة تعني نتائج غير موثوقة. قبل أي فحص جاد:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;--update&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  تفسير حظر Tor كدليل
&lt;/h3&gt;

&lt;p&gt;بعض المواقع تحظر Tor بالكامل. إذا فشل الوصول عبر Tor، لا تستنتج شيئًا عن وجود الحساب.&lt;/p&gt;

&lt;h3&gt;
  
  
  تصديق كل حقل مستخرج
&lt;/h3&gt;

&lt;p&gt;Maigret يقرأ ما تعرضه الصفحة. الصفحات العامة يمكن تزويرها. اعتبر النتائج أدلة تحتاج تحققًا، لا إثباتًا نهائيًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  حالات استخدام واقعية
&lt;/h2&gt;

&lt;p&gt;شركة استشارات أمنية تستخدم Maigret في بداية كل عملية red-team مرخصة لتقديم صورة أولية عن سطح التعرض العام للعميل.&lt;/p&gt;

&lt;p&gt;محقق احتيال مستقل يستخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret target_username &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لتحويل نتائج آلاف المواقع إلى ملخص قصير لعميل غير تقني. البحث نفسه حتمي، والذكاء الاصطناعي فقط يصيغ التقرير.&lt;/p&gt;

&lt;p&gt;فريق هندسي يستخدم الأنماط نفسها داخل اختبارات API الخاصة به: قاعدة توقيعات، تشغيل دوري، واكتشاف انحراف عبر 200 خدمة مصغرة. التنفيذ داخل &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، لكن المبادئ هي مبادئ Maigret نفسها.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخاتمة
&lt;/h2&gt;

&lt;p&gt;Maigret ليس مجرد أداة OSINT. هو مثال عملي على بناء نظام يتحمل تغير آلاف الأسطح الخارجية: توقيعات قابلة للتحديث، تأكيدات متعددة الإشارات، اكتشاف انحراف، ومعالجة LLM لاحقة لا تتحكم في القرار.&lt;/p&gt;

&lt;p&gt;خمسة دروس قابلة للتطبيق:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;عرّف السلوك المتوقع كبيانات، لا ككود متشعب.&lt;/li&gt;
&lt;li&gt;استخدم عدة إشارات للحكم، لا status code فقط.&lt;/li&gt;
&lt;li&gt;شغّل اختبارات دورية ضد fixtures معروفة.&lt;/li&gt;
&lt;li&gt;تعامل مع الانحراف كحالة طبيعية، لا كاستثناء.&lt;/li&gt;
&lt;li&gt;استخدم LLM للتلخيص، وليس للحكم على صحة النتائج.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;الخطوة التالية: اقرأ تنسيق قاعدة بيانات مواقع Maigret، ثم افتح &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; وصمم endpoint واحدًا بالطريقة نفسها: توقيع واضح، تأكيدات متعددة، واستجابة محفوظة لاكتشاف الانحراف. هذا الانضباط يدفع ثمنه عندما يغير مزود خارجي اسم حقل في الثانية صباحًا وتلتقطه اختباراتك قبل المستخدمين.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل استخدام Maigret قانوني؟
&lt;/h3&gt;

&lt;p&gt;يعتمد ذلك على الولاية القضائية والهدف. تشغيله على نفسك، أو على حسابات تملكها، أو على شركة لديك إذن كتابي باختبارها، أو ضمن عمل صحفي خاضع لمراجعة قانونية، غالبًا يكون مقبولًا. تشغيله على فرد خاص دون موافقة قد يخالف قوانين الملاحقة والتحرش.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يعمل Maigret بدون بايثون؟
&lt;/h3&gt;

&lt;p&gt;الحزمة الرسمية تتطلب Python 3.10+. يوجد أيضًا &lt;a href="https://t.me/maigret_search_bot" rel="noopener noreferrer"&gt;بوت تيليجرام&lt;/a&gt; وخيارات تشغيل سحابية لمن لا يريد تثبيتًا محليًا.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما مدى دقة رقم 3000 موقع؟
&lt;/h3&gt;

&lt;p&gt;قاعدة البيانات تسرد أكثر من 3000 إدخال، لكن ليس كل موقع يكون فعالًا في كل لحظة. التحديثات المجتمعية والتحديث التلقائي يحافظان على أكبر قدر ممكن من الدقة.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا يضيف وضع الذكاء الاصطناعي؟
&lt;/h3&gt;

&lt;p&gt;علامة &lt;code&gt;--ai&lt;/code&gt; تلخص النتائج الحتمية باستخدام LLM متوافق مع OpenAI. لا تغير عملية البحث ولا تقرر صحة النتائج. تحتاج إلى مفتاح API خاص بك.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكن استخدام Maigret في CI؟
&lt;/h3&gt;

&lt;p&gt;لتحقيقات OSINT، غالبًا لا؛ لأنها تفاعلية وتعتمد على سياق قانوني وأخلاقي. لكن أنماطه المعمارية مناسبة جدًا لـ CI في اختبار API: توقيعات، اكتشاف انحراف، وتشغيل مجدول. يدعم &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; هذه الأنماط بشكل أصلي.&lt;/p&gt;

&lt;h3&gt;
  
  
  كيف يختلف Maigret عن Sherlock؟
&lt;/h3&gt;

&lt;p&gt;Sherlock أقدم وأبسط. Maigret يضيف استخراج معلومات، بحثًا متكررًا، معالجة Captcha جزئية، وضع تلخيص بالذكاء الاصطناعي، وقاعدة مواقع أغنى. كلاهما مرخص بموجب MIT ويستحقان المعرفة.&lt;/p&gt;

&lt;h3&gt;
  
  
  أين أبلغ عن توقيع قديم؟
&lt;/h3&gt;

&lt;p&gt;استخدم GitHub Issues أو Pull Requests في مستودع Maigret. عادةً الأفضل فتح طلب سحب صغير يحدّث توقيع موقع واحد بوضوح.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>حل مشكلة خطأ "تكوين مؤسسة 3p مخصص غير صالح" في كود Claude</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Mon, 11 May 2026 03:32:53 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/hl-mshkl-kht-tkwyn-mwss-3p-mkhss-gyr-slh-fy-kwd-claude-mf1</link>
      <guid>https://dev.to/yusuf_khalidd/hl-mshkl-kht-tkwyn-mwss-3p-mkhss-gyr-slh-fy-kwd-claude-mf1</guid>
      <description>&lt;p&gt;إذا حاولت توجيه Claude Code إلى DeepSeek V4 أو OpenRouter أو أي مزود نموذج طرف ثالث آخر وظهر لك الخطأ &lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;، فالمشكلة غالبًا ليست في النموذج نفسه، بل في تهيئة Claude Code: عنوان URL الأساسي، نوع مفتاح المصادقة، ملف &lt;code&gt;settings.json&lt;/code&gt;، أو إعدادات المؤسسة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;في هذا الدليل العملي ستجد معنى &lt;code&gt;custom3p&lt;/code&gt;، أكثر الأسباب شيوعًا للخطأ، وكيفية إصلاح كل سبب بخطوات وأمثلة تهيئة قابلة للاستخدام مع OpenRouter وLiteLLM وvLLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  خلاصة سريعة
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt; يعني أن Claude Code لم يستطع التحقق من صحة تهيئة مزود خارجي.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;custom3p&lt;/code&gt; هو الاسم الداخلي في Claude Code لأي نقطة نهاية API غير تابعة لـ Anthropic يتم تفعيلها عبر:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ANTHROPIC_BASE_URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ابدأ دائمًا بهذه الفحوصات:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;احذف &lt;code&gt;/v1&lt;/code&gt; من نهاية &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;استخدم متغير المصادقة الصحيح:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; للـ Bearer token.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; لرأس &lt;code&gt;x-api-key&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;تحقق من صحة &lt;code&gt;~/.claude/settings.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;تأكد أن الإعداد الأولي لـ Claude Code مكتمل.&lt;/li&gt;
&lt;li&gt;تأكد أن بوابتك تمرر الرؤوس المطلوبة.&lt;/li&gt;
&lt;li&gt;تحقق من عدم وجود سياسة مؤسسة تمنع المزود المخصص.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ماذا يعني &lt;code&gt;custom3p&lt;/code&gt;؟
&lt;/h2&gt;

&lt;p&gt;يوجه Claude Code الطلبات عبر عدة أوضاع:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;الوضع&lt;/th&gt;
&lt;th&gt;كيف يتم تفعيله&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic API الافتراضي&lt;/td&gt;
&lt;td&gt;بدون تجاوز&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Bedrock&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_BEDROCK=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Vertex AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_VERTEX=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Foundry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_FOUNDRY=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;طرف ثالث مخصص&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; يشير إلى مزود آخر&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;عندما تضبط &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; على مضيف غير تابع لـ Anthropic مثل OpenRouter أو LiteLLM أو vLLM أو بوابة داخلية، يتعامل Claude Code مع هذا المسار داخليًا باسم &lt;code&gt;custom3p&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;قبل إرسال أول طلب، يجري Claude Code تحققًا من التهيئة. إذا فشل، يظهر الخطأ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid custom3p enterprise config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا خطأ تهيئة، وليس حظرًا سياسيًا أو رفضًا تلقائيًا لاستخدام مزود خارجي.&lt;/p&gt;

&lt;h2&gt;
  
  
  لماذا يظهر هذا الخطأ الآن؟
&lt;/h2&gt;

&lt;p&gt;بعد قيود Anthropic في أبريل 2026 على أدوات كانت تزيف معرف عميل Claude Code للوصول إلى اشتراكات Pro وMax، بدأ مطورون كثيرون باستخدام دعم الطرف الثالث الرسمي في Claude Code لتوجيه الجلسات عبر مزودين أرخص.&lt;/p&gt;

&lt;p&gt;على سبيل المثال، وثّق أحد المواضيع استخدام &lt;a href="https://openrouter.ai/deepseek/deepseek-v4-pro" rel="noopener noreferrer"&gt;DeepSeek V4 Pro عبر OpenRouter&lt;/a&gt; بتكلفة أقل بكثير من Anthropic. كما ظهرت أدوات مثل &lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt; لتبسيط الإعداد.&lt;/p&gt;

&lt;p&gt;المشكلة أن دعم الطرف الثالث الرسمي يتطلب تهيئة دقيقة. خطأ صغير في URL أو المصادقة أو JSON يكفي لإظهار:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid custom3p enterprise config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  السبب 1: وجود &lt;code&gt;/v1&lt;/code&gt; زائدة في &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;هذا هو السبب الأكثر شيوعًا.&lt;/p&gt;

&lt;p&gt;Claude Code يضيف تلقائيًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إلى عنوانك الأساسي. لذلك إذا وضعت &lt;code&gt;/v1&lt;/code&gt; بنفسك، يصبح المسار النهائي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وغالبًا تحصل على &lt;code&gt;404&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  خطأ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  صحيح
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  اختبار سريع
&lt;/h3&gt;

&lt;p&gt;شغّل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;التفسير:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt;: المسار صحيح والطلب نجح.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;400&lt;/code&gt;: المسار موجود لكن الطلب غير مكتمل أو غير مطابق.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt;: غالبًا لديك مشكلة &lt;code&gt;/v1&lt;/code&gt; مكررة أو مسار خاطئ.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  السبب 2: استخدام متغير المصادقة الخاطئ
&lt;/h2&gt;

&lt;p&gt;Claude Code يدعم طريقتين للمصادقة:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;المتغير&lt;/th&gt;
&lt;th&gt;يرسل كـ&lt;/th&gt;
&lt;th&gt;الاستخدام&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;رأس &lt;code&gt;x-api-key&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;بوابات تتوقع مفتاح API بأسلوب Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;رأس &lt;code&gt;Authorization: Bearer&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;LiteLLM وOpenRouter وبوابات OAuth-like&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  OpenRouter
&lt;/h3&gt;

&lt;p&gt;OpenRouter يتوقع Bearer token، لذلك استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-or-your-openrouter-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;لا تستخدم &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; هنا إلا إذا كانت بوابتك تدعمه صراحة.&lt;/p&gt;

&lt;h3&gt;
  
  
  LiteLLM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-litellm-your-virtual-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://your-litellm-server:4000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  vLLM أو بوابة تتوقع &lt;code&gt;x-api-key&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-key-here"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://your-vllm-server"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا لم تكن متأكدًا، راجع وثائق البوابة لمعرفة الرأس المطلوب.&lt;/p&gt;

&lt;h2&gt;
  
  
  السبب 3: ملف &lt;code&gt;settings.json&lt;/code&gt; غير صالح
&lt;/h2&gt;

&lt;p&gt;إذا كنت تضع التهيئة في:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;فأي خطأ JSON يمنع Claude Code من قراءة الإعدادات.&lt;/p&gt;

&lt;h3&gt;
  
  
  خطأ: فاصلة زائدة
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-your-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  خطأ: علامات اقتباس ذكية
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;“ANTHROPIC_BASE_URL”:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“https://openrouter.ai/api”&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  صحيح
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-your-openrouter-key"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  تحقق من الملف
&lt;/h3&gt;

&lt;p&gt;باستخدام Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Valid JSON"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أو باستخدام &lt;code&gt;jq&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nb"&gt;.&lt;/span&gt; ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا فشل التحليل، أصلح JSON قبل تشغيل Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  السبب 4: تثبيت جديد لم يكمل الإعداد الأولي
&lt;/h2&gt;

&lt;p&gt;في التثبيتات الجديدة، يتحقق Claude Code من:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ويبحث عن:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"hasCompletedOnboarding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا لم تكن موجودة، قد يتجاهل إعدادات الطرف الثالث ويحاول استخدام تدفق المصادقة الافتراضي.&lt;/p&gt;

&lt;h3&gt;
  
  
  تحقق من الحالة
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.claude.json | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;hasCompletedOnboarding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  الإصلاح
&lt;/h3&gt;

&lt;p&gt;أضف أو عدّل الملف:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasCompletedOnboarding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"primaryApiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-placeholder"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;primaryApiKey&lt;/code&gt; هنا قيمة مؤقتة لتجاوز فحص التنسيق. سيتم تجاوزها بتهيئة المزود الخارجي.&lt;/p&gt;

&lt;p&gt;بعد ذلك أعد تشغيل Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  السبب 5: البوابة لا تمرر الرؤوس المطلوبة
&lt;/h2&gt;

&lt;p&gt;Claude Code يرسل رؤوسًا إضافية أثناء التحقق من التهيئة، ومنها:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كانت بوابتك أو nginx أو proxy يحذف هذه الرؤوس، قد يفشل التحقق.&lt;/p&gt;

&lt;h3&gt;
  
  
  إعداد nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/v1/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-beta&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-version&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_version&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Claude-Code-Session-Id&lt;/span&gt; &lt;span class="nv"&gt;$http_x_claude_code_session_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في LiteLLM، هذا مدعوم افتراضيًا في الإصدارات الحديثة مثل &lt;code&gt;v1.82.9+&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  حل بديل
&lt;/h3&gt;

&lt;p&gt;إذا لم تستطع تمرير رأس &lt;code&gt;anthropic-beta&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يعطل بعض الميزات التجريبية، لكنه يسمح بتشغيل حلقة الوكيل الأساسية.&lt;/p&gt;

&lt;h2&gt;
  
  
  السبب 6: سياسة المؤسسة تمنع التهيئة
&lt;/h2&gt;

&lt;p&gt;إذا كنت ضمن خطة Claude Teams أو Enterprise، قد تكون هناك إعدادات مُدارة تتجاوز إعداداتك المحلية.&lt;/p&gt;

&lt;p&gt;تحقق من وجودها:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; ~/.claude/managed-settings.json 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"تم العثور على إعدادات مُدارة"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أو من داخل Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كانت الإعدادات المُدارة نشطة، اطلب من المسؤول أحد الخيارات التالية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;السماح بنطاق بوابتك في قائمة عناوين URL الأساسية.&lt;/li&gt;
&lt;li&gt;إضافة نماذج البوابة إلى &lt;code&gt;availableModels&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;إعفاؤك من قيود &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;في macOS، قد توجد الإعدادات المُدارة في:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Library/Application Support/ClaudeCode/managed-settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  تهيئات جاهزة للعمل
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code + OpenRouter + DeepSeek V4 Pro
&lt;/h3&gt;

&lt;p&gt;ضع التالي في:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-your-openrouter-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_OPUS_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_HAIKU_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;تجاوز أسماء النماذج مهم لأن Claude Code قد يستمر في طلب:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude-sonnet-4-6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;حتى بعد تغيير &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;ملاحظة: لا ينفذ OpenRouter كامل مواصفة تدفق Anthropic لاستدعاءات الأدوات في كل الحالات. قد تعمل الحلقة الأساسية، لكن بعض سلاسل الأدوات المعقدة قد تواجه مشكلات. تابع &lt;a href="https://openrouter.ai/docs/guides/coding-agents/claude-code-integration" rel="noopener noreferrer"&gt;حالة توافق OpenRouter&lt;/a&gt; للتحديثات.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code + LiteLLM
&lt;/h3&gt;

&lt;p&gt;مثال &lt;code&gt;config.yaml&lt;/code&gt; لـ LiteLLM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-deepseek-key"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-your-deepseek-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم في &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:4000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-litellm-your-key"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا الشكل، يرسل Claude Code اسم نموذج Claude، ويقوم LiteLLM بتحويله إلى النموذج الفعلي.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code + vLLM محلي
&lt;/h3&gt;

&lt;p&gt;ابدأ vLLM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; vllm.entrypoints.openai.api_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model&lt;/span&gt; deepseek-ai/DeepSeek-V3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-key&lt;/span&gt; local-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم اضبط Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"local-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-ai/DeepSeek-V3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;راجع أيضًا توثيق &lt;a href="https://docs.vllm.ai/en/stable/serving/integrations/claude_code/" rel="noopener noreferrer"&gt;vLLM مع Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  تصحيح الخطأ عمليًا
&lt;/h2&gt;

&lt;p&gt;شغّل Claude Code بوضع التصحيح:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ابحث عن:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Sending request to:&lt;/code&gt; لمعرفة URL النهائي.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Response status:&lt;/code&gt; لمعرفة كود HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enterprise config error:&lt;/code&gt; لمعرفة سبب فشل التحقق.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;اختبر الطلب يدويًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"anthropic-version: 2023-06-01"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"anthropic-beta: max-tokens-3-5-sonnet-2024-07-15"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "claude-sonnet-4-6",
    "max_tokens": 10,
    "messages": [{"role": "user", "content": "hi"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا حصلت على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;401&lt;/code&gt; أو &lt;code&gt;403&lt;/code&gt;: مشكلة مصادقة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt;: مشكلة URL.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;422&lt;/code&gt;: مشكلة تنسيق الطلب أو النموذج.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt;: البوابة تعمل، وراجع اختلافات رؤوس Claude Code في وضع &lt;code&gt;--debug&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  اختبار واجهات API باستخدام Apidog
&lt;/h2&gt;

&lt;p&gt;عند تصحيح تكاملات مزودي الطرف الثالث، يساعدك &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; على فحص الطلبات والاستجابات التي تمر عبر بوابة LLM الخاصة بك.&lt;/p&gt;

&lt;p&gt;أنشئ مجموعة لنقطة النهاية:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم أضف هذه الرؤوس كمتغيرات على مستوى المجموعة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anthropic-version
anthropic-beta
Authorization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا يمكنك اختبار بوابات مختلفة بتغيير المتغيرات بدل تعديل كل طلب يدويًا.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-30.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;هذا مفيد خصوصًا عند التحقق من تمرير الرؤوس التي قد تسبب &lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  إعدادات Claude Code مفيدة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  تعطيل اعتماديات رؤوس beta
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدمه عندما لا تمرر بوابتك الرؤوس المخصصة. ستفقد بعض الميزات التجريبية، لكن الحلقة الأساسية ستعمل.&lt;/p&gt;

&lt;h3&gt;
  
  
  اكتشاف النماذج من البوابة
&lt;/h3&gt;

&lt;p&gt;من Claude Code &lt;code&gt;v2.1.129&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يستعلم Claude Code عن:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/models
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ويضيف النماذج المكتشفة إلى منتقي &lt;code&gt;/model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;ملاحظة: يضيف عادةً النماذج التي تبدأ بـ &lt;code&gt;claude&lt;/code&gt; أو &lt;code&gt;anthropic&lt;/code&gt;. لنماذج مثل DeepSeek، استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  إضافة نموذج مخصص إلى المنتقي
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DeepSeek V4 Pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"أرخص بـ 17 مرة من Claude Opus"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;سيظهر النموذج في منتقي:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  أدلة ذات صلة
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية كتابة ملفات AGENTS.md لفرق تطوير API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/ruflo-multi-agent-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ruflo: تنسيق متعدد الوكلاء لـ Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;احصل على واجهة برمجة تطبيقات Claude مجانية غير محدودة عبر Puter.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أفضل نماذج LLM المحلية لعام 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل استخدام مزود طرف ثالث مع Claude Code يخالف شروط Anthropic؟
&lt;/h3&gt;

&lt;p&gt;لا. نمط &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; مدعوم لتوجيه الطلبات عبر Bedrock وVertex AI وFoundry والبوابات المخصصة. ما تم حظره هو أدوات كانت تزيف معرف عميل Claude Code للوصول إلى تسعير اشتراكات Anthropic.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل تعمل حلقة وكيل Claude Code مع DeepSeek V4 Pro؟
&lt;/h3&gt;

&lt;p&gt;تعمل الحلقة الأساسية مثل تحرير الملفات، أوامر الشل، والمهام متعددة الخطوات. القيود الرئيسية عبر مزودي الطرف الثالث هي أدوات MCP ومدخلات الصور/الرؤية.&lt;/p&gt;

&lt;h3&gt;
  
  
  لماذا تظهر عبارة &lt;code&gt;enterprise config&lt;/code&gt; وأنا لست ضمن خطة مؤسسة؟
&lt;/h3&gt;

&lt;p&gt;هذه تسمية داخلية في Claude Code لأي تهيئة مزود خارجي. لا تعني أنك تحتاج خطة Enterprise.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكنني التبديل بين Anthropic ومزود طرف ثالث داخل نفس الجلسة؟
&lt;/h3&gt;

&lt;p&gt;لا. تتم قراءة &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; عند بدء التشغيل. للتبديل، أغلق Claude Code، عدّل البيئة أو الإعدادات، ثم ابدأ جلسة جديدة.&lt;/p&gt;

&lt;p&gt;أداة &lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt; تغلف هذا عبر خيارات مثل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--backend&lt;/span&gt; ds
&lt;span class="nt"&gt;--backend&lt;/span&gt; anthropic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  بوابتي خلف proxy. ماذا أفعل؟
&lt;/h3&gt;

&lt;p&gt;اضبط:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://your-proxy:8080"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://your-internal-gateway"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كان proxy يعترض TLS، أضف شهادة CA:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/corporate-ca-bundle.pem"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  اختبار &lt;code&gt;curl&lt;/code&gt; يعمل لكن Claude Code يفشل. لماذا؟
&lt;/h3&gt;

&lt;p&gt;Claude Code يرسل طلب تحقق إضافيًا قد يتضمن رؤوسًا أو تنسيقًا مختلفًا. استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وقارن الطلب الفعلي مع اختبار &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt; هو خطأ تحقق من التهيئة. عالجه بهذا الترتيب:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;احذف &lt;code&gt;/v1&lt;/code&gt; من &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; أو &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; حسب نوع المصادقة.&lt;/li&gt;
&lt;li&gt;تحقق من صحة &lt;code&gt;~/.claude/settings.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;أكمل onboarding في &lt;code&gt;~/.claude.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;تأكد أن البوابة تمرر رؤوس Claude Code.&lt;/li&gt;
&lt;li&gt;راجع سياسات المؤسسة إن وجدت.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;بعد ضبط هذه النقاط، يمكن تشغيل Claude Code عبر OpenRouter أو LiteLLM أو vLLM مع نموذج مثل DeepSeek V4 Pro، مع الانتباه إلى القيود المتعلقة بـ MCP والرؤية.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>الحصول على Gemini API مجاني وغير محدود</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Sat, 09 May 2026 07:02:50 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/lhswl-l-gemini-api-mjny-wgyr-mhdwd-1g2p</link>
      <guid>https://dev.to/yusuf_khalidd/lhswl-l-gemini-api-mjny-wgyr-mhdwd-1g2p</guid>
      <description>&lt;p&gt;توفّر عائلة Gemini من Google نماذج قوية لتطبيقات الذكاء الاصطناعي، لكن التكلفة قد تتزايد بسرعة عندما يبدأ آلاف المستخدمين في استدعاء نقطة النهاية الخاصة بك. يغيّر Puter.js هذا النمط: يمكنك استدعاء نماذج Gemini وGemma من المتصفح بدون مفتاح Google API، وبدون مشروع Google Cloud، وبدون خادم وسيط. يتحمّل المستخدم النهائي الاستخدام عبر حساب Puter الخاص به، بينما تبقى واجهة المطوّر مجانية وغير محدودة.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  الخلاصة
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; يمنحك وصولًا مجانيًا وغير محدود من جهة المطوّر إلى كتالوج Gemini وGemma بدون مفتاح Google API.&lt;/li&gt;
&lt;li&gt;النماذج المدعومة تشمل: &lt;code&gt;2.5 Pro&lt;/code&gt; و&lt;code&gt;2.5 Flash&lt;/code&gt; و&lt;code&gt;2.5 Flash Lite&lt;/code&gt; و&lt;code&gt;2.0 Flash&lt;/code&gt; و&lt;code&gt;2.0 Flash Lite&lt;/code&gt; و&lt;code&gt;3 Flash Preview&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;عائلة Gemma المدعومة تشمل: &lt;code&gt;Gemma 2&lt;/code&gt; و&lt;code&gt;Gemma 3&lt;/code&gt; و&lt;code&gt;Gemma 4&lt;/code&gt; بأحجام متعددة.&lt;/li&gt;
&lt;li&gt;تحتاج إلى وسم &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; واحد واستدعاء دالة واحدة لتشغيل Gemini داخل المتصفح.&lt;/li&gt;
&lt;li&gt;يدعم Puter.js البث المباشر، إدخال الصور، المحادثات متعددة الأدوار، وضبط درجة الحرارة.&lt;/li&gt;
&lt;li&gt;استخدم &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; لمقارنة التكاملات وتخطيط الانتقال إلى واجهة Gemini الرسمية عند الحاجة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  كيف يعمل نموذج "مجاني وغير محدود"
&lt;/h2&gt;

&lt;p&gt;بدلًا من أن تحتفظ أنت بمفتاح Google AI Studio وتدفع تكلفة كل رمز مميز، يسجّل المستخدم الدخول إلى Puter، ثم تُخصم تكلفة الاستدعاء من حسابه. يحصل المستخدمون الجدد على رصيد بداية، ويمكنهم إعادة الشحن إذا احتاجوا إلى استخدام إضافي.&lt;/p&gt;

&lt;p&gt;بالنسبة لك كمطوّر:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;لا تحتاج إلى مشروع Google Cloud.&lt;/li&gt;
&lt;li&gt;لا تحتاج إلى إدارة مفاتيح API أو متغيرات بيئة.&lt;/li&gt;
&lt;li&gt;لا توجد علاقة فوترة مباشرة مع Google.&lt;/li&gt;
&lt;li&gt;لا تحتاج إلى خادم وسيط فقط لإخفاء المفتاح.&lt;/li&gt;
&lt;li&gt;يتوسع الاستخدام مع عدد المستخدمين بدلًا من أن يتراكم كله على حسابك.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;المفاضلة المهمة: Puter.js موجّه أولًا للمتصفح. إذا كنت تحتاج إلى مهام خلفية مثل &lt;code&gt;cron jobs&lt;/code&gt; أو &lt;code&gt;webhooks&lt;/code&gt; أو معالجة دفعية بدون جلسة مستخدم، فاستخدم واجهة Gemini الرسمية.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 1: تثبيت Puter.js
&lt;/h2&gt;

&lt;p&gt;لصفحة HTML بسيطة، أضف سكريبت CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا يكفي لتشغيل Puter.js في المتصفح.&lt;/p&gt;

&lt;p&gt;إذا كنت تستخدم تطبيقًا مبنيًا بأداة تجميع مثل Vite أو Next.js أو Webpack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم استورده في الكود:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 2: اختيار نموذج Gemini أو Gemma
&lt;/h2&gt;

&lt;p&gt;اختر النموذج بناءً على نوع المهمة:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;معرف النموذج&lt;/th&gt;
&lt;th&gt;متى تستخدمه&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;للاستدلال العميق، التحليل المعقد، ومهام السياق الطويل&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الخيار الافتراضي لمعظم تطبيقات الدردشة والأسئلة والأجوبة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;مهام التصنيف والوسم عالية الحجم حيث تكون السرعة مهمة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.0-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;خيار مستقر لسلوك معروف ومتوقع&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-3-flash-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;تجربة أحدث إصدار معاينة من Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-3-27b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;نموذج Gemma مفتوح ومضبوط للتعليمات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-4-31b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;نموذج Gemma أكبر عندما تحتاج إلى جودة أعلى ضمن عائلة Gemma&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;للبداية، استخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;google/gemini-2.5-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم انتقل إلى &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt; فقط عندما تحتاج إلى تفكير أعمق أو تحليل أكثر تعقيدًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 3: أول استدعاء إلى Gemini من المتصفح
&lt;/h2&gt;

&lt;p&gt;هذا مثال كامل قابل للتشغيل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;اشرح تعلم الآلة في ثلاث جمل&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;حدث خطأ أثناء استدعاء النموذج.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;افتح الملف في المتصفح. عند أول استخدام، يتعامل Puter مع تسجيل دخول المستخدم أو إنشاء حساب. لا تحتاج إلى مفتاح API أو خادم خلفي.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 4: بث الاستجابة في واجهة الدردشة
&lt;/h2&gt;

&lt;p&gt;في واجهات الدردشة، لا تنتظر اكتمال النص بالكامل. استخدم &lt;code&gt;stream: true&lt;/code&gt; لعرض الاستجابة تدريجيًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;اشرح عملية البناء الضوئي بالتفصيل&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;outputDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;كل &lt;code&gt;part.text&lt;/code&gt; يمثل جزءًا من الاستجابة. أضفه مباشرة إلى واجهة المستخدم للحصول على تجربة شبيهة بتطبيقات الدردشة الحديثة.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 5: استخدام Gemini مع الصور
&lt;/h2&gt;

&lt;p&gt;يدعم Gemini الإدخال متعدد الوسائط. مرّر رابط الصورة كوسيط ثانٍ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ماذا ترى في هذه الصورة؟ صف الألوان والعناصر والمزاج العام.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;أمثلة عملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;توليد النص البديل للصور.&lt;/li&gt;
&lt;li&gt;تحليل لقطات الشاشة.&lt;/li&gt;
&lt;li&gt;استخراج معلومات من صور المنتجات.&lt;/li&gt;
&lt;li&gt;مراجعة واجهات المستخدم بصريًا.&lt;/li&gt;
&lt;li&gt;دعم أدوات الوصول.&lt;/li&gt;
&lt;li&gt;التعرف الضوئي على الحروف OCR في بعض الحالات.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;جودة رؤية Gemini قوية في الصور الطبيعية والرسوم البيانية، لكن لقطات الشاشة النصية الكثيفة قد تحتاج إلى اختبار ومقارنة حسب حالتك.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 6: ضبط درجة الحرارة
&lt;/h2&gt;

&lt;p&gt;استخدم &lt;code&gt;temperature&lt;/code&gt; للتحكم في عشوائية المخرجات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;اكتب قصة قصيرة إبداعية عن روبوت يعمل طاهيًا&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;قاعدة عملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0.0&lt;/code&gt; إلى &lt;code&gt;0.3&lt;/code&gt;: مخرجات أكثر ثباتًا، مناسبة للتصنيف والبيانات المنظمة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.4&lt;/code&gt; إلى &lt;code&gt;0.7&lt;/code&gt;: توازن مناسب للدردشة العامة.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.8&lt;/code&gt; إلى &lt;code&gt;1.0&lt;/code&gt;: مخرجات أكثر تنوعًا، مناسبة للكتابة الإبداعية.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال لمهمة تصنيف:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;صنّف هذه الرسالة كـ: دعم، مبيعات، أو شكوى. الرسالة: لا أستطيع تسجيل الدخول.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash-lite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 7: بناء محادثة متعددة الأدوار
&lt;/h2&gt;

&lt;p&gt;مرّر مصفوفة رسائل بدلًا من نص واحد:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;أنا أبني تطبيق Next.js مع PostgreSQL.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;فهمت. ما الجزء الذي تحتاج مساعدة فيه؟&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;كيف أنظم ملفات migrations؟&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للاستخدام داخل تطبيق دردشة، احتفظ بالحالة محليًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userText&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assistantReply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assistantReply&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;assistantReply&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بهذا الشكل يحصل النموذج على سياق المحادثة بالكامل في كل استدعاء.&lt;/p&gt;

&lt;h2&gt;
  
  
  مقارنة Gemini بنماذج أخرى على نفس المطالبة
&lt;/h2&gt;

&lt;p&gt;يعرض Puter عدة نماذج عبر واجهة واحدة. يمكنك اختبار نفس المطالبة على أكثر من نموذج:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactor this React component to use hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم هذا النمط لتقييم:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;زمن الاستجابة.&lt;/li&gt;
&lt;li&gt;جودة الإجابة.&lt;/li&gt;
&lt;li&gt;الاتساق بين المحاولات.&lt;/li&gt;
&lt;li&gt;ملاءمة النموذج للمهمة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لا تعتمد على تجربة واحدة فقط. اختبر مجموعة مطالبات تمثل استخدامك الحقيقي.&lt;/p&gt;

&lt;h2&gt;
  
  
  ماذا يدعم Puter.js مع Gemini
&lt;/h2&gt;

&lt;p&gt;تحصل عادةً على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نماذج Gemini 2.5 و2.0 و3 Flash Preview و2.5 Pro.&lt;/li&gt;
&lt;li&gt;نماذج Gemma المفتوحة.&lt;/li&gt;
&lt;li&gt;المحادثات متعددة الأدوار.&lt;/li&gt;
&lt;li&gt;الاستجابات المتدفقة.&lt;/li&gt;
&lt;li&gt;إدخال الصور عبر عنوان URL.&lt;/li&gt;
&lt;li&gt;إعدادات مثل &lt;code&gt;temperature&lt;/code&gt; و&lt;code&gt;max_tokens&lt;/code&gt; ومطالبات النظام حسب الدعم المتاح.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;وقد لا تحصل على كل ميزات Gemini الرسمية، حسب إصدار Puter والدعم الحالي، مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;استدعاء الدوال الأصلي.&lt;/li&gt;
&lt;li&gt;أدوات تنفيذ الأكواد.&lt;/li&gt;
&lt;li&gt;ترسيخ بحث Google.&lt;/li&gt;
&lt;li&gt;الوصول الكامل إلى نافذة سياق Gemini القصوى.&lt;/li&gt;
&lt;li&gt;تشغيل خلفي بدون جلسة مستخدم.&lt;/li&gt;
&lt;li&gt;رؤية مباشرة لحدود معدل Google.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كنت تبني وكيلًا معقدًا يحتاج إلى أدوات تنفيذ، ترسيخ بحث، أو تحكم كامل في البنية الخلفية، فواجهة Google AI Studio الرسمية قد تكون أنسب. أما لتطبيقات الدردشة، الأسئلة والأجوبة، توليد المحتوى، والنماذج الأولية داخل المتصفح، فـ Puter.js يكفي غالبًا.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى تستخدم Puter بدل واجهة Gemini الرسمية
&lt;/h2&gt;

&lt;p&gt;استخدم Puter عندما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تبني تطبيقًا عامًا مجانيًا وتريد تجنب مخاطر الفوترة.&lt;/li&gt;
&lt;li&gt;تعمل على نموذج أولي أو مشروع هاكاثون.&lt;/li&gt;
&lt;li&gt;تريد تشغيل Gemini داخل موقع ثابت.&lt;/li&gt;
&lt;li&gt;لا تريد إعداد Google Cloud.&lt;/li&gt;
&lt;li&gt;يمكن للمستخدمين تسجيل الدخول إلى Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استخدم واجهة Gemini الرسمية عندما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تحتاج إلى استدعاءات من الخادم.&lt;/li&gt;
&lt;li&gt;لديك مهام مجدولة أو معالجة دفعية.&lt;/li&gt;
&lt;li&gt;تحتاج إلى &lt;code&gt;webhooks&lt;/code&gt; أو تكاملات خلفية.&lt;/li&gt;
&lt;li&gt;تحتاج إلى تنفيذ أكواد أو ترسيخ بحث.&lt;/li&gt;
&lt;li&gt;تحتاج إلى متطلبات امتثال أو علاقة مباشرة مع Google.&lt;/li&gt;
&lt;li&gt;لا تريد إضافة خطوة تسجيل دخول Puter للمستخدمين.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لشرح أوسع حول Gemini 3 Flash، راجع: &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام واجهة برمجة تطبيقات Gemini 3 Flash Preview&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  اختبار التكامل باستخدام Apidog
&lt;/h2&gt;

&lt;p&gt;استدعاءات Puter تحدث داخل المتصفح، لذلك لا تختبرها بنفس طريقة اختبار REST API خلفية. النمط العملي هو:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ صفحة HTML صغيرة تحتوي على Puter.js.&lt;/li&gt;
&lt;li&gt;اجعل المطالبة قابلة للتمرير عبر query parameter.&lt;/li&gt;
&lt;li&gt;استخدم الصفحة لاختبار تجربة المستخدم والتدفق داخل المتصفح.&lt;/li&gt;
&lt;li&gt;استخدم Apidog لاختبار واجهة Gemini الرسمية إذا قررت الانتقال إلى الخادم.&lt;/li&gt;
&lt;li&gt;احتفظ ببيئتين منفصلتين: واحدة للنموذج الأولي عبر Puter، وأخرى للإنتاج عبر Gemini API.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال صفحة اختبار بسيطة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;جارٍ التحميل...&lt;span class="nt"&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;اكتب ملخصًا قصيرًا عن REST APIs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم شغّلها مثلًا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5173/?prompt=اشرح%20JSON%20Schema
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;قم بـ &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;تنزيل Apidog&lt;/a&gt; وأنشئ بيئتين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: عنوان الصفحة المحلية التي تستضيف Puter.js.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemini-prod&lt;/code&gt;: &lt;code&gt;https://generativelanguage.googleapis.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لأنماط اختبار API الأوسع، راجع: &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أداة اختبار API لمهندسي ضمان الجودة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  مسارات LLM مجانية أخرى عبر Puter
&lt;/h2&gt;

&lt;p&gt;نفس نموذج الدفع من جهة المستخدم ينطبق على مزودين آخرين عبر Puter. يمكنك تغيير قيمة &lt;code&gt;model&lt;/code&gt; فقط لتجربة نماذج مختلفة.&lt;/p&gt;

&lt;p&gt;روابط مفيدة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;احصل على واجهة برمجة تطبيقات Claude مجانية وغير محدودة&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;احصل على واجهة برمجة تطبيقات GPT-5.5 مجانية وغير محدودة&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام Grok 4.3 مجانًا&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-deepseek-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;احصل على واجهة برمجة تطبيقات DeepSeek مجانية وغير محدودة&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال تبديل النموذج:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;لخّص هذا النص في خمس نقاط: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;غيّرها إلى نموذج آخر عند المقارنة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;لخّص هذا النص في خمس نقاط: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;هل الاستخدام غير محدود فعلًا؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
غير محدود من جهة المطوّر. المستخدم النهائي يستخدم رصيد حسابه على Puter، والحسابات الجديدة تحصل على رصيد بداية.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل أحتاج إلى حساب Google أو مشروع Google Cloud؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
لا. Puter يتعامل مع الاستدعاء الأساسي، ولن تحتاج إلى مفتاح Google API داخل تطبيقك.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يمكن استخدامه في الإنتاج؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
نعم لتطبيقات الويب المعتمدة على المتصفح، بشرط أن تكون خطوة تسجيل دخول Puter مناسبة لتجربة المستخدم لديك.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يعمل Gemini عبر Puter مثل واجهة Gemini الرسمية؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
النموذج الأساسي هو Gemini، لكن طبقة الاستدعاء تمر عبر Puter. قد تختلف بعض الميزات أو الحدود حسب الدعم المتاح.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ماذا عن سياق Gemini الكبير جدًا؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
إذا كنت تحتاج إلى الوصول الكامل لسياق طويل جدًا، فاستخدم واجهة Google AI Studio الرسمية. معظم تطبيقات الدردشة والأسئلة والأجوبة لا تحتاج إلى هذا الحد.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يمكن استخدامه في بوت Discord أو خدمة خلفية؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ليس بسلاسة. Puter.js يفترض وجود متصفح وجلسة مستخدم. للخدمات الخلفية، استخدم Gemini API الرسمية.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ما النموذج الافتراضي المقترح؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ابدأ بـ &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;. استخدم &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt; للمهام الأصعب، و&lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt; للتصنيف عالي الحجم.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يدعم Puter توليد الصور عبر Imagen؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
حسب المحتوى الأصلي، Puter يعرض توليد الصور عبر &lt;code&gt;gpt-image-2&lt;/code&gt; ومتغيرات DALL-E من OpenAI، وليس Imagen. راجع &lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;احصل على واجهة برمجة تطبيقات GPT-5.5 مجانية وغير محدودة&lt;/a&gt; لمسار توليد الصور.&lt;/p&gt;

&lt;h2&gt;
  
  
  خاتمة
&lt;/h2&gt;

&lt;p&gt;إذا كنت تريد تشغيل Gemini داخل تطبيق ويب بدون مفاتيح API أو Google Cloud أو خادم وسيط، فإن Puter.js هو أسرع مسار عملي. أضف السكريبت، اختر &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;، ثم ابدأ بإرسال المطالبات من المتصفح.&lt;/p&gt;

&lt;p&gt;استخدم واجهة Gemini الرسمية عندما تحتاج إلى تشغيل خلفي، ضبط دقيق، أدوات تنفيذ أكواد، أو تحكم كامل في السياق والامتثال. أما للنماذج الأولية، تطبيقات الهاكاثون، المواقع الثابتة، وتطبيقات الدردشة العامة، فـ Puter.js يقلل وقت الإعداد بشكل كبير.&lt;/p&gt;

&lt;p&gt;قم ببناء الطلبات ومقارنتها في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، ثم اختر المسار الأنسب بين Puter والنشر الرسمي عبر Gemini API.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>الحصول على API GPT-5.5 مجاني وغير محدود وجميع نماذج OpenAI</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Sat, 09 May 2026 02:39:38 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/lhswl-l-api-gpt-55-mjny-wgyr-mhdwd-wjmy-nmdhj-openai-9mp</link>
      <guid>https://dev.to/yusuf_khalidd/lhswl-l-api-gpt-55-mjny-wgyr-mhdwd-wjmy-nmdhj-openai-9mp</guid>
      <description>&lt;p&gt;يأتي GPT-5.5 من OpenAI مع واجهة برمجة تطبيقات مدفوعة: 5 دولارات لكل مليون رمز إدخال، و30 دولارًا لكل مليون رمز إخراج. إذا كنت تبني مشروعًا جانبيًا، نموذجًا أوليًا لهاكاثون، أو تطبيقًا عامًا مجانيًا، فقد تصبح الفاتورة عائقًا قبل الإطلاق. الحل العملي هنا هو Puter.js: مكتبة تعمل من المتصفح وتتيح الوصول إلى كتالوج OpenAI مثل GPT-5.5 وGPT-5.5 Pro ونماذج GPT-5.x وGPT-Image-2 وDALL-E وOpenAI TTS بدون مفتاح OpenAI، مع تحميل تكلفة الاستخدام على المستخدم النهائي عبر حساب Puter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  ملخص سريع
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; يمنح المطورين وصولًا إلى نماذج OpenAI من المتصفح بدون مفتاح API أو خادم.&lt;/li&gt;
&lt;li&gt;النماذج النصية تشمل: &lt;code&gt;gpt-5.5&lt;/code&gt;, &lt;code&gt;gpt-5.5-pro&lt;/code&gt;, &lt;code&gt;gpt-5.4&lt;/code&gt;, &lt;code&gt;gpt-5&lt;/code&gt;, &lt;code&gt;gpt-5-mini&lt;/code&gt;, &lt;code&gt;o1&lt;/code&gt;, &lt;code&gt;o3&lt;/code&gt;, &lt;code&gt;gpt-4.1&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;، ومتغيرات الدردشة والكودكس.&lt;/li&gt;
&lt;li&gt;الصور: &lt;code&gt;gpt-image-2&lt;/code&gt;, &lt;code&gt;gpt-image-1.5&lt;/code&gt;, &lt;code&gt;dall-e-3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;تحويل النص إلى كلام: &lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;, &lt;code&gt;tts-1&lt;/code&gt;, &lt;code&gt;tts-1-hd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;التثبيت يمكن أن يكون عبر وسم &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; واحد.&lt;/li&gt;
&lt;li&gt;الميزات المدعومة تشمل البث، الرؤية، استدعاء الدوال، توليد الصور، وتحويل النص إلى كلام.&lt;/li&gt;
&lt;li&gt;يدفع المستخدم النهائي من حساب Puter الخاص به، وليس حساب المطور.&lt;/li&gt;
&lt;li&gt;استخدم &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; لمقارنة نفس الـ prompt بين Puter وواجهة OpenAI API الرسمية عند التخطيط للترحيل.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  كيف يعمل نموذج “مجاني غير محدود”
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.puter.com/tutorials/free-unlimited-openai-api/" rel="noopener noreferrer"&gt;Puter.js&lt;/a&gt; يغيّر طريقة الفوترة. بدلًا من أن تضع مفتاح OpenAI داخل مشروعك وتدفع تكلفة كل طلب، يسجل المستخدم الدخول إلى Puter، وتُخصم تكلفة الطلب من رصيده هو.&lt;/p&gt;

&lt;p&gt;هذا يعني عمليًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;لا تحتاج إلى حساب OpenAI داخل المشروع.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;لا يوجد مفتاح API داخل الواجهة الأمامية أو المستودع.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;لا تتحمل أنت فاتورة الاستخدام.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;كل مستخدم يعمل من خلال حساب Puter الخاص به.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;المقايضة المهمة: Puter مناسب أساسًا لتطبيقات المتصفح. إذا كنت تحتاج إلى تنفيذ الطلبات من خادم Node.js، أو jobs، أو webhooks، فواجهة OpenAI API الرسمية تبقى الخيار الصحيح.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 1: التثبيت
&lt;/h2&gt;

&lt;p&gt;أبسط طريقة هي استخدام CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال HTML كامل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كنت تستخدم bundler في تطبيق حديث:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم CDN للنماذج الأولية والمواقع الثابتة وإضافات المتصفح. استخدم نسخة NPM إذا كنت تريد تكاملًا أفضل مع TypeScript وبيئة build.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 2: اختر النموذج المناسب
&lt;/h2&gt;

&lt;p&gt;Puter يعرض نماذج GPT-5.x إلى جانب النماذج الأقدم. استخدم هذا الجدول كبداية:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;معرف النموذج&lt;/th&gt;
&lt;th&gt;متى تستخدمه&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الاستدلال العميق، وكلاء البرمجة، التحليل المعقد&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;النموذج الافتراضي لمعظم مهام الدردشة والاستدلال اليومي&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-nano&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;مهام التصنيف السريعة والرخيصة بكميات كبيرة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-mini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;واجهات الدردشة التي تحتاج توازنًا بين السرعة والجودة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.3-codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;مهام البرمجة والكود&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;سلاسل الاستدلال الطويلة والمعقدة&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o1-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;التخطيط متعدد الخطوات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gpt-4.1&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-4o-mini&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;خط أساس مستقر ومفهوم جيدًا&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;لنماذج الصور:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-2&lt;/code&gt;: الأحدث لتوليد الصور.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-1.5&lt;/code&gt;, &lt;code&gt;gpt-image-1&lt;/code&gt;, &lt;code&gt;dall-e-3&lt;/code&gt;, &lt;code&gt;dall-e-2&lt;/code&gt;: خيارات أقدم ومستقرة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لنماذج تحويل النص إلى كلام:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;: خيار حديث وطبيعي.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tts-1&lt;/code&gt;, &lt;code&gt;tts-1-hd&lt;/code&gt;: خيارات TTS كلاسيكية بزمن استجابة أقل.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 3: نفّذ أول طلب إلى GPT-5.5
&lt;/h2&gt;

&lt;p&gt;هذا هو الحد الأدنى لاستدعاء الدردشة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain WebSockets in three sentences&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;افتح الملف في المتصفح. سيعالج Puter الطلب، ويطلب من المستخدم تسجيل الدخول أو إنشاء حساب Puter عند الحاجة، ثم يطبع الرد في الصفحة.&lt;/p&gt;

&lt;p&gt;لا يوجد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;مفتاح API&lt;/li&gt;
&lt;li&gt;متغيرات بيئة&lt;/li&gt;
&lt;li&gt;خادم وسيط&lt;/li&gt;
&lt;li&gt;إعداد فوترة من جانبك&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 4: بث الاستجابة Streaming
&lt;/h2&gt;

&lt;p&gt;لواجهات الدردشة، استخدم &lt;code&gt;stream: true&lt;/code&gt; حتى يرى المستخدم الرد أثناء توليده:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain the theory of relativity in detail&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في تطبيق حقيقي، بدلًا من &lt;code&gt;puter.print&lt;/code&gt;، أضف &lt;code&gt;part.text&lt;/code&gt; إلى عنصر الرسالة داخل واجهة المستخدم:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messageEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#assistant-message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messageEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 5: إدخال الصور Vision
&lt;/h2&gt;

&lt;p&gt;يمكنك تمرير رابط صورة كوسيط ثانٍ، ثم طرح سؤال متعلق بها:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What do you see in this image? Describe colors, objects, and mood.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;حالات الاستخدام العملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;توليد &lt;code&gt;alt text&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;تحليل لقطات الشاشة&lt;/li&gt;
&lt;li&gt;OCR مبسط&lt;/li&gt;
&lt;li&gt;أسئلة وأجوبة حول الصور&lt;/li&gt;
&lt;li&gt;أدوات وصول لذوي الاحتياجات الخاصة&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 6: توليد الصور
&lt;/h2&gt;

&lt;p&gt;توليد الصور يتم عبر &lt;code&gt;txt2img&lt;/code&gt;. الدالة تعيد عنصر &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; جاهزًا للإضافة إلى الصفحة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A futuristic cityscape at night, cinematic, neon, rain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال أكثر عملية مع زر:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"prompt"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"اكتب وصف الصورة"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"generate"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;توليد&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"result"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#generate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;يدفع المستخدم تكلفة توليد الصورة من رصيده في Puter، وليس من حسابك.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 7: تحويل النص إلى كلام TTS
&lt;/h2&gt;

&lt;p&gt;استخدم &lt;code&gt;txt2speech&lt;/code&gt; لتوليد ملف صوتي من النص:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome back. Your account balance is $1,247.50.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o-mini-tts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;controls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدمه في:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;المساعدات الصوتية&lt;/li&gt;
&lt;li&gt;قراءة التنبيهات&lt;/li&gt;
&lt;li&gt;مقدمات البودكاست&lt;/li&gt;
&lt;li&gt;السرد داخل التطبيقات&lt;/li&gt;
&lt;li&gt;ميزات الوصول accessibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 8: استدعاء الدوال Function Calling
&lt;/h2&gt;

&lt;p&gt;يدعم Puter شكل OpenAI القياسي لتعريف الأدوات. تعرّف الدوال، يطلب النموذج استدعاء أداة، ثم تنفذها أنت في التطبيق.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Get the current weather for a city.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What's the weather in Tokyo right now?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tools&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// نفّذ الدالة من جانبك، ثم أرسل النتيجة للنموذج إذا احتجت إلى رد نهائي.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;هذا مفيد إذا كنت تريد ربط النموذج بعمليات مثل:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;البحث داخل قاعدة بيانات&lt;/li&gt;
&lt;li&gt;استدعاء API داخلي&lt;/li&gt;
&lt;li&gt;جلب حالة طلب&lt;/li&gt;
&lt;li&gt;حساب سعر&lt;/li&gt;
&lt;li&gt;التحقق من توفر منتج&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;شكل استدعاء الدوال قريب من OpenAI، لذلك يمكن نقل تعريفات الأدوات الحالية بسهولة. لاختبار تدفقات تعتمد على الأدوات في إعدادات بجودة إنتاجية، راجع &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;اختبار خادم MCP في Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 9: ضبط temperature و max_tokens
&lt;/h2&gt;

&lt;p&gt;مرر إعدادات OpenAI الشائعة داخل كائن الخيارات:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tell me about Mars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إرشادات سريعة:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;استخدم &lt;code&gt;temperature: 0.0&lt;/code&gt; إلى &lt;code&gt;0.3&lt;/code&gt; للإجابات الواقعية والمتسقة.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;temperature: 0.7&lt;/code&gt; إلى &lt;code&gt;1.0&lt;/code&gt; للكتابة الإبداعية.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;max_tokens&lt;/code&gt; لتحديد طول الرد وتقليل الهدر.&lt;/li&gt;
&lt;li&gt;في تطبيق عام، اجعل &lt;code&gt;max_tokens&lt;/code&gt; محدودًا حتى لا يستهلك المستخدم رصيده بسرعة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ما الذي تحصل عليه وما الذي لا تحصل عليه
&lt;/h2&gt;

&lt;p&gt;الوصول إلى GPT-5.5 عبر Puter مفيد، لكنه ليس نسخة كاملة من كل سطح OpenAI API الرسمي.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما تحصل عليه
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;نماذج GPT-5.x بما في ذلك &lt;code&gt;gpt-5.5&lt;/code&gt; و&lt;code&gt;gpt-5.5-pro&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;نماذج OpenAI الأقدم مثل &lt;code&gt;gpt-4.1&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;o1&lt;/code&gt;, &lt;code&gt;o3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;توليد الصور عبر GPT-Image وDALL-E.&lt;/li&gt;
&lt;li&gt;تحويل النص إلى كلام عبر نماذج OpenAI TTS.&lt;/li&gt;
&lt;li&gt;البث Streaming.&lt;/li&gt;
&lt;li&gt;الرؤية Vision.&lt;/li&gt;
&lt;li&gt;استدعاء الدوال Function Calling.&lt;/li&gt;
&lt;li&gt;التحكم في &lt;code&gt;temperature&lt;/code&gt; و&lt;code&gt;max_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;تشغيل مباشر من المتصفح بدون خادم.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ما قد لا تحصل عليه
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Responses API الرسمية.&lt;/li&gt;
&lt;li&gt;التخزين المؤقت للموجهات Prompt Caching.&lt;/li&gt;
&lt;li&gt;Files API.&lt;/li&gt;
&lt;li&gt;تشغيل مريح من الخادم بدون جلسة مستخدم.&lt;/li&gt;
&lt;li&gt;رؤوس حدود المعدل المباشرة من OpenAI.&lt;/li&gt;
&lt;li&gt;وضع الإخراج المنظم الكامل وفرض JSON Schema كما في OpenAI الرسمية.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كان تطبيقك يعتمد على المتصفح، فـ Puter خيار سريع. إذا كنت تبني بنية خلفية أو نظامًا إنتاجيًا عميقًا، فاستخدم OpenAI API الرسمية.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى تستخدم Puter ومتى تستخدم OpenAI API الرسمية
&lt;/h2&gt;

&lt;h3&gt;
  
  
  استخدم Puter عندما:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;تبني تطبيقًا عامًا مجانيًا ولا تريد تحمل الفاتورة.&lt;/li&gt;
&lt;li&gt;تعمل على نموذج أولي سريع.&lt;/li&gt;
&lt;li&gt;تشارك في هاكاثون.&lt;/li&gt;
&lt;li&gt;تنشر موقعًا ثابتًا أو إضافة متصفح.&lt;/li&gt;
&lt;li&gt;لا تريد إعداد خادم وسيط.&lt;/li&gt;
&lt;li&gt;يمكن للمستخدمين تسجيل الدخول إلى Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  استخدم OpenAI API الرسمية عندما:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;تحتاج إلى تشغيل الطلبات من الخادم.&lt;/li&gt;
&lt;li&gt;لديك jobs أو cron tasks أو webhooks.&lt;/li&gt;
&lt;li&gt;تحتاج إلى batch processing.&lt;/li&gt;
&lt;li&gt;تحتاج إلى Prompt Caching.&lt;/li&gt;
&lt;li&gt;تحتاج إلى Responses API أو Files API.&lt;/li&gt;
&lt;li&gt;تحتاج إلى مخرجات منظمة صارمة.&lt;/li&gt;
&lt;li&gt;لديك متطلبات امتثال أو عقود مؤسسية.&lt;/li&gt;
&lt;li&gt;لا تريد فرض تسجيل دخول Puter على المستخدم.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;كثير من المشاريع تبدأ بـ Puter للنمذجة السريعة، ثم تنتقل إلى OpenAI API الرسمية عند الوصول إلى حدود المتصفح أو متطلبات الإنتاج.&lt;/p&gt;

&lt;p&gt;لإعداد إنتاجي مدفوع، راجع &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام GPT-5.5 API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  اختبار الدمج في Apidog
&lt;/h2&gt;

&lt;p&gt;مكالمات Puter تحدث داخل المتصفح، لذلك لا تختبرها مثل REST API خلفية مباشرة. النمط العملي هو:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ صفحة HTML صغيرة تستخدم Puter.&lt;/li&gt;
&lt;li&gt;اجعل الـ prompt يأتي من query parameter.&lt;/li&gt;
&lt;li&gt;استخدم Apidog لاختبار OpenAI API الرسمية عند التخطيط للترحيل.&lt;/li&gt;
&lt;li&gt;احتفظ ببيئتين منفصلتين: واحدة للنموذج الأولي وواحدة للإنتاج.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال صفحة اختبار بسيطة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Say hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;بعد ذلك يمكنك تشغيلها هكذا:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5173/?prompt=Explain%20JWT%20in%203%20points
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-29.png" alt="صورة" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;قم بتنزيل Apidog&lt;/a&gt; وأنشئ بيئتين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: عنوان محلي يستضيف صفحة Puter.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openai-prod&lt;/code&gt;: مثل &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بهذا تستطيع مقارنة السلوك، ثم الترحيل عندما يصبح المشروع جاهزًا. لأنماط اختبار API الأوسع، راجع &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;أداة اختبار API لمهندسي ضمان الجودة&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;h3&gt;
  
  
  هل هذا غير محدود فعلًا؟
&lt;/h3&gt;

&lt;p&gt;غير محدود من جانب المطور. المستخدم النهائي يستخدم رصيد حسابه في Puter. الحسابات الجديدة تحصل على رصيد بدء، ويمكن للمستخدم إعادة الشحن عند الحاجة.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل أحتاج إلى حساب OpenAI؟
&lt;/h3&gt;

&lt;p&gt;لا. Puter يدير الاتصال بواجهة OpenAI API. أنت لا ترى مفتاح OpenAI ولا تخزنه.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكن استخدامه في الإنتاج؟
&lt;/h3&gt;

&lt;p&gt;نعم، لتطبيقات المتصفح. السؤال العملي هو: هل يقبل المستخدمون تسجيل الدخول إلى Puter؟ إذا كانت الإجابة نعم، يمكنك نشره.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل أداء GPT-5.5 عبر Puter هو نفسه API الرسمية؟
&lt;/h3&gt;

&lt;p&gt;إخراج النموذج نفسه من حيث السلوك العام، لأن Puter يستدعي OpenAI نيابة عن المستخدم. قد يزيد زمن الاستجابة قليلًا بسبب طبقة Puter.&lt;/p&gt;

&lt;h3&gt;
  
  
  ماذا عن Prompt Caching؟
&lt;/h3&gt;

&lt;p&gt;لا يعرض Puter ضوابط Prompt Caching مثل OpenAI الرسمية. إذا كان لديك system prompt كبير وثابت وتحتاج إلى خصومات التخزين المؤقت، فاستخدم OpenAI API الرسمية.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكن استخدام Puter من خدمة خلفية؟
&lt;/h3&gt;

&lt;p&gt;ليس بسلاسة. Puter مصمم أساسًا للمتصفح ويفترض وجود جلسة مستخدم. للخدمات الخلفية، استخدم OpenAI API الرسمية. لخيارات مجانية من جانب الخادم، راجع &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام GPT-5.5 API مجانًا&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ما النموذج الافتراضي المناسب؟
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;استخدم &lt;code&gt;gpt-5.5&lt;/code&gt; لمعظم مهام الدردشة والاستدلال.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;gpt-5.4-nano&lt;/code&gt; للتصنيف السريع بكميات كبيرة.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;gpt-5.5-pro&lt;/code&gt; للمهام الصعبة.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;o3&lt;/code&gt; لسلاسل الاستدلال الطويلة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  هل يمكن أن تكون التكلفة عالية على المستخدمين؟
&lt;/h3&gt;

&lt;p&gt;معظم استخدامات الدردشة تستهلك تكلفة صغيرة لكل جلسة. توليد الصور أغلى عادة، لذلك حدّد &lt;code&gt;max_tokens&lt;/code&gt; للنصوص، وتجنب الطلبات غير الضرورية، وأظهر للمستخدم ما الذي سيحدث قبل تنفيذ عمليات مكلفة.&lt;/p&gt;

&lt;h3&gt;
  
  
  هل يمكن توليد الصور باستخدام Puter؟
&lt;/h3&gt;

&lt;p&gt;نعم، عبر &lt;code&gt;txt2img&lt;/code&gt; باستخدام &lt;code&gt;gpt-image-2&lt;/code&gt; أو DALL-E. يدفع المستخدم من رصيده في Puter. للدليل الرسمي لواجهة API المدفوعة، راجع &lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام GPT-Image-2 API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  خلاصة القول
&lt;/h2&gt;

&lt;p&gt;Puter.js يمنحك طريقة سريعة لبناء تطبيقات متصفح تستخدم نماذج OpenAI بدون مفتاح API وبدون خادم وبدون تحمل فاتورة الاستخدام. أضف السكربت، اختر النموذج، ثم نفّذ &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;إذا كنت تبني:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نموذجًا أوليًا&lt;/li&gt;
&lt;li&gt;مشروع هاكاثون&lt;/li&gt;
&lt;li&gt;أداة عامة مجانية&lt;/li&gt;
&lt;li&gt;موقعًا ثابتًا&lt;/li&gt;
&lt;li&gt;إضافة متصفح&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;فـ Puter خيار عملي للبدء بسرعة.&lt;/p&gt;

&lt;p&gt;أما إذا كنت تحتاج إلى تشغيل من الخادم، أو Prompt Caching، أو Responses API، أو مخرجات منظمة صارمة، فواجهة OpenAI API الرسمية هي المسار الأنسب.&lt;/p&gt;

&lt;p&gt;أنشئ الطلب مرة واحدة في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، وقارن Puter مقابل واجهة API الرسمية، ثم اختر المسار الذي يناسب بنية تطبيقك.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>الحصول على API مجاني وغير محدود لـ Claude Opus 4.7</title>
      <dc:creator>Yusuf Khalidd</dc:creator>
      <pubDate>Sat, 09 May 2026 02:32:38 +0000</pubDate>
      <link>https://dev.to/yusuf_khalidd/lhswl-l-api-mjny-wgyr-mhdwd-l-claude-opus-47-pen</link>
      <guid>https://dev.to/yusuf_khalidd/lhswl-l-api-mjny-wgyr-mhdwd-l-claude-opus-47-pen</guid>
      <description>&lt;p&gt;تُعد عائلة نماذج Claude من Anthropic خيارًا قويًا للبرمجة، الوكلاء (agentic workflows)، والاستدلال طويل السياق، لكن تكلفة API قد تجعل التجارب الجانبية مكلفة بسرعة. باستخدام Puter.js يمكنك استدعاء نماذج Claude مثل Opus 4.7 وSonnet 4.6 وHaiku 4.5 من المتصفح بدون مفتاح Anthropic، حيث يتحمل المستخدم النهائي الاستهلاك عبر حساب Puter بدلًا من المطور.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;جرّب Apidog اليوم&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;هذا الدليل يوضح طريقة التنفيذ عمليًا: التثبيت، اختيار النموذج، أول استدعاء، البث، المحادثات متعددة الأدوار، وكيفية مقارنة Puter مع Anthropic API الرسمية قبل الانتقال للإنتاج.&lt;/p&gt;

&lt;h2&gt;
  
  
  خلاصة القول
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; يتيح استدعاء Claude من المتصفح بدون مفتاح Anthropic API.&lt;/li&gt;
&lt;li&gt;المستخدم النهائي يستخدم حساب Puter الخاص به، لذلك لا تتحمل أنت فاتورة Anthropic.&lt;/li&gt;
&lt;li&gt;النماذج المدعومة تشمل: &lt;strong&gt;Opus 4.7, Opus 4.6, Opus 4.6 Fast, Opus 4.5, Opus 4.1, Opus 4, Sonnet 4.6, Sonnet 4.5, Sonnet 4, Haiku 4.5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;تحتاج فقط إلى وسم &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; واستدعاء &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;يدعم Puter المحادثات، المطالبات النظامية، والبث.&lt;/li&gt;
&lt;li&gt;يمكنك استخدام &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; لمقارنة نفس المطالبة بين Puter وAnthropic API الرسمية.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  كيف يعمل النموذج بدون مفتاح API؟
&lt;/h2&gt;

&lt;p&gt;Puter.js مكتبة تعمل من المتصفح. بدلًا من تخزين مفتاح Anthropic في تطبيقك أو خادمك، يسجّل المستخدم الدخول إلى Puter، ثم تُنفّذ الطلبات باستخدام حسابه.&lt;/p&gt;

&lt;p&gt;هذا يعني عمليًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;لا يوجد مفتاح API في الكود&lt;/strong&gt;: لا أسرار، لا تدوير مفاتيح، ولا خطر تسريب.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;لا توجد فاتورة Anthropic عليك&lt;/strong&gt;: كل مستخدم يرتبط بحسابه الخاص.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;لا تحتاج خادمًا وسيطًا&lt;/strong&gt;: مناسب للمواقع الثابتة، النماذج الأولية، والهاكاثونات.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;القيد الرئيسي: Puter مناسب أولًا لتطبيقات المتصفح. إذا كنت تحتاج بوت خلفي، وظيفة Cron، أو معالجة دفعية Server-side، فغالبًا ستحتاج Anthropic API الرسمية.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 1: أضف Puter.js
&lt;/h2&gt;

&lt;p&gt;في أبسط حالة، أضف السكريبت التالي إلى صفحة HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;مثال صفحة كاملة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"ar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;اشرح مفهوم REST API باختصار&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كنت تستخدم Vite أو Webpack أو مشروعًا يعتمد على NPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم CDN للنماذج الأولية السريعة، واستخدم NPM عندما تحتاج دمجًا داخل تطبيق Frontend منظم.&lt;/p&gt;

&lt;h2&gt;
  
  
  الخطوة 2: اختر نموذج Claude المناسب
&lt;/h2&gt;

&lt;p&gt;يعتمد اختيار النموذج على نوع المهمة. استخدم الجدول التالي كبداية:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;معرف النموذج&lt;/th&gt;
&lt;th&gt;متى تستخدمه؟&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;للاستدلال العميق، مراجعة الكود المعقدة، والمهام الوكالية متعددة الخطوات&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;مهام برمجية قوية مع جودة عالية&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4.6-fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;عندما تحتاج Opus بزمن استجابة أقل&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;خيار مستقر للوكلاء وتطبيقات الإنتاج&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;نموذج أقدم بسلوك مستقر ومفهوم&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الإصدار الأساسي من Opus 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الخيار الافتراضي لمعظم التطبيقات اليومية&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;خيار جيد وأرخص نسبيًا لمعظم المهام&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;الإصدار الأساسي من Sonnet 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;للتصنيف السريع والمهام كبيرة الحجم منخفضة التعقيد&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;قاعدة عملية:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;استخدم &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; كافتراضي.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;claude-haiku-4-5&lt;/code&gt; للتصنيف السريع أو الردود القصيرة.&lt;/li&gt;
&lt;li&gt;استخدم &lt;code&gt;claude-opus-4-7&lt;/code&gt; عندما تكون جودة الاستدلال أهم من السرعة.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  الخطوة 3: نفّذ أول استدعاء إلى Claude
&lt;/h2&gt;

&lt;p&gt;أبسط استدعاء:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain quantum computing in simple terms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;شكل الاستجابة يشبه Anthropic Messages API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;إذا كانت الاستجابة تحتوي على أكثر من جزء، يمكنك المرور على كل الكتل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 4: فعّل البث Streaming
&lt;/h2&gt;

&lt;p&gt;لتحسين تجربة المستخدم في الردود الطويلة، استخدم &lt;code&gt;stream: true&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;اكتب شرحًا مفصلًا عن تأثير الذكاء الاصطناعي على تطوير البرمجيات&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;في واجهة دردشة، ألحق كل جزء بفقاعة الرسالة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 5: استخدم محادثات متعددة الأدوار
&lt;/h2&gt;

&lt;p&gt;بدلًا من إرسال نص واحد، أرسل مصفوفة رسائل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;أبني تطبيق Next.js يستخدم PostgreSQL.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;تمام. ما الجزء الذي تحتاج مساعدة فيه؟&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;كيف أنظم مجلد migrations؟&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;للحفاظ على سياق المحادثة، خزّن الرسائل في مصفوفة واحدة وأضف كل رسالة جديدة إليها:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userText&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userText&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  الخطوة 6: أضف مطالبة نظامية
&lt;/h2&gt;

&lt;p&gt;استخدم رسالة &lt;code&gt;system&lt;/code&gt; لتحديد الدور، التنسيق، والقيود:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;أنت مهندس Backend خبير. أجب بنقاط مرقمة ولا تتجاوز خمس نقاط.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;كيف أمنع SQL Injection في تطبيق Node.js؟&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استخدم المطالبة النظامية لتحديد:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;أسلوب الرد&lt;/li&gt;
&lt;li&gt;اللغة&lt;/li&gt;
&lt;li&gt;طول الإجابة&lt;/li&gt;
&lt;li&gt;صيغة الإخراج مثل JSON أو Markdown&lt;/li&gt;
&lt;li&gt;قواعد الأمان والسلوك&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;مثال لإخراج JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;أرجع الإجابة بصيغة JSON فقط بدون Markdown.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;استخرج اسم المنتج والسعر من النص: iPhone بسعر 999 دولار&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  مقارنة النماذج على نفس المطالبة
&lt;/h2&gt;

&lt;p&gt;لا تختَر النموذج بناءً على الاسم فقط. اختبر نفس المطالبة عبر أكثر من نموذج وقارن الزمن والجودة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactor this React component to use hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;النتيجة المتوقعة غالبًا:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Haiku أسرع للمهام البسيطة.&lt;/li&gt;
&lt;li&gt;Sonnet أفضل توازن لمعظم تطبيقات الإنتاج.&lt;/li&gt;
&lt;li&gt;Opus أفضل للمهام الصعبة والمعقدة.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;لمقارنة Puter مع Anthropic API الرسمية داخل نفس سير الاختبار، يمكنك إعداد بيئتين في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; والتبديل بينهما عند الحاجة.&lt;/p&gt;

&lt;h2&gt;
  
  
  ما الذي تحصل عليه عبر Puter؟
&lt;/h2&gt;

&lt;p&gt;تحصل على:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;وصول إلى نماذج Claude المتاحة عبر Puter.&lt;/li&gt;
&lt;li&gt;محادثات متعددة الأدوار.&lt;/li&gt;
&lt;li&gt;مطالبات نظامية.&lt;/li&gt;
&lt;li&gt;بث الاستجابات.&lt;/li&gt;
&lt;li&gt;تشغيل من المتصفح بدون خادم وسيط.&lt;/li&gt;
&lt;li&gt;عدم تخزين مفتاح Anthropic في تطبيقك.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;وقد لا تحصل على، حسب دعم Puter الحالي:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;نفس تحكم Anthropic الرسمي الكامل في الأدوات Function Calling / Tool Use.&lt;/li&gt;
&lt;li&gt;دعم الرؤية أو مرفقات الصور.&lt;/li&gt;
&lt;li&gt;تخفيضات prompt caching من Anthropic.&lt;/li&gt;
&lt;li&gt;تشغيل مباشر من الخادم بدون جلسة مستخدم.&lt;/li&gt;
&lt;li&gt;رؤية كاملة لرؤوس rate limit الخاصة بـ Anthropic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;إذا كنت تبني تدفقات Tool Use أو MCP معقدة، فقد تحتاج واجهة Anthropic الرسمية أو اختبار خادم MCP عبر &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  متى تستخدم Puter؟ ومتى تستخدم Anthropic API الرسمية؟
&lt;/h2&gt;

&lt;p&gt;استخدم Puter عندما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تبني تطبيقًا يعمل من المتصفح.&lt;/li&gt;
&lt;li&gt;تريد نموذجًا أوليًا سريعًا بدون إعداد مفاتيح وفوترة.&lt;/li&gt;
&lt;li&gt;تنشر موقعًا ثابتًا أو مشروع هاكاثون.&lt;/li&gt;
&lt;li&gt;تريد تجنب تحمل تكلفة استخدام المستخدمين.&lt;/li&gt;
&lt;li&gt;لا تمانع أن يسجل المستخدم الدخول إلى Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;استخدم Anthropic API الرسمية عندما:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;تحتاج استدعاءات Server-side.&lt;/li&gt;
&lt;li&gt;لديك وظائف Cron أو معالجة دفعية.&lt;/li&gt;
&lt;li&gt;تحتاج prompt caching لتقليل التكلفة.&lt;/li&gt;
&lt;li&gt;تحتاج Tool Use متقدمًا أو Files API أو رؤية.&lt;/li&gt;
&lt;li&gt;لديك متطلبات امتثال أو تعاقدات محددة.&lt;/li&gt;
&lt;li&gt;لا تريد أن يمر المستخدم بخطوة تسجيل دخول إلى Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;يمكنك البدء بـ Puter ثم الترحيل لاحقًا إلى Anthropic API الرسمية؛ شكل الرسائل قريب بما يكفي لجعل الترحيل مباشرًا نسبيًا.&lt;/p&gt;

&lt;p&gt;لمثال مشابه مع GPT، راجع: &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;كيفية استخدام واجهة برمجة تطبيقات GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  اختبار التكامل في Apidog
&lt;/h2&gt;

&lt;p&gt;لأن Puter يعمل من المتصفح، لن تختبره بنفس طريقة اختبار REST API خلفي. النمط العملي:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;أنشئ صفحة HTML صغيرة تحتوي على Puter.js.&lt;/li&gt;
&lt;li&gt;اجعل الصفحة تقرأ المطالبة من Query String.&lt;/li&gt;
&lt;li&gt;اختبر Anthropic API الرسمية في Apidog كمسار بديل للإنتاج.&lt;/li&gt;
&lt;li&gt;احتفظ ببيئتين منفصلتين: واحدة للنموذج الأولي وواحدة للإنتاج.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;مثال صفحة اختبار بسيطة:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;قل مرحبًا&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ثم افتحها بهذا الشكل:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5173/puter-test.html?prompt=اشرح%20JWT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-28.png" alt="صورة-28" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;قم بتنزيل &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، ثم أنشئ بيئتين:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: عنوان محلي يستضيف صفحة Puter.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic-prod&lt;/code&gt;: &lt;code&gt;https://api.anthropic.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;بهذا تستطيع مقارنة السلوك قبل الترحيل من Puter إلى Anthropic API الرسمية.&lt;/p&gt;

&lt;h2&gt;
  
  
  الأسئلة الشائعة
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;هل هذا غير محدود فعلًا؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
هو غير محدود من جهة المطور لأنك لا تدفع عن كل المستخدمين من حسابك. لكن المستخدم النهائي يعتمد على حساب Puter ورصيده الخاص.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل أحتاج حساب Anthropic؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
لا. Puter يتولى الاتصال بـ Anthropic نيابة عن المستخدم.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يمكن استخدامه في الإنتاج؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
نعم لتطبيقات المتصفح، بشرط أن تكون تجربة تسجيل الدخول إلى Puter مقبولة لمستخدميك.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل مخرجات Claude عبر Puter مختلفة عن Anthropic API؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
النموذج نفسه، لكن قد تختلف تفاصيل الواجهة أو زمن الاستجابة بسبب وجود طبقة Puter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يدعم prompt caching؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
إذا كنت تحتاج خصائص Anthropic الرسمية مثل prompt caching لتقليل التكلفة، استخدم Anthropic API مباشرة.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;هل يصلح لبوت Discord أو خدمة خلفية؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ليس الخيار الأنسب. Puter مصمم أولًا لتدفقات المتصفح التي تتضمن جلسة مستخدم.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ما النموذج الافتراضي المقترح؟&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ابدأ بـ &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;. استخدم &lt;code&gt;claude-opus-4-7&lt;/code&gt; للمهام الأصعب، و&lt;code&gt;claude-haiku-4-5&lt;/code&gt; للمهام السريعة والبسيطة.&lt;/p&gt;

&lt;h2&gt;
  
  
  خاتمة
&lt;/h2&gt;

&lt;p&gt;Puter.js يمنحك طريقة عملية لتشغيل Claude داخل تطبيقات المتصفح بدون إدارة مفاتيح API أو تحمل تكلفة الاستخدام عن المستخدمين. أضف السكريبت، اختر نموذجًا، أرسل الرسائل، وفعّل البث عند الحاجة.&lt;/p&gt;

&lt;p&gt;إذا كان تطبيقك يحتاج خادمًا، وظائف خلفية، Tool Use متقدمًا، أو متطلبات امتثال، فواجهة Anthropic API الرسمية تبقى الخيار الأنسب.&lt;/p&gt;

&lt;p&gt;للتجارب والمقارنات، أنشئ الطلب مرة واحدة في &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;، اختبر Puter كنموذج أولي، ثم قارنه مع Anthropic API الرسمية قبل اتخاذ قرار الإنتاج.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
