import streamlit as st from openai import OpenAI import requests from PIL import Image from io import BytesIO import time import os import tempfile import json import re # ✅ الصفحة لازم تكون أول أمر st.set_page_config( page_title="Genisi - الشات بوت الخارق", page_icon="🤖", layout="wide" ) # ✅ المفتاح حقك NVIDIA_API_KEY = "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" # ✅ اسم الشات بوت والمطور BOT_NAME = "Genisi" CREATOR = "AnesNT" # إعداد العميل @st.cache_resource def get_client(): return OpenAI( base_url="https://integrate.api.nvidia.com/v1", api_key=NVIDIA_API_KEY ) client = get_client() # ======================== # دوال مساعدة # ======================== def search_web(query): """البحث في الإنترنت (باستخدام مصدر مجاني)""" try: # استخدم واجهة بحث مجانية search_url = f"https://api.duckduckgo.com/?q={query}&format=json&no_html=1&skip_disambig=1" response = requests.get(search_url) data = response.json() # استخراج النتائج results = [] if 'AbstractText' in data and data['AbstractText']: results.append(f"📝 {data['AbstractText']}") if 'RelatedTopics' in data: for topic in data['RelatedTopics'][:3]: if isinstance(topic, dict) and 'Text' in topic: results.append(f"🔗 {topic['Text']}") return "\n\n".join(results) if results else "ما لقيت نتائج للبحث" except Exception as e: return f"خطأ في البحث: {str(e)}" def extract_text_from_file(file_bytes, file_name): """استخراج النص من الملفات المرفوعة""" try: if file_name.endswith('.txt'): return file_bytes.decode('utf-8') elif file_name.endswith('.json'): data = json.loads(file_bytes.decode('utf-8')) return json.dumps(data, ensure_ascii=False, indent=2) else: return f"تم رفع الملف: {file_name} (حجم: {len(file_bytes)} بايت)" except Exception as e: return f"خطأ في قراءة الملف: {str(e)}" def is_image_request(message): """تحديد إذا كان المستخدم يطلب صورة""" image_keywords = ['ارسم', 'صور', 'رسم', 'صورة', 'create image', 'draw', 'generate image', 'اصنع صورة', 'ولد صورة'] message_lower = message.lower() return any(keyword in message_lower for keyword in image_keywords) def get_system_prompt(): """توليد برومبت النظام مع تعريف النموذج بنفسه""" return f"""أنت {BOT_NAME}، مساعد ذكاء اصطناعي خارق تم تطويره بواسطة {CREATOR}. معلومات عنك: - اسمك: {BOT_NAME} - مطورك: {CREATOR} (AnesNT) - تاريخ اليوم: {time.strftime("%Y-%m-%d")} - إمكانياتك: محادثة ذكية، بحث في الإنترنت، رفع ملفات، توليد صور عندما يسألك المستخدم عن اسمك أو مطورك، عرّف بنفسك بكل فخر: "أنا {BOT_NAME}، تم تطويري بواسطة {CREATOR}" ردودك تكون: - مفيدة ودقيقة - باللغة العربية الفصحى أو العامية حسب طلب المستخدم - إذا طلب المستخدم صورة، استخدم أداة توليد الصور - إذا طلب بحث في النت، استخدم أداة البحث""" # ======================== # واجهة المستخدم # ======================== # عنوان مع اسم الشات بوت st.markdown(f"""

🤖 {BOT_NAME}

الشات بوت الخارق من {CREATOR} • بحث • ملفات • صور • 24/7 مجاناً

