diff --git a/src/custom_widgets/chat_widget.py b/src/custom_widgets/chat_widget.py index bcb12b2..cd428d5 100644 --- a/src/custom_widgets/chat_widget.py +++ b/src/custom_widgets/chat_widget.py @@ -201,6 +201,10 @@ class chat_tab(Gtk.ListBoxRow): def __init__(self, chat_window:chat): self.chat_window=chat_window + self.spinner = Gtk.Spinner( + spinning=True, + visible=False + ) self.label = Gtk.Label( label=self.chat_window.get_name(), tooltip_text=self.chat_window.get_name(), @@ -211,10 +215,16 @@ class chat_tab(Gtk.ListBoxRow): wrap_mode=2, xalign=0 ) + container = Gtk.Box( + orientation=0, + spacing=10 + ) + container.append(self.spinner) + container.append(self.label) super().__init__( css_classes = ["chat_row"], height_request = 45, - child = self.label + child = container ) self.gesture = Gtk.GestureClick(button=3) @@ -316,8 +326,8 @@ class chat_list(Gtk.ListBox): tab = self.get_tab_by_name(old_chat_name) if tab: new_chat_name = window.generate_numbered_name(new_chat_name, [tab.chat_window.get_name() for tab in self.tab_list]) - tab.get_child().set_label(new_chat_name) - tab.get_child().set_tooltip_text(new_chat_name) + tab.label.set_label(new_chat_name) + tab.label.set_tooltip_text(new_chat_name) tab.chat_window.set_name(new_chat_name) if os.path.exists(os.path.join(data_dir, "chats", old_chat_name)): shutil.move(os.path.join(data_dir, "chats", old_chat_name), os.path.join(data_dir, "chats", new_chat_name)) diff --git a/src/window.py b/src/window.py index 1a0a940..92d46a7 100644 --- a/src/window.py +++ b/src/window.py @@ -171,7 +171,8 @@ class AlpacaWindow(Adw.ApplicationWindow): "model": current_model, "messages": self.convert_history_to_ollama(current_chat), "options": {"temperature": self.ollama_instance.tweaks["temperature"], "seed": self.ollama_instance.tweaks["seed"]}, - "keep_alive": f"{self.ollama_instance.tweaks['keep_alive']}m" + "keep_alive": f"{self.ollama_instance.tweaks['keep_alive']}m", + "stream": True } self.message_text_view.get_buffer().set_text("", 0) @@ -180,13 +181,7 @@ class AlpacaWindow(Adw.ApplicationWindow): current_chat.add_message(bot_id, current_model) m_element_bot = current_chat.messages[bot_id] m_element_bot.set_text() - thread = threading.Thread(target=self.run_message, args=(data, m_element_bot)) - thread.start() - if len(data['messages']) == 1: - message_data = data["messages"][0].copy() - message_data['content'] = raw_message - generate_title_thread = threading.Thread(target=self.generate_chat_title, args=(message_data, current_chat.get_name())) - generate_title_thread.start() + threading.Thread(target=self.run_message, args=(data, m_element_bot, current_chat)).start() @Gtk.Template.Callback() def welcome_carousel_page_changed(self, carousel, index): @@ -438,6 +433,10 @@ class AlpacaWindow(Adw.ApplicationWindow): messages = [] for message_id, message in chat.messages_to_dict().items(): new_message = message.copy() + if 'model' in new_message: + del new_message['model'] + if 'date' in new_message: + del new_message['date'] if 'files' in message and len(message['files']) > 0: del new_message['files'] new_message['content'] = '' @@ -458,8 +457,6 @@ class AlpacaWindow(Adw.ApplicationWindow): return messages def generate_chat_title(self, message, old_chat_name): - if not old_chat_name.startswith(_("New Chat")): - return logger.debug("Generating chat title") prompt = f""" Generate a title following these rules: @@ -519,10 +516,13 @@ Generate a title following these rules: self.stop_button.set_visible(not send) self.send_button.set_visible(send) - def run_message(self, data:dict, message_element:message_widget.message): + def run_message(self, data:dict, message_element:message_widget.message, chat:chat_widget.chat): logger.debug("Running message") - chat = message_element.get_parent().get_parent().get_parent().get_parent() chat.busy = True + self.chat_list_box.get_tab_by_name(chat.get_name()).spinner.set_visible(True) + if len(data['messages']) == 1 and chat.get_name().startswith(_("New Chat")): + threading.Thread(target=self.generate_chat_title, args=(data['messages'][0].copy(), chat.get_name())).start() + self.chat_list_box.set_sensitive(False) if chat.welcome_screen: chat.welcome_screen.set_visible(False) @@ -532,7 +532,7 @@ Generate a title following these rules: if self.regenerate_button: GLib.idle_add(self.chat_list_box.get_current_chat().remove, self.regenerate_button) try: - response = self.ollama_instance.request("POST", "api/generate", json.dumps(data), lambda data, message_element=message_element: GLib.idle_add(message_element.update_message, data)) + response = self.ollama_instance.request("POST", "api/chat", json.dumps(data), lambda data, message_element=message_element: GLib.idle_add(message_element.update_message, data)) if response.status_code != 200: raise Exception('Network Error') except Exception as e: @@ -699,7 +699,7 @@ Generate a title following these rules: def chat_actions(self, action, user_data): chat_row = self.selected_chat_row - chat_name = chat_row.get_child().get_label() + chat_name = chat_row.label.get_label() action_name = action.get_name() if action_name in ('delete_chat', 'delete_current_chat'): dialogs.delete_chat(self, chat_name)