diff --git a/api/core/file/models.py b/api/core/file/models.py index 7089b7ce7a..d149205d77 100644 --- a/api/core/file/models.py +++ b/api/core/file/models.py @@ -74,6 +74,10 @@ class File(BaseModel): storage_key: str | None = None, dify_model_identity: str | None = FILE_MODEL_IDENTITY, url: str | None = None, + # Legacy compatibility fields - explicitly handle known extra fields + tool_file_id: str | None = None, + upload_file_id: str | None = None, + datasource_file_id: str | None = None, ): super().__init__( id=id, diff --git a/api/tests/unit_tests/core/file/test_models.py b/api/tests/unit_tests/core/file/test_models.py index 3ada2087c6..f55063ee1a 100644 --- a/api/tests/unit_tests/core/file/test_models.py +++ b/api/tests/unit_tests/core/file/test_models.py @@ -23,3 +23,32 @@ def test_file(): assert file.extension == ".png" assert file.mime_type == "image/png" assert file.size == 67 + + +def test_file_model_validate_with_legacy_fields(): + """Test `File` model can handle data containing compatibility fields.""" + data = { + "id": "test-file", + "tenant_id": "test-tenant-id", + "type": "image", + "transfer_method": "tool_file", + "related_id": "test-related-id", + "filename": "image.png", + "extension": ".png", + "mime_type": "image/png", + "size": 67, + "storage_key": "test-storage-key", + "url": "https://example.com/image.png", + # Extra legacy fields + "tool_file_id": "tool-file-123", + "upload_file_id": "upload-file-456", + "datasource_file_id": "datasource-file-789", + } + + # Should be able to create `File` object without raising an exception + file = File.model_validate(data) + + # The File object does not have tool_file_id, upload_file_id, or datasource_file_id as attributes. + # Instead, check it does not expose unrecognized legacy fields (should raise on getattr). + for legacy_field in ("tool_file_id", "upload_file_id", "datasource_file_id"): + assert not hasattr(file, legacy_field)