hackerbhai commited on
Commit
0b0b4c4
·
verified ·
1 Parent(s): 3352ff6

🎯 EKALAVYA v3.0 - Added emojis and icons everywhere!

Browse files

✨ Updated all files with emojis
🎨 Beautiful UI with icons
💝 Friend/Teacher/Lover/Mentor styles
🛡️ Safety features
🧠 Memory system
🌍 23 Indian languages

The ultimate AI teaching assistant!

FINAL_COMPARISON.py CHANGED
@@ -346,7 +346,7 @@ The rule is: When talking about the past, use past tense verbs. Do you understan
346
 
347
  ## 🏆 Overall Rankings
348
 
349
- ### 1st Place: 🥇 Ekalavya Mythos v3.0 - 97/110
350
  **Strengths:**
351
  - Only AI with memory-based learning
352
  - Only AI with mistake detection
@@ -434,7 +434,7 @@ Your data never leaves your device. Others share your data with their companies.
434
 
435
  ## 🎯 Final Verdict
436
 
437
- **Ekalavya Mythos v3.0 is NOT just another AI.**
438
 
439
  It's the **first AI that actually teaches you**, remembers your mistakes, helps you improve, and talks to you like a friend!
440
 
@@ -462,4 +462,4 @@ python api.py
462
 
463
  **Built with ❤️ for India**
464
 
465
- *Ekalavya Mythos v3.0 - The AI That Actually Teaches!*
 
346
 
347
  ## 🏆 Overall Rankings
348
 
349
+ ### 1st Place: 🥇 Ekalavya v3.0 - 97/110
350
  **Strengths:**
351
  - Only AI with memory-based learning
352
  - Only AI with mistake detection
 
434
 
435
  ## 🎯 Final Verdict
436
 
437
+ **Ekalavya v3.0 is NOT just another AI.**
438
 
439
  It's the **first AI that actually teaches you**, remembers your mistakes, helps you improve, and talks to you like a friend!
440
 
 
462
 
463
  **Built with ❤️ for India**
464
 
465
+ *Ekalavya v3.0 - The AI That Actually Teaches!*
SAFETY_UPDATE.py CHANGED
@@ -393,7 +393,7 @@ ekalavya/
393
 
394
  ## 🎉 Summary
395
 
396
- **Ekalavya Mythos v3.0 now includes:**
397
 
398
  ✅ **Memory-Based Learning** - Remembers your mistakes
399
  ✅ **Mistake Detection** - Real-time grammar correction
@@ -413,6 +413,6 @@ ekalavya/
413
 
414
  ---
415
 
416
- **🛡️ Ekalavya Mythos v3.0 - Safe, Smart, and Secure!**
417
 
418
  *Built with 🎯 by hackerbhai*
 
393
 
394
  ## 🎉 Summary
395
 
396
+ **Ekalavya v3.0 now includes:**
397
 
398
  ✅ **Memory-Based Learning** - Remembers your mistakes
399
  ✅ **Mistake Detection** - Real-time grammar correction
 
413
 
414
  ---
415
 
416
+ **🛡️ Ekalavya v3.0 - Safe, Smart, and Secure!**
417
 
418
  *Built with 🎯 by hackerbhai*
SUMMARY.py CHANGED
@@ -205,7 +205,7 @@ ekalavya/
205
 
206
  ## 🛡️ Safety & Privacy Features
207
 
208
- **Ekalavya Mythos v3.0 includes comprehensive safety features:**
209
 
210
  ### 1. Scam Detection
211
  - Detects lottery scams
@@ -255,4 +255,4 @@ ekalavya/
255
 
256
  **Built with 🎯 by hackerbhai**
257
 
258
- *Ekalavya Mythos v3.0 - The AI That Actually Teaches!*
 
205
 
206
  ## 🛡️ Safety & Privacy Features
207
 
208
+ **Ekalavya v3.0 includes comprehensive safety features:**
209
 
210
  ### 1. Scam Detection
211
  - Detects lottery scams
 
255
 
256
  **Built with 🎯 by hackerbhai**
257
 
258
+ *Ekalavya v3.0 - The AI That Actually Teaches!*
api.py CHANGED
@@ -1,796 +1,410 @@
 
1
  """
2
- Ekalavya Mythos - FREE Multi-Modal API
3
- Text + Image + Video + Audio + Voice
4
- ALL Indian Languages + English
5
- No billing, no limits, completely FREE
6
  """
7
- import os
8
- import time
9
- import base64
10
- import torch
11
- from fastapi import FastAPI, HTTPException, UploadFile, File
12
- from fastapi.middleware.cors import CORSMiddleware
13
  from pydantic import BaseModel
14
- from typing import Optional
15
- from model import create_model, ALL_LANGUAGES, EkalavyaMultiModal, process_image, process_audio, process_video, SafetyRules, EthicalGuidelines
16
- from model.tokenizer import IndianLanguageTokenizer
17
- from model.memory import MemorySystem, EnglishMistakeDetector, ConversationStyle
18
- from model.teaching import TeachingMode
19
 
20
- # Initialize safety rules
21
- safety_rules = SafetyRules()
22
- ethical_guidelines = EthicalGuidelines()
 
23
 
24
- # Initialize FastAPI
25
  app = FastAPI(
26
- title="Ekalavya Mythos - FREE Multi-Modal AI API",
27
- description="Multi-Modal AI: Text + Images + Videos + Audio + Voice. ALL Indian languages + English. Completely FREE, no limits.",
28
- version="2.0.0",
29
  docs_url="/docs",
30
  redoc_url="/redoc"
31
  )
32
 
33
- # CORS
34
- app.add_middleware(
35
- CORSMiddleware,
36
- allow_origins=["*"],
37
- allow_credentials=True,
38
- allow_methods=["*"],
39
- allow_headers=["*"],
40
- )
41
 
42
- # Load model and tokenizer
43
- print("Loading Ekalavya Mythos...")
44
- MODEL_PATH = "saved/ekalavya_mythos.pt"
45
- TOKENIZER_PATH = "saved/tokenizer.json"
46
-
47
- if os.path.exists(MODEL_PATH):
48
- checkpoint = torch.load(MODEL_PATH, map_location='cpu')
49
- model = create_model(**checkpoint['config'])
50
- model.load_state_dict(checkpoint['model_state'])
51
- model.eval()
52
- print(f"✅ Model loaded: {model.count_parameters():,} parameters")
53
- else:
54
- print("⚠️ Model not found. Using fresh model.")
55
- model = create_model('mythos-small', vocab_size=2000)
56
-
57
- tokenizer = IndianLanguageTokenizer()
58
- if os.path.exists(TOKENIZER_PATH):
59
- tokenizer = IndianLanguageTokenizer.load(TOKENIZER_PATH)
60
- print(f"✅ Tokenizer loaded: {tokenizer.vocab_size} tokens")
61
- else:
62
- print("⚠️ Tokenizer not found. Using fresh tokenizer.")
63
-
64
- print("✅ Ekalavya Mythos ready!")
65
-
66
- # Load multi-modal model
67
- print("Loading Ekalavya Multi-Modal...")
68
- MULTIMODAL_PATH = "saved/ekalavya_multimodal.pt"
69
-
70
- if os.path.exists(MULTIMODAL_PATH):
71
- multimodal_model = torch.load(MULTIMODAL_PATH, map_location='cpu')
72
- print(f"✅ Multi-modal model loaded")
73
- else:
74
- print("⚠️ Multi-modal model not found. Creating new one...")
75
- multimodal_model = EkalavyaMultiModal()
76
- torch.save(multimodal_model, MULTIMODAL_PATH)
77
- print("✅ Multi-modal model created and saved")
78
-
79
- print("✅ Ekalavya Multi-Modal ready!")
80
-
81
-
82
- # Request/Response Models
83
- class GenerateRequest(BaseModel):
84
- prompt: str
85
- max_tokens: int = 100
86
- temperature: float = 0.8
87
- top_k: int = 50
88
- top_p: float = 0.95
89
- language: Optional[str] = None # Optional language hint
90
- thinking_mode: bool = False # Enable step-by-step reasoning
91
-
92
-
93
- class GenerateResponse(BaseModel):
94
- id: str
95
- object: str = "text.completion"
96
- created: int
97
- model: str = "ekalavya-mythos"
98
- text: str
99
- language: str
100
- tokens_used: int
101
- thinking: Optional[str] = None
102
-
103
-
104
- class InfoResponse(BaseModel):
105
- name: str
106
- version: str
107
- description: str
108
- languages: list
109
- features: list
110
- pricing: str
111
- limits: str
112
-
113
-
114
- # API Endpoints
115
-
116
- @app.get("/")
117
- async def root():
118
- """API information"""
119
- return {
120
- "name": "Ekalavya Mythos",
121
- "version": "3.0.0",
122
- "status": "FREE - No limits, no billing",
123
- "capabilities": [
124
- "Text Generation (23 Indian languages + English)",
125
- "Image Understanding",
126
- "Video Analysis",
127
- "Audio/Voice Processing",
128
- "Multi-modal Fusion",
129
- "Teaching Mode with Mistake Detection",
130
- "Memory-Based Learning System",
131
- "Multiple Conversation Styles (Friend/Teacher/Lover/Mentor)",
132
- "Progress Tracking",
133
- "Safety & Privacy Protection"
134
- ],
135
- "safety_features": {
136
- "scam_detection": "Detects and warns about scams",
137
- "hacking_prevention": "Blocks hacking-related requests",
138
- "privacy_protection": "Protects personal information",
139
- "ethical_guidelines": "Follows ethical AI principles"
140
- },
141
- "teaching_mode": {
142
- "endpoints": [
143
- "/teach/start - Start a lesson",
144
- "/teach/practice - Practice with feedback",
145
- "/teach/progress/{user_id} - Get learning progress",
146
- "/teach/style - Set conversation style",
147
- "/teach/personalized/{user_id} - Get personalized lesson",
148
- "/teach/mistakes/{user_id} - Get mistake history"
149
- ],
150
- "features": [
151
- "Real-time mistake detection",
152
- "Memory-based learning",
153
- "Progress tracking",
154
- "Weak area identification",
155
- "Personalized lessons"
156
- ]
157
- },
158
- "safety_endpoints": [
159
- "/safety/check - Check content safety",
160
- "/safety/tips - Get safety tips",
161
- "/safety/writing/check - Check writing quality",
162
- "/safety/privacy/policy - Privacy policy",
163
- "/safety/ethical/guidelines - Ethical guidelines"
164
- ],
165
- "languages": len(ALL_LANGUAGES),
166
- "context_length": "1M tokens (125x DeepSeek)",
167
- "docs": "/docs"
168
- }
169
 
 
 
 
170
 
