entities.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. from collections.abc import Sequence
  2. from enum import Enum, StrEnum
  3. from typing import Any, Literal, Optional
  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: Optional[str] = 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: Optional[RolePrefixEntity] = None
  41. class PromptTemplateEntity(BaseModel):
  42. """
  43. Prompt Template Entity.
  44. """
  45. class PromptType(Enum):
  46. """
  47. Prompt Type.
  48. 'simple', 'advanced'
  49. """
  50. SIMPLE = "simple"
  51. ADVANCED = "advanced"
  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: Optional[str] = None
  65. advanced_chat_prompt_template: Optional[AdvancedChatPromptTemplateEntity] = None
  66. advanced_completion_prompt_template: Optional[AdvancedCompletionPromptTemplateEntity] = 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. class VariableEntity(BaseModel):
  76. """
  77. Variable Entity.
  78. """
  79. variable: str
  80. label: str
  81. description: str = ""
  82. type: VariableEntityType
  83. required: bool = False
  84. max_length: Optional[int] = None
  85. options: Sequence[str] = Field(default_factory=list)
  86. allowed_file_types: Sequence[FileType] = Field(default_factory=list)
  87. allowed_file_extensions: Sequence[str] = Field(default_factory=list)
  88. allowed_file_upload_methods: Sequence[FileTransferMethod] = Field(default_factory=list)
  89. @field_validator("description", mode="before")
  90. @classmethod
  91. def convert_none_description(cls, v: Any) -> str:
  92. return v or ""
  93. @field_validator("options", mode="before")
  94. @classmethod
  95. def convert_none_options(cls, v: Any) -> Sequence[str]:
  96. return v or []
  97. class ExternalDataVariableEntity(BaseModel):
  98. """
  99. External Data Variable Entity.
  100. """
  101. variable: str
  102. type: str
  103. config: dict[str, Any] = Field(default_factory=dict)
  104. SupportedComparisonOperator = Literal[
  105. # for string or array
  106. "contains",
  107. "not contains",
  108. "start with",
  109. "end with",
  110. "is",
  111. "is not",
  112. "empty",
  113. "not empty",
  114. # for number
  115. "=",
  116. "≠",
  117. ">",
  118. "<",
  119. "≥",
  120. "≤",
  121. # for time
  122. "before",
  123. "after",
  124. ]
  125. class ModelConfig(BaseModel):
  126. provider: str
  127. name: str
  128. mode: LLMMode
  129. completion_params: dict[str, Any] = {}
  130. class Condition(BaseModel):
  131. """
  132. Conditon detail
  133. """
  134. name: str
  135. comparison_operator: SupportedComparisonOperator
  136. value: str | Sequence[str] | None | int | float = None
  137. class MetadataFilteringCondition(BaseModel):
  138. """
  139. Metadata Filtering Condition.
  140. """
  141. logical_operator: Optional[Literal["and", "or"]] = "and"
  142. conditions: Optional[list[Condition]] = Field(default=None, deprecated=True)
  143. class DatasetRetrieveConfigEntity(BaseModel):
  144. """
  145. Dataset Retrieve Config Entity.
  146. """
  147. class RetrieveStrategy(Enum):
  148. """
  149. Dataset Retrieve Strategy.
  150. 'single' or 'multiple'
  151. """
  152. SINGLE = "single"
  153. MULTIPLE = "multiple"
  154. @classmethod
  155. def value_of(cls, value: str):
  156. """
  157. Get value of given mode.
  158. :param value: mode value
  159. :return: mode
  160. """
  161. for mode in cls:
  162. if mode.value == value:
  163. return mode
  164. raise ValueError(f"invalid retrieve strategy value {value}")
  165. query_variable: Optional[str] = None # Only when app mode is completion
  166. retrieve_strategy: RetrieveStrategy
  167. top_k: Optional[int] = None
  168. score_threshold: Optional[float] = 0.0
  169. rerank_mode: Optional[str] = "reranking_model"
  170. reranking_model: Optional[dict] = None
  171. weights: Optional[dict] = None
  172. reranking_enabled: Optional[bool] = True
  173. metadata_filtering_mode: Optional[Literal["disabled", "automatic", "manual"]] = "disabled"
  174. metadata_model_config: Optional[ModelConfig] = None
  175. metadata_filtering_conditions: Optional[MetadataFilteringCondition] = None
  176. class DatasetEntity(BaseModel):
  177. """
  178. Dataset Config Entity.
  179. """
  180. dataset_ids: list[str]
  181. retrieve_config: DatasetRetrieveConfigEntity
  182. class SensitiveWordAvoidanceEntity(BaseModel):
  183. """
  184. Sensitive Word Avoidance Entity.
  185. """
  186. type: str
  187. config: dict[str, Any] = Field(default_factory=dict)
  188. class TextToSpeechEntity(BaseModel):
  189. """
  190. Sensitive Word Avoidance Entity.
  191. """
  192. enabled: bool
  193. voice: Optional[str] = None
  194. language: Optional[str] = None
  195. class TracingConfigEntity(BaseModel):
  196. """
  197. Tracing Config Entity.
  198. """
  199. enabled: bool
  200. tracing_provider: str
  201. class AppAdditionalFeatures(BaseModel):
  202. file_upload: Optional[FileUploadConfig] = None
  203. opening_statement: Optional[str] = None
  204. suggested_questions: list[str] = []
  205. suggested_questions_after_answer: bool = False
  206. show_retrieve_source: bool = False
  207. more_like_this: bool = False
  208. speech_to_text: bool = False
  209. text_to_speech: Optional[TextToSpeechEntity] = None
  210. trace_config: Optional[TracingConfigEntity] = None
  211. class AppConfig(BaseModel):
  212. """
  213. Application Config Entity.
  214. """
  215. tenant_id: str
  216. app_id: str
  217. app_mode: AppMode
  218. additional_features: AppAdditionalFeatures
  219. variables: list[VariableEntity] = []
  220. sensitive_word_avoidance: Optional[SensitiveWordAvoidanceEntity] = None
  221. class EasyUIBasedAppModelConfigFrom(Enum):
  222. """
  223. App Model Config From.
  224. """
  225. ARGS = "args"
  226. APP_LATEST_CONFIG = "app-latest-config"
  227. CONVERSATION_SPECIFIC_CONFIG = "conversation-specific-config"
  228. class EasyUIBasedAppConfig(AppConfig):
  229. """
  230. Easy UI Based App Config Entity.
  231. """
  232. app_model_config_from: EasyUIBasedAppModelConfigFrom
  233. app_model_config_id: str
  234. app_model_config_dict: dict
  235. model: ModelConfigEntity
  236. prompt_template: PromptTemplateEntity
  237. dataset: Optional[DatasetEntity] = None
  238. external_data_variables: list[ExternalDataVariableEntity] = []
  239. class WorkflowUIBasedAppConfig(AppConfig):
  240. """
  241. Workflow UI Based App Config Entity.
  242. """
  243. workflow_id: str