ai-assistant / pages /1_app.py
digitalai's picture
Upload 49 files
e136565 verified
raw
history blame
5.73 kB
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 arabic_support import support_arabic_text
from pathlib import Path
import json
from PIL import Image
from config.conf import *
from navigation import make_sidebar
# 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[1]
# مسیرهای دایرکتوری‌ها
assets_dir = project_root / "asset"
database_dir = project_root / "data"
styles_dir = project_root / "styles"
# خواندن فایل 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"<style>{css_code}</style>", 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
make_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})