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

Lee-W 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 1a1c91ba84e Add an Examples entry point to the common.ai provider docs 
(#69650)
1a1c91ba84e is described below

commit 1a1c91ba84e8b86d04f470c3982d6f215f518e65
Author: Wei Lee <[email protected]>
AuthorDate: Fri Jul 10 09:32:43 2026 +0800

    Add an Examples entry point to the common.ai provider docs (#69650)
---
 providers/common/ai/docs/end_to_end_pipelines.rst | 176 ++++++++++++++++++++++
 providers/common/ai/docs/examples.rst             | 148 ++++++++++++++++++
 providers/common/ai/docs/index.rst                |   1 +
 3 files changed, 325 insertions(+)

diff --git a/providers/common/ai/docs/end_to_end_pipelines.rst 
b/providers/common/ai/docs/end_to_end_pipelines.rst
new file mode 100644
index 00000000000..4ddc06a621e
--- /dev/null
+++ b/providers/common/ai/docs/end_to_end_pipelines.rst
@@ -0,0 +1,176 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+ ..   http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+End-to-End Pipelines
+=====================
+
+The Dags in this guide combine several patterns from the operator and hook 
guides into one
+production-shaped pipeline. Each section explains the architecture -- how the 
Dags are split,
+why, and how the pieces are wired together -- rather than the mechanics of a 
single operator,
+which the linked guides already cover. Read the full source for the runnable 
Dag.
+
+LlamaIndex RAG shapes
+-----------------------
+
+`example_llamaindex_rag.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llamaindex_rag.py>`__
+walks the same load -> embed -> retrieve -> answer pattern through three 
shapes, from simplest to
+production-shaped:
+
+- ``example_llamaindex_rag_pipeline`` (``schedule=None``) -- everything in one 
Dag:
+  ``DocumentLoaderOperator`` parses local files, 
``LlamaIndexEmbeddingOperator`` chunks and
+  persists the index, ``LlamaIndexRetrievalOperator`` retrieves for a fixed 
question, and an
+  ``LLMOperator`` synthesizes the answer.
+- ``example_llamaindex_index_pdf`` / ``example_llamaindex_query`` -- the 
load/embed step moved
+  into its own weekly Dag (``schedule="@weekly"``) so the index stays fresh as 
PDFs arrive, while
+  a second Dag (``schedule=None``, triggered with a ``question`` param) 
retrieves and answers on
+  demand against the persisted index -- the same index/query split the SEC 
10-K pipelines below
+  use, without their multi-company retrieval fan-out.
+- ``example_llamaindex_multi_source`` -- two ``DocumentLoaderOperator`` calls 
tag documents from
+  different sources via ``metadata_fields`` before merging and embedding them 
into one index, for
+  filtered retrieval downstream.
+
+See :doc:`operators/document_loader`, :doc:`operators/llamaindex_embedding`, 
and
+:doc:`operators/llamaindex_retrieval` for how the individual operators work.
+
+SEC 10-K financial analysis
+----------------------------
+
+`example_llamaindex_10k.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llamaindex_10k.py>`__
 and
+`example_langchain_10k.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_langchain_10k.py>`__
+compare companies' SEC 10-K filings, fetched live from EDGAR. Each file splits 
the work into two
+Dags:
+
+- An **indexing Dag** (``schedule="@weekly"``) that fetches each company's 
latest 10-K and
+  persists an index per ticker to disk.
+- An **analysis Dag** (``schedule=None``, triggered manually or on demand) 
that decomposes a
+  comparison question, retrieves against the indexes, and produces a reviewed 
report.
+
+The two Dags are not linked by an Asset or XCom -- they agree only on a shared 
on-disk index
+path (``INDEX_BASE_DIR/{ticker}``). Run the indexing Dag at least once before 
triggering
+analysis for a given company.
+
+Both files build the same analysis shape; the only structural difference is 
that LlamaIndex has
+dedicated ``LlamaIndexEmbeddingOperator``/``LlamaIndexRetrievalOperator`` 
classes, while
+LangChain does not yet, so the LangChain file's indexing and retrieval steps 
are plain ``@task``
+functions calling 
:class:`~airflow.providers.common.ai.hooks.langchain.LangChainHook` and FAISS
+directly.
+
+Analysis Dag flow:
+
+1. A human confirms or edits the comparison question and the tickers to compare
+   (``HITLEntryOperator``).
+2. ``@task.llm`` decomposes the question into one sub-question per company -- 
the LLM decides how
+   many sub-questions are needed, not the Dag author:
+
+   .. exampleinclude:: 
/../../ai/src/airflow/providers/common/ai/example_dags/example_llamaindex_10k.py
+       :language: python
+       :start-after: [START 10k_decompose]
+       :end-before: [END 10k_decompose]
+
+3. Dynamic Task Mapping fans retrieval out, one mapped task per sub-question, 
each querying that
+   company's index:
+
+   .. exampleinclude:: 
/../../ai/src/airflow/providers/common/ai/example_dags/example_llamaindex_10k.py
+       :language: python
+       :start-after: [START 10k_dtm_retrieval]
+       :end-before: [END 10k_dtm_retrieval]
+
+4. The mapped results are zipped back to their sub-questions (mapped task 
outputs preserve input
+   order) and synthesized into a structured ``AnalysisReport`` by an 
``LLMOperator`` bounded by
+   ``UsageLimits``.
+5. ``ApprovalOperator`` gates the report before hand-off.
+
+See :doc:`operators/llamaindex_embedding`, 
:doc:`operators/llamaindex_retrieval`, and
+:doc:`hooks/langchain` for how the individual operators/hooks behave.
+
+Natural-language survey analysis
+----------------------------------
+
+`example_llm_survey_analysis.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_analysis.py>`__
+answers natural-language questions over a CSV with the same core three tasks --
+``LLMSQLQueryOperator`` generates SQL, ``AnalyticsOperator`` runs it, a 
``@task`` extracts the
+rows (see :doc:`operators/llm_sql` for how those two operators work together). 
The file defines
+two Dags around that core, shaped for different operating modes:
+
+- ``example_llm_survey_interactive`` (``schedule=None``) -- a human confirms 
or edits the
+  question before SQL generation (``HITLEntryOperator``) and approves the 
extracted result
+  afterward (``ApprovalOperator``). It assumes the CSV is already in place.
+- ``example_llm_survey_scheduled`` (``schedule="@monthly"``) -- downloads the 
CSV itself
+  (``HttpOperator``), validates its schema against a reference CSV
+  (``LLMSchemaCompareOperator``) before generating SQL, and ends by emailing 
or logging the
+  result. No human gate -- suited to recurring reporting.
+
+Agentic multi-dimensional survey synthesis
+---------------------------------------------
+
+`example_llm_survey_agentic.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_agentic.py>`__
+answers a research question that a single SQL query cannot -- one that spans 
several
+dimensions (executor, deployment, cloud, Airflow version) -- by fanning both 
SQL generation and
+execution out with Dynamic Task Mapping, one mapped pair per dimension, then 
synthesizing:
+
+1. ``decompose_question`` returns one sub-question per dimension.
+2. ``LLMSQLQueryOperator.partial(...).expand(prompt=sub_questions)`` generates 
SQL for each
+   dimension as an independent mapped task instance.
+3. ``AnalyticsOperator.partial(...).expand(...)`` runs each query. If one 
dimension's query
+   fails, only that mapped instance retries -- the other three keep their 
results.
+4. ``collect_results`` zips the dimension labels back onto the 
(order-preserved) results.
+5. An ``LLMOperator`` synthesizes the four labeled result sets into one 
narrative, then
+   ``ApprovalOperator`` gates it.
+
+The Dag's own docstring explains the reasoning for fanning out rather than 
looping inside a
+single LLM call: each sub-query becomes a named, logged task instance instead 
of a hidden tool
+call, so a failure is isolated and retryable, and every intermediate result is 
visible in XCom
+instead of being an opaque step inside an LLM reasoning loop.
+
+AIP progress tracking: pipeline vs. agent
+--------------------------------------------
+
+`example_aip_progress_tracker.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_aip_progress_tracker.py>`__
+tracks the same thing -- progress on a set of Airflow Improvement Proposals, 
checked against
+Confluence specs and GitHub activity -- with two different architectures, to 
compare the tradeoff directly:
+
+- ``example_aip_progress_tracker`` -- a **deterministic pipeline**. Evidence 
is gathered by
+  fixed tasks; dynamically-mapped ``LLMOperator`` calls analyze each AIP with 
structured output;
+  the per-AIP analyses are synthesized into one report; a second 
``LLMOperator`` validates that
+  synthesis against the raw evidence and flags unsupported claims; a 
plain-Python task applies
+  only the flagged corrections mechanically (string/regex replacement, no LLM 
involved); a human
+  reviews the corrected report.
+- ``example_aip_progress_tracker_skills`` -- an **autonomous agent**. A single 
``AgentOperator``
+  loaded with an Agent Skill (``AgentSkillsToolset``) and a handful of custom 
tool functions
+  decides its own evidence-gathering strategy and tool-call order, then the 
same human review
+  gate.
+
+The pipeline's three-layer defense against hallucination is the pattern worth 
taking away:
+structured LLM output, then a second LLM call whose only job is to judge the 
first against the
+original evidence, then a deterministic (non-LLM) step that applies exactly 
what was flagged:
+
+.. exampleinclude:: 
/../../ai/src/airflow/providers/common/ai/example_dags/example_aip_progress_tracker.py
+    :language: python
+    :start-after: [START aip_tracker_validation]
+    :end-before: [END aip_tracker_validation]
+
+The agent variant collapses that whole graph into one operator call, trading 
auditability of
+each step for simplicity and letting the model decide how to use its tools:
+
+.. exampleinclude:: 
/../../ai/src/airflow/providers/common/ai/example_dags/example_aip_progress_tracker.py
+    :language: python
+    :start-after: [START aip_tracker_skills_operator]
+    :end-before: [END aip_tracker_skills_operator]
+
+Reach for the pipeline when accuracy matters and every step needs to be 
auditable; reach for the
+agent when the problem is open-ended enough that a fixed task graph would just 
be re-encoding
+what the model can already work out from the skill instructions.
diff --git a/providers/common/ai/docs/examples.rst 
b/providers/common/ai/docs/examples.rst
new file mode 100644
index 00000000000..a74550d5e60
--- /dev/null
+++ b/providers/common/ai/docs/examples.rst
@@ -0,0 +1,148 @@
+ .. Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+ ..   http://www.apache.org/licenses/LICENSE-2.0
+
+ .. Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+.. _howto/examples:
+
+Examples
+========
+
+Every operator, decorator, and integration in this provider has a runnable Dag 
under
+`example_dags 
<https://github.com/apache/airflow/tree/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags>`__.
+This page groups them by scenario. Guides embed the same Dags inline where a 
step-by-step
+walkthrough exists; the rest are linked directly to source below.
+
+New to the provider? Start with :doc:`operators/index` to pick an operator, 
then come back here
+for a worked example of the pattern you need.
+
+Single-prompt tasks
+--------------------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Guide
+     - What it shows
+   * - :doc:`operators/llm`
+     - ``@task.llm`` for text, structured output, classification, and dynamic 
task mapping over
+       LLM results
+       (`example_llm.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm.py>`__,
+       `example_llm_classification.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_classification.py>`__,
+       `example_llm_analysis_pipeline.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_analysis_pipeline.py>`__).
+   * - :doc:`operators/llm_branch`
+     - ``@task.llm_branch`` picking which downstream task runs.
+   * - :doc:`operators/llm_file_analysis`
+     - ``@task.llm_file_analysis`` reasoning over files, images, and PDFs.
+   * - :doc:`operators/llm_schema_compare`
+     - ``@task.llm_schema_compare`` comparing two schemas with an LLM.
+   * - :doc:`operators/llm_sql`
+     - ``@task.llm_sql`` generating SQL from a natural-language question.
+
+Agents & tools
+--------------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Guide
+     - What it shows
+   * - :doc:`operators/agent`
+     - ``AgentOperator`` / ``@task.agent`` multi-turn tool use, durable 
execution, and pydantic-ai
+       capabilities
+       (`example_agent.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_agent.py>`__,
+       `example_agent_durable.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_agent_durable.py>`__,
+       `example_agent_capabilities.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_agent_capabilities.py>`__).
+   * - :ref:`Toolsets <howto/toolsets>`
+     - Loading ``SKILL.md`` Agent Skills
+       (`example_agent_skills.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_agent_skills.py>`__)
+       and exposing an Airflow toolset to a LangChain agent, the reverse bridge
+       (`example_langchain_toolset_bridge.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_langchain_toolset_bridge.py>`__).
+   * - :doc:`connections/mcp`
+     - Connecting an agent to an MCP server through an Airflow connection.
+   * - :doc:`hitl_review`
+     - Adding a human-in-the-loop review gate to agent output.
+   * - `example_langchain_tool_agent.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_langchain_tool_agent.py>`__
+     - A LangChain ReAct agent that decides its own tool calls, composed with 
``LLMOperator`` for
+       report formatting and AIP-90 HITL review.
+
+Retrieval & document processing
+--------------------------------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Guide
+     - What it shows
+   * - :doc:`operators/document_loader`
+     - Parsing PDF, DOCX, CSV, and JSON into ``list[dict]`` for embedding.
+   * - :doc:`hooks/pydantic_ai`
+     - Calling ``PydanticAIHook`` and a pydantic-ai ``Agent`` directly.
+   * - :doc:`hooks/langchain`
+     - ``LangChainHook`` chat-only, embedding-only, and combined patterns.
+   * - :doc:`hooks/llamaindex`
+     - ``LlamaIndexHook`` plus the embedding and retrieval operators.
+
+End-to-end scenarios
+---------------------
+
+Production-shaped Dags that combine several of the patterns above into one 
pipeline. See
+:doc:`end_to_end_pipelines` for the architecture behind each one.
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Example
+     - What it shows
+   * - `example_llamaindex_rag.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llamaindex_rag.py>`__
+     - Three RAG shapes with LlamaIndex: a single load-embed-retrieve-answer 
Dag, a production-shaped
+       split into scheduled indexing plus on-demand query Dags, and 
multi-source RAG.
+   * - `example_llamaindex_10k.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llamaindex_10k.py>`__,
+       `example_langchain_10k.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_langchain_10k.py>`__
+     - SEC 10-K financial analysis against live EDGAR filings: one Dag indexes 
filings on a
+       schedule, the other decomposes a comparison question at runtime and 
fans out retrieval with
+       Dynamic Task Mapping. One variant per RAG library.
+   * - `example_llm_survey_analysis.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_analysis.py>`__
+     - Natural-language querying of a CSV via ``LLMSQLQueryOperator`` and 
``AnalyticsOperator``,
+       interactive and scheduled variants.
+   * - `example_llm_survey_agentic.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_survey_agentic.py>`__
+     - The same survey data, analyzed by fanning a multi-dimensional research 
question into an
+       agentic multi-query synthesis pipeline.
+   * - `example_aip_progress_tracker.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_aip_progress_tracker.py>`__
+     - The same use case -- tracking Airflow Improvement Proposal progress -- 
solved two ways, a
+       deterministic pipeline and an autonomous agent, to compare the tradeoff.
+
+Reliability
+-----------
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Guide
+     - What it shows
+   * - :doc:`retry_policies`
+     - Classifying task failures with an LLM to decide retry, fail, or delay. 
Source:
+       `example_llm_retry_policy.py 
<https://github.com/apache/airflow/blob/providers-common-ai/|version|/providers/common/ai/src/airflow/providers/common/ai/example_dags/example_llm_retry_policy.py>`__.
+
+.. toctree::
+    :hidden:
+    :maxdepth: 1
+
+    end_to_end_pipelines
diff --git a/providers/common/ai/docs/index.rst 
b/providers/common/ai/docs/index.rst
index eb1f768de60..c01522e37f7 100644
--- a/providers/common/ai/docs/index.rst
+++ b/providers/common/ai/docs/index.rst
@@ -79,6 +79,7 @@ OpenAI, Anthropic, or other pydantic-ai-supported connection:
     Hooks <hooks/index>
     Toolsets <toolsets>
     Operators <operators/index>
+    Examples <examples>
     Retry Policies <retry_policies>
     HITL Review <hitl_review>
     Observability <observability>

Reply via email to