Spaces:
Running
Running
File size: 5,698 Bytes
4e127d3 ce348e1 4e127d3 539ff69 4e127d3 539ff69 4e127d3 ce348e1 4e127d3 ce348e1 4e127d3 539ff69 4e127d3 539ff69 ce348e1 539ff69 4e127d3 539ff69 ce348e1 539ff69 4e127d3 539ff69 ce348e1 539ff69 4e127d3 539ff69 6b7f850 539ff69 ce348e1 539ff69 ce348e1 6b7f850 ce348e1 6b7f850 539ff69 6b7f850 539ff69 ce348e1 4e127d3 ce348e1 6b7f850 ce348e1 6b7f850 4e127d3 539ff69 6b7f850 4e127d3 539ff69 4e127d3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
from database import Database
from transformers import pipeline
from cachetools import TTLCache
import logging
# إعداد التسجيل (Logging)
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO,
handlers=[
logging.FileHandler("app.log", encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)
app = FastAPI()
try:
db = Database() # إنشاء كائن من الكلاس Database
logger.info("Successfully initialized Database")
except Exception as e:
logger.error(f"Failed to initialize Database: {str(e)}")
raise
cache = TTLCache(maxsize=200, ttl=300) # الكاش بحجم 200 وعمر 300 ثانية
generator = None
class Car(BaseModel):
model: str
price: float
status: str
description: Optional[str] = None
def load_generator():
global generator
if generator is None:
try:
# استخدام Falcon-Arabic-7B-Instruct بدلاً من AraGPT2
generator = pipeline('text-generation', model='tiiuae/falcon-7b-instruct', truncation=True, pad_token_id=0, eos_token_id=0, max_length=150, num_return_sequences=1)
logger.info("Successfully loaded Falcon-Arabic-7B-Instruct model")
except Exception as e:
logger.error(f"Failed to load Falcon-Arabic-7B-Instruct model: {str(e)}")
raise
return generator
# إغلاق اتصال قاعدة البيانات لما السيرفر يتوقف
@app.on_event("shutdown")
def shutdown_event():
try:
db.close()
logger.info("Database connection closed during shutdown")
except Exception as e:
logger.error(f"Error closing database during shutdown: {str(e)}")
@app.post("/cars/")
async def add_car(car: Car):
try:
car_id = db.create_car(car.model, car.price, car.status, car.description)
return {"id": car_id, **car.dict()}
except Exception as e:
logger.error(f"Error creating car: {str(e)}")
raise HTTPException(status_code=500, detail="خطأ أثناء إضافة السيارة")
@app.get("/cars/")
async def list_cars():
try:
cached_result = cache.get("all_cars")
if cached_result:
return cached_result
cars = db.get_all_cars()
cache["all_cars"] = cars
return cars
except Exception as e:
logger.error(f"Error listing cars: {str(e)}")
raise HTTPException(status_code=500, detail="خطأ أثناء استرجاع السيارات")
@app.get("/cars/{car_id}")
async def get_car(car_id: int):
try:
car = db.get_car_by_id(car_id)
if not car:
raise HTTPException(status_code=404, detail="السيارة مو موجودة")
return car
except Exception as e:
logger.error(f"Error retrieving car {car_id}: {str(e)}")
raise HTTPException(status_code=500, detail="خطأ أثناء استرجاع السيارة")
@app.get("/car_info/")
async def get_car_info(model: str):
try:
cars = db.get_all_cars()
available_cars = [car for car in cars if car['model'].lower() == model.lower()]
if not available_cars:
prompt = f"ما اعرف هذا الموديل '{model}'، أجب بلهجة عراقية طبيعية عن معلومات عنه، مع ذكر السعر، المواصفات، أماكن البيع، أو قطع الغيار إذا كانت متاحة."
try:
gen = load_generator()
response = gen(prompt, max_length=150, num_return_sequences=1, do_sample=True, temperature=0.7)[0]['generated_text']
response = response.split(".")[0].split("؟")[0].strip() + "."
if len(response) < 20:
response = f"والله ما عندي معلومات كافية عن '{model}'، جربي موديل ثاني!"
return {"message": response}
except Exception as e:
logger.error(f"Error generating response for unknown model: {str(e)}")
return {"message": "عذرًا، خطأ أثناء توليد الرد."}
car = available_cars[0]
prompt = f"أجب بلهجة عراقية طبيعية عن سيارة {car['model']}، سعرها {car['price']} دولار ووضعها {car['status']}، مع ذكر مواصفاتها وأماكن بيعها إذا كانت متاحة."
try:
gen = load_generator()
response = gen(prompt, max_length=150, num_return_sequences=1, do_sample=True, temperature=0.7)[0]['generated_text']
response = response.split(".")[0].split("؟")[0].strip() + "."
if len(response) < 20:
response = f"سيارة {car['model']} سعرها {car['price']} دولار، ووضعها {car['status']}، حلوة ومناسبة للعراق!"
return {"message": response}
except Exception as e:
logger.error(f"Error generating response for car info: {str(e)}")
return {"message": "عذرًا، خطأ أثناء توليد الرد."}
except Exception as e:
logger.error(f"Error processing car info for model {model}: {str(e)}")
raise HTTPException(status_code=500, detail="خطأ أثناء معالجة طلب المعلومات")
@app.get("/")
async def root():
return {"message": "CarBot API is running!"}
|