in packages/blueprints/gen-ai-chatbot/static-assets/chatbot-genai-components/backend/python/app/repositories/conversation.py [0:0]
def find_conversation_by_user_id(user_id: str) -> list[ConversationMeta]:
logger.info(f"Finding conversations for user: {user_id}")
table = _get_table_client(user_id)
query_params = {
"KeyConditionExpression": Key("PK").eq(user_id)
# NOTE: Need SK to fetch only conversations
& Key("SK").begins_with(f"{user_id}#CONV#"),
"ScanIndexForward": False,
}
response = table.query(**query_params)
conversations = [
ConversationMeta(
id=decompose_conv_id(item["SK"]),
create_time=float(item["CreateTime"]),
title=item["Title"],
# NOTE: all message has the same model
model=json.loads(item["MessageMap"]).get("system", {}).get("model", ""),
bot_id=item["BotId"] if "BotId" in item else None,
)
for item in response["Items"]
]
query_count = 1
MAX_QUERY_COUNT = 5
while "LastEvaluatedKey" in response:
model = (
json.loads(response["Items"][0]["MessageMap"])
.get("system", {})
.get("model", "")
)
query_params["ExclusiveStartKey"] = response["LastEvaluatedKey"]
# NOTE: max page size is 1MB
# See: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.Pagination.html
response = table.query(
**query_params,
)
conversations.extend(
[
ConversationMeta(
id=decompose_conv_id(item["SK"]),
create_time=float(item["CreateTime"]),
title=item["Title"],
model=model,
bot_id=item["BotId"] if "BotId" in item else None,
)
for item in response["Items"]
]
)
query_count += 1
if query_count > MAX_QUERY_COUNT:
logger.warning(f"Query count exceeded {MAX_QUERY_COUNT}")
break
logger.info(f"Found conversations: {conversations}")
return conversations