| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | from datetime import datetimefrom typing import Any, Optional, Unionfrom pydantic import BaseModel, ConfigDict, field_validatorclass BaseTraceInfo(BaseModel):    message_id: Optional[str] = None    message_data: Optional[Any] = None    inputs: Optional[Union[str, dict[str, Any], list]] = None    outputs: Optional[Union[str, dict[str, Any], list]] = None    start_time: Optional[datetime] = None    end_time: Optional[datetime] = None    metadata: dict[str, Any]    @field_validator("inputs", "outputs")    def ensure_type(cls, v):        if v is None:            return None        if isinstance(v, str | dict | list):            return v        else:            return ""class WorkflowTraceInfo(BaseTraceInfo):    workflow_data: Any    conversation_id: Optional[str] = None    workflow_app_log_id: Optional[str] = None    workflow_id: str    tenant_id: str    workflow_run_id: str    workflow_run_elapsed_time: Union[int, float]    workflow_run_status: str    workflow_run_inputs: dict[str, Any]    workflow_run_outputs: dict[str, Any]    workflow_run_version: str    error: Optional[str] = None    total_tokens: int    file_list: list[str]    query: str    metadata: dict[str, Any]class MessageTraceInfo(BaseTraceInfo):    conversation_model: str    message_tokens: int    answer_tokens: int    total_tokens: int    error: Optional[str] = None    file_list: Optional[Union[str, dict[str, Any], list]] = None    message_file_data: Optional[Any] = None    conversation_mode: strclass ModerationTraceInfo(BaseTraceInfo):    flagged: bool    action: str    preset_response: str    query: strclass SuggestedQuestionTraceInfo(BaseTraceInfo):    total_tokens: int    status: Optional[str] = None    error: Optional[str] = None    from_account_id: Optional[str] = None    agent_based: Optional[bool] = None    from_source: Optional[str] = None    model_provider: Optional[str] = None    model_id: Optional[str] = None    suggested_question: list[str]    level: str    status_message: Optional[str] = None    workflow_run_id: Optional[str] = None    model_config = ConfigDict(protected_namespaces=())class DatasetRetrievalTraceInfo(BaseTraceInfo):    documents: Anyclass ToolTraceInfo(BaseTraceInfo):    tool_name: str    tool_inputs: dict[str, Any]    tool_outputs: str    metadata: dict[str, Any]    message_file_data: Any    error: Optional[str] = None    tool_config: dict[str, Any]    time_cost: Union[int, float]    tool_parameters: dict[str, Any]    file_url: Union[str, None, list]class GenerateNameTraceInfo(BaseTraceInfo):    conversation_id: Optional[str] = None    tenant_id: strtrace_info_info_map = {    'WorkflowTraceInfo': WorkflowTraceInfo,    'MessageTraceInfo': MessageTraceInfo,    'ModerationTraceInfo': ModerationTraceInfo,    'SuggestedQuestionTraceInfo': SuggestedQuestionTraceInfo,    'DatasetRetrievalTraceInfo': DatasetRetrievalTraceInfo,    'ToolTraceInfo': ToolTraceInfo,    'GenerateNameTraceInfo': GenerateNameTraceInfo,}
 |