Spaces:
Sleeping
Sleeping
""" | |
وحدة نماذج الذكاء الاصطناعي المتكاملة | |
""" | |
import streamlit as st | |
import pandas as pd | |
import random | |
from datetime import datetime | |
import time | |
class AIModelsApp: | |
""" | |
وحدة نماذج الذكاء الاصطناعي المتكاملة للنظام | |
""" | |
def __init__(self): | |
""" | |
تهيئة وحدة نماذج الذكاء الاصطناعي | |
""" | |
# تهيئة حالة الجلسة الخاصة بنماذج الذكاء الاصطناعي إذا لم تكن موجودة | |
if 'ai_models' not in st.session_state: | |
# إنشاء بيانات تجريبية لنماذج الذكاء الاصطناعي | |
st.session_state.ai_models = self._generate_sample_models() | |
if 'api_keys' not in st.session_state: | |
# إنشاء بيانات تجريبية لمفاتيح API | |
st.session_state.api_keys = { | |
'openai': 'sk-**************************', | |
'huggingface': 'hf_**************************', | |
'azure': 'az_**************************', | |
'local': 'local_key_not_required' | |
} | |
if 'model_usage' not in st.session_state: | |
# إنشاء بيانات تجريبية لاستخدام النماذج | |
st.session_state.model_usage = self._generate_sample_usage() | |
def run(self): | |
""" | |
تشغيل وحدة نماذج الذكاء الاصطناعي | |
""" | |
st.markdown("<h2 class='module-title'>وحدة نماذج الذكاء الاصطناعي</h2>", unsafe_allow_html=True) | |
# إنشاء تبويبات لنماذج الذكاء الاصطناعي المختلفة | |
tabs = st.tabs(["النماذج المتاحة", "استخدام النماذج", "إدارة API", "سجل الاستخدام"]) | |
with tabs[0]: | |
self._render_available_models() | |
with tabs[1]: | |
self._render_model_usage() | |
with tabs[2]: | |
self._render_api_management() | |
with tabs[3]: | |
self._render_usage_history() | |
def _render_available_models(self): | |
""" | |
عرض النماذج المتاحة | |
""" | |
st.markdown("### النماذج المتاحة") | |
st.markdown("عرض نماذج الذكاء الاصطناعي المتاحة للاستخدام في النظام") | |
# فلترة النماذج | |
col1, col2 = st.columns(2) | |
with col1: | |
filter_type = st.multiselect( | |
"نوع النموذج", | |
options=["الكل", "تحليل نصوص", "استخراج بيانات", "تصنيف مستندات", "تلخيص", "ترجمة", "تنبؤ"], | |
default=["الكل"] | |
) | |
with col2: | |
filter_provider = st.multiselect( | |
"مزود الخدمة", | |
options=["الكل", "OpenAI", "HuggingFace", "Azure", "محلي"], | |
default=["الكل"] | |
) | |
# تطبيق التصفية | |
filtered_models = st.session_state.ai_models | |
if "الكل" not in filter_type: | |
filtered_models = [m for m in filtered_models if m['type'] in filter_type] | |
if "الكل" not in filter_provider: | |
filtered_models = [m for m in filtered_models if m['provider'] in filter_provider] | |
# عرض النماذج | |
if filtered_models: | |
# تقسيم النماذج إلى صفوف | |
for i in range(0, len(filtered_models), 3): | |
cols = st.columns(3) | |
for j in range(3): | |
if i + j < len(filtered_models): | |
model = filtered_models[i + j] | |
with cols[j]: | |
st.markdown(f""" | |
<div style="border: 1px solid #dee2e6; border-radius: 8px; padding: 15px; height: 100%;"> | |
<h4 style="color: var(--primary-color);">{model['name']}</h4> | |
<p><strong>النوع:</strong> {model['type']}</p> | |
<p><strong>المزود:</strong> {model['provider']}</p> | |
<p><strong>الإصدار:</strong> {model['version']}</p> | |
<p><strong>الحالة:</strong> <span style="color: {'green' if model['status'] == 'متاح' else 'orange'};">{model['status']}</span></p> | |
<p>{model['description']}</p> | |
</div> | |
""", unsafe_allow_html=True) | |
else: | |
st.info("لا توجد نماذج تطابق معايير التصفية", icon="ℹ️") | |
def _render_model_usage(self): | |
""" | |
عرض واجهة استخدام النماذج | |
""" | |
st.markdown("### استخدام نماذج الذكاء الاصطناعي") | |
st.markdown("استخدام نماذج الذكاء الاصطناعي لمعالجة البيانات والمستندات") | |
# اختيار النموذج | |
model_names = [m['name'] for m in st.session_state.ai_models if m['status'] == 'متاح'] | |
selected_model = st.selectbox("اختر النموذج", options=model_names, key="selected_model") | |
# الحصول على معلومات النموذج المحدد | |
model_info = next((m for m in st.session_state.ai_models if m['name'] == selected_model), None) | |
if model_info: | |
st.markdown(f""" | |
<div style="background-color: var(--gray-100); padding: 15px; border-radius: 8px; margin-bottom: 20px;"> | |
<h4 style="color: var(--primary-color);">{model_info['name']}</h4> | |
<p><strong>النوع:</strong> {model_info['type']}</p> | |
<p><strong>المزود:</strong> {model_info['provider']}</p> | |
<p><strong>الوصف:</strong> {model_info['description']}</p> | |
</div> | |
""", unsafe_allow_html=True) | |
# واجهة الاستخدام حسب نوع النموذج | |
if model_info['type'] in ["تحليل نصوص", "تلخيص", "ترجمة"]: | |
self._render_text_model_interface(model_info) | |
elif model_info['type'] in ["استخراج بيانات", "تصنيف مستندات"]: | |
self._render_document_model_interface(model_info) | |
elif model_info['type'] == "تنبؤ": | |
self._render_prediction_model_interface(model_info) | |
def _render_text_model_interface(self, model_info): | |
""" | |
عرض واجهة استخدام نماذج النصوص | |
""" | |
# إدخال النص | |
input_text = st.text_area( | |
"أدخل النص", | |
height=150, | |
placeholder="أدخل النص للمعالجة...", | |
key="model_input_text" | |
) | |
# خيارات النموذج | |
st.markdown("#### خيارات النموذج") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
temperature = st.slider("درجة الإبداعية", 0.0, 1.0, 0.7, 0.1, key="temperature") | |
with col2: | |
max_tokens = st.slider("الحد الأقصى للكلمات", 100, 2000, 500, 100, key="max_tokens") | |
with col3: | |
if model_info['type'] == "ترجمة": | |
target_lang = st.selectbox( | |
"اللغة الهدف", | |
options=["الإنجليزية", "العربية", "الفرنسية", "الإسبانية", "الألمانية"], | |
key="target_lang" | |
) | |
# زر المعالجة | |
if st.button("معالجة النص", key="process_text_btn"): | |
if input_text: | |
# محاكاة عملية المعالجة | |
with st.spinner("جاري معالجة النص..."): | |
# محاكاة وقت المعالجة | |
time.sleep(2) | |
# إنشاء نص ناتج تجريبي | |
if model_info['type'] == "تحليل نصوص": | |
output_text = f"تحليل النص:\n\n1. يحتوي النص على {len(input_text.split())} كلمة.\n2. الموضوع الرئيسي: مناقصات ومشاريع.\n3. المشاعر: محايدة.\n4. الكلمات المفتاحية: مشروع، مناقصة، تحليل، تسعير." | |
elif model_info['type'] == "تلخيص": | |
output_text = f"ملخص النص:\n\n{input_text.split('.')[0]}. " + "هذا ملخص تجريبي للنص المدخل يحتوي على أهم النقاط والمعلومات." | |
elif model_info['type'] == "ترجمة": | |
output_text = f"الترجمة إلى {target_lang}:\n\n" + "This is a sample translation of the input text. It contains the main points and information." | |
# عرض النتيجة | |
st.markdown("#### نتيجة المعالجة") | |
st.text_area("النص الناتج", value=output_text, height=150, key="model_output_text") | |
# إضافة الاستخدام إلى السجل | |
self._add_usage_to_history(model_info['name'], model_info['type'], len(input_text.split())) | |
else: | |
st.warning("يرجى إدخال نص للمعالجة", icon="⚠️") | |
def _render_document_model_interface(self, model_info): | |
""" | |
عرض واجهة استخدام نماذج المستندات | |
""" | |
# رفع المستند | |
uploaded_file = st.file_uploader( | |
"اختر مستنداً للمعالجة", | |
type=["pdf", "docx", "txt"], | |
key="model_doc_upload" | |
) | |
# خيارات النموذج | |
st.markdown("#### خيارات النموذج") | |
col1, col2 = st.columns(2) | |
with col1: | |
if model_info['type'] == "استخراج بيانات": | |
extraction_type = st.multiselect( | |
"نوع البيانات المستخرجة", | |
options=["جداول الكميات", "الأسعار", "المواصفات الفنية", "الشروط التعاقدية", "المعلومات العامة"], | |
default=["جداول الكميات", "الأسعار"], | |
key="extraction_type" | |
) | |
elif model_info['type'] == "تصنيف مستندات": | |
classification_type = st.selectbox( | |
"نوع التصنيف", | |
options=["نوع المستند", "مجال المشروع", "مستوى المخاطر"], | |
key="classification_type" | |
) | |
with col2: | |
confidence_threshold = st.slider("حد الثقة", 0.0, 1.0, 0.7, 0.1, key="confidence_threshold") | |
# زر المعالجة | |
if st.button("معالجة المستند", key="process_doc_btn"): | |
if uploaded_file is not None: | |
# محاكاة عملية المعالجة | |
with st.spinner("جاري معالجة المستند..."): | |
# محاكاة وقت المعالجة | |
time.sleep(3) | |
st.success("تمت معالجة المستند بنجاح!", icon="✅") | |
# عرض النتائج حسب نوع النموذج | |
if model_info['type'] == "استخراج بيانات": | |
st.markdown("#### البيانات المستخرجة") | |
# عرض بيانات تجريبية للجداول المستخرجة | |
if "جداول الكميات" in extraction_type: | |
st.markdown("##### جدول الكميات") | |
# إنشاء بيانات تجريبية | |
quantities_data = [] | |
for i in range(5): | |
quantities_data.append({ | |
"البند": f"بند {i+1}", | |
"الوصف": f"وصف البند {i+1}", | |
"الوحدة": random.choice(["متر", "متر مربع", "متر مكعب", "طن", "قطعة"]), | |
"الكمية": random.randint(10, 1000), | |
"السعر الوحدة": random.randint(100, 5000), | |
"الإجمالي": 0 | |
}) | |
quantities_data[i]["الإجمالي"] = quantities_data[i]["الكمية"] * quantities_data[i]["السعر الوحدة"] | |
# عرض الجدول | |
quantities_df = pd.DataFrame(quantities_data) | |
st.dataframe(quantities_df, use_container_width=True) | |
if "الأسعار" in extraction_type: | |
st.markdown("##### ملخص الأسعار") | |
# إنشاء بيانات تجريبية | |
price_summary = { | |
"إجمالي قيمة المشروع": f"{random.randint(1000000, 10000000)} ريال", | |
"مدة التنفيذ": f"{random.randint(6, 36)} شهر", | |
"قيمة الدفعة المقدمة": f"{random.randint(10, 30)}%", | |
"غرامة التأخير": f"{random.randint(1, 10)}% (بحد أقصى 10% من قيمة العقد)" | |
} | |
# عرض الملخص | |
for key, value in price_summary.items(): | |
st.markdown(f"**{key}:** {value}") | |
elif model_info['type'] == "تصنيف مستندات": | |
st.markdown("#### نتائج التصنيف") | |
if classification_type == "نوع المستند": | |
# إنشاء بيانات تجريبية | |
doc_types = [ | |
{"نوع المستند": "كراسة شروط", "نسبة الثقة": 0.92}, | |
{"نوع المستند": "عقد", "نسبة الثقة": 0.05}, | |
{"نوع المستند": "مواصفات فنية", "نسبة الثقة": 0.02}, | |
{"نوع المستند": "جدول كميات", "نسبة الثقة": 0.01} | |
] | |
# عرض النتائج | |
doc_types_df = pd.DataFrame(doc_types) | |
st.dataframe(doc_types_df, use_container_width=True) | |
st.markdown(f"**التصنيف النهائي:** كراسة شروط (بثقة 92%)") | |
# إضافة الاستخدام إلى السجل | |
self._add_usage_to_history(model_info['name'], model_info['type'], 1) | |
else: | |
st.warning("يرجى رفع مستند للمعالجة", icon="⚠️") | |
def _render_prediction_model_interface(self, model_info): | |
""" | |
عرض واجهة استخدام نماذج التنبؤ | |
""" | |
# اختيار نوع التنبؤ | |
prediction_type = st.selectbox( | |
"نوع التنبؤ", | |
options=["تنبؤ بتكلفة المشروع", "تنبؤ بمدة التنفيذ", "تنبؤ بالمخاطر"], | |
key="prediction_type" | |
) | |
# إدخال البيانات حسب نوع التنبؤ | |
if prediction_type == "تنبؤ بتكلفة المشروع": | |
st.markdown("#### بيانات المشروع") | |
col1, col2 = st.columns(2) | |
with col1: | |
project_type = st.selectbox( | |
"نوع المشروع", | |
options=["طرق وجسور", "مباني", "بنية تحتية", "مياه وصرف صحي", "كهرباء"], | |
key="project_type" | |
) | |
project_size = st.selectbox( | |
"حجم المشروع", | |
options=["صغير", "متوسط", "كبير", "ضخم"], | |
key="project_size" | |
) | |
with col2: | |
project_location = st.selectbox( | |
"موقع المشروع", | |
options=["الرياض", "جدة", "الدمام", "مكة المكرمة", "المدينة المنورة", "تبوك", "أبها"], | |
key="project_location" | |
) | |
project_duration = st.slider("مدة التنفيذ (بالشهور)", 3, 60, 12, 3, key="project_duration") | |
elif prediction_type == "تنبؤ بمدة التنفيذ": | |
st.markdown("#### بيانات المشروع") | |
col1, col2 = st.columns(2) | |
with col1: | |
project_type = st.selectbox( | |
"نوع المشروع", | |
options=["طرق وجسور", "مباني", "بنية تحتية", "مياه وصرف صحي", "كهرباء"], | |
key="duration_project_type" | |
) | |
project_budget = st.number_input( | |
"ميزانية المشروع (بالمليون ريال)", | |
min_value=1.0, | |
max_value=1000.0, | |
value=10.0, | |
step=1.0, | |
key="project_budget" | |
) | |
with col2: | |
project_location = st.selectbox( | |
"موقع المشروع", | |
options=["الرياض", "جدة", "الدمام", "مكة المكرمة", "المدينة المنورة", "تبوك", "أبها"], | |
key="duration_project_location" | |
) | |
resources_level = st.selectbox( | |
"مستوى الموارد", | |
options=["منخفض", "متوسط", "عالي"], | |
key="resources_level" | |
) | |
elif prediction_type == "تنبؤ بالمخاطر": | |
st.markdown("#### بيانات المشروع") | |
col1, col2 = st.columns(2) | |
with col1: | |
project_type = st.selectbox( | |
"نوع المشروع", | |
options=["طرق وجسور", "مباني", "بنية تحتية", "مياه وصرف صحي", "كهرباء"], | |
key="risk_project_type" | |
) | |
project_complexity = st.selectbox( | |
"مستوى تعقيد المشروع", | |
options=["بسيط", "متوسط", "معقد", "معقد جداً"], | |
key="project_complexity" | |
) | |
with col2: | |
project_location = st.selectbox( | |
"موقع المشروع", | |
options=["الرياض", "جدة", "الدمام", "مكة المكرمة", "المدينة المنورة", "تبوك", "أبها"], | |
key="risk_project_location" | |
) | |
previous_experience = st.selectbox( | |
"الخبرة السابقة", | |
options=["لا توجد خبرة", "خبرة محدودة", "خبرة متوسطة", "خبرة واسعة"], | |
key="previous_experience" | |
) | |
# زر التنبؤ | |
if st.button("تنفيذ التنبؤ", key="predict_btn"): | |
# محاكاة عملية التنبؤ | |
with st.spinner("جاري تنفيذ التنبؤ..."): | |
# محاكاة وقت المعالجة | |
time.sleep(2) | |
st.success("تم تنفيذ التنبؤ بنجاح!", icon="✅") | |
# عرض النتائج حسب نوع التنبؤ | |
if prediction_type == "تنبؤ بتكلفة المشروع": | |
st.markdown("#### نتائج التنبؤ بالتكلفة") | |
# إنشاء بيانات تجريبية | |
base_cost = random.randint(5000000, 50000000) | |
min_cost = int(base_cost * 0.9) | |
max_cost = int(base_cost * 1.1) | |
st.markdown(f""" | |
<div style="background-color: var(--gray-100); padding: 20px; border-radius: 8px; text-align: center;"> | |
<h3 style="color: var(--primary-color);">{base_cost:,} ريال</h3> | |
<p>نطاق التكلفة المتوقع: {min_cost:,} - {max_cost:,} ريال</p> | |
</div> | |
""", unsafe_allow_html=True) | |
# عرض تفاصيل التكلفة | |
st.markdown("##### تفاصيل التكلفة") | |
cost_details = { | |
"المواد": int(base_cost * 0.6), | |
"العمالة": int(base_cost * 0.25), | |
"المعدات": int(base_cost * 0.1), | |
"أخرى": int(base_cost * 0.05) | |
} | |
# عرض الرسم البياني | |
cost_df = pd.DataFrame({ | |
"البند": list(cost_details.keys()), | |
"التكلفة": list(cost_details.values()) | |
}) | |
st.bar_chart(cost_df.set_index("البند")) | |
elif prediction_type == "تنبؤ بمدة التنفيذ": | |
st.markdown("#### نتائج التنبؤ بمدة التنفيذ") | |
# إنشاء بيانات تجريبية | |
base_duration = random.randint(12, 36) | |
min_duration = int(base_duration * 0.9) | |
max_duration = int(base_duration * 1.2) | |
st.markdown(f""" | |
<div style="background-color: var(--gray-100); padding: 20px; border-radius: 8px; text-align: center;"> | |
<h3 style="color: var(--primary-color);">{base_duration} شهر</h3> | |
<p>نطاق المدة المتوقع: {min_duration} - {max_duration} شهر</p> | |
</div> | |
""", unsafe_allow_html=True) | |
# عرض الجدول الزمني | |
st.markdown("##### الجدول الزمني التقديري") | |
timeline_data = [ | |
{"المرحلة": "التجهيز والتخطيط", "المدة (شهر)": int(base_duration * 0.1), "النسبة": "10%"}, | |
{"المرحلة": "الأعمال الأولية", "المدة (شهر)": int(base_duration * 0.2), "النسبة": "20%"}, | |
{"المرحلة": "الأعمال الرئيسية", "المدة (شهر)": int(base_duration * 0.5), "النسبة": "50%"}, | |
{"المرحلة": "التشطيبات", "المدة (شهر)": int(base_duration * 0.15), "النسبة": "15%"}, | |
{"المرحلة": "الاختبار والتسليم", "المدة (شهر)": int(base_duration * 0.05), "النسبة": "5%"} | |
] | |
timeline_df = pd.DataFrame(timeline_data) | |
st.dataframe(timeline_df, use_container_width=True) | |
elif prediction_type == "تنبؤ بالمخاطر": | |
st.markdown("#### نتائج تحليل المخاطر") | |
# إنشاء بيانات تجريبية للمخاطر | |
risks = [ | |
{"المخاطرة": "تأخر التوريدات", "الاحتمالية": random.randint(30, 70), "التأثير": random.randint(30, 70)}, | |
{"المخاطرة": "نقص العمالة", "الاحتمالية": random.randint(30, 70), "التأثير": random.randint(30, 70)}, | |
{"المخاطرة": "تغيير المواصفات", "الاحتمالية": random.randint(30, 70), "التأثير": random.randint(30, 70)}, | |
{"المخاطرة": "ظروف جوية", "الاحتمالية": random.randint(30, 70), "التأثير": random.randint(30, 70)}, | |
{"المخاطرة": "مشاكل تمويلية", "الاحتمالية": random.randint(30, 70), "التأثير": random.randint(30, 70)} | |
] | |
# حساب درجة المخاطرة | |
for risk in risks: | |
risk_score = (risk["الاحتمالية"] * risk["التأثير"]) / 100 | |
if risk_score < 30: | |
risk["المستوى"] = "منخفض" | |
risk["اللون"] = "green" | |
elif risk_score < 60: | |
risk["المستوى"] = "متوسط" | |
risk["اللون"] = "orange" | |
else: | |
risk["المستوى"] = "مرتفع" | |
risk["اللون"] = "red" | |
# عرض جدول المخاطر | |
risks_df = pd.DataFrame([{k: v for k, v in risk.items() if k != "اللون"} for risk in risks]) | |
st.dataframe(risks_df, use_container_width=True) | |
# عرض خطة الاستجابة للمخاطر | |
st.markdown("##### خطة الاستجابة للمخاطر") | |
for risk in risks: | |
if risk["المستوى"] == "مرتفع": | |
st.markdown(f""" | |
<div style="background-color: #f8d7da; padding: 10px; border-radius: 5px; margin-bottom: 10px;"> | |
<strong>{risk['المخاطرة']} (مخاطرة مرتفعة):</strong> يجب وضع خطة استجابة فورية وتخصيص موارد إضافية للتعامل مع هذه المخاطرة. | |
</div> | |
""", unsafe_allow_html=True) | |
# إضافة الاستخدام إلى السجل | |
self._add_usage_to_history(model_info['name'], model_info['type'], 1) | |
def _render_api_management(self): | |
""" | |
عرض واجهة إدارة مفاتيح API | |
""" | |
st.markdown("### إدارة مفاتيح API") | |
st.markdown("إدارة مفاتيح API للوصول إلى خدمات الذكاء الاصطناعي") | |
# عرض مفاتيح API الحالية | |
st.markdown("#### مفاتيح API الحالية") | |
for provider, key in st.session_state.api_keys.items(): | |
col1, col2, col3 = st.columns([3, 5, 2]) | |
with col1: | |
st.markdown(f"**{provider.capitalize()}**") | |
with col2: | |
# عرض المفتاح بشكل آمن | |
st.text_input( | |
f"مفتاح {provider}", | |
value=key, | |
type="password", | |
key=f"api_key_{provider}", | |
label_visibility="collapsed" | |
) | |
with col3: | |
st.button("تحديث", key=f"update_{provider}_btn") | |
# إضافة مفتاح API جديد | |
st.markdown("#### إضافة مفتاح API جديد") | |
col1, col2, col3 = st.columns([3, 5, 2]) | |
with col1: | |
new_provider = st.text_input("اسم المزود", key="new_provider") | |
with col2: | |
new_key = st.text_input("مفتاح API", type="password", key="new_key") | |
with col3: | |
st.markdown(" ") # فراغ للمحاذاة | |
if st.button("إضافة", key="add_api_key_btn"): | |
if new_provider and new_key: | |
st.success(f"تمت إضافة مفتاح API لـ {new_provider} بنجاح", icon="✅") | |
else: | |
st.warning("يرجى إدخال اسم المزود ومفتاح API", icon="⚠️") | |
# إعدادات الأمان | |
st.markdown("#### إعدادات الأمان") | |
st.checkbox("تشفير مفاتيح API في قاعدة البيانات", value=True, key="encrypt_api_keys") | |
st.checkbox("تسجيل استخدام مفاتيح API", value=True, key="log_api_usage") | |
st.checkbox("تحديد صلاحيات الوصول لمفاتيح API", value=False, key="api_access_control") | |
def _render_usage_history(self): | |
""" | |
عرض سجل استخدام النماذج | |
""" | |
st.markdown("### سجل استخدام النماذج") | |
st.markdown("عرض سجل استخدام نماذج الذكاء الاصطناعي مع إحصائيات الاستخدام") | |
# عرض إحصائيات الاستخدام | |
st.markdown("#### إحصائيات الاستخدام") | |
col1, col2, col3, col4 = st.columns(4) | |
with col1: | |
st.metric("إجمالي الاستخدامات", len(st.session_state.model_usage)) | |
with col2: | |
total_tokens = sum(usage['tokens'] for usage in st.session_state.model_usage) | |
st.metric("إجمالي الرموز", f"{total_tokens:,}") | |
with col3: | |
unique_models = len(set(usage['model'] for usage in st.session_state.model_usage)) | |
st.metric("النماذج المستخدمة", unique_models) | |
with col4: | |
# حساب تكلفة تقديرية | |
estimated_cost = total_tokens * 0.0001 | |
st.metric("التكلفة التقديرية", f"{estimated_cost:.2f} $") | |
# عرض الرسم البياني للاستخدام | |
st.markdown("#### استخدام النماذج حسب النوع") | |
# تجميع البيانات حسب نوع النموذج | |
usage_by_type = {} | |
for usage in st.session_state.model_usage: | |
if usage['type'] in usage_by_type: | |
usage_by_type[usage['type']] += 1 | |
else: | |
usage_by_type[usage['type']] = 1 | |
# تحويل البيانات إلى DataFrame | |
usage_df = pd.DataFrame({ | |
"نوع النموذج": list(usage_by_type.keys()), | |
"عدد الاستخدامات": list(usage_by_type.values()) | |
}) | |
# عرض الرسم البياني | |
st.bar_chart(usage_df.set_index("نوع النموذج")) | |
# عرض سجل الاستخدام | |
st.markdown("#### سجل الاستخدام") | |
# خيارات التصفية | |
col1, col2 = st.columns(2) | |
with col1: | |
filter_model_type = st.multiselect( | |
"نوع النموذج", | |
options=["الكل"] + list(set(usage['type'] for usage in st.session_state.model_usage)), | |
default=["الكل"] | |
) | |
with col2: | |
date_range = st.selectbox( | |
"النطاق الزمني", | |
options=["الكل", "اليوم", "الأسبوع الماضي", "الشهر الماضي"] | |
) | |
# تطبيق التصفية | |
filtered_usage = st.session_state.model_usage | |
if "الكل" not in filter_model_type: | |
filtered_usage = [u for u in filtered_usage if u['type'] in filter_model_type] | |
# تحويل البيانات إلى DataFrame | |
if filtered_usage: | |
usage_df = pd.DataFrame(filtered_usage) | |
usage_df = usage_df[['date', 'model', 'type', 'tokens', 'status']] | |
usage_df.columns = ['التاريخ', 'النموذج', 'النوع', 'الرموز', 'الحالة'] | |
# عرض الجدول | |
st.dataframe(usage_df, use_container_width=True) | |
else: | |
st.info("لا توجد بيانات استخدام تطابق معايير التصفية", icon="ℹ️") | |
def _add_usage_to_history(self, model_name, model_type, tokens_count): | |
""" | |
إضافة استخدام إلى سجل الاستخدام | |
""" | |
new_usage = { | |
'id': len(st.session_state.model_usage) + 1, | |
'model': model_name, | |
'type': model_type, | |
'tokens': tokens_count, | |
'date': datetime.now().strftime("%Y-%m-%d %H:%M"), | |
'status': 'ناجح' | |
} | |
st.session_state.model_usage.insert(0, new_usage) | |
def _generate_sample_models(self): | |
""" | |
إنشاء بيانات تجريبية لنماذج الذكاء الاصطناعي | |
""" | |
models = [ | |
{ | |
'id': 1, | |
'name': 'GPT-4', | |
'type': 'تحليل نصوص', | |
'provider': 'OpenAI', | |
'version': '4.0', | |
'status': 'متاح', | |
'description': 'نموذج لغوي متقدم لتحليل النصوص وفهم المحتوى بدقة عالية' | |
}, | |
{ | |
'id': 2, | |
'name': 'BERT-Arabic', | |
'type': 'تحليل نصوص', | |
'provider': 'HuggingFace', | |
'version': '2.1', | |
'status': 'متاح', | |
'description': 'نموذج متخصص في تحليل النصوص العربية مع دعم للهجات المختلفة' | |
}, | |
{ | |
'id': 3, | |
'name': 'DocExtractor', | |
'type': 'استخراج بيانات', | |
'provider': 'محلي', | |
'version': '1.5', | |
'status': 'متاح', | |
'description': 'نموذج لاستخراج البيانات من المستندات والعقود بدقة عالية' | |
}, | |
{ | |
'id': 4, | |
'name': 'TenderClassifier', | |
'type': 'تصنيف مستندات', | |
'provider': 'محلي', | |
'version': '2.0', | |
'status': 'متاح', | |
'description': 'نموذج متخصص في تصنيف مستندات المناقصات والعقود' | |
}, | |
{ | |
'id': 5, | |
'name': 'AzureSummarizer', | |
'type': 'تلخيص', | |
'provider': 'Azure', | |
'version': '3.2', | |
'status': 'متاح', | |
'description': 'نموذج لتلخيص المستندات الطويلة مع الحفاظ على المعلومات الأساسية' | |
}, | |
{ | |
'id': 6, | |
'name': 'TranslateAI', | |
'type': 'ترجمة', | |
'provider': 'OpenAI', | |
'version': '2.5', | |
'status': 'متاح', | |
'description': 'نموذج للترجمة بين اللغات المختلفة مع دعم خاص للمصطلحات التقنية' | |
}, | |
{ | |
'id': 7, | |
'name': 'CostPredictor', | |
'type': 'تنبؤ', | |
'provider': 'محلي', | |
'version': '1.8', | |
'status': 'متاح', | |
'description': 'نموذج للتنبؤ بتكاليف المشاريع بناءً على البيانات التاريخية' | |
}, | |
{ | |
'id': 8, | |
'name': 'RiskAnalyzer', | |
'type': 'تنبؤ', | |
'provider': 'Azure', | |
'version': '2.1', | |
'status': 'متاح', | |
'description': 'نموذج لتحليل المخاطر المحتملة في المشاريع والمناقصات' | |
}, | |
{ | |
'id': 9, | |
'name': 'GPT-5', | |
'type': 'تحليل نصوص', | |
'provider': 'OpenAI', | |
'version': '5.0-beta', | |
'status': 'قيد التطوير', | |
'description': 'النسخة التجريبية من الجيل الخامس لنماذج GPT مع قدرات متقدمة' | |
}, | |
{ | |
'id': 10, | |
'name': 'MultiModalAnalyzer', | |
'type': 'تحليل نصوص', | |
'provider': 'HuggingFace', | |
'version': '1.0', | |
'status': 'قيد التطوير', | |
'description': 'نموذج متعدد الوسائط لتحليل النصوص والصور والمخططات' | |
} | |
] | |
return models | |
def _generate_sample_usage(self): | |
""" | |
إنشاء بيانات تجريبية لسجل استخدام النماذج | |
""" | |
models = self._generate_sample_models() | |
usage = [] | |
for i in range(50): | |
# اختيار نموذج عشوائي من النماذج المتاحة | |
available_models = [m for m in models if m['status'] == 'متاح'] | |
model = random.choice(available_models) | |
# تحديد عدد الرموز بناءً على نوع النموذج | |
if model['type'] in ['تحليل نصوص', 'تلخيص', 'ترجمة']: | |
tokens = random.randint(100, 2000) | |
else: | |
tokens = random.randint(500, 5000) | |
# تحديد تاريخ عشوائي خلال الشهر الماضي | |
days_ago = random.randint(0, 30) | |
usage_date = (datetime.now() - pd.Timedelta(days=days_ago)).strftime("%Y-%m-%d %H:%M") | |
entry = { | |
'id': i + 1, | |
'model': model['name'], | |
'type': model['type'], | |
'tokens': tokens, | |
'date': usage_date, | |
'status': 'ناجح' if random.random() < 0.95 else 'فشل' | |
} | |
usage.append(entry) | |
# ترتيب السجل حسب التاريخ (الأحدث أولاً) | |
usage.sort(key=lambda x: x['date'], reverse=True) | |
return usage | |