Spaces:
Sleeping
Sleeping
| 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() |