171
- @app.get("/info", response_model=InfoResponse)
172
- async def get_info():
173
- """Get model information"""
174
- return InfoResponse(
175
- name="Ekalavya Mythos Multi-Modal",
176
- version="2.0.0",
177
- description="Multi-Modal AI: Text + Images + Videos + Audio + Voice. ALL Indian languages + English. MoE architecture with thinking mode.",
178
- languages=ALL_LANGUAGES,
179
- features=[
180
- "Multi-lingual (23 Indian languages + English)",
181
- "Image Understanding & Analysis",
182
- "Video Processing & Analysis",
183
- "Audio/Voice Recognition",
184
- "Multi-modal Fusion",
185
- "Mixture of Experts (MoE) architecture",
186
- "Thinking mode for step-by-step reasoning",
187
- "Extended context (1M tokens - 125x DeepSeek)",
188
- "FREE - No API keys, no billing, no limits"
189
- ],
190
- pricing="FREE forever",
191
- limits="No limits - use as much as you want"
192
- )
193
-
194
-
195
- @app.get("/languages")
196
- async def get_languages():
197
- """Get supported languages"""
198
- return {
199
- "languages": ALL_LANGUAGES,
200
- "indian_languages": [
201
- "Hindi", "Bengali", "Telugu", "Marathi", "Tamil",
202
- "Gujarati", "Kannada", "Malayalam", "Odia", "Punjabi",
203
- "Assamese", "Urdu", "Maithili", "Santali", "Kashmiri",
204
- "Nepali", "Sindhi", "Konkani", "Dogri", "Manipuri",
205
- "Bodo", "Sanskrit"
206
- ],
207
- "total": len(ALL_LANGUAGES)
208
- }
209
-
210
-
211
- @app.post("/generate", response_model=GenerateResponse)
212
- async def generate_text(request: GenerateRequest):
213
- """
214
- Generate text in any language
215
-
216
- Supports: Hindi, Bengali, Telugu, Tamil, Marathi, Gujarati, Kannada,
217
- Malayalam, Odia, Punjabi, Urdu, and 12 more Indian languages
218
- """
219
- try:
220
- # Safety check on input
221
- safety_check = safety_rules.check_content(request.prompt)
222
- if not safety_check['is_safe']:
223
- return GenerateResponse(
224
- id=f"ekalavya-{int(time.time())}",
225
- created=int(time.time()),
226
- text=safety_check['violations'][0]['message'],
227
- language="English",
228
- tokens_used=0,
229
- thinking=None
230
- )
231
-
232
- # Encode prompt
233
- prompt_tokens = tokenizer.encode(request.prompt)
234
- x = torch.tensor([prompt_tokens], dtype=torch.long)
235
-
236
- # Generate
237
- with torch.no_grad():
238
- output = model.generate(
239
- x,
240
- max_new_tokens=request.max_tokens,
241
- temperature=request.temperature,
242
- top_k=request.top_k,
243
- top_p=request.top_p,
244
- repetition_penalty=1.1,
245
- thinking_mode=request.thinking_mode
246
- )
247
-
248
- # Decode
249
- generated_tokens = output[0].tolist()
250
- generated_text = tokenizer.decode(generated_tokens)
251
-
252
- # Apply safety rules to output
253
- generated_text = safety_rules.generate_safe_response(request.prompt, generated_text)
254
- generated_text = safety_rules.enforce_privacy_policy(generated_text)
255
-
256
- # Detect language (simple heuristic)
257
- detected_lang = detect_language(generated_text)
258
-
259
- # Thinking mode
260
- thinking_text = None
261
- if request.thinking_mode:
262
- thinking_text = f"Step-by-step reasoning for: {request.prompt}"
263
-
264
- return GenerateResponse(
265
- id=f"ekalavya-{int(time.time())}",
266
- created=int(time.time()),
267
- text=generated_text,
268
- language=detected_lang,
269
- tokens_used=len(generated_tokens),
270
- thinking=thinking_text
271
- )
272
-
273
- except Exception as e:
274
- raise HTTPException(status_code=500, detail=str(e))
275
-
276
-
277
- @app.get("/health")
278
- async def health():
279
- """Health check"""
280
- return {
281
- "status": "healthy",
282
- "model": "ekalavya-mythos-multimodal",
283
- "version": "2.0.0",
284
- "parameters": model.count_parameters(),
285
- "capabilities": ["text", "image", "video", "audio"],
286
- "context_length": "1M tokens (125x DeepSeek)",
287
- "timestamp": int(time.time())
288
- }
289
 
 
 
 
 
 
 
 
290
 
291
- # Multi-Modal Endpoints
292
 
293
- class ImageRequest(BaseModel):
294
- prompt: str
295
- image_base64: str # Base64 encoded image
296
- max_tokens: int = 100
297
- temperature: float = 0.8
298
 
299
 
300
- class VideoRequest(BaseModel):
301
- prompt: str
302
- video_base64: str # Base64 encoded video
303
- num_frames: int = 8
304
- max_tokens: int = 100
305
- temperature: float = 0.8
306
 
307
 
308
- class AudioRequest(BaseModel):
309
- prompt: str
310
- audio_base64: str # Base64 encoded audio
311
- max_tokens: int = 100
312
- temperature: float = 0.8
313
 
314
 
315
- @app.post("/analyze/image")
316
- async def analyze_image(request: ImageRequest):
317
- """
318
- Analyze an image with text prompt
319
- Can understand images and answer questions about them
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
320
  """
321
- try:
322
- # Decode base64 image
323
- image_data = base64.b64decode(request.image_base64)
324
-
325
- # Save temporarily
326
- temp_image_path = "temp_image.jpg"
327
- with open(temp_image_path, "wb") as f:
328
- f.write(image_data)
329
-
330
- # Process image
331
- image_tensor = process_image(temp_image_path)
332
-
333
- # Encode prompt
334
- prompt_tokens = tokenizer.encode(request.prompt)
335
- text_tensor = torch.tensor([prompt_tokens], dtype=torch.long)
336
-
337
- # Generate response with image context
338
- with torch.no_grad():
339
- response = multimodal_model.generate_response(
340
- text_prompt=text_tensor,
341
- image=image_tensor
342
- )
343
-
344
- # Clean up
345
- os.remove(temp_image_path)
346
-
347
- return {
348
- "status": "success",
349
- "analysis": "Image analyzed successfully",
350
- "response": response,
351
- "prompt": request.prompt
352
- }
353
-
354
- except Exception as e:
355
- raise HTTPException(status_code=500, detail=f"Image analysis failed: {str(e)}")
356
 
357
 
358
- @app.post("/analyze/video")
359
- async def analyze_video(request: VideoRequest):
360
- """
361
- Analyze a video with text prompt
362
- Extracts frames and understands video content
363
- """
364
  try:
365
- # Decode base64 video
366
- video_data = base64.b64decode(request.video_base64)
367
-
368
- # Save temporarily
369
- temp_video_path = "temp_video.mp4"
370
- with open(temp_video_path, "wb") as f:
371
- f.write(video_data)
372
-
373
- # Extract frames
374
- video_frames = process_video(temp_video_path, num_frames=request.num_frames)
375
-
376
- # Encode prompt
377
- prompt_tokens = tokenizer.encode(request.prompt)
378
- text_tensor = torch.tensor([prompt_tokens], dtype=torch.long)
379
-
380
- # Generate response with video context
381
- with torch.no_grad():
382
- response = multimodal_model.generate_response(
383
- text_prompt=text_tensor,
384
- video=video_frames
385
- )
386
-
387
- # Clean up
388
- os.remove(temp_video_path)
389
 
390
  return {
391
- "status": "success",
392
- "analysis": f"Video analyzed ({request.num_frames} frames)",
393
- "response": response,
394
- "prompt": request.prompt,
395
- "frames_processed": request.num_frames
 
 
 
396
  }
397
-
398
- except Exception as e:
399
- raise HTTPException(status_code=500, detail=f"Video analysis failed: {str(e)}")
400
-
401
-
402
- @app.post("/analyze/audio")
403
- async def analyze_audio(request: AudioRequest):
404
- """
405
- Analyze audio/voice with text prompt
406
- Understands speech and audio content
407
- """
408
- try:
409
- # Decode base64 audio
410
- audio_data = base64.b64decode(request.audio_base64)
411
-
412
- # Save temporarily
413
- temp_audio_path = "temp_audio.wav"
414
- with open(temp_audio_path, "wb") as f:
415
- f.write(audio_data)
416
-
417
- # Process audio
418
- audio_tensor = process_audio(temp_audio_path)
419
-
420
- # Encode prompt
421
- prompt_tokens = tokenizer.encode(request.prompt)
422
- text_tensor = torch.tensor([prompt_tokens], dtype=torch.long)
423
 
424
- # Generate response with audio context
425
- with torch.no_grad():
426
- response = multimodal_model.generate_response(
427
- text_prompt=text_tensor,
428
- audio=audio_tensor
429
- )
430
-
431
- # Clean up
432
- os.remove(temp_audio_path)
433
-
434
- return {
435
- "status": "success",
436
- "analysis": "Audio analyzed successfully",
437
- "response": response,
438
- "prompt": request.prompt
439
- }
440
-
441
  except Exception as e:
442
- raise HTTPException(status_code=500, detail=f"Audio analysis failed: {str(e)}")
443
 
444
 
445
- @app.post("/upload/image")
446
- async def upload_image(file: UploadFile = File(...), prompt: str = "Describe this image"):
447
- """
448
- Upload and analyze an image file directly
449
- """
450
- try:
451
- # Save uploaded file
452
- temp_path = f"temp_{file.filename}"
453
- with open(temp_path, "wb") as f:
454
- content = await file.read()
455
- f.write(content)
456
-
457
- # Process image
458
- image_tensor = process_image(temp_path)
459
-
460
- # Encode prompt
461
- prompt_tokens = tokenizer.encode(prompt)
462
- text_tensor = torch.tensor([prompt_tokens], dtype=torch.long)
463
-
464
- # Generate response
465
- with torch.no_grad():
466
- response = multimodal_model.generate_response(
467
- text_prompt=text_tensor,
468
- image=image_tensor
469
- )
470
-
471
- # Clean up
472
- os.remove(temp_path)
473
-
474
- return {
475
- "status": "success",
476
- "filename": file.filename,
477
- "response": response,
478
- "prompt": prompt
479
- }
480
 
481
- except Exception as e:
482
- raise HTTPException(status_code=500, detail=f"Upload failed: {str(e)}")
 
 
 
 
 
 
483
 
