f-chat-api / app.py
fady-50's picture
Create app.py
65d63e4 verified
Raw
History Blame Contribute Delete
3.86 kB
# --- 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 ---
@app.get("/")
def read_root():
""" رسالة ترحيبية للتأكد أن الـ API يعمل """
return {"status": "success", "message": "F-Chat API is running"}
@app.post("/generate")
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)