dr.x_dev / app.py
dr3ai
Update space
1224a9d
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()