walker11 commited on
Commit
15a42d4
·
verified ·
1 Parent(s): d8baaa6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +190 -89
app.py CHANGED
@@ -34,64 +34,133 @@ class ArabicContentModerator:
34
  "Content-Type": "application/json"
35
  }
36
 
37
- # The Definitive Prompt for Word-Level Contextual Analysis
38
  self.moderation_prompt = """
39
- أنت ناقد أدبي فائق الدقة، خبير في الأدب العربي والثقافة الإسلامية. مهمتك ليست مجرد المراجعة، بل التشريح الأدبي للنص. يجب أن تركز في كل كلمة، وتفهم موقعها ودلالتها داخل السياق السردي العام قبل إصدار أي حكم. قرارك هو نتاج تحليل عميق، وليس رد فعل سطحي تجاه مفردات معينة.
40
 
41
- **المنهجية التحليلية: من الكلمة إلى النص**
42
 
43
- اتبع هذه المنهجية الصارمة، حيث كل كلمة هي وحدة تحليل أساسية:
 
44
 
45
- **أولاً: التحليل الدقيق للسياق والغرض**
46
- قبل أن تبدأ، اقرأ النص بالكامل لتفهم عالمه. ثم أعد القراءة مع التركيز على بناء الجمل واختيار الكلمات. اسأل نفسك باستمرار:
47
- * **ما وظيفة هذه الكلمة هنا؟** هل هي جزء من حوار يكشف عن شخصية منحرفة؟ هل هي استعارة أدبية تغير المعنى الظاهري؟ أم هي صوت مباشر من السرد يروج لانتهاك؟
48
- * **ما هي نبرة القصة؟** هل هي ساخرة، مأساوية، نقدية؟ النبرة تغير دلالة الكلمات بشكل جذري.
49
- * تذكر، قصة تصور شخصية تنطق بالكفر للكشف عن ضلالها تختلف جذرياً عن نص يدعو إلى الكفر. الفهم الدقيق لهذه النية هو جوهر عملك.
 
 
50
 
51
- **ثانياً: التحقق من الهوية الأدبية (هل البنية هي بنية قصة؟)**
52
- بعد فهم السياق، تأكد من أن النص عمل سردي حقيقي يمتلك العناصر الأساسية: حبكة، شخصيات، حوار، وصف. ارفض بشكل قاطع أي محتوى غير قصصي (مقالات، تعليقات، مواد دراسية، إلخ).
 
 
 
 
 
53
 
54
- **ثالثاً: تطبيق معايير المراجعة بناءً على التحليل السياقي (مدونة السلوك للناقد)**
55
- استخدم هذه المدونة كمرجع لتحديد الانتهاكات. لا تقم بتطبيقها بشكل آلي. يجب أن يمر كل انتهاك محتمل عبر فلتر "التحليل السياقي للكلمة" الذي قمت به في الخطوة الأولى.
 
 
 
 
 
56
 
57
- ---
58
- **(((مدونة السلوك والمحتوى المرفوض)))**
 
 
 
 
 
59
 
60
- **1. الإساءة الدينية والثقافية:**
61
- * **أ) سب الذات الإلهية أو الأديان:** أي ازدراء أو سب مباشر لله تعالى، القرآن، النبي محمد ﷺ، الصحابة، أو الرسل والأنبياء في الديانات السماوية الأخرى.
62
- * **ب) الاستهزاء بالشعائر والرموز الدينية:** السخرية من الصلاة، الصيام، الحج، الزكاة، المساجد، الكعبة، إلخ.
63
- * **ج) الكفر والتجديف الصريح:** إنكار وجود الله، إنكار البعث والحساب، أو إنكار النبوة.
64
- * **د) التحريض الطائفي والمذهبي:** إثارة الفتنة بين المذاهب أو الأديان.
 
 
65
 
66
- **2. الألفاظ النابية والبذاءة:**
67
- * **أ) الشتائم الجنسية الصريحة:** استخدام أي لفظ يصف الأعضاء التناسلية أو الأفعال الجنسية بشكل مبتذل.
68
- * **ب) سب الأهل والأعراض:** الشتائم التي تتضمن الأب أو الأم أو الأخت.
69
- * **ج) الشتائم العامة المهينة:** الألفاظ التي تحط من الكرامة الإنسانية.
 
 
 
70
 
71
- **3. المحتوى الجنسي والأخلاقي:**
72
- * **أ) الوصف الجنسي الفاضح:** وصف تفصيلي للأعضاء التناسلية أو الأفعال الجنسية بهدف الإثارة.
73
- * **ب) تمجيد العلاقات المحرمة والشذوذ الجنسي:** الترويج للزنا، الخيانة، أو العلاقات المثلية وتقديمها على أنها أمر إيجابي.
74
- * **ج) الإيحاءات والتلميحات المبتذلة:** العبارات التي تحمل معانٍ جنسية مبطنة ورخيصة.
 
 
 
75
 
76
- **4. العنف والكراهية:**
77
- * **أ) العنف المفرط والمقزز:** الوصف التصويري المفصل لأعمال القتل والتعذيب والتشويه.
78
- * **ب) تمجيد الجريمة والكراهية:** الدعوة الصريحة للقتل، الانتقام، إيذاء النفس، أو التحريض العرقي.
 
 
 
 
79
 
80
- **5. المحتوى المخالف للقانون والأخلاق العامة:**
81
- * **أ) الترويج للمخدرات والمسكرات:** التشجيع على تعاطي المخدرات أو شرب الخمر.
82
- * **ب) الإساءة للمرأة وتحقيرها:** العبارات التي تصور المرأة ككائن ناقص أو مجرد أداة.
 
 
 
 
 
 
 
83
 
84
- ---
85
- **رابعاً: القرار النهائي المبني على التحليل الدقيق**
 
 
 
 
 
 
86
 
87
- بعد تشريح النص كلمة بكلمة وفهم سياقه الأدبي العميق، أصدر حكمك النهائي:
 
 
 
 
 
 
 
88
 
89
- - **إذا كان النص قصة أدبية حقيقية، وبعد فحص كل كلمة حساسة في سياقها، تأكدت من أنها لا تمثل انتهاكاً مباشراً من قبل صوت السرد نفسه، أجب بـ `true` فقط.**
90
- - **إذا كان النص غير قصصي، أو إذا كانت كلماته أو عباراته، حتى بعد تحليل السياق، تشكل انتهاكاً واضحاً ومباشراً للمعايير، أجب بـ `no` فقط.**
91
 
92
- إجابتك يجب أن تكون `true` أو `no` فقط. لا مجال للتردد. حكمك يعتمد على تحليل دقيق وليس على انطباع عا��.
 
93
 
94
- **النص المطلوب مراجعته:**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  """
96
 
97
  def _call_deepseek_api(self, story_content: str) -> Dict[str, Any]:
@@ -110,7 +179,7 @@ class ArabicContentModerator:
110
  "messages": [
111
  {
112
  "role": "system",
113
- "content": "أنت ناقد أدبي محترف متخصص في الأدب العربي والثقافة الإسلامية. مهمتك مراجعة النصوص بدقة شديدة للتأكد من التزامها بالقيم الدينية والثقافية العربية الإسلامية ومن كونها قصصاً أدبية حقيقية."
114
  },
115
  {
116
  "role": "user",
@@ -118,7 +187,7 @@ class ArabicContentModerator:
118
  }
119
  ],
120
  "max_tokens": 10,
121
- "temperature": 0.0, # Changed to 0.0 for more consistent results
122
  "stream": False
123
  }
124
 
@@ -139,6 +208,56 @@ class ArabicContentModerator:
139
  logger.error(f"Exception calling Deepseek API: {str(e)}")
140
  return {"error": str(e)}
141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  def _validate_story_format(self, story_content: str) -> bool:
143
  """
144
  Enhanced validation of story format and content
@@ -163,34 +282,11 @@ class ArabicContentModerator:
163
  # Arabic characters should be at least 30% of total characters
164
  if arabic_chars < len(story_content.strip()) * 0.3:
165
  return False
166
-
167
- # Quick pre-screening for obvious violations (before API call)
168
- content_lower = story_content.lower()
169
-
170
- # Check for common profanity patterns across dialects AND religious violations
171
- profanity_patterns = [
172
- # Sexual profanity
173
- r'\bكس\b', r'\bزب\b', r'\bنيك\b', r'\bمنيوك\b', r'\bشرموط\b',
174
- r'\bقحب\b', r'\bلحس\b', r'\bمص\b', r'\bطيز\b', r'\bبزاز\b',
175
- r'\bتبن\b', r'\bنعل\b', r'\bكوس\b', r'\bأير\b', r'\bمنايك\b',
176
- r'\bخرا\b', r'\bكداب\b', r'\bعرص\b', r'\bخول\b', r'\bحيوان\b',
177
 
178
- # Religious violations and blasphemy
179
- r'الله كذاب', r'لعن الله', r'تبا لله', r'يلعن رب', r'الله غبي',
180
- r'القرآن كذب', r'كتاب مزور', r'خرافات القرآن', r'قرآن مؤلف',
181
- r'محمد كذاب', r'الرسول دجال', r'نبي كاذب', r'لعنة على محمد',
182
- r'أبو بكر منافق', r'عمر ظالم', r'علي مخادع', r'الصحابة كذابون',
183
- r'الصلاة مضيعة', r'رمضان تخلف', r'الحج طقوس', r'الكعبة صنم',
184
- r'المسيح كذاب', r'الإنجيل محرف', r'موسى دجال', r'التوراة مزورة',
185
- r'لا إله', r'الله وهم', r'الجنة وهم', r'النار خيال', r'القيامة كذبة',
186
- r'لعنة الله', r'الله يلعنك', r'ملعون من رب', r'بيوت خرافة',
187
- r'السنة نواصب', r'الشيعة رافضة', r'الصوفية مشركون', r'الوهابيون كفار'
188
- ]
189
-
190
- for pattern in profanity_patterns:
191
- if re.search(pattern, content_lower):
192
- return False
193
-
194
  return True
195
 
196
  def moderate_story(self, story_content: str) -> Dict[str, Any]:
@@ -208,7 +304,7 @@ class ArabicContentModerator:
208
  return {
209
  "approved": False,
210
  "response": "no",
211
- "reason": "فشل في التحقق من صحة تنسيق القصة أو عدم وجود محتوى عربي كافٍ",
212
  "timestamp": datetime.now().isoformat()
213
  }
214
 
@@ -248,7 +344,7 @@ class ArabicContentModerator:
248
  }
249
 
250
  if not approved:
251
- result["reason"] = "المحتوى ينتهك القواعد المجتمعية أو الثقافية أو الدينية، أو أنه ليس قصة أدبية حقيقية"
252
  else:
253
  result["reason"] = "المحتوى مقبول ويلتزم بالمعايير المطلوبة"
254
 
@@ -281,28 +377,33 @@ except ValueError as e:
281
  def home():
282
  """Home endpoint with API documentation"""
283
  return jsonify({
284
- "service": "مراجع المحتوى الأدبي العربي المحسن",
285
- "service_en": "Enhanced Arabic Literary Content Moderator",
286
- "version": "2.0.0",
287
- "description": "AI-powered professional literary critic for Arabic short stories with comprehensive dialect-aware moderation",
288
- "description_ar": "ناقد أدبي محترف مدعوم بالذكاء الاصطناعي للقصص العربية القصيرة مع مراجعة شاملة لجميع اللهجات العربية",
289
  "endpoints": {
290
  "/health": "Health check",
291
  "/moderate": "POST - Moderate single story",
292
  "/moderate/batch": "POST - Moderate multiple stories"
293
  },
294
  "features": [
295
- "Comprehensive profanity detection across all Arabic dialects",
296
- "Enhanced religious and cultural compliance checking with specific examples",
 
 
 
297
  "Professional literary criticism standards",
298
- "Strict content type validation (stories only)",
299
- "Multi-dialect offensive content detection (Gulf, Levantine, Egyptian, Maghrebi, Iraqi, Sudanese, Yemeni)",
300
- "Comprehensive religious blasphemy detection (Islam, Christianity, Judaism, other faiths)",
301
- "Advanced sectarian and inter-religious conflict prevention",
302
- "Takfir and religious defamation blocking",
303
- "Advanced pre-screening before API calls",
304
- "Arabic language purity validation",
305
- "Context-aware violation detection"
 
 
306
  ],
307
  "usage": {
308
  "moderate": {
@@ -319,7 +420,7 @@ def health_check():
319
  """Health check endpoint"""
320
  return jsonify({
321
  "status": "healthy" if moderator else "unhealthy",
322
- "service": "Enhanced Arabic Content Moderator",
323
  "timestamp": datetime.now().isoformat(),
324
  "api_available": moderator is not None
325
  })
@@ -327,7 +428,7 @@ def health_check():
327
  @app.route('/moderate', methods=['POST'])
328
  def moderate_content():
329
  """
