diff --git a/docs/about.md b/docs/about.md index 5c55dad74..757dc610e 100644 --- a/docs/about.md +++ b/docs/about.md @@ -9,6 +9,3 @@ developers in mind. [User Guide](https://cinnamon.github.io/kotaemon/) | [Developer Guide](https://cinnamon.github.io/kotaemon/development/) | [Feedback](https://github.com/Cinnamon/kotaemon/issues) - -[Dark Mode](?__theme=dark) | -[Light Mode](?__theme=light) diff --git a/libs/ktem/ktem/assets/css/main.css b/libs/ktem/ktem/assets/css/main.css index e8de1ff83..6336b0237 100644 --- a/libs/ktem/ktem/assets/css/main.css +++ b/libs/ktem/ktem/assets/css/main.css @@ -52,6 +52,14 @@ button.selected { font-weight: bold; } +.message-row.bubble.bot-row{ + overflow-x: auto; +} + +.flex-wrap.bot { + overflow-x: inherit; +} + #chat-tab, #indices-tab, #settings-tab, @@ -191,11 +199,11 @@ mark { right: 15px; } -#new-conv-button > img { +/* #new-conv-button > img { position: relative; top: 0px; right: -50%; -} +} */ span.icon { color: #cecece; @@ -271,3 +279,54 @@ pdfjs-viewer-element { flex: 1; overflow: auto; } + +/** Switch + -------------------------------------*/ + +#is-public-checkbox { + position: relative; + top: 4px; +} + +.switch input { + position: absolute; + opacity: 0; +} + +/** + * 1. Adjust this to size + */ + +.switch { + display: inline-block; + /* 1 */ + height: 1em; + width: 2em; + background: #8f8f8f; + border-radius: 1em; + position: relative; + top: 2px; + margin-right: 1em; +} + +.switch div { + height: 1em; + width: 1em; + border-radius: 1em; + background: #FFF; + box-shadow: 0 0.1em 0.3em rgba(0, 0, 0, 0.3); + -webkit-transition: all 300ms; + -moz-transition: all 300ms; + transition: all 300ms; +} + +.switch input:checked+div { + -webkit-transform: translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + background: #12df9a; +} + +.switch:has(> input:checked) { + background: #0c895f; +} diff --git a/libs/ktem/ktem/assets/js/main.js b/libs/ktem/ktem/assets/js/main.js index 4dbb36fbb..d2d0b81f8 100644 --- a/libs/ktem/ktem/assets/js/main.js +++ b/libs/ktem/ktem/assets/js/main.js @@ -16,6 +16,16 @@ function run() { let chat_info_panel = document.getElementById("info-expand"); chat_info_panel.insertBefore(info_expand_button, chat_info_panel.childNodes[2]); + // create slider toggle + const is_public_checkbox = document.getElementById("is-public-checkbox"); + const label_element = is_public_checkbox.getElementsByTagName("label")[0]; + const checkbox_span = is_public_checkbox.getElementsByTagName("span")[0]; + new_div = document.createElement("div"); + + label_element.classList.add("switch"); + is_public_checkbox.appendChild(checkbox_span); + label_element.appendChild(new_div) + // clpse globalThis.clpseFn = (id) => { var obj = document.getElementById('clpse-btn-' + id); diff --git a/libs/ktem/ktem/assets/md/about.md b/libs/ktem/ktem/assets/md/about.md index 02a542e5a..5b7edbfa9 100644 --- a/libs/ktem/ktem/assets/md/about.md +++ b/libs/ktem/ktem/assets/md/about.md @@ -8,6 +8,3 @@ An open-source tool for you to chat with your documents. [User Guide](https://cinnamon.github.io/kotaemon/) | [Developer Guide](https://cinnamon.github.io/kotaemon/development/) | [Feedback](https://github.com/Cinnamon/kotaemon/issues) - -[Dark Mode](?__theme=dark) -[Night Mode](?__theme=light) diff --git a/libs/ktem/ktem/pages/chat/__init__.py b/libs/ktem/ktem/pages/chat/__init__.py index df421561d..e25fdba54 100644 --- a/libs/ktem/ktem/pages/chat/__init__.py +++ b/libs/ktem/ktem/pages/chat/__init__.py @@ -76,7 +76,6 @@ def __init__(self, app): self._preview_links = gr.State(value=None) self._reasoning_type = gr.State(value=None) - self._llm_type = gr.State(value=None) self._conversation_renamed = gr.State(value=False) self._suggestion_updated = gr.State(value=False) self._info_panel_expanded = gr.State(value=True) @@ -142,6 +141,7 @@ def on_building_ui(self): with gr.Row(): gr.HTML("Reasoning method") gr.HTML("Model") + gr.HTML("Generate mindmap") with gr.Row(): reasoning_type_values = [ @@ -149,13 +149,13 @@ def on_building_ui(self): ] + self._app.default_settings.reasoning.settings[ "use" ].choices - self.reasoning_types = gr.Dropdown( + self.reasoning_type = gr.Dropdown( choices=reasoning_type_values, value=DEFAULT_SETTING, container=False, show_label=False, ) - self.model_types = gr.Dropdown( + self.model_type = gr.Dropdown( choices=self._app.default_settings.reasoning.options[ "simple" ] @@ -165,6 +165,17 @@ def on_building_ui(self): container=False, show_label=False, ) + binary_default_choices = [ + (DEFAULT_SETTING, DEFAULT_SETTING), + ("Enable", True), + ("Disable", False), + ] + self.use_mindmap = gr.Dropdown( + value=DEFAULT_SETTING, + choices=binary_default_choices, + container=False, + show_label=False, + ) with gr.Column( scale=INFO_PANEL_SCALES[False], elem_id="chat-info-panel" @@ -222,7 +233,8 @@ def on_register_events(self): self.chat_panel.chatbot, self._app.settings_state, self._reasoning_type, - self._llm_type, + self.model_type, + self.use_mindmap, self.state_chat, self._app.user_id, ] @@ -489,16 +501,11 @@ def on_register_events(self): + self._indices_input, outputs=None, ) - self.reasoning_types.change( + self.reasoning_type.change( self.reasoning_changed, - inputs=[self.reasoning_types], + inputs=[self.reasoning_type], outputs=[self._reasoning_type], ) - self.model_types.change( - lambda x: x, - inputs=[self.model_types], - outputs=[self._llm_type], - ) self.chat_control.conversation_id.change( lambda: gr.update(visible=False), outputs=self.plot_panel, @@ -714,6 +721,7 @@ def create_pipeline( settings: dict, session_reasoning_type: str, session_llm: str, + session_use_mindmap: bool | str, state: dict, user_id: int, *selecteds, @@ -730,7 +738,12 @@ def create_pipeline( - the pipeline objects """ # override reasoning_mode by temporary chat page state - print("Session reasoning type", session_reasoning_type) + print( + "Session reasoning type", + session_reasoning_type, + "use mindmap", + session_use_mindmap, + ) print("Session LLM", session_llm) reasoning_mode = ( settings["reasoning.use"] @@ -743,9 +756,16 @@ def create_pipeline( settings = deepcopy(settings) llm_setting_key = f"reasoning.options.{reasoning_id}.llm" - if llm_setting_key in settings and session_llm not in (DEFAULT_SETTING, None): + if llm_setting_key in settings and session_llm not in ( + DEFAULT_SETTING, + None, + "", + ): settings[llm_setting_key] = session_llm + if session_use_mindmap not in (DEFAULT_SETTING, None): + settings["reasoning.options.simple.create_mindmap"] = session_use_mindmap + # get retrievers retrievers = [] for index in self._app.index_manager.indices: @@ -777,6 +797,7 @@ def chat_fn( settings, reasoning_type, llm_type, + use_mind_map, state, user_id, *selecteds, @@ -793,7 +814,7 @@ def chat_fn( # construct the pipeline pipeline, reasoning_state = self.create_pipeline( - settings, reasoning_type, llm_type, state, user_id, *selecteds + settings, reasoning_type, llm_type, use_mind_map, state, user_id, *selecteds ) print("Reasoning state", reasoning_state) pipeline.set_output_queue(queue) diff --git a/libs/ktem/ktem/pages/chat/control.py b/libs/ktem/ktem/pages/chat/control.py index 7ca3f77b2..db48cd643 100644 --- a/libs/ktem/ktem/pages/chat/control.py +++ b/libs/ktem/ktem/pages/chat/control.py @@ -40,15 +40,6 @@ def __init__(self, app): def on_building_ui(self): with gr.Row(): gr.Markdown("## Conversations") - self.btn_new = gr.Button( - value="", - icon=f"{ASSETS_DIR}/new.svg", - min_width=2, - scale=1, - size="sm", - elem_classes=["no-background", "body-text-color"], - elem_id="new-conv-button", - ) self.btn_toggle_dark_mode = gr.Button( value="", icon=f"{ASSETS_DIR}/dark_mode.svg", @@ -87,6 +78,22 @@ def on_building_ui(self): ) with gr.Row() as self._new_delete: + self.cb_is_public = gr.Checkbox( + value=False, + label="Shared", + min_width=10, + scale=4, + elem_id="is-public-checkbox", + container=False, + ) + self.btn_conversation_rn = gr.Button( + value="", + icon=f"{ASSETS_DIR}/rename.svg", + min_width=2, + scale=1, + size="sm", + elem_classes=["no-background", "body-text-color"], + ) self.btn_del = gr.Button( value="", icon=f"{ASSETS_DIR}/delete.svg", @@ -95,16 +102,14 @@ def on_building_ui(self): size="sm", elem_classes=["no-background", "body-text-color"], ) - self.btn_conversation_rn = gr.Button( + self.btn_new = gr.Button( value="", - icon=f"{ASSETS_DIR}/rename.svg", + icon=f"{ASSETS_DIR}/new.svg", min_width=2, scale=1, size="sm", elem_classes=["no-background", "body-text-color"], - ) - self.cb_is_public = gr.Checkbox( - value=False, label="Share conversation", min_width=10, scale=6 + elem_id="new-conv-button", ) with gr.Row(visible=False) as self._delete_confirm: