Spaces:
Sleeping
Sleeping
| # --- 1. استيراد المكتبات --- | |
| from fastapi import FastAPI | |
| from pydantic import BaseModel | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline | |
| import os | |
| # --- 2. إعدادات النموذج --- | |
| # هذا هو اسم نموذجك الذي رفعته | |
| MODEL_ID = "fady-50/F-Chat-Model-GPTQ" | |
| # المنصة بتتوقع إن الـ app يشتغل على بورت 7860 | |
| APP_PORT = int(os.environ.get("PORT", 7860)) | |
| # --- 3. تحميل النموذج والـ Tokenizer (يحدث مرة واحدة عند بدء التشغيل) --- | |
| print("--- بدء تحميل النموذج ---") | |
| try: | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, use_fast=True) | |
| # نحتاج لإعدادات خاصة لتحميل نموذج GPTQ | |
| model = AutoModelForCausalLM.from_pretrained( | |
| MODEL_ID, | |
| device_map="auto", # توزيع النموذج على الـ CPU/GPU المتاح | |
| torch_dtype=torch.float16, # استخدام دقة أقل لسرعة أفضل | |
| trust_remote_code=True # ضروري لنماذج GPTQ | |
| ) | |
| print("--- تم تحميل النموذج بنجاح ---") | |
| # إنشاء Pipeline جاهز للاستدلال | |
| # هذا يغلف كل التعقيدات الخاصة بالـ prompt | |
| pipe = pipeline( | |
| "text-generation", | |
| model=model, | |
| tokenizer=tokenizer, | |
| max_new_tokens=512, # الحد الأقصى لعدد الكلمات الجديدة التي سينتجها | |
| do_sample=True, | |
| temperature=0.7, | |
| top_p=0.95, | |
| top_k=40, | |
| repetition_penalty=1.1 | |
| ) | |
| except Exception as e: | |
| print(f"!!! خطأ فادح أثناء تحميل النموذج: {e}") | |
| # في حالة الفشل، نجعل الـ pipeline لا شيء لنعرف ذلك | |
| pipe = None | |
| # --- 4. إعداد FastAPI --- | |
| app = FastAPI() | |
| # نموذج الإدخال (ما سيرسله الباك إند) | |
| class PromptRequest(BaseModel): | |
| prompt: str | |
| # --- 5. تعريف نقطة النهاية (Endpoint) للـ API --- | |
| def read_root(): | |
| """ رسالة ترحيبية للتأكد أن الـ API يعمل """ | |
| return {"status": "success", "message": "F-Chat API is running"} | |
| async def generate_text(request: PromptRequest): | |
| """ هذه هي نقطة النهاية الرئيسية التي سيستخدمها الباك إند """ | |
| if pipe is None: | |
| return {"status": "error", "message": "Model failed to load. Check Space logs."} | |
| try: | |
| # الحصول على الـ prompt من الطلب | |
| prompt = request.prompt | |
| # تنسيق الـ prompt كما يتوقعه نموذجك (قد تحتاج لتعديل هذا) | |
| # هذا مجرد مثال شائع لنماذج الدردشة | |
| formatted_prompt = f"Human: {prompt}\nAssistant:" | |
| print(f"--- استلام طلب لـ: {formatted_prompt} ---") | |
| # تشغيل الـ Pipeline | |
| outputs = pipe(formatted_prompt) | |
| # استخراج النتيجة | |
| generated_text = outputs[0]['generated_text'] | |
| # تنظيف الرد (اختياري: إزالة الـ prompt الأصلي من الرد) | |
| # final_response = generated_text.split("Assistant:")[-1].strip() | |
| print(f"--- تم إنشاء الرد ---") | |
| return {"status": "success", "response": generated_text} | |
| except Exception as e: | |
| print(f"!!! خطأ أثناء الاستدلال: {e}") | |
| return {"status": "error", "message": str(e)} | |
| # (اختياري) كود لتشغيل الخادم محلياً للاختبار | |
| if __name__ == "__main__": | |
| import uvicorn | |
| # لازم نحدد البورت ده عشان Hugging Face يشتغل صح | |
| uvicorn.run(app, host="0.0.0.0", port=APP_PORT) |