fady-50 commited on
Commit
65d63e4
·
verified ·
1 Parent(s): e11ca6d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -0
app.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # --- 1. استيراد المكتبات ---
2
+ from fastapi import FastAPI
3
+ from pydantic import BaseModel
4
+ import torch
5
+ from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
6
+ import os
7
+
8
+ # --- 2. إعدادات النموذج ---
9
+ # هذا هو اسم نموذجك الذي رفعته
10
+ MODEL_ID = "fady-50/F-Chat-Model-GPTQ"
11
+ # المنصة بتتوقع إن الـ app يشتغل على بورت 7860
12
+ APP_PORT = int(os.environ.get("PORT", 7860))
13
+
14
+
15
+ # --- 3. تحميل النموذج والـ Tokenizer (يحدث مرة واحدة عند بدء التشغيل) ---
16
+ print("--- بدء تحميل النموذج ---")
17
+ try:
18
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, use_fast=True)
19
+
20
+ # نحتاج لإعدادات خاصة لتحميل نموذج GPTQ
21
+ model = AutoModelForCausalLM.from_pretrained(
22
+ MODEL_ID,
23
+ device_map="auto", # توزيع النموذج على الـ CPU/GPU المتاح
24
+ torch_dtype=torch.float16, # استخدام دقة أقل لسرعة أفضل
25
+ trust_remote_code=True # ضروري لنماذج GPTQ
26
+ )
27
+ print("--- تم تحميل النموذج بنجاح ---")
28
+
29
+ # إنشاء Pipeline جاهز للاستدلال
30
+ # هذا يغلف كل التعقيدات الخاصة بالـ prompt
31
+ pipe = pipeline(
32
+ "text-generation",
33
+ model=model,
34
+ tokenizer=tokenizer,
35
+ max_new_tokens=512, # الحد الأقصى لعدد الكلمات الجديدة التي سينتجها
36
+ do_sample=True,
37
+ temperature=0.7,
38
+ top_p=0.95,
39
+ top_k=40,
40
+ repetition_penalty=1.1
41
+ )
42
+
43
+ except Exception as e:
44
+ print(f"!!! خطأ فادح أثناء تحميل النموذج: {e}")
45
+ # في حالة الفشل، نجعل الـ pipeline لا شيء لنعرف ذلك
46
+ pipe = None
47
+
48
+ # --- 4. إعداد FastAPI ---
49
+ app = FastAPI()
50
+
51
+ # نموذج الإدخال (ما سيرسله الباك إند)
52
+ class PromptRequest(BaseModel):
53
+ prompt: str
54
+
55
+ # --- 5. تعريف نقطة النهاية (Endpoint) للـ API ---
56
+
57
+ @app.get("/")
58
+ def read_root():
59
+ """ رسالة ترحيبية للتأكد أن الـ API يعمل """
60
+ return {"status": "success", "message": "F-Chat API is running"}
61
+
62
+ @app.post("/generate")
63
+ async def generate_text(request: PromptRequest):
64
+ """ هذه هي نقطة النهاية الرئيسية التي سيستخدمها الباك إند """
65
+
66
+ if pipe is None:
67
+ return {"status": "error", "message": "Model failed to load. Check Space logs."}
68
+
69
+ try:
70
+ # الحصول على الـ prompt من الطلب
71
+ prompt = request.prompt
72
+
73
+ # تنسيق الـ prompt كما يتوقعه نموذجك (قد تحتاج لتعديل هذا)
74
+ # هذا مجرد مثال شائع لنماذج الدردشة
75
+ formatted_prompt = f"Human: {prompt}\nAssistant:"
76
+
77
+ print(f"--- استلام طلب لـ: {formatted_prompt} ---")
78
+
79
+ # تشغيل الـ Pipeline
80
+ outputs = pipe(formatted_prompt)
81
+
82
+ # استخراج النتيجة
83
+ generated_text = outputs[0]['generated_text']
84
+
85
+ # تنظيف الرد (اختياري: إزالة الـ prompt الأصلي من الرد)
86
+ # final_response = generated_text.split("Assistant:")[-1].strip()
87
+
88
+ print(f"--- تم إنشاء الرد ---")
89
+ return {"status": "success", "response": generated_text}
90
+
91
+ except Exception as e:
92
+ print(f"!!! خطأ أثناء الاستدلال: {e}")
93
+ return {"status": "error", "message": str(e)}
94
+
95
+ # (اختياري) كود لتشغيل الخادم محلياً للاختبار
96
+ if __name__ == "__main__":
97
+ import uvicorn
98
+ # لازم نحدد البورت ده عشان Hugging Face يشتغل صح
99
+ uvicorn.run(app, host="0.0.0.0", port=APP_PORT)