This is an automated email from the ASF dual-hosted git repository.

pierrejeambrun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new d1eeb8334e2 add has_import_errors filter to Core API GET /dags 
endpoint (#54563)
d1eeb8334e2 is described below

commit d1eeb8334e22426c379c3a692f397f4595cf2565
Author: Guangyang Li <[email protected]>
AuthorDate: Fri Sep 5 09:07:03 2025 -0400

    add has_import_errors filter to Core API GET /dags endpoint (#54563)
    
    * add has_import_errors filter
    
    * add unit tests
    
    * update test
    
    * add description
    
    * Update airflow-core/src/airflow/api_fastapi/common/parameters.py
    
    Change DAGs to Dags
    
    Co-authored-by: LIU ZHE YOU <[email protected]>
    
    * empty commit
    
    * Change DAGs to dags
    
    * Change DAGs to dags
    
    ---------
    
    Co-authored-by: Guangyang Li <[email protected]>
    Co-authored-by: LIU ZHE YOU <[email protected]>
---
 .../src/airflow/api_fastapi/common/parameters.py       | 11 +++++++++++
 .../api_fastapi/core_api/openapi/_private_ui.yaml      | 12 ++++++++++++
 .../core_api/openapi/v2-rest-api-generated.yaml        | 12 ++++++++++++
 .../airflow/api_fastapi/core_api/routes/public/dags.py |  3 +++
 .../src/airflow/api_fastapi/core_api/routes/ui/dags.py |  3 +++
 .../src/airflow/ui/openapi-gen/queries/common.ts       | 10 ++++++----
 .../airflow/ui/openapi-gen/queries/ensureQueryData.ts  | 12 ++++++++----
 .../src/airflow/ui/openapi-gen/queries/prefetch.ts     | 12 ++++++++----
 .../src/airflow/ui/openapi-gen/queries/queries.ts      | 12 ++++++++----
 .../src/airflow/ui/openapi-gen/queries/suspense.ts     | 12 ++++++++----
 .../airflow/ui/openapi-gen/requests/services.gen.ts    |  4 ++++
 .../src/airflow/ui/openapi-gen/requests/types.gen.ts   |  8 ++++++++
 .../api_fastapi/core_api/routes/public/test_dags.py    | 18 ++++++++++++++++++
 13 files changed, 109 insertions(+), 20 deletions(-)

diff --git a/airflow-core/src/airflow/api_fastapi/common/parameters.py 
b/airflow-core/src/airflow/api_fastapi/common/parameters.py
index 23f35cb999c..cae6bdac0f0 100644
--- a/airflow-core/src/airflow/api_fastapi/common/parameters.py
+++ b/airflow-core/src/airflow/api_fastapi/common/parameters.py
@@ -616,6 +616,17 @@ QueryPausedFilter = Annotated[
     FilterParam[bool | None],
     Depends(filter_param_factory(DagModel.is_paused, bool | None, 
filter_name="paused")),
 ]
+QueryHasImportErrorsFilter = Annotated[
+    FilterParam[bool | None],
+    Depends(
+        filter_param_factory(
+            DagModel.has_import_errors,
+            bool | None,
+            filter_name="has_import_errors",
+            description="Filter Dags by having import errors. Only Dags that 
have been successfully loaded before will be returned.",
+        )
+    ),
+]
 QueryFavoriteFilter = Annotated[_FavoriteFilter, 
Depends(_FavoriteFilter.depends)]
 QueryExcludeStaleFilter = Annotated[_ExcludeStaleFilter, 
Depends(_ExcludeStaleFilter.depends)]
 QueryDagIdPatternSearch = Annotated[
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml 
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
index 94b34e2bcbd..03c056d1da0 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
+++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
@@ -208,6 +208,18 @@ paths:
           - type: boolean
           - type: 'null'
           title: Paused
+      - name: has_import_errors
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: boolean
+          - type: 'null'
+          description: Filter Dags by having import errors. Only Dags that 
have been
+            successfully loaded before will be returned.
+          title: Has Import Errors
+        description: Filter Dags by having import errors. Only Dags that have 
been
+          successfully loaded before will be returned.
       - name: last_dag_run_state
         in: query
         required: false
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
 
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
index aeaf57f661e..a3f1de4e73e 100644
--- 
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
+++ 
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/v2-rest-api-generated.yaml
@@ -2988,6 +2988,18 @@ paths:
           - type: boolean
           - type: 'null'
           title: Paused
+      - name: has_import_errors
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: boolean
+          - type: 'null'
+          description: Filter Dags by having import errors. Only Dags that 
have been
+            successfully loaded before will be returned.
+          title: Has Import Errors
+        description: Filter Dags by having import errors. Only Dags that have 
been
+          successfully loaded before will be returned.
       - name: last_dag_run_state
         in: query
         required: false
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py
index 87260dee00e..e62c12c5ecb 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dags.py
@@ -43,6 +43,7 @@ from airflow.api_fastapi.common.parameters import (
     QueryExcludeStaleFilter,
     QueryFavoriteFilter,
     QueryHasAssetScheduleFilter,
+    QueryHasImportErrorsFilter,
     QueryLastDagRunStateFilter,
     QueryLimit,
     QueryOffset,
@@ -88,6 +89,7 @@ def get_dags(
     dag_display_name_pattern: QueryDagDisplayNamePatternSearch,
     exclude_stale: QueryExcludeStaleFilter,
     paused: QueryPausedFilter,
+    has_import_errors: QueryHasImportErrorsFilter,
     last_dag_run_state: QueryLastDagRunStateFilter,
     bundle_name: QueryBundleNameFilter,
     bundle_version: QueryBundleVersionFilter,
@@ -142,6 +144,7 @@ def get_dags(
         filters=[
             exclude_stale,
             paused,
+            has_import_errors,
             dag_id_pattern,
             dag_display_name_pattern,
             tags,
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py
index 6a4d96f9bdc..e953017a56b 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/dags.py
@@ -40,6 +40,7 @@ from airflow.api_fastapi.common.parameters import (
     QueryExcludeStaleFilter,
     QueryFavoriteFilter,
     QueryHasAssetScheduleFilter,
+    QueryHasImportErrorsFilter,
     QueryLastDagRunStateFilter,
     QueryLimit,
     QueryOffset,
@@ -92,6 +93,7 @@ def get_dags(
     dag_display_name_pattern: QueryDagDisplayNamePatternSearch,
     exclude_stale: QueryExcludeStaleFilter,
     paused: QueryPausedFilter,
+    has_import_errors: QueryHasImportErrorsFilter,
     last_dag_run_state: QueryLastDagRunStateFilter,
     bundle_name: QueryBundleNameFilter,
     bundle_version: QueryBundleVersionFilter,
@@ -127,6 +129,7 @@ def get_dags(
         filters=[
             exclude_stale,
             paused,
+            has_import_errors,
             dag_id_pattern,
             dag_ids,
             dag_display_name_pattern,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
index 9dc12bd20dc..6322b959a38 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -243,7 +243,7 @@ export const UseDagWarningServiceListDagWarningsKeyFn = ({ 
dagId, limit, offset,
 export type DagServiceGetDagsDefaultResponse = Awaited<ReturnType<typeof 
DagService.getDags>>;
 export type DagServiceGetDagsQueryResult<TData = 
DagServiceGetDagsDefaultResponse, TError = unknown> = UseQueryResult<TData, 
TError>;
 export const useDagServiceGetDagsKey = "DagServiceGetDags";
-export const UseDagServiceGetDagsKeyFn = ({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, 
dagRunEndDateGte, dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, 
dagRunStartDateGte, dagRunStartDateLt, dagRunStartDateLte, dagRunState, 
excludeStale, hasAssetSchedule, isFavorite, lastDagRunState, limit, offset, 
orderBy, owners, paused, tags, tagsMatchMode }: {
+export const UseDagServiceGetDagsKeyFn = ({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, 
dagRunEndDateGte, dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, 
dagRunStartDateGte, dagRunStartDateLt, dagRunStartDateLte, dagRunState, 
excludeStale, hasAssetSchedule, hasImportErrors, isFavorite, lastDagRunState, 
limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: {
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -260,6 +260,7 @@ export const UseDagServiceGetDagsKeyFn = ({ 
assetDependency, bundleName, bundleV
   dagRunState?: string[];
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
   limit?: number;
@@ -269,7 +270,7 @@ export const UseDagServiceGetDagsKeyFn = ({ 
assetDependency, bundleName, bundleV
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}, queryKey?: Array<unknown>) => [useDagServiceGetDagsKey, ...(queryKey 
?? [{ assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, dagRunEndDateLt, 
dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, dagRunStartDateLt, 
dagRunStartDateLte, dagRunState, excludeStale, hasAssetSchedule, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode 
}])];
+} = {}, queryKey?: Array<unknown>) => [useDagServiceGetDagsKey, ...(queryKey 
?? [{ assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, dagRunEndDateLt, 
dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, dagRunStartDateLt, 
dagRunStartDateLte, dagRunState, excludeStale, hasAssetSchedule, 
hasImportErrors, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }])];
 export type DagServiceGetDagDefaultResponse = Awaited<ReturnType<typeof 
DagService.getDag>>;
 export type DagServiceGetDagQueryResult<TData = 
DagServiceGetDagDefaultResponse, TError = unknown> = UseQueryResult<TData, 
TError>;
 export const useDagServiceGetDagKey = "DagServiceGetDag";
@@ -294,7 +295,7 @@ export const UseDagServiceGetDagTagsKeyFn = ({ limit, 
offset, orderBy, tagNamePa
 export type DagServiceGetDagsUiDefaultResponse = Awaited<ReturnType<typeof 
DagService.getDagsUi>>;
 export type DagServiceGetDagsUiQueryResult<TData = 
DagServiceGetDagsUiDefaultResponse, TError = unknown> = UseQueryResult<TData, 
TError>;
 export const useDagServiceGetDagsUiKey = "DagServiceGetDagsUi";
-export const UseDagServiceGetDagsUiKeyFn = ({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, 
limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: {
+export const UseDagServiceGetDagsUiKeyFn = ({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: 
{
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -304,6 +305,7 @@ export const UseDagServiceGetDagsUiKeyFn = ({ 
assetDependency, bundleName, bundl
   dagRunsLimit?: number;
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   hasPendingActions?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
@@ -314,7 +316,7 @@ export const UseDagServiceGetDagsUiKeyFn = ({ 
assetDependency, bundleName, bundl
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}, queryKey?: Array<unknown>) => [useDagServiceGetDagsUiKey, ...(queryKey 
?? [{ assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasAssetSchedule, 
hasPendingActions, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }])];
+} = {}, queryKey?: Array<unknown>) => [useDagServiceGetDagsUiKey, ...(queryKey 
?? [{ assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasAssetSchedule, 
hasImportErrors, hasPendingActions, isFavorite, lastDagRunState, limit, offset, 
orderBy, owners, paused, tags, tagsMatchMode }])];
 export type DagServiceGetLatestRunInfoDefaultResponse = 
Awaited<ReturnType<typeof DagService.getLatestRunInfo>>;
 export type DagServiceGetLatestRunInfoQueryResult<TData = 
DagServiceGetLatestRunInfoDefaultResponse, TError = unknown> = 
UseQueryResult<TData, TError>;
 export const useDagServiceGetLatestRunInfoKey = "DagServiceGetLatestRunInfo";
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
index ae6a52073bc..1f3e5dc4e3e 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -459,6 +459,7 @@ export const ensureUseDagWarningServiceListDagWarningsData 
= (queryClient: Query
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -478,7 +479,7 @@ export const ensureUseDagWarningServiceListDagWarningsData 
= (queryClient: Query
 * @returns DAGCollectionResponse Successful Response
 * @throws ApiError
 */
-export const ensureUseDagServiceGetDagsData = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, dagRunEndDateLt, 
dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, dagRunStartDateLt, 
dagRunStartDateLte, dagRunState, excludeStale, hasAssetSchedule, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: 
{
+export const ensureUseDagServiceGetDagsData = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, dagRunEndDateLt, 
dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, dagRunStartDateLt, 
dagRunStartDateLte, dagRunState, excludeStale, hasAssetSchedule, 
hasImportErrors, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }: {
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -495,6 +496,7 @@ export const ensureUseDagServiceGetDagsData = (queryClient: 
QueryClient, { asset
   dagRunState?: string[];
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
   limit?: number;
@@ -504,7 +506,7 @@ export const ensureUseDagServiceGetDagsData = (queryClient: 
QueryClient, { asset
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }), queryFn: () => DagService.getDags({ ass [...]
+} = {}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, hasImportErrors, isFavorite, lastDagRunState, limit, offset, 
orderBy, owners, paused, tags, tagsMatchMode }), queryFn: () => DagServ [...]
 /**
 * Get Dag
 * Get basic information about a DAG.
@@ -559,6 +561,7 @@ export const ensureUseDagServiceGetDagTagsData = 
(queryClient: QueryClient, { li
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -570,7 +573,7 @@ export const ensureUseDagServiceGetDagTagsData = 
(queryClient: QueryClient, { li
 * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
 * @throws ApiError
 */
-export const ensureUseDagServiceGetDagsUiData = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasAssetSchedule, 
hasPendingActions, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }: {
+export const ensureUseDagServiceGetDagsUiData = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasAssetSchedule, 
hasImportErrors, hasPendingActions, isFavorite, lastDagRunState, limit, offset, 
orderBy, owners, paused, tags, tagsMatchMode }: {
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -580,6 +583,7 @@ export const ensureUseDagServiceGetDagsUiData = 
(queryClient: QueryClient, { ass
   dagRunsLimit?: number;
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   hasPendingActions?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
@@ -590,7 +594,7 @@ export const ensureUseDagServiceGetDagsUiData = 
(queryClient: QueryClient, { ass
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, 
limit, offset, orderBy, owners, paused, tags, tagsMatchMode }), queryFn: () => 
DagService.getDagsUi({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, excludeStale, ha 
[...]
+} = {}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode 
}), queryFn: () => DagService.getDagsUi({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, [...]
 /**
 * Get Latest Run Info
 * Get latest run.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
index c681eeb4fdc..304b6e37d17 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -459,6 +459,7 @@ export const prefetchUseDagWarningServiceListDagWarnings = 
(queryClient: QueryCl
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -478,7 +479,7 @@ export const prefetchUseDagWarningServiceListDagWarnings = 
(queryClient: QueryCl
 * @returns DAGCollectionResponse Successful Response
 * @throws ApiError
 */
-export const prefetchUseDagServiceGetDags = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, dagRunEndDateLt, 
dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, dagRunStartDateLt, 
dagRunStartDateLte, dagRunState, excludeStale, hasAssetSchedule, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: 
{
+export const prefetchUseDagServiceGetDags = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, dagRunEndDateLt, 
dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, dagRunStartDateLt, 
dagRunStartDateLte, dagRunState, excludeStale, hasAssetSchedule, 
hasImportErrors, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }: {
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -495,6 +496,7 @@ export const prefetchUseDagServiceGetDags = (queryClient: 
QueryClient, { assetDe
   dagRunState?: string[];
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
   limit?: number;
@@ -504,7 +506,7 @@ export const prefetchUseDagServiceGetDags = (queryClient: 
QueryClient, { assetDe
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }), queryFn: () => DagService.getDags({ asset [...]
+} = {}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, hasImportErrors, isFavorite, lastDagRunState, limit, offset, 
orderBy, owners, paused, tags, tagsMatchMode }), queryFn: () => DagServic [...]
 /**
 * Get Dag
 * Get basic information about a DAG.
@@ -559,6 +561,7 @@ export const prefetchUseDagServiceGetDagTags = 
(queryClient: QueryClient, { limi
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -570,7 +573,7 @@ export const prefetchUseDagServiceGetDagTags = 
(queryClient: QueryClient, { limi
 * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
 * @throws ApiError
 */
-export const prefetchUseDagServiceGetDagsUi = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasAssetSchedule, 
hasPendingActions, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
paused, tags, tagsMatchMode }: {
+export const prefetchUseDagServiceGetDagsUi = (queryClient: QueryClient, { 
assetDependency, bundleName, bundleVersion, dagDisplayNamePattern, 
dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasAssetSchedule, 
hasImportErrors, hasPendingActions, isFavorite, lastDagRunState, limit, offset, 
orderBy, owners, paused, tags, tagsMatchMode }: {
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -580,6 +583,7 @@ export const prefetchUseDagServiceGetDagsUi = (queryClient: 
QueryClient, { asset
   dagRunsLimit?: number;
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   hasPendingActions?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
@@ -590,7 +594,7 @@ export const prefetchUseDagServiceGetDagsUi = (queryClient: 
QueryClient, { asset
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, 
limit, offset, orderBy, owners, paused, tags, tagsMatchMode }), queryFn: () => 
DagService.getDagsUi({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, excludeStale, hasA 
[...]
+} = {}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode 
}), queryFn: () => DagService.getDagsUi({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, e 
[...]
 /**
 * Get Latest Run Info
 * Get latest run.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
index e55011531b0..f727dcdbd4f 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -459,6 +459,7 @@ export const useDagWarningServiceListDagWarnings = <TData = 
Common.DagWarningSer
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -478,7 +479,7 @@ export const useDagWarningServiceListDagWarnings = <TData = 
Common.DagWarningSer
 * @returns DAGCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDagServiceGetDags = <TData = 
Common.DagServiceGetDagsDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, isFavorite, lastDagRunState, limit, offset, orderBy, owners, 
pause [...]
+export const useDagServiceGetDags = <TData = 
Common.DagServiceGetDagsDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, hasImportErrors, isFavorite, lastDagRunState, limit, offset, 
order [...]
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -495,6 +496,7 @@ export const useDagServiceGetDags = <TData = 
Common.DagServiceGetDagsDefaultResp
   dagRunState?: string[];
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
   limit?: number;
@@ -504,7 +506,7 @@ export const useDagServiceGetDags = <TData = 
Common.DagServiceGetDagsDefaultResp
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, isFavorite, lastDagRunState, limit, offset [...]
+} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, hasImportErrors, isFavorite, lastDagRunSta [...]
 /**
 * Get Dag
 * Get basic information about a DAG.
@@ -559,6 +561,7 @@ export const useDagServiceGetDagTags = <TData = 
Common.DagServiceGetDagTagsDefau
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -570,7 +573,7 @@ export const useDagServiceGetDagTags = <TData = 
Common.DagServiceGetDagTagsDefau
 * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDagServiceGetDagsUi = <TData = 
Common.DagServiceGetDagsUiDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, excludeStale, 
hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, limit, 
offset, orderBy, owners, paused, tags, tagsMatchMode }: {
+export const useDagServiceGetDagsUi = <TData = 
Common.DagServiceGetDagsUiDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, excludeStale, 
hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: 
{
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -580,6 +583,7 @@ export const useDagServiceGetDagsUi = <TData = 
Common.DagServiceGetDagsUiDefault
   dagRunsLimit?: number;
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   hasPendingActions?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
@@ -590,7 +594,7 @@ export const useDagServiceGetDagsUi = <TData = 
Common.DagServiceGetDagsUiDefault
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, 
limit, offset, orderBy, owners, paused, tags, tagsMatchMode }, queryKey), 
queryFn: () => DagService.getDagsUi({ assetDependency, bu [...]
+} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }, 
queryKey), queryFn: () => DagService.getDagsUi({ as [...]
 /**
 * Get Latest Run Info
 * Get latest run.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts 
b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
index 8982708376e..35d89616172 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -459,6 +459,7 @@ export const useDagWarningServiceListDagWarningsSuspense = 
<TData = Common.DagWa
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -478,7 +479,7 @@ export const useDagWarningServiceListDagWarningsSuspense = 
<TData = Common.DagWa
 * @returns DAGCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDagServiceGetDagsSuspense = <TData = 
Common.DagServiceGetDagsDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, isFavorite, lastDagRunState, limit, offset, orderBy, owner 
[...]
+export const useDagServiceGetDagsSuspense = <TData = 
Common.DagServiceGetDagsDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, hasImportErrors, isFavorite, lastDagRunState, limit, offse 
[...]
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -495,6 +496,7 @@ export const useDagServiceGetDagsSuspense = <TData = 
Common.DagServiceGetDagsDef
   dagRunState?: string[];
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
   limit?: number;
@@ -504,7 +506,7 @@ export const useDagServiceGetDagsSuspense = <TData = 
Common.DagServiceGetDagsDef
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, isFavorite, lastDagRunState, limit [...]
+} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsKeyFn({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagRunEndDateGt, dagRunEndDateGte, 
dagRunEndDateLt, dagRunEndDateLte, dagRunStartDateGt, dagRunStartDateGte, 
dagRunStartDateLt, dagRunStartDateLte, dagRunState, excludeStale, 
hasAssetSchedule, hasImportErrors, isFavorite, lastD [...]
 /**
 * Get Dag
 * Get basic information about a DAG.
@@ -559,6 +561,7 @@ export const useDagServiceGetDagTagsSuspense = <TData = 
Common.DagServiceGetDagT
 * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
 * @param data.excludeStale
 * @param data.paused
+* @param data.hasImportErrors Filter Dags by having import errors. Only Dags 
that have been successfully loaded before will be returned.
 * @param data.lastDagRunState
 * @param data.bundleName
 * @param data.bundleVersion
@@ -570,7 +573,7 @@ export const useDagServiceGetDagTagsSuspense = <TData = 
Common.DagServiceGetDagT
 * @returns DAGWithLatestDagRunsCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDagServiceGetDagsUiSuspense = <TData = 
Common.DagServiceGetDagsUiDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, excludeStale, 
hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, limit, 
offset, orderBy, owners, paused, tags, tagsMatchMode }: {
+export const useDagServiceGetDagsUiSuspense = <TData = 
Common.DagServiceGetDagsUiDefaultResponse, TError = unknown, TQueryKey extends 
Array<unknown> = unknown[]>({ assetDependency, bundleName, bundleVersion, 
dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, excludeStale, 
hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }: 
{
   assetDependency?: string;
   bundleName?: string;
   bundleVersion?: string;
@@ -580,6 +583,7 @@ export const useDagServiceGetDagsUiSuspense = <TData = 
Common.DagServiceGetDagsU
   dagRunsLimit?: number;
   excludeStale?: boolean;
   hasAssetSchedule?: boolean;
+  hasImportErrors?: boolean;
   hasPendingActions?: boolean;
   isFavorite?: boolean;
   lastDagRunState?: DagRunState;
@@ -590,7 +594,7 @@ export const useDagServiceGetDagsUiSuspense = <TData = 
Common.DagServiceGetDagsU
   paused?: boolean;
   tags?: string[];
   tagsMatchMode?: "any" | "all";
-} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasPendingActions, isFavorite, lastDagRunState, 
limit, offset, orderBy, owners, paused, tags, tagsMatchMode }, queryKey), 
queryFn: () => DagService.getDagsUi({ assetDepend [...]
+} = {}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDagServiceGetDagsUiKeyFn({ assetDependency, bundleName, 
bundleVersion, dagDisplayNamePattern, dagIdPattern, dagIds, dagRunsLimit, 
excludeStale, hasAssetSchedule, hasImportErrors, hasPendingActions, isFavorite, 
lastDagRunState, limit, offset, orderBy, owners, paused, tags, tagsMatchMode }, 
queryKey), queryFn: () => DagService.getDag [...]
 /**
 * Get Latest Run Info
 * Get latest run.
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts 
b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
index 8a6c09b8eb4..99d6bbb7591 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/services.gen.ts
@@ -1391,6 +1391,7 @@ export class DagService {
      * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
      * @param data.excludeStale
      * @param data.paused
+     * @param data.hasImportErrors Filter Dags by having import errors. Only 
Dags that have been successfully loaded before will be returned.
      * @param data.lastDagRunState
      * @param data.bundleName
      * @param data.bundleVersion
@@ -1424,6 +1425,7 @@ export class DagService {
                 dag_display_name_pattern: data.dagDisplayNamePattern,
                 exclude_stale: data.excludeStale,
                 paused: data.paused,
+                has_import_errors: data.hasImportErrors,
                 last_dag_run_state: data.lastDagRunState,
                 bundle_name: data.bundleName,
                 bundle_version: data.bundleVersion,
@@ -1693,6 +1695,7 @@ export class DagService {
      * @param data.dagDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
      * @param data.excludeStale
      * @param data.paused
+     * @param data.hasImportErrors Filter Dags by having import errors. Only 
Dags that have been successfully loaded before will be returned.
      * @param data.lastDagRunState
      * @param data.bundleName
      * @param data.bundleVersion
@@ -1720,6 +1723,7 @@ export class DagService {
                 dag_display_name_pattern: data.dagDisplayNamePattern,
                 exclude_stale: data.excludeStale,
                 paused: data.paused,
+                has_import_errors: data.hasImportErrors,
                 last_dag_run_state: data.lastDagRunState,
                 bundle_name: data.bundleName,
                 bundle_version: data.bundleVersion,
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts 
b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
index 414dbc8f12e..f286bdd205f 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -2373,6 +2373,10 @@ export type GetDagsData = {
      * Filter Dags with asset-based scheduling
      */
     hasAssetSchedule?: boolean | null;
+    /**
+     * Filter Dags by having import errors. Only Dags that have been 
successfully loaded before will be returned.
+     */
+    hasImportErrors?: boolean | null;
     isFavorite?: boolean | null;
     lastDagRunState?: DagRunState | null;
     limit?: number;
@@ -2476,6 +2480,10 @@ export type GetDagsUiData = {
      * Filter Dags with asset-based scheduling
      */
     hasAssetSchedule?: boolean | null;
+    /**
+     * Filter Dags by having import errors. Only Dags that have been 
successfully loaded before will be returned.
+     */
+    hasImportErrors?: boolean | null;
     hasPendingActions?: boolean | null;
     isFavorite?: boolean | null;
     lastDagRunState?: DagRunState | null;
diff --git 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
index b49e5bb6b3e..7612edebadc 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dags.py
@@ -490,6 +490,24 @@ class TestGetDags(TestDagEndpoint):
         response = unauthorized_test_client.get("/dags")
         assert response.status_code == 403
 
+    @pytest.mark.parametrize(
+        "filter_value, expected_ids",
+        [
+            (True, [DAG1_ID]),
+            (False, [DAG2_ID]),
+        ],
+    )
+    def test_get_dags_filter_has_import_errors(self, session, test_client, 
filter_value, expected_ids):
+        dag = session.get(DagModel, DAG1_ID)
+        dag.has_import_errors = True
+        session.commit()
+
+        response = test_client.get("/dags", params={"has_import_errors": 
filter_value})
+        assert response.status_code == 200
+        body = response.json()
+        assert body["total_entries"] == 1
+        assert [dag["dag_id"] for dag in body["dags"]] == expected_ids
+
 
 class TestPatchDag(TestDagEndpoint):
     """Unit tests for Patch DAG."""


Reply via email to