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!"}