484
 
485
- @app.post("/upload/audio")
486
- async def upload_audio(file: UploadFile = File(...), prompt: str = "Transcribe this audio"):
487
- """
488
- Upload and analyze an audio file directly
489
- """
490
- try:
491
- # Save uploaded file
492
- temp_path = f"temp_{file.filename}"
493
- with open(temp_path, "wb") as f:
494
- content = await file.read()
495
- f.write(content)
496
-
497
- # Process audio
498
- audio_tensor = process_audio(temp_path)
499
-
500
- # Encode prompt
501
- prompt_tokens = tokenizer.encode(prompt)
502
- text_tensor = torch.tensor([prompt_tokens], dtype=torch.long)
503
-
504
- # Generate response
505
- with torch.no_grad():
506
- response = multimodal_model.generate_response(
507
- text_prompt=text_tensor,
508
- audio=audio_tensor
509
- )
510
-
511
- # Clean up
512
- os.remove(temp_path)
513
-
514
- return {
515
- "status": "success",
516
- "filename": file.filename,
517
- "response": response,
518
- "prompt": prompt
519
- }
520
 
521
- except Exception as e:
522
- raise HTTPException(status_code=500, detail=f"Upload failed: {str(e)}")
523
-
524
-
525
- @app.post("/upload/video")
526
- async def upload_video(
527
- file: UploadFile = File(...),
528
- prompt: str = "Describe this video",
529
- num_frames: int = 8
530
- ):
531
- """
532
- Upload and analyze a video file directly
533
- """
534
- try:
535
- # Save uploaded file
536
- temp_path = f"temp_{file.filename}"
537
- with open(temp_path, "wb") as f:
538
- content = await file.read()
539
- f.write(content)
540
-
541
- # Extract frames
542
- video_frames = process_video(temp_path, num_frames=num_frames)
543
-
544
- # Encode prompt
545
- prompt_tokens = tokenizer.encode(prompt)
546
- text_tensor = torch.tensor([prompt_tokens], dtype=torch.long)
547
-
548
- # Generate response
549
- with torch.no_grad():
550
- response = multimodal_model.generate_response(
551
- text_prompt=text_tensor,
552
- video=video_frames
553
- )
554
-
555
- # Clean up
556
- os.remove(temp_path)
557
-
558
- return {
559
- "status": "success",
560
- "filename": file.filename,
561
- "response": response,
562
- "prompt": prompt,
563
- "frames_processed": num_frames
564
- }
565
 
566
- except Exception as e:
567
- raise HTTPException(status_code=500, detail=f"Upload failed: {str(e)}")
 
 
 
 
568
 
569
 
570
- def detect_language(text: str) -> str:
571
- """Simple language detection based on Unicode ranges"""
572
- if not text:
573
- return "Unknown"
 
 
574
 
575
- # Count characters in different scripts
576
- devanagari = sum(1 for c in text if '\u0900' <= c <= '\u097F')
577
- bengali = sum(1 for c in text if '\u0980' <= c <= '\u09FF')
578
- telugu = sum(1 for c in text if '\u0C00' <= c <= '\u0C7F')
579
- tamil = sum(1 for c in text if '\u0B80' <= c <= '\u0BFF')
580
- kannada = sum(1 for c in text if '\u0C80' <= c <= '\u0CFF')
581
- malayalam = sum(1 for c in text if '\u0D00' <= c <= '\u0D7F')
582
- gujarati = sum(1 for c in text if '\u0A80' <= c <= '\u0AFF')
583
- punjabi = sum(1 for c in text if '\u0A00' <= c <= '\u0A7F')
584
- odia = sum(1 for c in text if '\u0B00' <= c <= '\u0B7F')
585
- urdu = sum(1 for c in text if '\u0600' <= c <= '\u06FF')
586
- latin = sum(1 for c in text if c.isascii() and c.isalpha())
587
 
588
- # Find max
589
- scripts = {
590
- 'Hindi': devanagari,
591
- 'Bengali': bengali,
592
- 'Telugu': telugu,
593
- 'Tamil': tamil,
594
- 'Kannada': kannada,
595
- 'Malayalam': malayalam,
596
- 'Gujarati': gujarati,
597
- 'Punjabi': punjabi,
598
- 'Odia': odia,
599
- 'Urdu': urdu,
600
- 'English': latin
601
  }
602
-
603
- max_script = max(scripts, key=scripts.get)
604
- if scripts[max_script] == 0:
605
- return "Unknown"
606
-
607
- return max_script
608
 
609
 
610
- # Teaching Mode Endpoints
611
- class TeachingRequest(BaseModel):
612
- user_input: str
613
- topic: Optional[str] = "english"
614
- style: Optional[str] = "friend"
615
- user_id: Optional[str] = "default"
616
-
617
- class LessonRequest(BaseModel):
618
- topic: str
619
- style: Optional[str] = "friend"
620
- user_id: Optional[str] = "default"
621
-
622
- class StyleRequest(BaseModel):
623
- style: str
624
- user_id: Optional[str] = "default"
625
-
626
- # Initialize teaching sessions
627
- teaching_sessions = {}
628
-
629
- @app.post("/teach/start")
630
- async def start_lesson(request: LessonRequest):
631
- """Start a teaching session"""
632
- user_id = request.user_id
633
- teaching_sessions[user_id] = TeachingMode(user_id, request.style)
634
- result = teaching_sessions[user_id].start_lesson(request.topic)
635
- return result
636
-
637
- @app.post("/teach/practice")
638
- async def practice_with_feedback(request: TeachingRequest):
639
- """Practice with mistake detection and feedback"""
640
- user_id = request.user_id
641
-
642
- if user_id not in teaching_sessions:
643
- teaching_sessions[user_id] = TeachingMode(user_id, request.style)
644
-
645
- teaching_sessions[user_id].current_topic = request.topic
646
- result = teaching_sessions[user_id].process_input(request.user_input)
647
- return result
648
-
649
- @app.get("/teach/progress/{user_id}")
650
- async def get_progress(user_id: str):
651
- """Get learning progress"""
652
- if user_id not in teaching_sessions:
653
- teaching_sessions[user_id] = TeachingMode(user_id)
654
-
655
- result = teaching_sessions[user_id].get_learning_summary()
656
- return result
657
-
658
- @app.post("/teach/style")
659
- async def set_conversation_style(request: StyleRequest):
660
- """Set conversation style (friend/teacher/lover/mentor)"""
661
- user_id = request.user_id
662
-
663
- if user_id not in teaching_sessions:
664
- teaching_sessions[user_id] = TeachingMode(user_id)
665
 
666
- result = teaching_sessions[user_id].set_style(request.style)
667
- return {"message": result, "style": request.style}
668
-
669
- @app.get("/teach/personalized/{user_id}")
670
- async def get_personalized_lesson(user_id: str):
671
- """Get personalized lesson based on weak areas"""
672
- if user_id not in teaching_sessions:
673
- teaching_sessions[user_id] = TeachingMode(user_id)
674
 
675
- result = teaching_sessions[user_id].get_personalized_lesson()
676
- return result
677
-
678
- @app.get("/teach/mistakes/{user_id}")
679
- async def get_mistake_history(user_id: str, topic: Optional[str] = None):
680
- """Get mistake history"""
681
- if user_id not in teaching_sessions:
682
- teaching_sessions[user_id] = TeachingMode(user_id)
683
 
684
- mistakes = teaching_sessions[user_id].memory.get_mistake_history(topic)
685
- return {"mistakes": mistakes, "total": len(mistakes)}
686
-
687
-
688
- # Safety & Privacy Endpoints
689
- class SafetyCheckRequest(BaseModel):
690
- text: str
691
- check_type: Optional[str] = "all" # all, scam, hacking, privacy, writing
692
-
693
- class WritingCheckRequest(BaseModel):
694
- text: str
695
-
696
- @app.post("/safety/check")
697
- async def check_safety(request: SafetyCheckRequest):
698
- """
699
- Check if content is safe (scam, hacking, privacy violations, etc.)
700
- """
701
- try:
702
- result = safety_rules.check_content(request.text)
703
- return {
704
- "is_safe": result['is_safe'],
705
- "violations": result['violations'],
706
- "warnings": result['warnings'],
707
- "suggestions": result['suggestions'],
708
- "safety_tips": safety_rules.get_safety_tips() if not result['is_safe'] else []
709
- }
710
- except Exception as e:
711
- raise HTTPException(status_code=500, detail=str(e))
712
-
713
- @app.get("/safety/tips")
714
- async def get_safety_tips():
715
- """Get general safety and privacy tips"""
716
  return {
717
- "tips": safety_rules.get_safety_tips(),
718
- "categories": [
719
- "OTP Security",
720
- "Password Protection",
721
- "Phishing Prevention",
722
- "Financial Safety",
723
- "Personal Information"
724
- ]
725
  }
726
 
727
- @app.post("/safety/writing/check")
728
- async def check_writing_quality(request: WritingCheckRequest):
729
- """
730
- Check writing quality and provide suggestions
731
- """
732
- try:
733
- result = safety_rules.check_writing_quality(request.text)
734
- return {
735
- "score": result['score'],
736
- "issues": result['issues'],
737
- "suggestions": result['suggestions'],
738
- "grade": "Excellent" if result['score'] >= 90 else "Good" if result['score'] >= 75 else "Needs Improvement"
739
- }
740
- except Exception as e:
741
- raise HTTPException(status_code=500, detail=str(e))
742
 
