From 422ebf59ea114c72054effbbbdb9307e6dbde9d0 Mon Sep 17 00:00:00 2001 From: EvanYao826 <155432245+EvanYao826@users.noreply.github.com> Date: Thu, 18 Jun 2026 15:23:08 +0800 Subject: [PATCH 1/2] refactor: clean unnecessary | None annotations in entities (#35557) Remove unnecessary '| None' type annotations where the default value already guarantees a non-None type. This is the second batch of cleanups following PR #36824. Patterns changed: - 'bool | None = False' -> 'bool = False' - 'bool | None = Field(default=False)' -> 'bool = Field(default=False)' - 'int | None = Field(default=0)' -> 'int = Field(default=0)' - 'float | None = Field(default=0.0)' -> 'float = Field(default=0.0)' - 'str | None = ""' -> 'str = ""' - 'str | None = Field(default="")' -> 'str = Field(default="")' - 'list[...] | None = Field(default_factory=list)' -> 'list[...] = Field(default_factory=list)' --- api/controllers/console/datasets/datasets.py | 2 +- api/controllers/console/snippets/payloads.py | 2 +- .../console/workspace/tool_providers.py | 2 +- .../agent_tool_callback_handler.py | 2 +- api/core/datasource/entities/api_entities.py | 4 +-- .../entities/datasource_entities.py | 4 +-- api/core/entities/provider_entities.py | 4 +-- api/core/plugin/entities/endpoint.py | 2 +- api/core/plugin/entities/plugin.py | 32 +++++++++---------- api/core/plugin/entities/request.py | 6 ++-- api/core/rag/entities/event.py | 6 ++-- .../rag/extractor/entity/extract_setting.py | 2 +- api/core/tools/entities/api_entities.py | 8 ++--- api/core/trigger/entities/api_entities.py | 4 +-- api/core/trigger/entities/entities.py | 2 +- .../nodes/knowledge_retrieval/retrieval.py | 8 ++--- .../nodes/trigger_schedule/entities.py | 4 +-- api/services/account_service.py | 6 ++-- .../rag_pipeline_entities.py | 4 +-- 19 files changed, 52 insertions(+), 52 deletions(-) diff --git a/api/controllers/console/datasets/datasets.py b/api/controllers/console/datasets/datasets.py index ca2ef5d6e2d..b3766d9e080 100644 --- a/api/controllers/console/datasets/datasets.py +++ b/api/controllers/console/datasets/datasets.py @@ -102,7 +102,7 @@ class DatasetUpdatePayload(BaseModel): external_knowledge_id: str | None = None external_knowledge_api_id: str | None = None icon_info: dict[str, Any] | None = Field(default=None) - is_multimodal: bool | None = False + is_multimodal: bool = False @field_validator("indexing_technique") @classmethod diff --git a/api/controllers/console/snippets/payloads.py b/api/controllers/console/snippets/payloads.py index 70730e754de..3d4513b5169 100644 --- a/api/controllers/console/snippets/payloads.py +++ b/api/controllers/console/snippets/payloads.py @@ -77,7 +77,7 @@ class CreateSnippetPayload(BaseModel): type: Literal["node", "group"] = "node" icon_info: IconInfo | None = None graph: dict[str, Any] | None = Field(default=None) - input_fields: list[InputFieldDefinition] | None = Field(default_factory=list) + input_fields: list[InputFieldDefinition] = Field(default_factory=list) class UpdateSnippetPayload(BaseModel): diff --git a/api/controllers/console/workspace/tool_providers.py b/api/controllers/console/workspace/tool_providers.py index 94600f38860..73fd37d8bde 100644 --- a/api/controllers/console/workspace/tool_providers.py +++ b/api/controllers/console/workspace/tool_providers.py @@ -138,7 +138,7 @@ class WorkflowToolBasePayload(BaseModel): description: str icon: dict[str, Any] parameters: list[WorkflowToolParameterConfiguration] = Field(default_factory=list) - privacy_policy: str | None = "" + privacy_policy: str = "" labels: list[str] | None = None @field_validator("name") diff --git a/api/core/callback_handler/agent_tool_callback_handler.py b/api/core/callback_handler/agent_tool_callback_handler.py index 6591b08a7e8..1b87e85b529 100644 --- a/api/core/callback_handler/agent_tool_callback_handler.py +++ b/api/core/callback_handler/agent_tool_callback_handler.py @@ -34,7 +34,7 @@ def print_text(text: str, color: str | None = None, end: str = "", file: TextIO class DifyAgentCallbackHandler(BaseModel): """Callback Handler that prints to std out.""" - color: str | None = "" + color: str = "" current_loop: int = 1 def __init__(self, color: str | None = None): diff --git a/api/core/datasource/entities/api_entities.py b/api/core/datasource/entities/api_entities.py index 352e6bfd492..9f34182d776 100644 --- a/api/core/datasource/entities/api_entities.py +++ b/api/core/datasource/entities/api_entities.py @@ -49,8 +49,8 @@ class DatasourceProviderApiEntity(BaseModel): original_credentials: dict[str, Any] | None = None is_team_authorization: bool = False allow_delete: bool = True - plugin_id: str | None = Field(default="", description="The plugin id of the datasource") - plugin_unique_identifier: str | None = Field(default="", description="The unique identifier of the datasource") + plugin_id: str = Field(default="", description="The plugin id of the datasource") + plugin_unique_identifier: str = Field(default="", description="The unique identifier of the datasource") datasources: list[DatasourceApiEntity] = Field(default_factory=list) labels: list[str] = Field(default_factory=list) diff --git a/api/core/datasource/entities/datasource_entities.py b/api/core/datasource/entities/datasource_entities.py index 443b503a693..e9ea2d7cace 100644 --- a/api/core/datasource/entities/datasource_entities.py +++ b/api/core/datasource/entities/datasource_entities.py @@ -318,8 +318,8 @@ class WebSiteInfo(BaseModel): status: str | None = Field(..., description="crawl job status") web_info_list: list[WebSiteInfoDetail] | None = [] - total: int | None = Field(default=0, description="The total number of websites") - completed: int | None = Field(default=0, description="The number of completed websites") + total: int = Field(default=0, description="The total number of websites") + completed: int = Field(default=0, description="The number of completed websites") class WebsiteCrawlMessage(BaseModel): diff --git a/api/core/entities/provider_entities.py b/api/core/entities/provider_entities.py index ad9a1f4a02a..4c9cd858e13 100644 --- a/api/core/entities/provider_entities.py +++ b/api/core/entities/provider_entities.py @@ -113,7 +113,7 @@ class CustomModelConfiguration(BaseModel): current_credential_id: str | None = None current_credential_name: str | None = None available_model_credentials: list[CredentialConfiguration] = [] - unadded_to_model_list: bool | None = False + unadded_to_model_list: bool = False # pydantic configs model_config = ConfigDict(protected_namespaces=()) @@ -209,7 +209,7 @@ class ProviderConfig(BasicProviderConfig): required: bool = False default: Union[int, str, float, bool] | None = None options: list[Option] | None = None - multiple: bool | None = False + multiple: bool = False label: I18nObject | None = None help: I18nObject | None = None url: str | None = None diff --git a/api/core/plugin/entities/endpoint.py b/api/core/plugin/entities/endpoint.py index 64199636687..cb0452708a5 100644 --- a/api/core/plugin/entities/endpoint.py +++ b/api/core/plugin/entities/endpoint.py @@ -24,7 +24,7 @@ class EndpointProviderDeclaration(BaseModel): """ settings: list[ProviderConfig] = Field(default_factory=list) - endpoints: list[EndpointDeclaration] | None = Field(default_factory=list[EndpointDeclaration]) + endpoints: list[EndpointDeclaration] = Field(default_factory=list[EndpointDeclaration]) class EndpointEntity(BasePluginEntity): diff --git a/api/core/plugin/entities/plugin.py b/api/core/plugin/entities/plugin.py index 89e0e8881cb..773fc9a0c30 100644 --- a/api/core/plugin/entities/plugin.py +++ b/api/core/plugin/entities/plugin.py @@ -28,25 +28,25 @@ class PluginResourceRequirements(BaseModel): class Permission(BaseModel): class Tool(BaseModel): - enabled: bool | None = Field(default=False) + enabled: bool = Field(default=False) class Model(BaseModel): - enabled: bool | None = Field(default=False) - llm: bool | None = Field(default=False) - text_embedding: bool | None = Field(default=False) - rerank: bool | None = Field(default=False) - tts: bool | None = Field(default=False) - speech2text: bool | None = Field(default=False) - moderation: bool | None = Field(default=False) + enabled: bool = Field(default=False) + llm: bool = Field(default=False) + text_embedding: bool = Field(default=False) + rerank: bool = Field(default=False) + tts: bool = Field(default=False) + speech2text: bool = Field(default=False) + moderation: bool = Field(default=False) class Node(BaseModel): - enabled: bool | None = Field(default=False) + enabled: bool = Field(default=False) class Endpoint(BaseModel): - enabled: bool | None = Field(default=False) + enabled: bool = Field(default=False) class Storage(BaseModel): - enabled: bool | None = Field(default=False) + enabled: bool = Field(default=False) size: int = Field(ge=1024, le=1073741824, default=1048576) tool: Tool | None = Field(default=None) @@ -69,11 +69,11 @@ class PluginCategory(StrEnum): class PluginDeclaration(BaseModel): class Plugins(BaseModel): - tools: list[str] | None = Field(default_factory=list[str]) - models: list[str] | None = Field(default_factory=list[str]) - endpoints: list[str] | None = Field(default_factory=list[str]) - datasources: list[str] | None = Field(default_factory=list[str]) - triggers: list[str] | None = Field(default_factory=list[str]) + tools: list[str] = Field(default_factory=list[str]) + models: list[str] = Field(default_factory=list[str]) + endpoints: list[str] = Field(default_factory=list[str]) + datasources: list[str] = Field(default_factory=list[str]) + triggers: list[str] = Field(default_factory=list[str]) class Meta(BaseModel): minimum_dify_version: str | None = Field(default=None) diff --git a/api/core/plugin/entities/request.py b/api/core/plugin/entities/request.py index d47dac9eaf5..95321750d7e 100644 --- a/api/core/plugin/entities/request.py +++ b/api/core/plugin/entities/request.py @@ -71,9 +71,9 @@ class RequestInvokeLLM(BaseRequestInvokeModel): mode: str completion_params: dict[str, Any] = Field(default_factory=dict) prompt_messages: list[PromptMessage] = Field(default_factory=list) - tools: list[PromptMessageTool] | None = Field(default_factory=list[PromptMessageTool]) - stop: list[str] | None = Field(default_factory=list[str]) - stream: bool | None = False + tools: list[PromptMessageTool] = Field(default_factory=list[PromptMessageTool]) + stop: list[str] = Field(default_factory=list[str]) + stream: bool = False model_config = ConfigDict(protected_namespaces=()) diff --git a/api/core/rag/entities/event.py b/api/core/rag/entities/event.py index 2d8d4060dd7..39f11bdf2c6 100644 --- a/api/core/rag/entities/event.py +++ b/api/core/rag/entities/event.py @@ -27,9 +27,9 @@ class DatasourceErrorEvent(BaseDatasourceEvent): class DatasourceCompletedEvent(BaseDatasourceEvent): event: DatasourceStreamEvent = DatasourceStreamEvent.COMPLETED data: Mapping[str, Any] | list = Field(..., description="result") - total: int | None = Field(default=0, description="total") - completed: int | None = Field(default=0, description="completed") - time_consuming: float | None = Field(default=0.0, description="time consuming") + total: int = Field(default=0, description="total") + completed: int = Field(default=0, description="completed") + time_consuming: float = Field(default=0.0, description="time consuming") class DatasourceProcessingEvent(BaseDatasourceEvent): diff --git a/api/core/rag/extractor/entity/extract_setting.py b/api/core/rag/extractor/entity/extract_setting.py index 0c420340732..af6010d5c48 100644 --- a/api/core/rag/extractor/entity/extract_setting.py +++ b/api/core/rag/extractor/entity/extract_setting.py @@ -10,7 +10,7 @@ class NotionInfo(BaseModel): """ credential_id: str | None = None - notion_workspace_id: str | None = "" + notion_workspace_id: str = "" notion_obj_id: str notion_page_type: str document: Document | None = None diff --git a/api/core/tools/entities/api_entities.py b/api/core/tools/entities/api_entities.py index 0217300055f..7db8c4f20d2 100644 --- a/api/core/tools/entities/api_entities.py +++ b/api/core/tools/entities/api_entities.py @@ -38,14 +38,14 @@ class ToolProviderApiEntity(BaseModel): original_credentials: Mapping[str, object] = Field(default_factory=dict) is_team_authorization: bool = False allow_delete: bool = True - plugin_id: str | None = Field(default="", description="The plugin id of the tool") - plugin_unique_identifier: str | None = Field(default="", description="The unique identifier of the tool") + plugin_id: str = Field(default="", description="The plugin id of the tool") + plugin_unique_identifier: str = Field(default="", description="The unique identifier of the tool") tools: list[ToolApiEntity] = Field(default_factory=list[ToolApiEntity]) labels: list[str] = Field(default_factory=list) # MCP - server_url: str | None = Field(default="", description="The server url of the tool") + server_url: str = Field(default="", description="The server url of the tool") updated_at: int = Field(default_factory=lambda: int(datetime.now().timestamp())) - server_identifier: str | None = Field(default="", description="The server identifier of the MCP tool") + server_identifier: str = Field(default="", description="The server identifier of the MCP tool") masked_headers: dict[str, str] | None = Field(default=None, description="The masked headers of the MCP tool") original_headers: dict[str, str] | None = Field(default=None, description="The original headers of the MCP tool") diff --git a/api/core/trigger/entities/api_entities.py b/api/core/trigger/entities/api_entities.py index ad7c816144c..12a7d8909d4 100644 --- a/api/core/trigger/entities/api_entities.py +++ b/api/core/trigger/entities/api_entities.py @@ -43,8 +43,8 @@ class TriggerProviderApiEntity(BaseModel): icon_dark: str | None = Field(default=None, description="The dark icon of the trigger provider") tags: list[str] = Field(default_factory=list, description="The tags of the trigger provider") - plugin_id: str | None = Field(default="", description="The plugin id of the tool") - plugin_unique_identifier: str | None = Field(default="", description="The unique identifier of the tool") + plugin_id: str = Field(default="", description="The plugin id of the tool") + plugin_unique_identifier: str = Field(default="", description="The unique identifier of the tool") supported_creation_methods: list[TriggerCreationMethod] = Field( default_factory=list, diff --git a/api/core/trigger/entities/entities.py b/api/core/trigger/entities/entities.py index a922e881cdf..71a8d8a4d68 100644 --- a/api/core/trigger/entities/entities.py +++ b/api/core/trigger/entities/entities.py @@ -46,7 +46,7 @@ class EventParameter(BaseModel): ) template: PluginParameterTemplate | None = Field(default=None, description="The template of the parameter") scope: str | None = None - required: bool | None = False + required: bool = False multiple: bool | None = Field( default=False, description="Whether the parameter is multiple select, only valid for select or dynamic-select type", diff --git a/api/core/workflow/nodes/knowledge_retrieval/retrieval.py b/api/core/workflow/nodes/knowledge_retrieval/retrieval.py index ea45dcf5c20..754b7965937 100644 --- a/api/core/workflow/nodes/knowledge_retrieval/retrieval.py +++ b/api/core/workflow/nodes/knowledge_retrieval/retrieval.py @@ -31,12 +31,12 @@ class SourceMetadata(BaseModel): retriever_from: str = Field(default="workflow", description="Retriever source context") score: float = Field(default=0.0, description="Retrieval relevance score") child_chunks: list[SourceChildChunk] = Field(default_factory=list, description="List of child chunks") - segment_hit_count: int | None = Field(default=0, description="Number of times segment was retrieved") - segment_word_count: int | None = Field(default=0, description="Word count of the segment") - segment_position: int | None = Field(default=0, description="Position of segment in document") + segment_hit_count: int = Field(default=0, description="Number of times segment was retrieved") + segment_word_count: int = Field(default=0, description="Word count of the segment") + segment_position: int = Field(default=0, description="Position of segment in document") segment_index_node_hash: str | None = Field(default=None, description="Hash of index node for the segment") doc_metadata: dict[str, Any] | None = Field(default=None, description="Additional document metadata") - position: int | None = Field(default=0, description="Position of the document in the dataset") + position: int = Field(default=0, description="Position of the document in the dataset") class Config: populate_by_name = True diff --git a/api/core/workflow/nodes/trigger_schedule/entities.py b/api/core/workflow/nodes/trigger_schedule/entities.py index 683c8d420f2..be9c92f0aea 100644 --- a/api/core/workflow/nodes/trigger_schedule/entities.py +++ b/api/core/workflow/nodes/trigger_schedule/entities.py @@ -36,10 +36,10 @@ class VisualConfig(BaseModel): """Visual configuration for schedule trigger""" # For hourly frequency - on_minute: int | None = Field(default=0, ge=0, le=59, description="Minute of the hour (0-59)") + on_minute: int = Field(default=0, ge=0, le=59, description="Minute of the hour (0-59)") # For daily, weekly, monthly frequencies - time: str | None = Field(default="12:00 AM", description="Time in 12-hour format (e.g., '2:30 PM')") + time: str = Field(default="12:00 AM", description="Time in 12-hour format (e.g., '2:30 PM')") # For weekly frequency weekdays: list[Literal["sun", "mon", "tue", "wed", "thu", "fri", "sat"]] | None = Field( diff --git a/api/services/account_service.py b/api/services/account_service.py index e39d13a3929..8ab6fa3fc68 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -728,7 +728,7 @@ class AccountService: account: Account | None = None, email: str | None = None, language: str = "en-US", - workspace_name: str | None = "", + workspace_name: str = "", ): account_email = account.email if account else email if account_email is None: @@ -757,7 +757,7 @@ class AccountService: account: Account | None = None, email: str | None = None, language: str = "en-US", - workspace_name: str | None = "", + workspace_name: str = "", new_owner_email: str = "", ): account_email = account.email if account else email @@ -778,7 +778,7 @@ class AccountService: account: Account | None = None, email: str | None = None, language: str = "en-US", - workspace_name: str | None = "", + workspace_name: str = "", ): account_email = account.email if account else email if account_email is None: diff --git a/api/services/entities/knowledge_entities/rag_pipeline_entities.py b/api/services/entities/knowledge_entities/rag_pipeline_entities.py index 1183e1161bd..7a6f5d3afc4 100644 --- a/api/services/entities/knowledge_entities/rag_pipeline_entities.py +++ b/api/services/entities/knowledge_entities/rag_pipeline_entities.py @@ -11,8 +11,8 @@ class RerankingModelConfig(BaseModel): Reranking Model Config. """ - reranking_provider_name: str | None = "" - reranking_model_name: str | None = "" + reranking_provider_name: str = "" + reranking_model_name: str = "" class WeightedScoreConfig(BaseModel): From 55ae9e2aefba3d19fd19943cb80aba322083142b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 18 Jun 2026 08:32:12 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- .../contracts/generated/api/console/datasets/types.gen.ts | 2 +- .../contracts/generated/api/console/datasets/zod.gen.ts | 2 +- .../contracts/generated/api/console/workspaces/types.gen.ts | 6 +++--- .../contracts/generated/api/console/workspaces/zod.gen.ts | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/contracts/generated/api/console/datasets/types.gen.ts b/packages/contracts/generated/api/console/datasets/types.gen.ts index a24c6cf92ae..b47de876efb 100644 --- a/packages/contracts/generated/api/console/datasets/types.gen.ts +++ b/packages/contracts/generated/api/console/datasets/types.gen.ts @@ -290,7 +290,7 @@ export type DatasetUpdatePayload = { [key: string]: unknown } | null indexing_technique?: string | null - is_multimodal?: boolean | null + is_multimodal?: boolean name?: string | null partial_member_list?: Array<{ [key: string]: string diff --git a/packages/contracts/generated/api/console/datasets/zod.gen.ts b/packages/contracts/generated/api/console/datasets/zod.gen.ts index 9609f8ad310..d5818ea45f9 100644 --- a/packages/contracts/generated/api/console/datasets/zod.gen.ts +++ b/packages/contracts/generated/api/console/datasets/zod.gen.ts @@ -332,7 +332,7 @@ export const zDatasetUpdatePayload = z.object({ external_retrieval_model: z.record(z.string(), z.unknown()).nullish(), icon_info: z.record(z.string(), z.unknown()).nullish(), indexing_technique: z.string().nullish(), - is_multimodal: z.boolean().nullish().default(false), + is_multimodal: z.boolean().optional().default(false), name: z.string().min(1).max(40).nullish(), partial_member_list: z.array(z.record(z.string(), z.string())).nullish(), permission: zPermissionEnum.nullish(), diff --git a/packages/contracts/generated/api/console/workspaces/types.gen.ts b/packages/contracts/generated/api/console/workspaces/types.gen.ts index 59ee3242e75..1fc0c278dee 100644 --- a/packages/contracts/generated/api/console/workspaces/types.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/types.gen.ts @@ -45,7 +45,7 @@ export type CreateSnippetPayload = { [key: string]: unknown } | null icon_info?: IconInfo | null - input_fields?: Array | null + input_fields?: Array name: string type?: 'group' | 'node' } @@ -657,7 +657,7 @@ export type WorkflowToolCreatePayload = { labels?: Array | null name: string parameters?: Array - privacy_policy?: string | null + privacy_policy?: string workflow_app_id: string } @@ -674,7 +674,7 @@ export type WorkflowToolUpdatePayload = { labels?: Array | null name: string parameters?: Array - privacy_policy?: string | null + privacy_policy?: string workflow_tool_id: string } diff --git a/packages/contracts/generated/api/console/workspaces/zod.gen.ts b/packages/contracts/generated/api/console/workspaces/zod.gen.ts index 8c430ddec8b..c88bd07b7b3 100644 --- a/packages/contracts/generated/api/console/workspaces/zod.gen.ts +++ b/packages/contracts/generated/api/console/workspaces/zod.gen.ts @@ -725,7 +725,7 @@ export const zCreateSnippetPayload = z.object({ description: z.string().max(2000).nullish(), graph: z.record(z.string(), z.unknown()).nullish(), icon_info: zIconInfo.nullish(), - input_fields: z.array(zInputFieldDefinition).nullish(), + input_fields: z.array(zInputFieldDefinition).optional(), name: z.string().min(1).max(255), type: z.enum(['group', 'node']).optional().default('node'), }) @@ -1491,7 +1491,7 @@ export const zWorkflowToolCreatePayload = z.object({ labels: z.array(z.string()).nullish(), name: z.string(), parameters: z.array(zWorkflowToolParameterConfiguration).optional(), - privacy_policy: z.string().nullish().default(''), + privacy_policy: z.string().optional().default(''), workflow_app_id: z.string(), }) @@ -1505,7 +1505,7 @@ export const zWorkflowToolUpdatePayload = z.object({ labels: z.array(z.string()).nullish(), name: z.string(), parameters: z.array(zWorkflowToolParameterConfiguration).optional(), - privacy_policy: z.string().nullish().default(''), + privacy_policy: z.string().optional().default(''), workflow_tool_id: z.string(), })