Spaces:
Sleeping
Sleeping
Girish Jeswani commited on
Commit ·
ddd6f63
1
Parent(s): 625853d
bug fixes
Browse files
multi_llm_chatbot_backend/app/api/routes/debug.py
CHANGED
|
@@ -1,10 +1,11 @@
|
|
| 1 |
from fastapi import APIRouter, Request, Query
|
| 2 |
from app.core.session_manager import get_session_manager
|
| 3 |
from app.core.rag_manager import get_rag_manager
|
| 4 |
-
from app.api.utils import get_or_create_session_for_request
|
| 5 |
from app.core.bootstrap import chat_orchestrator
|
| 6 |
import logging
|
| 7 |
|
|
|
|
|
|
|
| 8 |
logger = logging.getLogger(__name__)
|
| 9 |
|
| 10 |
router = APIRouter()
|
|
|
|
| 1 |
from fastapi import APIRouter, Request, Query
|
| 2 |
from app.core.session_manager import get_session_manager
|
| 3 |
from app.core.rag_manager import get_rag_manager
|
|
|
|
| 4 |
from app.core.bootstrap import chat_orchestrator
|
| 5 |
import logging
|
| 6 |
|
| 7 |
+
from app.api.old_routes import get_or_create_session_for_request
|
| 8 |
+
|
| 9 |
logger = logging.getLogger(__name__)
|
| 10 |
|
| 11 |
router = APIRouter()
|
multi_llm_chatbot_backend/app/api/routes/documents.py
CHANGED
|
@@ -3,12 +3,11 @@ from fastapi import Query
|
|
| 3 |
from app.utils.document_extractor import extract_text_from_file
|
| 4 |
from app.core.session_manager import get_session_manager
|
| 5 |
from app.core.rag_manager import get_rag_manager
|
| 6 |
-
from app.api.utils import
|
| 7 |
from fastapi.responses import StreamingResponse
|
| 8 |
from app.utils.chat_summary import generate_summary_from_messages, parse_summary_to_blocks, format_summary_for_text_export
|
| 9 |
from app.utils.file_export import prepare_export_response, generate_pdf_file_from_blocks
|
| 10 |
from app.core.session_manager import get_session_manager
|
| 11 |
-
from app.api.utils import get_or_create_session_for_request
|
| 12 |
from app.core.bootstrap import chat_orchestrator
|
| 13 |
from app.core.auth import get_current_active_user
|
| 14 |
from app.core.database import get_database
|
|
@@ -167,7 +166,7 @@ async def upload_document(
|
|
| 167 |
logger.info(f"Uploading document to specific chat session: {session_id}")
|
| 168 |
else:
|
| 169 |
# For new/temporary chats, use regular session management
|
| 170 |
-
session_id =
|
| 171 |
logger.info(f"Uploading document to new session: {session_id}")
|
| 172 |
|
| 173 |
session = session_manager.get_session(session_id)
|
|
@@ -235,7 +234,7 @@ async def upload_document(
|
|
| 235 |
@router.post("/search-documents")
|
| 236 |
async def search_documents(request: Request, query: str = Body(..., embed=True), persona: str = Body("", embed=True)):
|
| 237 |
try:
|
| 238 |
-
session_id =
|
| 239 |
rag_manager = get_rag_manager()
|
| 240 |
|
| 241 |
persona_contexts = {
|
|
@@ -267,7 +266,7 @@ async def search_documents(request: Request, query: str = Body(..., embed=True),
|
|
| 267 |
@router.get("/document-stats")
|
| 268 |
async def get_document_stats(request: Request):
|
| 269 |
try:
|
| 270 |
-
session_id =
|
| 271 |
rag_manager = get_rag_manager()
|
| 272 |
return rag_manager.get_document_stats(session_id)
|
| 273 |
except Exception as e:
|
|
@@ -278,7 +277,7 @@ async def get_document_stats(request: Request):
|
|
| 278 |
@router.get("/uploaded-files")
|
| 279 |
async def get_uploaded_filenames(request: Request):
|
| 280 |
try:
|
| 281 |
-
session_id =
|
| 282 |
session = session_manager.get_session(session_id)
|
| 283 |
return {"files": session.uploaded_files}
|
| 284 |
except Exception as e:
|
|
@@ -289,7 +288,7 @@ async def get_uploaded_filenames(request: Request):
|
|
| 289 |
@router.get("/document-insights/{filename}")
|
| 290 |
async def get_document_insights(filename: str, request: Request):
|
| 291 |
try:
|
| 292 |
-
session_id =
|
| 293 |
rag_manager = get_rag_manager()
|
| 294 |
stats = rag_manager.get_document_stats(session_id)
|
| 295 |
document_info = next((doc for doc in stats.get("documents", []) if doc["filename"] == filename), None)
|
|
@@ -370,7 +369,7 @@ async def export_chat(
|
|
| 370 |
messages = convert_messages_for_export(raw_messages)
|
| 371 |
else:
|
| 372 |
# Export current in-memory session (existing behavior)
|
| 373 |
-
session_id =
|
| 374 |
session = session_manager.get_session(session_id)
|
| 375 |
# In-memory messages might already be in the right format, but convert to be safe
|
| 376 |
messages = convert_messages_for_export(session.messages)
|
|
@@ -450,7 +449,7 @@ async def chat_summary(
|
|
| 450 |
messages = convert_messages_for_export(raw_messages)
|
| 451 |
else:
|
| 452 |
# Summarize current in-memory session (existing behavior)
|
| 453 |
-
session_id =
|
| 454 |
session = session_manager.get_session(session_id)
|
| 455 |
# Convert in-memory messages
|
| 456 |
messages = convert_messages_for_export(session.messages)
|
|
@@ -521,5 +520,4 @@ async def chat_summary(
|
|
| 521 |
raise HTTPException(
|
| 522 |
status_code=500,
|
| 523 |
detail=f"Summary generation failed: {str(e)}"
|
| 524 |
-
)
|
| 525 |
-
|
|
|
|
| 3 |
from app.utils.document_extractor import extract_text_from_file
|
| 4 |
from app.core.session_manager import get_session_manager
|
| 5 |
from app.core.rag_manager import get_rag_manager
|
| 6 |
+
from app.api.utils import get_or_create_session_for_request_async
|
| 7 |
from fastapi.responses import StreamingResponse
|
| 8 |
from app.utils.chat_summary import generate_summary_from_messages, parse_summary_to_blocks, format_summary_for_text_export
|
| 9 |
from app.utils.file_export import prepare_export_response, generate_pdf_file_from_blocks
|
| 10 |
from app.core.session_manager import get_session_manager
|
|
|
|
| 11 |
from app.core.bootstrap import chat_orchestrator
|
| 12 |
from app.core.auth import get_current_active_user
|
| 13 |
from app.core.database import get_database
|
|
|
|
| 166 |
logger.info(f"Uploading document to specific chat session: {session_id}")
|
| 167 |
else:
|
| 168 |
# For new/temporary chats, use regular session management
|
| 169 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 170 |
logger.info(f"Uploading document to new session: {session_id}")
|
| 171 |
|
| 172 |
session = session_manager.get_session(session_id)
|
|
|
|
| 234 |
@router.post("/search-documents")
|
| 235 |
async def search_documents(request: Request, query: str = Body(..., embed=True), persona: str = Body("", embed=True)):
|
| 236 |
try:
|
| 237 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 238 |
rag_manager = get_rag_manager()
|
| 239 |
|
| 240 |
persona_contexts = {
|
|
|
|
| 266 |
@router.get("/document-stats")
|
| 267 |
async def get_document_stats(request: Request):
|
| 268 |
try:
|
| 269 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 270 |
rag_manager = get_rag_manager()
|
| 271 |
return rag_manager.get_document_stats(session_id)
|
| 272 |
except Exception as e:
|
|
|
|
| 277 |
@router.get("/uploaded-files")
|
| 278 |
async def get_uploaded_filenames(request: Request):
|
| 279 |
try:
|
| 280 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 281 |
session = session_manager.get_session(session_id)
|
| 282 |
return {"files": session.uploaded_files}
|
| 283 |
except Exception as e:
|
|
|
|
| 288 |
@router.get("/document-insights/{filename}")
|
| 289 |
async def get_document_insights(filename: str, request: Request):
|
| 290 |
try:
|
| 291 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 292 |
rag_manager = get_rag_manager()
|
| 293 |
stats = rag_manager.get_document_stats(session_id)
|
| 294 |
document_info = next((doc for doc in stats.get("documents", []) if doc["filename"] == filename), None)
|
|
|
|
| 369 |
messages = convert_messages_for_export(raw_messages)
|
| 370 |
else:
|
| 371 |
# Export current in-memory session (existing behavior)
|
| 372 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 373 |
session = session_manager.get_session(session_id)
|
| 374 |
# In-memory messages might already be in the right format, but convert to be safe
|
| 375 |
messages = convert_messages_for_export(session.messages)
|
|
|
|
| 449 |
messages = convert_messages_for_export(raw_messages)
|
| 450 |
else:
|
| 451 |
# Summarize current in-memory session (existing behavior)
|
| 452 |
+
session_id = await get_or_create_session_for_request_async(request) # FIXED: Added await
|
| 453 |
session = session_manager.get_session(session_id)
|
| 454 |
# Convert in-memory messages
|
| 455 |
messages = convert_messages_for_export(session.messages)
|
|
|
|
| 520 |
raise HTTPException(
|
| 521 |
status_code=500,
|
| 522 |
detail=f"Summary generation failed: {str(e)}"
|
| 523 |
+
)
|
|
|
multi_llm_chatbot_backend/app/api/utils.py
CHANGED
|
@@ -82,48 +82,6 @@ async def load_chat_session_into_context(chat_session_id: str, user_id: str) ->
|
|
| 82 |
logger.error(f"Error loading chat session into context: {e}")
|
| 83 |
return None
|
| 84 |
|
| 85 |
-
def get_or_create_session_for_request(
|
| 86 |
-
request: Request,
|
| 87 |
-
session_id_override: Optional[str] = None,
|
| 88 |
-
chat_session_id: Optional[str] = None,
|
| 89 |
-
user_id: Optional[str] = None
|
| 90 |
-
) -> str:
|
| 91 |
-
"""
|
| 92 |
-
Enhanced session management that properly handles chat switching
|
| 93 |
-
|
| 94 |
-
Args:
|
| 95 |
-
request: FastAPI request object
|
| 96 |
-
session_id_override: Explicit session ID to use
|
| 97 |
-
chat_session_id: MongoDB chat session ID (for existing chats)
|
| 98 |
-
user_id: User ID (for loading existing chats)
|
| 99 |
-
"""
|
| 100 |
-
|
| 101 |
-
# Case 1: Loading an existing chat session
|
| 102 |
-
if chat_session_id and user_id:
|
| 103 |
-
try:
|
| 104 |
-
# We need to handle this in the calling function since this isn't async
|
| 105 |
-
# Return a special identifier that the calling function can handle
|
| 106 |
-
return f"load_chat_{chat_session_id}"
|
| 107 |
-
|
| 108 |
-
except Exception as e:
|
| 109 |
-
logger.error(f"Error handling chat session load: {e}")
|
| 110 |
-
# Fall through to create new session
|
| 111 |
-
|
| 112 |
-
# Case 2: Explicit session ID provided
|
| 113 |
-
if session_id_override:
|
| 114 |
-
return session_id_override
|
| 115 |
-
|
| 116 |
-
# Case 3: Check for session header
|
| 117 |
-
session_header = request.headers.get("X-Session-ID")
|
| 118 |
-
if session_header:
|
| 119 |
-
return session_header
|
| 120 |
-
|
| 121 |
-
# Case 4: Create a truly new session (don't fall back to IP)
|
| 122 |
-
# This ensures each new chat gets its own context
|
| 123 |
-
new_session_id = session_manager.create_session()
|
| 124 |
-
logger.info(f"Created new session: {new_session_id}")
|
| 125 |
-
return new_session_id
|
| 126 |
-
|
| 127 |
async def get_or_create_session_for_request_async(
|
| 128 |
request: Request,
|
| 129 |
session_id_override: Optional[str] = None,
|
|
|
|
| 82 |
logger.error(f"Error loading chat session into context: {e}")
|
| 83 |
return None
|
| 84 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
async def get_or_create_session_for_request_async(
|
| 86 |
request: Request,
|
| 87 |
session_id_override: Optional[str] = None,
|
phd-advisor-frontend/src/components/EnhancedChatInput.js
CHANGED
|
@@ -100,8 +100,8 @@ const EnhancedChatInput = ({
|
|
| 100 |
{showUpload && (
|
| 101 |
<div className="floating-upload-section">
|
| 102 |
<FileUpload
|
| 103 |
-
onFileUploaded={
|
| 104 |
-
isUploading={
|
| 105 |
currentChatSessionId={currentChatSessionId}
|
| 106 |
authToken={authToken}
|
| 107 |
onUploadStart={handleUploadStart}
|
|
|
|
| 100 |
{showUpload && (
|
| 101 |
<div className="floating-upload-section">
|
| 102 |
<FileUpload
|
| 103 |
+
onFileUploaded={handleFileUploaded}
|
| 104 |
+
isUploading={isUploading}
|
| 105 |
currentChatSessionId={currentChatSessionId}
|
| 106 |
authToken={authToken}
|
| 107 |
onUploadStart={handleUploadStart}
|