sassil commited on
Commit
7d85ac1
·
1 Parent(s): 652d7f7
Files changed (2) hide show
  1. app.py +58 -83
  2. requirements.txt +6 -4
app.py CHANGED
@@ -1,84 +1,59 @@
1
  import gradio as gr
2
- import requests
3
- import os
4
- import json
5
- from huggingface_hub import HfFolder
6
-
7
- # 1. إعداد API الداخلي (Hugging Face Inference API)
8
- # يتم استخدام نقطة النهاية الرسمية لـ HF Inference API
9
- API_URL = "https://api-inference.huggingface.co/models/"
10
-
11
- # DeepSeek-V3.2-Exp هو نموذج ضخم، سنستخدم نموذج DeepSeek V3.1-Terminus المتاح للاستدلال
12
- # NOTE: DeepSeek V3.2 Exp is not yet widely available on the free Inference API tier.
13
- MODEL_ID = "deepseek-ai/DeepSeek-V3.1-Terminus"
14
-
15
- # يتم سحب مفتاح HF_TOKEN من إعدادات Space Secrets
16
- # يجب أن يكون لديك HF_TOKEN أو MAVERICK_API_KEY مع صلاحية (Write/Read)
17
- # الكود يبحث عن المفتاح في المتغيرات البيئية
18
- API_KEY = os.environ.get("MAVERICK_API_KEY") or HfFolder.get_token()
19
-
20
-
21
- # 2. دالة توليد الاستجابة (API Call)
22
- def generate_response(message, history):
23
-
24
- # 2.1 التحقق من المفتاح السري (Critical Check)
25
- if not API_KEY:
26
- yield "⚠️ فشل المصادقة: يرجى إضافة مفتاح API لـ Hugging Face باسم HF_TOKEN أو MAVERICK_API_KEY في إعدادات Space Secrets."
27
- return
28
-
29
- # 2.2 بناء سياق الدردشة لـ API
30
- # يجب تحويل سجل الدردشة إلى سلسلة نصية بسيطة لأن Inference API لا يدعم تنسيق OpenAI Messages بالكامل
31
- conversation = [f"System: أنت مساعد هندسي متخصص. أجب بدقة ومباشرة.\n"]
32
- for user_msg, bot_msg in history:
33
- conversation.append(f"User: {user_msg}\nAssistant: {bot_msg}\n")
34
-
35
- # إضافة الرسالة الحالية
36
- conversation.append(f"User: {message}\nAssistant:")
37
- full_prompt = "".join(conversation)
38
-
39
- # 2.3 تنفيذ طلب API (Hugging Face)
40
- headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
41
-
42
- # نقطة النهاية الفعلية للموديل
43
- endpoint = f"{API_URL}{MODEL_ID}"
44
-
45
- # إعداد الـ payload
46
- payload = {
47
- "inputs": full_prompt,
48
- "parameters": {
49
- "max_new_tokens": 512,
50
- "temperature": 0.1,
51
- "do_sample": True,
52
- "return_full_text": False # لتجنب تكرار البرومبت في الإخراج
53
- }
54
- }
55
-
56
- try:
57
- response = requests.post(endpoint, headers=headers, json=payload, timeout=120)
58
- response.raise_for_status()
59
-
60
- # تحليل استجابة Hugging Face Inference API
61
- data = response.json()
62
- if isinstance(data, list) and data:
63
- generated_text = data[0]['generated_text']
64
- yield generated_text
65
- else:
66
- yield "خطأ في تنسيق استجابة Hugging Face API."
67
-
68
- except requests.exceptions.HTTPError as err:
69
- yield f"خطأ في الاتصال بـ Hugging Face API: رمز الحالة {err.response.status_code}. قد يكون السبب ضغط على الموديل."
70
- except Exception as e:
71
- yield f"حدث خطأ غير متوقع: {e}"
72
-
73
-
74
- # 3. واجهة Gradio النهائية (تشغيل على CPU)
75
- iface = gr.ChatInterface(
76
- fn=generate_response,
77
- chatbot=gr.Chatbot(label="DeepSeek Engineer Chatbot"),
78
- textbox=gr.Textbox(placeholder="أدخل سؤالك هنا...", container=False),
79
- title="✅ المهندس المتمرد (المرحلة التشغيلية - DeepSeek API عبر HF)",
80
- description="يعمل على عتاد CPU مستقر، والاستدلال يتم عبر Hugging Face API.",
81
- theme="soft"
82
- )
83
-
84
- iface.queue().launch()
 
1
  import gradio as gr
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer
3
+ import torch
4
+
5
+ # تحديد اسم نموذج DeepSeek الذي تريد استخدامه
6
+ # يمكنك تغييره إلى أي نموذج DeepSeek آخر متوفر على HF
7
+ MODEL_NAME = "deepseek-ai/DeepSeek-Coder-V2-Lite-Base"
8
+
9
+ # التحميل يتم مرة واحدة عند بدء تشغيل الـ Space
10
+ try:
11
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
12
+ model = AutoModelForCausalLM.from_pretrained(
13
+ MODEL_NAME,
14
+ torch_dtype=torch.bfloat16, # استخدام Bfloat16 لتحسين الذاكرة على GPU
15
+ device_map="auto" # التوزيع التلقائي على GPU
16
+ )
17
+ except Exception as e:
18
+ print(f"Error loading model: {e}")
19
+ tokenizer = None
20
+ model = None
21
+
22
+ def generate_response(prompt):
23
+ if not model or not tokenizer:
24
+ return "Failed to load the DeepSeek model. Check your hardware (need GPU) and logs."
25
+
26
+ # تحويل النص إلى تنسيق الإدخال للنموذج
27
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
28
+
29
+ # توليد الرد
30
+ with torch.no_grad():
31
+ outputs = model.generate(
32
+ **inputs,
33
+ max_new_tokens=256,
34
+ do_sample=True,
35
+ temperature=0.7,
36
+ pad_token_id=tokenizer.eos_token_id
37
+ )
38
+
39
+ # فك ترميز الرد
40
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
41
+ return response
42
+
43
+ # إنشاء واجهة Gradio
44
+ if model and tokenizer:
45
+ gr.Interface(
46
+ fn=generate_response,
47
+ inputs=gr.Textbox(lines=5, label="أدخل سؤالك/طلبك للنموذج"),
48
+ outputs=gr.Textbox(label="رد DeepSeek"),
49
+ title="DeepSeek Model on Hugging Face Space",
50
+ description=f"Running {MODEL_NAME} using a GPU on Hugging Face Spaces."
51
+ ).launch()
52
+ else:
53
+ # واجهة بسيطة في حالة فشل التحميل
54
+ gr.Interface(
55
+ fn=lambda x: "Initialization Error: Model did not load.",
56
+ inputs="text",
57
+ outputs="text",
58
+ title="Model Load Failed",
59
+ ).launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -1,5 +1,7 @@
1
- gradio
2
- transformers
3
  torch
4
- huggingface-hub
5
- accelerate
 
 
 
 
 
 
 
1
  torch
2
+ transformers
3
+ accelerate
4
+ gradio
5
+ # إضافة أي مكتبات أخرى قد تحتاجها، مثل:
6
+ # deepspeed
7
+ # bitsandbytes # قد تحتاجه إذا قمت بالتحميل بكميات أقل (4bit/8bit)