Spaces:
Running
Running
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 | |
# إغلاق اتصال قاعدة البيانات لما السيرفر يتوقف | |
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)}") | |
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="خطأ أثناء إضافة السيارة") | |
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="خطأ أثناء استرجاع السيارات") | |
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="خطأ أثناء استرجاع السيارة") | |
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="خطأ أثناء معالجة طلب المعلومات") | |
async def root(): | |
return {"message": "CarBot API is running!"} | |