Added spinner for chats receiving messages

This commit is contained in:
jeffser 2024-08-31 22:00:42 -06:00
parent ed3136cffd
commit a54ec6fa9d
2 changed files with 27 additions and 17 deletions

View File

@ -201,6 +201,10 @@ class chat_tab(Gtk.ListBoxRow):
def __init__(self, chat_window:chat): def __init__(self, chat_window:chat):
self.chat_window=chat_window self.chat_window=chat_window
self.spinner = Gtk.Spinner(
spinning=True,
visible=False
)
self.label = Gtk.Label( self.label = Gtk.Label(
label=self.chat_window.get_name(), label=self.chat_window.get_name(),
tooltip_text=self.chat_window.get_name(), tooltip_text=self.chat_window.get_name(),
@ -211,10 +215,16 @@ class chat_tab(Gtk.ListBoxRow):
wrap_mode=2, wrap_mode=2,
xalign=0 xalign=0
) )
container = Gtk.Box(
orientation=0,
spacing=10
)
container.append(self.spinner)
container.append(self.label)
super().__init__( super().__init__(
css_classes = ["chat_row"], css_classes = ["chat_row"],
height_request = 45, height_request = 45,
child = self.label child = container
) )
self.gesture = Gtk.GestureClick(button=3) self.gesture = Gtk.GestureClick(button=3)
@ -316,8 +326,8 @@ class chat_list(Gtk.ListBox):
tab = self.get_tab_by_name(old_chat_name) tab = self.get_tab_by_name(old_chat_name)
if tab: if tab:
new_chat_name = window.generate_numbered_name(new_chat_name, [tab.chat_window.get_name() for tab in self.tab_list]) 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.label.set_label(new_chat_name)
tab.get_child().set_tooltip_text(new_chat_name) tab.label.set_tooltip_text(new_chat_name)
tab.chat_window.set_name(new_chat_name) tab.chat_window.set_name(new_chat_name)
if os.path.exists(os.path.join(data_dir, "chats", old_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)) shutil.move(os.path.join(data_dir, "chats", old_chat_name), os.path.join(data_dir, "chats", new_chat_name))

View File

@ -171,7 +171,8 @@ class AlpacaWindow(Adw.ApplicationWindow):
"model": current_model, "model": current_model,
"messages": self.convert_history_to_ollama(current_chat), "messages": self.convert_history_to_ollama(current_chat),
"options": {"temperature": self.ollama_instance.tweaks["temperature"], "seed": self.ollama_instance.tweaks["seed"]}, "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) 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) current_chat.add_message(bot_id, current_model)
m_element_bot = current_chat.messages[bot_id] m_element_bot = current_chat.messages[bot_id]
m_element_bot.set_text() m_element_bot.set_text()
thread = threading.Thread(target=self.run_message, args=(data, m_element_bot)) threading.Thread(target=self.run_message, args=(data, m_element_bot, current_chat)).start()
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()
@Gtk.Template.Callback() @Gtk.Template.Callback()
def welcome_carousel_page_changed(self, carousel, index): def welcome_carousel_page_changed(self, carousel, index):
@ -438,6 +433,10 @@ class AlpacaWindow(Adw.ApplicationWindow):
messages = [] messages = []
for message_id, message in chat.messages_to_dict().items(): for message_id, message in chat.messages_to_dict().items():
new_message = message.copy() 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: if 'files' in message and len(message['files']) > 0:
del new_message['files'] del new_message['files']
new_message['content'] = '' new_message['content'] = ''
@ -458,8 +457,6 @@ class AlpacaWindow(Adw.ApplicationWindow):
return messages return messages
def generate_chat_title(self, message, old_chat_name): def generate_chat_title(self, message, old_chat_name):
if not old_chat_name.startswith(_("New Chat")):
return
logger.debug("Generating chat title") logger.debug("Generating chat title")
prompt = f""" prompt = f"""
Generate a title following these rules: Generate a title following these rules:
@ -519,10 +516,13 @@ Generate a title following these rules:
self.stop_button.set_visible(not send) self.stop_button.set_visible(not send)
self.send_button.set_visible(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") logger.debug("Running message")
chat = message_element.get_parent().get_parent().get_parent().get_parent()
chat.busy = True 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) self.chat_list_box.set_sensitive(False)
if chat.welcome_screen: if chat.welcome_screen:
chat.welcome_screen.set_visible(False) chat.welcome_screen.set_visible(False)
@ -532,7 +532,7 @@ Generate a title following these rules:
if self.regenerate_button: if self.regenerate_button:
GLib.idle_add(self.chat_list_box.get_current_chat().remove, self.regenerate_button) GLib.idle_add(self.chat_list_box.get_current_chat().remove, self.regenerate_button)
try: 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: if response.status_code != 200:
raise Exception('Network Error') raise Exception('Network Error')
except Exception as e: except Exception as e:
@ -699,7 +699,7 @@ Generate a title following these rules:
def chat_actions(self, action, user_data): def chat_actions(self, action, user_data):
chat_row = self.selected_chat_row 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() action_name = action.get_name()
if action_name in ('delete_chat', 'delete_current_chat'): if action_name in ('delete_chat', 'delete_current_chat'):
dialogs.delete_chat(self, chat_name) dialogs.delete_chat(self, chat_name)