
LLM API ट्रैफ़िक के लिए एक पारदर्शी PII रिडक्शन प्रॉक्सी। एक एप्लिकेशन और एक LLM प्रदाता (वर्तमान में Anthropic) के बीच बैठता है, बाहर जाने वाले संवेदनशील डेटा को छद्मनाम करता है और अंदर आने पर इसे पुनर्स्थापित करता है। FastAPI + httpx के साथ निर्मित।
एक पारदर्शी PII रिडक्शन प्रॉक्सी जो LLM API ट्रैफ़िक के लिए है। यह आपके एप्लिकेशन और LLM प्रदाता के बीच बैठता है, बाहर जाते समय संवेदनशील डेटा को छद्मनामीकृत करता है और वापस आते समय उसे पुनर्स्थापित करता है।
आपका LLM कभी भी वास्तविक नाम, ईमेल, IP, या डोमेन नहीं देखता — यह पूरी तरह से संरचित छद्मनामों जैसे [email protected] के साथ काम करता है। आपका एप्लिकेशन मूल मानों को पारदर्शी रूप से वापस प्राप्त करता है।
जब LLMs का उपयोग सुरक्षा संचालन, घटना प्रतिक्रिया, या वास्तविक ग्राहक डेटा से जुड़े किसी कार्य के लिए किया जाता है, तो आप तृतीय-पक्ष APIs को PII भेजने का जोखिम उठाते हैं। यह प्रॉक्सी इसे इस प्रकार हल करता है:
# 1. Create your config
cp config.json.example config.json
# Edit config.json with your internal domains, known entities, etc.
# 2. Run with Docker
docker build -t llm-token-proxy .
docker run -p 8090:8080 -v ./config.json:/app/config.json llm-token-proxy
# 3. Point your application at the proxy
export ANTHROPIC_BASE_URL=http://localhost:8090/session/my-session/
बस इतना ही। आपके Anthropic API कॉल अब PII रिडैक्टेड होकर प्रॉक्सी के माध्यम से जाते हैं।