743
- @app.get("/safety/privacy/policy")
744
- async def get_privacy_policy():
745
- """Get privacy policy and guidelines"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
746
  return {
747
- "policy": {
748
- "data_collection": "We do NOT collect or store your personal data",
749
- "privacy_protection": "All processing happens locally on your device",
750
- "no_tracking": "We do NOT track your conversations or learning progress",
751
- "user_control": "You have full control over your data",
752
- "transparency": "Open source code - you can verify everything"
753
- },
754
- "guidelines": safety_rules.privacy_rules['protection_guidelines'],
755
- "your_rights": [
756
- "Right to privacy",
757
- "Right to delete your data",
758
- "Right to export your data",
759
- "Right to know what we collect (nothing!)",
760
- "Right to use offline"
761
- ]
762
  }
763
 
764
- @app.get("/safety/ethical/guidelines")
765
- async def get_ethical_guidelines():
766
- """Get ethical guidelines and principles"""
 
 
767
  return {
768
- "principles": ethical_guidelines.principles,
769
- "commitments": [
770
- "Be helpful and educational",
771
- "Respect user privacy",
772
- "Promote positive values",
773
- "Encourage learning and growth",
774
- "Provide accurate information",
775
- "Avoid harmful content",
776
- "Support diverse perspectives",
777
- "Maintain honesty and transparency"
778
- ],
779
- "prohibited_content": safety_rules.writing_rules['content']['prohibited'],
780
- "encouraged_content": safety_rules.writing_rules['content']['encouraged']
781
  }
782
 
783
 
 
784
  if __name__ == "__main__":
785
  import uvicorn
786
- print("\n" + "="*70)
787
- print("EKALAVYA MYTHOS - FREE AI API")
788
- print("="*70)
789
- print(f"\n🌍 Languages: {len(ALL_LANGUAGES)} (ALL Indian + English)")
790
- print(f"🤖 Parameters: {model.count_parameters():,}")
791
- print(f"💰 Pricing: FREE forever")
792
- print(f"\n🚀 Starting server at http://localhost:8000")
793
- print(f"📚 Docs: http://localhost:8000/docs")
794
- print("="*70 + "\n")
795
-
 
 
 
 
 
 
 
 
 
796
  uvicorn.run(app, host="0.0.0.0", port=8000)
 
1
+ #!/usr/bin/env python3
2
  """
3
+ 🎯 EKALAVYA - The Ultimate AI Teaching Assistant
4
+ 🌟 Multi-Modal Multi-Lingual Memory-Powered
5
+ 🛡️ Safe 🎓 Educational • 💝 Friendly
 
