The `QuestionClassifierNode` class extends `LLMNode`, meaning that, per the Liskov Substitution Principle, `QuestionClassifierNodeData` **SHOULD** be compatible in contexts where `LLMNodeData` is expected. However, the absence of the `structured_output_enabled` attribute violates this principle, causing `QuestionClassifierNode` to fail during execution. This commit implements a quick and temporary workaround. A proper resolution would involve refactoring to decouple `QuestionClassifierNode` from `LLMNode` to address the underlying design issue. Fixes #20725.tags/1.4.2
| metadata_model_config: Optional[ModelConfig] = None | metadata_model_config: Optional[ModelConfig] = None | ||||
| metadata_filtering_conditions: Optional[MetadataFilteringCondition] = None | metadata_filtering_conditions: Optional[MetadataFilteringCondition] = None | ||||
| vision: VisionConfig = Field(default_factory=VisionConfig) | 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 |
| instruction: Optional[str] = None | instruction: Optional[str] = None | ||||
| memory: Optional[MemoryConfig] = None | memory: Optional[MemoryConfig] = None | ||||
| vision: VisionConfig = Field(default_factory=VisionConfig) | 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 `QuestionClassifierNode` inherit | |||||
| # from `BaseNode` instead of `LLMNode`. | |||||
| return False |