trace_entity.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. else:
  21. return ""
  22. class WorkflowTraceInfo(BaseTraceInfo):
  23. workflow_data: Any
  24. conversation_id: Optional[str] = None
  25. workflow_app_log_id: Optional[str] = None
  26. workflow_id: str
  27. tenant_id: str
  28. workflow_run_id: str
  29. workflow_run_elapsed_time: Union[int, float]
  30. workflow_run_status: str
  31. workflow_run_inputs: dict[str, Any]
  32. workflow_run_outputs: dict[str, Any]
  33. workflow_run_version: str
  34. error: Optional[str] = None
  35. total_tokens: int
  36. file_list: list[str]
  37. query: str
  38. metadata: dict[str, Any]
  39. class MessageTraceInfo(BaseTraceInfo):
  40. conversation_model: str
  41. message_tokens: int
  42. answer_tokens: int
  43. total_tokens: int
  44. error: Optional[str] = None
  45. file_list: Optional[Union[str, dict[str, Any], list]] = None
  46. message_file_data: Optional[Any] = None
  47. conversation_mode: str
  48. class ModerationTraceInfo(BaseTraceInfo):
  49. flagged: bool
  50. action: str
  51. preset_response: str
  52. query: str
  53. class SuggestedQuestionTraceInfo(BaseTraceInfo):
  54. total_tokens: int
  55. status: Optional[str] = None
  56. error: Optional[str] = None
  57. from_account_id: Optional[str] = None
  58. agent_based: Optional[bool] = None
  59. from_source: Optional[str] = None
  60. model_provider: Optional[str] = None
  61. model_id: Optional[str] = None
  62. suggested_question: list[str]
  63. level: str
  64. status_message: Optional[str] = None
  65. workflow_run_id: Optional[str] = None
  66. model_config = ConfigDict(protected_namespaces=())
  67. class DatasetRetrievalTraceInfo(BaseTraceInfo):
  68. documents: Any
  69. class ToolTraceInfo(BaseTraceInfo):
  70. tool_name: str
  71. tool_inputs: dict[str, Any]
  72. tool_outputs: str
  73. metadata: dict[str, Any]
  74. message_file_data: Any
  75. error: Optional[str] = None
  76. tool_config: dict[str, Any]
  77. time_cost: Union[int, float]
  78. tool_parameters: dict[str, Any]
  79. file_url: Union[str, None, list]
  80. class GenerateNameTraceInfo(BaseTraceInfo):
  81. conversation_id: Optional[str] = None
  82. tenant_id: str
  83. trace_info_info_map = {
  84. "WorkflowTraceInfo": WorkflowTraceInfo,
  85. "MessageTraceInfo": MessageTraceInfo,
  86. "ModerationTraceInfo": ModerationTraceInfo,
  87. "SuggestedQuestionTraceInfo": SuggestedQuestionTraceInfo,
  88. "DatasetRetrievalTraceInfo": DatasetRetrievalTraceInfo,
  89. "ToolTraceInfo": ToolTraceInfo,
  90. "GenerateNameTraceInfo": GenerateNameTraceInfo,
  91. }
  92. class TraceTaskName(str, Enum):
  93. CONVERSATION_TRACE = "conversation"
  94. WORKFLOW_TRACE = "workflow"
  95. MESSAGE_TRACE = "message"
  96. MODERATION_TRACE = "moderation"
  97. SUGGESTED_QUESTION_TRACE = "suggested_question"
  98. DATASET_RETRIEVAL_TRACE = "dataset_retrieval"
  99. TOOL_TRACE = "tool"
  100. GENERATE_NAME_TRACE = "generate_conversation_name"