MHD011 commited on
Commit
37a2315
·
verified ·
1 Parent(s): c6497cf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +41 -30
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.float16, # لتوفير الذاكرة
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
- logger.info("✅ تم تحميل النموذج على CPU")
 
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 (مثل INSERT, UPDATE, DELETE, CREATE, DROP).
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
- logger.error(f" استعلام غير آمن: {sql}")
268
- return jsonify({
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)