विशिष्ट प्रवाह: एप्लिकेशन → टोकन प्रॉक्सी (PII रिडक्शन) → LLM API (केवल छद्मनाम) → टोकन प्रॉक्सी (मूल मानों को पुनर्स्थापित करें) → एप्लिकेशन
[email protected] से admin)छद्मनाम एक सत्र के भीतर नियतात्मक होते हैं — वही वास्तविक मान हमेशा उसी छद्मनाम पर मैप होता है।
जब कोई LLM सुरक्षा लॉग का विश्लेषण कर रहा होता है, तो IP पते का होस्टिंग प्रदाता और भू-स्थान मायने रखता है — जर्मनी में Hetzner IP से लॉगिन अमेरिका में एक आवासीय ISP से लॉगिन से भिन्न कहानी बताता है। दस्तावेज़ीकरण-श्रेणी के IPs (जैसे, 198.51.100.x) से निष्प्रभावी प्रतिस्थापन इस संदर्भ को नष्ट कर देता है।
वैकल्पिक MaxMind GeoLite2-ASN डेटाबेस के साथ, प्रॉक्सी वास्तविक IP को उसी ASN और सबनेट से एक अलग IP से बदल देता है। 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 से अलग करना) और संवेदनशील नहीं माने जाते।पुनरारंभ किए बिना श्वेतसूची प्रबंधित करें और रिडक्शन टॉगल करें:
# View all whitelists
curl http://localhost:8090/token-proxy/config/whitelist
# Add terms to NER skiplist (reduces false positives)
curl -X POST http://localhost:8090/token-proxy/config/whitelist \
-H "Content-Type: application/json" \
-d '{"category": "ner_skiplist", "values": ["EvoSTS", "Hetzner"]}'
# Add domains to allowlist (never pseudonymize these)
curl -X POST http://localhost:8090/token-proxy/config/whitelist \
-H "Content-Type: application/json" \
-d '{"category": "domain_allowlist", "values": ["github.com"]}'
# Disable redaction (pass-through mode)
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
प्रॉक्सी वास्तविक समय में क्या कर रहा है, इसका निरीक्षण करें:
# List active sessions
curl http://localhost:8090/token-proxy/sessions
# View pseudonym mappings for a session
curl http://localhost:8090/token-proxy/sessions/{session_id}/mappings
# View redaction activity log
curl http://localhost:8090/token-proxy/sessions/{session_id}/log
# Search mappings
curl http://localhost:8090/token-proxy/sessions/{session_id}/search?q=admin
# View captured payloads (what the LLM actually saw)
curl http://localhost:8090/token-proxy/sessions/{session_id}/payloads
# Token usage for a session (input/output tokens across all requests)
curl http://localhost:8090/token-proxy/sessions/{session_id}/usage
# Global statistics (includes total_tokens across all sessions)
curl http://localhost:8090/token-proxy/stats
प्रॉक्सी प्रत्येक अनुरोध के लिए input_tokens और output_tokens रिकॉर्ड करता है जिसे वह अग्रेषित करता है — दोनों नॉन-स्ट्रीमिंग (प्रतिक्रिया usage ऑब्जेक्ट से पढ़ा गया) और स्ट्रीमिंग (message_start और message_delta SSE इवेंट से पार्स किया गया)। क्योंकि प्रॉक्सी आपके एप्लिकेशन और 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) का समर्थन करता है। छद्मनामों को टेल-बफ़र दृष्टिकोण का उपयोग करके वास्तविक समय में पुनर्स्थापित किया जाता है जो SSE चंक्स में विभाजित छद्मनामों को संभालता है।
प्रॉक्सी एक प्रदाता अनुकूलक पैटर्न का उपयोग करता है। वर्तमान में समर्थन करता है:
/v1/messages)अतिरिक्त प्रदाताओं (OpenAI, Google Gemini, आदि) के लिए समर्थन कैसे जोड़ें, यह देखने के लिए CONTRIBUTING.md देखें।
en_core_web_sm) अंग्रेज़ी व्यक्ति/संगठन नामों का पता लगाता है। अन्य भाषाओं के नाम छूट सकते हैं जब तक कि कॉन्फ़िग में known_persons/known_orgs में न जोड़े जाएँ।admin [at] acme.com, फ़ोन नंबर, भौतिक पते) नहीं पकड़े जाएंगे। डिटेक्शन पाइपलाइन संरचित IT/सुरक्षा डेटा के लिए ट्यून की गई है।/token-proxy/config/* और /token-proxy/sessions/* एंडपॉइंट्स में कोई प्रमाणीकरण नहीं है। प्रॉक्सी विश्वसनीय/आंतरिक नेटवर्क के लिए डिज़ाइन किया गया है — इन एंडपॉइंट्स को अविश्वसनीय नेटवर्क में उजागर न करें।# Install dev dependencies
pip install -e ".[dev,ner]"
python -m spacy download en_core_web_sm
# Run tests
pytest
# Lint
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) | ASN-जागरूक दाता IP (नीचे देखें) |
| व्यक्ति | person_internal_001 | person_external_001 |
| संगठन | org_internal_001 | org_external_001 |
| होस्टनाम | host_001 | host_001 |
| चर | डिफ़ॉल्ट | उद्देश्य |
|---|
ANTHROPIC_API_BASE | https://api.anthropic.com | अपस्ट्रीम Anthropic API URL |
TOKEN_PROXY_CONFIG_PATH | /app/config.json | कॉन्फ़िग फ़ाइल का पथ |
LOG_LEVEL | info | लॉगिंग स्तर |
GEOIP_ASN_DB_PATH | /app/data/GeoLite2-ASN.mmdb | MaxMind GeoLite2-ASN डेटाबेस (वैकल्पिक) |