""", unsafe_allow_html=True) # تبويبات tab1, tab2, tab3 = st.tabs(["💬 محادثة ذكية", "📁 رفع ملفات وتحليل", "🎨 توليد صور"]) # ======================== # التبويب 1: المحادثة الذكية # ======================== with tab1: st.markdown(f"### ✨ محادثة مع {BOT_NAME}") # حفظ تاريخ المحادثة if "messages" not in st.session_state: st.session_state.messages = [] # رسالة ترحيب من الشات بوت st.session_state.messages.append({ "role": "assistant", "content": f"مرحباً! أنا {BOT_NAME}، مساعدك الذكي من {CREATOR}. كيف أقدر أساعدك اليوم؟ 💬📁🎨" }) # عرض المحادثة السابقة for message in st.session_state.messages: with st.chat_message(message["role"]): st.markdown(message["content"]) # مربع الإدخال if prompt := st.chat_input("✍️ اكتب سؤالك هنا..."): # عرض سؤال المستخدم st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.markdown(prompt) # رد النموذج with st.chat_message("assistant"): message_placeholder = st.empty() full_response = "" try: # التحقق إذا كان يطلب صورة if is_image_request(prompt): message_placeholder.markdown("🎨 **{BOT_NAME} بيحضر صورتك...**") # توليد الصورة img_response = client.images.generate( model="black-forest-labs/flux.1-dev", prompt=prompt, n=1, size="1024x1024" ) image_url = img_response.data[0].url st.image(image_url, caption=f"صورة من {BOT_NAME}", use_column_width=True) full_response = f"🎨 هذه صورتك يا صديقي! \n\n(تم التوليد بواسطة {BOT_NAME})" message_placeholder.markdown(full_response) # التحقق إذا كان يطلب بحث elif "بحث" in prompt or "ابحث" in prompt or "search" in prompt.lower(): message_placeholder.markdown(f"🔍 **{BOT_NAME} بيدور في النت...**") # استخراج كلمات البحث search_query = prompt.replace("ابحث", "").replace("بحث", "").replace("search", "").strip() if not search_query: search_query = prompt # بحث في النت search_results = search_web(search_query) # استخدم النموذج لتلخيص النتائج summary_response = client.chat.completions.create( model="z-ai/glm-4.7", messages=[ {"role": "system", "content": get_system_prompt()}, {"role": "user", "content": f"搜索结果 لهذا الاستعلام: '{search_query}'\n\nالنتائج:\n{search_results}\n\nلخص هذه النتائج بشكل مفيد للمستخدم."} ], temperature=0.5, max_tokens=800 ) full_response = summary_response.choices[0].message.content message_placeholder.markdown(full_response) # محادثة عادية else: # تجهيز الرسائل للنموذج messages_for_api = [ {"role": "system", "content": get_system_prompt()}, *[{"role": m["role"], "content": m["content"]} for m in st.session_state.messages[:-1]] ] response = client.chat.completions.create( model="z-ai/glm-4.7", messages=messages_for_api + [{"role": "user", "content": prompt}], temperature=0.7, max_tokens=1000, stream=True ) for chunk in response: if chunk.choices[0].delta.content: full_response += chunk.choices[0].delta.content message_placeholder.markdown(full_response + "▌") time.sleep(0.01) message_placeholder.markdown(full_response) st.session_state.messages.append({"role": "assistant", "content": full_response}) except Exception as e: error_msg = f"❌ حدث خطأ: {str(e)}" st.error(error_msg) st.session_state.messages.append({"role": "assistant", "content": error_msg}) # أزرار جانبية col1, col2, col3 = st.columns(3) with col1: if st.button("🗑️ مسح المحادثة", use_container_width=True): st.session_state.messages = [{ "role": "assistant", "content": f"مرحباً! أنا {BOT_NAME} من {CREATOR}. كيف أقدر أساعدك اليوم؟" }] st.rerun() with col2: if st.button("ℹ️ من هو {BOT_NAME}؟", use_container_width=True): st.info(f"أنا {BOT_NAME}، مساعد ذكاء اصطناعي خارق تم تطويره بواسطة {CREATOR} (AnesNT). أقدر أساعدك في المحادثة، البحث، رفع الملفات، وتوليد الصور!") with col3: if st.button("🌟 تقييم البوت", use_container_width=True): st.balloons() st.success("شكراً لاستخدامك {BOT_NAME}! 🤗") # ======================== # التبويب 2: رفع ملفات وتحليل # ======================== with tab2: st.markdown(f"### 📁 رفع ملفات لـ {BOT_NAME}") st.markdown("ارفع ملفات وساعد {BOT_NAME} يحللها ويرد على أسئلتك") uploaded_file = st.file_uploader( "اختر ملف (TXT, JSON, PDF, DOCX, XLSX)", type=['txt', 'json', 'pdf', 'docx', 'xlsx'], help="ادعم رفع الملفات وتحليلها" ) if uploaded_file is not None: # قراءة الملف file_bytes = uploaded_file.getvalue() file_name = uploaded_file.name st.success(f"✅ تم رفع الملف: {file_name}") # استخراج النص with st.spinner(f"🔍 {BOT_NAME} بيحلل الملف..."): file_content = extract_text_from_file(file_bytes, file_name) # عرض جزء من المحتوى with st.expander("👀 عرض محتوى الملف"): st.text(file_content[:1000] + ("..." if len(file_content) > 1000 else "")) # سؤال عن الملف question = st.text_input("💬 اسأل عن الملف:", placeholder="مثال: لخص لي هذا الملف") if question and st.button("🔮 أرسل", type="primary"): with st.spinner(f"🤔 {BOT_NAME} بيفكر..."): response = client.chat.completions.create( model="z-ai/glm-4.7", messages=[ {"role": "system", "content": get_system_prompt()}, {"role": "user", "content": f"الملف: {file_name}\n\nمحتوى الملف:\n{file_content}\n\nسؤال المستخدم: {question}\n\nأجب على السؤال بناء على محتوى الملف."} ], temperature=0.5, max_tokens=800 ) answer = response.choices[0].message.content st.markdown(f"### 📝 إجابة {BOT_NAME}:") st.markdown(answer) # ======================== # التبويب 3: توليد صور # ======================== with tab3: st.markdown(f"### 🎨 توليد الصور مع {BOT_NAME}") st.markdown("اكتب وصف الصورة اللي تبيه و{BOT_NAME} يرسمها") col1, col2 = st.columns([3, 1]) with col1: image_prompt = st.text_input( "✏️ وصف الصورة", placeholder="مثال: منظر غروب الشمس على البحر، ألوان زيتية" ) with col2: generate_btn = st.button("🎨 توليد", type="primary", use_container_width=True) # خيارات متقدمة with st.expander("⚙️ إعدادات الصورة"): col_a, col_b = st.columns(2) with col_a: size = st.selectbox( "الحجم", ["1024x1024", "512x512", "768x768", "1024x768", "768x1024"], index=0 ) with col_b: style = st.selectbox( "النمط", ["واقعي", "أنمي", "كرتون", "زيتي", "مائي"], index=0 ) if generate_btn and image_prompt: with st.spinner(f"🎨 {BOT_NAME} بيرسم..."): try: # تحسين البرومبت حسب النمط enhanced_prompt = image_prompt if style == "أنمي": enhanced_prompt += ", anime style, Japanese animation" elif style == "كرتون": enhanced_prompt += ", cartoon style, Disney style" elif style == "زيتي": enhanced_prompt += ", oil painting style" elif style == "مائي": enhanced_prompt += ", watercolor painting" response = client.images.generate( model="black-forest-labs/flux.1-dev", prompt=enhanced_prompt, n=1, size=size ) image_url = response.data[0].url # عرض الصورة st.image(image_url, caption=f"🎨 {image_prompt}", use_column_width=True) # تحميل الصورة img_response = requests.get(image_url) img = Image.open(BytesIO(img_response.content)) # حفظ الصورة في session للتحميل st.session_state.last_image = img # زر التحميل buf = BytesIO() img.save(buf, format="PNG") byte_im = buf.getvalue() st.download_button( label="📥 تحميل الصورة", data=byte_im, file_name=f"{BOT_NAME}_{int(time.time())}.png", mime="image/png", use_container_width=True ) except Exception as e: st.error(f"❌ حدث خطأ في توليد الصورة: {str(e)}") # ======================== # شريط جانبي مع معلومات # ======================== with st.sidebar: st.markdown(f"""

🤖 {BOT_NAME}

الإصدار: 2.0

المطور: {CREATOR}

""", unsafe_allow_html=True) st.markdown("---") st.markdown("### 🌟 المميزات") st.markdown(""" ✅ محادثة ذكية ✅ بحث في الإنترنت ✅ رفع وتحليل ملفات ✅ توليد صور ✅ 24/7 مجاناً ✅ بالعربية والإنجليزية """) st.markdown("---") st.markdown("### 📊 الإحصائيات") if "messages" in st.session_state: msg_count = len([m for m in st.session_state.messages if m["role"] == "user"]) st.metric("عدد المحادثات", msg_count) st.markdown("---") # زر لمشاركة البوت st.markdown(f"""

شارك {BOT_NAME} مع أصدقائك

""", unsafe_allow_html=True) # فوتر st.markdown("---") st.markdown(f"""

⚡ {BOT_NAME} - الشات بوت الخارق من {CREATOR} | يعمل 24/7 مجاناً | يدعم العربية والإنجليزية

© 2026 {CREATOR} - جميع الحقوق محفوظة

""", unsafe_allow_html=True)