|
@@ -16,6 +16,7 @@ from core.ops.entities.trace_entity import (
|
|
|
ModerationTraceInfo,
|
|
|
SuggestedQuestionTraceInfo,
|
|
|
ToolTraceInfo,
|
|
|
+ TraceTaskName,
|
|
|
WorkflowTraceInfo,
|
|
|
)
|
|
|
from core.ops.langfuse_trace.entities.langfuse_trace_entity import (
|
|
@@ -68,9 +69,9 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
user_id = trace_info.metadata.get("user_id")
|
|
|
if trace_info.message_id:
|
|
|
trace_id = trace_info.message_id
|
|
|
- name = f"message_{trace_info.message_id}"
|
|
|
+ name = TraceTaskName.MESSAGE_TRACE.value
|
|
|
trace_data = LangfuseTrace(
|
|
|
- id=trace_info.message_id,
|
|
|
+ id=trace_id,
|
|
|
user_id=user_id,
|
|
|
name=name,
|
|
|
input=trace_info.workflow_run_inputs,
|
|
@@ -78,11 +79,13 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
metadata=trace_info.metadata,
|
|
|
session_id=trace_info.conversation_id,
|
|
|
tags=["message", "workflow"],
|
|
|
+ created_at=trace_info.start_time,
|
|
|
+ updated_at=trace_info.end_time,
|
|
|
)
|
|
|
self.add_trace(langfuse_trace_data=trace_data)
|
|
|
workflow_span_data = LangfuseSpan(
|
|
|
- id=trace_info.workflow_app_log_id if trace_info.workflow_app_log_id else trace_info.workflow_run_id,
|
|
|
- name=f"workflow_{trace_info.workflow_app_log_id}" if trace_info.workflow_app_log_id else f"workflow_{trace_info.workflow_run_id}",
|
|
|
+ id=(trace_info.workflow_app_log_id if trace_info.workflow_app_log_id else trace_info.workflow_run_id),
|
|
|
+ name=TraceTaskName.WORKFLOW_TRACE.value,
|
|
|
input=trace_info.workflow_run_inputs,
|
|
|
output=trace_info.workflow_run_outputs,
|
|
|
trace_id=trace_id,
|
|
@@ -97,7 +100,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
trace_data = LangfuseTrace(
|
|
|
id=trace_id,
|
|
|
user_id=user_id,
|
|
|
- name=f"workflow_{trace_info.workflow_app_log_id}" if trace_info.workflow_app_log_id else f"workflow_{trace_info.workflow_run_id}",
|
|
|
+ name=TraceTaskName.WORKFLOW_TRACE.value,
|
|
|
input=trace_info.workflow_run_inputs,
|
|
|
output=trace_info.workflow_run_outputs,
|
|
|
metadata=trace_info.metadata,
|
|
@@ -134,14 +137,12 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
node_type = node_execution.node_type
|
|
|
status = node_execution.status
|
|
|
if node_type == "llm":
|
|
|
- inputs = json.loads(node_execution.process_data).get(
|
|
|
- "prompts", {}
|
|
|
- ) if node_execution.process_data else {}
|
|
|
+ inputs = (
|
|
|
+ json.loads(node_execution.process_data).get("prompts", {}) if node_execution.process_data else {}
|
|
|
+ )
|
|
|
else:
|
|
|
inputs = json.loads(node_execution.inputs) if node_execution.inputs else {}
|
|
|
- outputs = (
|
|
|
- json.loads(node_execution.outputs) if node_execution.outputs else {}
|
|
|
- )
|
|
|
+ outputs = json.loads(node_execution.outputs) if node_execution.outputs else {}
|
|
|
created_at = node_execution.created_at if node_execution.created_at else datetime.now()
|
|
|
elapsed_time = node_execution.elapsed_time
|
|
|
finished_at = created_at + timedelta(seconds=elapsed_time)
|
|
@@ -163,28 +164,30 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
if trace_info.message_id:
|
|
|
span_data = LangfuseSpan(
|
|
|
id=node_execution_id,
|
|
|
- name=f"{node_name}_{node_execution_id}",
|
|
|
+ name=node_type,
|
|
|
input=inputs,
|
|
|
output=outputs,
|
|
|
trace_id=trace_id,
|
|
|
start_time=created_at,
|
|
|
end_time=finished_at,
|
|
|
metadata=metadata,
|
|
|
- level=LevelEnum.DEFAULT if status == 'succeeded' else LevelEnum.ERROR,
|
|
|
+ level=(LevelEnum.DEFAULT if status == "succeeded" else LevelEnum.ERROR),
|
|
|
status_message=trace_info.error if trace_info.error else "",
|
|
|
- parent_observation_id=trace_info.workflow_app_log_id if trace_info.workflow_app_log_id else trace_info.workflow_run_id,
|
|
|
+ parent_observation_id=(
|
|
|
+ trace_info.workflow_app_log_id if trace_info.workflow_app_log_id else trace_info.workflow_run_id
|
|
|
+ ),
|
|
|
)
|
|
|
else:
|
|
|
span_data = LangfuseSpan(
|
|
|
id=node_execution_id,
|
|
|
- name=f"{node_name}_{node_execution_id}",
|
|
|
+ name=node_type,
|
|
|
input=inputs,
|
|
|
output=outputs,
|
|
|
trace_id=trace_id,
|
|
|
start_time=created_at,
|
|
|
end_time=finished_at,
|
|
|
metadata=metadata,
|
|
|
- level=LevelEnum.DEFAULT if status == 'succeeded' else LevelEnum.ERROR,
|
|
|
+ level=(LevelEnum.DEFAULT if status == "succeeded" else LevelEnum.ERROR),
|
|
|
status_message=trace_info.error if trace_info.error else "",
|
|
|
)
|
|
|
|
|
@@ -195,11 +198,11 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
total_token = metadata.get("total_tokens", 0)
|
|
|
# add generation
|
|
|
generation_usage = GenerationUsage(
|
|
|
- totalTokens=total_token,
|
|
|
+ total=total_token,
|
|
|
)
|
|
|
|
|
|
node_generation_data = LangfuseGeneration(
|
|
|
- name=f"generation_{node_execution_id}",
|
|
|
+ name="llm",
|
|
|
trace_id=trace_id,
|
|
|
parent_observation_id=node_execution_id,
|
|
|
start_time=created_at,
|
|
@@ -207,16 +210,14 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
input=inputs,
|
|
|
output=outputs,
|
|
|
metadata=metadata,
|
|
|
- level=LevelEnum.DEFAULT if status == 'succeeded' else LevelEnum.ERROR,
|
|
|
+ level=(LevelEnum.DEFAULT if status == "succeeded" else LevelEnum.ERROR),
|
|
|
status_message=trace_info.error if trace_info.error else "",
|
|
|
usage=generation_usage,
|
|
|
)
|
|
|
|
|
|
self.add_generation(langfuse_generation_data=node_generation_data)
|
|
|
|
|
|
- def message_trace(
|
|
|
- self, trace_info: MessageTraceInfo, **kwargs
|
|
|
- ):
|
|
|
+ def message_trace(self, trace_info: MessageTraceInfo, **kwargs):
|
|
|
# get message file data
|
|
|
file_list = trace_info.file_list
|
|
|
metadata = trace_info.metadata
|
|
@@ -225,9 +226,9 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
|
|
|
user_id = message_data.from_account_id
|
|
|
if message_data.from_end_user_id:
|
|
|
- end_user_data: EndUser = db.session.query(EndUser).filter(
|
|
|
- EndUser.id == message_data.from_end_user_id
|
|
|
- ).first()
|
|
|
+ end_user_data: EndUser = (
|
|
|
+ db.session.query(EndUser).filter(EndUser.id == message_data.from_end_user_id).first()
|
|
|
+ )
|
|
|
if end_user_data is not None:
|
|
|
user_id = end_user_data.session_id
|
|
|
metadata["user_id"] = user_id
|
|
@@ -235,7 +236,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
trace_data = LangfuseTrace(
|
|
|
id=message_id,
|
|
|
user_id=user_id,
|
|
|
- name=f"message_{message_id}",
|
|
|
+ name=TraceTaskName.MESSAGE_TRACE.value,
|
|
|
input={
|
|
|
"message": trace_info.inputs,
|
|
|
"files": file_list,
|
|
@@ -258,7 +259,6 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
|
|
|
# start add span
|
|
|
generation_usage = GenerationUsage(
|
|
|
- totalTokens=trace_info.total_tokens,
|
|
|
input=trace_info.message_tokens,
|
|
|
output=trace_info.answer_tokens,
|
|
|
total=trace_info.total_tokens,
|
|
@@ -267,7 +267,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
)
|
|
|
|
|
|
langfuse_generation_data = LangfuseGeneration(
|
|
|
- name=f"generation_{message_id}",
|
|
|
+ name="llm",
|
|
|
trace_id=message_id,
|
|
|
start_time=trace_info.start_time,
|
|
|
end_time=trace_info.end_time,
|
|
@@ -275,7 +275,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
input=trace_info.inputs,
|
|
|
output=message_data.answer,
|
|
|
metadata=metadata,
|
|
|
- level=LevelEnum.DEFAULT if message_data.status != 'error' else LevelEnum.ERROR,
|
|
|
+ level=(LevelEnum.DEFAULT if message_data.status != "error" else LevelEnum.ERROR),
|
|
|
status_message=message_data.error if message_data.error else "",
|
|
|
usage=generation_usage,
|
|
|
)
|
|
@@ -284,7 +284,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
|
|
|
def moderation_trace(self, trace_info: ModerationTraceInfo):
|
|
|
span_data = LangfuseSpan(
|
|
|
- name="moderation",
|
|
|
+ name=TraceTaskName.MODERATION_TRACE.value,
|
|
|
input=trace_info.inputs,
|
|
|
output={
|
|
|
"action": trace_info.action,
|
|
@@ -303,22 +303,21 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
def suggested_question_trace(self, trace_info: SuggestedQuestionTraceInfo):
|
|
|
message_data = trace_info.message_data
|
|
|
generation_usage = GenerationUsage(
|
|
|
- totalTokens=len(str(trace_info.suggested_question)),
|
|
|
+ total=len(str(trace_info.suggested_question)),
|
|
|
input=len(trace_info.inputs),
|
|
|
output=len(trace_info.suggested_question),
|
|
|
- total=len(trace_info.suggested_question),
|
|
|
unit=UnitEnum.CHARACTERS,
|
|
|
)
|
|
|
|
|
|
generation_data = LangfuseGeneration(
|
|
|
- name="suggested_question",
|
|
|
+ name=TraceTaskName.SUGGESTED_QUESTION_TRACE.value,
|
|
|
input=trace_info.inputs,
|
|
|
output=str(trace_info.suggested_question),
|
|
|
trace_id=trace_info.message_id,
|
|
|
start_time=trace_info.start_time,
|
|
|
end_time=trace_info.end_time,
|
|
|
metadata=trace_info.metadata,
|
|
|
- level=LevelEnum.DEFAULT if message_data.status != 'error' else LevelEnum.ERROR,
|
|
|
+ level=(LevelEnum.DEFAULT if message_data.status != "error" else LevelEnum.ERROR),
|
|
|
status_message=message_data.error if message_data.error else "",
|
|
|
usage=generation_usage,
|
|
|
)
|
|
@@ -327,7 +326,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
|
|
|
def dataset_retrieval_trace(self, trace_info: DatasetRetrievalTraceInfo):
|
|
|
dataset_retrieval_span_data = LangfuseSpan(
|
|
|
- name="dataset_retrieval",
|
|
|
+ name=TraceTaskName.DATASET_RETRIEVAL_TRACE.value,
|
|
|
input=trace_info.inputs,
|
|
|
output={"documents": trace_info.documents},
|
|
|
trace_id=trace_info.message_id,
|
|
@@ -347,7 +346,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
start_time=trace_info.start_time,
|
|
|
end_time=trace_info.end_time,
|
|
|
metadata=trace_info.metadata,
|
|
|
- level=LevelEnum.DEFAULT if trace_info.error == "" or trace_info.error is None else LevelEnum.ERROR,
|
|
|
+ level=(LevelEnum.DEFAULT if trace_info.error == "" or trace_info.error is None else LevelEnum.ERROR),
|
|
|
status_message=trace_info.error,
|
|
|
)
|
|
|
|
|
@@ -355,7 +354,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
|
|
|
def generate_name_trace(self, trace_info: GenerateNameTraceInfo):
|
|
|
name_generation_trace_data = LangfuseTrace(
|
|
|
- name="generate_name",
|
|
|
+ name=TraceTaskName.GENERATE_NAME_TRACE.value,
|
|
|
input=trace_info.inputs,
|
|
|
output=trace_info.outputs,
|
|
|
user_id=trace_info.tenant_id,
|
|
@@ -366,7 +365,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
self.add_trace(langfuse_trace_data=name_generation_trace_data)
|
|
|
|
|
|
name_generation_span_data = LangfuseSpan(
|
|
|
- name="generate_name",
|
|
|
+ name=TraceTaskName.GENERATE_NAME_TRACE.value,
|
|
|
input=trace_info.inputs,
|
|
|
output=trace_info.outputs,
|
|
|
trace_id=trace_info.conversation_id,
|
|
@@ -377,9 +376,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
self.add_span(langfuse_span_data=name_generation_span_data)
|
|
|
|
|
|
def add_trace(self, langfuse_trace_data: Optional[LangfuseTrace] = None):
|
|
|
- format_trace_data = (
|
|
|
- filter_none_values(langfuse_trace_data.model_dump()) if langfuse_trace_data else {}
|
|
|
- )
|
|
|
+ format_trace_data = filter_none_values(langfuse_trace_data.model_dump()) if langfuse_trace_data else {}
|
|
|
try:
|
|
|
self.langfuse_client.trace(**format_trace_data)
|
|
|
logger.debug("LangFuse Trace created successfully")
|
|
@@ -387,9 +384,7 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
raise ValueError(f"LangFuse Failed to create trace: {str(e)}")
|
|
|
|
|
|
def add_span(self, langfuse_span_data: Optional[LangfuseSpan] = None):
|
|
|
- format_span_data = (
|
|
|
- filter_none_values(langfuse_span_data.model_dump()) if langfuse_span_data else {}
|
|
|
- )
|
|
|
+ format_span_data = filter_none_values(langfuse_span_data.model_dump()) if langfuse_span_data else {}
|
|
|
try:
|
|
|
self.langfuse_client.span(**format_span_data)
|
|
|
logger.debug("LangFuse Span created successfully")
|
|
@@ -397,19 +392,13 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
raise ValueError(f"LangFuse Failed to create span: {str(e)}")
|
|
|
|
|
|
def update_span(self, span, langfuse_span_data: Optional[LangfuseSpan] = None):
|
|
|
- format_span_data = (
|
|
|
- filter_none_values(langfuse_span_data.model_dump()) if langfuse_span_data else {}
|
|
|
- )
|
|
|
+ format_span_data = filter_none_values(langfuse_span_data.model_dump()) if langfuse_span_data else {}
|
|
|
|
|
|
span.end(**format_span_data)
|
|
|
|
|
|
- def add_generation(
|
|
|
- self, langfuse_generation_data: Optional[LangfuseGeneration] = None
|
|
|
- ):
|
|
|
+ def add_generation(self, langfuse_generation_data: Optional[LangfuseGeneration] = None):
|
|
|
format_generation_data = (
|
|
|
- filter_none_values(langfuse_generation_data.model_dump())
|
|
|
- if langfuse_generation_data
|
|
|
- else {}
|
|
|
+ filter_none_values(langfuse_generation_data.model_dump()) if langfuse_generation_data else {}
|
|
|
)
|
|
|
try:
|
|
|
self.langfuse_client.generation(**format_generation_data)
|
|
@@ -417,13 +406,9 @@ class LangFuseDataTrace(BaseTraceInstance):
|
|
|
except Exception as e:
|
|
|
raise ValueError(f"LangFuse Failed to create generation: {str(e)}")
|
|
|
|
|
|
- def update_generation(
|
|
|
- self, generation, langfuse_generation_data: Optional[LangfuseGeneration] = None
|
|
|
- ):
|
|
|
+ def update_generation(self, generation, langfuse_generation_data: Optional[LangfuseGeneration] = None):
|
|
|
format_generation_data = (
|
|
|
- filter_none_values(langfuse_generation_data.model_dump())
|
|
|
- if langfuse_generation_data
|
|
|
- else {}
|
|
|
+ filter_none_values(langfuse_generation_data.model_dump()) if langfuse_generation_data else {}
|
|
|
)
|
|
|
|
|
|
generation.end(**format_generation_data)
|