EGYADMIN's picture
Update modules/ai_assistant/ai_app.py
531b190 verified
raw
history blame
20 kB
import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime
import time
import io
import os
import json
import base64
from pathlib import Path
# استيراد محلل المستندات
from .document_analyzer import AIDocumentAnalyzer, DocumentParser
# استيراد وحدة تكامل البيانات
from .data_integration import DataAIIntegration
class AIAssistantApp:
"""وحدة الذكاء الاصطناعي"""
def __init__(self):
"""تهيئة وحدة الذكاء الاصطناعي"""
# تهيئة حالة الجلسة
if 'chat_history' not in st.session_state:
st.session_state.chat_history = [
{
'role': 'assistant',
'content': 'مرحباً! أنا مساعدك الذكي لإدارة المناقصات. كيف يمكنني مساعدتك اليوم؟'
}
]
if 'document_summaries' not in st.session_state:
st.session_state.document_summaries = [
{
'id': 1,
'title': 'كراسة الشروط والمواصفات - مشروع إنشاء مبنى إداري',
'date': '2024-03-15',
'summary': 'تتضمن كراسة الشروط والمواصفات لمشروع إنشاء مبنى إداري متطلبات المشروع وشروط التنفيذ والمواصفات الفنية للأعمال المطلوبة. يتكون المبنى من 5 طوابق بمساحة إجمالية 5000 متر مربع. تشمل الأعمال الأساسية: الأعمال الإنشائية، الأعمال المعمارية، الأعمال الكهربائية، الأعمال الميكانيكية، وأعمال التشطيبات.',
'key_points': [
'مدة التنفيذ: 18 شهراً',
'قيمة الضمان الابتدائي: 2% من قيمة العطاء',
'قيمة الضمان النهائي: 5% من قيمة العقد',
'غرامة التأخير: 1% من قيمة العقد عن كل أسبوع تأخير بحد أقصى 10%',
'شروط الدفع: دفعات شهرية حسب نسبة الإنجاز'
],
'entities': {
'الجهة المالكة': 'وزارة المالية',
'موقع المشروع': 'الرياض - حي العليا',
'رقم المناقصة': 'T-2024-001',
'تاريخ الطرح': '2024-03-01',
'تاريخ الإقفال': '2024-04-15'
}
},
{
'id': 2,
'title': 'جدول الكميات - مشروع تطوير شبكة طرق',
'date': '2024-03-20',
'summary': 'يتضمن جدول الكميات لمشروع تطوير شبكة طرق تفاصيل الأعمال المطلوبة والكميات التقديرية. يشمل المشروع إنشاء طرق جديدة بطول 15 كم وتطوير طرق قائمة بطول 10 كم، بالإضافة إلى إنشاء 3 جسور و5 أنفاق.',
'key_points': [
'إجمالي أعمال الحفر: 250,000 م3',
'إجمالي أعمال الردم: 180,000 م3',
'إجمالي أعمال الخرسانة: 45,000 م3',
'إجمالي أعمال الأسفلت: 120,000 م2',
'إجمالي أعمال الإنارة: 500 عمود إنارة'
],
'entities': {
'الجهة المالكة': 'وزارة النقل',
'موقع المشروع': 'جدة',
'رقم المناقصة': 'T-2024-002',
'تاريخ الطرح': '2024-03-10',
'تاريخ الإقفال': '2024-04-20'
}
},
{
'id': 3,
'title': 'المواصفات الفنية - مشروع بناء مدرسة',
'date': '2024-03-25',
'summary': 'تتضمن المواصفات الفنية لمشروع بناء مدرسة تفاصيل المتطلبات الفنية للمشروع. تتكون المدرسة من 3 طوابق بمساحة إجمالية 3000 متر مربع، وتشمل 20 فصلاً دراسياً، ومختبرات علوم، وقاعة متعددة الأغراض، ومكتبة، وغرف إدارية.',
'key_points': [
'نوع الهيكل: خرساني مسلح',
'نظام التكييف: نظام مركزي',
'نظام الإنارة: LED موفر للطاقة',
'نظام مكافحة الحريق: نظام رش آلي',
'متطلبات خاصة: نظام طاقة شمسية لتوفير 30% من احتياجات الطاقة'
],
'entities': {
'الجهة المالكة': 'وزارة التعليم',
'موقع المشروع': 'الدمام',
'رقم المناقصة': 'T-2024-003',
'تاريخ الطرح': '2024-03-15',
'تاريخ الإقفال': '2024-04-25'
}
}
]
if 'ai_models' not in st.session_state:
st.session_state.ai_models = [
{
'id': 1,
'name': 'نموذج تحليل المستندات',
'description': 'نموذج ذكاء اصطناعي لتحليل مستندات المناقصات واستخراج المعلومات الرئيسية منها.',
'type': 'معالجة اللغة الطبيعية',
'accuracy': 92,
'last_updated': '2024-03-01'
},
{
'id': 2,
'name': 'نموذج تقدير التكاليف',
'description': 'نموذج ذكاء اصطناعي لتقدير تكاليف المشاريع بناءً على بيانات المشاريع السابقة.',
'type': 'تعلم آلي',
'accuracy': 85,
'last_updated': '2024-02-15'
},
{
'id': 3,
'name': 'نموذج تحليل المخاطر',
'description': 'نموذج ذكاء اصطناعي لتحليل المخاطر المحتملة للمشاريع وتقديم توصيات للتخفيف منها.',
'type': 'تعلم آلي',
'accuracy': 88,
'last_updated': '2024-02-20'
},
{
'id': 4,
'name': 'نموذج تحليل المنافسين',
'description': 'نموذج ذكاء اصطناعي لتحليل المنافسين وتقديم توصيات لزيادة فرص الفوز بالمناقصات.',
'type': 'تعلم آلي',
'accuracy': 80,
'last_updated': '2024-02-10'
},
{
'id': 5,
'name': 'نموذج تحليل ملفات DWG',
'description': 'نموذج ذكاء اصطناعي لتحليل ملفات DWG واستخراج المعلومات الرئيسية منها.',
'type': 'رؤية حاسوبية',
'accuracy': 90,
'last_updated': '2024-03-10'
}
]
# تهيئة متغير السمة في حالة الجلسة إذا لم يكن موجوداً
if 'theme' not in st.session_state:
st.session_state.theme = 'light'
# تهيئة متغير استيراد البنود من تحليل المستندات
if 'imported_items' not in st.session_state:
st.session_state.imported_items = []
# تهيئة محلل المستندات
self.document_analyzer = AIDocumentAnalyzer()
# تهيئة وحدة تكامل البيانات
self.data_integration = DataAIIntegration()
# تكامل وحدة تحليل البيانات مع وحدة الذكاء الاصطناعي
self.data_integration.integrate_with_ai_assistant(self)
def run(self):
"""
تشغيل وحدة الذكاء الاصطناعي
هذه الدالة هي نقطة الدخول الرئيسية لوحدة الذكاء الاصطناعي.
تقوم بتهيئة واجهة المستخدم وعرض الوظائف المختلفة للذكاء الاصطناعي.
"""
try:
# تم إزالة set_page_config لتجنب التعارض مع app.py
# تطبيق التنسيق المخصص
st.markdown("""
<style>
.module-title {
color: #2c3e50;
text-align: center;
font-size: 2.5rem;
margin-bottom: 1rem;
padding-bottom: 1rem;
border-bottom: 2px solid #3498db;
}
.stTabs [data-baseweb="tab-list"] {
gap: 10px;
}
.stTabs [data-baseweb="tab"] {
height: 50px;
white-space: pre-wrap;
background-color: #f8f9fa;
border-radius: 4px 4px 0px 0px;
gap: 1px;
padding-top: 10px;
padding-bottom: 10px;
}
</style>
""", unsafe_allow_html=True)
# عرض عنوان الوحدة
st.markdown('<h1 class="module-title">وحدة الذكاء الاصطناعي</h1>', unsafe_allow_html=True)
# إضافة شريط جانبي يحتوي على معلومات المستخدم وإعدادات الذكاء الاصطناعي
with st.sidebar:
st.markdown("### إعدادات الذكاء الاصطناعي")
# اختيار نموذج الذكاء الاصطناعي
ai_model = st.selectbox(
"اختر نموذج الذكاء الاصطناعي",
options=["OpenAI GPT-4", "Claude 3 Opus", "Gemini Pro", "نموذج محلي"],
index=0,
key="ai_model_selector"
)
# إعدادات النموذج
st.markdown("#### إعدادات النموذج")
temperature = st.slider(
"درجة الإبداعية",
min_value=0.0,
max_value=1.0,
value=0.7,
step=0.1,
key="temperature_slider"
)
max_tokens = st.slider(
"الحد الأقصى للكلمات",
min_value=100,
max_value=4000,
value=2000,
step=100,
key="max_tokens_slider"
)
# إضافة زر لتحليل ملفات DWG
st.markdown("#### تحليل ملفات DWG")
dwg_file = st.file_uploader(
"ارفع ملف DWG للتحليل",
type=["dwg"],
key="dwg_file_uploader"
)
if dwg_file is not None:
if st.button("تحليل ملف DWG", key="analyze_dwg_button"):
st.info("جاري تحليل ملف DWG...")
# هنا يتم استدعاء دالة تحليل ملف DWG
st.success("تم تحليل ملف DWG بنجاح!")
# إضافة معلومات عن التكامل مع بيئة هجين فيس
st.markdown("#### التكامل مع بيئة هجين فيس")
st.markdown("""
تم تكامل وحدة الذكاء الاصطناعي مع بيئة هجين فيس بنجاح.
يمكنك الآن استخدام جميع ميزات الذكاء الاصطناعي في بيئة آمنة ومتكاملة.
""")
# إنشاء تبويبات لعرض الوظائف المختلفة للذكاء الاصطناعي
tabs = st.tabs([
"المساعد الذكي",
"تحليل المستندات",
"تقدير التكاليف",
"تحليل المخاطر",
"نماذج الذكاء الاصطناعي"
])
# تبويب المساعد الذكي
with tabs[0]:
self._render_assistant_tab()
# تبويب تحليل المستندات
with tabs[1]:
self._render_document_analysis_tab()
# تبويب تقدير التكاليف
with tabs[2]:
self._render_cost_estimation_tab()
# تبويب تحليل المخاطر
with tabs[3]:
self._render_risk_analysis_tab()
# تبويب نماذج الذكاء الاصطناعي
with tabs[4]:
self._render_ai_models_tab()
# عرض حقوق النشر
st.markdown("---")
st.markdown('<div style="text-align: center;">© 2025 جميع الحقوق محفوظة</div>', unsafe_allow_html=True)
except Exception as e:
st.error(f"حدث خطأ أثناء تشغيل وحدة الذكاء الاصطناعي: {str(e)}")
def _render_assistant_tab(self):
"""عرض تبويب المساعد الذكي"""
st.markdown("### المساعد الذكي")
st.markdown("""
المساعد الذكي يساعدك في:
- تحليل المناقصات والعقود
- تقدير التكاليف والمخاطر
- الإجابة على الأسئلة المتعلقة بالمناقصات
- تقديم توصيات لزيادة فرص الفوز بالمناقصات
""")
# عرض محادثة المساعد الذكي
chat_container = st.container()
with chat_container:
for message in st.session_state.chat_history:
if message['role'] == 'user':
st.markdown(f'<div style="background-color: #e6f7ff; padding: 10px; border-radius: 10px; margin-bottom: 10px;"><strong>أنت:</strong> {message["content"]}</div>', unsafe_allow_html=True)
else:
st.markdown(f'<div style="background-color: #f0f0f0; padding: 10px; border-radius: 10px; margin-bottom: 10px;"><strong>المساعد:</strong> {message["content"]}</div>', unsafe_allow_html=True)
# إدخال رسالة جديدة
user_input = st.text_area("اكتب رسالتك هنا", key="user_input_area")
if st.button("إرسال", key="send_message_button"):
if user_input:
# إضافة رسالة المستخدم إلى المحادثة
st.session_state.chat_history.append({
'role': 'user',
'content': user_input
})
# إضافة رد المساعد الذكي
response = self._generate_ai_response(user_input)
st.session_state.chat_history.append({
'role': 'assistant',
'content': response
})
# إعادة تحميل الصفحة لعرض الرسائل الجديدة
st.rerun()
def _render_document_analysis_tab(self):
"""عرض تبويب تحليل المستندات"""
st.markdown("### تحليل المستندات")
st.markdown("""
يمكنك تحليل المستندات التالية:
- كراسات الشروط والمواصفات
- العقود
- جداول الكميات
- المواصفات الفنية
- ملفات DWG
""")
# رفع مستند للتحليل
uploaded_file = st.file_uploader("ارفع مستنداً للتحليل", type=["pdf", "docx", "txt", "dwg"], key="document_analysis_uploader")
if uploaded_file is not None:
# عرض معلومات الملف
file_details = {
"اسم الملف": uploaded_file.name,
"نوع الملف": uploaded_file.type,
"حجم الملف": f"{uploaded_file.size / 1024:.2f} كيلوبايت"
}
st.json(file_details)
# اختيار نوع التحليل
analysis_type = st.selectbox(
"اختر نوع التحليل",
options=[
"تحليل شامل",
"استخراج البنود الرئيسية",
"تحليل الشروط والمتطلبات",
"تحليل المخاطر",
"تحليل التكاليف"
],
key="analysis_type_selector"
)
# اختيار نموذج الذكاء الاصطناعي
ai_model = st.selectbox(
"اختر نموذج الذكاء الاصطناعي للتحليل",
options=["OpenAI GPT-4", "Claude 3 Opus", "Gemini Pro", "نموذج محلي"],
key="analysis_model_selector"
)
# زر تحليل المستند
if st.button("تحليل المستند", key="analyze_document_button"):
with st.spinner("جاري تحليل المستند..."):
# محاكاة عملية التحليل
progress_bar = st.progress(0)
for i in range(100):
time.sleep(0.01)
progress_bar.progress(i + 1)
# عرض نتائج التحليل
st.success("تم تحليل المستند بنجاح!")
# إنشاء نتائج تحليل افتراضية
analysis_results = {
"عنوان المستند": "كراسة الشروط والمواصفات - مشروع إنشاء مبنى إداري",
"نوع المستند": "كراسة شروط ومواصفات",
"تاريخ المستند":
(Content truncated due to size limit. Use line ranges to read in chunks)