
وكيل شفاف لإخفاء معلومات التعريف الشخصية (PII) لحركة مرور واجهة برمجة التطبيقات (API) للنماذج اللغوية الكبيرة (LLM). يقف بين التطبيق وموفر LLM (حاليًا Anthropic)، حيث يقوم بإخفاء هوية البيانات الحساسة في الاتجاه الصادر واستعادتها في الاتجاه الوارد. مبني باستخدام FastAPI + httpx.
وكيل شفاف لإخفاء معلومات التعريف الشخصية (PII) لحركة مرور واجهة برمجة تطبيقات نماذج اللغة الكبيرة (LLM). يجلس بين تطبيقك وموفر LLM، حيث يقوم بإخفاء البيانات الحساسة باستخدام أسماء مستعارة (pseudonymization) في طريق الخروج، وإعادتها إلى حالتها الأصلية في طريق العودة.
لا يرى LLM الخاص بك أبدًا الأسماء الحقيقية أو رسائل البريد الإلكتروني أو عناوين IP أو النطاقات - بل يعمل بالكامل مع أسماء مستعارة منظمة مثل [email protected]. يحصل تطبيقك على القيم الأصلية مرة أخرى، بشفافية تامة.
عند استخدام LLMs لعمليات الأمن، أو الاستجابة للحوادث، أو أي مهمة تتضمن بيانات حقيقية للعملاء، فإنك تخاطر بإرسال معلومات التعريف الشخصية (PII) إلى واجهات برمجة تطبيقات طرف ثالث. يحل هذا الوكيل تلك المشكلة عن طريق:
# 1. أنشئ ملف التهيئة الخاص بك
cp config.json.example config.json
# قم بتعديل config.json بإضافة نطاقاتك الداخلية، الكيانات المعروفة، إلخ.
# 2. شغّل باستخدام Docker
docker build -t llm-token-proxy .
docker run -p 8090:8080 -v ./config.json:/app/config.json llm-token-proxy
# 3. وجّه تطبيقك إلى الوكيل
export ANTHROPIC_BASE_URL=http://localhost:8090/session/my-session/
هذا كل شيء. أصبحت استدعاءات واجهة برمجة تطبيقات Anthropic تمر الآن عبر الوكيل مع إخفاء معلومات التعريف الشخصية.

تيار نموذجي: تطبيق → وكيل الرموز (إخفاء PII) → واجهة برمجة تطبيقات LLM (أسماء مستعارة فقط) → وكيل الرموز (استعادة الأصول) → تطبيق
admin من [email protected])الأسماء المستعارة حتمية داخل الجلسة - نفس القيمة الحقيقية تتوافق دائمًا مع نفس الاسم المستعار.
عندما يقوم LLM بتحليل سجلات الأمن، فإن مزود الاستضافة والموقع الجغرافي لعنوان IP مهمان - تسجيل الدخول من عنوان IP لـ Hetzner في ألمانيا يحكي قصة مختلفة عن تسجيل الدخول من مزود خدمة إنترنت سكني في الولايات المتحدة. الاستبدال الساذج بعناوين IP من نطاق التوثيق (مثل 198.51.100.x) يدمر هذا السياق.
مع قاعدة بيانات MaxMind GeoLite2-ASN الاختيارية، يستبدل الوكيل عناوين IP الحقيقية بعنوان IP مختلف من نفس ASN والشبكة الفرعية. يرى LLM عنوان IP يبدو حقيقيًا ويتحول إلى نفس مزود الاستضافة والموقع الجغرافي التقريبي - لكنه ليس العنوان الفعلي.
10.99.99.x (لا يوجد سياق ASN للحفاظ عليه)198.51.100.x (نطاق التوثيق)يتم اختيار عنوان IP المانح بشكل حتمي عبر HMAC مع ملح خاص بالجلسة، بحيث يتم تعيين نفس عنوان IP الحقيقي دائمًا إلى نفس المانح داخل الجلسة، لكن الجلسات المختلفة تنتج تعيينات مختلفة.
يأتي الوكيل مع config.json فارغ - لا توجد قوائم كلمات مدمجة أو افتراضات خاصة بالمجال. تم ضبط config.json.example المرفق لـ عمليات الأمن مع Microsoft Sentinel و Entra ID (أكثر من 8,000 اسم جدول/عمود لـ KQL، مصطلحات إذن Graph API، نطاقات مرجعية أمنية). إذا كان ذلك يتوافق مع حالة الاستخدام الخاصة بك، فانسخ ما تحتاجه منه. إذا كنت تستخدم الوكيل لمجال مختلف (الرعاية الصحية، القانوني، المالي، إلخ)، فابدأ من التهيئة الفارغة وقم ببناء قوائمك الخاصة.
config.json{
"internal_domains": ["yourcompany.com"],
"partner_domains": ["partnercorp.com"],
"internal_ip_ranges": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],
"known_persons": ["John Smith"],
"known_orgs": ["YourCompany"],
"known_hostnames": ["DC01", "FS01"],
"ner_enabled": true,
"ner_skiplist": [],
"redaction_enabled": true
}
_internal_)spacy + en_core_web_sm)false، يصبح الوكيل مجرد تمرير نقيfalse، تمر النطاقات دون تعديل (لا يزال يتم إخفاء رسائل البريد الإلكتروني وعناوين IP والأسماء). مفيد عندما تحمل أسماء النطاقات سياقًا مهمًا لـ LLM (مثل التمييز بين outlook.com و protonmail.com) ولا تعتبر حساسة.إدارة القوائم البيضاء وتشغيل/إيقاف الإخفاء دون إعادة التشغيل:
# عرض جميع القوائم البيضاء
curl http://localhost:8090/token-proxy/config/whitelist
# إضافة مصطلحات إلى قائمة تخطي NER (يقلل النتائج الإيجابية الخاطئة)
curl -X POST http://localhost:8090/token-proxy/config/whitelist \
-H "Content-Type: application/json" \
-d '{"category": "ner_skiplist", "values": ["EvoSTS", "Hetzner"]}'
# إضافة نطاقات إلى القائمة المسموح بها (لا يتم إخفاءها أبدًا)
curl -X POST http://localhost:8090/token-proxy/config/whitelist \
-H "Content-Type: application/json" \
-d '{"category": "domain_allowlist", "values": ["github.com"]}'
# تعطيل الإخفاء (وضع التمرير)
curl -X POST http://localhost:8090/token-proxy/config/status \
-H "Content-Type: application/json" \
-d '{"redaction_enabled": false}'
فئات القائمة البيضاء: ner_skiplist، domain_allowlist، known_persons، known_orgs، known_hostnames
تفحص ما يفعله الوكيل في الوقت الفعلي:
# عرض الجلسات النشطة
curl http://localhost:8090/token-proxy/sessions
# عرض تعيينات الأسماء المستعارة لجلسة
curl http://localhost:8090/token-proxy/sessions/{session_id}/mappings
# عرض سجل نشاط الإخفاء
curl http://localhost:8090/token-proxy/sessions/{session_id}/log
# البحث في التعيينات
curl http://localhost:8090/token-proxy/sessions/{session_id}/search?q=admin
# عرض البيانات الملتقطة (ما رآه LLM بالفعل)
curl http://localhost:8090/token-proxy/sessions/{session_id}/payloads
# استخدام الرموز لجلسة (رموز الإدخال/الإخراج عبر جميع الطلبات)
curl http://localhost:8090/token-proxy/sessions/{session_id}/usage
# إحصائيات عامة (تشمل total_tokens عبر جميع الجلسات)
curl http://localhost:8090/token-proxy/stats
يسجل الوكيل input_tokens و output_tokens لكل طلب يقوم بتوجيهه - سواء كان غير متدفق (يُقرأ من كائن usage في الرد) أو متدفق (يُحلل من أحداث SSE message_start و message_delta). نظرًا لأن الوكيل يجلس بين تطبيقك و LLM، تحصل على نقطة اختناق واحدة لقياس الاستهلاك عبر جميع العملاء الذين يشاركونه، دون الحاجة إلى إضافة أجهزة قياس لكل عميل على حدة.
curl http://localhost:8090/token-proxy/sessions/my-session/usage
# {
# "session_id": "my-session",
# "request_count": 3,
# "input_tokens": 1240,
# "output_tokens": 587
# }
curl http://localhost:8090/token-proxy/stats | jq .total_tokens
# { "input_tokens": 48213, "output_tokens": 19044 }
يتم تضمين استخدام كل طلب أيضًا في /token-proxy/sessions/{session_id}/log تحت usage_counts. يتم تتبع أعداد الرموز الأولية فقط - يُترك التسعير للمتصل.
يدعم الوكيل تدفق SSE (stream: true). يتم استعادة الأسماء المستعارة في الوقت الفعلي باستخدام نهج المخزن المؤقت الذيل (tail-buffer) الذي يتعامل مع الأسماء المستعارة المقسمة عبر أجزاء SSE.
يستخدم الوكيل نمط محول الموفر (provider adapter pattern). يدعم حاليًا:
/v1/messages)انظر CONTRIBUTING.md لكيفية إضافة دعم لموفرين إضافيين (OpenAI، Google Gemini، إلخ).
en_core_web_sm) أسماء الأشخاص/المؤسسات الإنجليزية. قد يتم فقدان الأسماء بلغات أخرى ما لم يتم إضافتها إلى known_persons/known_orgs في التهيئة.admin [at] acme.com، أرقام الهواتف، العناوين الفعلية). تم ضبط خط أنابيب الكشف على البيانات الهيكلية لتكنولوجيا المعلومات/الأمن./token-proxy/config/* و /token-proxy/sessions/* ليس لديها مصادقة. الوكيل مصمم للشبكات الموثوقة/الداخلية - لا تعرض نقاط النهاية هذه لشبكات غير موثوقة.# تثبيت تبعيات التطوير
pip install -e ".[dev,ner]"
python -m spacy download en_core_web_sm
# تشغيل الاختبارات
pytest
# التدقيق اللغوي
ruff check token_proxy/ tests/
Apache 2.0 — انظر LICENSE.
| نوع الكيان | مثال داخلي | مثال خارجي |
|---|
| بريد إلكتروني | [email protected] | [email protected] |
| نطاق | domain-internal-001.com | domain-external-001.net |
| عنوان IP | 10.99.99.1 (RFC1918) | عنوان IP مانح واعي بـ ASN (انظر أدناه) |
| شخص | person_internal_001 | person_external_001 |
| مؤسسة | org_internal_001 | org_external_001 |
| اسم مضيف | host_001 | host_001 |
| المتغير | القيمة الافتراضية | الغرض |
|---|
ANTHROPIC_API_BASE | https://api.anthropic.com | عنوان URL لواجهة برمجة تطبيقات Anthropic الأعلى |
TOKEN_PROXY_CONFIG_PATH | /app/config.json | مسار ملف التهيئة |
LOG_LEVEL | info | مستوى التسجيل |
GEOIP_ASN_DB_PATH | /app/data/GeoLite2-ASN.mmdb | قاعدة بيانات MaxMind GeoLite2-ASN (اختياري) |