3ba93c55f4
Revert get_conversation_for_user to use Conversation.get() with MultipleObjectsReturned fallback. Add channel field to Conversation model and get_conversation_for_channel helper so each messaging channel gets its own isolated conversation per user. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
import tortoise.exceptions
|
|
|
|
import blueprints.users.models
|
|
|
|
from .models import Conversation, ConversationMessage
|
|
|
|
|
|
async def create_conversation(name: str = "") -> Conversation:
|
|
conversation = await Conversation.create(name=name)
|
|
return conversation
|
|
|
|
|
|
async def add_message_to_conversation(
|
|
conversation: Conversation,
|
|
message: str,
|
|
speaker: str,
|
|
user: blueprints.users.models.User,
|
|
image_key: str | None = None,
|
|
) -> ConversationMessage:
|
|
print(conversation, message, speaker)
|
|
|
|
# Name the conversation after the first user message
|
|
if speaker == "user" and not await conversation.messages.all().exists():
|
|
conversation.name = message[:100]
|
|
await conversation.save()
|
|
|
|
message = await ConversationMessage.create(
|
|
text=message,
|
|
speaker=speaker,
|
|
conversation=conversation,
|
|
image_key=image_key,
|
|
)
|
|
|
|
return message
|
|
|
|
|
|
async def get_the_only_conversation() -> Conversation:
|
|
try:
|
|
conversation = await Conversation.all().first()
|
|
if conversation is None:
|
|
conversation = await Conversation.create(name="simba_chat")
|
|
except Exception as _e:
|
|
conversation = await Conversation.create(name="simba_chat")
|
|
|
|
return conversation
|
|
|
|
|
|
async def get_conversation_for_user(user: blueprints.users.models.User) -> Conversation:
|
|
try:
|
|
conversation = await Conversation.get(user=user)
|
|
except tortoise.exceptions.MultipleObjectsReturned:
|
|
conversation = (
|
|
await Conversation.filter(user=user).order_by("created_at").first()
|
|
)
|
|
except tortoise.exceptions.DoesNotExist:
|
|
conversation = await Conversation.create(
|
|
name=f"{user.username}'s chat", user=user
|
|
)
|
|
return conversation
|
|
|
|
|
|
async def get_conversation_for_channel(
|
|
user: blueprints.users.models.User, channel: str
|
|
) -> Conversation:
|
|
conversation = await Conversation.filter(user=user, channel=channel).first()
|
|
if conversation is None:
|
|
conversation = await Conversation.create(
|
|
name=f"{user.username}'s {channel} chat", user=user, channel=channel
|
|
)
|
|
return conversation
|
|
|
|
|
|
async def get_conversation_by_id(id: str) -> Conversation:
|
|
return await Conversation.get(id=id)
|
|
|
|
|
|
async def get_conversation_transcript(
|
|
user: blueprints.users.models.User, conversation: Conversation
|
|
) -> str:
|
|
messages = []
|
|
for message in conversation.messages:
|
|
messages.append(f"{message.speaker} at {message.created_at}: {message.text}")
|
|
|
|
return "\n".join(messages)
|