entities.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. from collections.abc import Sequence
  2. from enum import Enum, StrEnum
  3. from typing import Any, Optional
  4. from pydantic import BaseModel, Field, field_validator
  5. from core.file import FileTransferMethod, FileType, FileUploadConfig
  6. from core.model_runtime.entities.message_entities import PromptMessageRole
  7. from models.model import AppMode
  8. class ModelConfigEntity(BaseModel):
  9. """
  10. Model Config Entity.
  11. """
  12. provider: str
  13. model: str
  14. mode: Optional[str] = None
  15. parameters: dict[str, Any] = Field(default_factory=dict)
  16. stop: list[str] = Field(default_factory=list)
  17. class AdvancedChatMessageEntity(BaseModel):
  18. """
  19. Advanced Chat Message Entity.
  20. """
  21. text: str
  22. role: PromptMessageRole
  23. class AdvancedChatPromptTemplateEntity(BaseModel):
  24. """
  25. Advanced Chat Prompt Template Entity.
  26. """
  27. messages: list[AdvancedChatMessageEntity]
  28. class AdvancedCompletionPromptTemplateEntity(BaseModel):
  29. """
  30. Advanced Completion Prompt Template Entity.
  31. """
  32. class RolePrefixEntity(BaseModel):
  33. """
  34. Role Prefix Entity.
  35. """
  36. user: str
  37. assistant: str
  38. prompt: str
  39. role_prefix: Optional[RolePrefixEntity] = None
  40. class PromptTemplateEntity(BaseModel):
  41. """
  42. Prompt Template Entity.
  43. """
  44. class PromptType(Enum):
  45. """
  46. Prompt Type.
  47. 'simple', 'advanced'
  48. """
  49. SIMPLE = "simple"
  50. ADVANCED = "advanced"
  51. @classmethod
  52. def value_of(cls, value: str):
  53. """
  54. Get value of given mode.
  55. :param value: mode value
  56. :return: mode
  57. """
  58. for mode in cls:
  59. if mode.value == value:
  60. return mode
  61. raise ValueError(f"invalid prompt type value {value}")
  62. prompt_type: PromptType
  63. simple_prompt_template: Optional[str] = None
  64. advanced_chat_prompt_template: Optional[AdvancedChatPromptTemplateEntity] = None
  65. advanced_completion_prompt_template: Optional[AdvancedCompletionPromptTemplateEntity] = None
  66. class VariableEntityType(StrEnum):
  67. TEXT_INPUT = "text-input"
  68. SELECT = "select"
  69. PARAGRAPH = "paragraph"
  70. NUMBER = "number"
  71. EXTERNAL_DATA_TOOL = "external_data_tool"
  72. FILE = "file"
  73. FILE_LIST = "file-list"
  74. class VariableEntity(BaseModel):
  75. """
  76. Variable Entity.
  77. """
  78. variable: str
  79. label: str
  80. description: str = ""
  81. type: VariableEntityType
  82. required: bool = False
  83. max_length: Optional[int] = None
  84. options: Sequence[str] = Field(default_factory=list)
  85. allowed_file_types: Sequence[FileType] = Field(default_factory=list)
  86. allowed_file_extensions: Sequence[str] = Field(default_factory=list)
  87. allowed_file_upload_methods: Sequence[FileTransferMethod] = Field(default_factory=list)
  88. @field_validator("description", mode="before")
  89. @classmethod
  90. def convert_none_description(cls, v: Any) -> str:
  91. return v or ""
  92. @field_validator("options", mode="before")
  93. @classmethod
  94. def convert_none_options(cls, v: Any) -> Sequence[str]:
  95. return v or []
  96. class ExternalDataVariableEntity(BaseModel):
  97. """
  98. External Data Variable Entity.
  99. """
  100. variable: str
  101. type: str
  102. config: dict[str, Any] = Field(default_factory=dict)
  103. class DatasetRetrieveConfigEntity(BaseModel):
  104. """
  105. Dataset Retrieve Config Entity.
  106. """
  107. class RetrieveStrategy(Enum):
  108. """
  109. Dataset Retrieve Strategy.
  110. 'single' or 'multiple'
  111. """
  112. SINGLE = "single"
  113. MULTIPLE = "multiple"
  114. @classmethod
  115. def value_of(cls, value: str):
  116. """
  117. Get value of given mode.
  118. :param value: mode value
  119. :return: mode
  120. """
  121. for mode in cls:
  122. if mode.value == value:
  123. return mode
  124. raise ValueError(f"invalid retrieve strategy value {value}")
  125. query_variable: Optional[str] = None # Only when app mode is completion
  126. retrieve_strategy: RetrieveStrategy
  127. top_k: Optional[int] = None
  128. score_threshold: Optional[float] = 0.0
  129. rerank_mode: Optional[str] = "reranking_model"
  130. reranking_model: Optional[dict] = None
  131. weights: Optional[dict] = None
  132. reranking_enabled: Optional[bool] = True
  133. class DatasetEntity(BaseModel):
  134. """
  135. Dataset Config Entity.
  136. """
  137. dataset_ids: list[str]
  138. retrieve_config: DatasetRetrieveConfigEntity
  139. class SensitiveWordAvoidanceEntity(BaseModel):
  140. """
  141. Sensitive Word Avoidance Entity.
  142. """
  143. type: str
  144. config: dict[str, Any] = Field(default_factory=dict)
  145. class TextToSpeechEntity(BaseModel):
  146. """
  147. Sensitive Word Avoidance Entity.
  148. """
  149. enabled: bool
  150. voice: Optional[str] = None
  151. language: Optional[str] = None
  152. class TracingConfigEntity(BaseModel):
  153. """
  154. Tracing Config Entity.
  155. """
  156. enabled: bool
  157. tracing_provider: str
  158. class AppAdditionalFeatures(BaseModel):
  159. file_upload: Optional[FileUploadConfig] = None
  160. opening_statement: Optional[str] = None
  161. suggested_questions: list[str] = []
  162. suggested_questions_after_answer: bool = False
  163. show_retrieve_source: bool = False
  164. more_like_this: bool = False
  165. speech_to_text: bool = False
  166. text_to_speech: Optional[TextToSpeechEntity] = None
  167. trace_config: Optional[TracingConfigEntity] = None
  168. class AppConfig(BaseModel):
  169. """
  170. Application Config Entity.
  171. """
  172. tenant_id: str
  173. app_id: str
  174. app_mode: AppMode
  175. additional_features: AppAdditionalFeatures
  176. variables: list[VariableEntity] = []
  177. sensitive_word_avoidance: Optional[SensitiveWordAvoidanceEntity] = None
  178. class EasyUIBasedAppModelConfigFrom(Enum):
  179. """
  180. App Model Config From.
  181. """
  182. ARGS = "args"
  183. APP_LATEST_CONFIG = "app-latest-config"
  184. CONVERSATION_SPECIFIC_CONFIG = "conversation-specific-config"
  185. class EasyUIBasedAppConfig(AppConfig):
  186. """
  187. Easy UI Based App Config Entity.
  188. """
  189. app_model_config_from: EasyUIBasedAppModelConfigFrom
  190. app_model_config_id: str
  191. app_model_config_dict: dict
  192. model: ModelConfigEntity
  193. prompt_template: PromptTemplateEntity
  194. dataset: Optional[DatasetEntity] = None
  195. external_data_variables: list[ExternalDataVariableEntity] = []
  196. class WorkflowUIBasedAppConfig(AppConfig):
  197. """
  198. Workflow UI Based App Config Entity.
  199. """
  200. workflow_id: str