import os import gradio as gr from huggingface_hub import InferenceClient from dotenv import load_dotenv import logging from typing import List, Dict, Generator # تحميل المتغيرات من ملف .env load_dotenv() # إعداد التسجيل (logging) logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class Chatbot: def __init__(self): self.default_model = os.getenv("DEFAULT_MODEL", "openai/gpt-oss-20b") self.default_system_message = os.getenv("DEFAULT_SYSTEM_MESSAGE", "You are a friendly Chatbot.") self.default_max_tokens = int(os.getenv("DEFAULT_MAX_TOKENS", "512")) self.default_temperature = float(os.getenv("DEFAULT_TEMPERATURE", "0.7")) self.default_top_p = float(os.getenv("DEFAULT_TOP_P", "0.95")) def respond( self, message: str, history: List[Dict[str, str]], system_message: str, max_tokens: int, temperature: float, top_p: float, hf_token: gr.OAuthToken, ) -> Generator[str, None, None]: """ للاستجابة للرسائل باستخدام نموذج Hugging Face لمزيد من المعلومات حول دعم Inference API في `huggingface_hub`، يرجى مراجعة الوثائق: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference """ try: # استخدام التوكن من OAuth أو من متغير البيئة كاحتياطي token = hf_token.token if hf_token else os.getenv("HF_TOKEN") if not token: yield "❌ خطأ: لم يتم توفير رمز مصادقة. يرجى تسجيل الدخول أو تعيين HF_TOKEN في ملف .env" return client = InferenceClient(token=token, model=self.default_model) messages = [{"role": "system", "content": system_message}] messages.extend(history) messages.append({"role": "user", "content": message}) response = "" for message_chunk in client.chat_completion( messages, max_tokens=max_tokens, stream=True, temperature=temperature, top_p=top_p, ): if message_chunk.choices and message_chunk.choices[0].delta.content: token = message_chunk.choices[0].delta.content response += token yield response except Exception as e: error_msg = f"❌ حدث خطأ أثناء معالجة طلبك: {str(e)}" logger.error(error_msg) yield error_msg def create_interface(): """إنشاء واجهة Gradio""" chatbot = Chatbot() # الحصول على القيم الافتراضية من البيئة default_system_message = os.getenv("DEFAULT_SYSTEM_MESSAGE", "You are a friendly Chatbot.") default_max_tokens = int(os.getenv("DEFAULT_MAX_TOKENS", "512")) default_temperature = float(os.getenv("DEFAULT_TEMPERATURE", "0.7")) default_top_p = float(os.getenv("DEFAULT_TOP_P", "0.95")) # واجهة الدردشة chat_interface = gr.ChatInterface( chatbot.respond, type="messages", title="Dr.X Chatbot - 🤗", description="دردشة ذكية باستخدام نماذج Hugging Face", additional_inputs=[ gr.Textbox( value=default_system_message, label="الرسالة النظامية", info="تحدد سلوك المساعد" ), gr.Slider( minimum=1, maximum=2048, value=default_max_tokens, step=1, label="الحد الأقصى للرموز", info="الحد الأقصى لعدد الرموز المُنشأة" ), gr.Slider( minimum=0.1, maximum=4.0, value=default_temperature, step=0.1, label="الدرجة الحرارية", info="قيم أعلى = إجابات أكثر إبداعاً، قيم أقل = إجابات أكثر تركيزاً" ), gr.Slider( minimum=0.1, maximum=1.0, value=default_top_p, step=0.05, label="Top-p (الاستعينة النووية)", info="قيم أعلى = تنوع أكثر في الإجابات" ), ], examples=[ ["أخبرني عن نفسك"], ["ما هو الذكاء الاصطناعي؟"], ["كيف يمكنني تعلم البرمجة؟"] ], cache_examples=False ) return chat_interface def main(): """الدالة الرئيسية لتشغيل التطبيق""" # إنشاء الواجهة demo = gr.Blocks( title="Dr.X Chatbot", theme=gr.themes.Soft(), css=".gradio-container {background-color: #f0f8ff}" ) with demo: with gr.Row(): gr.Markdown("# 🤖 Dr.X Chatbot") with gr.Row(): with gr.Sidebar(): gr.LoginButton() gr.Markdown("### الإعدادات") gr.Markdown(f"**النموذج الافتراضي:** {os.getenv('DEFAULT_MODEL', 'openai/gpt-oss-20b')}") gr.Markdown("### التعليمات") gr.Markdown(""" 1. سجل الدخول باستخدام حساب Hugging Face 2. اكتب رسالتك في حقل الإدخال 3. اضغط إرسال أو Enter 4. اضبط الإعدادات المتقدمة حسب الحاجة """) # عرض واجهة الدردشة chat_interface = create_interface() chat_interface.render() # إعدادات التشغيل server_port = int(os.getenv("PORT", "7860")) server_name = os.getenv("SERVER_NAME", "0.0.0.0") share = os.getenv("SHARE_APP", "False").lower() == "true" # تشغيل التطبيق demo.launch( server_name=server_name, server_port=server_port, share=share, favicon_path="https://huggingface.co/front/assets/huggingface_logo-noborder.svg" ) if __name__ == "__main__": main()