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)