|
|
import os |
|
|
import gradio as gr |
|
|
from huggingface_hub import InferenceClient |
|
|
from dotenv import load_dotenv |
|
|
import logging |
|
|
from typing import List, Dict, Generator |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
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() |
|
|
|