mirror of
https://github.com/langgenius/dify.git
synced 2026-03-04 15:26:21 +08:00
136 lines
3.0 KiB
Python
136 lines
3.0 KiB
Python
from collections.abc import Sequence
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from dify_graph.nodes.base import BaseNodeData
|
|
from dify_graph.nodes.llm.entities import ModelConfig, VisionConfig
|
|
|
|
|
|
class RerankingModelConfig(BaseModel):
|
|
"""
|
|
Reranking Model Config.
|
|
"""
|
|
|
|
provider: str
|
|
model: str
|
|
|
|
|
|
class VectorSetting(BaseModel):
|
|
"""
|
|
Vector Setting.
|
|
"""
|
|
|
|
vector_weight: float
|
|
embedding_provider_name: str
|
|
embedding_model_name: str
|
|
|
|
|
|
class KeywordSetting(BaseModel):
|
|
"""
|
|
Keyword Setting.
|
|
"""
|
|
|
|
keyword_weight: float
|
|
|
|
|
|
class WeightedScoreConfig(BaseModel):
|
|
"""
|
|
Weighted score Config.
|
|
"""
|
|
|
|
vector_setting: VectorSetting
|
|
keyword_setting: KeywordSetting
|
|
|
|
|
|
class MultipleRetrievalConfig(BaseModel):
|
|
"""
|
|
Multiple Retrieval Config.
|
|
"""
|
|
|
|
top_k: int
|
|
score_threshold: float | None = None
|
|
reranking_mode: str = "reranking_model"
|
|
reranking_enable: bool = True
|
|
reranking_model: RerankingModelConfig | None = None
|
|
weights: WeightedScoreConfig | None = None
|
|
|
|
|
|
class SingleRetrievalConfig(BaseModel):
|
|
"""
|
|
Single Retrieval Config.
|
|
"""
|
|
|
|
model: ModelConfig
|
|
|
|
|
|
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 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 KnowledgeRetrievalNodeData(BaseNodeData):
|
|
"""
|
|
Knowledge retrieval Node Data.
|
|
"""
|
|
|
|
type: str = "knowledge-retrieval"
|
|
query_variable_selector: list[str] | None | str = None
|
|
query_attachment_selector: list[str] | None | str = None
|
|
dataset_ids: list[str]
|
|
retrieval_mode: Literal["single", "multiple"]
|
|
multiple_retrieval_config: MultipleRetrievalConfig | None = None
|
|
single_retrieval_config: SingleRetrievalConfig | None = None
|
|
metadata_filtering_mode: Literal["disabled", "automatic", "manual"] | None = "disabled"
|
|
metadata_model_config: ModelConfig | None = None
|
|
metadata_filtering_conditions: MetadataFilteringCondition | None = None
|
|
vision: VisionConfig = Field(default_factory=VisionConfig)
|
|
|
|
@property
|
|
def structured_output_enabled(self) -> bool:
|
|
# NOTE(QuantumGhost): Temporary workaround for issue #20725
|
|
# (https://github.com/langgenius/dify/issues/20725).
|
|
#
|
|
# The proper fix would be to make `KnowledgeRetrievalNode` inherit
|
|
# from `BaseNode` instead of `LLMNode`.
|
|
return False
|