You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

entities.py 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. from collections.abc import Sequence
  2. from enum import StrEnum, auto
  3. from typing import Any, Literal
  4. from pydantic import BaseModel, Field, field_validator
  5. from core.file import FileTransferMethod, FileType, FileUploadConfig
  6. from core.model_runtime.entities.llm_entities import LLMMode
  7. from core.model_runtime.entities.message_entities import PromptMessageRole
  8. from models.model import AppMode
  9. class ModelConfigEntity(BaseModel):
  10. """
  11. Model Config Entity.
  12. """
  13. provider: str
  14. model: str
  15. mode: str | None = None
  16. parameters: dict[str, Any] = Field(default_factory=dict)
  17. stop: list[str] = Field(default_factory=list)
  18. class AdvancedChatMessageEntity(BaseModel):
  19. """
  20. Advanced Chat Message Entity.
  21. """
  22. text: str
  23. role: PromptMessageRole
  24. class AdvancedChatPromptTemplateEntity(BaseModel):
  25. """
  26. Advanced Chat Prompt Template Entity.
  27. """
  28. messages: list[AdvancedChatMessageEntity]
  29. class AdvancedCompletionPromptTemplateEntity(BaseModel):
  30. """
  31. Advanced Completion Prompt Template Entity.
  32. """
  33. class RolePrefixEntity(BaseModel):
  34. """
  35. Role Prefix Entity.
  36. """
  37. user: str
  38. assistant: str
  39. prompt: str
  40. role_prefix: RolePrefixEntity | None = None
  41. class PromptTemplateEntity(BaseModel):
  42. """
  43. Prompt Template Entity.
  44. """
  45. class PromptType(StrEnum):
  46. """
  47. Prompt Type.
  48. 'simple', 'advanced'
  49. """
  50. SIMPLE = auto()
  51. ADVANCED = auto()
  52. @classmethod
  53. def value_of(cls, value: str):
  54. """
  55. Get value of given mode.
  56. :param value: mode value
  57. :return: mode
  58. """
  59. for mode in cls:
  60. if mode.value == value:
  61. return mode
  62. raise ValueError(f"invalid prompt type value {value}")
  63. prompt_type: PromptType
  64. simple_prompt_template: str | None = None
  65. advanced_chat_prompt_template: AdvancedChatPromptTemplateEntity | None = None
  66. advanced_completion_prompt_template: AdvancedCompletionPromptTemplateEntity | None = None
  67. class VariableEntityType(StrEnum):
  68. TEXT_INPUT = "text-input"
  69. SELECT = "select"
  70. PARAGRAPH = "paragraph"
  71. NUMBER = "number"
  72. EXTERNAL_DATA_TOOL = "external_data_tool"
  73. FILE = "file"
  74. FILE_LIST = "file-list"
  75. CHECKBOX = "checkbox"
  76. class VariableEntity(BaseModel):
  77. """
  78. Variable Entity.
  79. """
  80. # `variable` records the name of the variable in user inputs.
  81. variable: str
  82. label: str
  83. description: str = ""
  84. type: VariableEntityType
  85. required: bool = False
  86. hide: bool = False
  87. max_length: int | None = None
  88. options: Sequence[str] = Field(default_factory=list)
  89. allowed_file_types: Sequence[FileType] | None = Field(default_factory=list)
  90. allowed_file_extensions: Sequence[str] | None = Field(default_factory=list)
  91. allowed_file_upload_methods: Sequence[FileTransferMethod] | None = Field(default_factory=list)
  92. @field_validator("description", mode="before")
  93. @classmethod
  94. def convert_none_description(cls, v: Any) -> str:
  95. return v or ""
  96. @field_validator("options", mode="before")
  97. @classmethod
  98. def convert_none_options(cls, v: Any) -> Sequence[str]:
  99. return v or []
  100. class RagPipelineVariableEntity(VariableEntity):
  101. """
  102. Rag Pipeline Variable Entity.
  103. """
  104. tooltips: str | None = None
  105. placeholder: str | None = None
  106. belong_to_node_id: str
  107. class ExternalDataVariableEntity(BaseModel):
  108. """
  109. External Data Variable Entity.
  110. """
  111. variable: str
  112. type: str
  113. config: dict[str, Any] = Field(default_factory=dict)
  114. SupportedComparisonOperator = Literal[
  115. # for string or array
  116. "contains",
  117. "not contains",
  118. "start with",
  119. "end with",
  120. "is",
  121. "is not",
  122. "empty",
  123. "not empty",
  124. "in",
  125. "not in",
  126. # for number
  127. "=",
  128. "≠",
  129. ">",
  130. "<",
  131. "≥",
  132. "≤",
  133. # for time
  134. "before",
  135. "after",
  136. ]
  137. class ModelConfig(BaseModel):
  138. provider: str
  139. name: str
  140. mode: LLMMode
  141. completion_params: dict[str, Any] = Field(default_factory=dict)
  142. class Condition(BaseModel):
  143. """
  144. Condition detail
  145. """
  146. name: str
  147. comparison_operator: SupportedComparisonOperator
  148. value: str | Sequence[str] | None | int | float = None
  149. class MetadataFilteringCondition(BaseModel):
  150. """
  151. Metadata Filtering Condition.
  152. """
  153. logical_operator: Literal["and", "or"] | None = "and"
  154. conditions: list[Condition] | None = Field(default=None, deprecated=True)
  155. class DatasetRetrieveConfigEntity(BaseModel):
  156. """
  157. Dataset Retrieve Config Entity.
  158. """
  159. class RetrieveStrategy(StrEnum):
  160. """
  161. Dataset Retrieve Strategy.
  162. 'single' or 'multiple'
  163. """
  164. SINGLE = auto()
  165. MULTIPLE = auto()
  166. @classmethod
  167. def value_of(cls, value: str):
  168. """
  169. Get value of given mode.
  170. :param value: mode value
  171. :return: mode
  172. """
  173. for mode in cls:
  174. if mode.value == value:
  175. return mode
  176. raise ValueError(f"invalid retrieve strategy value {value}")
  177. query_variable: str | None = None # Only when app mode is completion
  178. retrieve_strategy: RetrieveStrategy
  179. top_k: int | None = None
  180. score_threshold: float | None = 0.0
  181. rerank_mode: str | None = "reranking_model"
  182. reranking_model: dict | None = None
  183. weights: dict | None = None
  184. reranking_enabled: bool | None = True
  185. metadata_filtering_mode: Literal["disabled", "automatic", "manual"] | None = "disabled"
  186. metadata_model_config: ModelConfig | None = None
  187. metadata_filtering_conditions: MetadataFilteringCondition | None = None
  188. class DatasetEntity(BaseModel):
  189. """
  190. Dataset Config Entity.
  191. """
  192. dataset_ids: list[str]
  193. retrieve_config: DatasetRetrieveConfigEntity
  194. class SensitiveWordAvoidanceEntity(BaseModel):
  195. """
  196. Sensitive Word Avoidance Entity.
  197. """
  198. type: str
  199. config: dict[str, Any] = Field(default_factory=dict)
  200. class TextToSpeechEntity(BaseModel):
  201. """
  202. Sensitive Word Avoidance Entity.
  203. """
  204. enabled: bool
  205. voice: str | None = None
  206. language: str | None = None
  207. class TracingConfigEntity(BaseModel):
  208. """
  209. Tracing Config Entity.
  210. """
  211. enabled: bool
  212. tracing_provider: str
  213. class AppAdditionalFeatures(BaseModel):
  214. file_upload: FileUploadConfig | None = None
  215. opening_statement: str | None = None
  216. suggested_questions: list[str] = []
  217. suggested_questions_after_answer: bool = False
  218. show_retrieve_source: bool = False
  219. more_like_this: bool = False
  220. speech_to_text: bool = False
  221. text_to_speech: TextToSpeechEntity | None = None
  222. trace_config: TracingConfigEntity | None = None
  223. class AppConfig(BaseModel):
  224. """
  225. Application Config Entity.
  226. """
  227. tenant_id: str
  228. app_id: str
  229. app_mode: AppMode
  230. additional_features: AppAdditionalFeatures | None = None
  231. variables: list[VariableEntity] = []
  232. sensitive_word_avoidance: SensitiveWordAvoidanceEntity | None = None
  233. class EasyUIBasedAppModelConfigFrom(StrEnum):
  234. """
  235. App Model Config From.
  236. """
  237. ARGS = auto()
  238. APP_LATEST_CONFIG = "app-latest-config"
  239. CONVERSATION_SPECIFIC_CONFIG = "conversation-specific-config"
  240. class EasyUIBasedAppConfig(AppConfig):
  241. """
  242. Easy UI Based App Config Entity.
  243. """
  244. app_model_config_from: EasyUIBasedAppModelConfigFrom
  245. app_model_config_id: str
  246. app_model_config_dict: dict
  247. model: ModelConfigEntity
  248. prompt_template: PromptTemplateEntity
  249. dataset: DatasetEntity | None = None
  250. external_data_variables: list[ExternalDataVariableEntity] = []
  251. class WorkflowUIBasedAppConfig(AppConfig):
  252. """
  253. Workflow UI Based App Config Entity.
  254. """
  255. workflow_id: str