import gradio as gr from openai import OpenAI import zipfile import os import fitz # PyMuPDF import docx # جلب المفتاح من إعدادات Secrets API_KEY = os.environ.get("MOONSHOT_API_KEY") def extract_text_from_file(file_path): try: filename = os.path.basename(file_path) ext = filename.split('.')[-1].lower() if ext == 'pdf': with fitz.open(file_path) as doc: return f"\n[PDF: {filename}]\n" + "".join([p.get_text() for p in doc])[:30000] elif ext == 'docx': doc_obj = docx.Document(file_path) return f"\n[Word: {filename}]\n" + "\n".join([p.text for p in doc_obj.paragraphs])[:30000] elif ext == 'zip': report = f"\n[ZIP: {filename}]\n" with zipfile.ZipFile(file_path, 'r') as z: files = z.namelist() report += f"يحتوي المجلد على {len(files)} ملف. فهرس أول 50 ملف:\n" + "\n".join(files[:50]) return report else: with open(file_path, "r", encoding="utf-8", errors="ignore") as f: return f"\n[File: {filename}]\n" + f.read()[:20000] except Exception as e: return f"\n⚠️ خطأ في قراءة {os.path.basename(file_path)}: {str(e)}\n" def respond(message, history, system_message, max_tokens, temperature): if not API_KEY: yield "⚠️ خطأ: يرجى إضافة MOONSHOT_API_KEY في Secrets." return client = OpenAI(api_key=API_KEY, base_url="https://api.moonshot.cn/v1") user_text = message.get("text", "") files = message.get("files", []) context = "" if files: yield "⏳ جاري تحليل ملفاتك بواسطة Kimi-K2..." for f in files: path = f if isinstance(f, str) else f.name context += extract_text_from_file(path) messages = [{"role": "system", "content": system_message}] for msg in history: messages.append(msg) full_user_msg = f"{context}\n\nالسؤال: {user_text}" messages.append({"role": "user", "content": full_user_msg}) try: completion = client.chat.completions.create( model="moonshot-v1-128k", messages=messages, temperature=temperature, max_tokens=max_tokens, stream=True, ) response = "" for chunk in completion: content = chunk.choices[0].delta.content if content: response += content yield response except Exception as e: yield f"⚠️ خطأ من سيرفر Moonshot: {str(e)}" # واجهة المستخدم with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown("# 🤖 Kimi-K2 (Moonshot AI) File Analyzer") gr.ChatInterface( respond, multimodal=True, type="messages", additional_inputs=[ gr.Textbox(value="أنت مساعد ذكي يعتمد على نموذج Kimi-K2.", label="نظام المساعد"), gr.Slider(512, 16384, value=4096, label="Max Tokens"), gr.Slider(0.1, 1.5, value=0.7, label="Temperature"), ] ) # التعديل الجوهري للتشغيل في Hugging Face Spaces if __name__ == "__main__": demo.queue().launch(server_name="0.0.0.0", server_port=7860)