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

jasonliu 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 afa0329368f Add Dag ID pattern search functionality to Dag Runs and 
Task Instances (#55691)
afa0329368f is described below

commit afa0329368f8fb9e13684cb7ff8e44834206e69e
Author: Dheeraj Turaga <dheerajtur...@gmail.com>
AuthorDate: Fri Sep 19 03:04:15 2025 -0500

    Add Dag ID pattern search functionality to Dag Runs and Task Instances 
(#55691)
    
    * Add DAG ID pattern search functionality to DAG runs and task instances
    
      - Add dag_id_pattern query parameter to DAG runs and task instances API 
endpoints
      - Implement SQL LIKE pattern matching with % and _ wildcards
      - Add search fields to DAG runs and task instances UI pages with 
conditional display
      - Update TypeScript client with new dag_id_pattern parameters
      - Add comprehensive unit tests for DAG ID pattern filtering
      - Fix test to use existing example DAGs instead of non-existent ones
    
    * Fix Translations
    
    * Fix tests based on Jason's and Pierre's feedback
---
 .../core_api/openapi/v2-rest-api-generated.yaml    | 24 +++++++++++
 .../api_fastapi/core_api/routes/public/dag_run.py  |  2 +
 .../core_api/routes/public/task_instances.py       |  4 ++
 .../src/airflow/ui/openapi-gen/queries/common.ts   | 10 +++--
 .../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 ++++--
 .../ui/openapi-gen/requests/services.gen.ts        |  6 ++-
 .../airflow/ui/openapi-gen/requests/types.gen.ts   |  8 ++++
 airflow-core/src/airflow/ui/src/pages/DagRuns.tsx  | 30 +++++++++++++
 .../ui/src/pages/TaskInstances/TaskInstances.tsx   |  3 ++
 .../pages/TaskInstances/TaskInstancesFilter.tsx    | 35 ++++++++++++++-
 .../core_api/routes/public/test_dag_run.py         | 16 +++++++
 .../core_api/routes/public/test_task_instances.py  | 50 +++++++++++++++++++---
 15 files changed, 208 insertions(+), 28 deletions(-)

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 dab0066101f..61565e7912c 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
@@ -2245,6 +2245,18 @@ paths:
           title: Triggering User Name Pattern
         description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g. 
`%customer_%`).\
           \ Regular expressions are **not** supported."
+      - name: dag_id_pattern
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+          - type: 'null'
+          description: "SQL LIKE expression \u2014 use `%` / `_` wildcards 
(e.g. `%customer_%`).\
+            \ Regular expressions are **not** supported."
+          title: Dag Id Pattern
+        description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g. 
`%customer_%`).\
+          \ Regular expressions are **not** supported."
       responses:
         '200':
           description: Successful Response
@@ -6479,6 +6491,18 @@ paths:
           title: Task Display Name Pattern
         description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g. 
`%customer_%`).\
           \ Regular expressions are **not** supported."
+      - name: dag_id_pattern
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+          - type: 'null'
+          description: "SQL LIKE expression \u2014 use `%` / `_` wildcards 
(e.g. `%customer_%`).\
+            \ Regular expressions are **not** supported."
+          title: Dag Id Pattern
+        description: "SQL LIKE expression \u2014 use `%` / `_` wildcards (e.g. 
`%customer_%`).\
+          \ Regular expressions are **not** supported."
       - name: state
         in: query
         required: false
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
index 657d2df6955..0aa4be09979 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/dag_run.py
@@ -351,6 +351,7 @@ def get_dag_runs(
         _SearchParam,
         Depends(search_param_factory(DagRun.triggering_user_name, 
"triggering_user_name_pattern")),
     ],