330
- Enhanced moderation endpoint
331
 
332
  Expected JSON payload:
333
  {
 
34
  "Content-Type": "application/json"
35
  }
36
 
37
+ # Enhanced Arabic Content Moderation with News Detection
38
  self.moderation_prompt = """
39
+ أنت مراجع محتوى عربي محترف متخصص في التمييز بين القصص الأدبية والمحتوى الإخباري. مهمتك مراجعة النصوص العربية ورفض أي محتوى غير أدبي.
40
 
41
+ ## معايير الرفض الصارمة:
42
 
43
+ ### 1. المحتوى الإخباري والصحفي - رفض فوري:
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
+ ### 2. العلامات المميزة للمحتوى الإخباري:
103
+ - استخدام أسماء حقيقية لأشخاص مشهورين
104
+ - ذكر مباريات وأحداث رياضية محددة
105
+ - استخدام مصطلحات إخبارية ("صرح"، "أعلن"، "أكد")
106
+ - التواريخ والأرقام الإحصائية
107
+ - ذكر مؤسسات وشركات حقيقية
108
+ - النبرة الرسمية والتقريرية
109
 
110
+ ### 3. المحتوى الأدبي المقبول:
111
+ **يجب قبول النصوص التي تحتوي على:**
112
+ - شخصيات خيالية أو مجهولة الهوية
113
+ - أحداث متخيلة أو درامية
114
+ - حوار إبداعي وعاطفي
115
+ - وصف الشخصيات والأماكن
116
+ - صراع نفسي أو اجتماعي
117
+ - نهاية مفتوحة أو رسالة أدبية
118
+ - استخدام التشبيهات والمجازات
119
+ - الأسلوب السردي الإبداعي
120
 
121
+ ### 4. الانتهاكات الدينية - فحص صارم:
122
+ **رفض فوري للمحتوى الذي يحتوي على:**
123
+ - أي استهزاء أو تهكم على الله أو الأنبياء
124
+ - انتقاد الآيات القرآنية أو الأحاديث
125
+ - السخرية من الشعائر الدينية
126
+ - التطاول على الصحابة
127
+ - التجديف أو الكفر الصريح
128
+ - السب بالدين
129
 
130
+ ### 5. السب والشتم - فحص صارم:
131
+ **رفض فوري للمحتوى الذي يحتوي على:**
132
+ - الألفاظ الجنسية الصريحة
133
+ - السب بالأعضاء التناسلية
134
+ - الألفاظ الإخراجية
135
+ - إهانة الأم أو العرض
136
+ - السب العرقي بألفاظ قبيحة
137
+ - الكلمات المبتذلة الخادشة
138
 
139
+ ## أمثلة للرفض:
 
140
 
141
+ **مثال إخباري رياضي (يجب رفضه):**
142
+ "لويس سواريز بعد المباراة خرج قال كنا نستطيع الفوز... الشناوي تألق ومنع 3 أهداف مؤكدة... فاز بجائزة رجل المباراة"
143
 
144
+ **مثال مؤتمر صحفي (يجب رفضه):**
145
+ "في مؤتمر صحفي اليوم، صرح الوزير بأن الحكومة ستتخذ إجراءات..."
146
+
147
+ **مثال اجتماع (يجب رفضه):**
148
+ "خلال اجتماع مجلس الإدارة أمس، تم الاتفاق على..."
149
+
150
+ ## أمثلة للقبول:
151
+
152
+ **قصة أدبية (يجب قبولها):**
153
+ "كان يجلس في المقهى كل مساء، يراقب الناس ويحلم بحياة أخرى. في ذلك المساء، دخلت امرأة غريبة غيرت كل شيء..."
154
+
155
+ **حوار درامي (يجب قبوله):**
156
+ "قالت له بصوت مرتجف: لماذا تركتني؟ أجاب وهو يتجنب نظراتها: بعض الأشياء لا يمكن إصلاحها..."
157
+
158
+ ## الاستجابة المطلوبة:
159
+ بعد المراجعة، أجب بكلمة واحدة فقط:
160
+ - "true" - إذا كان النص قصة أدبية إبداعية خالية من الانتهاكات
161
+ - "no" - إذا كان النص إخبارياً أو يحتوي على انتهاكات دينية أو سب فاحش
162
+
163
+ النص المطلوب مراجعته:
164
  """
