نُشر
هندسة

كاشف Claude المزيّف أصبح الآن مكتبة مفتوحة المصدر

ai-model-verifier هو المحرك الذي يقف خلف أداة اختبار النماذج لدينا، وقد نُشر على npm برخصة AGPL-3.0. أعطه عنوان URL أساسيًا ومفتاحًا ونموذجًا، فيخبرك إن كانت نقطة النهاية تقدّم ما تبيعه فعلًا، والآن مع فحص توقيع التفكير وفوترة الرموز.

·4 دقيقة قراءة·بقلم فريق UnoRouter
هندسةإعلان

في أبريل نشرنا الأرقام عن بائعي Claude المزيّفين: 183 قناة لدى 8 مزوّدين كانت تجيب بوصفها Kiro أو Codeium أو نموذجًا آخر يرتدي بطاقة اسم Claude. المِجسّات التي كشفتها كانت تعيش داخل خط المزامنة لدينا. وهي الآن تعيش في حزمة يستطيع أي شخص تثبيتها.

ai-model-verifier متاح على npm وGitHub برخصة AGPL-3.0. يأخذ عنوان URL أساسيًا ومفتاح API واسم نموذج، ويعيد واحدًا من ثلاثة أحكام: genuine أو suspicious أو unverified، مع القاعدة التي انطلقت والردود الخام للمِجسّات إلى جانبها.

لماذا مكتبة

الفحوص نفسها تعمل الآن في ثلاثة أماكن: في متصفحك عبر أداة اختبار النماذج، وعلى خوادمنا من أجل التصنيفات العامة، وداخل خط المزامنة الذي يقرّر أي مسارات المنبع يعرضها UnoRouter أصلًا. ثلاث نسخ من قائمة أنماط تتباعد مع الوقت. حزمة واحدة لا تتباعد.

هو متماثل الشكل عن قصد. واجهات ويب قياسية فقط، دون استيرادات node:، وصفر اعتماديات وقت التشغيل. استدعاء HTTP يُحقَن من الخارج، فيستطيع المتصفح الالتفاف على CORS ويستطيع الخادم المرور عبر fetch محمي من SSRF. المزوّدون والكواشف نقاط دخول منفصلة، فالتحقق من Anthropic لا يحزم إعدادات Gemini أبدًا.

ما الجديد منذ أبريل

مِجسّات السلوك الأربعة من المقال الأول ما زالت الجوهر: قصة القطة الصغيرة، والهايكو، وسؤال الهوية، وسؤال اسم النموذج، والآن لنقاط النهاية بصيغ Anthropic وOpenAI وGemini. وحولها فحوص لا تعتمد على سؤال النموذج عن هويته.

  • توقيع التفكير. يُلحق Claude توقيعًا يولّده الخادم بكل كتلة تفكير. المرحّل الذي يقدّم نموذجًا آخر لا يستطيع إنتاجه. يمكن تلقين مِجسّات الهوية عبر موجّه نظام؛ أما التوقيع فلا.
  • محاسبة الرموز. يمكن للمرحّل أن يمرّر Claude حقيقيًا ومع ذلك يضخّم input_tokens في كل استدعاء. موجّهان يختلفان بمقطع نصي ثابت يجب أن يختلفا في الرموز المفوترة ضمن نطاق معروف، ويجب أن يتطابق count_tokens مع ما فُوتر، وأن يبقى الخرج دون max_tokens. يستخدم Opus 4.7 و4.8 مُرمِّزًا مختلفًا، لذا يعمل النطاق فحصًا للفئة أيضًا.
  • عدم تطابق الفئة والاستبدال. فوترة Opus وتقديم Sonnet تفلت من مِجسّات السلوك، لأن Sonnet يكتب قصة قطة صغيرة جيدة تمامًا. يلتقط مِجسّ اسم النموذج ردًا يسمّي الفئة الأرخص، ويلتقط فحص الغلاف نقطة نهاية تعيد معرّف نموذج مختلفًا عن المطلوب.
  • خلط الردود وتسرّب اللغة. يحمل كل موجّه رقمًا فريدًا (nonce). الرد الذي يعيد رقم شخص آخر يعني أن الوكيل يخلط الردود بين المستخدمين. وأحرف CJK في رد على موجّه إنجليزي تشير إلى نموذج صيني مُستبدَل.
  • بيانات الغلاف الوصفية. معرّف chatcmpl- داخل رد بصيغة Anthropic، أو مفاتيح استهلاك OpenAI في رد Messages، يعني وجود طبقة ترجمة بينك وبين النموذج. يُبلَّغ عنها كملاحظة لا كحكم: بوابتنا نفسها هي طبقة من هذا النوع تمامًا.
  • معدل الإنتاج. النماذج الأكبر أبطأ لكل رمز، لذا فإن مسارًا يُفوتَر بوصفه Opus ويعمل بسرعة Sonnet يستحق النظر. يُؤخذ عيّنةً ولا تُفرض له عتبات: المقارنة المفيدة تكون بين مسارات تقدّم النموذج نفسه، ولا يستطيع تجميعها إلا الطرف المستدعي.

ما الذي لا يثبته

التوقيع الصالح يثبت أن مسار Anthropic حقيقيًا هو من أجاب. لكنه لا يثبت أي فئة: يعيد Sonnet توقيعًا سليمًا تمامًا حين يُباع بوصفه Opus، لذا فالنجاح هنا ما زال يحتاج فحوص الفئة. إعادة إرسال كتلة التفكير كي تعيد Anthropic التحقق من التوقيع تبدو الاختبار الحاسم. بنيناه، وهو لا يعمل عبر مرحّل. مصدران مباشران أعادا 200 لكتلة حقيقية وللكتلة نفسها مع 308 بايت من base64 عشوائي مكان التوقيع. المرحّل يعيد إصدار الدور إلى خلفيّته الخاصة، فلا شيء يتحقق أبدًا. الخيار معطّل افتراضيًا وموثّق على هذا النحو.

فحوص التوقيع والرموز منقولة من veridrop، وهو أيضًا برخصة AGPL، وقد عُويرت حدود تسامحه مقابل الواجهة الرسمية. أبقينا على الحدود التي تبدو فضفاضة لأن ردود Anthropic الحقيقية كانت قريبة منها.

استخدمه

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

typescript
import { runVerification } from "ai-model-verifier";

const result = await runVerification({
  provider: "anthropic",
  baseUrl: "https://YOUR-PROVIDER",
  apiKey: process.env.YOUR_KEY,
  model: "claude-opus-4-8",
  mode: "server",
  checkSignature: true,
  checkTokenTruth: true,
});

console.log(result.verdict, result.reasons);
// "suspicious" [ "tier-mismatch: requested claude-opus-4-8, served sonnet" ]

فعّل ما تحتاجه فقط. يكلّف كل من checkSignature وcheckTokenTruth طلبات إضافية، لذا يبقيان معطّلين ما لم تطلبهما. أما بيانات الغلاف الوصفية ومعدل الإنتاج فتُقرأ من الردود التي جرى الحصول عليها بالفعل ولا تكلّف شيئًا.

اختبر مزوّدًا، أو اقرأ مقال أبريل للاطلاع على الأرقام التي بدأ منها كل هذا، أو افتح مشكلة على GitHub إن حصلت نقطة نهاية حقيقية على حكم خاطئ.

منشورات ذات صلة