
ध्वनि-आधारित जासूसी पूछताछ गेम। Mistral Large 3 + Voxtral STT + ElevenLabs TTS। Mistral Worldwide Hackathon 2026 के लिए निर्मित।

एक आवाज-आधारित जासूसी पूछताछ खेल। आप एक जासूस हैं। Mistral एक संदिग्ध है जो झूठ बोल रहा है। आपका काम केवल पूछताछ के माध्यम से झूठ को पकड़ना है।
हर मामला प्रक्रियात्मक रूप से उत्पन्न होता है — एक अनोखा श्वेत-कॉलर अपराध, संदिग्ध, कवर स्टोरी, और एक छिपा हुआ झूठ। संदिग्ध को Mistral Large द्वारा निभाया जाता है, जिसे पूरी पृष्ठभूमि दी जाती है और प्रतिकूल दबाव में इसका बचाव करने का निर्देश दिया जाता है। कोई भी दो मामले समान नहीं हैं।
Mistral वैश्विक हैकाथॉन 2026 (ऑनलाइन ट्रैक) के लिए बनाया गया।
"Mistral तर्क कर सकता है। मैंने इसे झूठ बोलने के लिए बनाया। आपका काम इसे पकड़ना है।"
AI को कभी स्वीकार न करने का निर्देश दिया जाता है, अधिकतम तनाव पर भी। आप एक विशिष्ट, सटीक आरोप लगाकर जीतते हैं — संदिग्ध को टूटने देने से नहीं।
npm install
cp .env.example .env # Fill in your API keys
npm run dev # http://localhost:3000
MISTRAL_API_KEY= # आवश्यक — मामला निर्माण, पूछताछ, मूल्यांकन, STT
ELEVENLABS_API_KEY= # आवश्यक — संदिग्ध आवाज के लिए TTS
ELEVENLABS_VOICE_ID= # वैकल्पिक — विशिष्ट ElevenLabs आवाज ID
NEXT_PUBLIC_SUPABASE_URL= # आवश्यक — Supabase प्रोजेक्ट URL
NEXT_PUBLIC_SUPABASE_ANON_KEY= # आवश्यक — Supabase anon कुंजी (RLS-सुरक्षित)
SUPABASE_SERVICE_ROLE_KEY= # वैकल्पिक — एडमिन निर्यात एंडपॉइंट
EXPORT_SECRET= # वैकल्पिक — एडमिन निर्यात प्रमाणीकरण
API कुंजियों को सेटिंग पेज पर रनटाइम पर भी कॉन्फ़िगर किया जा सकता है — ऐप बिना कुंजी के शिप होता है और खिलाड़ी अपनी कुंजियाँ लाते हैं।
npm run dev # Dev सर्वर
npm run build # प्रोडक्शन बिल्ड
npm run start # प्रोडक्शन सर्वर
npm run lint # ESLint
| स्तर | सुराग | समय | संदिग्ध व्यवहार |
|---|---|---|---|
| आसान | 2 | 5 मिनट | स्पष्ट झूठ, घबराया हुआ |
| मध्यम | 3 | 7 मिनट | पकड़ने योग्य झूठ, संयमित |
| कठिन | 4 | 9 मिनट | सूक्ष्म झूठ, कुशल विक्षेपक |
| विशेषज्ञ | 5 | 10 मिनट | गहरा दबा झूठ, चालाक |
एक असीमित समय मोड भी उपलब्ध है — कठिन/विशेषज्ञ पर, लगातार 4 उच्च-तनाव आदान-प्रदान के बाद संदिग्ध वकील लाएगा।
सुराग तनाव थ्रेसहोल्ड पर अनलॉक होते हैं जो 1–9 में फैले होते हैं, जो निम्न द्वारा गेटेड होते हैं:
आरोप बटन तभी अनलॉक होता है जब सभी आवश्यक सुराग एकत्र कर लिए जाते हैं।
score = timeScore x difficultyMultiplier x efficiencyBonus x hintPenalty x accusationPenalty
timeScore = 1000 x sqrt(max(0, 1 - elapsed / (parTime x 2)))
multiplier = easy 1.0x, medium 1.5x, hard 2.0x, expert 2.5x
efficiencyBonus = 1.0-1.5x (fewer questions than par = bonus)
hintPenalty = 0.85^hintsUsed
accusePenalty = max(0, 1 - wrongAccusations x 0.1)
स्कोर की गणना सर्वर-साइड जीत के समय फ्रोजन स्टैट्स से की जाती है — क्लाइंट मानों को अनदेखा किया जाता है।
app/
├── page.tsx # शीर्षक स्क्रीन
├── cases/ # मामला चयन — स्थान + कठिनाई
├── game/
│ ├── page.tsx # मुख्य गेम ऑर्केस्ट्रेटर
│ ├── hooks/ # useVoiceRecorder, useTTS, useGameTimer, useSfx, useSettings
│ ├── components/ # Dock, TopBar, CaseFile, SuspectZone, BriefingScreen, dialogs
│ ├── win/ # जीत स्क्रीन + InitialsEntry
│ └── lose/ # हार स्क्रीन
├── leaderboard/ # शीर्ष 20, नई-प्रविष्टि एनिमेशन
├── settings/ # API कुंजी कॉन्फ़िग, निर्यात, प्राथमिकताएँ
├── help/ # कैसे खेलें, स्कोरिंग, बारे में
├── about/ # निर्माता जानकारी
└── api/
├── generate-case/ # GET — Mistral मामला निर्माण
├── interrogate/ # POST — खिलाड़ी प्रश्न → संदिग्ध प्रतिक्रिया
├── accuse/ # POST — आरोप मूल्यांकन (अलग जज)
├── evaluate/ # POST — जीत/हार विश्लेषण
├── hint/ # POST — अस्पष्ट तनाव ट्रिगर संकेत
├── tts/ # POST — ElevenLabs TTS
├── transcribe/ # POST — Voxtral STT
├── leaderboard/ # GET/POST — Supabase लीडरबोर्ड
├── patterns/ # GET/POST — क्रॉस-सेशन सीखने के पैटर्न
└── export/ # GET — एडमिन JSONL निर्यात
src/lib/
├── mistral/ # Mistral क्लाइंट, पूछताछ, मूल्यांकन, मामला निर्माण, एम्बेडिंग्स
├── game-session.ts # सर्वर-साइड सत्र भंडार, जीत टोकन, निर्यात
├── game-state.ts # प्रकार परिभाषाएँ
├── scoring.ts # स्कोर गणना + जासूस रेटिंग्स
├── sanitize.ts # इनपुट सत्यापन, इंजेक्शन पहचान
├── db.ts # Supabase क्लाइंट
└── rate-limit.ts # प्रति-IP दर सीमित करना
यह गेम खिलाड़ी इनपुट के खिलाफ प्रतिकूल AI चलाता है — सुरक्षा एक मुख्य विशेषता है, बाद में सोची गई चीज़ नहीं।
इनपुट सैनिटाइज़ेशन: 30+ regex इंजेक्शन पैटर्न, यूनिकोड सामान्यीकरण (NFKD), शून्य-चौड़ाई वर्ण स्ट्रिपिंग, base64 पेलोड पहचान, अर्थहीन/गैर-अंग्रेज़ी अवरोधन।
आउटपुट स्कैनिंग: AI प्रतिक्रियाओं को केस रहस्यों के खिलाफ फ़ज़ी मैचिंग (40% थ्रेसहोल्ड, स्टॉप-वर्ड फ़िल्टर्ड) के साथ जाँचा जाता है। लीक हुई प्रतिक्रियाओं को डिफ्लेक्शन से बदल दिया जाता है।
जज पृथक्करण: आरोप मूल्यांकन एक अलग Mistral कॉल का उपयोग करता है जिसमें समर्पित सिस्टम प्रॉम्प्ट, यादृच्छिक बाउंड्री टोकन, स्ट्रिप्ड इंजेक्शन मार्कर होते हैं। जज कॉल कभी भी खिलाड़ी-प्रदत्त API कुंजियों का उपयोग नहीं करते हैं।
तनाव प्रवर्तन: सर्वर-साइड मोनोटोनिक क्लैम्पिंग — तनाव केवल ऊपर जाता है, प्रति बारी अधिकतम +1। सुराग थ्रेसहोल्ड सर्वर-प्रवर्तित होते हैं। AI गेम गेट्स पर तनाव को बढ़ा या घटा नहीं सकता है।
जीत टोकन: 128-बिट रैंडम, टाइमिंग-सुरक्षित तुलना, एकल-उपयोग, 30-मिनट TTL। स्कोर की गणना सर्वर-साइड स्टैट्स स्नैपशॉट से की जाती है — क्लाइंट-रिपोर्ट किए गए मानों को अनदेखा किया जाता है।
सत्र सुरक्षा: 192-बिट रैंडम ID, म्यूटेक्स लॉक, 1-घंटे TTL, LRU निष्कासन के साथ अधिकतम 5000 सत्र। टाइमर मोड निर्माण पर पिन किया जाता है।
TTS सत्यापन: सक्रिय सत्र आवश्यक है। टेक्स्ट एक हालिया सहायक संदेश से मेल खाना चाहिए। मुफ्त TTS प्रॉक्सी दुरुपयोग को रोकता है।
RAG विषाक्तता रक्षा: क्रॉस-सेशन सीखी गई रणनीतियों को प्रॉम्प्ट में शामिल करने से पहले इंजेक्शन पहचान और सैनिटाइज़ेशन के माध्यम से फ़िल्टर किया जाता है।