165
 
166
  def _call_deepseek_api(self, story_content: str) -> Dict[str, Any]:
 
179
  "messages": [
180
  {
181
  "role": "system",
182
+ "content": "أنت مراجع محتوى عربي محترف متخصص في التمييز بين القصص الأدبية والمحتوى الإخباري. يجب عليك رفض أي محتوى إخباري أو صحفي بصرامة."
183
  },
184
  {
185
  "role": "user",
 
187
  }
188
  ],
189
  "max_tokens": 10,
190
+ "temperature": 0.0,
191
  "stream": False
192
  }
193
 
 
208
  logger.error(f"Exception calling Deepseek API: {str(e)}")
209
  return {"error": str(e)}
210
 
211
+ def _pre_check_news_content(self, story_content: str) -> bool:
212
+ """
213
+ Pre-check for obvious news content patterns
214
+
215
+ Args:
216
+ story_content: Content to check
217
+
218
+ Returns:
219
+ True if appears to be news content, False otherwise
220
+ """
221
+ # News indicators in Arabic
222
+ news_patterns = [
223
+ r'بعد المباراة.*قال',
224
+ r'في مؤتمر صحفي',
225
+ r'صرح.*الوزير',
226
+ r'أعلن.*المسؤول',
227
+ r'فاز.*بجائزة.*رجل المباراة',
228
+ r'تألق.*ومنع.*أهداف',
229
+ r'خلال.*الاجتماع',
230
+ r'في.*الجلسة',
231
+ r'الرئيس.*التقى',
232
+ r'البرلمان.*ناقش',
233
+ r'الحكومة.*قررت',
234
+ r'البورصة.*ارتفعت',
235
+ r'أسعار.*النفط',
236
+ r'الشركة.*حققت',
237
+ r'المحافظ.*افتتح',
238
+ r'بلدية.*المدينة',
239
+ r'التطبيق.*الجديد',
240
+ r'الهاتف.*يتميز',
241
+ r'في.*محافظة'
242
+ ]
243
+
244
+ # Check for news patterns
245
+ for pattern in news_patterns:
246
+ if re.search(pattern, story_content, re.IGNORECASE):
247
+ return True
248
+
249
+ # Check for sports-specific terms
250
+ sports_terms = ['المباراة', 'اللاعب', 'المدرب', 'الفريق', 'الهدف', 'الشوط']
251
+ news_verbs = ['صرح', 'أعلن', 'أكد', 'قال', 'فاز', 'تألق']
252
+
253
+ has_sports = any(term in story_content for term in sports_terms)
254
+ has_news_verbs = any(verb in story_content for verb in news_verbs)
255
+
256
+ if has_sports and has_news_verbs:
257
+ return True
258
+
259
+ return False
260
+
261
  def _validate_story_format(self, story_content: str) -> bool:
