Derr11 commited on
Commit
4dd86c0
·
verified ·
1 Parent(s): cae18bf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -4
app.py CHANGED
@@ -1,7 +1,86 @@
1
  import gradio as gr
 
 
 
2
 
3
- def greet(name):
4
- return "Hello " + name + "!!"
 
5
 
6
- demo = gr.Interface(fn=greet, inputs="text", outputs="text")
7
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import gradio as gr
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
3
+ import torch
4
+ import spaces # مكتبة ZeroGPU
5
 
6
+ # 1. إعدادات النموذج (Qwen3-Omni-Thinking)
7
+ # نستخدم نسخة Thinking للحصول على قدرات الاستنتاج العميق
8
+ MODEL_ID = "Qwen/Qwen3-Omni-30B-A3B-Thinking"
9
 
10
+ print(f"جاري تحميل النموذج العملاق {MODEL_ID}... هذا سيستغرق بضعة دقائق.")
11
+
12
+ # إعداد الضغط (4-bit Quantization) لتناسب ذاكرة ZeroGPU
13
+ nf4_config = BitsAndBytesConfig(
14
+ load_in_4bit=True,
15
+ bnb_4bit_quant_type="nf4",
16
+ bnb_4bit_use_double_quant=True,
17
+ bnb_4bit_compute_dtype=torch.bfloat16
18
+ )
19
+
20
+ # تحميل الـ Tokenizer
21
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
22
+
23
+ # تحميل النموذج مع الضغط
24
+ model = AutoModelForCausalLM.from_pretrained(
25
+ MODEL_ID,
26
+ quantization_config=nf4_config,
27
+ device_map="auto",
28
+ trust_remote_code=True
29
+ )
30
+
31
+ print("تم تحميل النموذج بنجاح! المعلم جاهز.")
32
+
33
+ # 2. دالة التفكير والرد
34
+ @spaces.GPU(duration=120) # نزيد الوقت المسموح لأن التفكير يأخذ وقتاً
35
+ def chat_with_thinking_model(message, history):
36
+ # تجهيز سياق المحادثة
37
+ # نماذج Thinking لا تحتاج عادةً لـ System Prompt معقد، هي تفهم السياق فوراً
38
+ messages = []
39
+
40
+ for user_msg, bot_msg in history:
41
+ messages.append({"role": "user", "content": user_msg})
42
+ messages.append({"role": "assistant", "content": bot_msg})
43
+
44
+ messages.append({"role": "user", "content": message})
45
+
46
+ # تحويل النص لأرقام
47
+ text = tokenizer.apply_chat_template(
48
+ messages,
49
+ tokenize=False,
50
+ add_generation_prompt=True
51
+ )
52
+
53
+ model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
54
+
55
+ # التوليد
56
+ # نماذج التفكير قد تولد نصوصاً طويلة تشرح فيها خطوات الحل
57
+ generated_ids = model.generate(
58
+ **model_inputs,
59
+ max_new_tokens=1024, # نعطيه مساحة ليفكر
60
+ temperature=0.7 # توازن بين الإبداع والدقة
61
+ )
62
+
63
+ generated_ids = [
64
+ output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
65
+ ]
66
+
67
+ response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
68
+ return response
69
+
70
+ # 3. واجهة المستخدم
71
+ custom_css = """
72
+ #chatbot {min-height: 400px;}
73
+ """
74
+
75
+ with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo:
76
+ gr.Markdown("# 🧠 Nasaq AI Tutor (Thinking Mode)")
77
+ gr.Markdown("هذا النموذج يستخدم **Qwen3-Omni-Thinking**. ستلاحظ أنه قد يكتب خطوات تفكيره قبل الإجابة النهائية.")
78
+
79
+ chatbot = gr.ChatInterface(
80
+ fn=chat_with_thinking_model,
81
+ examples=["اشرح لي النظرية النسبية وكأنني طفل في الخامسة", "حل المعادلة: س^2 + 5س + 6 = 0 مع الشرح"],
82
+ cache_examples=False,
83
+ )
84
+
85
+ if __name__ == "__main__":
86
+ demo.launch()