|
42 | 42 | import json |
43 | 43 | import unicodedata |
44 | 44 |
|
| 45 | +# Trace utilities |
| 46 | +from backend.utils.trace_utils import RequestTrace, generate_correlation_id |
| 47 | +from backend.utils.trace_storage import get_trace_storage |
| 48 | +from backend.api.request_tracking_middleware import get_correlation_id |
| 49 | + |
45 | 50 | logger = logging.getLogger(__name__) |
46 | 51 |
|
47 | 52 | router = APIRouter() |
@@ -3585,8 +3590,17 @@ async def chat_with_rag(request: Request, chat_request: ChatRequest): |
3585 | 3590 | start_time = time.time() |
3586 | 3591 | timing_logs = {} |
3587 | 3592 |
|
| 3593 | + # Initialize trace for request traceability |
| 3594 | + trace_id = get_correlation_id() or generate_correlation_id() |
| 3595 | + trace_storage = get_trace_storage() |
| 3596 | + trace = RequestTrace( |
| 3597 | + trace_id=trace_id, |
| 3598 | + timestamp=datetime.now(timezone.utc).isoformat(), |
| 3599 | + query=chat_request.message[:500] # Limit query length in trace |
| 3600 | + ) |
| 3601 | + |
3588 | 3602 | # DEBUG: Log request received (very early) |
3589 | | - logger.info(f"📥 Received chat request: message_length={len(chat_request.message)}, use_option_b={getattr(chat_request, 'use_option_b', 'NOT_SET')}") |
| 3603 | + logger.info(f"📥 Received chat request: message_length={len(chat_request.message)}, use_option_b={getattr(chat_request, 'use_option_b', 'NOT_SET')}, trace_id={trace_id}") |
3590 | 3604 |
|
3591 | 3605 | # Initialize latency variables (will be set during processing) |
3592 | 3606 | rag_retrieval_latency = 0.0 |
@@ -10489,9 +10503,29 @@ async def store_conversation_background(): |
10489 | 10503 | except Exception as e: |
10490 | 10504 | logger.warning(f"⚠️ Failed to record strategy usage for Meta-Learning: {e}") |
10491 | 10505 |
|
| 10506 | + # Finalize trace before returning |
| 10507 | + total_duration = (time.time() - start_time) * 1000 |
| 10508 | + trace.duration_ms = total_duration |
| 10509 | + if trace.final_response is None: |
| 10510 | + trace.final_response = {} |
| 10511 | + trace.final_response.update({ |
| 10512 | + "response_length": len(response) if response else 0, |
| 10513 | + "confidence_score": confidence_score, |
| 10514 | + "validation_passed": validation_info.get("passed", False) if validation_info else None, |
| 10515 | + "epistemic_state": epistemic_state.value if epistemic_state else None |
| 10516 | + }) |
| 10517 | + |
| 10518 | + # Store trace |
| 10519 | + try: |
| 10520 | + trace_storage.store(trace) |
| 10521 | + logger.debug(f"📊 Stored trace: {trace_id}") |
| 10522 | + except Exception as e: |
| 10523 | + logger.warning(f"⚠️ Failed to store trace {trace_id}: {e}") |
| 10524 | + |
10492 | 10525 | return ChatResponse( |
10493 | 10526 | response=response, |
10494 | 10527 | message_id=message_id, |
| 10528 | + trace_id=trace_id, # NEW: Include trace ID in response |
10495 | 10529 | context_used=context, |
10496 | 10530 | accuracy_score=accuracy_score, |
10497 | 10531 | confidence_score=confidence_score, |
|
0 commit comments