trace_entity.py 3.4 KB

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