Skip to content

Commit 2d5872a

Browse files
authored
fix: add project_id to urls returned by langfuse_context.get_current_trace_url (#1056)
1 parent c4153f8 commit 2d5872a

File tree

4 files changed

+52
-8
lines changed

4 files changed

+52
-8
lines changed

langfuse/client.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -342,20 +342,28 @@ def _get_release_value(self, release: Optional[str] = None) -> Optional[str]:
342342
else:
343343
return get_common_release_envs()
344344

345+
def _get_project_id(self) -> Optional[str]:
346+
"""Fetch and return the current project id. Persisted across requests. Returns None if no project id is found for api keys."""
347+
if not self.project_id:
348+
proj = self.client.projects.get()
349+
if not proj.data or not proj.data[0].id:
350+
return None
351+
352+
self.project_id = proj.data[0].id
353+
354+
return self.project_id
355+
345356
def get_trace_id(self) -> str:
346357
"""Get the current trace id."""
347358
return self.trace_id
348359

349360
def get_trace_url(self) -> str:
350361
"""Get the URL of the current trace to view it in the Langfuse UI."""
351-
if not self.project_id:
352-
proj = self.client.projects.get()
353-
if not proj.data or not proj.data[0].id:
354-
return f"{self.base_url}/trace/{self.trace_id}"
355-
356-
self.project_id = proj.data[0].id
362+
project_id = self._get_project_id()
363+
if not project_id:
364+
return f"{self.base_url}/trace/{self.trace_id}"
357365

358-
return f"{self.base_url}/project/{self.project_id}/traces/{self.trace_id}"
366+
return f"{self.base_url}/project/{project_id}/traces/{self.trace_id}"
359367

360368
def get_dataset(
361369
self, name: str, *, fetch_items_page_size: Optional[int] = 50

langfuse/decorators/langfuse_decorator.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,12 @@ def get_current_trace_url(self) -> Optional[str]:
713713
if not trace_id:
714714
raise ValueError("No trace found in the current context")
715715

716-
return f"{self.client_instance.client._client_wrapper._base_url}/trace/{trace_id}"
716+
project_id = self.client_instance._get_project_id()
717+
718+
if not project_id:
719+
return f"{self.client_instance.client._client_wrapper._base_url}/trace/{trace_id}"
720+
721+
return f"{self.client_instance.client._client_wrapper._base_url}/project/{project_id}/traces/{trace_id}"
717722

718723
except Exception as e:
719724
self._log.error(f"Failed to get current trace URL: {e}")

tests/test_core_sdk.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,13 @@ def faulty_mask_func(data):
15381538
assert fetched_trace["output"] == "<fully masked due to failed mask function>"
15391539

15401540

1541+
def test_get_project_id():
1542+
langfuse = Langfuse(debug=False)
1543+
res = langfuse._get_project_id()
1544+
assert res is not None
1545+
assert res == "7a88fb47-b4e2-43b8-a06c-a5ce950dc53a"
1546+
1547+
15411548
def test_generate_trace_id():
15421549
langfuse = Langfuse(debug=False)
15431550
trace_id = create_uuid()

tests/test_decorators.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,30 @@ def level_1_function(*args, **kwargs):
608608
)
609609

610610

611+
def test_get_current_trace_url():
612+
mock_trace_id = create_uuid()
613+
614+
@observe()
615+
def level_3_function():
616+
return langfuse_context.get_current_trace_url()
617+
618+
@observe()
619+
def level_2_function():
620+
return level_3_function()
621+
622+
@observe()
623+
def level_1_function(*args, **kwargs):
624+
return level_2_function()
625+
626+
result = level_1_function(
627+
*mock_args, **mock_kwargs, langfuse_observation_id=mock_trace_id
628+
)
629+
langfuse_context.flush()
630+
631+
expected_url = f"http://localhost:3000/project/7a88fb47-b4e2-43b8-a06c-a5ce950dc53a/traces/{mock_trace_id}"
632+
assert result == expected_url
633+
634+
611635
def test_scoring_observations():
612636
mock_name = "test_scoring_observations"
613637
mock_trace_id = create_uuid()

0 commit comments

Comments
 (0)