import time import streamlit as st from config.quiz import Question from config.option import Option from config.valid_text import is_valid_input, levels from streamlit_option_menu import option_menu from arabic_support import support_arabic_text from pathlib import Path import json from PIL import Image from config.conf import * st.set_page_config( page_title="AI-Medical Questionnaire", page_icon="💊", layout="wide", initial_sidebar_state="expanded", ) # مسیر فایل فعلی current_file_path = Path(__file__).resolve() # مسیر ریشه پروژه (دو سطح بالاتر از فایل فعلی) project_root = current_file_path.parents[0] # مسیرهای دایرکتوری‌ها assets_dir = project_root / "asset" database_dir = project_root / "data" styles_dir = project_root / "styles" # پشتیبانی از متن عربی در تمامی اجزاء support_arabic_text(all=True) # خواندن فایل CSS css_file_path = styles_dir / "main.css" with open(css_file_path, "r", encoding="utf-8") as file: css_code = file.read() # اعمال CSS st.markdown(f"", unsafe_allow_html=True) # def go_to_level(selected): # state.level = levels() support_arabic_text(all=True) state = st.session_state st.title("AI-Medical Questionnaire") side = st.sidebar if "messages" not in state: state["messages"] = [] start = """ سلام من دستیار شما هستم. برای بررسی و تصمیم گیری وضعیت بیماران مرحله به مرحله بررسی وضعیت بیمار را با کمک من انجام دهید. برای پیشنهاد می کنم اختلالات حرکتی را بررسی کنید. آیا بیمار دارای چنین اختلالی است؟)""" state.messages.append({"role": "assistant", "content": start}) # st.chat_message("user", avatar=str(assets_dir / "user.png")).markdown( # state["messages"] = [] if "result" not in state: state.result = "" if "level" not in state: state.level = "L01" state.next = "" state.previous = "" # مسیرهای فایل‌های JSON question_file = database_dir / "question_data.json" option_file = database_dir / "option_data.json" # ایجاد کلاس‌های سوالات و گزینه‌ها question_class = Question(question_file, option_file) option_class = Option(question_file, option_file) # بارگذاری داده‌ها question = question_class.load_question_data() options = option_class.load_option_data() question_text = question_class.get_question_text(state.level) with side: img = Image.open(assets_dir / "logo.png") st.image( img, width=250, caption="جهت بازنشانی از دکمه ریست استفاده کنید", ) if st.button("reset"): del state["messages"] st.rerun() def response_generator(resp): yield f"checkpoint: {state.previous}" yield "\n\n" for word in resp.split(): character = "" for char in word: yield character + char time.sleep(0.03) yield " " time.sleep(0.05) for messages in state.messages: if messages["role"] == "assistant": avatar = str(assets_dir / "robot_icon.png") elif messages["role"] == "user": avatar = str(assets_dir / "user.png") else: avatar = None # Default with st.chat_message(messages["role"], avatar=avatar): st.markdown(messages["content"]) prompt = st.chat_input("""نوشتن پیام""") if prompt: answer = prompt answer = get_response(answer) if answer == "L99": state.result = "L99" feedback = option_class.get_feedback("نتیجه", state.result) st.switch_page("pages/result.py") st.chat_message("user", avatar=str(assets_dir / "user.png")).markdown(prompt) state.messages.append({"role": "user", "content": prompt}) if answer == "بله" or answer == "خیر": next_level = option_class.get_next_level(answer, state.level) feedback = option_class.get_feedback(answer, state.level) if next_level != "L98" and next_level != "L99": my_bar = st.progress(0, text=feedback) for percent_complete in range(100): time.sleep(0.01) my_bar.progress(percent_complete + 1, text=feedback) time.sleep(1) my_bar.empty() state.previous = state.level state.level = next_level resp = question_class.get_question_text(state.level)[0] with st.chat_message("assistant"): response = st.write_stream(response_generator(resp)) state.messages.append({"role": "assistant", "content": response}) elif next_level == "L98": state.previous = state.level state.level = next_level state.result = feedback st.switch_page("pages/result.py") elif next_level == "L99": state.result = feedback st.switch_page("pages/result.py") elif answer[0] == "L": feedback = "تغییر بخش مورد بررسی, تا چند لحظه دیگر" state.previous = state.level next_level = answer state.level = next_level resp = question_class.get_question_text(state.level)[0] with st.chat_message("assistant"): response = st.write_stream(response_generator(resp)) state.messages.append({"role": "assistant", "content": response}) else: with st.chat_message("assistant"): answer = unknown() response = st.write_stream(response_generator(answer)) state.messages.append({"role": "assistant", "content": response})