Upload 9 files
Browse files- .env.example +13 -0
- .gitignore +64 -0
- DEPLOYMENT.md +154 -0
- HUGGINGFACE_DEPLOYMENT_GUIDE.md +202 -0
- LICENSE +21 -0
- QUICK_START.md +68 -0
- README.md +112 -7
- app.py +333 -0
- requirements.txt +3 -0
.env.example
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Environment Variables for CMA Chatbot
|
| 2 |
+
|
| 3 |
+
# Google Gemini API Key (required for AI functionality)
|
| 4 |
+
GEMINI_API_KEY=your_google_gemini_api_key_here
|
| 5 |
+
|
| 6 |
+
# Alternative name for the API key (Hugging Face Spaces compatibility)
|
| 7 |
+
GOOGLE_API_KEY=your_google_gemini_api_key_here
|
| 8 |
+
|
| 9 |
+
# Instructions:
|
| 10 |
+
# 1. Copy this file to .env
|
| 11 |
+
# 2. Replace 'your_google_gemini_api_key_here' with your actual API key
|
| 12 |
+
# 3. Get your API key from: https://makersuite.google.com/app/apikey
|
| 13 |
+
# 4. For Hugging Face Spaces, add the key as a secret in your Space settings
|
.gitignore
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Environment variables
|
| 2 |
+
.env
|
| 3 |
+
.env.local
|
| 4 |
+
.env.production
|
| 5 |
+
|
| 6 |
+
# Python
|
| 7 |
+
__pycache__/
|
| 8 |
+
*.py[cod]
|
| 9 |
+
*$py.class
|
| 10 |
+
*.so
|
| 11 |
+
.Python
|
| 12 |
+
build/
|
| 13 |
+
develop-eggs/
|
| 14 |
+
dist/
|
| 15 |
+
downloads/
|
| 16 |
+
eggs/
|
| 17 |
+
.eggs/
|
| 18 |
+
lib/
|
| 19 |
+
lib64/
|
| 20 |
+
parts/
|
| 21 |
+
sdist/
|
| 22 |
+
var/
|
| 23 |
+
wheels/
|
| 24 |
+
*.egg-info/
|
| 25 |
+
.installed.cfg
|
| 26 |
+
*.egg
|
| 27 |
+
MANIFEST
|
| 28 |
+
|
| 29 |
+
# Virtual environments
|
| 30 |
+
venv/
|
| 31 |
+
env/
|
| 32 |
+
ENV/
|
| 33 |
+
env.bak/
|
| 34 |
+
venv.bak/
|
| 35 |
+
|
| 36 |
+
# IDE
|
| 37 |
+
.vscode/
|
| 38 |
+
.idea/
|
| 39 |
+
*.swp
|
| 40 |
+
*.swo
|
| 41 |
+
*~
|
| 42 |
+
|
| 43 |
+
# OS
|
| 44 |
+
.DS_Store
|
| 45 |
+
.DS_Store?
|
| 46 |
+
._*
|
| 47 |
+
.Spotlight-V100
|
| 48 |
+
.Trashes
|
| 49 |
+
ehthumbs.db
|
| 50 |
+
Thumbs.db
|
| 51 |
+
|
| 52 |
+
# Logs
|
| 53 |
+
*.log
|
| 54 |
+
logs/
|
| 55 |
+
|
| 56 |
+
# Temporary files
|
| 57 |
+
*.tmp
|
| 58 |
+
*.temp
|
| 59 |
+
temp/
|
| 60 |
+
tmp/
|
| 61 |
+
|
| 62 |
+
# Gradio
|
| 63 |
+
gradio_cached_examples/
|
| 64 |
+
flagged/
|
DEPLOYMENT.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🚀 دليل النشر على Hugging Face Spaces
|
| 2 |
+
|
| 3 |
+
هذا الدليل يوضح كيفية نشر مستشار هيئة أسواق المال على Hugging Face Spaces للحصول على رابط دائم ومجاني.
|
| 4 |
+
|
| 5 |
+
## 📋 المتطلبات المسبقة
|
| 6 |
+
|
| 7 |
+
1. **حساب Hugging Face**: إنشاء حساب مجاني على [huggingface.co](https://huggingface.co)
|
| 8 |
+
2. **Google Gemini API Key**: الحصول على مفتاح API من [Google AI Studio](https://makersuite.google.com/app/apikey)
|
| 9 |
+
|
| 10 |
+
## 🔧 خطوات النشر
|
| 11 |
+
|
| 12 |
+
### الطريقة الأولى: الرفع المباشر (الأسهل)
|
| 13 |
+
|
| 14 |
+
1. **إنشاء Space جديد**
|
| 15 |
+
- اذهب إلى [huggingface.co/new-space](https://huggingface.co/new-space)
|
| 16 |
+
- اختر اسماً للمشروع (مثل: `cma-arabic-chatbot`)
|
| 17 |
+
- اختر `Gradio` كـ SDK
|
| 18 |
+
- اختر `Public` للوصول العام
|
| 19 |
+
|
| 20 |
+
2. **رفع الملفات**
|
| 21 |
+
- ارفع جميع الملفات من هذا المجلد:
|
| 22 |
+
- `app.py` (الملف الرئيسي)
|
| 23 |
+
- `requirements.txt`
|
| 24 |
+
- `README.md`
|
| 25 |
+
- `LICENSE`
|
| 26 |
+
- يمكنك سحب وإفلات الملفات مباشرة في واجهة الويب
|
| 27 |
+
|
| 28 |
+
3. **إعداد المتغيرات السرية**
|
| 29 |
+
- اذهب إلى إعدادات Space
|
| 30 |
+
- أضف متغير سري جديد:
|
| 31 |
+
- **Name**: `GEMINI_API_KEY`
|
| 32 |
+
- **Value**: مفتاح Google Gemini API الخاص بك
|
| 33 |
+
|
| 34 |
+
4. **تشغيل التطبيق**
|
| 35 |
+
- سيتم بناء وتشغيل التطبيق تلقائياً
|
| 36 |
+
- ستحصل على رابط دائم مثل: `https://huggingface.co/spaces/username/cma-arabic-chatbot`
|
| 37 |
+
|
| 38 |
+
### الطريقة الثانية: استخدام Git
|
| 39 |
+
|
| 40 |
+
```bash
|
| 41 |
+
# 1. استنساخ المستودع
|
| 42 |
+
git clone https://huggingface.co/spaces/username/cma-arabic-chatbot
|
| 43 |
+
cd cma-arabic-chatbot
|
| 44 |
+
|
| 45 |
+
# 2. نسخ الملفات
|
| 46 |
+
cp -r /path/to/cma-chatbot-hf/* .
|
| 47 |
+
|
| 48 |
+
# 3. رفع التغييرات
|
| 49 |
+
git add .
|
| 50 |
+
git commit -m "Initial commit: CMA Arabic Chatbot"
|
| 51 |
+
git push
|
| 52 |
+
```
|
| 53 |
+
|
| 54 |
+
## ⚙️ إعدادات متقدمة
|
| 55 |
+
|
| 56 |
+
### تخصيص المظهر
|
| 57 |
+
يمكنك تعديل ملف `app.py` لتخصيص:
|
| 58 |
+
- الألوان والتصميم
|
| 59 |
+
- النصوص والرسائل
|
| 60 |
+
- الأمثلة المعروضة
|
| 61 |
+
|
| 62 |
+
### إضافة المزيد من المعرفة
|
| 63 |
+
لإضافة المزيد من الأسئلة والأجوبة:
|
| 64 |
+
1. عدّل قائمة `_load_default_knowledge()` في `app.py`
|
| 65 |
+
2. أضف الأسئلة والأجوبة الجديدة
|
| 66 |
+
3. احفظ وارفع التغييرات
|
| 67 |
+
|
| 68 |
+
### تحسين الأداء
|
| 69 |
+
- استخدم نموذج AI أسرع إذا لزم الأمر
|
| 70 |
+
- قلل من حجم قاعدة المعرفة للاستجابة الأسرع
|
| 71 |
+
- أضف تخزين مؤقت للاستعلامات المتكررة
|
| 72 |
+
|
| 73 |
+
## 🔒 الأمان والخصوصية
|
| 74 |
+
|
| 75 |
+
### حماية مفتاح API
|
| 76 |
+
- **لا تضع** مفتاح API في الكود مباشرة
|
| 77 |
+
- استخدم **Secrets** في إعدادات Hugging Face Space
|
| 78 |
+
- تأكد من أن `.env` مدرج في `.gitignore`
|
| 79 |
+
|
| 80 |
+
### خصوصية البيانات
|
| 81 |
+
- لا يتم حفظ محادثات المستخدمين
|
| 82 |
+
- جميع المعالجات تتم في الوقت الفعلي
|
| 83 |
+
- لا يتم مشاركة البيانات مع أطراف ثالثة
|
| 84 |
+
|
| 85 |
+
## 🐛 استكشاف الأخطاء
|
| 86 |
+
|
| 87 |
+
### مشاكل شائعة وحلولها
|
| 88 |
+
|
| 89 |
+
**1. خطأ في مفتاح API**
|
| 90 |
+
```
|
| 91 |
+
Error: No API key found
|
| 92 |
+
```
|
| 93 |
+
**الحل**: تأكد من إضافة `GEMINI_API_KEY` في إعدادات Secrets
|
| 94 |
+
|
| 95 |
+
**2. خطأ في التبعيات**
|
| 96 |
+
```
|
| 97 |
+
ModuleNotFoundError: No module named 'gradio'
|
| 98 |
+
```
|
| 99 |
+
**الحل**: تأكد من أن `requirements.txt` يحتوي على جميع المكتبات المطلوبة
|
| 100 |
+
|
| 101 |
+
**3. مشاكل في العرض العربي**
|
| 102 |
+
```
|
| 103 |
+
Arabic text not displaying correctly
|
| 104 |
+
```
|
| 105 |
+
**الحل**: تأكد من أن المتصفح يدعم UTF-8 وأن CSS يحتوي على `direction: rtl`
|
| 106 |
+
|
| 107 |
+
**4. بطء في الاستجابة**
|
| 108 |
+
```
|
| 109 |
+
Timeout errors or slow responses
|
| 110 |
+
```
|
| 111 |
+
**الحل**:
|
| 112 |
+
- تحقق من حالة Google Gemini API
|
| 113 |
+
- قلل من حجم السياق المرسل للنموذج
|
| 114 |
+
- أضف معالجة أخطاء أفضل
|
| 115 |
+
|
| 116 |
+
## 📊 مراقبة الأداء
|
| 117 |
+
|
| 118 |
+
### مقاييس مهمة
|
| 119 |
+
- **وقت الاستجابة**: يجب أن يكون أقل من 10 ثوانٍ
|
| 120 |
+
- **معدل النجاح**: يجب أن يكون أعلى من 95%
|
| 121 |
+
- **رضا المستخدمين**: من خلال التقييمات والتعليقات
|
| 122 |
+
|
| 123 |
+
### تحسين الأداء
|
| 124 |
+
- راقب استخدام API quota
|
| 125 |
+
- حسّن صياغة الأسئلة للنموذج
|
| 126 |
+
- أضف ردود سريعة للأسئلة الشائعة
|
| 127 |
+
|
| 128 |
+
## 🔄 التحديثات والصيانة
|
| 129 |
+
|
| 130 |
+
### تحديث المحتوى
|
| 131 |
+
1. عدّل قاعدة المعرفة في `app.py`
|
| 132 |
+
2. اختبر التغييرات محلياً
|
| 133 |
+
3. ارفع التحديثات إلى Hugging Face
|
| 134 |
+
|
| 135 |
+
### تحديث التقنيات
|
| 136 |
+
- راقب تحديثات Gradio
|
| 137 |
+
- حدّث مكتبات Python في `requirements.txt`
|
| 138 |
+
- اختبر التوافق مع إصدارات جديدة
|
| 139 |
+
|
| 140 |
+
## 📞 الدعم
|
| 141 |
+
|
| 142 |
+
### للمساعدة التقنية
|
| 143 |
+
- [Hugging Face Community](https://huggingface.co/join/discord)
|
| 144 |
+
- [Gradio Documentation](https://gradio.app/docs/)
|
| 145 |
+
- [Google AI Documentation](https://ai.google.dev/docs)
|
| 146 |
+
|
| 147 |
+
### للمساهمة في المشروع
|
| 148 |
+
- افتح Issue للإبلاغ عن مشاكل
|
| 149 |
+
- اقترح تحسينات عبر Pull Requests
|
| 150 |
+
- شارك تجربتك مع المجتمع
|
| 151 |
+
|
| 152 |
+
---
|
| 153 |
+
|
| 154 |
+
**نصيحة**: احتفظ بنسخة احتياطية من مفتاح API وإعدادات المشروع في مكان آمن!
|
HUGGINGFACE_DEPLOYMENT_GUIDE.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🚀 دليل النشر الكامل على Hugging Face Spaces
|
| 2 |
+
|
| 3 |
+
## 📋 ما تحتاجه للبدء
|
| 4 |
+
|
| 5 |
+
✅ **حساب Hugging Face** (مجاني)
|
| 6 |
+
✅ **OpenAI API Key** (لديك بالفعل)
|
| 7 |
+
✅ **ملفات المشروع** (موجودة في هذا المجلد)
|
| 8 |
+
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
## 🔧 الخطوة 1: إعداد حساب Hugging Face
|
| 12 |
+
|
| 13 |
+
### 1.1 إنشاء الحساب
|
| 14 |
+
1. اذهب إلى [huggingface.co](https://huggingface.co)
|
| 15 |
+
2. اضغط "Sign Up" وأنشئ حساباً مجانياً
|
| 16 |
+
3. تأكد من تفعيل البريد الإلكتروني
|
| 17 |
+
|
| 18 |
+
### 1.2 إنشاء Space جديد
|
| 19 |
+
1. اذهب إلى [huggingface.co/new-space](https://huggingface.co/new-space)
|
| 20 |
+
2. املأ البيانات:
|
| 21 |
+
- **Space name**: `cma-arabic-chatbot` (أو أي اسم تريده)
|
| 22 |
+
- **License**: MIT
|
| 23 |
+
- **SDK**: اختر `Gradio`
|
| 24 |
+
- **Visibility**: اختر `Public`
|
| 25 |
+
3. اضغط "Create Space"
|
| 26 |
+
|
| 27 |
+
---
|
| 28 |
+
|
| 29 |
+
## 📁 الخطوة 2: رفع الملفات
|
| 30 |
+
|
| 31 |
+
### 2.1 الملفات المطلوبة (من هذا المجلد)
|
| 32 |
+
ارفع هذه الملفات بالترتيب:
|
| 33 |
+
|
| 34 |
+
1. **`app.py`** - الملف الرئيسي للتطبيق
|
| 35 |
+
2. **`requirements.txt`** - المكتبات المطلوبة
|
| 36 |
+
3. **`README.md`** - وصف المشروع
|
| 37 |
+
|
| 38 |
+
### 2.2 طريقة الرفع
|
| 39 |
+
**الطريقة الأسهل - السحب والإفلات:**
|
| 40 |
+
1. افتح صفحة Space الخاص بك
|
| 41 |
+
2. اسحب الملفات من مجلد `cma-chatbot-hf` وأفلتها في المتصفح
|
| 42 |
+
3. أضف رسالة commit مثل: "Initial upload of CMA chatbot"
|
| 43 |
+
4. اضغط "Commit changes to main"
|
| 44 |
+
|
| 45 |
+
---
|
| 46 |
+
|
| 47 |
+
## 🔑 الخطوة 3: إعداد OpenAI API Key
|
| 48 |
+
|
| 49 |
+
### 3.1 إضافة المفتاح كـ Secret
|
| 50 |
+
1. في صفحة Space، اضغط "Settings" (أعلى اليمين)
|
| 51 |
+
2. اذهب إلى قسم "Repository secrets"
|
| 52 |
+
3. اضغط "Add a new secret"
|
| 53 |
+
4. املأ البيانات:
|
| 54 |
+
- **Name**: `OPENAI_API_KEY`
|
| 55 |
+
- **Value**: الصق مفتاح OpenAI API الخاص بك
|
| 56 |
+
5. اضغط "Add secret"
|
| 57 |
+
|
| 58 |
+
### 3.2 تأكيد الإعداد
|
| 59 |
+
- تأكد من أن اسم المتغير هو `OPENAI_API_KEY` بالضبط
|
| 60 |
+
- لا تضع مسافات أو أحرف إضافية
|
| 61 |
+
- المفتاح يجب أن يبدأ بـ `sk-`
|
| 62 |
+
|
| 63 |
+
---
|
| 64 |
+
|
| 65 |
+
## ⚙️ الخطوة 4: تعديل الكود للعمل مع OpenAI
|
| 66 |
+
|
| 67 |
+
### 4.1 تحديث app.py
|
| 68 |
+
الكود الحالي يستخدم Google Gemini، نحتاج لتعديله لـ OpenAI:
|
| 69 |
+
|
| 70 |
+
```python
|
| 71 |
+
# استبدل هذا الجزء في app.py
|
| 72 |
+
import openai
|
| 73 |
+
import os
|
| 74 |
+
|
| 75 |
+
class CMAGradioBot:
|
| 76 |
+
def __init__(self):
|
| 77 |
+
self.setup_openai()
|
| 78 |
+
self.knowledge_base = CMAKnowledgeBase()
|
| 79 |
+
|
| 80 |
+
def setup_openai(self):
|
| 81 |
+
"""Configure OpenAI API"""
|
| 82 |
+
api_key = os.getenv('OPENAI_API_KEY')
|
| 83 |
+
if not api_key:
|
| 84 |
+
self.client = None
|
| 85 |
+
print("⚠️ No OpenAI API key found. Using fallback responses.")
|
| 86 |
+
return
|
| 87 |
+
|
| 88 |
+
try:
|
| 89 |
+
openai.api_key = api_key
|
| 90 |
+
self.client = openai
|
| 91 |
+
print("✅ OpenAI API configured successfully")
|
| 92 |
+
except Exception as e:
|
| 93 |
+
self.client = None
|
| 94 |
+
print(f"⚠️ Failed to configure OpenAI: {e}")
|
| 95 |
+
```
|
| 96 |
+
|
| 97 |
+
### 4.2 تحديث requirements.txt
|
| 98 |
+
```txt
|
| 99 |
+
gradio>=4.0.0
|
| 100 |
+
openai>=1.0.0
|
| 101 |
+
python-dotenv>=1.0.0
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
---
|
| 105 |
+
|
| 106 |
+
## 🔄 الخطوة 5: تشغيل التطبيق
|
| 107 |
+
|
| 108 |
+
### 5.1 انتظار البناء
|
| 109 |
+
- بعد رفع الملفات، سيبدأ Hugging Face في بناء التطبيق
|
| 110 |
+
- ستظهر رسائل البناء في الأسفل
|
| 111 |
+
- انتظر حتى ترى "Running" باللون الأخضر
|
| 112 |
+
|
| 113 |
+
### 5.2 اختبار التطبيق
|
| 114 |
+
1. ستحصل على رابط مثل: `https://huggingface.co/spaces/username/cma-arabic-chatbot`
|
| 115 |
+
2. اختبر بسؤال بسيط مثل: "ما هي المدة القانونية للاحتفاظ ببيانات KYC؟"
|
| 116 |
+
3. تأكد من أن الإجابة تظهر بالعربية
|
| 117 |
+
|
| 118 |
+
---
|
| 119 |
+
|
| 120 |
+
## 🛠️ استكشاف الأخطاء الشائعة
|
| 121 |
+
|
| 122 |
+
### ❌ خطأ: "No API key found"
|
| 123 |
+
**الحل:**
|
| 124 |
+
1. تأكد من إضافة `OPENAI_API_KEY` في Secrets
|
| 125 |
+
2. تأكد من كتابة الاسم بالضبط
|
| 126 |
+
3. أعد تشغيل Space (Settings → Restart this Space)
|
| 127 |
+
|
| 128 |
+
### ❌ خطأ: "Module not found"
|
| 129 |
+
**الحل:**
|
| 130 |
+
1. تأكد من رفع `requirements.txt`
|
| 131 |
+
2. تأكد من أن المحتوى صحيح
|
| 132 |
+
3. انتظر اكتمال البناء
|
| 133 |
+
|
| 134 |
+
### ❌ خطأ: "Build failed"
|
| 135 |
+
**الحل:**
|
| 136 |
+
1. تحقق من رسائل الخطأ في logs
|
| 137 |
+
2. تأكد من أن `app.py` لا يحتوي على أخطاء syntax
|
| 138 |
+
3. تأكد من أن جميع imports موجودة في requirements.txt
|
| 139 |
+
|
| 140 |
+
### ❌ النص العربي لا يظهر بشكل صحيح
|
| 141 |
+
**الحل:**
|
| 142 |
+
1. تأكد من أن المتصفح يدعم UTF-8
|
| 143 |
+
2. تحقق من CSS في app.py (direction: rtl)
|
| 144 |
+
3. جرب متصفح مختلف
|
| 145 |
+
|
| 146 |
+
---
|
| 147 |
+
|
| 148 |
+
## 📊 التحقق من نجاح النشر
|
| 149 |
+
|
| 150 |
+
### ✅ علامات النجاح:
|
| 151 |
+
- [ ] التطبيق يعمل بدون أخطاء
|
| 152 |
+
- [ ] النص العربي يظهر بشكل صحيح (من اليمين لليسار)
|
| 153 |
+
- [ ] الأسئلة تحصل على إجابات
|
| 154 |
+
- [ ] الرابط يعمل من أجهزة مختلفة
|
| 155 |
+
- [ ] لا توجد رسائل خطأ في console
|
| 156 |
+
|
| 157 |
+
### 🎯 اختبار سريع:
|
| 158 |
+
جرب هذه الأسئلة:
|
| 159 |
+
1. "ما هي المدة القانونية للاحتفاظ ببيانات KYC؟"
|
| 160 |
+
2. "هل هناك قيود على تداولات الموظفين؟"
|
| 161 |
+
3. "ما هي متطلبات الإفصاح؟" (يجب أن يقول لا توجد معلومات)
|
| 162 |
+
|
| 163 |
+
---
|
| 164 |
+
|
| 165 |
+
## 🔄 تحديث التطبيق لاحقاً
|
| 166 |
+
|
| 167 |
+
### لإضافة المزيد من الأسئلة:
|
| 168 |
+
1. عدّل قائمة `_load_default_knowledge()` في `app.py`
|
| 169 |
+
2. أضف الأسئلة والأجوبة الجديدة
|
| 170 |
+
3. ارفع الملف المحدث
|
| 171 |
+
4. سيتم إعادة بناء التطبيق تلقائياً
|
| 172 |
+
|
| 173 |
+
### لتحديث التصميم:
|
| 174 |
+
1. عدّل CSS في `app.py`
|
| 175 |
+
2. غيّر الألوان أو التخطيط
|
| 176 |
+
3. ارفع التحديث
|
| 177 |
+
|
| 178 |
+
---
|
| 179 |
+
|
| 180 |
+
## 📞 الحصول على المساعدة
|
| 181 |
+
|
| 182 |
+
### إذا واجهت مشاكل:
|
| 183 |
+
1. **Hugging Face Community**: [hf.co/join/discord](https://hf.co/join/discord)
|
| 184 |
+
2. **Gradio Docs**: [gradio.app/docs](https://gradio.app/docs)
|
| 185 |
+
3. **OpenAI Docs**: [platform.openai.com/docs](https://platform.openai.com/docs)
|
| 186 |
+
|
| 187 |
+
### معلومات مفيدة للدعم:
|
| 188 |
+
- رابط Space الخاص بك
|
| 189 |
+
- رسائل الخطأ (إن وجدت)
|
| 190 |
+
- متصفح ونظام التشغيل المستخدم
|
| 191 |
+
|
| 192 |
+
---
|
| 193 |
+
|
| 194 |
+
## 🎉 تهانينا!
|
| 195 |
+
|
| 196 |
+
بمجرد اكتمال هذه الخطوات، ستحصل على:
|
| 197 |
+
- ✅ **رابط دائم** لتطبيق CMA chatbot
|
| 198 |
+
- ✅ **استضافة مجانية** على Hugging Face
|
| 199 |
+
- ✅ **واجهة احترافية** باللغة العربية
|
| 200 |
+
- ✅ **إمكانية المشاركة** مع الآخرين
|
| 201 |
+
|
| 202 |
+
**رابطك سيكون:** `https://huggingface.co/spaces/username/cma-arabic-chatbot`
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2024 CMA Arabic Document Chatbot
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
QUICK_START.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ⚡ دليل البدء السريع - 5 دقائق للنشر
|
| 2 |
+
|
| 3 |
+
## 🎯 الهدف
|
| 4 |
+
نشر مستشار هيئة أسواق المال على Hugging Face Spaces في 5 دقائق فقط!
|
| 5 |
+
|
| 6 |
+
## 📝 الخطوات السريعة
|
| 7 |
+
|
| 8 |
+
### 1️⃣ إنشاء حساب (دقيقة واحدة)
|
| 9 |
+
- اذهب إلى [huggingface.co](https://huggingface.co) وأنشئ حساباً مجانياً
|
| 10 |
+
|
| 11 |
+
### 2️⃣ الحصول على API Key (دقيقتان)
|
| 12 |
+
- اذهب إلى [Google AI Studio](https://makersuite.google.com/app/apikey)
|
| 13 |
+
- اضغط "Create API Key"
|
| 14 |
+
- انسخ المفتاح واحتفظ به
|
| 15 |
+
|
| 16 |
+
### 3️⃣ إنشاء Space (دقيقة واحدة)
|
| 17 |
+
- اذهب إلى [huggingface.co/new-space](https://huggingface.co/new-space)
|
| 18 |
+
- **Space name**: `cma-arabic-chatbot` (أو أي اسم تريده)
|
| 19 |
+
- **SDK**: اختر `Gradio`
|
| 20 |
+
- **Visibility**: اختر `Public`
|
| 21 |
+
- اضغط "Create Space"
|
| 22 |
+
|
| 23 |
+
### 4️⃣ رفع الملفات (دقيقة واحدة)
|
| 24 |
+
سحب وإفلات هذه الملفات في Space:
|
| 25 |
+
- ✅ `app.py`
|
| 26 |
+
- ✅ `requirements.txt`
|
| 27 |
+
- ✅ `README.md`
|
| 28 |
+
|
| 29 |
+
### 5️⃣ إضافة API Key (30 ثانية)
|
| 30 |
+
- في صفحة Space، اضغط "Settings"
|
| 31 |
+
- اذهب إلى "Repository secrets"
|
| 32 |
+
- اضغط "Add a new secret"
|
| 33 |
+
- **Name**: `GEMINI_API_KEY`
|
| 34 |
+
- **Value**: الصق مفتاح Google API
|
| 35 |
+
- اضغط "Add secret"
|
| 36 |
+
|
| 37 |
+
## 🎉 انتهيت!
|
| 38 |
+
|
| 39 |
+
سيتم بناء التطبيق تلقائياً وستحصل على رابط مثل:
|
| 40 |
+
`https://huggingface.co/spaces/username/cma-arabic-chatbot`
|
| 41 |
+
|
| 42 |
+
## 🔧 إذا واجهت مشاكل
|
| 43 |
+
|
| 44 |
+
### المشكلة: "No API key found"
|
| 45 |
+
**الحل**: تأكد من إضافة `GEMINI_API_KEY` في Secrets
|
| 46 |
+
|
| 47 |
+
### المشكلة: "Build failed"
|
| 48 |
+
**الحل**: تأكد من رفع `requirements.txt`
|
| 49 |
+
|
| 50 |
+
### المشكلة: "Arabic text not showing"
|
| 51 |
+
**الحل**: انتظر دقيقتين لاكتمال البناء
|
| 52 |
+
|
| 53 |
+
## 📱 اختبار سريع
|
| 54 |
+
|
| 55 |
+
جرب هذه الأسئلة:
|
| 56 |
+
- ما هي المدة القانونية للاحتفاظ ببيانات KYC؟
|
| 57 |
+
- هل هناك قيود على تداولات الموظفين؟
|
| 58 |
+
|
| 59 |
+
## 🚀 مشاركة التطبيق
|
| 60 |
+
|
| 61 |
+
بمجرد أن يعمل التطبيق:
|
| 62 |
+
- انسخ الرابط وشاركه
|
| 63 |
+
- أضفه إلى موقعك الإلكتروني
|
| 64 |
+
- استخدمه في العروض التقديمية
|
| 65 |
+
|
| 66 |
+
---
|
| 67 |
+
|
| 68 |
+
**تهانينا! 🎊 لديك الآن مستشار CMA يعمل على الإنترنت مجاناً!**
|
README.md
CHANGED
|
@@ -1,14 +1,119 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: blue
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
license:
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
---
|
| 13 |
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: CMA Arabic Document Chatbot
|
| 3 |
+
emoji: 🤖
|
| 4 |
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: gradio
|
| 7 |
+
sdk_version: 4.44.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
+
language:
|
| 12 |
+
- ar
|
| 13 |
+
tags:
|
| 14 |
+
- chatbot
|
| 15 |
+
- arabic
|
| 16 |
+
- legal
|
| 17 |
+
- finance
|
| 18 |
+
- cma
|
| 19 |
+
- kuwait
|
| 20 |
+
- regulations
|
| 21 |
---
|
| 22 |
|
| 23 |
+
# 🤖 مستشار هيئة أسواق المال الكويتية
|
| 24 |
+
|
| 25 |
+
## نظرة عامة
|
| 26 |
+
|
| 27 |
+
مساعد ذكي متخصص في قوانين ولوائح هيئة أسواق المال الكويتية (CMA). يستخدم الذكاء الاصطناعي وقاعدة معرفة متخصصة لتقديم إجابات دقيقة ومفيدة حول الاستفسارات التنظيمية والقانونية.
|
| 28 |
+
|
| 29 |
+
## المميزات الرئيسية
|
| 30 |
+
|
| 31 |
+
### 🎯 **التخصص**
|
| 32 |
+
- متخصص في قوانين هيئة أسواق المال الكويتية
|
| 33 |
+
- يغطي مواضيع KYC، التفويض القانوني، قيود الموظفين، وإدارة الاستثمار
|
| 34 |
+
- معلومات محدثة ودقيقة من المصادر الرسمية
|
| 35 |
+
|
| 36 |
+
### 🤖 **التقنية المتقدمة**
|
| 37 |
+
- مدعوم بنموذج Google Gemini-1.5-Flash للذكاء الاصطناعي
|
| 38 |
+
- قاعدة معرفة متخصصة ومنظمة
|
| 39 |
+
- معالجة طبيعية للغة العربية
|
| 40 |
+
|
| 41 |
+
### 🎨 **واجهة مستخدم متقدمة**
|
| 42 |
+
- تصميم يدعم اللغة العربية (RTL)
|
| 43 |
+
- واجهة تفاعلية وسهلة الاستخدام
|
| 44 |
+
- أمثلة توضيحية ومساعدة مدمجة
|
| 45 |
+
|
| 46 |
+
## الأسئلة المدعومة
|
| 47 |
+
|
| 48 |
+
يمكن للمستشار الإجابة على أسئلة متنوعة مثل:
|
| 49 |
+
|
| 50 |
+
### 📊 **بيانات العملاء**
|
| 51 |
+
- ما هي المدة القانونية للاحتفاظ ببيانات اعرف عميلك (KYC)؟
|
| 52 |
+
- ما هي متطلبات تحديث بيانات العملاء؟
|
| 53 |
+
|
| 54 |
+
### 📝 **التفويض القانوني**
|
| 55 |
+
- ما هي شروط التفويض القانوني لفتح الحسابات الاستثمارية؟
|
| 56 |
+
- هل يجوز أن يكون التفويض إلكترونياً؟
|
| 57 |
+
|
| 58 |
+
### 👥 **قيود الموظفين**
|
| 59 |
+
- هل هناك قيود على تداولات موظفي الشركات المرخصة؟
|
| 60 |
+
- ما هي إجراءات الإبلاغ عن تداولات الموظفين؟
|
| 61 |
+
|
| 62 |
+
### 💼 **إدارة الاستثمار**
|
| 63 |
+
- هل يجوز التواصل مع العملاء قبل الحصول على ترخيص التسويق؟
|
| 64 |
+
- ما هي التزامات حماية أموال العملاء؟
|
| 65 |
+
|
| 66 |
+
## كيفية الاستخدام
|
| 67 |
+
|
| 68 |
+
1. **اكتب سؤالك** في مربع النص
|
| 69 |
+
2. **اضغط إرسال** أو اضغط Enter
|
| 70 |
+
3. **احصل على إجابة** مفصلة ودقيقة
|
| 71 |
+
4. **استمر في المحادثة** لمزيد من التوضيح
|
| 72 |
+
|
| 73 |
+
## التقنيات المستخدمة
|
| 74 |
+
|
| 75 |
+
- **Gradio**: لبناء واجهة الويب التفاعلية
|
| 76 |
+
- **Google Gemini AI**: لمعالجة الاستفسارات وتوليد الإجابات
|
| 77 |
+
- **Python**: لغة البرمجة الأساسية
|
| 78 |
+
- **HTML/CSS**: لتخصيص التصميم والدعم العربي
|
| 79 |
+
|
| 80 |
+
## الإعداد والتشغيل
|
| 81 |
+
|
| 82 |
+
### متطلبات النظام
|
| 83 |
+
```bash
|
| 84 |
+
pip install -r requirements.txt
|
| 85 |
+
```
|
| 86 |
+
|
| 87 |
+
### متغيرات البيئة
|
| 88 |
+
```bash
|
| 89 |
+
GEMINI_API_KEY=your_google_gemini_api_key
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
### تشغيل التطبيق
|
| 93 |
+
```bash
|
| 94 |
+
python app.py
|
| 95 |
+
```
|
| 96 |
+
|
| 97 |
+
## ملاحظات مهمة
|
| 98 |
+
|
| 99 |
+
⚠️ **تنبيه**: هذا المستشار يقدم معلومات عامة للمساعدة والتوجيه. للحصول على استشارة قانونية رسمية أو معلومات محدثة، يرجى مراجعة الموقع الرسمي لهيئة أسواق المال الكويتية.
|
| 100 |
+
|
| 101 |
+
## الترخيص
|
| 102 |
+
|
| 103 |
+
هذا المشروع مرخص تحت رخصة MIT - راجع ملف [LICENSE](LICENSE) للتفاصيل.
|
| 104 |
+
|
| 105 |
+
## المساهمة
|
| 106 |
+
|
| 107 |
+
نرحب بالمساهمات لتحسين المستشار وإضافة المزيد من المعلومات. يرجى:
|
| 108 |
+
|
| 109 |
+
1. عمل Fork للمشروع
|
| 110 |
+
2. إنشاء فرع جديد للميزة
|
| 111 |
+
3. تقديم Pull Request
|
| 112 |
+
|
| 113 |
+
## الدعم
|
| 114 |
+
|
| 115 |
+
للأسئلة أو المشاكل التقنية، يرجى فتح Issue في المستودع.
|
| 116 |
+
|
| 117 |
+
---
|
| 118 |
+
|
| 119 |
+
**تم تطوير هذا المستشار لتسهيل الوصول إلى المعلومات التنظيمية والقانونية لهيئة أسواق المال الكويتية**
|
app.py
CHANGED
|
@@ -0,0 +1,333 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
CMA Arabic Document Chatbot for Hugging Face Spaces - OpenAI Version
|
| 4 |
+
Specialized chatbot for Kuwait Capital Markets Authority regulations
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import os
|
| 8 |
+
import json
|
| 9 |
+
import gradio as gr
|
| 10 |
+
import openai
|
| 11 |
+
from typing import List, Dict, Any, Optional
|
| 12 |
+
|
| 13 |
+
class CMAKnowledgeBase:
|
| 14 |
+
"""Knowledge base for CMA regulations and Q&A"""
|
| 15 |
+
|
| 16 |
+
def __init__(self):
|
| 17 |
+
self.qa_data = self._load_default_knowledge()
|
| 18 |
+
|
| 19 |
+
def _load_default_knowledge(self) -> List[Dict[str, Any]]:
|
| 20 |
+
"""Load default CMA knowledge base"""
|
| 21 |
+
return [
|
| 22 |
+
{
|
| 23 |
+
"question": "ما هي المدة القانونية التي يجب أن يحتفظ فيها الشخص المرخص له ببيانات اعرف عميلك (KYC) بعد انتهاء العلاقة مع العميل؟",
|
| 24 |
+
"answer": "خمس سنوات.",
|
| 25 |
+
"category": "Capital Markets"
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
"question": "ما هي الشروط التي يجب أن تتوافر في التفويض القانوني الذي يسمح لشخص بفتح وتشغيل حساب استثماري نيابة عن عميل؟ وهل يجوز أن يكون التفويض إلكترونياً؟",
|
| 29 |
+
"answer": "• يجب أن يكون التفويض صادرًا من كاتب عدل أو موثق معتمد من وزارة العدل.\n• يجب أن يتضمن نصا صريحًا بالصلاحيات المفوضة مثل فتح الحساب، تشغيله، إجراء الحوالات، أو بيع وشراء الأوراق المالية.\n• لا يعتد بالتفويض الإلكتروني إلا إذا كان موثقًا ومعتمدًا وفق قانون المعاملات الإلكترونية.",
|
| 30 |
+
"category": "Capital Markets"
|
| 31 |
+
},
|
| 32 |
+
{
|
| 33 |
+
"question": "هل هناك قيود مفروضة على موظفي الشخص المرخص له من قبل هيئة أسواق المال بالنسبة لتداولاتهم؟",
|
| 34 |
+
"answer": "يتعين على موظفي الشخص المرخص له الالتزام بالتعليمات والقيود المفروضة عليهم من قبل الهيئة، حيث يتعين إبلاغ مسؤول المطابقة والالتزام - على الفور - بأي صفقة (بيع أو شراء أوراق مالية محلية) يجريها عن نفسه أو بالإنابة عن أحد أقربائه أو عن شركة تابعة له أو لأحد أقربائه.",
|
| 35 |
+
"category": "Capital Markets"
|
| 36 |
+
},
|
| 37 |
+
{
|
| 38 |
+
"question": "هل يجوز للشخص المرخص له بمزاولة نشاط مدير استثمار جماعي أن يتواصل مع بعض العملاء لمعرفة رأيهم بشأن الاستثمار في صندوق يرغب بتسويقه مستقبلاً؟ وذلك قبل حصوله على ترخيص تسويق الصندوق من الهيئة؟",
|
| 39 |
+
"answer": "يجوز للهيئة – بناء على طلب مقدم - أن تسمح للمسوق خلال فترة استكمال متطلبات الهيئة التواصل مع العملاء المحترفين المحتملين لبحث رغبتهم بالاستثمار في الصندوق المزمع تسويقه دون الإعلان في وسائل الاعلام، وأن لا يتم تقاضي أي مبالغ نقدية أو غير نقدية أو الحصول على التزام نهائي من العملاء بالاشتراك في الصندوق قبل الحصول على ترخيص التسويق من الهيئة.",
|
| 40 |
+
"category": "Capital Markets"
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
"question": "ما هي التزامات الشخص المرخص له تجاه حماية أموال العملاء؟",
|
| 44 |
+
"answer": "يجب على الشخص المرخص له الالتزام بقوانين اعرف عميلك (KYC) والاحتفاظ ببيانات العملاء لمدة خمس سنوات، والتأكد من صحة التفويضات القانونية، والإبلاغ الفوري عن تعاملات الموظفين لمنع تضارب المصالح، والامتثال لقوانين هيئة أسواق المال لضمان حماية أموال العملاء من خلال الشفافية والنزاهة في التعاملات المالية.",
|
| 45 |
+
"category": "Capital Markets"
|
| 46 |
+
}
|
| 47 |
+
]
|
| 48 |
+
|
| 49 |
+
def get_cma_context(self) -> List[Dict[str, str]]:
|
| 50 |
+
"""Get CMA-specific context for AI prompts"""
|
| 51 |
+
return [
|
| 52 |
+
{
|
| 53 |
+
'question': item['question'],
|
| 54 |
+
'answer': item['answer']
|
| 55 |
+
}
|
| 56 |
+
for item in self.qa_data
|
| 57 |
+
if item.get('category') == 'Capital Markets'
|
| 58 |
+
]
|
| 59 |
+
|
| 60 |
+
class CMAGradioBot:
|
| 61 |
+
"""Main chatbot class for CMA regulations using OpenAI"""
|
| 62 |
+
|
| 63 |
+
def __init__(self):
|
| 64 |
+
self.knowledge_base = CMAKnowledgeBase()
|
| 65 |
+
self.setup_openai()
|
| 66 |
+
|
| 67 |
+
def setup_openai(self):
|
| 68 |
+
"""Configure OpenAI API"""
|
| 69 |
+
# Try to get API key from environment or Hugging Face secrets
|
| 70 |
+
api_key = os.getenv('OPENAI_API_KEY')
|
| 71 |
+
|
| 72 |
+
if not api_key:
|
| 73 |
+
# For demo purposes, we'll handle this gracefully
|
| 74 |
+
self.client = None
|
| 75 |
+
print("⚠️ No OpenAI API key found. Using fallback responses.")
|
| 76 |
+
return
|
| 77 |
+
|
| 78 |
+
try:
|
| 79 |
+
# Set up OpenAI client
|
| 80 |
+
openai.api_key = api_key
|
| 81 |
+
self.client = openai
|
| 82 |
+
print("✅ OpenAI API configured successfully")
|
| 83 |
+
except Exception as e:
|
| 84 |
+
self.client = None
|
| 85 |
+
print(f"⚠️ Failed to configure OpenAI: {e}")
|
| 86 |
+
|
| 87 |
+
def generate_response(self, question: str) -> str:
|
| 88 |
+
"""Generate response using OpenAI with CMA context"""
|
| 89 |
+
|
| 90 |
+
# If no AI model available, use fallback
|
| 91 |
+
if not self.client:
|
| 92 |
+
return self._fallback_response(question)
|
| 93 |
+
|
| 94 |
+
try:
|
| 95 |
+
# Get CMA context
|
| 96 |
+
cma_context = self.knowledge_base.get_cma_context()
|
| 97 |
+
|
| 98 |
+
# Build context prompt
|
| 99 |
+
context_prompt = """أنت مستشار متخصص في قوانين هيئة أسواق المال الكويتية (CMA).
|
| 100 |
+
استخدم المعلومات التالية للإجابة على الأسئلة بدقة ومهنية.
|
| 101 |
+
|
| 102 |
+
المعلومات المرجعية من قاعدة المعرفة:
|
| 103 |
+
"""
|
| 104 |
+
|
| 105 |
+
# Add context from knowledge base
|
| 106 |
+
for item in cma_context:
|
| 107 |
+
if item['question'] and item['answer']:
|
| 108 |
+
context_prompt += f"\nسؤال: {item['question']}\nجواب: {item['answer']}\n"
|
| 109 |
+
|
| 110 |
+
# Add current question
|
| 111 |
+
context_prompt += f"""
|
| 112 |
+
الآن أجب على السؤال التالي بناءً على المعلومات المتوفرة:
|
| 113 |
+
|
| 114 |
+
سؤال: {question}
|
| 115 |
+
|
| 116 |
+
إرشادات الإجابة:
|
| 117 |
+
- إذا كانت المعلومات متوفرة في قاعدة المعرفة، قدم إجابة دقيقة ومفصلة
|
| 118 |
+
- إذا لم تكن المعلومات متوفرة، اعترف بذلك بصراحة وأرشد المستخدم للمصادر الرسمية
|
| 119 |
+
- استخدم اللغة العربية الفصحى المهنية
|
| 120 |
+
- كن مختصراً ومفيداً ودقيقاً
|
| 121 |
+
|
| 122 |
+
جواب:"""
|
| 123 |
+
|
| 124 |
+
# Generate response using OpenAI
|
| 125 |
+
response = self.client.ChatCompletion.create(
|
| 126 |
+
model="gpt-3.5-turbo",
|
| 127 |
+
messages=[
|
| 128 |
+
{"role": "system", "content": "أنت مستشار متخصص في قوانين هيئة أسواق المال الكويتية. أجب باللغة العربية فقط."},
|
| 129 |
+
{"role": "user", "content": context_prompt}
|
| 130 |
+
],
|
| 131 |
+
max_tokens=500,
|
| 132 |
+
temperature=0.3
|
| 133 |
+
)
|
| 134 |
+
|
| 135 |
+
return response.choices[0].message.content.strip()
|
| 136 |
+
|
| 137 |
+
except Exception as e:
|
| 138 |
+
error_msg = f"عذراً، حدث خطأ في معالجة السؤال. يرجى المحاولة مرة أخرى أو التواصل مع هيئة أسواق المال مباشرة للحصول على معلومات رسمية."
|
| 139 |
+
print(f"Error generating response: {e}")
|
| 140 |
+
return error_msg
|
| 141 |
+
|
| 142 |
+
def _fallback_response(self, question: str) -> str:
|
| 143 |
+
"""Fallback response when AI model is not available"""
|
| 144 |
+
# Simple keyword matching for demo
|
| 145 |
+
question_lower = question.lower()
|
| 146 |
+
|
| 147 |
+
if "kyc" in question_lower or "اعرف عميلك" in question:
|
| 148 |
+
return "بناءً على قوانين هيئة أسواق المال الكويتية، يجب الاحتفاظ ببيانات اعرف عميلك (KYC) لمدة خمس سنوات بعد انتهاء العلاقة مع العميل."
|
| 149 |
+
|
| 150 |
+
elif "تفويض" in question or "حساب استثماري" in question:
|
| 151 |
+
return "يجب أن يكون التفويض القانوني صادراً من كاتب عدل أو موثق معتمد من وزارة العدل، ويتضمن نصاً صريحاً بالصلاحيات المفوضة. لا يُعتد بالتفويض الإلكتروني إلا إذا كان موثقاً ومعتمداً وفق قانون المعاملات الإلكترونية."
|
| 152 |
+
|
| 153 |
+
elif "موظف" in question or "تداول" in question:
|
| 154 |
+
return "يتعين على موظفي الشخص المرخص له إبلاغ مسؤول المطابقة والالتزام على الفور بأي صفقة (بيع أو شراء أوراق مالية محلية) يجريها عن نفسه أو بالإنابة عن أحد أقربائه."
|
| 155 |
+
|
| 156 |
+
else:
|
| 157 |
+
return "عذراً، لا تتوفر معلومات كافية في قاعدة المعرفة الحالية للإجابة على هذا السؤال. يرجى الرجوع إلى الموقع الرسمي لهيئة أسواق المال الكويتية أو التواصل معهم مباشرة للحصول على معلومات دقيقة ومحدثة."
|
| 158 |
+
|
| 159 |
+
def create_gradio_interface():
|
| 160 |
+
"""Create and configure Gradio interface"""
|
| 161 |
+
|
| 162 |
+
# Initialize chatbot
|
| 163 |
+
bot = CMAGradioBot()
|
| 164 |
+
|
| 165 |
+
def chat_response(message, history):
|
| 166 |
+
"""Handle chat responses"""
|
| 167 |
+
if not message.strip():
|
| 168 |
+
return history, ""
|
| 169 |
+
|
| 170 |
+
# Generate response
|
| 171 |
+
response = bot.generate_response(message)
|
| 172 |
+
|
| 173 |
+
# Update history
|
| 174 |
+
if history is None:
|
| 175 |
+
history = []
|
| 176 |
+
|
| 177 |
+
history.append([message, response])
|
| 178 |
+
return history, ""
|
| 179 |
+
|
| 180 |
+
# Create Gradio interface with custom theme
|
| 181 |
+
with gr.Blocks(
|
| 182 |
+
title="مستشار هيئة أسواق المال الكويتية",
|
| 183 |
+
theme=gr.themes.Soft(
|
| 184 |
+
primary_hue="blue",
|
| 185 |
+
secondary_hue="gray",
|
| 186 |
+
neutral_hue="gray"
|
| 187 |
+
),
|
| 188 |
+
css="""
|
| 189 |
+
.gradio-container {
|
| 190 |
+
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
| 191 |
+
direction: rtl;
|
| 192 |
+
text-align: right;
|
| 193 |
+
}
|
| 194 |
+
.chat-message {
|
| 195 |
+
text-align: right;
|
| 196 |
+
direction: rtl;
|
| 197 |
+
}
|
| 198 |
+
.message-wrap {
|
| 199 |
+
direction: rtl;
|
| 200 |
+
}
|
| 201 |
+
.message {
|
| 202 |
+
text-align: right;
|
| 203 |
+
}
|
| 204 |
+
"""
|
| 205 |
+
) as interface:
|
| 206 |
+
|
| 207 |
+
# Header
|
| 208 |
+
gr.HTML("""
|
| 209 |
+
<div style="text-align: center; padding: 30px; background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%); color: white; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);">
|
| 210 |
+
<h1 style="margin: 0; font-size: 2.5rem; font-weight: bold;">🤖 مستشار هيئة أسواق المال الكويتية</h1>
|
| 211 |
+
<p style="margin: 15px 0 0 0; font-size: 1.2rem; opacity: 0.9;">مساعد ذكي متخصص في الاستشارات التنظيمية والقانونية</p>
|
| 212 |
+
<p style="margin: 10px 0 0 0; font-size: 1rem; opacity: 0.8;">مدعوم بالذكاء الاصطناعي وقاعدة معرفة متخصصة</p>
|
| 213 |
+
</div>
|
| 214 |
+
""")
|
| 215 |
+
|
| 216 |
+
# Main chat interface
|
| 217 |
+
with gr.Row():
|
| 218 |
+
with gr.Column(scale=1):
|
| 219 |
+
chatbot = gr.Chatbot(
|
| 220 |
+
label="💬 المحادثة مع المستشار",
|
| 221 |
+
height=500,
|
| 222 |
+
show_label=True,
|
| 223 |
+
container=True,
|
| 224 |
+
show_copy_button=True,
|
| 225 |
+
type="tuples"
|
| 226 |
+
)
|
| 227 |
+
|
| 228 |
+
with gr.Row():
|
| 229 |
+
msg = gr.Textbox(
|
| 230 |
+
label="✍️ اكتب سؤالك هنا",
|
| 231 |
+
placeholder="مثال: ما هي المدة القانونية للاحتفاظ ببيانات KYC؟",
|
| 232 |
+
lines=2,
|
| 233 |
+
max_lines=5,
|
| 234 |
+
show_label=True,
|
| 235 |
+
container=True,
|
| 236 |
+
scale=4
|
| 237 |
+
)
|
| 238 |
+
|
| 239 |
+
submit_btn = gr.Button(
|
| 240 |
+
"📤 إرسال",
|
| 241 |
+
variant="primary",
|
| 242 |
+
scale=1,
|
| 243 |
+
size="lg"
|
| 244 |
+
)
|
| 245 |
+
|
| 246 |
+
clear_btn = gr.Button(
|
| 247 |
+
"🗑️ مسح المحادثة",
|
| 248 |
+
variant="secondary",
|
| 249 |
+
size="sm"
|
| 250 |
+
)
|
| 251 |
+
|
| 252 |
+
# Example questions section
|
| 253 |
+
with gr.Accordion("📋 أمثلة على الأسئلة المتاحة", open=False):
|
| 254 |
+
gr.HTML("""
|
| 255 |
+
<div style="padding: 20px; background: #f8f9fa; border-radius: 10px; direction: rtl; text-align: right;">
|
| 256 |
+
<h3 style="color: #2c3e50; margin-bottom: 15px;">أسئلة يمكن للمستشار الإجابة عليها:</h3>
|
| 257 |
+
<div style="display: grid; gap: 10px;">
|
| 258 |
+
<div style="padding: 10px; background: white; border-radius: 8px; border-right: 4px solid #007bff;">
|
| 259 |
+
<strong>📊 بيانات العملاء:</strong> ما هي المدة القانونية للاحتفاظ ببيانات اعرف عميلك (KYC)؟
|
| 260 |
+
</div>
|
| 261 |
+
<div style="padding: 10px; background: white; border-radius: 8px; border-right: 4px solid #28a745;">
|
| 262 |
+
<strong>📝 التفويض القانوني:</strong> ما هي شروط التفويض القانوني لفتح الحسابات الاستثمارية؟
|
| 263 |
+
</div>
|
| 264 |
+
<div style="padding: 10px; background: white; border-radius: 8px; border-right: 4px solid #ffc107;">
|
| 265 |
+
<strong>👥 قيود الموظفين:</strong> هل هناك قيود على تداولات موظفي الشركات المرخصة؟
|
| 266 |
+
</div>
|
| 267 |
+
<div style="padding: 10px; background: white; border-radius: 8px; border-right: 4px solid #dc3545;">
|
| 268 |
+
<strong>💼 إدارة الاستثمار:</strong> هل يجوز التواصل مع العملاء قبل الحصول على ترخيص التسويق؟
|
| 269 |
+
</div>
|
| 270 |
+
</div>
|
| 271 |
+
</div>
|
| 272 |
+
""")
|
| 273 |
+
|
| 274 |
+
# Information section
|
| 275 |
+
with gr.Accordion("ℹ️ معلومات مهمة", open=False):
|
| 276 |
+
gr.HTML("""
|
| 277 |
+
<div style="padding: 20px; background: #e3f2fd; border-radius: 10px; direction: rtl; text-align: right;">
|
| 278 |
+
<h3 style="color: #1565c0; margin-bottom: 15px;">🔍 حول هذا المستشار:</h3>
|
| 279 |
+
<ul style="line-height: 1.8; color: #424242;">
|
| 280 |
+
<li><strong>التخصص:</strong> قوانين ولوائح هيئة أسواق المال الكويتية (CMA)</li>
|
| 281 |
+
<li><strong>التقنية:</strong> مدعوم بالذكاء الاصطناعي (OpenAI GPT) وقاعدة معرفة متخصصة</li>
|
| 282 |
+
<li><strong>اللغة:</strong> العربية مع دعم كامل للنصوص من اليمين إلى اليسار</li>
|
| 283 |
+
<li><strong>الدقة:</strong> يعتمد على مصادر رسمية ويوضح حدود المعرفة المتاحة</li>
|
| 284 |
+
</ul>
|
| 285 |
+
|
| 286 |
+
<div style="margin-top: 20px; padding: 15px; background: #fff3cd; border-radius: 8px; border-right: 4px solid #ffc107;">
|
| 287 |
+
<h4 style="color: #856404; margin: 0 0 10px 0;">⚠️ تنبيه مهم:</h4>
|
| 288 |
+
<p style="margin: 0; color: #856404;">
|
| 289 |
+
هذا المستشار يقدم معلومات عامة للمساعدة والتوجيه. للحصول على استشارة قانونية رسمية أو معلومات محدثة،
|
| 290 |
+
يرجى مراجعة الموقع الرسمي لهيئة أسواق المال الكويتية أو التواصل معهم مباشرة.
|
| 291 |
+
</p>
|
| 292 |
+
</div>
|
| 293 |
+
</div>
|
| 294 |
+
""")
|
| 295 |
+
|
| 296 |
+
# Footer
|
| 297 |
+
gr.HTML("""
|
| 298 |
+
<div style="text-align: center; margin-top: 30px; padding: 20px; background: #f5f5f5; border-radius: 10px; color: #666;">
|
| 299 |
+
<p style="margin: 0; font-size: 0.9em;">
|
| 300 |
+
🏛️ <strong>هيئة أسواق المال الكويتية</strong> |
|
| 301 |
+
🤖 <strong>مدعوم بالذكاء الاصطناعي</strong> |
|
| 302 |
+
🔒 <strong>معلومات موثوقة ومتخصصة</strong>
|
| 303 |
+
</p>
|
| 304 |
+
<p style="margin: 10px 0 0 0; font-size: 0.8em; opacity: 0.8;">
|
| 305 |
+
تم تطوير هذا المستشار لتسهيل الوصول إلى المعلومات التنظيمية والقانونية
|
| 306 |
+
</p>
|
| 307 |
+
</div>
|
| 308 |
+
""")
|
| 309 |
+
|
| 310 |
+
# Event handlers
|
| 311 |
+
msg.submit(chat_response, [msg, chatbot], [chatbot, msg])
|
| 312 |
+
submit_btn.click(chat_response, [msg, chatbot], [chatbot, msg])
|
| 313 |
+
clear_btn.click(lambda: ([], ""), None, [chatbot, msg])
|
| 314 |
+
|
| 315 |
+
# Clear message box after submit
|
| 316 |
+
msg.submit(lambda: "", None, msg)
|
| 317 |
+
submit_btn.click(lambda: "", None, msg)
|
| 318 |
+
|
| 319 |
+
return interface
|
| 320 |
+
|
| 321 |
+
# Launch the application
|
| 322 |
+
if __name__ == "__main__":
|
| 323 |
+
print("🚀 Starting CMA Arabic Document Chatbot...")
|
| 324 |
+
print("📋 Specialized in Kuwait Capital Markets Authority regulations")
|
| 325 |
+
print("🔧 Using OpenAI GPT for AI processing")
|
| 326 |
+
|
| 327 |
+
interface = create_gradio_interface()
|
| 328 |
+
interface.launch(
|
| 329 |
+
share=False, # Hugging Face Spaces handles sharing
|
| 330 |
+
server_name="0.0.0.0",
|
| 331 |
+
server_port=7860,
|
| 332 |
+
show_error=True
|
| 333 |
+
)
|
requirements.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio>=4.0.0
|
| 2 |
+
openai>=1.0.0
|
| 3 |
+
python-dotenv>=1.0.0
|