Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from zhipuai import ZhipuAI | |
| import os | |
| import fitz # PyMuPDF | |
| from fpdf import FPDF | |
| from io import BytesIO | |
| # --- 1. إعدادات الهوية البصرية (براند عبس) --- | |
| st.set_page_config(page_title="ABS AI | بعقل هادي", page_icon="🤖", layout="wide") | |
| st.markdown(""" | |
| <style> | |
| .stChatFloatingInputContainer { bottom: 20px; } | |
| .stButton>button { width: 100%; border-radius: 20px; background-color: #007bff; color: white; } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| st.title("🤖 مشروع ABS AI | الذكاء المتكامل") | |
| st.caption("تطوير: عبدالسلام (عبس) - محتوى يقتل عوائق النجاح") | |
| # --- 2. سحب المفتاح وتجهيز الـ Client --- | |
| api_key = os.getenv("ZHIPUAI_API_KEY") | |
| if api_key: | |
| client = ZhipuAI(api_key=api_key) | |
| # --- 3. القائمة الجانبية لرفع الملفات --- | |
| with st.sidebar: | |
| st.header("📂 مستودع الملفات") | |
| uploaded_file = st.file_uploader("ارفع ملف PDF لمحورته", type=['pdf']) | |
| file_context = "" | |
| if uploaded_file: | |
| with st.spinner("جاري قراءة الملف وتحليله..."): | |
| doc = fitz.open(stream=uploaded_file.read(), filetype="pdf") | |
| file_context = "".join([page.get_text() for page in doc]) | |
| st.success("✅ الملف جاهز في الذاكرة!") | |
| st.write("---") | |
| if st.button("🗑️ مسح ذاكرة الشات"): | |
| st.session_state.messages = [] | |
| st.rerun() | |
| # --- 4. نظام الشات والذاكرة السحابية --- | |
| if "messages" not in st.session_state: | |
| st.session_state.messages = [] | |
| # عرض التاريخ القديم للمحادثة | |
| for message in st.session_state.messages: | |
| with st.chat_message(message["role"]): | |
| st.markdown(message["content"]) | |
| # استقبال سؤال "عبس" الجديد | |
| if prompt := st.chat_input("اسألني أي حاجة يا وحش..."): | |
| # عرض سؤال المستخدم | |
| with st.chat_message("user"): | |
| st.markdown(prompt) | |
| st.session_state.messages.append({"role": "user", "content": prompt}) | |
| # رد الـ AI | |
| with st.chat_message("assistant"): | |
| with st.spinner("بيفكر بعقل هادي..."): | |
| try: | |
| # تجهيز الـ Prompt (دمج الملف لو موجود) | |
| user_content = prompt | |
| if file_context: | |
| user_content = f"سياق الملف المرفوع: {file_context[:8000]}\n\nسؤال المستخدم: {prompt}" | |
| response = client.chat.completions.create( | |
| model="glm-4", | |
| messages=[ | |
| {"role": "system", "content": "أنت مساعد ذكي بلهجة مصرية عامية مهذبة. أنت عبارة عن AI خاص بـ 'عبس' صاحب قناة 'بعقل هادي'. ردودك قوية، أخوية، وبسلطة معرفية."}, | |
| {"role": "user", "content": user_content} | |
| ], | |
| timeout=60 | |
| ) | |
| answer = response.choices[0].message.content | |
| st.markdown(answer) | |
| # --- 5. صناعة الـ PDF للرد الحالي --- | |
| pdf = FPDF() | |
| pdf.add_page() | |
| pdf.set_font("Arial", size=12) | |
| # تنظيف النص للتحويل لـ PDF | |
| clean_text = answer.encode('latin-1', 'ignore').decode('latin-1') | |
| pdf.multi_cell(0, 10, txt=clean_text) | |
| # التحويل لـ bytes لستريم لايت | |
| pdf_output = bytes(pdf.output(dest='S')) | |
| st.download_button( | |
| label="⬇️ تحميل الرد كـ PDF", | |
| data=pdf_output, | |
| file_name="ABS_Response.pdf", | |
| mime="application/pdf" | |
| ) | |
| st.session_state.messages.append({"role": "assistant", "content": answer}) | |
| except Exception as e: | |
| st.error(f"يا عبس حصلت مشكلة في الاتصال: {e}") | |
| else: | |
| st.error("⚠️ يا بطل، المفتاح (ZHIPUAI_API_KEY) مش موجود في الـ Secrets. ضيفه عشان المكنة تطلع قماش!") | |
| st.markdown("---") | |
| st.markdown("<div style='text-align: center'>تم البرمجة 'بعقل هادي' بواسطة عبس</div>", unsafe_allow_html=True) |