Improve UX (#9)

* Go to chat tab when resignin
* Allow placeholder message configurable
* Hide setting tabs if there aren't any settings
This commit is contained in:
Duc Nguyen (john) 2024-04-04 15:39:24 +07:00 committed by GitHub
parent ecf09b275f
commit e187e23dd1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 119 additions and 69 deletions

View File

@ -24,14 +24,20 @@ class App(BaseApp):
"""Render the UI"""
self._tabs = {}
with gr.Tabs() as self.tabs:
if self.f_user_management:
from ktem.pages.login import LoginPage
with gr.Tab("Welcome", elem_id="login-tab") as self._tabs["login-tab"]:
with gr.Tab(
"Welcome", elem_id="login-tab", id="login-tab"
) as self._tabs["login-tab"]:
self.login_page = LoginPage(self)
with gr.Tab(
"Chat", elem_id="chat-tab", visible=not self.f_user_management
"Chat",
elem_id="chat-tab",
id="chat-tab",
visible=not self.f_user_management,
) as self._tabs["chat-tab"]:
self.chat_page = ChatPage(self)
@ -40,23 +46,33 @@ class App(BaseApp):
f"{index.name} Index",
elem_id=f"{index.id}-tab",
elem_classes="indices-tab",
id=f"{index.id}-tab",
visible=not self.f_user_management,
) as self._tabs[f"{index.id}-tab"]:
page = index.get_index_page_ui()
setattr(self, f"_index_{index.id}", page)
with gr.Tab(
"Admin", elem_id="admin-tab", visible=not self.f_user_management
"Admin",
elem_id="admin-tab",
id="admin-tab",
visible=not self.f_user_management,
) as self._tabs["admin-tab"]:
self.admin_page = AdminPage(self)
with gr.Tab(
"Settings", elem_id="settings-tab", visible=not self.f_user_management
"Settings",
elem_id="settings-tab",
id="settings-tab",
visible=not self.f_user_management,
) as self._tabs["settings-tab"]:
self.settings_page = SettingsPage(self)
with gr.Tab(
"Help", elem_id="help-tab", visible=not self.f_user_management
"Help",
elem_id="help-tab",
id="help-tab",
visible=not self.f_user_management,
) as self._tabs["help-tab"]:
self.help_page = HelpPage(self)
@ -75,7 +91,7 @@ class App(BaseApp):
else gr.update(visible=False)
)
for k in self._tabs.keys()
)
) + [gr.update(selected="login-tab")]
with Session(engine) as session:
user = session.exec(select(User).where(User.id == user_id)).first()
@ -100,6 +116,8 @@ class App(BaseApp):
else:
tabs_update.append(gr.update(visible=True))
tabs_update.append(gr.update(selected="chat-tab"))
return tabs_update
self.subscribe_event(
@ -107,7 +125,7 @@ class App(BaseApp):
definition={
"fn": signed_in_out,
"inputs": [self.user_id],
"outputs": list(self._tabs.values()),
"outputs": list(self._tabs.values()) + [self.tabs],
"show_progress": "hidden",
},
)
@ -117,7 +135,7 @@ class App(BaseApp):
definition={
"fn": signed_in_out,
"inputs": [self.user_id],
"outputs": list(self._tabs.values()),
"outputs": list(self._tabs.values()) + [self.tabs],
"show_progress": "hidden",
},
)

View File

@ -304,6 +304,7 @@ class ChatPage(BasePage):
self.chat_control.conversation,
self.chat_control.conversation_rn,
self.chat_panel.chatbot,
self.info_panel,
]
+ self._indices_input,
"show_progress": "hidden",
@ -406,13 +407,19 @@ class ChatPage(BasePage):
text, refs = "", ""
len_ref = -1 # for logging purpose
msg_placeholder = getattr(
flowsettings, "KH_CHAT_MSG_PLACEHOLDER", "Thinking ..."
)
print(msg_placeholder)
while True:
try:
response = queue.get_nowait()
except Exception:
state[pipeline.get_info()["id"]] = reasoning_state["pipeline"]
yield chat_history + [(chat_input, text or "Thinking ...")], refs, state
yield chat_history + [
(chat_input, text or msg_placeholder)
], refs, state
continue
if response is None:

View File

@ -72,6 +72,31 @@ class SettingsPage(BasePage):
self._components = {}
self._reasoning_mode = {}
# render application page if there are application settings
self._render_app_tab = False
if self._default_settings.application.settings:
self._render_app_tab = True
# render index page if there are index settings (general and/or specific)
self._render_index_tab = False
if self._default_settings.index.settings:
self._render_index_tab = True
else:
for sig in self._default_settings.index.options.values():
if sig.settings:
self._render_index_tab = True
break
# render reasoning page if there are reasoning settings
self._render_reasoning_tab = False
if len(self._default_settings.reasoning.settings) > 1:
self._render_reasoning_tab = True
else:
for sig in self._default_settings.reasoning.options.values():
if sig.settings:
self._render_reasoning_tab = True
break
self.on_building_ui()
def on_building_ui(self):
@ -79,11 +104,8 @@ class SettingsPage(BasePage):
if self._app.f_user_management:
with gr.Tab("User settings"):
self.user_tab()
with gr.Tab("General application settings"):
self.app_tab()
with gr.Tab("Index settings"):
self.index_tab()
with gr.Tab("Reasoning settings"):
self.reasoning_tab()
def on_subscribe_public_events(self):
@ -221,6 +243,7 @@ class SettingsPage(BasePage):
return "", ""
def app_tab(self):
with gr.Tab("General application settings", visible=self._render_app_tab):
for n, si in self._default_settings.application.settings.items():
obj = render_setting_item(si, si.value)
self._components[f"application.{n}"] = obj
@ -232,6 +255,7 @@ class SettingsPage(BasePage):
# obj = render_setting_item(si, si.value)
# self._components[f"index.{n}"] = obj
with gr.Tab("Index settings", visible=self._render_index_tab):
for pn, sig in self._default_settings.index.options.items():
with gr.Tab(f"Index {pn}"):
for n, si in sig.settings.items():
@ -239,6 +263,7 @@ class SettingsPage(BasePage):
self._components[f"index.options.{pn}.{n}"] = obj
def reasoning_tab(self):
with gr.Tab("Reasoning settings", visible=self._render_reasoning_tab):
with gr.Group():
for n, si in self._default_settings.reasoning.settings.items():
if n == "use":