+    dag_id_pattern: Annotated[_SearchParam, 
Depends(search_param_factory(DagRun.dag_id, "dag_id_pattern"))],
 ) -> DAGRunCollectionResponse:
     """
     Get all DAG Runs.
@@ -381,6 +382,7 @@ def get_dag_runs(
             readable_dag_runs_filter,
             run_id_pattern,
             triggering_user_name_pattern,
+            dag_id_pattern,
         ],
         order_by=order_by,
         offset=offset,
diff --git 
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
index 28831ac01e6..a4eb092885f 100644
--- 
a/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
+++ 
b/airflow-core/src/airflow/api_fastapi/core_api/routes/public/task_instances.py
@@ -52,9 +52,11 @@ from airflow.api_fastapi.common.parameters import (
     Range,
     RangeFilter,
     SortParam,
+    _SearchParam,
     datetime_range_filter_factory,
     filter_param_factory,
     float_range_filter_factory,
+    search_param_factory,
 )
 from airflow.api_fastapi.common.router import AirflowRouter
 from airflow.api_fastapi.core_api.datamodels.common import BulkBody, 
BulkResponse
@@ -408,6 +410,7 @@ def get_task_instances(
     update_at_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("updated_at", TI))],
     duration_range: Annotated[RangeFilter, 
Depends(float_range_filter_factory("duration", TI))],
     task_display_name_pattern: QueryTITaskDisplayNamePatternSearch,
+    dag_id_pattern: Annotated[_SearchParam, 
Depends(search_param_factory(TI.dag_id, "dag_id_pattern"))],
     state: QueryTIStateFilter,
     pool: QueryTIPoolFilter,
     queue: QueryTIQueueFilter,
@@ -491,6 +494,7 @@ def get_task_instances(
             executor,
             task_id,
             task_display_name_pattern,
+            dag_id_pattern,
             version_number,
             readable_ti_filter,
             try_number,
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 7ec7d3201c2..bfb860cfc3d 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/common.ts
@@ -143,8 +143,9 @@ export const UseDagRunServiceGetUpstreamAssetEventsKeyFn = 
({ dagId, dagRunId }:
 export type DagRunServiceGetDagRunsDefaultResponse = Awaited<ReturnType<typeof 
DagRunService.getDagRuns>>;
 export type DagRunServiceGetDagRunsQueryResult<TData = 
DagRunServiceGetDagRunsDefaultResponse, TError = unknown> = 
UseQueryResult<TData, TError>;
 export const useDagRunServiceGetDagRunsKey = "DagRunServiceGetDagRuns";
-export const UseDagRunServiceGetDagRunsKeyFn = ({ dagId, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern, 
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }: {
+export const UseDagRunServiceGetDagRunsKeyFn = ({ dagId, dagIdPattern, 
dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern, 
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }: {
   dagId: string;
+  dagIdPattern?: string;
   dagVersion?: number[];
   endDateGt?: string;
   endDateGte?: string;
@@ -173,7 +174,7 @@ export const UseDagRunServiceGetDagRunsKeyFn = ({ dagId, 
dagVersion, endDateGt,
   updatedAtGte?: string;
   updatedAtLt?: string;
   updatedAtLte?: string;
-}, queryKey?: Array<unknown>) => [useDagRunServiceGetDagRunsKey, ...(queryKey 
?? [{ dagId, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit, 
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, 
runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, 
startDateGt, startDateGte, startDateLt, startDateLte, state, 
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte 
}])];
+}, queryKey?: Array<unknown>) => [useDagRunServiceGetDagRunsKey, ...(queryKey 
?? [{ dagId, dagIdPattern, dagVersion, endDateGt, endDateGte, endDateLt, 
endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt, 
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt, 
startDateLte, state, triggeringUserNamePattern, updatedAtGt, updatedAtGte, 
updatedAtLt, updatedAtLte }])];
 export type DagRunServiceWaitDagRunUntilFinishedDefaultResponse = 
Awaited<ReturnType<typeof DagRunService.waitDagRunUntilFinished>>;
 export type DagRunServiceWaitDagRunUntilFinishedQueryResult<TData = 
DagRunServiceWaitDagRunUntilFinishedDefaultResponse, TError = unknown> = 
UseQueryResult<TData, TError>;
 export const useDagRunServiceWaitDagRunUntilFinishedKey = 
"DagRunServiceWaitDagRunUntilFinished";
@@ -471,8 +472,9 @@ export const 
UseTaskInstanceServiceGetMappedTaskInstanceKeyFn = ({ dagId, dagRun
 export type TaskInstanceServiceGetTaskInstancesDefaultResponse = 
Awaited<ReturnType<typeof TaskInstanceService.getTaskInstances>>;
 export type TaskInstanceServiceGetTaskInstancesQueryResult<TData = 
TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown> = 
UseQueryResult<TData, TError>;
 export const useTaskInstanceServiceGetTaskInstancesKey = 
"TaskInstanceServiceGetTaskInstances";
-export const UseTaskInstanceServiceGetTaskInstancesKeyFn = ({ dagId, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, 
startDateGte, startDateLt, startDateLte, state, taskDisplayNamePattern, taskId, 
tryNumber, updatedAtGt, updatedAtGte, updated [...]
+export const UseTaskInstanceServiceGetTaskInstancesKeyFn = ({ dagId, 
dagIdPattern, dagRunId, durationGt, durationGte, durationLt, durationLte, 
endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, 
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, 
startDateGt, startDateGte, startDateLt, startDateLte, state, 
taskDisplayNamePattern, taskId, tryNumber, updatedAtGt, updated [...]
   dagId: string;
+  dagIdPattern?: string;
   dagRunId: string;
   durationGt?: number;
   durationGte?: number;
@@ -511,7 +513,7 @@ export const UseTaskInstanceServiceGetTaskInstancesKeyFn = 
({ dagId, dagRunId, d
   updatedAtLt?: string;
   updatedAtLte?: string;
   versionNumber?: number[];
-}, queryKey?: Array<unknown>) => [useTaskInstanceServiceGetTaskInstancesKey, 
...(queryKey ?? [{ dagId, dagRunId, durationGt, durationGte, durationLt, 
durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, 
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, 
operator, orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, 
taskDisplayNamePattern, taskId, tryNumber,  [...]
+}, queryKey?: Array<unknown>) => [useTaskInstanceServiceGetTaskInstancesKey, 
...(queryKey ?? [{ dagId, dagIdPattern, dagRunId, durationGt, durationGte, 
durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, 
executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, 
mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, 
state, taskDisplayNamePattern, taskI [...]
 export type TaskInstanceServiceGetTaskInstanceTryDetailsDefaultResponse = 
Awaited<ReturnType<typeof TaskInstanceService.getTaskInstanceTryDetails>>;
 export type TaskInstanceServiceGetTaskInstanceTryDetailsQueryResult<TData = 
TaskInstanceServiceGetTaskInstanceTryDetailsDefaultResponse, TError = unknown> 
= UseQueryResult<TData, TError>;
 export const useTaskInstanceServiceGetTaskInstanceTryDetailsKey = 
"TaskInstanceServiceGetTaskInstanceTryDetails";
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 411f9e07a87..54c822bdc23 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/ensureQueryData.ts
@@ -291,11 +291,13 @@ export const 
ensureUseDagRunServiceGetUpstreamAssetEventsData = (queryClient: Qu
 * @param data.orderBy
 * @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @returns DAGRunCollectionResponse Successful Response
 * @throws ApiError
 */
-export const ensureUseDagRunServiceGetDagRunsData = (queryClient: QueryClient, 
{ dagId, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit, 
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, 
runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, 
startDateGt, startDateGte, startDateLt, startDateLte, state, 
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte 
}: {
+export const ensureUseDagRunServiceGetDagRunsData = (queryClient: QueryClient, 
{ dagId, dagIdPattern, dagVersion, endDateGt, endDateGte, endDateLt, 
endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt, 
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt, 
startDateLte, state, triggeringUserNamePattern, updatedAtGt, updatedAtGte, 
updatedAtLt, updatedAtLte }: {
   dagId: string;
+  dagIdPattern?: string;
   dagVersion?: number[];
   endDateGt?: string;
   endDateGte?: string;
@@ -324,7 +326,7 @@ export const ensureUseDagRunServiceGetDagRunsData = 
(queryClient: QueryClient, {
   updatedAtGte?: string;
   updatedAtLt?: string;
   updatedAtLte?: string;
-}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt, 
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte, 
startDateLt, startDateLte, state, triggeringUserNamePattern, updatedAtGt, 
updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () => 
DagRunService.getDagR [...]
+}) => queryClient.ensureQueryData({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern, 
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () => DagRunS 
[...]
 /**
 * Experimental: Wait for a dag run to complete, and return task results if 
requested.
 * 🚧 This is an experimental endpoint and may change or be removed without 
notice.Successful response are streamed as newline-delimited JSON (NDJSON). 
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const 
ensureUseTaskInstanceServiceGetMappedTaskInstanceData = (queryClien
 * @param data.durationLte
 * @param data.durationLt
 * @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.state
 * @param data.pool
 * @param data.queue
@@ -932,8 +935,9 @@ export const 
ensureUseTaskInstanceServiceGetMappedTaskInstanceData = (queryClien
 * @returns TaskInstanceCollectionResponse Successful Response
 * @throws ApiError
 */
-export const ensureUseTaskInstanceServiceGetTaskInstancesData = (queryClient: 
QueryClient, { dagId, dagRunId, durationGt, durationGte, durationLt, 
durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, 
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, 
operator, orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, 
taskDisplayNamePattern, taskId, tryNumber, upd [...]
+export const ensureUseTaskInstanceServiceGetTaskInstancesData = (queryClient: 
QueryClient, { dagId, dagIdPattern, dagRunId, durationGt, durationGte, 
durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, 
executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, 
mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, 
state, taskDisplayNamePattern, taskId,  [...]
   dagId: string;
+  dagIdPattern?: string;
   dagRunId: string;
   durationGt?: number;
   durationGte?: number;
@@ -972,7 +976,7 @@ export const 
ensureUseTaskInstanceServiceGetTaskInstancesData = (queryClient: Qu
   updatedAtLt?: string;
   updatedAtLte?: string;
   versionNumber?: number[];
-}) => queryClient.ensureQueryData({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, 
startDateGte, startDateLt, startDateLte, state, taskDisplayNamePattern, taskId, 
tryNumbe [...]
+}) => queryClient.ensureQueryData({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern, 
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, 
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, 
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, 
startDateGt, startDateGte, startDateLt, startDateLte, state, 
taskDisplayNamePattern, ta [...]
 /**
 * Get Task Instance Try Details
 * Get task instance details by try number.
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 ec223f57f5a..b267c936712 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -291,11 +291,13 @@ export const 
prefetchUseDagRunServiceGetUpstreamAssetEvents = (queryClient: Quer
 * @param data.orderBy
 * @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @returns DAGRunCollectionResponse Successful Response
 * @throws ApiError
 */
-export const prefetchUseDagRunServiceGetDagRuns = (queryClient: QueryClient, { 
dagId, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, limit, 
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, 
runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, 
startDateGt, startDateGte, startDateLt, startDateLte, state, 
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte 
}: {
+export const prefetchUseDagRunServiceGetDagRuns = (queryClient: QueryClient, { 
dagId, dagIdPattern, dagVersion, endDateGt, endDateGte, endDateLt, endDateLte, 
limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, offset, 
orderBy, runAfterGt, runAfterGte, runAfterLt, runAfterLte, runIdPattern, 
runType, startDateGt, startDateGte, startDateLt, startDateLte, state, 
triggeringUserNamePattern, updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte 
}: {
   dagId: string;
+  dagIdPattern?: string;
   dagVersion?: number[];
   endDateGt?: string;
   endDateGte?: string;
@@ -324,7 +326,7 @@ export const prefetchUseDagRunServiceGetDagRuns = 
(queryClient: QueryClient, { d
   updatedAtGte?: string;
   updatedAtLt?: string;
   updatedAtLte?: string;
-}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt, 
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte, 
startDateLt, startDateLte, state, triggeringUserNamePattern, updatedAtGt, 
updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () => 
DagRunService.getDagRun [...]
+}) => queryClient.prefetchQuery({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern, 
updatedAtGt, updatedAtGte, updatedAtLt, updatedAtLte }), queryFn: () => 
DagRunSer [...]
 /**
 * Experimental: Wait for a dag run to complete, and return task results if 
requested.
 * 🚧 This is an experimental endpoint and may change or be removed without 
notice.Successful response are streamed as newline-delimited JSON (NDJSON). 
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstance = (queryClient:
 * @param data.durationLte
 * @param data.durationLt
 * @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.state
 * @param data.pool
 * @param data.queue
@@ -932,8 +935,9 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstance = (queryClient:
 * @returns TaskInstanceCollectionResponse Successful Response
 * @throws ApiError
 */
-export const prefetchUseTaskInstanceServiceGetTaskInstances = (queryClient: 
QueryClient, { dagId, dagRunId, durationGt, durationGte, durationLt, 
durationLte, endDateGt, endDateGte, endDateLt, endDateLte, executor, limit, 
logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, 
operator, orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, state, 
taskDisplayNamePattern, taskId, tryNumber, updat [...]
+export const prefetchUseTaskInstanceServiceGetTaskInstances = (queryClient: 
QueryClient, { dagId, dagIdPattern, dagRunId, durationGt, durationGte, 
durationLt, durationLte, endDateGt, endDateGte, endDateLt, endDateLte, 
executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, logicalDateLte, 
mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, startDateGt, startDateGte, startDateLt, startDateLte, 
state, taskDisplayNamePattern, taskId, tr [...]
   dagId: string;
+  dagIdPattern?: string;
   dagRunId: string;
   durationGt?: number;
   durationGte?: number;
@@ -972,7 +976,7 @@ export const prefetchUseTaskInstanceServiceGetTaskInstances 
= (queryClient: Quer
   updatedAtLt?: string;
   updatedAtLte?: string;
   versionNumber?: number[];
-}) => queryClient.prefetchQuery({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt, 
startDateGte, startDateLt, startDateLte, state, taskDisplayNamePattern, taskId, 
tryNumber, [...]
+}) => queryClient.prefetchQuery({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern, 
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, 
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, 
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, 
startDateGt, startDateGte, startDateLt, startDateLte, state, 
taskDisplayNamePattern, task [...]
 /**
 * Get Task Instance Try Details
 * Get task instance details by try number.
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 556d7932d60..62e4fc99d36 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/queries.ts
@@ -291,11 +291,13 @@ export const useDagRunServiceGetUpstreamAssetEvents = 
<TData = Common.DagRunServ
 * @param data.orderBy
 * @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @returns DAGRunCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDagRunServiceGetDagRuns = <TData = 
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey 
extends Array<unknown> = unknown[]>({ dagId, dagVersion, endDateGt, endDateGte, 
endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt, 
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt, 
startDateLte, state, triggeringUserNamePattern, updatedAtGt, upd [...]
+export const useDagRunServiceGetDagRuns = <TData = 
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey 
extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePattern, up 
[...]
   dagId: string;
+  dagIdPattern?: string;
   dagVersion?: number[];
   endDateGt?: string;
   endDateGte?: string;
@@ -324,7 +326,7 @@ export const useDagRunServiceGetDagRuns = <TData = 
Common.DagRunServiceGetDagRun
   updatedAtGte?: string;
   updatedAtLt?: string;
   updatedAtLte?: string;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt, 
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte, 
startDateLt, startDateLte, state, triggeringUserNamePattern, upd [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNa [...]
 /**
 * Experimental: Wait for a dag run to complete, and return task results if 
requested.
 * 🚧 This is an experimental endpoint and may change or be removed without 
notice.Successful response are streamed as newline-delimited JSON (NDJSON). 
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const useTaskInstanceServiceGetMappedTaskInstance = 
<TData = Common.TaskI
 * @param data.durationLte
 * @param data.durationLt
 * @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.state
 * @param data.pool
 * @param data.queue
@@ -932,8 +935,9 @@ export const useTaskInstanceServiceGetMappedTaskInstance = 
<TData = Common.TaskI
 * @returns TaskInstanceCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useTaskInstanceServiceGetTaskInstances = <TData = 
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagRunId, durationGt, 
durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt, 
endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, 
logicalDateLte, mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, startDateGt, [...]
+export const useTaskInstanceServiceGetTaskInstances = <TData = 
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte [...]
   dagId: string;
+  dagIdPattern?: string;
   dagRunId: string;
   durationGt?: number;
   durationGte?: number;
@@ -972,7 +976,7 @@ export const useTaskInstanceServiceGetTaskInstances = 
<TData = Common.TaskInstan
   updatedAtLt?: string;
   updatedAtLte?: string;
   versionNumber?: number[];
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, startDateGt [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useQuery<TData, TError>({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern, 
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, 
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, 
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, runAfterLt [...]
 /**
 * Get Task Instance Try Details
 * Get task instance details by try number.
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 433fad2caa6..5fafc55f54a 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/queries/suspense.ts
@@ -291,11 +291,13 @@ export const 
useDagRunServiceGetUpstreamAssetEventsSuspense = <TData = Common.Da
 * @param data.orderBy
 * @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @returns DAGRunCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useDagRunServiceGetDagRunsSuspense = <TData = 
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey 
extends Array<unknown> = unknown[]>({ dagId, dagVersion, endDateGt, endDateGte, 
endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, logicalDateLt, 
logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, runAfterLt, 
runAfterLte, runIdPattern, runType, startDateGt, startDateGte, startDateLt, 
startDateLte, state, triggeringUserNamePattern, updatedA [...]
+export const useDagRunServiceGetDagRunsSuspense = <TData = 
Common.DagRunServiceGetDagRunsDefaultResponse, TError = unknown, TQueryKey 
extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeringUserNamePat [...]
   dagId: string;
+  dagIdPattern?: string;
   dagVersion?: number[];
   endDateGt?: string;
   endDateGte?: string;
@@ -324,7 +326,7 @@ export const useDagRunServiceGetDagRunsSuspense = <TData = 
Common.DagRunServiceG
   updatedAtGte?: string;
   updatedAtLt?: string;
   updatedAtLte?: string;
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagVersion, endDateGt, 
endDateGte, endDateLt, endDateLte, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, runAfterGte, 
runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, startDateGte, 
startDateLt, startDateLte, state, triggeringUserNamePatt [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseDagRunServiceGetDagRunsKeyFn({ dagId, dagIdPattern, dagVersion, 
endDateGt, endDateGte, endDateLt, endDateLte, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, offset, orderBy, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, runIdPattern, runType, startDateGt, 
startDateGte, startDateLt, startDateLte, state, triggeri [...]
 /**
 * Experimental: Wait for a dag run to complete, and return task results if 
requested.
 * 🚧 This is an experimental endpoint and may change or be removed without 
notice.Successful response are streamed as newline-delimited JSON (NDJSON). 
Each line is a JSON object representing the DAG run state.
@@ -918,6 +920,7 @@ export const 
useTaskInstanceServiceGetMappedTaskInstanceSuspense = <TData = Comm
 * @param data.durationLte
 * @param data.durationLt
 * @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+* @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards (e.g. 
`%customer_%`). Regular expressions are **not** supported.
 * @param data.state
 * @param data.pool
 * @param data.queue
@@ -932,8 +935,9 @@ export const 
useTaskInstanceServiceGetMappedTaskInstanceSuspense = <TData = Comm
 * @returns TaskInstanceCollectionResponse Successful Response
 * @throws ApiError
 */
-export const useTaskInstanceServiceGetTaskInstancesSuspense = <TData = 
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagRunId, durationGt, 
durationGte, durationLt, durationLte, endDateGt, endDateGte, endDateLt, 
endDateLte, executor, limit, logicalDateGt, logicalDateGte, logicalDateLt, 
logicalDateLte, mapIndex, offset, operator, orderBy, pool, queue, runAfterGt, 
runAfterGte, runAfterLt, runAfterLte, star [...]
+export const useTaskInstanceServiceGetTaskInstancesSuspense = <TData = 
Common.TaskInstanceServiceGetTaskInstancesDefaultResponse, TError = unknown, 
TQueryKey extends Array<unknown> = unknown[]>({ dagId, dagIdPattern, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, run [...]
   dagId: string;
+  dagIdPattern?: string;
   dagRunId: string;
   durationGt?: number;
   durationGte?: number;
@@ -972,7 +976,7 @@ export const useTaskInstanceServiceGetTaskInstancesSuspense 
= <TData = Common.Ta
   updatedAtLt?: string;
   updatedAtLte?: string;
   versionNumber?: number[];
-}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId, 
durationGt, durationGte, durationLt, durationLte, endDateGt, endDateGte, 
endDateLt, endDateLte, executor, limit, logicalDateGt, logicalDateGte, 
logicalDateLt, logicalDateLte, mapIndex, offset, operator, orderBy, pool, 
queue, runAfterGt, runAfterGte, runAfterLt, runAfterLte, sta [...]
+}, queryKey?: TQueryKey, options?: Omit<UseQueryOptions<TData, TError>, 
"queryKey" | "queryFn">) => useSuspenseQuery<TData, TError>({ queryKey: 
Common.UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagIdPattern, 
dagRunId, durationGt, durationGte, durationLt, durationLte, endDateGt, 
endDateGte, endDateLt, endDateLte, executor, limit, logicalDateGt, 
logicalDateGte, logicalDateLt, logicalDateLte, mapIndex, offset, operator, 
orderBy, pool, queue, runAfterGt, runAfterGte, runAfterLt, ru [...]
 /**
 * Get Task Instance Try Details
 * Get task instance details by try number.
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 6d674b9fa5e..292be91e27b 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
@@ -1002,6 +1002,7 @@ export class DagRunService {
      * @param data.orderBy
      * @param data.runIdPattern SQL LIKE expression — use `%` / `_` wildcards 
(e.g. `%customer_%`). Regular expressions are **not** supported.
      * @param data.triggeringUserNamePattern SQL LIKE expression — use `%` / 
`_` wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+     * @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards 
(e.g. `%customer_%`). Regular expressions are **not** supported.
      * @returns DAGRunCollectionResponse Successful Response
      * @throws ApiError
      */
@@ -1040,7 +1041,8 @@ export class DagRunService {
                 dag_version: data.dagVersion,
                 order_by: data.orderBy,
                 run_id_pattern: data.runIdPattern,
-                triggering_user_name_pattern: data.triggeringUserNamePattern
+                triggering_user_name_pattern: data.triggeringUserNamePattern,
+                dag_id_pattern: data.dagIdPattern
             },
             errors: {
                 401: 'Unauthorized',
@@ -2344,6 +2346,7 @@ export class TaskInstanceService {
      * @param data.durationLte
      * @param data.durationLt
      * @param data.taskDisplayNamePattern SQL LIKE expression — use `%` / `_` 
wildcards (e.g. `%customer_%`). Regular expressions are **not** supported.
+     * @param data.dagIdPattern SQL LIKE expression — use `%` / `_` wildcards 
(e.g. `%customer_%`). Regular expressions are **not** supported.
      * @param data.state
      * @param data.pool
      * @param data.queue
@@ -2393,6 +2396,7 @@ export class TaskInstanceService {
                 duration_lte: data.durationLte,
                 duration_lt: data.durationLt,
                 task_display_name_pattern: data.taskDisplayNamePattern,
+                dag_id_pattern: data.dagIdPattern,
                 state: data.state,
                 pool: data.pool,
                 queue: data.queue,
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 e4403b35273..228b26620d4 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
@@ -2245,6 +2245,10 @@ export type ClearDagRunResponse = 
TaskInstanceCollectionResponse | DAGRunRespons
 
 export type GetDagRunsData = {
     dagId: string;
+    /**
+     * SQL LIKE expression — use `%` / `_` wildcards (e.g. `%customer_%`). 
Regular expressions are **not** supported.
+     */
+    dagIdPattern?: string | null;
     dagVersion?: Array<(number)>;
     endDateGt?: string | null;
     endDateGte?: string | null;
@@ -2702,6 +2706,10 @@ export type PatchTaskInstanceByMapIndexResponse = 
TaskInstanceCollectionResponse
 
 export type GetTaskInstancesData = {
     dagId: string;
+    /**
+     * SQL LIKE expression — use `%` / `_` wildcards (e.g. `%customer_%`). 
Regular expressions are **not** supported.
+     */
+    dagIdPattern?: string | null;
     dagRunId: string;
     durationGt?: number | null;
     durationGte?: number | null;
diff --git a/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx 
b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
index 11c660eef99..4ab1c1d81a6 100644
--- a/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/DagRuns.tsx
@@ -48,6 +48,7 @@ import { renderDuration, useAutoRefresh, isStatePending } 
from "src/utils";
 
 type DagRunRow = { row: { original: DAGRunResponse } };
 const {
+  DAG_ID_PATTERN: DAG_ID_PATTERN_PARAM,
   END_DATE: END_DATE_PARAM,
   RUN_ID_PATTERN: RUN_ID_PATTERN_PARAM,
   RUN_TYPE: RUN_TYPE_PARAM,
@@ -189,6 +190,7 @@ export const DagRuns = () => {
   const filteredType = searchParams.get(RUN_TYPE_PARAM);
   const filteredRunIdPattern = searchParams.get(RUN_ID_PATTERN_PARAM);
   const filteredTriggeringUserNamePattern = 
searchParams.get(TRIGGERING_USER_NAME_PATTERN_PARAM);
+  const filteredDagIdPattern = searchParams.get(DAG_ID_PATTERN_PARAM);
   const startDate = searchParams.get(START_DATE_PARAM);
   const endDate = searchParams.get(END_DATE_PARAM);
 
@@ -197,6 +199,7 @@ export const DagRuns = () => {
   const { data, error, isLoading } = useDagRunServiceGetDagRuns(
     {
       dagId: dagId ?? "~",
+      dagIdPattern: filteredDagIdPattern ?? undefined,
       endDateLte: endDate ?? undefined,
       limit: pageSize,
       offset: pageIndex * pageSize,
@@ -282,9 +285,36 @@ export const DagRuns = () => {
     [pagination, searchParams, setSearchParams, setTableURLState, sorting],
   );
 
+  const handleDagIdPatternChange = useCallback(
+    (value: string) => {
+      if (value === "") {
+        searchParams.delete(DAG_ID_PATTERN_PARAM);
+      } else {
+        searchParams.set(DAG_ID_PATTERN_PARAM, value);
+      }
+      setTableURLState({
+        pagination: { ...pagination, pageIndex: 0 },
+        sorting,
+      });
+      setSearchParams(searchParams);
+    },
+    [pagination, searchParams, setSearchParams, setTableURLState, sorting],
+  );
+
   return (
     <>
       <HStack paddingY="4px">
+        {dagId === undefined && (
+          <Box>
+            <SearchBar
+              defaultValue={filteredDagIdPattern ?? ""}
+              hideAdvanced
+              hotkeyDisabled={true}
+              onChange={handleDagIdPatternChange}
+              placeHolder={translate("dags:search.dags")}
+            />
+          </Box>
+        )}
         <Box>
           <SearchBar
             defaultValue={filteredRunIdPattern ?? ""}
diff --git 
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx 
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
index 10e494d7d27..091760588f1 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstances.tsx
@@ -44,6 +44,7 @@ import { TaskInstancesFilter } from "./TaskInstancesFilter";
 type TaskInstanceRow = { row: { original: TaskInstanceResponse } };
 
 const {
+  DAG_ID_PATTERN: DAG_ID_PATTERN_PARAM,
   END_DATE: END_DATE_PARAM,
   NAME_PATTERN: NAME_PATTERN_PARAM,
   POOL: POOL_PARAM,
@@ -205,6 +206,7 @@ export const TaskInstances = () => {
   const startDate = searchParams.get(START_DATE_PARAM);
   const endDate = searchParams.get(END_DATE_PARAM);
   const pool = searchParams.getAll(POOL_PARAM);
+  const filteredDagIdPattern = searchParams.get(DAG_ID_PATTERN_PARAM);
   const hasFilteredState = filteredState.length > 0;
   const hasFilteredPool = pool.length > 0;
 
@@ -217,6 +219,7 @@ export const TaskInstances = () => {
   const { data, error, isLoading } = useTaskInstanceServiceGetTaskInstances(
     {
       dagId: dagId ?? "~",
+      dagIdPattern: filteredDagIdPattern ?? undefined,
       dagRunId: runId ?? "~",
       endDateLte: endDate ?? undefined,
       limit: pagination.pageSize,
diff --git 
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx 
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
index c7834e4aab2..f7295080b7d 100644
--- 
a/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
+++ 
b/airflow-core/src/airflow/ui/src/pages/TaskInstances/TaskInstancesFilter.tsx
@@ -29,7 +29,11 @@ import { Select } from "src/components/ui";
 import { SearchParamsKeys, type SearchParamsKeysType } from 
"src/constants/searchParams";
 import { taskInstanceStateOptions } from "src/constants/stateOptions";
 
-const { NAME_PATTERN: NAME_PATTERN_PARAM, STATE: STATE_PARAM }: 
SearchParamsKeysType = SearchParamsKeys;
+const {
+  DAG_ID_PATTERN: DAG_ID_PATTERN_PARAM,
+  NAME_PATTERN: NAME_PATTERN_PARAM,
+  STATE: STATE_PARAM,
+}: SearchParamsKeysType = SearchParamsKeys;
 
 export const TaskInstancesFilter = ({
   setTaskDisplayNamePattern,
@@ -38,13 +42,14 @@ export const TaskInstancesFilter = ({
   readonly setTaskDisplayNamePattern: 
React.Dispatch<React.SetStateAction<string | undefined>>;
   readonly taskDisplayNamePattern: string | undefined;
 }) => {
-  const { runId } = useParams();
+  const { dagId, runId } = useParams();
   const [searchParams, setSearchParams] = useSearchParams();
   const { setTableURLState, tableURLState } = useTableURLState();
   const { pagination, sorting } = tableURLState;
   const { t: translate } = useTranslation();
 
   const filteredState = searchParams.getAll(STATE_PARAM);
+  const filteredDagIdPattern = searchParams.get(DAG_ID_PATTERN_PARAM);
   const hasFilteredState = filteredState.length > 0;
 
   const handleStateChange = useCallback(
@@ -80,8 +85,34 @@ export const TaskInstancesFilter = ({
     setSearchParams(searchParams);
   };
 
+  const handleDagIdPatternChange = useCallback(
+    (value: string) => {
+      if (value === "") {
+        searchParams.delete(DAG_ID_PATTERN_PARAM);
+      } else {
+        searchParams.set(DAG_ID_PATTERN_PARAM, value);
+      }
+      setTableURLState({
+        pagination: { ...pagination, pageIndex: 0 },
+        sorting,
+      });
+      setSearchParams(searchParams);
+    },
+    [pagination, searchParams, setSearchParams, setTableURLState, sorting],
+  );
+
   return (
     <HStack paddingY="4px">
+      {dagId === undefined && (
+        <SearchBar
+          buttonProps={{ disabled: true }}
+          defaultValue={filteredDagIdPattern ?? ""}
+          hideAdvanced
+          hotkeyDisabled={true}
+          onChange={handleDagIdPatternChange}
+          placeHolder={translate("dags:search.dags")}
+        />
+      )}
       <SearchBar
         buttonProps={{ disabled: true }}
         defaultValue={taskDisplayNamePattern ?? ""}
diff --git 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
index c6069426937..11ef75674be 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_dag_run.py
@@ -591,6 +591,22 @@ class TestGetDagRuns:
                 },
                 [DAG1_RUN1_ID],
             ),
+            # Test dag_id_pattern filter
+            ("~", {"dag_id_pattern": "test_dag1"}, [DAG1_RUN1_ID, 
DAG1_RUN2_ID]),
+            ("~", {"dag_id_pattern": "test_dag2"}, [DAG2_RUN1_ID, 
DAG2_RUN2_ID]),
+            ("~", {"dag_id_pattern": "test_%"}, [DAG1_RUN1_ID, DAG1_RUN2_ID, 
DAG2_RUN1_ID, DAG2_RUN2_ID]),
+            ("~", {"dag_id_pattern": "%_dag1"}, [DAG1_RUN1_ID, DAG1_RUN2_ID]),
+            ("~", {"dag_id_pattern": "%_dag2"}, [DAG2_RUN1_ID, DAG2_RUN2_ID]),
+            ("~", {"dag_id_pattern": "test_dag_"}, [DAG1_RUN1_ID, 
DAG1_RUN2_ID, DAG2_RUN1_ID, DAG2_RUN2_ID]),
+            ("~", {"dag_id_pattern": "nonexistent"}, []),
+            (
+                "~",
+                {
+                    "dag_id_pattern": "test_dag1",
+                    "state": DagRunState.SUCCESS.value,
+                },
+                [DAG1_RUN1_ID],
+            ),
             # Test dag_version filter
             (
                 DAG1_ID,
diff --git 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
index 191276ea74b..0f26235088a 100644
--- 
a/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
+++ 
b/airflow-core/tests/unit/api_fastapi/core_api/routes/public/test_task_instances.py
@@ -1244,17 +1244,57 @@ class TestGetTaskInstances(TestTaskInstanceEndpoint):
                 2,
                 id="test map_index filter",
             ),
+            pytest.param(
+                "dag_id_pattern_test",  # Special marker for multi-DAG test
+                False,
+                "/dags/~/dagRuns/~/taskInstances",
+                {"dag_id_pattern": "example_python_operator"},
+                9,  # Based on test failure - example_python_operator creates 
9 task instances
+                id="test dag_id_pattern exact match",
+            ),
+            pytest.param(
+                "dag_id_pattern_test",  # Special marker for multi-DAG test
+                False,
+                "/dags/~/dagRuns/~/taskInstances",
+                {"dag_id_pattern": "example_%"},
+                17,  # Based on test failure - both DAGs together create 17 
task instances
+                id="test dag_id_pattern wildcard prefix",
+            ),
+            pytest.param(
+                "dag_id_pattern_test",  # Special marker for multi-DAG test
+                False,
+                "/dags/~/dagRuns/~/taskInstances",
+                {"dag_id_pattern": "%skip%"},
+                8,  # Based on test failure - example_skip_dag creates 8 task 
instances
+                id="test dag_id_pattern wildcard contains",
+            ),
+            pytest.param(
+                "dag_id_pattern_test",  # Special marker for multi-DAG test
+                False,
+                "/dags/~/dagRuns/~/taskInstances",
+                {"dag_id_pattern": "nonexistent"},
+                0,
+                id="test dag_id_pattern no match",
+            ),
         ],
     )
     @pytest.mark.usefixtures("make_dag_with_multiple_versions")
     def test_should_respond_200(
         self, test_client, task_instances, update_extras, url, params, 
expected_ti, session
     ):
-        self.create_task_instances(
-            session,
-            update_extras=update_extras,
-            task_instances=task_instances,
-        )
+        # Special handling for dag_id_pattern tests that require multiple DAGs
+        if task_instances == "dag_id_pattern_test":
+            # Create task instances for multiple DAGs like the original 
test_dag_id_pattern_filter
+            dag1_id = "example_python_operator"
+            dag2_id = "example_skip_dag"
+            self.create_task_instances(session, dag_id=dag1_id)
+            self.create_task_instances(session, dag_id=dag2_id)
+        else:
+            self.create_task_instances(
+                session,
+                update_extras=update_extras,
+                task_instances=task_instances,
+            )
         with 
mock.patch("airflow.api_fastapi.core_api.datamodels.dag_versions.DagBundlesManager"):
             # Mock DagBundlesManager to avoid checking if dags-folder bundle 
is configured
             response = test_client.get(url, params=params)

Reply via email to