Skip to content

Commit 2dc29cf

Browse files
authored
Feat/add langsmith dotted order (#10856)
1 parent bd05df5 commit 2dc29cf

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

api/core/ops/langsmith_trace/entities/langsmith_trace_entity.py

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class LangSmithRunModel(LangSmithTokenUsage, LangSmithMultiModel):
4949
reference_example_id: Optional[str] = Field(None, description="Reference example ID associated with the run")
5050
input_attachments: Optional[dict[str, Any]] = Field(None, description="Input attachments of the run")
5151
output_attachments: Optional[dict[str, Any]] = Field(None, description="Output attachments of the run")
52+
dotted_order: Optional[str] = Field(None, description="Dotted order of the run")
5253

5354
@field_validator("inputs", "outputs")
5455
@classmethod

api/core/ops/langsmith_trace/langsmith_trace.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
LangSmithRunType,
2626
LangSmithRunUpdateModel,
2727
)
28-
from core.ops.utils import filter_none_values
28+
from core.ops.utils import filter_none_values, generate_dotted_order
2929
from extensions.ext_database import db
3030
from models.model import EndUser, MessageFile
3131
from models.workflow import WorkflowNodeExecution
@@ -62,6 +62,16 @@ def trace(self, trace_info: BaseTraceInfo):
6262
self.generate_name_trace(trace_info)
6363

6464
def workflow_trace(self, trace_info: WorkflowTraceInfo):
65+
trace_id = trace_info.message_id or trace_info.workflow_app_log_id or trace_info.workflow_run_id
66+
message_dotted_order = (
67+
generate_dotted_order(trace_info.message_id, trace_info.start_time) if trace_info.message_id else None
68+
)
69+
workflow_dotted_order = generate_dotted_order(
70+
trace_info.workflow_app_log_id or trace_info.workflow_run_id,
71+
trace_info.workflow_data.created_at,
72+
message_dotted_order,
73+
)
74+
6575
if trace_info.message_id:
6676
message_run = LangSmithRunModel(
6777
id=trace_info.message_id,
@@ -76,6 +86,8 @@ def workflow_trace(self, trace_info: WorkflowTraceInfo):
7686
},
7787
tags=["message", "workflow"],
7888
error=trace_info.error,
89+
trace_id=trace_id,
90+
dotted_order=message_dotted_order,
7991
)
8092
self.add_run(message_run)
8193

@@ -95,6 +107,8 @@ def workflow_trace(self, trace_info: WorkflowTraceInfo):
95107
error=trace_info.error,
96108
tags=["workflow"],
97109
parent_run_id=trace_info.message_id or None,
110+
trace_id=trace_id,
111+
dotted_order=workflow_dotted_order,
98112
)
99113

100114
self.add_run(langsmith_run)
@@ -177,6 +191,7 @@ def workflow_trace(self, trace_info: WorkflowTraceInfo):
177191
else:
178192
run_type = LangSmithRunType.tool
179193

194+
node_dotted_order = generate_dotted_order(node_execution_id, created_at, workflow_dotted_order)
180195
langsmith_run = LangSmithRunModel(
181196
total_tokens=node_total_tokens,
182197
name=node_type,
@@ -191,6 +206,9 @@ def workflow_trace(self, trace_info: WorkflowTraceInfo):
191206
},
192207
parent_run_id=trace_info.workflow_app_log_id or trace_info.workflow_run_id,
193208
tags=["node_execution"],
209+
id=node_execution_id,
210+
trace_id=trace_id,
211+
dotted_order=node_dotted_order,
194212
)
195213

196214
self.add_run(langsmith_run)

api/core/ops/utils.py

+17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from contextlib import contextmanager
22
from datetime import datetime
3+
from typing import Optional, Union
34

45
from extensions.ext_database import db
56
from models.model import Message
@@ -43,3 +44,19 @@ def replace_text_with_content(data):
4344
return [replace_text_with_content(item) for item in data]
4445
else:
4546
return data
47+
48+
49+
def generate_dotted_order(
50+
run_id: str, start_time: Union[str, datetime], parent_dotted_order: Optional[str] = None
51+
) -> str:
52+
"""
53+
generate dotted_order for langsmith
54+
"""
55+
start_time = datetime.fromisoformat(start_time) if isinstance(start_time, str) else start_time
56+
timestamp = start_time.strftime("%Y%m%dT%H%M%S%f")[:-3] + "Z"
57+
current_segment = f"{timestamp}{run_id}"
58+
59+
if parent_dotted_order is None:
60+
return current_segment
61+
62+
return f"{parent_dotted_order}.{current_segment}"

0 commit comments

Comments
 (0)