Browse Source

Improve handling of event and other messages for chat response
Remove limitation of number of attached images for image-aware chat completions

Kumi 1 year ago
parent
commit
0317b2f5aa
1 changed files with 19 additions and 24 deletions
  1. 19 24
      src/gptbot/classes/bot.py

+ 19 - 24
src/gptbot/classes/bot.py

@@ -250,8 +250,7 @@ class GPTBot:
 
             if isinstance(event, RoomMessageMedia):
                 if event.sender != self.matrix_client.user_id:
-                    if len(messages) < 2 or isinstance(messages[-1], RoomMessageMedia):
-                        messages.append(event)
+                    messages.append(event)
 
         self.logger.log(f"Found {len(messages)} messages (limit: {n})", "debug")
 
@@ -922,40 +921,36 @@ class GPTBot:
 
         chat_messages = [{"role": "system", "content": system_message}]
 
-        text_messages = list(filter(lambda x: not isinstance(x, RoomMessageMedia), last_messages))
-
-        for message in text_messages:
-            role = (
-                "assistant" if message.sender == self.matrix_client.user_id else "user"
-            )
-            if not message.event_id == event.event_id:
-                chat_messages.append({"role": role, "content": message.body})
+        last_messages = [event] + last_messages
 
-        if not self.chat_api.supports_chat_images():
-            event_body = event.body
-        else:
-            event_body = [
-                {
-                    "type": "text",
-                    "text": event.body
-                }
-            ]
+        for message in last_messages:
+            if isinstance(message, (RoomMessageNotice, RoomMessageText)):
+                role = (
+                    "assistant" if message.sender == self.matrix_client.user_id else "user"
+                )
+                if message == event or (not message.event_id == event.event_id):
+                    message_body = message.body if not self.chat_api.supports_chat_images() else [{"type": "text", "text": message.body}]
+                    chat_messages.append({"role": role, "content": message_body})
 
-            for m in list(filter(lambda x: isinstance(x, RoomMessageMedia), last_messages)):
-                image_url = m.url
+            if self.chat_api.supports_chat_images() and isinstance(message, RoomMessageMedia):
+                image_url = message.url
                 download = await self.download_file(image_url)
 
                 if download:
                     encoded_url = f"data:{download.content_type};base64,{base64.b64encode(download.body).decode('utf-8')}"
-                    event_body.append({
+                    parent = chat_messages[-1] if chat_messages and chat_messages[-1]["role"] == ("assistant" if message.sender == self.matrix_client.user_id else "user") else None
+
+                    if not parent:
+                        chat_messages.append({"role": ("assistant" if message.sender == self.matrix_client.user_id else "user"), "content": []})
+                        parent = chat_messages[-1]
+
+                    parent["content"].append({
                         "type": "image_url",
                         "image_url": {
                             "url": encoded_url
                         }
                     })
 
-        chat_messages.append({"role": "user", "content": event_body})
-
         # Truncate messages to fit within the token limit
         truncated_messages = self._truncate(
             chat_messages, self.max_tokens - 1, system_message=system_message