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)
|