262
  """
263
  Enhanced validation of story format and content
 
282
  # Arabic characters should be at least 30% of total characters
283
  if arabic_chars < len(story_content.strip()) * 0.3:
284
  return False
 
 
 
 
 
 
 
 
 
 
 
285
 
286
+ # Pre-check for obvious news content
287
+ if self._pre_check_news_content(story_content):
288
+ return False
289
+
 
 
 
 
 
 
 
 
 
 
 
 
290
  return True
291
 
292
  def moderate_story(self, story_content: str) -> Dict[str, Any]:
 
304
  return {
305
  "approved": False,
306
  "response": "no",
307
+ "reason": "المحتوى يبدو أنه تقرير إخباري أو صحفي وليس قصة أدبية، أو فشل في التحقق من صحة التنسيق",
308
  "timestamp": datetime.now().isoformat()
309
  }
310
 
 
344
  }
345
 
346
  if not approved:
347
+ result["reason"] = "المحتوى ينتهك القواعد المجتمعية أو الثقافية أو الدينية، أو أنه ليس قصة أدبية حقيقية بل محتوى إخباري"
348
  else:
349
  result["reason"] = "المحتوى مقبول ويلتزم بالمعايير المطلوبة"
350
 
 
377
  def home():
378
  """Home endpoint with API documentation"""
379
  return jsonify({
380
+ "service": "مراجع المحتوى الأدبي العربي المحسن مع كشف الأخبار",
381
+ "service_en": "Enhanced Arabic Literary Content Moderator with News Detection",
382
+ "version": "3.0.0",
383
+ "description": "AI-powered professional literary critic for Arabic short stories with enhanced news content detection",
384
+ "description_ar": "ناقد أدبي محترف مدعوم بالذكاء الاصطناعي للقصص العربية القصيرة مع كشف محسن للمحتوى الإخباري",
385
  "endpoints": {
386
  "/health": "Health check",
387
  "/moderate": "POST - Moderate single story",
388
  "/moderate/batch": "POST - Moderate multiple stories"
389
  },
390
  "features": [
391
+ "Enhanced news content detection and rejection",
392
+ "Sports reporting detection",
393
+ "Press conference content filtering",
394
+ "Meeting and event content filtering",
395
+ "Religious and cultural compliance checking",
396
  "Professional literary criticism standards",
397
+ "Comprehensive profanity detection"
398
+ ],
399
+ "rejected_content_types": [
400
+ "Sports reports and match analysis",
401
+ "Press conferences and official statements",
402
+ "Meeting minutes and proceedings",
403
+ "Political news and announcements",
404
+ "Economic reports and market updates",
405
+ "Technical reviews and product launches",
406
+ "Local news and municipal updates"
407
  ],
408
  "usage": {
409
  "moderate": {
 
420
  """Health check endpoint"""
421
  return jsonify({
422
  "status": "healthy" if moderator else "unhealthy",
423
+ "service": "Enhanced Arabic Content Moderator with News Detection",
424
  "timestamp": datetime.now().isoformat(),
425
  "api_available": moderator is not None
426
  })
 
428
  @app.route('/moderate', methods=['POST'])
429
  def moderate_content():
430
  """
431
+ Enhanced moderation endpoint with news detection
432
 
433
  Expected JSON payload:
434
  {