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