|
24 | 24 |
|
25 | 25 | # Langfuse for LLM observability (optional) |
26 | 26 | try: |
27 | | - from langfuse import Langfuse |
| 27 | + from langfuse import get_client, configure |
28 | 28 | LANGFUSE_AVAILABLE = True |
29 | 29 | except ImportError: |
30 | 30 | LANGFUSE_AVAILABLE = False |
@@ -197,41 +197,34 @@ async def _run_claude_agent_sdk(self, prompt: str): |
197 | 197 | langfuse_enabled = os.getenv('LANGFUSE_ENABLED', '').strip().lower() in ('1', 'true', 'yes') |
198 | 198 | if langfuse_enabled: |
199 | 199 | try: |
200 | | - langfuse_client = Langfuse( |
| 200 | + # Configure Langfuse client (SDK 3.x recommended approach) |
| 201 | + configure( |
201 | 202 | public_key=os.getenv('LANGFUSE_PUBLIC_KEY'), |
202 | 203 | secret_key=os.getenv('LANGFUSE_SECRET_KEY'), |
203 | 204 | host=os.getenv('LANGFUSE_HOST') |
204 | 205 | ) |
| 206 | + langfuse_client = get_client() |
205 | 207 |
|
206 | 208 | # Extract user context for observability |
207 | 209 | user_id = os.getenv('USER_ID', '').strip() |
208 | 210 | user_name = os.getenv('USER_NAME', '').strip() |
209 | 211 |
|
210 | | - # Start a span for this session (Langfuse SDK 3.x) |
211 | | - # Top-level span becomes the trace root |
212 | | - # Try passing user_id in metadata AND calling update_trace() |
213 | | - langfuse_session_span = langfuse_client.start_span( |
| 212 | + # Start a span for this session using SDK 3.x recommended API |
| 213 | + # Use start_as_current_span() with get_client() |
| 214 | + langfuse_session_span = langfuse_client.start_as_current_span( |
214 | 215 | name="claude_agent_session", |
215 | 216 | input={"prompt": prompt}, |
216 | | - user_id=user_id if user_id else None, # Try as direct parameter |
217 | 217 | metadata={ |
218 | 218 | "session_id": self.context.session_id, |
219 | 219 | "namespace": self.context.get_env('AGENTIC_SESSION_NAMESPACE', 'unknown'), |
220 | 220 | "user_name": user_name if user_name else None, |
221 | | - "user_id": user_id if user_id else None, # Also in metadata |
222 | 221 | }, |
223 | 222 | ) |
224 | 223 |
|
225 | | - # Also try update_trace() as backup |
| 224 | + # Set user_id on trace using update_trace() (SDK 3.x API) |
226 | 225 | if user_id: |
227 | | - try: |
228 | | - result = langfuse_session_span.update_trace(user_id=user_id) |
229 | | - logging.info(f"Langfuse: update_trace() returned: {result}") |
230 | | - logging.info(f"Langfuse: Tracking session for user {user_name} ({user_id})") |
231 | | - except Exception as e: |
232 | | - logging.warning(f"Failed to set user_id on trace: {e}") |
233 | | - import traceback |
234 | | - logging.warning(traceback.format_exc()) |
| 226 | + langfuse_session_span.update_trace(user_id=user_id) |
| 227 | + logging.info(f"Langfuse: Tracking session for user {user_name} ({user_id})") |
235 | 228 |
|
236 | 229 | logging.info(f"Langfuse tracing enabled for session") |
237 | 230 | except Exception as e: |
@@ -636,7 +629,7 @@ async def process_response_stream(client_obj): |
636 | 629 | generation_kwargs["usage_details"] = usage_dict |
637 | 630 | logging.info(f"Langfuse: Tracking generation with usage: {usage_dict}") |
638 | 631 |
|
639 | | - generation = langfuse_client.start_generation(**generation_kwargs) |
| 632 | + generation = langfuse_client.start_as_current_generation(**generation_kwargs) |
640 | 633 | generation.end() |
641 | 634 | except Exception as e: |
642 | 635 | logging.debug(f"Failed to create Langfuse generation: {e}") |
@@ -672,7 +665,7 @@ async def process_response_stream(client_obj): |
672 | 665 | # Add Langfuse span for tool decision |
673 | 666 | if langfuse_client and langfuse_session_span: |
674 | 667 | try: |
675 | | - tool_span = langfuse_client.start_span( |
| 668 | + tool_span = langfuse_client.start_as_current_span( |
676 | 669 | name=f"tool_{tool_name}", |
677 | 670 | input=tool_input, |
678 | 671 | metadata={ |
|
0 commit comments