trace_entity.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from datetime import datetime
  2. from enum import Enum
  3. from typing import Any, Optional, Union
  4. from pydantic import BaseModel, ConfigDict, field_validator
  5. class BaseTraceInfo(BaseModel):
  6. message_id: Optional[str] = None
  7. message_data: Optional[Any] = None
  8. inputs: Optional[Union[str, dict[str, Any], list]] = None
  9. outputs: Optional[Union[str, dict[str, Any], list]] = None
  10. start_time: Optional[datetime] = None
  11. end_time: Optional[datetime] = None
  12. metadata: dict[str, Any]
  13. @field_validator("inputs", "outputs")
  14. @classmethod
  15. def ensure_type(cls, v):
  16. if v is None:
  17. return None
  18. if isinstance(v, str | dict | list):
  19. return v
  20. return ""
  21. class Config:
  22. json_encoders = {
  23. datetime: lambda v: v.isoformat(),
  24. }
  25. class WorkflowTraceInfo(BaseTraceInfo):
  26. workflow_data: Any
  27. conversation_id: Optional[str] = None
  28. workflow_app_log_id: Optional[str] = None
  29. workflow_id: str
  30. tenant_id: str
  31. workflow_run_id: str
  32. workflow_run_elapsed_time: Union[int, float]
  33. workflow_run_status: str
  34. workflow_run_inputs: dict[str, Any]
  35. workflow_run_outputs: dict[str, Any]
  36. workflow_run_version: str
  37. error: Optional[str] = None
  38. total_tokens: int
  39. file_list: list[str]
  40. query: str
  41. metadata: dict[str, Any]
  42. class MessageTraceInfo(BaseTraceInfo):
  43. conversation_model: str
  44. message_tokens: int
  45. answer_tokens: int
  46. total_tokens: int
  47. error: Optional[str] = None
  48. file_list: Optional[Union[str, dict[str, Any], list]] = None
  49. message_file_data: Optional[Any] = None
  50. conversation_mode: str
  51. class ModerationTraceInfo(BaseTraceInfo):
  52. flagged: bool
  53. action: str
  54. preset_response: str
  55. query: str
  56. class SuggestedQuestionTraceInfo(BaseTraceInfo):
  57. total_tokens: int
  58. status: Optional[str] = None
  59. error: Optional[str] = None
  60. from_account_id: Optional[str] = None
  61. agent_based: Optional[bool] = None
  62. from_source: Optional[str] = None
  63. model_provider: Optional[str] = None
  64. model_id: Optional[str] = None
  65. suggested_question: list[str]
  66. level: str
  67. status_message: Optional[str] = None
  68. workflow_run_id: Optional[str] = None
  69. model_config = ConfigDict(protected_namespaces=())
  70. class DatasetRetrievalTraceInfo(BaseTraceInfo):
  71. documents: Any
  72. class ToolTraceInfo(BaseTraceInfo):
  73. tool_name: str
  74. tool_inputs: dict[str, Any]
  75. tool_outputs: str
  76. metadata: dict[str, Any]
  77. message_file_data: Any
  78. error: Optional[str] = None
  79. tool_config: dict[str, Any]
  80. time_cost: Union[int, float]
  81. tool_parameters: dict[str, Any]
  82. file_url: Union[str, None, list]
  83. class GenerateNameTraceInfo(BaseTraceInfo):
  84. conversation_id: Optional[str] = None
  85. tenant_id: str
  86. class TaskData(BaseModel):
  87. app_id: str
  88. trace_info_type: str
  89. trace_info: Any
  90. trace_info_info_map = {
  91. "WorkflowTraceInfo": WorkflowTraceInfo,
  92. "MessageTraceInfo": MessageTraceInfo,
  93. "ModerationTraceInfo": ModerationTraceInfo,
  94. "SuggestedQuestionTraceInfo": SuggestedQuestionTraceInfo,
  95. "DatasetRetrievalTraceInfo": DatasetRetrievalTraceInfo,
  96. "ToolTraceInfo": ToolTraceInfo,
  97. "GenerateNameTraceInfo": GenerateNameTraceInfo,
  98. }
  99. class TraceTaskName(str, Enum):
  100. CONVERSATION_TRACE = "conversation"
  101. WORKFLOW_TRACE = "workflow"
  102. MESSAGE_TRACE = "message"
  103. MODERATION_TRACE = "moderation"
  104. SUGGESTED_QUESTION_TRACE = "suggested_question"
  105. DATASET_RETRIEVAL_TRACE = "dataset_retrieval"
  106. TOOL_TRACE = "tool"
  107. GENERATE_NAME_TRACE = "generate_conversation_name"