test / app.py
khaoula1972's picture
Update app.py
066fa7a verified
import os
import gradio as gr
from transformers import pipeline
from openai import OpenAI
# ============================================================
# 1. ENVIRONMENT SETUP
# ============================================================
OPENROUTER_KEY = os.getenv("OPENROUTER_API_KEY")
if not OPENROUTER_KEY:
raise ValueError("Missing OPENROUTER_API_KEY. Please add it to your Space secrets.")
client = OpenAI(
api_key=OPENROUTER_KEY,
base_url="https://openrouter.ai/api/v1"
)
# ============================================================
# 2. LOAD ARABERT CLASSIFIER
# ============================================================
print("Loading AraBERT classifier...")
CLF_MODEL = "imaneumabderahmane/Arabertv02-classifier-FA"
classifier = pipeline("text-classification", model=CLF_MODEL)
print("Classifier loaded successfully.")
# ============================================================
# 3. DEEPSEEK GENERATION FUNCTION
# ============================================================
def generate_with_deepseek(prompt: str) -> str:
"""Generate a response in Arabic using DeepSeek via OpenRouter."""
try:
completion = client.chat.completions.create(
model="deepseek/deepseek-chat",
messages=[
{
"role": "system",
"content": (
"أنت مساعد طبي مختص في الإسعافات الأولية. "
"قدّم إجابات دقيقة وواضحة باللغة العربية الفصحى."
),
},
{"role": "user", "content": prompt},
],
max_tokens=512,
temperature=0.3,
)
return completion.choices[0].message.content.strip()
except Exception as e:
print("DeepSeek API error:", e)
return "حدث خطأ أثناء الاتصال بنموذج DeepSeek عبر OpenRouter."
# ============================================================
# 4. CHATBOT LOGIC (FIXED FOR MESSAGES FORMAT)
# ============================================================
def chatbot_fn(message: str, history: list):
"""Main function: classify → route → generate."""
try:
pred = classifier(message)[0]
label = pred["label"]
if label == "LABEL_1":
response = generate_with_deepseek(message)
else:
response = "عذرًا، يمكنني الإجابة فقط على الأسئلة المتعلقة بالإسعافات الأولية."
except Exception as e:
print("Error in chatbot_fn:", e)
response = "حدث خطأ أثناء معالجة الطلب."
# For type="messages", append messages in the correct format
if history is None:
history = []
# Append user message and assistant response in the correct format
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": response})
return history, ""
# ============================================================
# 5. GRADIO INTERFACE (FIXED)
# ============================================================
with gr.Blocks(title="Chatbot الإسعافات الأولية") as demo:
gr.Markdown(
"""
# 🩺 Chatbot الإسعافات الأولية
اكتب سؤالك بالعربية، وسيرد المساعد بناءً على نموذج **DeepSeek** عبر OpenRouter.
"""
)
chatbot_ui = gr.Chatbot(
label="المحادثة",
type="messages",
height=500,
show_copy_button=True # Optional: adds copy button to messages
)
with gr.Row():
user_input = gr.Textbox(
placeholder="اكتب سؤالك هنا...",
label="سؤالك",
lines=2,
scale=8,
)
send_btn = gr.Button("إرسال", scale=1)
clear_btn = gr.Button("مسح", scale=1)
# State to maintain conversation history
chat_state = gr.State([])
# Actions
send_btn.click(
chatbot_fn,
inputs=[user_input, chat_state],
outputs=[chatbot_ui, user_input]
)
user_input.submit(
chatbot_fn,
inputs=[user_input, chat_state],
outputs=[chatbot_ui, user_input]
)
clear_btn.click(
lambda: ([], []), # Clear both chatbot display and state
outputs=[chatbot_ui, chat_state]
)
# ============================================================
# 6. LAUNCH
# ============================================================
if __name__ == "__main__":
demo.launch()