
OpenAI-संगत LLM को tokenizer और व्यवहार संकेतों से फ़िंगरप्रिंट करें।

OpenAI-संगत चैट एंडपॉइंट के पीछे मौजूद सर्विंग स्टैक की फिंगरप्रिंट बनाता है।
यह टोकनाइज़र अकाउंटिंग, छिपे हुए टेम्पलेट ऑफ़सेट, वैलिडेशन प्रोज़, JSON/SSE आकार, रोल स्वीकृति, नामित सीमाएँ, और गेटवे हेडर रिकॉर्ड करता है। यह वेट्स लोड नहीं करता, API कुंजियाँ संग्रहीत नहीं करता, और मॉडल से यह नहीं पूछता कि वह कौन है।
| Import | lm_fingerprint |
| CLI | lm-fingerprint |
| What | /chat/completions के विरुद्ध संस्करणित इन्फ्रास्ट्रक्चर प्रोब। ऑफ़लाइन सिंथेटिक लाइब्रेरी। स्थानीय Hugging Face टोकनाइज़र सत्यापन (वेट्स रहित)। |
| What it is not | ग्रेडिएंट हमला नहीं। जेलब्रेक नहीं। एनकोड-मैप पहचान (tokprint) नहीं। "इस पोर्ट पर कौन-सी बाइनरी है" यह नहीं (Julius)। |
केवल अधिकृत उपयोग: आपके स्वामित्व वाले एंडपॉइंट, आपके नियंत्रण वाली लैब, इन-स्कोप बाउंटी, लिखित पेंटेस्ट। देखें SECURITY.md।
--api-key-envएक एनवायरनमेंट वेरिएबल का नाम देता है। कुंजी कभी लॉग नहीं होती।
OpenAI-संगत चैट एक सामान्य वायर है। vLLM, SGLang, एक लैब गेटवे, और एक
रीसेलर सभी /chat/completions बोल सकते हैं। model फ़ील्ड एक लेबल है।
होस्ट बैकएंड बदल सकता है, टोकनाइज़र को रैप कर सकता है, या सामने एक राउटर
रख सकता है। सिस्टम प्रॉम्प्ट बदलने पर पर्सनैलिटी प्रोब बदल जाते हैं।
जो स्थिर रहता है वह प्लंबिंग है: सर्वर टोकन कैसे गिनता है, कितने छिपे हुए
टेम्पलेट टोकन जोड़ता है, उसके वैलिडेटर ने क्या प्रोज़ लिखी, SSE डायलेक्ट,
कौन-से रोल स्वीकार करता है, जब max_tokens बेतुका हो तो वह कौन-सी संख्या
बताता है, Server / प्रोवाइडर हेडर।
यही वह प्रश्न है जिसका उत्तर यह टूल देता है: इस चैट पाथ को कौन-सा स्टैक संभाल रहा है? यह नहीं कि कौन-सा चेकपॉइंट, नहीं कि कौन-सी प्रोसेस पोर्ट से बंधी है, नहीं कि किसने कोई कम्प्लीशन लिखा।
ModelPrint ने ब्राउज़र में नौ प्रोब के साथ यही प्रश्न पूछा था। यह पैकेज CLI और लाइब्रेरी रूप है: संस्करणित प्रोब, एनरोल करने योग्य लाइब्रेरी, पेयरवाइज़ साक्ष्य, ड्रिफ्ट, और एक स्थानीय टोकनाइज़र पाथ जो कभी होस्टेड Inference API को कॉल नहीं करता।
फिंगरप्रिंट प्रोब values का एक संस्करणित JSON रिकॉर्ड है। जब एक ही स्टैक
को दो बार हिट किया जाए तो प्रत्येक प्रोब को वही मान लौटाना चाहिए। टाइमस्टैम्प,
रिक्वेस्ट आईडी, लेटेंसी, और कुंजियाँ हटा दी जाती हैं।
टोकनाइज़र गणनाएँ ModelPrint 1.0.0 टेक्स्ट (MIT, unclecode/modelprint) का
पुनः उपयोग करती हैं, बाइट-सटीक, एक-अक्षर "a" बेसलाइन घटाकर ताकि एक छिपा
हुआ टेम्पलेट कैंसल हो जाए। वे चार संख्याएँ एनकोड मैप (T) का एक
प्रोजेक्शन हैं। समान गणनाओं का अर्थ (T_1 \equiv T_2) नहीं है। GPT-2 और
OPT इन पर टकराते हैं; rust पाइपलाइन हैश नहीं।
hf_identity (केवल स्थानीय HF पाथ) उस पाइपलाइन कमिटमेंट के साथ-साथ
चैट-टेम्पलेट हैश का SHA-256 है। वही (T) और वही टेम्पलेट मेल खाते हैं
(tiny-gpt2 / gpt2)। यह फ़ैमिली + टेम्पलेट है, चेकपॉइंट नहीं।
लेआउट:
src/lm_fingerprint/
cli.py argparse. --api-key-env only. No --api-key.
client.py HttpTransport, InProcessTransport, redact_secrets
probes.py 38 ProbeSpec rows (tokenizer / errors / shape / roles / limits / proxy / surface)
engine.py run suite → Fingerprint
schema.py schema_version=1, probe_suite_version=lm-fingerprint-probes-v2
similarity.py weighted exact-match, coverage, confidence, library rank, drift
align.py constant-shift MAE + residual on the 15-script suite
catalog.py offline supported_parameters twins
library.py enroll / match. Packaged rows are synthetic fixtures
synthetic.py in-process stacks for tests and the shipped library
hf.py local AutoTokenizer + named validation profile. No weights
localmap.py encode-pipeline-v2 commitment (rust tokenizer.json)
proof.py measured ModelPrint 9-probe identity
report.py text reports
data/library.json
समान प्रोब सूट में दो रास्ते:
live endpoint local Hub tokenizer (optional [hf])
| |
HttpTransport.chat HfChatTransport
POST /chat/completions encode / chat_template for counts
| synthetic profile for errors/shape
+------------------+----------------------+
|
engine.run_probes
|
Fingerprint (JSON, keyless)
|
compare | match | drift | enroll
प्रोब लेखन: docs/PROBES.md। मॉड्यूल मैप: docs/ARCHITECTURE.md।
| आपके पास है | आप क्या देख सकते हैं | यह टूल क्या करता है |
|---|---|---|
| एक अधिकृत OpenAI-संगत बेस URL + कुंजी | चैट HTTP: उपयोग, त्रुटियाँ, हेडर, SSE | fingerprint / compare / match / drift |
| स्थानीय टोकनाइज़र फ़ाइलें | encode और chat_template | fingerprint-hf / verify-hf। वेट्स डिस्क पर ही रहते हैं |
| केवल एक host:port | बैनर / /health / /api/tags | दायरे से बाहर। Julius का उपयोग करें |
एक मैच साझा अवसंरचना है। एक लैब एक ही स्टैक पर दो चेकपॉइंट परोस सकती है। एक राउटर अपने स्वयं के त्रुटि रैपर के साथ उत्तर दे सकता है। गणना की सहमति (T) की पहचान नहीं है।
Python 3.10+। कोर रनटाइम मानक लाइब्रेरी है।
git clone https://gitlab.com/WattoCyber/lm-fingerprint.git
cd lm-fingerprint
pip install -e ".[dev]"
PYTHONPATH=src python3 scripts/repro.py
REPRO_OK की अपेक्षा करें। वह गेट ऑफ़लाइन है: कोई GPU नहीं, कोई प्रोडक्शन API नहीं।
स्थानीय HF परीक्षण छोड़ दिए जाते हैं यदि टोकनाइज़र कैश्ड नहीं है।
pip install -e ".[hf]" # transformers, for fingerprint-hf / verify-hf
lm-fingerprint list-probes
lm-fingerprint list
list पैकेज्ड स्टैक्स प्रिंट करता है: openai-chat-strict, glm-compat,
router-openai, permissive-compat। ये फ़िक्स्चर हैं, स्क्रैप किए गए
प्रोवाइडर नहीं। नेटवर्क के बिना उनमें से दो की तुलना करें:
from lm_fingerprint.client import InProcessTransport
from lm_fingerprint.engine import fingerprint_endpoint
from lm_fingerprint.similarity import compare_fingerprints
from lm_fingerprint.synthetic import SYNTHETIC_STACKS, handler_for
def fp(stack_id):
t = InProcessTransport(handler_for(stack_id), headers=SYNTHETIC_STACKS[stack_id].headers)
return fingerprint_endpoint(t, model=f"synthetic/{stack_id}", base_url=f"inprocess://{stack_id}")
print(compare_fingerprints(fp("openai-chat-strict"), fp("router-openai"))["note"])
वही वर्ड टोकनाइज़र, अलग त्रुटियाँ और हेडर। स्कोर लगभग
0.62 पर आता है। ModelPrint के चारों काउंट मेल खाते हैं; यह टूल इसे
साझा स्टैक नहीं कहता।
lm-fingerprint fingerprint \
--base-url https://your-lab.example/v1 \
--model the-label \
--api-key-env OPENAI_API_KEY \
--out lab.json
lm-fingerprint match --fingerprint lab.json
lm-fingerprint enroll --fingerprint lab.json --stack-id my-lab --library my-lib.json
कुंजी को कमांड लाइन पर न दें। किसी सार्वजनिक लाइब्रेरी को भरने के लिए उत्पादन API को स्क्रैप न करें।