Update app.py
Browse files
app.py
CHANGED
|
@@ -40,7 +40,7 @@ def initialize():
|
|
| 40 |
MODEL_NAME,
|
| 41 |
cache_dir="model_cache",
|
| 42 |
device_map="auto",
|
| 43 |
-
torch_dtype=torch.
|
| 44 |
low_cpu_mem_usage=True
|
| 45 |
)
|
| 46 |
|
|
@@ -48,7 +48,8 @@ def initialize():
|
|
| 48 |
model.to('cuda')
|
| 49 |
logger.info("✅ تم تحميل النموذج على GPU")
|
| 50 |
else:
|
| 51 |
-
|
|
|
|
| 52 |
|
| 53 |
model.eval()
|
| 54 |
except Exception as e:
|
|
@@ -210,40 +211,33 @@ def handle_query():
|
|
| 210 |
data = request.get_json()
|
| 211 |
logger.info(f"📩 بيانات الطلب: {data}")
|
| 212 |
|
| 213 |
-
# التحقق من وجود البيانات المطلوبة
|
| 214 |
if not data or 'text' not in data or 'cam_mac' not in data:
|
| 215 |
-
logger.error("❌ بيانات ناقصة في الطلب")
|
| 216 |
return jsonify({"error": "يرجى إرسال 'text' و 'cam_mac'"}), 400
|
| 217 |
|
| 218 |
-
# التحقق من صحة cam_mac
|
| 219 |
if not validate_cam_mac(data['cam_mac']):
|
| 220 |
-
logger.error(f"❌ cam_mac غير صالح: {data['cam_mac']}")
|
| 221 |
return jsonify({"error": "عنوان MAC غير صالح"}), 403
|
| 222 |
|
| 223 |
-
# إنشاء الـ prompt مع تعليمات صارمة
|
| 224 |
prompt = f"""
|
| 225 |
### التعليمات الصارمة:
|
| 226 |
1. قم بتحويل السؤال إلى استعلام SELECT فقط لـ PostgreSQL.
|
| 227 |
2. يجب أن يتضمن الشرط: WHERE cam_mac = '{data['cam_mac']}'.
|
| 228 |
-
3. ممنوع تمامًا استخدام أي أوامر غير SELECT
|
| 229 |
|
| 230 |
### هيكل قاعدة البيانات:
|
| 231 |
{DB_SCHEMA}
|
| 232 |
|
| 233 |
-
###
|
| 234 |
-
- السؤال: "ما عدد زياراتي للمكتب؟"
|
| 235 |
-
SQL: SELECT COUNT(*) FROM data WHERE cam_mac = '{data['cam_mac']}';
|
| 236 |
-
|
| 237 |
-
- السؤال: "ما هي آخر 10 زيارات؟"
|
| 238 |
-
SQL: SELECT * FROM data WHERE cam_mac = '{data['cam_mac']}' ORDER BY created_at DESC LIMIT 10;
|
| 239 |
-
|
| 240 |
-
### السؤال الحالي:
|
| 241 |
{data['text']}
|
| 242 |
|
| 243 |
### استعلام SQL (SELECT فقط):
|
| 244 |
"""
|
| 245 |
-
|
| 246 |
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
if torch.cuda.is_available():
|
| 248 |
inputs = inputs.to('cuda')
|
| 249 |
|
|
@@ -256,26 +250,43 @@ def handle_query():
|
|
| 256 |
)
|
| 257 |
|
| 258 |
sql = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 259 |
-
logger.info(f"⚡ الاستعلام المولد (قبل التنظيف): {sql}")
|
| 260 |
-
|
| 261 |
-
# تنظيف الاستعلام
|
| 262 |
sql = clean_sql(sql)
|
| 263 |
-
logger.info(f"🔧 الاستعلام بعد التنظيف: {sql}")
|
| 264 |
|
| 265 |
-
# التحقق من أن الاستعلام آمن
|
| 266 |
if not is_safe_sql(sql):
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
"error": "تم توليد استعلام غير آمن",
|
| 270 |
-
"details": "الاستعلام يجب أن يكون SELECT فقط ويجب أن يتضمن شرط WHERE لـ cam_mac",
|
| 271 |
-
"sql": sql
|
| 272 |
-
}), 400
|
| 273 |
-
|
| 274 |
-
# تنفيذ الاستعلام
|
| 275 |
conn = get_db_connection()
|
| 276 |
if not conn:
|
| 277 |
return jsonify({"error": "فشل الاتصال بقاعدة البيانات"}), 500
|
| 278 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 279 |
try:
|
| 280 |
cursor = conn.cursor()
|
| 281 |
cursor.execute(sql)
|
|
|
|
| 40 |
MODEL_NAME,
|
| 41 |
cache_dir="model_cache",
|
| 42 |
device_map="auto",
|
| 43 |
+
torch_dtype=torch.float32, # تغيير من float16 إلى float32 للإصلاح
|
| 44 |
low_cpu_mem_usage=True
|
| 45 |
)
|
| 46 |
|
|
|
|
| 48 |
model.to('cuda')
|
| 49 |
logger.info("✅ تم تحميل النموذج على GPU")
|
| 50 |
else:
|
| 51 |
+
model.float() # تأكد من تحويل النموذج إلى float32 على CPU
|
| 52 |
+
logger.info("✅ تم تحميل النموذج على CPU (باستخدام float32)")
|
| 53 |
|
| 54 |
model.eval()
|
| 55 |
except Exception as e:
|
|
|
|
| 211 |
data = request.get_json()
|
| 212 |
logger.info(f"📩 بيانات الطلب: {data}")
|
| 213 |
|
|
|
|
| 214 |
if not data or 'text' not in data or 'cam_mac' not in data:
|
|
|
|
| 215 |
return jsonify({"error": "يرجى إرسال 'text' و 'cam_mac'"}), 400
|
| 216 |
|
|
|
|
| 217 |
if not validate_cam_mac(data['cam_mac']):
|
|
|
|
| 218 |
return jsonify({"error": "عنوان MAC غير صالح"}), 403
|
| 219 |
|
|
|
|
| 220 |
prompt = f"""
|
| 221 |
### التعليمات الصارمة:
|
| 222 |
1. قم بتحويل السؤال إلى استعلام SELECT فقط لـ PostgreSQL.
|
| 223 |
2. يجب أن يتضمن الشرط: WHERE cam_mac = '{data['cam_mac']}'.
|
| 224 |
+
3. ممنوع تمامًا استخدام أي أوامر غير SELECT.
|
| 225 |
|
| 226 |
### هيكل قاعدة البيانات:
|
| 227 |
{DB_SCHEMA}
|
| 228 |
|
| 229 |
+
### السؤال:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
{data['text']}
|
| 231 |
|
| 232 |
### استعلام SQL (SELECT فقط):
|
| 233 |
"""
|
| 234 |
+
|
| 235 |
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512)
|
| 236 |
+
|
| 237 |
+
# تحويل المدخلات إلى float32 إذا كنا على CPU
|
| 238 |
+
if not torch.cuda.is_available():
|
| 239 |
+
inputs = inputs.to(torch.float32)
|
| 240 |
+
|
| 241 |
if torch.cuda.is_available():
|
| 242 |
inputs = inputs.to('cuda')
|
| 243 |
|
|
|
|
| 250 |
)
|
| 251 |
|
| 252 |
sql = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
|
|
|
|
|
|
|
|
|
| 253 |
sql = clean_sql(sql)
|
|
|
|
| 254 |
|
|
|
|
| 255 |
if not is_safe_sql(sql):
|
| 256 |
+
return jsonify({"error": "تم توليد استعلام غير آمن"}), 400
|
| 257 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 258 |
conn = get_db_connection()
|
| 259 |
if not conn:
|
| 260 |
return jsonify({"error": "فشل الاتصال بقاعدة البيانات"}), 500
|
| 261 |
|
| 262 |
+
try:
|
| 263 |
+
cursor = conn.cursor()
|
| 264 |
+
cursor.execute(sql)
|
| 265 |
+
|
| 266 |
+
columns = [desc[0] for desc in cursor.description] if cursor.description else []
|
| 267 |
+
rows = cursor.fetchall()
|
| 268 |
+
|
| 269 |
+
return jsonify({
|
| 270 |
+
"data": [dict(zip(columns, row)) for row in rows],
|
| 271 |
+
"sql": sql,
|
| 272 |
+
"timestamp": datetime.now().isoformat()
|
| 273 |
+
})
|
| 274 |
+
|
| 275 |
+
except Exception as e:
|
| 276 |
+
return jsonify({
|
| 277 |
+
"error": "خطأ في تنفيذ الاستعلام",
|
| 278 |
+
"sql": sql,
|
| 279 |
+
"details": str(e)
|
| 280 |
+
}), 500
|
| 281 |
+
|
| 282 |
+
finally:
|
| 283 |
+
if conn:
|
| 284 |
+
conn.close()
|
| 285 |
+
|
| 286 |
+
except Exception as e:
|
| 287 |
+
logger.error(f"❌ خطأ غير متوقع: {str(e)}", exc_info=True)
|
| 288 |
+
return jsonify({"error": "فشل في معالجة الطلب"}), 500
|
| 289 |
+
|
| 290 |
try:
|
| 291 |
cursor = conn.cursor()
|
| 292 |
cursor.execute(sql)
|