enricorampazzo commited on
Commit
6508ff2
·
1 Parent(s): cb7ff7d

wasted a lot of time on streamlit today, but it now seems like it is kind of working

Browse files
Files changed (2) hide show
  1. app.py +62 -33
  2. local_storage/ls_manager.py +3 -3
app.py CHANGED
@@ -1,7 +1,9 @@
1
  import re
 
2
 
3
  import streamlit as st
4
  from streamlit import session_state as ss
 
5
 
6
  from form.form import build_form_data_from_answers, write_pdf_form, work_categories
7
  from llm_manager.llm_parser import LlmParser
@@ -16,6 +18,23 @@ user_msg = "Please describe what you need to do. To get the best results try to
16
 
17
  find_tags_regex = re.compile(r"(@\S)")
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  class UIManager:
20
  def __init__(self):
21
  self.pm: PromptsManager = PromptsManager(work_categories=work_categories)
@@ -24,26 +43,33 @@ class UIManager:
24
  Model("fakeModel", ModelRoles("a", "b", "c"))))
25
 
26
  @staticmethod
27
- def get_current_step():
28
- return ss.get("step")
 
 
 
 
 
 
 
29
 
30
  @staticmethod
31
  def _build_base_ui():
32
  st.markdown("## Dubai Asset Management red tape cutter")
33
 
34
  def build_ui_for_initial_state(self, user_message):
35
- help_ = user_message
36
  self._build_base_ui()
37
  with st.form("Please describe your request"):
38
- user_input = st.text_area("Your input", height=700, label_visibility="hidden", placeholder=help_,
39
- help=help_)
40
- signature = st.file_uploader("Your signature", key="file_upload")
41
- ss["signature"] = signature
42
- submit_button = st.form_submit_button()
43
- if submit_button:
44
- ss["user_input"] = user_input
45
- ss["step"] = "parsing_answers"
46
- st.rerun()
47
 
48
  def build_ui_for_parsing_answers(self):
49
  self._build_base_ui()
@@ -60,25 +86,25 @@ class UIManager:
60
  answers = LlmParser.parse_verification_prompt_answers(answer['content'])
61
  ss["answers"] = answers
62
  if len(answers) != len(Q):
63
- ss["step"] = "parsing_error"
64
  st.rerun()
65
  ss["missing_answers"] = check_for_missing_answers(ss["answers"])
66
  if not ss.get("missing_answers"):
67
- ss["step"] = "check_category"
68
  else:
69
- ss["step"] = "ask_again"
70
  st.rerun()
71
 
72
  def build_ui_for_ask_again(self):
73
  self._build_base_ui()
74
  with st.form("form1"):
75
  for ma in ss["missing_answers"]:
76
- st.text_input(self.pm.questions[ma].lower(), key=ma)
77
  submitted = st.form_submit_button("Submit answers")
78
  if submitted:
79
  for ma in ss["missing_answers"]:
80
  ss["answers"][ma] = ss[ma]
81
- ss["step"] = "check_category"
82
  st.rerun()
83
 
84
  def build_ui_for_check_category(self):
@@ -87,7 +113,7 @@ class UIManager:
87
  answer = self.repository.send_prompt(self.pm.get_work_category(ss["answers"][Q.WORK_TO_DO]))
88
  categories = LlmParser.parse_get_categories_answer(answer['content'])
89
  ss["categories"] = categories
90
- ss["step"] = "validate_data"
91
  st.rerun()
92
 
93
  def build_ui_for_form_created(self):
@@ -114,7 +140,7 @@ class UIManager:
114
  if details:
115
  key = ss[details_key] # get the name under which this data should be saved
116
  save_details(details, key)
117
- ss["step"] = "check_categories"
118
  st.rerun()
119
 
120
  def _create_pdf_form(self):
@@ -125,14 +151,16 @@ class UIManager:
125
  pdf_form_filename = filename
126
  ss["pdf_form"] = pdf_form
127
  ss["pdf_form_filename"] = pdf_form_filename
128
- ss["step"] = "form_created"
129
  st.rerun()
130
 
131
  def build_ui_for_validate_data_after_correction(self):
132
- self._build_validation_form(False, self._integrate_llm_answers_with_user_corrections)
 
133
 
134
  def build_ui_to_confirm_form_data(self):
135
- self._build_validation_form(True, self._create_pdf_form)
 
136
 
137
 
138
  @staticmethod
@@ -159,7 +187,7 @@ class UIManager:
159
 
160
 
161
 
162
- def _build_validation_form(self, show_categories:bool, onsubmit):
163
  def build_form_fragment(form_, col, title, add_save, *questions):
164
  form_.text(title)
165
  for user_data in questions:
@@ -182,27 +210,28 @@ class UIManager:
182
  for k, wc in work_categories.items():
183
  f.checkbox(label=wc, key=k, value=k in ss["categories"])
184
 
185
- submit_data = f.form_submit_button()
186
  if submit_data:
187
  onsubmit()
188
 
189
- def use_streamlit():
190
 
191
- um = UIManager()
 
 
192
 
193
- if not um.get_current_step():
194
  um.build_ui_for_initial_state(user_msg)
195
- if um.get_current_step() == "parsing_answers":
196
  um.build_ui_for_parsing_answers()
197
- if um.get_current_step() == "parsing_error":
198
  um.build_ui_for_validate_data_after_correction()
199
- if um.get_current_step() == "ask_again":
200
  um.build_ui_for_ask_again()
201
- if um.get_current_step() == "check_category":
202
  um.build_ui_for_check_category()
203
- if um.get_current_step() == "validate_form_data":
204
  um.build_ui_to_confirm_form_data()
205
- if um.get_current_step() == "form_created":
206
  um.build_ui_for_form_created()
207
 
208
 
 
1
  import re
2
+ from enum import Enum
3
 
4
  import streamlit as st
5
  from streamlit import session_state as ss
6
+ from streamlit.runtime.scriptrunner_utils.exceptions import StopException
7
 
8
  from form.form import build_form_data_from_answers, write_pdf_form, work_categories
9
  from llm_manager.llm_parser import LlmParser
 
18
 
19
  find_tags_regex = re.compile(r"(@\S)")
20
 
21
+ class Steps(Enum):
22
+ INITIAL_STATE = 1
23
+ PARSING_ANSWERS = 2
24
+ ASK_AGAIN = 3
25
+ FIND_CATEGORIES = 4
26
+ VALIDATE_DATA = 5
27
+ PARSING_ERROR = 6
28
+ FORM_CREATED = 7
29
+
30
+ def __eq__(self, other):
31
+ if not isinstance(other, self.__class__):
32
+ return False
33
+ return self.value == other.value
34
+
35
+ def __hash__(self):
36
+ return hash(self.value)
37
+
38
  class UIManager:
39
  def __init__(self):
40
  self.pm: PromptsManager = PromptsManager(work_categories=work_categories)
 
43
  Model("fakeModel", ModelRoles("a", "b", "c"))))
44
 
45
  @staticmethod
46
+ def get_current_step() -> int:
47
+ try:
48
+ return ss.get("step") or Steps.INITIAL_STATE.value
49
+ except StopException:
50
+ return Steps.INITIAL_STATE.value
51
+
52
+ @staticmethod
53
+ def set_current_step(step: Steps):
54
+ ss["step"] = step.value
55
 
56
  @staticmethod
57
  def _build_base_ui():
58
  st.markdown("## Dubai Asset Management red tape cutter")
59
 
60
  def build_ui_for_initial_state(self, user_message):
61
+ help_ = user_message + "\n".join(self.pm.questions)
62
  self._build_base_ui()
63
  with st.form("Please describe your request"):
64
+ user_input = st.text_area("Your input", height=700, label_visibility="hidden", placeholder=help_,
65
+ help=help_)
66
+ signature = st.file_uploader("Your signature", key="file_upload")
67
+ ss["signature"] = signature
68
+ submit_button = st.form_submit_button()
69
+ if submit_button:
70
+ ss["user_input"] = user_input
71
+ self.set_current_step(Steps.PARSING_ANSWERS)
72
+ st.rerun()
73
 
74
  def build_ui_for_parsing_answers(self):
75
  self._build_base_ui()
 
86
  answers = LlmParser.parse_verification_prompt_answers(answer['content'])
87
  ss["answers"] = answers
88
  if len(answers) != len(Q):
89
+ self.set_current_step(Steps.PARSING_ERROR)
90
  st.rerun()
91
  ss["missing_answers"] = check_for_missing_answers(ss["answers"])
92
  if not ss.get("missing_answers"):
93
+ self.set_current_step(Steps.FIND_CATEGORIES)
94
  else:
95
+ self.set_current_step(Steps.ASK_AGAIN)
96
  st.rerun()
97
 
98
  def build_ui_for_ask_again(self):
99
  self._build_base_ui()
100
  with st.form("form1"):
101
  for ma in ss["missing_answers"]:
102
+ st.text_input(self.pm.questions[ma.value].lower(), key=ma)
103
  submitted = st.form_submit_button("Submit answers")
104
  if submitted:
105
  for ma in ss["missing_answers"]:
106
  ss["answers"][ma] = ss[ma]
107
+ self.set_current_step(Steps.FIND_CATEGORIES)
108
  st.rerun()
