mirror of
https://github.com/langgenius/dify.git
synced 2025-12-12 19:01:20 +00:00
Signed-off-by: -LAN- <laipz8200@outlook.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: QuantumGhost <obelisk.reg+git@gmail.com> Co-authored-by: lyzno1 <yuanyouhuilyz@gmail.com> Co-authored-by: quicksand <quicksandzn@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: lyzno1 <92089059+lyzno1@users.noreply.github.com> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: Yongtao Huang <yongtaoh2022@gmail.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Hanqing Zhao <sherry9277@gmail.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Harry <xh001x@hotmail.com>
336 lines
7.7 KiB
Python
336 lines
7.7 KiB
Python
from collections.abc import Sequence
|
|
from enum import StrEnum, auto
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
from core.file import FileTransferMethod, FileType, FileUploadConfig
|
|
from core.model_runtime.entities.llm_entities import LLMMode
|
|
from core.model_runtime.entities.message_entities import PromptMessageRole
|
|
from models.model import AppMode
|
|
|
|
|
|
class ModelConfigEntity(BaseModel):
|
|
"""
|
|
Model Config Entity.
|
|
"""
|
|
|
|
provider: str
|
|
model: str
|
|
mode: str | None = None
|
|
parameters: dict[str, Any] = Field(default_factory=dict)
|
|
stop: list[str] = Field(default_factory=list)
|
|
|
|
|
|
class AdvancedChatMessageEntity(BaseModel):
|
|
"""
|
|
Advanced Chat Message Entity.
|
|
"""
|
|
|
|
text: str
|
|
role: PromptMessageRole
|
|
|
|
|
|
class AdvancedChatPromptTemplateEntity(BaseModel):
|
|
"""
|
|
Advanced Chat Prompt Template Entity.
|
|
"""
|
|
|
|
messages: list[AdvancedChatMessageEntity]
|
|
|
|
|
|
class AdvancedCompletionPromptTemplateEntity(BaseModel):
|
|
"""
|
|
Advanced Completion Prompt Template Entity.
|
|
"""
|
|
|
|
class RolePrefixEntity(BaseModel):
|
|
"""
|
|
Role Prefix Entity.
|
|
"""
|
|
|
|
user: str
|
|
assistant: str
|
|
|
|
prompt: str
|
|
role_prefix: RolePrefixEntity | None = None
|
|
|
|
|
|
class PromptTemplateEntity(BaseModel):
|
|
"""
|
|
Prompt Template Entity.
|
|
"""
|
|
|
|
class PromptType(StrEnum):
|
|
"""
|
|
Prompt Type.
|
|
'simple', 'advanced'
|
|
"""
|
|
|
|
SIMPLE = auto()
|
|
ADVANCED = auto()
|
|
|
|
@classmethod
|
|
def value_of(cls, value: str):
|
|
"""
|
|
Get value of given mode.
|
|
|
|
:param value: mode value
|
|
:return: mode
|
|
"""
|
|
for mode in cls:
|
|
if mode.value == value:
|
|
return mode
|
|
raise ValueError(f"invalid prompt type value {value}")
|
|
|
|
prompt_type: PromptType
|
|
simple_prompt_template: str | None = None
|
|
advanced_chat_prompt_template: AdvancedChatPromptTemplateEntity | None = None
|
|
advanced_completion_prompt_template: AdvancedCompletionPromptTemplateEntity | None = None
|
|
|
|
|
|
class VariableEntityType(StrEnum):
|
|
TEXT_INPUT = "text-input"
|
|
SELECT = "select"
|
|
PARAGRAPH = "paragraph"
|
|
NUMBER = "number"
|
|
EXTERNAL_DATA_TOOL = "external_data_tool"
|
|
FILE = "file"
|
|
FILE_LIST = "file-list"
|
|
CHECKBOX = "checkbox"
|
|
|
|
|
|
class VariableEntity(BaseModel):
|
|
"""
|
|
Variable Entity.
|
|
"""
|
|
|
|
# `variable` records the name of the variable in user inputs.
|
|
variable: str
|
|
label: str
|
|
description: str = ""
|
|
type: VariableEntityType
|
|
required: bool = False
|
|
hide: bool = False
|
|
max_length: int | None = None
|
|
options: Sequence[str] = Field(default_factory=list)
|
|
allowed_file_types: Sequence[FileType] | None = Field(default_factory=list)
|
|
allowed_file_extensions: Sequence[str] | None = Field(default_factory=list)
|
|
allowed_file_upload_methods: Sequence[FileTransferMethod] | None = Field(default_factory=list)
|
|
|
|
@field_validator("description", mode="before")
|
|
@classmethod
|
|
def convert_none_description(cls, v: Any) -> str:
|
|
return v or ""
|
|
|
|
@field_validator("options", mode="before")
|
|
@classmethod
|
|
def convert_none_options(cls, v: Any) -> Sequence[str]:
|
|
return v or []
|
|
|
|
|
|
class RagPipelineVariableEntity(VariableEntity):
|
|
"""
|
|
Rag Pipeline Variable Entity.
|
|
"""
|
|
|
|
tooltips: str | None = None
|
|
placeholder: str | None = None
|
|
belong_to_node_id: str
|
|
|
|
|
|
class ExternalDataVariableEntity(BaseModel):
|
|
"""
|
|
External Data Variable Entity.
|
|
"""
|
|
|
|
variable: str
|
|
type: str
|
|
config: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
SupportedComparisonOperator = Literal[
|
|
# for string or array
|
|
"contains",
|
|
"not contains",
|
|
"start with",
|
|
"end with",
|
|
"is",
|
|
"is not",
|
|
"empty",
|
|
"not empty",
|
|
"in",
|
|
"not in",
|
|
# for number
|
|
"=",
|
|
"≠",
|
|
">",
|
|
"<",
|
|
"≥",
|
|
"≤",
|
|
# for time
|
|
"before",
|
|
"after",
|
|
]
|
|
|
|
|
|
class ModelConfig(BaseModel):
|
|
provider: str
|
|
name: str
|
|
mode: LLMMode
|
|
completion_params: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
class Condition(BaseModel):
|
|
"""
|
|
Condition detail
|
|
"""
|
|
|
|
name: str
|
|
comparison_operator: SupportedComparisonOperator
|
|
value: str | Sequence[str] | None | int | float = None
|
|
|
|
|
|
class MetadataFilteringCondition(BaseModel):
|
|
"""
|
|
Metadata Filtering Condition.
|
|
"""
|
|
|
|
logical_operator: Literal["and", "or"] | None = "and"
|
|
conditions: list[Condition] | None = Field(default=None, deprecated=True)
|
|
|
|
|
|
class DatasetRetrieveConfigEntity(BaseModel):
|
|
"""
|
|
Dataset Retrieve Config Entity.
|
|
"""
|
|
|
|
class RetrieveStrategy(StrEnum):
|
|
"""
|
|
Dataset Retrieve Strategy.
|
|
'single' or 'multiple'
|
|
"""
|
|
|
|
SINGLE = auto()
|
|
MULTIPLE = auto()
|
|
|
|
@classmethod
|
|
def value_of(cls, value: str):
|
|
"""
|
|
Get value of given mode.
|
|
|
|
:param value: mode value
|
|
:return: mode
|
|
"""
|
|
for mode in cls:
|
|
if mode.value == value:
|
|
return mode
|
|
raise ValueError(f"invalid retrieve strategy value {value}")
|
|
|
|
query_variable: str | None = None # Only when app mode is completion
|
|
|
|
retrieve_strategy: RetrieveStrategy
|
|
top_k: int | None = None
|
|
score_threshold: float | None = 0.0
|
|
rerank_mode: str | None = "reranking_model"
|
|
reranking_model: dict | None = None
|
|
weights: dict | None = None
|
|
reranking_enabled: bool | None = True
|
|
metadata_filtering_mode: Literal["disabled", "automatic", "manual"] | None = "disabled"
|
|
metadata_model_config: ModelConfig | None = None
|
|
metadata_filtering_conditions: MetadataFilteringCondition | None = None
|
|
|
|
|
|
class DatasetEntity(BaseModel):
|
|
"""
|
|
Dataset Config Entity.
|
|
"""
|
|
|
|
dataset_ids: list[str]
|
|
retrieve_config: DatasetRetrieveConfigEntity
|
|
|
|
|
|
class SensitiveWordAvoidanceEntity(BaseModel):
|
|
"""
|
|
Sensitive Word Avoidance Entity.
|
|
"""
|
|
|
|
type: str
|
|
config: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
|
|
class TextToSpeechEntity(BaseModel):
|
|
"""
|
|
Sensitive Word Avoidance Entity.
|
|
"""
|
|
|
|
enabled: bool
|
|
voice: str | None = None
|
|
language: str | None = None
|
|
|
|
|
|
class TracingConfigEntity(BaseModel):
|
|
"""
|
|
Tracing Config Entity.
|
|
"""
|
|
|
|
enabled: bool
|
|
tracing_provider: str
|
|
|
|
|
|
class AppAdditionalFeatures(BaseModel):
|
|
file_upload: FileUploadConfig | None = None
|
|
opening_statement: str | None = None
|
|
suggested_questions: list[str] = []
|
|
suggested_questions_after_answer: bool = False
|
|
show_retrieve_source: bool = False
|
|
more_like_this: bool = False
|
|
speech_to_text: bool = False
|
|
text_to_speech: TextToSpeechEntity | None = None
|
|
trace_config: TracingConfigEntity | None = None
|
|
|
|
|
|
class AppConfig(BaseModel):
|
|
"""
|
|
Application Config Entity.
|
|
"""
|
|
|
|
tenant_id: str
|
|
app_id: str
|
|
app_mode: AppMode
|
|
additional_features: AppAdditionalFeatures | None = None
|
|
variables: list[VariableEntity] = []
|
|
sensitive_word_avoidance: SensitiveWordAvoidanceEntity | None = None
|
|
|
|
|
|
class EasyUIBasedAppModelConfigFrom(StrEnum):
|
|
"""
|
|
App Model Config From.
|
|
"""
|
|
|
|
ARGS = auto()
|
|
APP_LATEST_CONFIG = "app-latest-config"
|
|
CONVERSATION_SPECIFIC_CONFIG = "conversation-specific-config"
|
|
|
|
|
|
class EasyUIBasedAppConfig(AppConfig):
|
|
"""
|
|
Easy UI Based App Config Entity.
|
|
"""
|
|
|
|
app_model_config_from: EasyUIBasedAppModelConfigFrom
|
|
app_model_config_id: str
|
|
app_model_config_dict: dict
|
|
model: ModelConfigEntity
|
|
prompt_template: PromptTemplateEntity
|
|
dataset: DatasetEntity | None = None
|
|
external_data_variables: list[ExternalDataVariableEntity] = []
|
|
|
|
|
|
class WorkflowUIBasedAppConfig(AppConfig):
|
|
"""
|
|
Workflow UI Based App Config Entity.
|
|
"""
|
|
|
|
workflow_id: str
|