您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

config_entity.py 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. from enum import StrEnum
  2. from pydantic import BaseModel, ValidationInfo, field_validator
  3. from core.ops.utils import validate_project_name, validate_url, validate_url_with_path
  4. class TracingProviderEnum(StrEnum):
  5. ARIZE = "arize"
  6. PHOENIX = "phoenix"
  7. LANGFUSE = "langfuse"
  8. LANGSMITH = "langsmith"
  9. OPIK = "opik"
  10. WEAVE = "weave"
  11. ALIYUN = "aliyun"
  12. class BaseTracingConfig(BaseModel):
  13. """
  14. Base model class for tracing configurations
  15. """
  16. @classmethod
  17. def validate_endpoint_url(cls, v: str, default_url: str) -> str:
  18. """
  19. Common endpoint URL validation logic
  20. Args:
  21. v: URL value to validate
  22. default_url: Default URL to use if input is None or empty
  23. Returns:
  24. Validated and normalized URL
  25. """
  26. return validate_url(v, default_url)
  27. @classmethod
  28. def validate_project_field(cls, v: str, default_name: str) -> str:
  29. """
  30. Common project name validation logic
  31. Args:
  32. v: Project name to validate
  33. default_name: Default name to use if input is None or empty
  34. Returns:
  35. Validated project name
  36. """
  37. return validate_project_name(v, default_name)
  38. class ArizeConfig(BaseTracingConfig):
  39. """
  40. Model class for Arize tracing config.
  41. """
  42. api_key: str | None = None
  43. space_id: str | None = None
  44. project: str | None = None
  45. endpoint: str = "https://otlp.arize.com"
  46. @field_validator("project")
  47. @classmethod
  48. def project_validator(cls, v, info: ValidationInfo):
  49. return cls.validate_project_field(v, "default")
  50. @field_validator("endpoint")
  51. @classmethod
  52. def endpoint_validator(cls, v, info: ValidationInfo):
  53. return cls.validate_endpoint_url(v, "https://otlp.arize.com")
  54. class PhoenixConfig(BaseTracingConfig):
  55. """
  56. Model class for Phoenix tracing config.
  57. """
  58. api_key: str | None = None
  59. project: str | None = None
  60. endpoint: str = "https://app.phoenix.arize.com"
  61. @field_validator("project")
  62. @classmethod
  63. def project_validator(cls, v, info: ValidationInfo):
  64. return cls.validate_project_field(v, "default")
  65. @field_validator("endpoint")
  66. @classmethod
  67. def endpoint_validator(cls, v, info: ValidationInfo):
  68. return cls.validate_endpoint_url(v, "https://app.phoenix.arize.com")
  69. class LangfuseConfig(BaseTracingConfig):
  70. """
  71. Model class for Langfuse tracing config.
  72. """
  73. public_key: str
  74. secret_key: str
  75. host: str = "https://api.langfuse.com"
  76. @field_validator("host")
  77. @classmethod
  78. def host_validator(cls, v, info: ValidationInfo):
  79. return validate_url_with_path(v, "https://api.langfuse.com")
  80. class LangSmithConfig(BaseTracingConfig):
  81. """
  82. Model class for Langsmith tracing config.
  83. """
  84. api_key: str
  85. project: str
  86. endpoint: str = "https://api.smith.langchain.com"
  87. @field_validator("endpoint")
  88. @classmethod
  89. def endpoint_validator(cls, v, info: ValidationInfo):
  90. # LangSmith only allows HTTPS
  91. return validate_url(v, "https://api.smith.langchain.com", allowed_schemes=("https",))
  92. class OpikConfig(BaseTracingConfig):
  93. """
  94. Model class for Opik tracing config.
  95. """
  96. api_key: str | None = None
  97. project: str | None = None
  98. workspace: str | None = None
  99. url: str = "https://www.comet.com/opik/api/"
  100. @field_validator("project")
  101. @classmethod
  102. def project_validator(cls, v, info: ValidationInfo):
  103. return cls.validate_project_field(v, "Default Project")
  104. @field_validator("url")
  105. @classmethod
  106. def url_validator(cls, v, info: ValidationInfo):
  107. return validate_url_with_path(v, "https://www.comet.com/opik/api/", required_suffix="/api/")
  108. class WeaveConfig(BaseTracingConfig):
  109. """
  110. Model class for Weave tracing config.
  111. """
  112. api_key: str
  113. entity: str | None = None
  114. project: str
  115. endpoint: str = "https://trace.wandb.ai"
  116. host: str | None = None
  117. @field_validator("endpoint")
  118. @classmethod
  119. def endpoint_validator(cls, v, info: ValidationInfo):
  120. # Weave only allows HTTPS for endpoint
  121. return validate_url(v, "https://trace.wandb.ai", allowed_schemes=("https",))
  122. @field_validator("host")
  123. @classmethod
  124. def host_validator(cls, v, info: ValidationInfo):
  125. if v is not None and v.strip() != "":
  126. return validate_url(v, v, allowed_schemes=("https", "http"))
  127. return v
  128. class AliyunConfig(BaseTracingConfig):
  129. """
  130. Model class for Aliyun tracing config.
  131. """
  132. app_name: str = "dify_app"
  133. license_key: str
  134. endpoint: str
  135. @field_validator("app_name")
  136. @classmethod
  137. def app_name_validator(cls, v, info: ValidationInfo):
  138. return cls.validate_project_field(v, "dify_app")
  139. @field_validator("license_key")
  140. @classmethod
  141. def license_key_validator(cls, v, info: ValidationInfo):
  142. if not v or v.strip() == "":
  143. raise ValueError("License key cannot be empty")
  144. return v
  145. @field_validator("endpoint")
  146. @classmethod
  147. def endpoint_validator(cls, v, info: ValidationInfo):
  148. return cls.validate_endpoint_url(v, "https://tracing-analysis-dc-hz.aliyuncs.com")
  149. OPS_FILE_PATH = "ops_trace/"
  150. OPS_TRACE_FAILED_KEY = "FAILED_OPS_TRACE"