@@ -21,10 +21,13 @@ def extract_langfuse_metadata(chat_request: ChatRequest, headers: dict) -> dict:
2121
2222 Metadata can be provided via:
2323 1. extra_body.langfuse_metadata dict in the request
24- 2. HTTP headers: X-Chat-Id, X-User-Id, X-Session-Id, X-Message-Id
25- 3. user field in the request (for user_id)
24+ 2. user field in the request (PRIORITIZED for user_id - ensures consistent email usage)
25+ 3. HTTP headers: X-Chat-Id, X-User-Id, X-Session-Id, X-Message-Id
2626
2727 Returns a dict with: user_id, session_id, chat_id, message_id, and any custom metadata
28+
29+ Note: The 'user' field is prioritized for user_id to ensure email addresses
30+ are consistently used across all messages instead of generated IDs from headers.
2831 """
2932 metadata = {}
3033
@@ -34,6 +37,11 @@ def extract_langfuse_metadata(chat_request: ChatRequest, headers: dict) -> dict:
3437 if isinstance (langfuse_meta , dict ):
3538 metadata .update (langfuse_meta )
3639
40+ # PRIORITY: Set user_id from the 'user' field FIRST
41+ # This ensures we always use the email address when available
42+ if chat_request .user :
43+ metadata ["user_id" ] = chat_request .user
44+
3745 # Extract from headers
3846 headers_lower = {k .lower (): v for k , v in headers .items ()}
3947
@@ -51,14 +59,11 @@ def extract_langfuse_metadata(chat_request: ChatRequest, headers: dict) -> dict:
5159
5260 for header_key , meta_key in header_mapping .items ():
5361 if header_key in headers_lower and headers_lower [header_key ]:
54- # Don't override if already set (standard headers take precedence)
62+ # Don't override if already set
63+ # (chat_request.user takes precedence for user_id)
5564 if meta_key not in metadata :
5665 metadata [meta_key ] = headers_lower [header_key ]
5766
58- # Use the 'user' field from request as user_id if not already set
59- if "user_id" not in metadata and chat_request .user :
60- metadata ["user_id" ] = chat_request .user
61-
6267 return metadata
6368
6469
0 commit comments