import gradio as gr import os import re import faiss import numpy as np from huggingface_hub import InferenceClient from sentence_transformers import SentenceTransformer # ========== إعداد الـ Client ========== client = InferenceClient( model="Qwen/Qwen3-8B", token=os.environ["HF_TOKEN"] ) embedding_model = SentenceTransformer("BAAI/bge-m3") DISEASES_FOLDER = "diseases" # ========== تقسيم النص ========== def split_text(text, chunk_size=300, chunk_overlap=50): chunks = [] start = 0 while start < len(text): end = start + chunk_size chunks.append(text[start:end]) start += chunk_size - chunk_overlap return chunks # ========== الدالة الرئيسية ========== def ask_in_disease(question, disease_name, k=5): if disease_name and disease_name.strip(): filename = os.path.join(DISEASES_FOLDER, f"{disease_name}.txt") if not os.path.exists(filename): return f"❌ الملف {filename} غير موجود!" with open(filename, "r", encoding="utf-8") as f: text = f.read() texts = split_text(text) embeddings = embedding_model.encode(texts, convert_to_numpy=True) index = faiss.IndexFlatL2(embeddings.shape[1]) index.add(embeddings) q_emb = embedding_model.encode([question], convert_to_numpy=True) _, indices = index.search(q_emb, k) context = "\n\n".join([texts[i] for i in indices[0]]) messages = [ { "role": "system", "content": ( "أنت مساعد زراعي ذكي متخصص في أمراض النباتات.\n" "أجب بلغة السؤال لو السؤال عربي جاوب بالعربي ولو السؤال انجليزي جاوب بالانجليزي اوعي تتكلم اي لغه غير اللغتين دول.\n" "استخدم المعلومات الموجودة في النصوص المسترجعة فقط ولو المعلومه مش موجوده بشكل مباشر حاول تستنجها من المعلومات الموجودة.\n" "إذا لم تجد إجابة واضحة قل: لا توجد معلومات كافية.\n" "لا تخترع معلومات." ) }, { "role": "user", "content": f"المعلومات:\n{context}\n\nالسؤال:\n{question}" } ] else: messages = [ { "role": "system", "content": ( "أنت مساعد زراعي ذكي متخصص في أمراض النباتات.\n" "أجب بلغة السؤال لو السؤال عربي جاوب بالعربي ولو السؤال انجليزي جاوب بالانجليزي اوعي تتكلم اي لغه غير اللغتين دول.\n" "إذا لم تجد إجابة واضحة قل: لا توجد معلومات كافية.\n" "لا تخترع معلومات." ) }, { "role": "user", "content": f"السؤال:\n{question}" } ] response = client.chat_completion( messages=messages, max_tokens=400, temperature=0.2, extra_body={"chat_template_kwargs": {"enable_thinking": False}} ) output = response.choices[0].message.content.strip() output = re.sub(r".*?", "", output, flags=re.DOTALL).strip() return output # ========== Gradio Interface ========== demo = gr.Interface( fn=ask_in_disease, inputs=[ gr.Textbox(label="اكتب سؤالك", placeholder="مثال: ما هي أعراض المرض؟"), gr.Textbox(label="اسم المرض", placeholder="مثال: Grape___Black_rot") ], outputs=gr.Textbox(label="الإجابة"), title="🌿 المساعد الزراعي الذكي", description="اسأل عن أي مرض نباتي وهنجاوبك!" ) demo.launch()