From f94a093e8cff88508d8f2f949ab51ae580b1be66 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 11 Aug 2025 14:56:31 +0100 Subject: [PATCH 1/5] fix: truncate long text fields to prevent overflow in logs and sources --- application/api/answer/routes/base.py | 33 +++++++++++-------- .../answer/services/conversation_service.py | 5 +++ application/api/user/routes.py | 2 +- application/logging.py | 7 ++++ application/worker.py | 8 +++-- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/application/api/answer/routes/base.py b/application/api/answer/routes/base.py index 682da1f0..3f876081 100644 --- a/application/api/answer/routes/base.py +++ b/application/api/answer/routes/base.py @@ -147,20 +147,25 @@ class BaseAnswerResource: # Log the interaction retriever_params = retriever.get_params() - self.user_logs_collection.insert_one( - { - "action": "stream_answer", - "level": "info", - "user": decoded_token.get("sub"), - "api_key": user_api_key, - "question": question, - "response": response_full, - "sources": source_log_docs, - "retriever_params": retriever_params, - "attachments": attachment_ids, - "timestamp": datetime.datetime.now(datetime.timezone.utc), - } - ) + log_entry = { + "action": "stream_answer", + "level": "info", + "user": decoded_token.get("sub"), + "api_key": user_api_key, + "question": question, + "response": response_full, + "sources": source_log_docs, + "retriever_params": retriever_params, + "attachments": attachment_ids, + "timestamp": datetime.datetime.now(datetime.timezone.utc), + } + + # clean up text fields to be no longer than 10000 characters + for key, value in log_entry.items(): + if isinstance(value, str) and len(value) > 10000: + log_entry[key] = value[:10000] + + self.user_logs_collection.insert_one(log_entry) # End of stream diff --git a/application/api/answer/services/conversation_service.py b/application/api/answer/services/conversation_service.py index e35fcc40..3ea7a136 100644 --- a/application/api/answer/services/conversation_service.py +++ b/application/api/answer/services/conversation_service.py @@ -66,6 +66,11 @@ class ConversationService: if not user_id: raise ValueError("User ID not found in token") current_time = datetime.now(timezone.utc) + + # clean up in sources array such that we save max 1k characters for text part + for source in sources: + if "text" in source and isinstance(source["text"], str): + source["text"] = source["text"][:1000] if conversation_id is not None and index is not None: # Update existing conversation with new query diff --git a/application/api/user/routes.py b/application/api/user/routes.py index a6c0d55b..259da757 100644 --- a/application/api/user/routes.py +++ b/application/api/user/routes.py @@ -64,7 +64,7 @@ attachments_collection = db["attachments"] try: agents_collection.create_index( - [("shared_publicly", 1)], + [("shared", 1)], name="shared_index", background=True, ) diff --git a/application/logging.py b/application/logging.py index d48fb17e..2c5cde27 100644 --- a/application/logging.py +++ b/application/logging.py @@ -136,6 +136,8 @@ def _log_to_mongodb( mongo = MongoDB.get_client() db = mongo[settings.MONGO_DB_NAME] user_logs_collection = db["stack_logs"] + + log_entry = { "endpoint": endpoint, @@ -147,6 +149,11 @@ def _log_to_mongodb( "stacks": stacks, "timestamp": datetime.datetime.now(datetime.timezone.utc), } + # clean up text fields to be no longer than 10000 characters + for key, value in log_entry.items(): + if isinstance(value, str) and len(value) > 10000: + log_entry[key] = value[:10000] + user_logs_collection.insert_one(log_entry) logging.debug(f"Logged activity to MongoDB: {activity_id}") diff --git a/application/worker.py b/application/worker.py index 23f96bf5..71747005 100755 --- a/application/worker.py +++ b/application/worker.py @@ -471,9 +471,13 @@ def attachment_worker(self, file_info, user): .load_data()[0] .text, ) - + + token_count = num_tokens_from_string(content) - + if token_count > 100000: + content = content[:250000] + token_count = num_tokens_from_string(content) + self.update_state( state="PROGRESS", meta={"current": 80, "status": "Storing in database"} ) From eb05132008ddfcee11324574f8fe839c42643957 Mon Sep 17 00:00:00 2001 From: Hanzalah Waheed Date: Tue, 12 Aug 2025 00:16:21 +0400 Subject: [PATCH 2/5] fix: always show the response bubble buttons. --- .../src/conversation/ConversationBubble.tsx | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/frontend/src/conversation/ConversationBubble.tsx b/frontend/src/conversation/ConversationBubble.tsx index 6379eb0a..38d4053f 100644 --- a/frontend/src/conversation/ConversationBubble.tsx +++ b/frontend/src/conversation/ConversationBubble.tsx @@ -550,20 +550,16 @@ const ConversationBubble = forwardRef< )} {message && (
-
-
- -
-
-
-
- -
-
+ {type !== 'ERROR' && ( + <> +
+ +
+
+ +
+ + )} {type === 'ERROR' && (
{retryBtn}
@@ -573,10 +569,11 @@ const ConversationBubble = forwardRef< <>
Date: Wed, 13 Aug 2025 02:11:47 +0400 Subject: [PATCH 3/5] fix: show both like and dislike buttons --- .../src/conversation/ConversationBubble.tsx | 39 +++++++------------ 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/frontend/src/conversation/ConversationBubble.tsx b/frontend/src/conversation/ConversationBubble.tsx index 38d4053f..0d708cd6 100644 --- a/frontend/src/conversation/ConversationBubble.tsx +++ b/frontend/src/conversation/ConversationBubble.tsx @@ -565,16 +565,9 @@ const ConversationBubble = forwardRef<
{retryBtn}
)} - {handleFeedback && ( + {handleFeedback && type !== 'ERROR' && ( <> -
+
{ if (feedback === undefined || feedback === null) { handleFeedback?.('LIKE'); @@ -598,6 +587,10 @@ const ConversationBubble = forwardRef< handleFeedback?.(null); setIsLikeClicked(false); setIsDislikeClicked(false); + } else if (feedback === 'DISLIKE') { + handleFeedback?.('LIKE'); + setIsDislikeClicked(false); + setIsLikeClicked(true); } }} onMouseEnter={() => setIsLikeHovered(true)} @@ -607,13 +600,7 @@ const ConversationBubble = forwardRef<
-
+
{ if (feedback === undefined || feedback === null) { handleFeedback?.('DISLIKE'); @@ -637,6 +620,10 @@ const ConversationBubble = forwardRef< handleFeedback?.(null); setIsLikeClicked(false); setIsDislikeClicked(false); + } else if (feedback === 'LIKE') { + handleFeedback?.('DISLIKE'); + setIsDislikeClicked(true); + setIsLikeClicked(false); } }} onMouseEnter={() => setIsDislikeHovered(true)} From cb9ec69cf686130cd4c084b1f93373842c03be0f Mon Sep 17 00:00:00 2001 From: Hanzalah Waheed Date: Wed, 13 Aug 2025 02:31:25 +0400 Subject: [PATCH 4/5] chore: refactor code to use ternary operator for error type check --- .../src/conversation/ConversationBubble.tsx | 143 +++++++++--------- 1 file changed, 71 insertions(+), 72 deletions(-) diff --git a/frontend/src/conversation/ConversationBubble.tsx b/frontend/src/conversation/ConversationBubble.tsx index 0d708cd6..f1af7862 100644 --- a/frontend/src/conversation/ConversationBubble.tsx +++ b/frontend/src/conversation/ConversationBubble.tsx @@ -550,7 +550,11 @@ const ConversationBubble = forwardRef< )} {message && (
- {type !== 'ERROR' && ( + {type === 'ERROR' ? ( +
+
{retryBtn}
+
+ ) : ( <>
@@ -558,80 +562,75 @@ const ConversationBubble = forwardRef<
- - )} - {type === 'ERROR' && ( -
-
{retryBtn}
-
- )} - {handleFeedback && type !== 'ERROR' && ( - <> -
-
-
- { - if (feedback === undefined || feedback === null) { - handleFeedback?.('LIKE'); - setIsLikeClicked(true); - setIsDislikeClicked(false); - } else if (feedback === 'LIKE') { - handleFeedback?.(null); - setIsLikeClicked(false); - setIsDislikeClicked(false); - } else if (feedback === 'DISLIKE') { - handleFeedback?.('LIKE'); - setIsDislikeClicked(false); - setIsLikeClicked(true); - } - }} - onMouseEnter={() => setIsLikeHovered(true)} - onMouseLeave={() => setIsLikeHovered(false)} - > + {handleFeedback && ( + <> +
+
+
+ { + if (feedback === undefined || feedback === null) { + handleFeedback?.('LIKE'); + setIsLikeClicked(true); + setIsDislikeClicked(false); + } else if (feedback === 'LIKE') { + handleFeedback?.(null); + setIsLikeClicked(false); + setIsDislikeClicked(false); + } else if (feedback === 'DISLIKE') { + handleFeedback?.('LIKE'); + setIsDislikeClicked(false); + setIsLikeClicked(true); + } + }} + onMouseEnter={() => setIsLikeHovered(true)} + onMouseLeave={() => setIsLikeHovered(false)} + > +
+
-
-
-
-
-
- { - if (feedback === undefined || feedback === null) { - handleFeedback?.('DISLIKE'); - setIsDislikeClicked(true); - setIsLikeClicked(false); - } else if (feedback === 'DISLIKE') { - handleFeedback?.(null); - setIsLikeClicked(false); - setIsDislikeClicked(false); - } else if (feedback === 'LIKE') { - handleFeedback?.('DISLIKE'); - setIsDislikeClicked(true); - setIsLikeClicked(false); - } - }} - onMouseEnter={() => setIsDislikeHovered(true)} - onMouseLeave={() => setIsDislikeHovered(false)} - > +
+
+
+ { + if (feedback === undefined || feedback === null) { + handleFeedback?.('DISLIKE'); + setIsDislikeClicked(true); + setIsLikeClicked(false); + } else if (feedback === 'DISLIKE') { + handleFeedback?.(null); + setIsLikeClicked(false); + setIsDislikeClicked(false); + } else if (feedback === 'LIKE') { + handleFeedback?.('DISLIKE'); + setIsDislikeClicked(true); + setIsLikeClicked(false); + } + }} + onMouseEnter={() => setIsDislikeHovered(true)} + onMouseLeave={() => setIsDislikeHovered(false)} + > +
+
-
-
+ + )} )}
From 6bb0cd535a035e5fce39c63743729b90e43e163d Mon Sep 17 00:00:00 2001 From: Hanzalah Waheed Date: Wed, 13 Aug 2025 02:36:58 +0400 Subject: [PATCH 5/5] fix: rm redundant states. track feedback state w prop var --- .../src/conversation/ConversationBubble.tsx | 31 +++++-------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/frontend/src/conversation/ConversationBubble.tsx b/frontend/src/conversation/ConversationBubble.tsx index f1af7862..3be40df7 100644 --- a/frontend/src/conversation/ConversationBubble.tsx +++ b/frontend/src/conversation/ConversationBubble.tsx @@ -92,8 +92,7 @@ const ConversationBubble = forwardRef< const [editInputBox, setEditInputBox] = useState(''); const messageRef = useRef(null); const [shouldShowToggle, setShouldShowToggle] = useState(false); - const [isLikeClicked, setIsLikeClicked] = useState(false); - const [isDislikeClicked, setIsDislikeClicked] = useState(false); + const [activeTooltip, setActiveTooltip] = useState(null); const [isSidebarOpen, setIsSidebarOpen] = useState(false); const editableQueryRef = useRef(null); @@ -574,20 +573,12 @@ const ConversationBubble = forwardRef< }`} > { - if (feedback === undefined || feedback === null) { - handleFeedback?.('LIKE'); - setIsLikeClicked(true); - setIsDislikeClicked(false); - } else if (feedback === 'LIKE') { + if (feedback === 'LIKE') { handleFeedback?.(null); - setIsLikeClicked(false); - setIsDislikeClicked(false); - } else if (feedback === 'DISLIKE') { + } else { handleFeedback?.('LIKE'); - setIsDislikeClicked(false); - setIsLikeClicked(true); } }} onMouseEnter={() => setIsLikeHovered(true)} @@ -607,20 +598,12 @@ const ConversationBubble = forwardRef< }`} > { - if (feedback === undefined || feedback === null) { - handleFeedback?.('DISLIKE'); - setIsDislikeClicked(true); - setIsLikeClicked(false); - } else if (feedback === 'DISLIKE') { + if (feedback === 'DISLIKE') { handleFeedback?.(null); - setIsLikeClicked(false); - setIsDislikeClicked(false); - } else if (feedback === 'LIKE') { + } else { handleFeedback?.('DISLIKE'); - setIsDislikeClicked(true); - setIsLikeClicked(false); } }} onMouseEnter={() => setIsDislikeHovered(true)}