File size: 6,615 Bytes
1224a9d
37bd2ac
 
1224a9d
 
 
37bd2ac
1224a9d
 
37bd2ac
1224a9d
 
 
37bd2ac
1224a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37bd2ac
1224a9d
 
 
37bd2ac
1224a9d
37bd2ac
1224a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37bd2ac
1224a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37bd2ac
1224a9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37bd2ac
 
1224a9d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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()