| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | 
							- import json
 - from typing import Any
 - 
 - from opentelemetry.trace import Link, Status, StatusCode
 - 
 - from core.ops.aliyun_trace.entities.semconv import (
 -     GEN_AI_FRAMEWORK,
 -     GEN_AI_SESSION_ID,
 -     GEN_AI_SPAN_KIND,
 -     GEN_AI_USER_ID,
 -     INPUT_VALUE,
 -     OUTPUT_VALUE,
 -     GenAISpanKind,
 - )
 - from core.rag.models.document import Document
 - from core.workflow.entities import WorkflowNodeExecution
 - from core.workflow.enums import WorkflowNodeExecutionStatus
 - from extensions.ext_database import db
 - from models import EndUser
 - 
 - # Constants
 - DEFAULT_JSON_ENSURE_ASCII = False
 - DEFAULT_FRAMEWORK_NAME = "dify"
 - 
 - 
 - def get_user_id_from_message_data(message_data) -> str:
 -     user_id = message_data.from_account_id
 -     if message_data.from_end_user_id:
 -         end_user_data: EndUser | None = (
 -             db.session.query(EndUser).where(EndUser.id == message_data.from_end_user_id).first()
 -         )
 -         if end_user_data is not None:
 -             user_id = end_user_data.session_id
 -     return user_id
 - 
 - 
 - def create_status_from_error(error: str | None) -> Status:
 -     if error:
 -         return Status(StatusCode.ERROR, error)
 -     return Status(StatusCode.OK)
 - 
 - 
 - def get_workflow_node_status(node_execution: WorkflowNodeExecution) -> Status:
 -     if node_execution.status == WorkflowNodeExecutionStatus.SUCCEEDED:
 -         return Status(StatusCode.OK)
 -     if node_execution.status in [WorkflowNodeExecutionStatus.FAILED, WorkflowNodeExecutionStatus.EXCEPTION]:
 -         return Status(StatusCode.ERROR, str(node_execution.error))
 -     return Status(StatusCode.UNSET)
 - 
 - 
 - def create_links_from_trace_id(trace_id: str | None) -> list[Link]:
 -     from core.ops.aliyun_trace.data_exporter.traceclient import create_link
 - 
 -     links = []
 -     if trace_id:
 -         links.append(create_link(trace_id_str=trace_id))
 -     return links
 - 
 - 
 - def extract_retrieval_documents(documents: list[Document]) -> list[dict[str, Any]]:
 -     documents_data = []
 -     for document in documents:
 -         document_data = {
 -             "content": document.page_content,
 -             "metadata": {
 -                 "dataset_id": document.metadata.get("dataset_id"),
 -                 "doc_id": document.metadata.get("doc_id"),
 -                 "document_id": document.metadata.get("document_id"),
 -             },
 -             "score": document.metadata.get("score"),
 -         }
 -         documents_data.append(document_data)
 -     return documents_data
 - 
 - 
 - def serialize_json_data(data: Any, ensure_ascii: bool = DEFAULT_JSON_ENSURE_ASCII) -> str:
 -     return json.dumps(data, ensure_ascii=ensure_ascii)
 - 
 - 
 - def create_common_span_attributes(
 -     session_id: str = "",
 -     user_id: str = "",
 -     span_kind: str = GenAISpanKind.CHAIN,
 -     framework: str = DEFAULT_FRAMEWORK_NAME,
 -     inputs: str = "",
 -     outputs: str = "",
 - ) -> dict[str, Any]:
 -     return {
 -         GEN_AI_SESSION_ID: session_id,
 -         GEN_AI_USER_ID: user_id,
 -         GEN_AI_SPAN_KIND: span_kind,
 -         GEN_AI_FRAMEWORK: framework,
 -         INPUT_VALUE: inputs,
 -         OUTPUT_VALUE: outputs,
 -     }
 
 
  |