Spaces:
Sleeping
Sleeping
| 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" | |
| # إعداد العميل | |
| 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""" | |
| <div style='text-align: center; padding: 2rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 20px; margin-bottom: 2rem;'> | |
| <h1 style='color: white; font-size: 3rem;'>🤖 {BOT_NAME}</h1> | |
| <p style='color: white; font-size: 1.2rem;'>الشات بوت الخارق من {CREATOR} • بحث • ملفات • صور • 24/7 مجاناً</p> | |
| </div> | |
| """, 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""" | |
| <div style='text-align: center; padding: 1rem; background: linear-gradient(135deg, #667eea22 0%, #764ba222 100%); border-radius: 10px;'> | |
| <h2 style='color: #667eea;'>🤖 {BOT_NAME}</h2> | |
| <p>الإصدار: 2.0</p> | |
| <p>المطور: <strong>{CREATOR}</strong></p> | |
| </div> | |
| """, 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""" | |
| <div style='text-align: center;'> | |
| <p>شارك {BOT_NAME} مع أصدقائك</p> | |
| <a href='https://huggingface.co/spaces/اسمك/ai-chatbot-streamlit' target='_blank'> | |
| <img src='https://img.shields.io/badge/🤗-Hugging%20Face-blue' style='width: 100%;'/> | |
| </a> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # فوتر | |
| st.markdown("---") | |
| st.markdown(f""" | |
| <div style='text-align: center; color: #666; padding: 1rem;'> | |
| <p>⚡ {BOT_NAME} - الشات بوت الخارق من {CREATOR} | يعمل 24/7 مجاناً | يدعم العربية والإنجليزية</p> | |
| <p style='font-size: 0.8rem;'>© 2026 {CREATOR} - جميع الحقوق محفوظة</p> | |
| </div> | |
| """, unsafe_allow_html=True) |