109
 
110
  def build_ui_for_check_category(self):
 
113
  answer = self.repository.send_prompt(self.pm.get_work_category(ss["answers"][Q.WORK_TO_DO]))
114
  categories = LlmParser.parse_get_categories_answer(answer['content'])
115
  ss["categories"] = categories
116
+ self.set_current_step(Steps.VALIDATE_DATA)
117
  st.rerun()
118
 
119
  def build_ui_for_form_created(self):
 
140
  if details:
141
  key = ss[details_key] # get the name under which this data should be saved
142
  save_details(details, key)
143
+ self.set_current_step(Steps.FIND_CATEGORIES)
144
  st.rerun()
145
 
146
  def _create_pdf_form(self):
 
151
  pdf_form_filename = filename
152
  ss["pdf_form"] = pdf_form
153
  ss["pdf_form_filename"] = pdf_form_filename
154
+ self.set_current_step(Steps.FORM_CREATED)
155
  st.rerun()
156
 
157
  def build_ui_for_validate_data_after_correction(self):
158
+ self._build_validation_form(False, self._integrate_llm_answers_with_user_corrections,
159
+ "Find work categories")
160
 
161
  def build_ui_to_confirm_form_data(self):
162
+ self._build_validation_form(True, self._create_pdf_form,
163
+ "Create work permit request")
164
 
165
 
166
  @staticmethod
 
187
 
188
 
189
 
190
+ def _build_validation_form(self, show_categories:bool, onsubmit, submit_button_label):
191
  def build_form_fragment(form_, col, title, add_save, *questions):
192
  form_.text(title)
193
  for user_data in questions:
 
210
  for k, wc in work_categories.items():
211
  f.checkbox(label=wc, key=k, value=k in ss["categories"])
212
 
213
+ submit_data = f.form_submit_button(label=submit_button_label)
214
  if submit_data:
215
  onsubmit()
216
 
 
217
 
218
+ um = UIManager()
219
+
220
+ def use_streamlit():
221
 
222
+ if um.get_current_step() == Steps.INITIAL_STATE.value :
223
  um.build_ui_for_initial_state(user_msg)
224
+ elif um.get_current_step() == Steps.PARSING_ANSWERS.value:
225
  um.build_ui_for_parsing_answers()
226
+ elif um.get_current_step() == Steps.PARSING_ERROR.value:
227
  um.build_ui_for_validate_data_after_correction()
228
+ elif um.get_current_step() == Steps.ASK_AGAIN.value:
229
  um.build_ui_for_ask_again()
230
+ elif um.get_current_step() == Steps.FIND_CATEGORIES.value:
231
  um.build_ui_for_check_category()
232
+ elif um.get_current_step() == Steps.VALIDATE_DATA.value:
233
  um.build_ui_to_confirm_form_data()
234
+ elif um.get_current_step() == Steps.FORM_CREATED.value:
235
  um.build_ui_for_form_created()
236
 
237
 
local_storage/ls_manager.py CHANGED
@@ -9,7 +9,7 @@ ls = LocalStorage()
9
 
10
  def get_detail(key: str):
11
  for detail_type in DetailsType.values():
12
- detail = json.loads((ls.getItem(detail_type.name) or {}).get(key))
13
  if detail:
14
  type_ = detail["type"]
15
  if type_ == DetailsType.PERSONAL_DETAILS.name:
@@ -31,11 +31,11 @@ def save_details(details: SavedDetails, key: str):
31
  type_ = DetailsType.CONTRACTOR_DETAILS
32
  else:
33
  raise ValueError("Unexpected type: {}", type(details))
34
- existing_data = json.loads(ls.getItem(type_.name) or "{}")
35
  existing_data[key] = details.to_json()
36
  ls.setItem(type_.name, existing_data, type_.name)
37
 
38
 
39
  def get_details(type_: DetailsType):
40
- return json.loads((ls.getItem(type_.name) or "{}"))
41
 
 
9
 
10
  def get_detail(key: str):
11
  for detail_type in DetailsType.values():
12
+ detail = (ls.getItem(detail_type.name) or {}).get(key)
13
  if detail:
14
  type_ = detail["type"]
15
  if type_ == DetailsType.PERSONAL_DETAILS.name:
 
31
  type_ = DetailsType.CONTRACTOR_DETAILS
32
  else:
33
  raise ValueError("Unexpected type: {}", type(details))
34
+ existing_data = (ls.getItem(type_.name) or {})
35
  existing_data[key] = details.to_json()
36
  ls.setItem(type_.name, existing_data, type_.name)
37
 
38
 
39
  def get_details(type_: DetailsType):
40
+ return ls.getItem(type_.name) or {}
41