carbot-mixtral / app.py
imstevenleo's picture
Updated CarBot with Falcon-Arabic-7B-Instruct and enhanced database
ce348e1
raw
history blame
5.7 kB
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!"}