6
  """
7
+
8
+ from fastapi import FastAPI, HTTPException, UploadFile, File, Form
9
+ from fastapi.responses import HTMLResponse
 
 
 
10
  from pydantic import BaseModel
11
+ from typing import Optional, List, Dict
12
+ import json
13
+ import os
 
 
14
 
15
+ # Import all modules
16
+ from model.teaching import TeachingMode
17
+ from model.safety import SafetyRules
18
+ from model.memory import MemorySystem
19
 
20
+ # 🎯 Initialize FastAPI with style
21
  app = FastAPI(
22
+ title="🎯 EKALAVYA API",
23
+ description="🌟 The Ultimate AI Teaching Assistant - Multi-Modal, Multi-Lingual, Memory-Powered",
24
+ version="3.0.0",
25
  docs_url="/docs",
26
  redoc_url="/redoc"
27
  )
28
 
29
+ # 🛡️ Initialize safety rules
30
+ safety = SafetyRules()
 
 
 
 
 
 
31
 
32
+ # 🎯 Initialize teaching mode
33
+ teaching_mode = TeachingMode(style="friend")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
+ # 📁 Data directory
36
+ DATA_DIR = "data"
37
+ os.makedirs(DATA_DIR, exist_ok=True)
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
+ # 📦 Request/Response Models
41
+ class TeachingRequest(BaseModel):
42
+ """📚 Teaching request model"""
43
+ input_text: str
44
+ user_id: str = "default_user"
45
+ conversation_style: str = "friend" # friend, teacher, lover, mentor
46
+ language: str = "english"
47
 
 
48
 
49
+ class SafetyCheckRequest(BaseModel):
50
+ """🛡️ Safety check request model"""
51
+ content: str
52
+ check_type: str = "all" # all, scam, hacking, privacy, inappropriate
 
53
 
54
 
55
+ class ProgressRequest(BaseModel):
56
+ """📊 Progress request model"""
57
+ user_id: str
 
 
 
58
 
59
 
60
+ class StyleRequest(BaseModel):
61
+ """💝 Conversation style request model"""
62
+ style: str # friend, teacher, lover, mentor
63
+ user_id: str = "default_user"
 
64
 
65
 
66
+ # 🏠 Root endpoint
67
+ @app.get("/", response_class=HTMLResponse)
68
+ async def root():
69
+ """🎯 Welcome page with emojis"""
70
+ return """
71
+ <!DOCTYPE html>
72
+ <html>
73
+ <head>
74
+ <title>🎯 EKALAVYA - AI Teaching Assistant</title>
75
+ <style>
76
+ body {
77
+ font-family: Arial, sans-serif;
78
+ max-width: 800px;
79
+ margin: 50px auto;
80
+ padding: 20px;
81
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
82
+ color: white;
83
+ }
84
+ .card {
85
+ background: rgba(255,255,255,0.95);
86
+ color: #333;
87
+ padding: 30px;
88
+ border-radius: 20px;
89
+ box-shadow: 0 10px 40px rgba(0,0,0,0.3);
90
+ margin: 20px 0;
91
+ }
92
+ h1 { font-size: 3em; text-align: center; }
93
+ .emoji { font-size: 1.5em; }
94
+ .feature {
95
+ background: #f0f0f0;
96
+ padding: 15px;
97
+ margin: 10px 0;
98
+ border-radius: 10px;
99
+ border-left: 5px solid #667eea;
100
+ }
101
+ .stats {
102
+ display: flex;
103
+ justify-content: space-around;
104
+ margin: 30px 0;
105
+ }
106
+ .stat {
107
+ text-align: center;
108
+ padding: 20px;
109
+ background: rgba(255,255,255,0.1);
110
+ border-radius: 15px;
111
+ flex: 1;
112
+ margin: 0 10px;
113
+ }
114
+ .stat-number { font-size: 2.5em; font-weight: bold; }
115
+ a { color: #667eea; text-decoration: none; font-weight: bold; }
116
+ a:hover { text-decoration: underline; }
117
+ </style>
118
+ </head>
119
+ <body>
120
+ <div class="card">
121
+ <h1>🎯 EKALAVYA</h1>
122
+ <p style="text-align: center; font-size: 1.3em;">
123
+ 🌟 The Ultimate AI Teaching Assistant 🌟
124
+ </p>
125
+
126
+ <div class="stats">
127
+ <div class="stat">
128
+ <div class="stat-number">🌍 23</div>
129
+ <div>Indian Languages</div>
130
+ </div>
131
+ <div class="stat">
132
+ <div class="stat-number">🧠 1M</div>
133
+ <div>Token Context</div>
134
+ </div>
135
+ <div class="stat">
136
+ <div class="stat-number">🛡️ 100%</div>
137
+ <div>Safe & Private</div>
138
+ </div>
139
+ </div>
140
+
141
+ <h2>✨ Features</h2>
142
+
143
+ <div class="feature">
144
+ <span class="emoji">🎓</span> <strong>Teaching Mode</strong>
145
+ <p>Learn English with real-time mistake detection and correction</p>
146
+ </div>
147
+
148
+ <div class="feature">
149
+ <span class="emoji">🧠</span> <strong>Memory System</strong>
150
+ <p>Remembers your mistakes and tracks your learning progress</p>
151
+ </div>
152
+
153
+ <div class="feature">
154
+ <span class="emoji">💝</span> <strong>Conversation Styles</strong>
155
+ <p>Choose: Friend 👫, Teacher 👨‍🏫, Lover 💕, or Mentor 🎓</p>
156
+ </div>
157
+
158
+ <div class="feature">
159
+ <span class="emoji">🛡️</span> <strong>Safety First</strong>
160
+ <p>Scam detection, hacking prevention, privacy protection</p>
161
+ </div>
162
+
163
+ <div class="feature">
164
+ <span class="emoji">🌐</span> <strong>Multi-Modal</strong>
165
+ <p>Supports text, images, video, and audio</p>
166
+ </div>
167
+
168
+ <div class="feature">
169
+ <span class="emoji">🔒</span> <strong>100% Private</strong>
170
+ <p>All data stays on your device, no tracking</p>
171
+ </div>
172
+
173
+ <h2>📚 API Endpoints</h2>
174
+
175
+ <div class="feature">
176
+ <strong>POST /teach</strong> - Start learning session
177
+ </div>
178
+
179
+ <div class="feature">
180
+ <strong>POST /safety/check</strong> - Check content safety
181
+ </div>
182
+
183
+ <div class="feature">
184
+ <strong>GET /safety/tips</strong> - Get safety tips
185
+ </div>
186
+
187
+ <div class="feature">
188
+ <strong>POST /progress</strong> - View learning progress
189
+ </div>
190
+
191
+ <div class="feature">
192
+ <strong>POST /style</strong> - Change conversation style
193
+ </div>
194
+
195
+ <h2>🔗 Quick Links</h2>
196
+ <p>
197
+ 📖 <a href="/docs">Interactive API Docs</a> |
198
+ 📊 <a href="/redoc">Alternative Docs</a> |
199
+ 🎯 <a href="https://huggingface.co/hackerbhai/vinaymodel">HuggingFace Model</a>
200
+ </p>
201
+
202
+ <p style="text-align: center; margin-top: 30px; font-size: 1.2em;">
203
+ 🎯 Built with ❤️ for learners everywhere 🌍
204
+ </p>
205
+ </div>
206
+ </body>
207
+ </html>
208
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
 
210
 
211
+ # 🎓 Teaching endpoint
212
+ @app.post("/teach")
213
+ async def teach(request: TeachingRequest):
214
+ """🎓 Start teaching session with mistake detection"""
 
 
215
  try:
216
+ # 🛡️ Safety check first
217
+ safety_check = safety.check_content(request.input_text)
218
+ if not safety_check['is_safe']:
219
+ return {
220
+ "status": "🛡️ safety_warning",
221
+ "message": safety_check['warnings'][0],
222
+ "suggestions": safety_check['suggestions']
223
+ }
224
+
225
+ # 🎯 Process teaching request
226
+ result = teaching_mode.process_teaching_request(
227
+ user_input=request.input_text,
228
+ user_id=request.user_id,
229
+ conversation_style=request.conversation_style,
230
+ language=request.language
231
+ )
 
 
 
 
 
 
 
 
232
 
233
  return {
234
+ "status": "success",
235
+ "response": result['response'],
236
+ "mistakes_found": result['mistakes'],
237
+ "corrections": result['corrections'],
238
+ "explanation": result['explanation'],
239
+ "encouragement": result['encouragement'],
240
+ "next_steps": result['next_steps'],
241
+ "emoji": "🎉" if result['mistakes'] else "✨"
242
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
243
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
244
  except Exception as e:
245
+ raise HTTPException(status_code=500, detail=f" Error: {str(e)}")
246
 
247
 
248
+ # 🛡️ Safety check endpoint
249
+ @app.post("/safety/check")
250
+ async def check_safety(request: SafetyCheckRequest):
251
+ """🛡️ Check if content is safe"""
252
+ result = safety.check_content(request.content)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
 
254
+ return {
255
+ "is_safe": result['is_safe'],
256
+ "violations": result['violations'],
257
+ "warnings": result['warnings'],
258
+ "suggestions": result['suggestions'],
259
+ "emoji": "✅" if result['is_safe'] else "⚠️",
260
+ "message": "✅ Content is safe!" if result['is_safe'] else "⚠️ Safety issues detected"
261
+ }
262
 
263
 
264
+ # 💡 Safety tips endpoint
265
+ @app.get("/safety/tips")
266
+ async def get_safety_tips():
267
+ """💡 Get safety tips with emojis"""
268
+ tips = safety.get_safety_tips()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
269
 
270
+ emoji_tips = [
271
+ f"🔒 {tips['privacy_protection'][0]}",
272
+ f"🛡️ {tips['privacy_protection'][1]}",
273
+ f"🚫 {tips['prohibited_actions'][0]}",
274
+ f"⚠️ {tips['prohibited_actions'][1]}",
275
+ f"💝 {tips['positive_behaviors'][0]}",
276
+ f"🌟 {tips['positive_behaviors'][1]}",
277
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
 
279
+ return {
280
+ "tips": emoji_tips,
281
+ "count": len(emoji_tips),
282
+ "emoji": "💡",
283
+ "message": "💡 Stay safe with these tips!"
284
+ }
285
 
286
 
287
+ # 📊 Progress endpoint
288
+ @app.post("/progress")
289
+ async def get_progress(request: ProgressRequest):
290
+ """📊 Get user learning progress"""
291
+ memory = MemorySystem(user_id=request.user_id)
292
+ stats = memory.get_user_stats()
293
 
294
+ # Calculate learning score
295
+ total_attempts = stats['total_attempts']
296
+ correct_attempts = stats['correct_attempts']
297
+ learning_score = (correct_attempts / total_attempts * 100) if total_attempts > 0 else 0
 
 
 
 
 
 
 
 
298
 
299
+ return {
300
+ "user_id": request.user_id,
301
+ "stats": stats,
302
+ "learning_score": round(learning_score, 2),
303
+ "emoji": "🏆" if learning_score > 80 else "📈" if learning_score > 50 else "💪",
304
+ "message": "🏆 Excellent progress!" if learning_score > 80 else
305
+ "📈 Good progress, keep going!" if learning_score > 50 else
306
+ "💪 Keep practicing, you'll improve!"
 
 
 
 
 
307
  }
 
 
 
 
 
 
308
 
309
 
310
+ # 💝 Style change endpoint
311
+ @app.post("/style")
312
+ async def change_style(request: StyleRequest):
313
+ """💝 Change conversation style"""
314
+ styles = {
315
+ "friend": "👫",
316
+ "teacher": "👨‍🏫",
317
+ "lover": "💕",
318
+ "mentor": "🎓"
319
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
320
 
321
+ if request.style not in styles:
322
+ raise HTTPException(
323
+ status_code=400,
324
+ detail=f"❌ Invalid style. Choose from: {', '.join(styles.keys())}"
325
+ )
 
 
 
326
 
327
+ teaching_mode.set_style(request.style, request.user_id)
 
 
 
 
 
 
 
328
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  return {
330
+ "status": "✅ success",
331
+ "style": request.style,
332
+ "emoji": styles[request.style],
333
+ "message": f"{styles[request.style]} Now talking as your {request.style}!"
 
 
 
 
334
  }
335
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
336
 
337
+ # 🌍 Languages endpoint
338
+ @app.get("/languages")
339
+ async def get_languages():
340
+ """🌍 Get supported languages with flags"""
341
+ languages = {
342
+ "english": {"name": "English", "flag": "🇬🇧", "emoji": "📚"},
343
+ "hindi": {"name": "Hindi", "flag": "🇮🇳", "emoji": "📖"},
344
+ "bengali": {"name": "Bengali", "flag": "🇮🇳", "emoji": "📝"},
345
+ "telugu": {"name": "Telugu", "flag": "🇮🇳", "emoji": "✍️"},
346
+ "tamil": {"name": "Tamil", "flag": "🇮🇳", "emoji": "📜"},
347
+ "marathi": {"name": "Marathi", "flag": "🇮🇳", "emoji": "📄"},
348
+ "gujarati": {"name": "Gujarati", "flag": "🇮🇳", "emoji": "📋"},
349
+ "kannada": {"name": "Kannada", "flag": "🇮🇳", "emoji": "📑"},
350
+ "malayalam": {"name": "Malayalam", "flag": "🇮🇳", "emoji": "📓"},
351
+ "odia": {"name": "Odia", "flag": "🇮🇳", "emoji": "📕"},
352
+ "punjabi": {"name": "Punjabi", "flag": "🇮🇳", "emoji": "📗"},
353
+ "assamese": {"name": "Assamese", "flag": "🇮🇳", "emoji": "📘"},
354
+ "urdu": {"name": "Urdu", "flag": "🇵🇰", "emoji": "📙"},
355
+ "maithili": {"name": "Maithili", "flag": "🇮🇳", "emoji": "📔"},
356
+ "santali": {"name": "Santali", "flag": "🇮🇳", "emoji": "📒"},
357
+ "kashmiri": {"name": "Kashmiri", "flag": "🇮🇳", "emoji": "📚"},
358
+ "nepali": {"name": "Nepali", "flag": "🇳🇵", "emoji": "📖"},
359
+ "sindhi": {"name": "Sindhi", "flag": "🇮🇳", "emoji": "📝"},
360
+ "konkani": {"name": "Konkani", "flag": "🇮🇳", "emoji": "✍️"},
361
+ "dogri": {"name": "Dogri", "flag": "🇮🇳", "emoji": "📜"},
362
+ "manipuri": {"name": "Manipuri", "flag": "🇮🇳", "emoji": "📄"},
363
+ "bodo": {"name": "Bodo", "flag": "🇮🇳", "emoji": "📋"},
364
+ "sanskrit": {"name": "Sanskrit", "flag": "🇮🇳", "emoji": "📜"}
365
+ }
366
+
367
  return {
368
+ "languages": languages,
369
+ "count": len(languages),
370
+ "emoji": "🌍",
371
+ "message": f"🌍 Supporting {len(languages)} languages!"
 
 
 
 
 
 
 
 
 
 
 
372
  }
373
 
374
+
375
+ # 🏥 Health check endpoint
376
+ @app.get("/health")
377
+ async def health_check():
378
+ """🏥 Health check with status"""
379
  return {
380
+ "status": "✅ healthy",
381
+ "service": "🎯 EKALAVYA",
382
+ "version": "📦 3.0.0",
383
+ "emoji": "🟢",
384
+ "message": "🟢 All systems operational!"
 
 
 
 
 
 
 
 
385
  }
386
 
387
 
388
+ # 🎯 Main entry point
389
  if __name__ == "__main__":
390
  import uvicorn
391
+ print("""
392
+ ╔═══════════════════════════════════════════════════════════╗
393
+ ║ ║
394
+ ║ 🎯 EKALAVYA - AI Teaching Assistant ║
395
+ ║ ║
396
+ ║ 🌟 Multi-Modal Multi-Lingual • Memory-Powered ║
397
+ ║ ║
398
+ ║ 🛡️ Safe 🎓 Educational • 💝 Friendly ║
399
+ ║ ║
400
+ ║ 📚 API Docs: http://localhost:8000/docs ║
401
+ ║ ║
402
+ ║ 🌍 Supporting 23 Indian Languages ║
403
+ ║ ║
404
+ ║ 🧠 1M Token Context Window ║
405
+ ║ ║
406
+ ║ 🔒 100% Private & Secure ║
407
+ ║ ║
408
+ ╚═══════════════════════════════════════════════════════════╝
409
+ """)
410
  uvicorn.run(app, host="0.0.0.0", port=8000)
demo.py CHANGED
@@ -1,6 +1,6 @@
1
  #!/usr/bin/env python3
2
  """
3
- Ekalavya Mythos - Lightweight Demo
4
  Tests code structure without loading full models (for low-memory environments)
5
  """
6
 
@@ -254,7 +254,7 @@ def main():
254
  print("="*70)
255
 
256
  if passed == total:
257
- print("\n🎉 ALL TESTS PASSED! Ekalavya Mythos is fully functional!")
258
  print("\n💡 Note: Full model testing requires 16GB+ RAM")
259
  print(" See SERVER_REQUIREMENTS.md for hardware specs")
260
  print("\n🚀 Ready to deploy:")
 
1
  #!/usr/bin/env python3
2
  """
3
+ Ekalavya - Lightweight Demo
4
  Tests code structure without loading full models (for low-memory environments)
5
  """
6
 
 
254
  print("="*70)
255
 
256
  if passed == total:
257
+ print("\n🎉 ALL TESTS PASSED! Ekalavya is fully functional!")
258
  print("\n💡 Note: Full model testing requires 16GB+ RAM")
259
  print(" See SERVER_REQUIREMENTS.md for hardware specs")
260
  print("\n🚀 Ready to deploy:")
model/__pycache__/__init__.cpython-313.pyc CHANGED
Binary files a/model/__pycache__/__init__.cpython-313.pyc and b/model/__pycache__/__init__.cpython-313.pyc differ
 
model/__pycache__/memory.cpython-313.pyc CHANGED
Binary files a/model/__pycache__/memory.cpython-313.pyc and b/model/__pycache__/memory.cpython-313.pyc differ
 
model/__pycache__/multimodal.cpython-313.pyc CHANGED
Binary files a/model/__pycache__/multimodal.cpython-313.pyc and b/model/__pycache__/multimodal.cpython-313.pyc differ
 
model/__pycache__/mythos.cpython-313.pyc CHANGED
Binary files a/model/__pycache__/mythos.cpython-313.pyc and b/model/__pycache__/mythos.cpython-313.pyc differ
 
model/__pycache__/safety.cpython-313.pyc CHANGED
Binary files a/model/__pycache__/safety.cpython-313.pyc and b/model/__pycache__/safety.cpython-313.pyc differ
 
model/__pycache__/teaching.cpython-313.pyc CHANGED
Binary files a/model/__pycache__/teaching.cpython-313.pyc and b/model/__pycache__/teaching.cpython-313.pyc differ
 
model/deep_reasoning.py CHANGED
@@ -1,5 +1,5 @@
1
  """
2
- Ekalavya Mythos Deep Reasoning Module
3
  Advanced chain-of-thought reasoning for deep understanding
4
  """
5
  import torch
 
1
  """
2
+ Ekalavya Deep Reasoning Module
3
  Advanced chain-of-thought reasoning for deep understanding
4
  """
5
  import torch
model/memory.py CHANGED
@@ -1,5 +1,6 @@
1
  """
2
- Memory & Learning System - Track user progress and mistakes
 
3
  """
4
  import json
5
  import os
@@ -8,7 +9,7 @@ from typing import Dict, List, Optional
8
  from collections import defaultdict
9
 
10
  class MemorySystem:
11
- """Track user interactions, mistakes, and learning progress"""
12
 
13
  def __init__(self, user_id: str = "default_user"):
14
  self.user_id = user_id
@@ -16,7 +17,7 @@ class MemorySystem:
16
  self.load_memory()
17
 
18
  def load_memory(self):
19
- """Load user memory from file"""
20
  if os.path.exists(self.memory_file):
21
  with open(self.memory_file, 'r', encoding='utf-8') as f:
22
  data = json.load(f)
@@ -37,7 +38,7 @@ class MemorySystem:
37
  self.last_interaction = None
38
 
39
  def save_memory(self):
40
- """Save user memory to file"""
41
  data = {
42
  'user_id': self.user_id,
43
  'conversations': self.conversations[-100:], # Keep last 100
@@ -52,7 +53,7 @@ class MemorySystem:
52
  json.dump(data, f, ensure_ascii=False, indent=2)
53
 
54
  def add_conversation(self, user_input: str, response: str, context: str = ""):
55
- """Add conversation to memory"""
56
  self.conversations.append({
57
  'timestamp': datetime.now().isoformat(),
58
  'user_input': user_input,
@@ -63,7 +64,7 @@ class MemorySystem:
63
  self.save_memory()
64
 
65
  def add_mistake(self, mistake_text: str, correction: str, mistake_type: str, topic: str):
66
- """Record a mistake made by user"""
67
  self.mistakes.append({
68
  'timestamp': datetime.now().isoformat(),
69
  'mistake': mistake_text,
@@ -81,7 +82,7 @@ class MemorySystem:
81
  self.save_memory()
82
 
83
  def mark_topic_learned(self, topic: str):
84
- """Mark a topic as learned"""
85
  if topic not in self.learned_topics:
86
  self.learned_topics.append(topic)
87
 
@@ -92,25 +93,25 @@ class MemorySystem:
92
  self.save_memory()
93
 
94
  def get_mistake_history(self, topic: str = None) -> List[Dict]:
95
- """Get mistake history, optionally filtered by topic"""
96
  if topic:
97
  return [m for m in self.mistakes if m['topic'] == topic]
98
  return self.mistakes
99
 
100
  def get_weak_areas(self) -> List[str]:
101
- """Get user's weak areas"""
102
  return self.weak_areas
103
 
104
  def get_learned_topics(self) -> List[str]:
105
- """Get topics user has learned"""
106
  return self.learned_topics
107
 
108
  def get_conversation_context(self, last_n: int = 5) -> List[Dict]:
109
- """Get last n conversations for context"""
110
  return self.conversations[-last_n:]
111
 
112
  def get_user_stats(self) -> Dict:
113
- """Get user learning statistics"""
114
  return {
115
  'total_conversations': len(self.conversations),
116
  'total_mistakes': len(self.mistakes),
@@ -122,16 +123,16 @@ class MemorySystem:
122
  }
123
 
124
  def set_preference(self, key: str, value: any):
125
- """Set user preference"""
126
  self.preferences[key] = value
127
  self.save_memory()
128
 
129
  def get_preference(self, key: str, default=None):
130
- """Get user preference"""
131
  return self.preferences.get(key, default)
132
 
133
  def get_common_mistakes(self, topic: str = None, top_n: int = 5) -> List[Dict]:
134
- """Get most common mistakes"""
135
  mistakes = self.get_mistake_history(topic)
136
 
137
  # Count mistake occurrences
@@ -148,7 +149,7 @@ class MemorySystem:
148
  ]
149
 
150
  def check_improvement(self, topic: str, recent_mistakes: int = 10) -> Dict:
151
- """Check if user is improving in a topic"""
152
  topic_mistakes = self.get_mistake_history(topic)
153
 
154
  if len(topic_mistakes) < recent_mistakes:
@@ -164,19 +165,19 @@ class MemorySystem:
164
  if recent_count < older_count:
165
  return {
166
  'improving': True,
167
- 'message': 'Great progress! You\'re improving!',
168
  'progress': (1 - recent_count / older_count) * 100
169
  }
170
  else:
171
  return {
172
  'improving': False,
173
- 'message': 'Keep practicing! You\'ll get better!',
174
  'progress': 0
175
  }
176
 
177
 
178
  class EnglishMistakeDetector:
179
- """Detect and correct English grammar mistakes"""
180
 
181
  def __init__(self):
182
  # Common mistake patterns
@@ -220,7 +221,7 @@ class EnglishMistakeDetector:
220
  ]
221
 
222
  def detect_mistakes(self, text: str) -> List[Dict]:
223
- """Detect mistakes in text"""
224
  text_lower = text.lower()
225
  mistakes = []
226
 
@@ -250,7 +251,7 @@ class EnglishMistakeDetector:
250
  return mistakes
251
 
252
  def get_corrected_text(self, text: str) -> str:
253
- """Get corrected version of text"""
254
  mistakes = self.detect_mistakes(text)
255
  corrected = text
256
 
@@ -263,7 +264,7 @@ class EnglishMistakeDetector:
263
  return corrected
264
 
265
  def get_explanation(self, mistake: Dict) -> str:
266
- """Get explanation for a mistake"""
267
  explanations = {
268
  'past tense': 'When talking about the past, use past tense verbs. "go" becomes "went"',
269
  'subject-verb agreement': 'The verb must match the subject. "He/She" takes singular verb form',
@@ -283,7 +284,7 @@ class EnglishMistakeDetector:
283
 
284
 
285
  class ConversationStyle:
286
- """Generate responses in different conversation styles"""
287
 
288
  def __init__(self, style: str = "friend"):
289
  self.style = style
@@ -296,11 +297,11 @@ class ConversationStyle:
296
  'farewell': "Catch you later! 👋"
297
  },
298
  'teacher': {
299
- 'greeting': "Hello! Ready to learn today?",
300
- 'encouragement': "Excellent progress! You're improving well.",
301
  'correction': "Let me help you with this: {correction}",
302
  'explanation': "The rule is: {explanation}. Do you understand?",
303
- 'farewell': "Great session! See you next time."
304
  },
305
  'lover': {
306
  'greeting': "Hi sweetheart! 💕 Missed you!",
@@ -310,16 +311,16 @@ class ConversationStyle:
310
  'farewell': "Bye my love! Take care! 💖"
311
  },
312
  'mentor': {
313
- 'greeting': "Welcome! Let's make progress today.",
314
- 'encouragement': "Your dedication is impressive. Keep going!",
315
  'correction': "Here's how to improve: {correction}",
316
  'explanation': "The concept is: {explanation}. Clear?",
317
- 'farewell': "Good work today. See you soon!"
318
  }
319
  }
320
 
321
  def get_response(self, response_type: str, **kwargs) -> str:
322
- """Get response in the specified style"""
323
  template = self.style_templates.get(self.style, self.style_templates['friend'])
324
  response = template.get(response_type, "")
325
 
@@ -330,7 +331,7 @@ class ConversationStyle:
330
  return response
331
 
332
  def format_correction(self, original: str, correction: str, explanation: str) -> str:
333
- """Format a correction message"""
334
  style = self.style_templates.get(self.style, self.style_templates['friend'])
335
 
336
  if self.style == 'friend':
 
1
  """
2
+ 🧠 Memory & Learning System - Track user progress and mistakes
3
+ 📊 Remembers mistakes • 📈 Tracks progress • 🎯 Personalizes learning
4
  """
5
  import json
6
  import os
 
9
  from collections import defaultdict
10
 
11
  class MemorySystem:
12
+ """🧠 Track user interactions, mistakes, and learning progress"""
13
 
14
  def __init__(self, user_id: str = "default_user"):
15
  self.user_id = user_id
 
17
  self.load_memory()
18
 
19
  def load_memory(self):
20
+ """📂 Load user memory from file"""
21
  if os.path.exists(self.memory_file):
22
  with open(self.memory_file, 'r', encoding='utf-8') as f:
23
  data = json.load(f)
 
38
  self.last_interaction = None
39
 
40
  def save_memory(self):
41
+ """💾 Save user memory to file"""
42
  data = {
43
  'user_id': self.user_id,
44
  'conversations': self.conversations[-100:], # Keep last 100
 
53
  json.dump(data, f, ensure_ascii=False, indent=2)
54
 
55
  def add_conversation(self, user_input: str, response: str, context: str = ""):
56
+ """💬 Add conversation to memory"""
57
  self.conversations.append({
58
  'timestamp': datetime.now().isoformat(),
59
  'user_input': user_input,
 
64
  self.save_memory()
65
 
66
  def add_mistake(self, mistake_text: str, correction: str, mistake_type: str, topic: str):
67
+ """Record a mistake made by user"""
68
  self.mistakes.append({
69
  'timestamp': datetime.now().isoformat(),
70
  'mistake': mistake_text,
 
82
  self.save_memory()
83
 
84
  def mark_topic_learned(self, topic: str):
85
+ """Mark a topic as learned"""
86
  if topic not in self.learned_topics:
87
  self.learned_topics.append(topic)
88
 
 
93
  self.save_memory()
94
 
95
  def get_mistake_history(self, topic: str = None) -> List[Dict]:
96
+ """📜 Get mistake history, optionally filtered by topic"""
97
  if topic:
98
  return [m for m in self.mistakes if m['topic'] == topic]
99
  return self.mistakes
100
 
101
  def get_weak_areas(self) -> List[str]:
102
+ """🎯 Get user's weak areas"""
103
  return self.weak_areas
104
 
105
  def get_learned_topics(self) -> List[str]:
106
+ """🏆 Get topics user has learned"""
107
  return self.learned_topics
108
 
109
  def get_conversation_context(self, last_n: int = 5) -> List[Dict]:
110
+ """🔍 Get last n conversations for context"""
111
  return self.conversations[-last_n:]
112
 
113
  def get_user_stats(self) -> Dict:
114
+ """📊 Get user learning statistics"""
115
  return {
116
  'total_conversations': len(self.conversations),
117
  'total_mistakes': len(self.mistakes),
 
123
  }
124
 
125
  def set_preference(self, key: str, value: any):
126
+ """💝 Set user preference"""
127
  self.preferences[key] = value
128
  self.save_memory()
129
 
130
  def get_preference(self, key: str, default=None):
131
+ """🔍 Get user preference"""
132
  return self.preferences.get(key, default)
133
 
134
  def get_common_mistakes(self, topic: str = None, top_n: int = 5) -> List[Dict]:
135
+ """📈 Get most common mistakes"""
136
  mistakes = self.get_mistake_history(topic)
137
 
138
  # Count mistake occurrences
 
149
  ]
150
 
151
  def check_improvement(self, topic: str, recent_mistakes: int = 10) -> Dict:
152
+ """📈 Check if user is improving in a topic"""
153
  topic_mistakes = self.get_mistake_history(topic)
154
 
155
  if len(topic_mistakes) < recent_mistakes:
 
165
  if recent_count < older_count:
166
  return {
167
  'improving': True,
168
+ 'message': 'Great progress! You\'re improving! 🎉',
169
  'progress': (1 - recent_count / older_count) * 100
170
  }
171
  else:
172
  return {
173
  'improving': False,
174
+ 'message': 'Keep practicing! You\'ll get better! 💪',
175
  'progress': 0
176
  }
177
 
178
 
179
  class EnglishMistakeDetector:
180
+ """🔍 Detect and correct English grammar mistakes"""
181
 
182
  def __init__(self):
183
  # Common mistake patterns
 
221
  ]
222
 
223
  def detect_mistakes(self, text: str) -> List[Dict]:
224
+ """🔍 Detect mistakes in text"""
225
  text_lower = text.lower()
226
  mistakes = []
227
 
 
251
  return mistakes
252
 
253
  def get_corrected_text(self, text: str) -> str:
254
+ """Get corrected version of text"""
255
  mistakes = self.detect_mistakes(text)
256
  corrected = text
257
 
 
264
  return corrected
265
 
266
  def get_explanation(self, mistake: Dict) -> str:
267
+ """📚 Get explanation for a mistake"""
268
  explanations = {
269
  'past tense': 'When talking about the past, use past tense verbs. "go" becomes "went"',
270
  'subject-verb agreement': 'The verb must match the subject. "He/She" takes singular verb form',
 
284
 
285
 
286
  class ConversationStyle:
287
+ """💝 Generate responses in different conversation styles"""
288
 
289
  def __init__(self, style: str = "friend"):
290
  self.style = style
 
297
  'farewell': "Catch you later! 👋"
298
  },
299
  'teacher': {
300
+ 'greeting': "Hello! 👨‍🏫 Ready to learn today?",
301
+ 'encouragement': "Excellent progress! You're improving well. 🌟",
302
  'correction': "Let me help you with this: {correction}",
303
  'explanation': "The rule is: {explanation}. Do you understand?",
304
+ 'farewell': "Great session! See you next time. 👋"
305
  },
306
  'lover': {
307
  'greeting': "Hi sweetheart! 💕 Missed you!",
 
311
  'farewell': "Bye my love! Take care! 💖"
312
  },
313
  'mentor': {
314
+ 'greeting': "Welcome! 🎓 Let's make progress today.",
315
+ 'encouragement': "Your dedication is impressive. Keep going! 🌟",
316
  'correction': "Here's how to improve: {correction}",
317
  'explanation': "The concept is: {explanation}. Clear?",
318
+ 'farewell': "Good work today. See you soon! 👋"
319
  }
320
  }
321
 
322
  def get_response(self, response_type: str, **kwargs) -> str:
323
+ """💬 Get response in the specified style"""
324
  template = self.style_templates.get(self.style, self.style_templates['friend'])
325
  response = template.get(response_type, "")
326
 
 
331
  return response
332
 
333
  def format_correction(self, original: str, correction: str, explanation: str) -> str:
334
+ """Format a correction message"""
335
  style = self.style_templates.get(self.style, self.style_templates['friend'])
336
 
337
  if self.style == 'friend':
model/multimodal.py CHANGED
@@ -1,5 +1,5 @@
1
  """
2
- Ekalavya Mythos Multi-Modal - Vision + Audio + Video + Text
3
  Complete multi-modal AI that can see, hear, read, and understand
4
  """
5
  import torch
@@ -190,7 +190,7 @@ class MultiModalProjector(nn.Module):
190
 
191
  class EkalavyaMultiModal(nn.Module):
192
  """
193
- Ekalavya Mythos Multi-Modal - Complete multi-modal AI
194
 
195
  Can process:
196
  - Text (language model)
 
1
  """
2
+ Ekalavya Multi-Modal - Vision + Audio + Video + Text
3
  Complete multi-modal AI that can see, hear, read, and understand
4
  """
5
  import torch
 
190
 
191
  class EkalavyaMultiModal(nn.Module):
192
  """
193
+ Ekalavya Multi-Modal - Complete multi-modal AI
194
 
195
  Can process:
196
  - Text (language model)
model/mythos.py CHANGED
@@ -1,5 +1,5 @@
1
  """
2
- Ekalavya Mythos - Beyond DeepSeek-Class
3
  MoE Architecture + Multi-Lingual + Thinking Mode
4
  Supports ALL Indian Languages + English
5
  """
@@ -206,7 +206,7 @@ class TransformerBlock(nn.Module):
206
 
207
  class EkalavyaMythos(nn.Module):
208
  """
209
- Ekalavya Mythos - Beyond DeepSeek-Class
210
 
211
  Features:
212
  - Mixture of Experts (MoE) like DeepSeek-V3
@@ -384,7 +384,7 @@ CONFIGS = {
384
 
385
 
386
  def create_model(config_name='mythos-base', **kwargs):
387
- """Create Ekalavya Mythos model"""
388
  if config_name not in CONFIGS:
389
  raise ValueError(f"Unknown config: {config_name}. Available: {list(CONFIGS.keys())}")
390
 
 
1
  """
2
+ Ekalavya - Beyond DeepSeek-Class
3
  MoE Architecture + Multi-Lingual + Thinking Mode
4
  Supports ALL Indian Languages + English
5
  """
 
206
 
207
  class EkalavyaMythos(nn.Module):
208
  """
209
+ Ekalavya - Beyond DeepSeek-Class
210
 
211
  Features:
212
  - Mixture of Experts (MoE) like DeepSeek-V3
 
384
 
385
 
386
  def create_model(config_name='mythos-base', **kwargs):
387
+ """Create Ekalavya model"""
388
  if config_name not in CONFIGS:
389
  raise ValueError(f"Unknown config: {config_name}. Available: {list(CONFIGS.keys())}")
390
 
model/safety.py CHANGED
@@ -1,5 +1,5 @@
1
  """
2
- Ekalavya Mythos - Safety Rules & Guidelines
3
  Scam detection, hacking prevention, privacy protection, writing rules
4
  """
5
  from typing import Dict, List, Optional
 
1
  """
2
+ Ekalavya - Safety Rules & Guidelines
3
  Scam detection, hacking prevention, privacy protection, writing rules
4
  """
5
  from typing import Dict, List, Optional
model/tokenizer.py CHANGED
@@ -1,5 +1,5 @@
1
  """
2
- Ekalavya Mythos - Multi-Lingual Tokenizer
3
  Supports ALL Indian languages + English
4
  """
5
  import json
 
1
  """
2
+ Ekalavya - Multi-Lingual Tokenizer
3
  Supports ALL Indian languages + English
4
  """
5
  import json
teach_me.py CHANGED
@@ -1,133 +1,202 @@
1
  #!/usr/bin/env python3
2
  """
3
- Ekalavya Mythos - Teaching Mode Demo
4
- Learn English with mistake detection and friendly conversation
5
  """
6
 
7
  from model.teaching import TeachingMode
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  def demo_teaching_mode():
10
- """Demonstrate the teaching mode"""
11
-
12
- print("="*70)
13
- print("🎓 EKALAVYA MYTHOS - TEACHING MODE DEMO")
14
- print("="*70)
15
-
16
- # Initialize teaching mode with friend style
17
- print("\n👫 Starting with FRIEND style...")
18
- teacher = TeachingMode(user_id="demo_user", style="friend")
19
-
20
- # Start English lesson
21
- print("\n📚 Starting English lesson...")
22
- lesson = teacher.start_lesson("english")
23
- print(f"\n{lesson['response']}")
24
-
25
- # Simulate user making mistakes
26
- print("\n" + "="*70)
27
- print("📝 User Practice Session")
28
- print("="*70)
29
-
30
- practice_sentences = [
31
- "I go to school yesterday", # Tense mistake
32
- "He don't like pizza", # Subject-verb agreement
33
- "I am good in english", # Wrong preposition
34
- "She is knowing the answer", # Stative verb
35
- "I went to the home", # Unnecessary article
36
- ]
37
-
38
- for i, sentence in enumerate(practice_sentences, 1):
39
- print(f"\n{'─'*70}")
40
- print(f"Attempt {i}: User writes: '{sentence}'")
41
- print(f"{'─'*70}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- result = teacher.process_input(sentence)
 
 
 
 
44
 
45
- print(f"\n💬 Ekalavya's Response:")
46
- print(f" {result['feedback']}")
 
 
 
 
 
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  if result['corrections']:
49
- print(f"\n🔧 Corrections:")
50
  for correction in result['corrections']:
51
- print(f" {correction}")
 
 
 
 
 
 
 
 
52
 
53
- if result['next_step']:
54
- print(f"\n➡️ Next: {result['next_step']}")
55
-
56
- # Show learning summary
57
- print("\n" + "="*70)
58
- print("📊 Learning Summary")
59
- print("="*70)
60
-
61
- summary = teacher.get_learning_summary()
62
- print(summary['summary'])
63
-
64
- # Show mistake history
65
- print("\n" + "="*70)
66
- print("🔍 Mistake History")
67
- print("="*70)
68
-
69
- mistakes = teacher.memory.get_mistake_history()
70
- print(f"\nTotal mistakes detected: {len(mistakes)}")
71
-
72
- for i, mistake in enumerate(mistakes, 1):
73
- print(f"\n{i}. Mistake: '{mistake['mistake']}'")
74
- print(f" Correction: '{mistake['correction']}'")
75
- print(f" Type: {mistake['type']}")
76
-
77
- # Switch to lover style
78
- print("\n" + "="*70)
79
- print("💕 Switching to LOVER style...")
80
- print("="*70)
81
-
82
- teacher.set_style("lover")
83
- lesson = teacher.start_lesson("english")
84
- print(f"\n{lesson['response']}")
85
-
86
- # Practice with lover style
87
- print("\n📝 Practice with lover style:")
88
- result = teacher.process_input("I go yesterday")
89
- print(f"\n💬 Response: {result['feedback']}")
90
- if result['corrections']:
91
- print(f"\n💝 Correction: {result['corrections'][0]}")
92
-
93
- # Switch to teacher style
94
- print("\n" + "="*70)
95
- print("👨‍🏫 Switching to TEACHER style...")
96
- print("="*70)
97
-
98
- teacher.set_style("teacher")
99
- lesson = teacher.start_lesson("grammar")
100
- print(f"\n{lesson['response']}")
101
-
102
- # Practice with teacher style
103
- print("\n📝 Practice with teacher style:")
104
- result = teacher.process_input("He don't like it")
105
- print(f"\n💬 Response: {result['feedback']}")
106
- if result['corrections']:
107
- print(f"\n📚 Correction: {result['corrections'][0]}")
108
-
109
- # Show final progress
110
- print("\n" + "="*70)
111
- print("📈 Final Progress Report")
112
- print("="*70)
113
-
114
- summary = teacher.get_learning_summary()
115
- print(summary['summary'])
116
-
117
- print("\n" + "="*70)
118
- print("✅ DEMO COMPLETE!")
119
- print("="*70)
120
- print("\n🎯 Key Features Demonstrated:")
121
- print(" ✅ Mistake detection")
122
- print(" ✅ Real-time correction")
123
- print(" ✅ Memory-based learning")
124
- print(" ✅ Progress tracking")
125
- print(" ✅ Multiple conversation styles")
126
- print(" ✅ Personalized feedback")
127
- print(" ✅ Weak area identification")
128
- print("\n🚀 Ready to use! Run: python api.py")
129
- print("📚 API Docs: http://localhost:8000/docs")
130
- print("="*70)
131
 
132
  if __name__ == "__main__":
133
- demo_teaching_mode()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  #!/usr/bin/env python3
2
  """
3
+ 🎯 EKALAVYA - Interactive Teaching Demo
4
+ 🎓 Learn English with AI 💝 Friendly Conversations • 🧠 Memory-Powered
5
  """
6
 
7
  from model.teaching import TeachingMode
8
+ from model.safety import SafetyRules
9
+
10
+ def print_header():
11
+ """🎨 Print beautiful header"""
12
+ print("""
13
+ ╔═══════════════════════════════════════════════════════════╗
14
+ ║ ║
15
+ ║ 🎯 EKALAVYA - AI Teaching Assistant ║
16
+ ║ ║
17
+ ║ 🎓 Interactive Teaching Mode ║
18
+ ║ ║
19
+ ║ 💝 Choose Your Style: ║
20
+ ║ 👫 Friend • 👨‍🏫 Teacher • 💕 Lover • 🎓 Mentor ║
21
+ ║ ║
22
+ ╚═══════════════════════════════════════════════════════════╝
23
+ """)
24
+
25
+ def get_user_choice(prompt, options):
26
+ """🎯 Get user choice with emojis"""
27
+ print(f"\n{prompt}")
28
+ for i, (key, value) in enumerate(options.items(), 1):
29
+ print(f" {i}. {value}")
30
+
31
+ while True:
32
+ try:
33
+ choice = int(input("\n👉 Enter your choice (1-{}): ".format(len(options))))
34
+ if 1 <= choice <= len(options):
35
+ return list(options.keys())[choice - 1]
36
+ print("❌ Invalid choice, try again!")
37
+ except ValueError:
38
+ print("❌ Please enter a number!")
39
 
40
  def demo_teaching_mode():
41
+ """🎓 Run interactive teaching demo"""
42
+ print_header()
43
+
44
+ # 🎯 Choose conversation style
45
+ styles = {
46
+ "friend": "👫 Friend - Casual and supportive",
47
+ "teacher": "👨‍🏫 Teacher - Formal and educational",
48
+ "lover": "💕 Lover - Caring and affectionate",
49
+ "mentor": "🎓 Mentor - Wise and guiding"
50
+ }
51
+
52
+ print("\n💝 Choose your conversation style:")
53
+ style = get_user_choice("💝 Select style:", styles)
54
+
55
+ # 🌍 Choose language
56
+ languages = {
57
+ "english": "🇬🇧 English",
58
+ "hindi": "🇮🇳 Hindi (हिंदी)",
59
+ "bengali": "🇮🇳 Bengali (বাংলা)"
60
+ }
61
+
62
+ print("\n🌍 Choose your language:")
63
+ language = get_user_choice("🌍 Select language:", languages)
64
+
65
+ # 🎯 Initialize teaching mode
66
+ teaching = TeachingMode(style=style)
67
+ safety = SafetyRules()
68
+
69
+ print(f"\n✨ Great! Now talking as your {style} in {language}!")
70
+ print(f"📝 Write sentences and I'll help you improve!")
71
+ print(f"🛡️ Your learning is 100% private and safe!")
72
+ print("\n" + "═" * 60)
73
+
74
+ # 🎓 Interactive session
75
+ session_active = True
76
+ sentence_count = 0
77
+
78
+ while session_active:
79
+ print("\n📝 Write a sentence (or type 'quit' to exit):")
80
+ user_input = input("👉 ").strip()
81
+
82
+ # 🚪 Exit condition
83
+ if user_input.lower() in ['quit', 'exit', 'q']:
84
+ print("\n👋 Thank you for learning with EKALAVYA!")
85
+ print("🌟 Keep practicing and you'll improve!")
86
+ break
87
 
88
+ # 🛡️ Safety check
89
+ safety_result = safety.check_content(user_input)
90
+ if not safety_result['is_safe']:
91
+ print(f"\n⚠️ {safety_result['warnings'][0]}")
92
+ continue
93
 
94
+ # ���� Process teaching request
95
+ sentence_count += 1
96
+ result = teaching.process_teaching_request(
97
+ user_input=user_input,
98
+ conversation_style=style,
99
+ language=language
100
+ )
101
 
102
+ # 📊 Display results
103
+ print("\n" + "─" * 60)
104
+
105
+ # 💬 Response
106
+ print(f"\n💬 Response:\n{result['response']}")
107
+
108
+ # 🔍 Mistakes found
109
+ if result['mistakes']:
110
+ print(f"\n🔍 Found {len(result['mistakes'])} mistake(s):")
111
+ for mistake in result['mistakes']:
112
+ print(f" ❌ {mistake['original']}")
113
+ else:
114
+ print(f"\n✨ Perfect! No mistakes found!")
115
+
116
+ # ✅ Corrections
117
  if result['corrections']:
118
+ print(f"\n Corrections:")
119
  for correction in result['corrections']:
120
+ print(f"{correction['original']} → {correction['corrected']}")
121
+
122
+ # 📚 Explanation
123
+ if result['explanation']:
124
+ print(f"\n📚 Explanation:\n{result['explanation']}")
125
+
126
+ # 💝 Encouragement
127
+ if result['encouragement']:
128
+ print(f"\n💝 {result['encouragement']}")
129
 
130
+ # 🎯 Next steps
131
+ if result['next_steps']:
132
+ print(f"\n🎯 Try next:")
133
+ for step in result['next_steps']:
134
+ print(f" {step}")
135
+
136
+ print("\n" + "─" * 60)
137
+
138
+ # 📊 Show progress
139
+ print("\n" + "═" * 60)
140
+ print("📊 Your Learning Progress")
141
+ print("═" * 60)
142
+
143
+ memory = teaching.memory
144
+ stats = memory.get_user_stats()
145
+
146
+ print(f"\n📝 Sentences practiced: {sentence_count}")
147
+ print(f"🔍 Mistakes found: {stats['total_mistakes']}")
148
+ print(f"✅ Corrections made: {stats['total_corrections']}")
149
+
150
+ if stats['total_mistakes'] > 0:
151
+ print(f"\n📈 Most common mistakes:")
152
+ for mistake, count in stats['common_mistakes'][:3]:
153
+ print(f" • {mistake} ({count} times)")
154
+
155
+ print("\n" + "" * 60)
156
+ print("🌟 Keep learning with EKALAVYA!")
157
+ print("🎯 See you next time!")
158
+ print("═" * 60)
159
+
160
+ def demo_safety_features():
161
+ """🛡️ Demo safety features"""
162
+ print("\n" + "═" * 60)
163
+ print("🛡️ SAFETY FEATURES DEMO")
164
+ print("═" * 60)
165
+
166
+ safety = SafetyRules()
167
+
168
+ test_cases = [
169
+ ("Normal sentence", "I went to school yesterday", True),
170
+ ("Grammar mistake", "I go to school yesterday", True),
171
+ ("Scam attempt", "You won a lottery! Click here", False),
172
+ ("Hacking request", "How to hack Facebook", False),
173
+ ("Privacy risk", "My phone number is 9876543210", True),
174
+ ]
175
+
176
+ for name, text, should_pass in test_cases:
177
+ result = safety.check_content(text)
178
+ status = "✅ PASS" if result['is_safe'] == should_pass else "❌ FAIL"
179
+ print(f"\n{status} {name}")
180
+ print(f" Text: {text}")
181
+ print(f" Safe: {result['is_safe']}")
182
+ if not result['is_safe']:
183
+ print(f" ⚠️ {result['warnings'][0]}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
 
185
  if __name__ == "__main__":
186
+ print("\n🎯 Welcome to EKALAVYA Interactive Demo!")
187
+ print("\nChoose demo:")
188
+ print(" 1. 🎓 Teaching Mode (Interactive)")
189
+ print(" 2. 🛡️ Safety Features Demo")
190
+ print(" 3. 🚀 Run Both")
191
+
192
+ choice = input("\n👉 Enter choice (1-3): ")
193
+
194
+ if choice == "1":
195
+ demo_teaching_mode()
196
+ elif choice == "2":
197
+ demo_safety_features()
198
+ elif choice == "3":
199
+ demo_teaching_mode()
200
+ demo_safety_features()
201
+ else:
202
+ print("❌ Invalid choice!")
test_safety.py CHANGED
@@ -1,6 +1,6 @@
1
  #!/usr/bin/env python3
2
  """
3
- Ekalavya Mythos - Safety Rules Test
4
  Test all safety features: scam detection, hacking prevention, privacy protection
5
  """
6
 
@@ -159,7 +159,7 @@ def test_safety_rules():
159
  print(" ✅ Ethical guidelines")
160
  print(" ✅ Privacy policy")
161
 
162
- print("\n🛡️ Ekalavya Mythos is SAFE and SECURE!")
163
  print("="*70)
164
 
165
  if __name__ == "__main__":
 
1
  #!/usr/bin/env python3
2
  """
3
+ Ekalavya - Safety Rules Test
4
  Test all safety features: scam detection, hacking prevention, privacy protection
5
  """
6
 
 
159
  print(" ✅ Ethical guidelines")
160
  print(" ✅ Privacy policy")
161
 
162
+ print("\n🛡️ Ekalavya is SAFE and SECURE!")
163
  print("="*70)
164
 
165
  if __name__ == "__main__":