chicken / app.py
lodgy's picture
Upload 8 files
2279fac verified
import gradio as gr
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
from datetime import datetime, timedelta
import json
import os
from chicken_ai import AdvancedChickenAI
# إنشاء مثيل من نموذج الذكاء الاصطناعي
ai = AdvancedChickenAI()
# متغيرات عامة لتخزين البيانات
production_data = []
health_records = []
feed_consumption = []
def format_diagnosis_results(results):
"""تنسيق نتائج التشخيص"""
if not results:
return "لم يتم العثور على تشخيص مطابق للأعراض المدخلة."
output = "## 🔍 نتائج التشخيص\n\n"
for i, result in enumerate(results, 1):
confidence_percentage = result.probability * 100
confidence_emoji = "🔴" if confidence_percentage >= 80 else "🟡" if confidence_percentage >= 60 else "🟢"
output += f"### {confidence_emoji} التشخيص {i}: {result.disease}\n"
output += f"**نسبة الثقة:** {confidence_percentage:.1f}%\n"
output += f"**الأعراض المطابقة:** {', '.join(result.symptoms_matched)}\n\n"
output += f"**💊 العلاج:**\n{result.treatment}\n\n"
output += f"**🛡️ الوقاية:**\n{result.prevention}\n\n"
output += f"**🧼 النظافة:**\n{result.hygiene}\n\n"
output += "---\n\n"
return output
def format_nutrition_plan(plan):
"""تنسيق خطة التغذية"""
output = f"## 🍽️ خطة التغذية المخصصة\n\n"
output += f"**العمر:** {plan.age_weeks} أسبوع\n"
output += f"**نوع الدجاج:** {plan.chicken_type}\n"
output += f"**الحالة:** {plan.condition}\n\n"
output += f"### 📊 المتطلبات الغذائية:\n"
output += f"- **البروتين:** {plan.protein_percentage}%\n"
output += f"- **الطاقة:** {plan.energy_kcal} كيلو كالوري/كجم\n"
output += f"- **الكمية اليومية:** {plan.daily_amount} جرام\n"
output += f"- **عدد الوجبات:** {plan.feeding_frequency} وجبات يومياً\n\n"
output += f"### 💊 المكملات الغذائية:\n"
for supplement in plan.supplements:
output += f"- {supplement}\n"
output += f"\n### 🌱 العلائق البديلة المقترحة:\n"
for feed in plan.alternative_feeds:
output += f"- {feed}\n"
return output
def diagnose_disease_interface(symptoms):
"""واجهة تشخيص الأمراض"""
if not symptoms.strip():
return "يرجى إدخال الأعراض أولاً."
results = ai.diagnose_disease(symptoms)
return format_diagnosis_results(results)
def generate_nutrition_plan_interface(age, chicken_type, condition):
"""واجهة توليد خطة التغذية"""
try:
age_weeks = int(age)
plan = ai.generate_nutrition_plan(age_weeks, chicken_type, condition)
return format_nutrition_plan(plan)
except ValueError:
return "يرجى إدخال عمر صحيح بالأسابيع."
def answer_question_interface(question):
"""واجهة الأسئلة والأجوبة"""
if not question.strip():
return "يرجى كتابة سؤالك أولاً."
answer = ai.answer_general_question(question)
return f"## 💬 الإجابة:\n\n{answer}"
def get_daily_tips_interface():
"""واجهة النصائح اليومية"""
tips = ai.get_daily_tips()
output = "## 📝 نصائح يومية لتربية الدجاج\n\n"
for i, tip in enumerate(tips, 1):
output += f"{i}. {tip}\n\n"
return output
def get_breed_info_interface(breed_name):
"""واجهة معلومات السلالات"""
if not breed_name.strip():
return "يرجى اختيار سلالة من القائمة."
breed_info = ai.get_breed_info(breed_name)
if not breed_info:
return f"لم يتم العثور على معلومات عن سلالة {breed_name}."
output = f"## 🐔 معلومات سلالة {breed_name}\n\n"
output += f"**النوع:** {breed_info['type']}\n"
if 'egg_production' in breed_info:
output += f"**إنتاج البيض:** {breed_info['egg_production']}\n"
output += f"**لون البيض:** {breed_info['egg_color']}\n"
if 'growth_rate' in breed_info:
output += f"**معدل النمو:** {breed_info['growth_rate']}\n"
output += f"**الخصائص:** {breed_info['characteristics']}\n"
output += f"**المناعة:** {breed_info['immunity']}\n"
return output
def add_production_record(date, eggs_count, feed_consumed, notes):
"""إضافة سجل إنتاج"""
global production_data
try:
record = {
"date": date,
"eggs": int(eggs_count) if eggs_count else 0,
"feed": float(feed_consumed) if feed_consumed else 0.0,
"notes": notes or ""
}
production_data.append(record)
# حفظ البيانات في ملف
with open('/home/ubuntu/chicken_assistant/production_data.json', 'w', encoding='utf-8') as f:
json.dump(production_data, f, ensure_ascii=False, indent=2)
return f"✅ تم إضافة السجل بنجاح!\nالتاريخ: {date}\nعدد البيض: {record['eggs']}\nالعلف المستهلك: {record['feed']} كجم"
except ValueError:
return "❌ خطأ في البيانات المدخلة. يرجى التأكد من صحة الأرقام."
def generate_production_chart():
"""إنشاء مخطط الإنتاج"""
if not production_data:
return None
df = pd.DataFrame(production_data)
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
# مخطط إنتاج البيض
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df['date'],
y=df['eggs'],
mode='lines+markers',
name='إنتاج البيض',
line=dict(color='#FF6B6B', width=3),
marker=dict(size=8)
))
fig.update_layout(
title='📈 تطور إنتاج البيض',
xaxis_title='التاريخ',
yaxis_title='عدد البيض',
font=dict(family="Arial", size=12),
plot_bgcolor='white',
paper_bgcolor='white',
showlegend=True
)
return fig
def generate_feed_consumption_chart():
"""إنشاء مخطط استهلاك العلف"""
if not production_data:
return None
df = pd.DataFrame(production_data)
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
fig = go.Figure()
fig.add_trace(go.Bar(
x=df['date'],
y=df['feed'],
name='استهلاك العلف',
marker_color='#4ECDC4'
))
fig.update_layout(
title='📊 استهلاك العلف اليومي',
xaxis_title='التاريخ',
yaxis_title='الكمية (كجم)',
font=dict(family="Arial", size=12),
plot_bgcolor='white',
paper_bgcolor='white'
)
return fig
def load_existing_data():
"""تحميل البيانات الموجودة"""
global production_data
try:
if os.path.exists('/home/ubuntu/chicken_assistant/production_data.json'):
with open('/home/ubuntu/chicken_assistant/production_data.json', 'r', encoding='utf-8') as f:
production_data = json.load(f)
except:
production_data = []
# تحميل البيانات عند بدء التطبيق
load_existing_data()
# إنشاء الواجهة الرئيسية
with gr.Blocks(
title="🐔 مساعد تربية الدجاج الذكي",
theme=gr.themes.Soft(
primary_hue="emerald",
secondary_hue="blue",
neutral_hue="slate",
font=[gr.themes.GoogleFont("Cairo"), "Arial", "sans-serif"]
),
css="""
.gradio-container {
max-width: 1200px !important;
margin: auto !important;
}
.main-header {
text-align: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 2rem;
border-radius: 15px;
margin-bottom: 2rem;
box-shadow: 0 10px 30px rgba(0,0,0,0.1);
}
.feature-card {
background: white;
border-radius: 12px;
padding: 1.5rem;
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
border: 1px solid #e2e8f0;
transition: transform 0.3s ease;
}
.feature-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0,0,0,0.15);
}
.tab-nav {
background: #f8fafc;
border-radius: 10px;
padding: 0.5rem;
}
.metric-card {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 1rem;
border-radius: 10px;
text-align: center;
margin: 0.5rem;
}
"""
) as app:
# العنوان الرئيسي
gr.HTML("""
<div class="main-header">
<h1 style="font-size: 2.5rem; margin-bottom: 0.5rem; font-weight: bold;">
🐔 مساعد تربية الدجاج الذكي
</h1>
<p style="font-size: 1.2rem; opacity: 0.9; margin: 0;">
نظام متطور لإدارة ومراقبة تربية الدجاج مع ذكاء اصطناعي متقدم
</p>
</div>
""")
# التبويبات الرئيسية
with gr.Tabs(elem_classes="tab-nav") as tabs:
# تبويب التشخيص
with gr.Tab("🔍 تشخيص الأمراض", elem_id="diagnosis-tab"):
gr.HTML("<div class='feature-card'>")
gr.Markdown("### 🩺 نظام التشخيص الذكي")
gr.Markdown("أدخل الأعراض التي تلاحظها على الدجاج وسيقوم النظام بتحليلها وتقديم التشخيص المحتمل مع العلاج المناسب.")
with gr.Row():
with gr.Column(scale=2):
symptoms_input = gr.Textbox(
label="الأعراض الملاحظة",
placeholder="مثال: خمول، فقدان شهية، إسهال أخضر، صعوبة في التنفس",
lines=3,
info="اكتب الأعراض مفصولة بفواصل"
)
diagnose_btn = gr.Button("🔍 تشخيص المرض", variant="primary", size="lg")
with gr.Column(scale=3):
diagnosis_output = gr.Markdown(label="نتائج التشخيص")
gr.HTML("</div>")
# تبويب التغذية
with gr.Tab("🍽️ خطط التغذية", elem_id="nutrition-tab"):
gr.HTML("<div class='feature-card'>")
gr.Markdown("### 🌾 مولد خطط التغذية المتقدم")
gr.Markdown("احصل على خطة تغذية مخصصة تتضمن العلائق البديلة والمكملات الغذائية المناسبة.")
with gr.Row():
with gr.Column():
age_input = gr.Number(
label="العمر بالأسابيع",
value=10,
minimum=1,
maximum=100
)
chicken_type = gr.Dropdown(
label="نوع الدجاج",
choices=["بياض", "لاحم", "مختلط"],
value="بياض"
)
condition = gr.Dropdown(
label="الحالة الصحية",
choices=["صحي", "مريض", "نقاهة"],
value="صحي"
)
nutrition_btn = gr.Button("🍽️ إنشاء خطة التغذية", variant="primary", size="lg")
with gr.Column(scale=2):
nutrition_output = gr.Markdown(label="خطة التغذية")
gr.HTML("</div>")
# تبويب الاستشارات
with gr.Tab("💬 استشارات عامة", elem_id="consultation-tab"):
gr.HTML("<div class='feature-card'>")
gr.Markdown("### 🤖 مساعد الاستشارات الذكي")
gr.Markdown("اطرح أي سؤال حول تربية الدجاج واحصل على إجابة مفصلة من خبير الذكاء الاصطناعي.")
with gr.Row():
with gr.Column(scale=2):
question_input = gr.Textbox(
label="سؤالك",
placeholder="مثال: كيف أزيد من إنتاج البيض؟ أو ما هي أفضل طريقة لتنظيف الحظيرة؟",
lines=3
)
ask_btn = gr.Button("💬 اسأل الخبير", variant="primary", size="lg")
with gr.Column(scale=3):
answer_output = gr.Markdown(label="الإجابة")
gr.HTML("</div>")
# تبويب السلالات
with gr.Tab("🐔 معلومات السلالات", elem_id="breeds-tab"):
gr.HTML("<div class='feature-card'>")
gr.Markdown("### 📚 دليل سلالات الدجاج")
gr.Markdown("تعرف على خصائص وإنتاجية السلالات المختلفة لاختيار الأنسب لمشروعك.")
with gr.Row():
with gr.Column():
breed_selector = gr.Dropdown(
label="اختر السلالة",
choices=list(ai.breeds_db.keys()),
value="ليجهورن"
)
breed_info_btn = gr.Button("📖 عرض المعلومات", variant="primary", size="lg")
with gr.Column(scale=2):
breed_info_output = gr.Markdown(label="معلومات السلالة")
gr.HTML("</div>")
# تبويب النصائح
with gr.Tab("📝 نصائح يومية", elem_id="tips-tab"):
gr.HTML("<div class='feature-card'>")
gr.Markdown("### 💡 نصائح الخبراء")
gr.Markdown("احصل على نصائح يومية مفيدة لتحسين إدارة مزرعتك وزيادة الإنتاجية.")
with gr.Row():
with gr.Column():
tips_btn = gr.Button("📝 احصل على نصائح جديدة", variant="primary", size="lg")
with gr.Column(scale=2):
tips_output = gr.Markdown(label="النصائح اليومية")
gr.HTML("</div>")
# تبويب لوحة التحكم
with gr.Tab("📊 لوحة التحكم", elem_id="dashboard-tab"):
gr.HTML("<div class='feature-card'>")
gr.Markdown("### 📈 إدارة الإنتاج والمراقبة")
gr.Markdown("سجل بيانات الإنتاج اليومية وراقب الأداء من خلال المخططات التفاعلية.")
# قسم إدخال البيانات
with gr.Row():
with gr.Column():
gr.Markdown("#### ➕ إضافة سجل جديد")
record_date = gr.Textbox(label="التاريخ", value=datetime.now().strftime("%Y-%m-%d"), placeholder="YYYY-MM-DD")
eggs_count = gr.Number(label="عدد البيض", value=0, minimum=0)
feed_consumed = gr.Number(label="العلف المستهلك (كجم)", value=0.0, minimum=0, step=0.1)
notes = gr.Textbox(label="ملاحظات", placeholder="أي ملاحظات إضافية...")
add_record_btn = gr.Button("➕ إضافة السجل", variant="primary")
record_status = gr.Markdown()
with gr.Column():
gr.Markdown("#### 📊 إحصائيات سريعة")
if production_data:
total_eggs = sum(record.get('eggs', 0) for record in production_data)
total_feed = sum(record.get('feed', 0) for record in production_data)
avg_eggs = total_eggs / len(production_data) if production_data else 0
gr.HTML(f"""
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;">
<div class="metric-card">
<h3>🥚 إجمالي البيض</h3>
<h2>{total_eggs}</h2>
</div>
<div class="metric-card">
<h3>🌾 إجمالي العلف</h3>
<h2>{total_feed:.1f} كجم</h2>
</div>
<div class="metric-card">
<h3>📈 متوسط البيض</h3>
<h2>{avg_eggs:.1f}/يوم</h2>
</div>
<div class="metric-card">
<h3>📅 عدد السجلات</h3>
<h2>{len(production_data)}</h2>
</div>
</div>
""")
# قسم المخططات
with gr.Row():
with gr.Column():
production_chart = gr.Plot(label="📈 مخطط إنتاج البيض")
with gr.Column():
feed_chart = gr.Plot(label="📊 مخطط استهلاك العلف")
# تحديث المخططات عند بدء التطبيق
app.load(
fn=lambda: (generate_production_chart(), generate_feed_consumption_chart()),
outputs=[production_chart, feed_chart]
)
gr.HTML("</div>")
# ربط الأحداث
diagnose_btn.click(
fn=diagnose_disease_interface,
inputs=[symptoms_input],
outputs=[diagnosis_output]
)
nutrition_btn.click(
fn=generate_nutrition_plan_interface,
inputs=[age_input, chicken_type, condition],
outputs=[nutrition_output]
)
ask_btn.click(
fn=answer_question_interface,
inputs=[question_input],
outputs=[answer_output]
)
breed_info_btn.click(
fn=get_breed_info_interface,
inputs=[breed_selector],
outputs=[breed_info_output]
)
tips_btn.click(
fn=get_daily_tips_interface,
outputs=[tips_output]
)
add_record_btn.click(
fn=add_production_record,
inputs=[record_date, eggs_count, feed_consumed, notes],
outputs=[record_status]
).then(
fn=lambda: (generate_production_chart(), generate_feed_consumption_chart()),
outputs=[production_chart, feed_chart]
)
# تحميل النصائح عند بدء التطبيق
app.load(fn=get_daily_tips_interface, outputs=[tips_output])
# تشغيل التطبيق
if __name__ == "__main__":
app.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
show_error=True,
quiet=False
)