Provide a developer mode when running ktem (#135)

Implement and utilize `on_app_created` to support the developer mode.
This commit is contained in:
Duc Nguyen (john) 2024-01-23 11:46:59 +07:00 committed by GitHub
parent 2dd531114f
commit ebc61400d8
4 changed files with 109 additions and 80 deletions

View File

@ -11,6 +11,7 @@ user_cache_dir.mkdir(parents=True, exist_ok=True)
COHERE_API_KEY = config("COHERE_API_KEY", default="") COHERE_API_KEY = config("COHERE_API_KEY", default="")
# KH_MODE = "dev"
KH_DATABASE = f"sqlite:///{user_cache_dir / 'sql.db'}" KH_DATABASE = f"sqlite:///{user_cache_dir / 'sql.db'}"
KH_DOCSTORE = { KH_DOCSTORE = {
"__type__": "kotaemon.storages.SimpleFileDocumentStore", "__type__": "kotaemon.storages.SimpleFileDocumentStore",

View File

@ -34,6 +34,8 @@ class BaseApp:
""" """
def __init__(self): def __init__(self):
self.dev_mode = getattr(settings, "KH_MODE", "") == "dev"
dir_assets = Path(__file__).parent / "assets" dir_assets = Path(__file__).parent / "assets"
with (dir_assets / "css" / "main.css").open() as fi: with (dir_assets / "css" / "main.css").open() as fi:
self._css = fi.read() self._css = fi.read()
@ -56,7 +58,7 @@ class BaseApp:
self.default_settings.index.finalize() self.default_settings.index.finalize()
self.settings_state = gr.State(self.default_settings.flatten()) self.settings_state = gr.State(self.default_settings.flatten())
self.user_id = gr.State(None) self.user_id = gr.State(1 if self.dev_mode else None)
def register_indices(self): def register_indices(self):
"""Register the index components from app settings""" """Register the index components from app settings"""
@ -155,6 +157,10 @@ class BaseApp:
if isinstance(value, BasePage): if isinstance(value, BasePage):
value.register_events() value.register_events()
for value in self.__dict__.values():
if isinstance(value, BasePage):
value.on_app_created()
demo.load(lambda: None, None, None, js=f"() => {{{self._js}}}") demo.load(lambda: None, None, None, js=f"() => {{{self._js}}}")
return demo return demo
@ -177,6 +183,9 @@ class BasePage:
def on_register_events(self): def on_register_events(self):
"""Register all events to the app""" """Register all events to the app"""
def _on_app_created(self):
"""Called when the app is created"""
def declare_public_events(self): def declare_public_events(self):
"""Declare an event for the app""" """Declare an event for the app"""
for event in self.public_events: for event in self.public_events:
@ -199,3 +208,10 @@ class BasePage:
for value in self.__dict__.values(): for value in self.__dict__.values():
if isinstance(value, BasePage): if isinstance(value, BasePage):
value.register_events() value.register_events()
def on_app_created(self):
"""Execute on app created callbacks"""
self._on_app_created()
for value in self.__dict__.values():
if isinstance(value, BasePage):
value.on_app_created()

View File

@ -191,3 +191,11 @@ class ConversationControl(BasePage):
history = self.load_chat_history(user_id) history = self.load_chat_history(user_id)
return gr.update(choices=history), conversation_id return gr.update(choices=history), conversation_id
def _on_app_created(self):
"""Reload the conversation once the app is created"""
self._app.app.load(
self.reload_conv,
inputs=[self._app.user_id],
outputs=[self.conversation],
)

View File

@ -68,8 +68,9 @@ class SettingsPage(BasePage):
def on_building_ui(self): def on_building_ui(self):
self.setting_save_btn = gr.Button("Save settings") self.setting_save_btn = gr.Button("Save settings")
with gr.Tab("User settings"): if not self._app.dev_mode:
self.user_tab() with gr.Tab("User settings"):
self.user_tab()
with gr.Tab("General application settings"): with gr.Tab("General application settings"):
self.app_tab() self.app_tab()
with gr.Tab("Index settings"): with gr.Tab("Index settings"):
@ -86,93 +87,96 @@ class SettingsPage(BasePage):
inputs=[self._user_id] + self.components(), inputs=[self._user_id] + self.components(),
outputs=self._settings_state, outputs=self._settings_state,
) )
self.password_change_btn.click(
self.change_password,
inputs=[
self._user_id,
self.password_change,
self.password_change_confirm,
],
outputs=None,
show_progress="hidden",
)
self._components["reasoning.use"].change( self._components["reasoning.use"].change(
self.change_reasoning_mode, self.change_reasoning_mode,
inputs=[self._components["reasoning.use"]], inputs=[self._components["reasoning.use"]],
outputs=list(self._reasoning_mode.values()), outputs=list(self._reasoning_mode.values()),
show_progress="hidden", show_progress="hidden",
) )
if not self._app.dev_mode:
self.password_change_btn.click(
self.change_password,
inputs=[
self._user_id,
self.password_change,
self.password_change_confirm,
],
outputs=None,
show_progress="hidden",
)
onSignInClick = self.signin.click( onSignInClick = self.signin.click(
self.sign_in, self.sign_in,
inputs=[self.username, self.password], inputs=[self.username, self.password],
outputs=[self._user_id, self.username, self.password] outputs=[self._user_id, self.username, self.password]
+ self.signed_in_state() + self.signed_in_state()
+ [self.user_out_state], + [self.user_out_state],
show_progress="hidden", show_progress="hidden",
).then( ).then(
self.load_setting, self.load_setting,
inputs=self._user_id, inputs=self._user_id,
outputs=[self._settings_state] + self.components(), outputs=[self._settings_state] + self.components(),
show_progress="hidden", show_progress="hidden",
) )
for event in self._app.get_event("onSignIn"): for event in self._app.get_event("onSignIn"):
onSignInClick = onSignInClick.then(**event) onSignInClick = onSignInClick.then(**event)
onSignInSubmit = self.password.submit( onSignInSubmit = self.password.submit(
self.sign_in, self.sign_in,
inputs=[self.username, self.password], inputs=[self.username, self.password],
outputs=[self._user_id, self.username, self.password] outputs=[self._user_id, self.username, self.password]
+ self.signed_in_state() + self.signed_in_state()
+ [self.user_out_state], + [self.user_out_state],
show_progress="hidden", show_progress="hidden",
).then( ).then(
self.load_setting, self.load_setting,
inputs=self._user_id, inputs=self._user_id,
outputs=[self._settings_state] + self.components(), outputs=[self._settings_state] + self.components(),
show_progress="hidden", show_progress="hidden",
) )
for event in self._app.get_event("onSignIn"): for event in self._app.get_event("onSignIn"):
onSignInSubmit = onSignInSubmit.then(**event) onSignInSubmit = onSignInSubmit.then(**event)
onCreateUserClick = self.create_btn.click( onCreateUserClick = self.create_btn.click(
self.create_user, self.create_user,
inputs=[ inputs=[
self.username_new, self.username_new,
self.password_new, self.password_new,
self.password_new_confirm, self.password_new_confirm,
], ],
outputs=[ outputs=[
self._user_id, self._user_id,
self.username_new, self.username_new,
self.password_new, self.password_new,
self.password_new_confirm, self.password_new_confirm,
] ]
+ self.signed_in_state() + self.signed_in_state()
+ [self.user_out_state], + [self.user_out_state],
show_progress="hidden", show_progress="hidden",
).then( ).then(
self.load_setting, self.load_setting,
inputs=self._user_id, inputs=self._user_id,
outputs=[self._settings_state] + self.components(), outputs=[self._settings_state] + self.components(),
show_progress="hidden", show_progress="hidden",
) )
for event in self._app.get_event("onCreateUser"): for event in self._app.get_event("onCreateUser"):
onCreateUserClick = onCreateUserClick.then(**event) onCreateUserClick = onCreateUserClick.then(**event)
onSignOutClick = self.signout.click( onSignOutClick = self.signout.click(
self.sign_out, self.sign_out,
inputs=None, inputs=None,
outputs=[self._user_id] + self.signed_in_state() + [self.user_out_state], outputs=[self._user_id]
show_progress="hidden", + self.signed_in_state()
).then( + [self.user_out_state],
self.load_setting, show_progress="hidden",
inputs=self._user_id, ).then(
outputs=[self._settings_state] + self.components(), self.load_setting,
show_progress="hidden", inputs=self._user_id,
) outputs=[self._settings_state] + self.components(),
for event in self._app.get_event("onSignOut"): show_progress="hidden",
onSignOutClick = onSignOutClick.then(**event) )
for event in self._app.get_event("onSignOut"):
onSignOutClick = onSignOutClick.then(**event)
def user_tab(self): def user_tab(self):
with gr.Row() as self.user_out_state: with gr.Row() as self.user_out_state: