Retrieve, create, and save conversations differently for ClientApplications (#656)

* Retrieve, create, and save conversations differently if they're coming from a client application

- Not all of our client apps will necessarily maintain state over the conversation IDs available to a user. For some (single-threaded conversations), it should just use a single conversation. Fix the code to do so

* Simplify conversation retrieval logic

* Keep 0 padding below chat response

* Add order_by sorting to retrieving the conversation without id
This commit is contained in:
sabaimran
2024-02-23 11:32:00 -08:00
committed by GitHub
parent 9afb2a14ef
commit 42773e808c
3 changed files with 28 additions and 13 deletions

View File

@@ -1246,7 +1246,7 @@
margin: 0; margin: 0;
} }
.chat-message-text-response { .chat-message-text-response {
margin-bottom: -16px; margin-bottom: 0px;
} }
/* Spinner symbol when the chat message is loading */ /* Spinner symbol when the chat message is loading */

View File

@@ -397,12 +397,17 @@ class ConversationAdapters:
user: KhojUser, client_application: ClientApplication = None, conversation_id: int = None user: KhojUser, client_application: ClientApplication = None, conversation_id: int = None
): ):
if conversation_id: if conversation_id:
conversation = Conversation.objects.filter(user=user, client=client_application, id=conversation_id) conversation = (
if not conversation_id or not conversation.exists(): Conversation.objects.filter(user=user, client=client_application, id=conversation_id)
conversation = Conversation.objects.filter(user=user, client=client_application).order_by("-updated_at") .order_by("-updated_at")
if conversation.exists(): .first()
return conversation.first() )
return Conversation.objects.create(user=user, client=client_application) else:
conversation = (
Conversation.objects.filter(user=user, client=client_application).order_by("-updated_at").first()
)
return conversation or Conversation.objects.create(user=user, client=client_application)
@staticmethod @staticmethod
def get_conversation_sessions(user: KhojUser, client_application: ClientApplication = None): def get_conversation_sessions(user: KhojUser, client_application: ClientApplication = None):
@@ -435,10 +440,14 @@ class ConversationAdapters:
): ):
if conversation_id: if conversation_id:
conversation = Conversation.objects.filter(user=user, client=client_application, id=conversation_id) conversation = Conversation.objects.filter(user=user, client=client_application, id=conversation_id)
else: elif slug:
conversation = Conversation.objects.filter(user=user, client=client_application, slug=slug) conversation = Conversation.objects.filter(user=user, client=client_application, slug=slug)
else:
conversation = Conversation.objects.filter(user=user, client=client_application).order_by("-updated_at")
if await conversation.aexists(): if await conversation.aexists():
return await conversation.afirst() return await conversation.afirst()
return await Conversation.objects.acreate(user=user, client=client_application, slug=slug) return await Conversation.objects.acreate(user=user, client=client_application, slug=slug)
@staticmethod @staticmethod
@@ -517,11 +526,17 @@ class ConversationAdapters:
): ):
slug = user_message.strip()[:200] if user_message else None slug = user_message.strip()[:200] if user_message else None
if conversation_id: if conversation_id:
conversation = Conversation.objects.filter(user=user, client=client_application, id=conversation_id) conversation = Conversation.objects.filter(user=user, client=client_application, id=conversation_id).first()
else: else:
conversation = Conversation.objects.filter(user=user, client=client_application) conversation = (
if conversation.exists(): Conversation.objects.filter(user=user, client=client_application).order_by("-updated_at").first()
conversation.update(conversation_log=conversation_log, slug=slug, updated_at=datetime.now(tz=timezone.utc)) )
if conversation:
conversation.conversation_log = conversation_log
conversation.slug = slug
conversation.updated_at = datetime.now(tz=timezone.utc)
conversation.save()
else: else:
Conversation.objects.create( Conversation.objects.create(
user=user, conversation_log=conversation_log, client=client_application, slug=slug user=user, conversation_log=conversation_log, client=client_application, slug=slug

View File

@@ -1312,7 +1312,7 @@ To get started, just start typing below. You can also type / to see a list of co
margin: 0; margin: 0;
} }
.chat-message-text-response { .chat-message-text-response {
margin-bottom: -16px; margin-bottom: 0px;
} }
/* Spinner symbol when the chat message is loading */ /* Spinner symbol when the chat message is loading */