Spaces:
Sleeping
Sleeping
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}) |