Spaces:
Runtime error
Runtime error
| import flet as ft | |
| import logging | |
| from config import config, get_config | |
| class NoraAIChatUI: | |
| def __init__(self): | |
| self.page = None | |
| self.chat_history = ft.ListView(expand=True, spacing=10, padding=20) | |
| self.message_input = ft.TextField( | |
| label="اكتب رسالتك هنا...", | |
| multiline=True, | |
| min_lines=1, | |
| max_lines=3, | |
| expand=True | |
| ) | |
| self.system_info = ft.Text("", size=12, color=ft.colors.GREY_600) | |
| def build_ui(self): | |
| """بناء واجهة المستخدم""" | |
| return ft.Container( | |
| content=ft.Column([ | |
| # الهيدر | |
| ft.Container( | |
| content=ft.Column([ | |
| ft.Text( | |
| "🌟 نورا - المساعد الذكي المتطور", | |
| size=24, | |
| weight=ft.FontWeight.BOLD, | |
| color=ft.colors.BLUE_900 | |
| ), | |
| self.system_info, | |
| ]), | |
| padding=20, | |
| bgcolor=ft.colors.BLUE_50, | |
| border_radius=10, | |
| margin=10 | |
| ), | |
| # سجل المحادثة | |
| ft.Container( | |
| content=self.chat_history, | |
| expand=True, | |
| border=ft.border.all(1, ft.colors.GREY_300), | |
| border_radius=10, | |
| margin=10, | |
| padding=10 | |
| ), | |
| # منطقة الإدخال | |
| ft.Container( | |
| content=ft.Row([ | |
| self.message_input, | |
| ft.IconButton( | |
| icon=ft.Icons.SEND, | |
| icon_color=ft.colors.WHITE, | |
| bgcolor=ft.colors.BLUE_500, | |
| on_click=self.send_message | |
| ) | |
| ]), | |
| padding=20, | |
| bgcolor=ft.colors.GREY_50 | |
| ), | |
| # لوحة التحكم | |
| self.build_control_panel() | |
| ]), | |
| expand=True | |
| ) | |
| def build_control_panel(self): | |
| """بناء لوحة التحكم""" | |
| return ft.Container( | |
| content=ft.Row([ | |
| ft.TextButton("🔄 تحديث النظام", on_click=self.refresh_system), | |
| ft.TextButton("💾 حفظ المحادثة", on_click=self.save_chat), | |
| ft.TextButton("⚙️ الإعدادات", on_click=self.show_settings), | |
| ], alignment=ft.MainAxisAlignment.CENTER), | |
| padding=10, | |
| margin=10 | |
| ) | |
| def add_message(self, sender: str, message: str, is_user: bool = True): | |
| """إضافة رسالة إلى سجل المحادثة""" | |
| message_color = ft.colors.BLUE_700 if is_user else ft.colors.GREEN_700 | |
| alignment = ft.MainAxisAlignment.END if is_user else ft.MainAxisAlignment.START | |
| icon = "👤" if is_user else "🤖" | |
| message_widget = ft.Container( | |
| content=ft.Row([ | |
| ft.Text(icon, size=16), | |
| ft.Container( | |
| content=ft.Text(message, color=ft.colors.WHITE), | |
| padding=15, | |
| border_radius=15, | |
| bgcolor=message_color, | |
| expand=True | |
| ) | |
| ], alignment=alignment), | |
| margin=5 | |
| ) | |
| self.chat_history.controls.append(message_widget) | |
| self.chat_history.scroll_to(offset=-1, duration=300) | |
| async def send_message(self, e): | |
| """إرسال رسالة""" | |
| message = self.message_input.value.strip() | |
| if not message: | |
| return | |
| # إضافة رسالة المستخدم | |
| self.add_message("أنت", message, is_user=True) | |
| self.message_input.value = "" | |
| # محاكاة رد نورا (سيتم استبدالها بالاتصال بالنظام الفعلي) | |
| await self.simulate_nora_response(message) | |
| async def simulate_nora_response(self, user_message: str): | |
| """محاكاة رد نورا (ستستبدل بالاتصال بالنظام الفعلي)""" | |
| # إضافة رسالة محاكاة | |
| self.add_message("نورا", "🤔 أفكر في رد مناسب...", is_user=False) | |
| # محاكاة وقت المعالجة | |
| import asyncio | |
| await asyncio.sleep(1) | |
| # ردود محاكاة | |
| responses = [ | |
| "أهلاً بك! كيف يمكنني مساعدتك اليوم؟ 🌸", | |
| "هذا سؤال مثير للاهتمام! دعني أفكر فيه... 💭", | |
| "شكراً لمشاركتي هذا! لدي بعض الأفكار حول الموضوع. ✨", | |
| "أفهم ما تقصد. هل تريد أن أشرح أكثر؟ 🌟" | |
| ] | |
| import random | |
| response = random.choice(responses) | |
| # تحديث الرد النهائي | |
| self.chat_history.controls.pop() # إزالة رسالة "أفكر" | |
| self.add_message("نورا", response, is_user=False) | |
| async def refresh_system(self, e): | |
| """تحديث معلومات النظام""" | |
| cfg = get_config() | |
| system_status = f"النموذج: {cfg['preferred_models'][0]} | الذاكرة: {'مفعل' if cfg['enable_memory'] else 'معطل'}" | |
| self.system_info.value = system_status | |
| await self.page.update_async() | |
| async def save_chat(self, e): | |
| """حفظ المحادثة""" | |
| self.add_message("النظام", "💾 تم حفظ المحادثة بنجاح!", is_user=False) | |
| async def show_settings(self, e): | |
| """عرض إعدادات النظام""" | |
| # سيتم تطوير هذه الوظيفة لاحقاً | |
| self.add_message("النظام", "⚙️ شاشة الإعدادات قيد التطوير...", is_user=False) | |
| def start_flet(port=5000): | |
| """بدء واجهة Flet""" | |
| async def main(page: ft.Page): | |
| # إعدادات الصفحة | |
| page.title = "نورا - المساعد الذكي المتطور" | |
| page.theme_mode = ft.ThemeMode.LIGHT | |
| page.padding = 0 | |
| page.fonts = { | |
| "Arabic": "https://fonts.googleapis.com/css2?family=Tajawal:wght@400;500;700&display=swap" | |
| } | |
| page.theme = ft.Theme(font_family="Arabic") | |
| # تهيئة الواجهة | |
| ui = NoraAIChatUI() | |
| ui.page = page | |
| # إضافة الواجهة إلى الصفحة | |
| page.add(ui.build_ui()) | |
| # تحديث معلومات النظام | |
| await ui.refresh_system(None) | |
| # رسالة ترحيبية | |
| ui.add_message("نورا", "أهلاً وسهلاً! أنا نورا، مساعدتك الذكية. كيف يمكنني مساعدتك اليوم؟ 🌟", is_user=False) | |
| # تشغيل التطبيق | |
| try: | |
| ft.app( | |
| target=main, | |
| port=port, | |
| view=ft.WEB_BROWSER, | |
| assets_dir="assets" | |
| ) | |
| except Exception as e: | |
| logging.error(f"خطأ في تشغيل واجهة Flet: {e}") | |
| print(f"❌ فشل تشغيل الواجهة على المنفذ {port}") | |
| print(f"🔧 الخطأ: {e}") |