عن المشروع

# XTokenHub XTokenHub هو بوابة تجميع مستضافة ذاتيًا لواجهات برمجة تطبيقات مزودي النماذج اللغوية الكبيرة (LLM). يجمع مفاتيح API الموجودة لديك عبر المزودين في لوحة قناة واحدة، ويكشف نقاط نهاية بروتوكولية موحدة لعملائك، ويبلغ عن استخدام الرموز ومعدل تطابق ذاكرة التخزين المؤقت بشكل مباشر. مبدأ التصميم المُعلَن هو تمرير حركة المرور عبر بروتوكول المزود الأصلي كلما أمكن ذلك، مع اعتبار التحويل كحل بديل. ## القدرات الأساسية - **إدارة المفاتيح القائمة على القنوات** — إدخال واحد لكل نقطة نهاية مزود، مع استكشاف التوفر، وخيار التمكين/تعطيل التبديل، واستعلامات الرصيد حيث يكشف المزود عنها. - **تجميع النماذج والتوجيه** — تحمل كل قناة قائمة نماذجها الخاصة (المسحوبة من المنبع حسب الطلب)، ويتم دمج جميع المنابع في نقطة نهاية قائمة نماذج موحدة. يستخدم التوجيه الأولوية بالإضافة إلى اختيار عشوائي مرجّح، مع تجاوز تلقائي عبر القنوات التي تخدم النموذج نفسه. - **رؤى الاستخدام** — تعرض لوحة التحكم عدد الطلبات، واستخدام الرموز، ومعدل تطابق ذاكرة التخزين المؤقت، ومتوسط زمن الاستجابة، مجمَّعة حسب النموذج أو القناة أو مفتاح المتصل، مع رسم حراري للنشاط على غرار GitHub ورسم بياني لاتجاهات اليومية يُدفع عبر WebSocket. - **تحويل البروتوكول** — تكشف البوابة في وقت واحد عن نقاط نهاية دردشة واستجابات على طراز OpenAI ونقطة نهاية رسائل على طراز Anthropic. يتم تحويل الطلبات فقط عندما تختلف البروتوكولات الداخلة عن البروتوكولات الصاعدة؛ ويتم توجيه البروتوكولات المتطابقة دون إعادة كتابة، وهو ما يذكره المشروع بأنه يحافظ على استدعاءات الأدوات والحزم متعددة الوسائط. - **مفاتيح البوابة وإحصائيات لكل متصل** — تُصدر مفاتيح وجِهَة للزبائن المختلفين، ويتم تجميع إجماليات الطلب/الرمز لكل مفتاح. - **استضافة ذاتية بثنائي واحد** — الواجهة الأمامية مُضمَّنة في ثنائي Go، لذا ينتج البناء قطعة ثابتة واحدة (بدون CGO) يمكن نسخها إلى جهاز يعمل بـ Linux أو macOS. ## كيف تعمل التوجيه والقياس يصف دليل README تدفقًا مكونًا من أربع خطوات: 1. أنشئ قناة مع عنوان URL الأساسي للمزود ومفتاح API وقائمة النماذج. يتم الكشف تلقائيًا عن نمط API (Bearer للمتوافق مع OpenAI، x-api-key للمتوافق مع Anthropic) من عنوان URL الأساسي ويمكن إلغاؤه. يتم دعم أشكال متعددة لتثبيت عناوين URL الأساسية، بما في ذلك النطاقات المجردة، والملحقات /v1، والتثبيتات الفرعية للمسار مثل /anthropic، والتثبيتات ذات الإصدارات. 2. يرسل استكشاف البروتوكول الأصلي طلبًا بسيطًا إلى كل نقطة نهاية بروتوكول؛ ويرمز الرد 2xx إلى أن ذلك البروتوكول أصلي للقناة، وهو ما يمكن تصحيحه يدويًا أيضًا. 3. يتم تصفية الطلبات الواردة إلى القنوات المفعّلة التي تخدم النموذج، وتُفضَّل القنوات الأصلية، وتُستخدم القنوات المحوّلة فقط كحل بديل. يتم الاختيار بتدرج أولوية تنازلي مع عشوائية مرجّحة، وتدفع الأعطال مثل أخطاء الشبكة، أو 401/403/408/429، أو أخطاء 5xx عملية التجاوز التلقائي. 4. يتم تحليل الاستخدام من استجابة المنبع عند الإبلاغ عنها (مع خيارات استخدام البث التي تُضاف تلقائيًا)؛ وعندما لا يبلغ المنبع بأي شيء، يتم استخدام تقدير محلي مبني على الاستدلالات. يأتي معدل تطابق ذاكرة التخزين المؤقت من حقول الرموز المخزنة في ذاكرة التخزين المؤقت لدى المزود، ويُسجَّل كل طلب في جدول السجلات ويُدفَع إلى واجهة المستخدم. ## لوحة التحكم وسطح واجهة برمجة التطبيقات تغطي واجهة برمجة التطبيقات الإدارية القنوات، ومفاتيح البوابة، وسجلات الطلبات مع تنظيف الاحتفاظ، ومجموعة من نقاط نهاية الإحصاءات (ملخص، اتجاوبات يومية، حسب النموذج، حسب القناة، حسب المفتاح، إجماليات العمر الافتراضي، واتجاهات حسب النموذج)، بالإضافة إلى نقطة نهاية صحة النظام ونقطة نهاية WebSocket للأحداث المباشرة. تشمل نقاط نهاية البوابة قائمة نماذج مدمجة ومسارات دردشة واستجابات ورسائل. يقبل مصادقة المتصل إما رمز Bearer أو رأس x-api-key ويمكن تعطيله بواسطة التكوين. ## التكوين والعمليات ترتيب أولوية التكوين هو: متغيرات البيئة، ثم ملف YAML، ثم الإعدادات الافتراضية المدمجة. تُخزَّن البيانات في SQLite بوضع WAL مع اتصال كاتب واحد. تنمو سجلات الطلبات بلا حدود افتراضيًا، لذا يقوم وظيفة احتفاظ بحذف الصفوف الأقدم من عدد معين من الأيام القابلة للتكوين، مع إعدادات لفاصل الدورة، وحجم الدفعة، وتحديد VACUUM اختياري. يشير المشروع إلى أن ملف SQLite لا ينكمش تلقائيًا بعد الحذف. ## الاختبار توجد اختبارات الوحدة في ترتيب حزمة اختبار خارجية منسوخة وتغطي تحميل التكوين، ومستودعات SQLite الذاكرة العشوائية، وحافلة الأحداث، وسلوك WebSocket، واستكشاف المزود والتحويل عبر منابع وهمية، واختيار البوابة وحفظ الإحصاءات، ومسارات المعالج/الموجّه من طرف إلى طرف. يُفيد دليل README بإجراء تشغيل اختبارات كامل مع تمكين السباق (race-enabled) وبأغطية عبارات بنسبة 87.6%، بالإضافة إلى اختبارات الواجهة الأمامية لإعادة الاتصال بـ WebSocket وتحويلات البيانات. ## القيود المعروفة المعلَنة من قبل المشروع - مسار التحويل يعالج الدردشة النصية فقط؛ تحتاج استدعاءات الأدوات، والحزم متعددة الوسائط، وحزم التحكم في ذاكرة التخزين المؤقت إلى قنوات تمرير أصلي. - تغطي استعلامات الرصيد DeepSeek حاليًا فقط، لأن واجهات برمجة التطبيقات الخاصة بالرصيد لدى المزودين الآخرين غير موثّقة، أو تتطلب مصادقة cookie منتهية الصلاحية، أو ليست عامة. - تقدير الرموز المحلي مبني على الاستدلالات ويُستخدم كحل بديل فقط. - لا توجد مصادقة تسجيل دخول في واجهة برمجة التطبيقات الإدارية وهي مخصصة للاستخدام داخل الشبكة الداخلية المستضافة ذاتيًا مع عزل الشبكة الخارجية؛ تُخزَّن المفاتيح كنص واضح. - يعتمد معدل تطابق ذاكرة التخزين المؤقت والتجميع حسب المفتاح على لقطات سجل الطلبات، لذا يظل استخدام المفتاح المحذوف التاريخي تحت اسمه. ## التطبيق المرافق والترخيص يستهلك تطبيق SwiftUI منفصل لشريط القوائم نفس واجهة برمجة التطبيقات الإدارية وWebSocket بدون حاجة إلى تغييرات في الخلفية. يُصدَر XTokenHub بموجب ترخيص MIT.