Skip to content

Commit 0a3d6a8

Browse files
authored
feat: add sessions and i/o on traces (#233)
1 parent 9fabbc5 commit 0a3d6a8

File tree

5 files changed

+17
-11
lines changed

5 files changed

+17
-11
lines changed

langfuse/api/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def __init__(
3131
username: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None,
3232
password: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None,
3333
timeout: typing.Optional[float] = 60,
34-
httpx_client: typing.Optional[httpx.Client] = None
34+
httpx_client: typing.Optional[httpx.Client] = None,
3535
):
3636
self._client_wrapper = SyncClientWrapper(
3737
base_url=base_url,
@@ -68,7 +68,7 @@ def __init__(
6868
username: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None,
6969
password: typing.Optional[typing.Union[str, typing.Callable[[], str]]] = None,
7070
timeout: typing.Optional[float] = 60,
71-
httpx_client: typing.Optional[httpx.AsyncClient] = None
71+
httpx_client: typing.Optional[httpx.AsyncClient] = None,
7272
):
7373
self._client_wrapper = AsyncClientWrapper(
7474
base_url=base_url,

langfuse/api/resources/commons/types/trace.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ class Trace(pydantic.BaseModel):
2222
version: typing.Optional[str] = None
2323
user_id: typing.Optional[str] = pydantic.Field(alias="userId", default=None)
2424
metadata: typing.Optional[typing.Any] = None
25-
public: typing.Optional[bool] = pydantic.Field(
26-
default=None, description="Public traces are accessible via url without login"
27-
)
25+
public: typing.Optional[bool] = pydantic.Field(default=None, description="Public traces are accessible via url without login")
2826

2927
def json(self, **kwargs: typing.Any) -> str:
3028
kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
# This file was auto-generated by Fern from our API Definition.
2-

langfuse/openai.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,12 @@ def __init__(self, module: str, object: str, method: str, type: str, sync: bool)
7474

7575

7676
class OpenAiArgsExtractor:
77-
def __init__(self, name=None, metadata=None, trace_id=None, **kwargs):
77+
def __init__(self, name=None, metadata=None, trace_id=None, session_id=None, **kwargs):
7878
self.args = {}
7979
self.args["name"] = name
8080
self.args["metadata"] = metadata
8181
self.args["trace_id"] = trace_id
82+
self.args["session_id"] = session_id
8283
self.kwargs = kwargs
8384

8485
def get_langfuse_args(self):
@@ -104,12 +105,19 @@ def _get_langfuse_data_from_kwargs(resource: OpenAiDefinition, langfuse: Langfus
104105
if name is not None and not isinstance(name, str):
105106
raise TypeError("name must be a string")
106107

107-
trace_id = kwargs.get("trace_id", "OpenAI-generation")
108+
trace_id = kwargs.get("trace_id", None)
108109
if trace_id is not None and not isinstance(trace_id, str):
109110
raise TypeError("trace_id must be a string")
111+
112+
session_id = kwargs.get("session_id", None)
113+
if session_id is not None and not isinstance(session_id, str):
114+
raise TypeError("session_id must be a string")
110115

111116
if trace_id:
112-
langfuse.trace(CreateTrace(id=trace_id))
117+
langfuse.trace(CreateTrace(id=trace_id, sessionId=session_id))
118+
elif session_id:
119+
# If a session_id is provided but no trace_id, we should create a trace using the SDK and then use its trace_id
120+
trace_id = langfuse.trace(CreateTrace(sessionId=session_id)).id
113121

114122
metadata = kwargs.get("metadata", {})
115123

tests/test_core_sdk.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ def test_create_trace_and_generation():
402402
trace_name = create_uuid()
403403
generationId = create_uuid()
404404

405-
trace = langfuse.trace(CreateTrace(name=trace_name))
405+
trace = langfuse.trace(CreateTrace(name=trace_name, input={"key": "value"}, sessionId="test"))
406406
trace.generation(CreateGeneration(id=generationId, name="generation"))
407407

408408
langfuse.flush()
@@ -417,8 +417,9 @@ def test_create_trace_and_generation():
417417

418418
generation = getTrace.observations[0]
419419
assert generation.name == "generation"
420-
assert generation.trace_id == trace.id
420+
assert generation.trace_id == getTrace.id
421421
assert generation.start_time is not None
422+
assert getTrace.input == {"key": "value"}
422423

423424

424425
def test_create_generation_and_trace():

0 commit comments

Comments
 (0)