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

kaxil 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 c7fcba0106a Stop holding openai below 3 in Airflow's CI image and 
constraints (#76503)
c7fcba0106a is described below

commit c7fcba0106a86bddb81f5d3b1ef209c0f418eda7
Author: Kaxil Naik <[email protected]>
AuthorDate: Thu Nov 5 21:16:20 2026 +0000

    Stop holding openai below 3 in Airflow's CI image and constraints (#76503)
    
    The root uv override held openai on 2.x because llama-index-llms-openai and
    litellm (via google-cloud-aiplatform[evaluation]) cap it below 3, while
    pydantic-ai-slim[openai] needs openai>=3.31. CI therefore tested Common AI's
    OpenAI path on an SDK major pydantic-ai does not support.
    
    - The Google provider depends on plain google-cloud-aiplatform plus the
      "evaluation" extra's dependencies except litellm, which
      vertexai.preview.evaluation never imports.
    - Common AI's "llamaindex" and "openai" extras are declared as conflicting 
in
      [tool.uv], llama-index leaves Common AI's dev group, and the LlamaIndex 
tests
      run in the agent framework job, which releases openai from its hold so
      llama-index gets the openai 2.x its users get.
    - The lowest-direct dependency sync leaves the conflicting extra out.
    - The override and the azure-ai-projects<2.5 constraint that only existed
      because of it are removed.
    
    * Name each provider extra in the lowest-dependency sync
    
    uv rejects --all-extras whenever a [tool.uv] conflicts group is reachable,
    including through another workspace provider, so amazon, databricks, google
    and snowflake (which reach Common AI through an extra) failed to sync, and
    --no-extra only accepts the provider's own extras. Naming every extra
    installs the same packages as --all-extras did for all 109 providers.
    
    Also list the llama-index framework in breeze's local verification plan,
    which must match the agent framework CI matrix.
    
    * Gate the Google scikit-learn floor by Python version and note the litellm 
drop
    
    The 1.7.2 floor is only needed for Python 3.14 wheels; 3.11 and 3.12 now
    accept 1.4.2 (the first release that supports numpy 2) and 3.13 accepts
    1.5.2 (its first wheels). The Google changelog notes that the provider no
    longer installs litellm, and the root conflicts comment lists every
    workaround to remove together with the llamaindex/openai conflict.
---
 .github/workflows/agent-framework-tests.yml        |   2 +-
 Dockerfile.ci                                      |  17 +-
 contributing-docs/12_provider_distributions.rst    |   6 +-
 .../13_airflow_dependencies_and_extras.rst         |   5 +
 .../src/airflow_breeze/utils/verification_plan.py  |   5 +
 providers/common/ai/docs/frameworks/index.rst      |  28 +-
 providers/common/ai/docs/hooks/llamaindex.rst      |   6 +
 providers/common/ai/pyproject.toml                 |  10 +-
 .../tests/unit/common/ai/hooks/test_llamaindex.py  |  11 +
 .../ai/operators/test_llamaindex_embedding.py      |   8 +-
 .../ai/operators/test_llamaindex_retrieval.py      |  11 +-
 providers/google/README.rst                        |   9 +-
 providers/google/docs/changelog.rst                |   6 +
 providers/google/docs/index.rst                    |   9 +-
 providers/google/pyproject.toml                    |  20 +-
 pyproject.toml                                     |  35 ++-
 scripts/docker/entrypoint_ci.sh                    |  20 +-
 scripts/in_container/run_agent_framework_tests.sh  |  64 +++--
 uv.lock                                            | 304 ++++++++-------------
 19 files changed, 299 insertions(+), 277 deletions(-)

diff --git a/.github/workflows/agent-framework-tests.yml 
b/.github/workflows/agent-framework-tests.yml
index 147fe672e75..2f95c34cdfe 100644
--- a/.github/workflows/agent-framework-tests.yml
+++ b/.github/workflows/agent-framework-tests.yml
@@ -58,7 +58,7 @@ jobs:
       # One job per framework, so a breaking release of one does not hide the 
others' results.
       fail-fast: false
       matrix:
-        framework: [strands-agents, google-adk, openai-agents]
+        framework: [strands-agents, google-adk, openai-agents, llama-index]
     env:
       GITHUB_REPOSITORY: ${{ github.repository }}
       GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/Dockerfile.ci b/Dockerfile.ci
index cef9e077137..6f07515fcde 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -1949,6 +1949,8 @@ function reinstall_shared_distributions() {
 
 PROVIDERS_NEEDING_PRE_EXTRAS_INSTALL=()
 
+LOWEST_DEPENDENCIES_EXCLUDED_EXTRAS=("common.ai:llamaindex")
+
 function run_pre_extras_install_if_registered() {
     local provider_id="${1}"
     local registered_provider
@@ -1996,6 +1998,17 @@ function check_force_lowest_dependencies() {
         fi
         cd "${AIRFLOW_SOURCES}/providers/${provider_id/.//}" || exit 1
         run_pre_extras_install_if_registered "${provider_id}"
+        # Every extra of the provider is named instead of passing 
--all-extras: uv rejects
+        # --all-extras whenever a [tool.uv] conflicts group is reachable, even 
through another
+        # workspace provider (amazon -> common.ai), and --no-extra only 
accepts the provider's
+        # own extras. Both install the same packages.
+        local -a extra_flags=()
+        local extra
+        while IFS= read -r extra; do
+            if [[ -n "${extra}" && " ${LOWEST_DEPENDENCIES_EXCLUDED_EXTRAS[*]} 
" != *" ${provider_id}:${extra} "* ]]; then
+                extra_flags+=(--extra "${extra}")
+            fi
+        done < <(python -c 'import tomllib; 
print("\n".join(tomllib.load(open("pyproject.toml", 
"rb"))["project"].get("optional-dependencies", {})))')
         # --no-binary  is needed in order to avoid libxml and xmlsec using 
different version of libxml2
         # (binary lxml embeds its own libxml2, while xmlsec uses system one).
         # See https://bugs.launchpad.net/lxml/+bug/2110068
@@ -2004,8 +2017,8 @@ function check_force_lowest_dependencies() {
         for attempt in 1 2 3; do
             echo "Attempt ${attempt} of syncing to lowest dependencies"
             set -x
-            if UV_LOCK_TIMEOUT=200 uv sync --resolution lowest-direct 
--no-binary-package lxml --no-binary-package xmlsec --all-extras \
-                --no-python-downloads --no-managed-python; then
+            if UV_LOCK_TIMEOUT=200 uv sync --resolution lowest-direct 
--no-binary-package lxml --no-binary-package xmlsec \
+                "${extra_flags[@]}" --no-python-downloads --no-managed-python; 
then
                 set +x
                 sync_successful="true"
                 break
diff --git a/contributing-docs/12_provider_distributions.rst 
b/contributing-docs/12_provider_distributions.rst
index a93c83e10d5..981355d8277 100644
--- a/contributing-docs/12_provider_distributions.rst
+++ b/contributing-docs/12_provider_distributions.rst
@@ -163,7 +163,7 @@ Redistributable Client headers and ``MQ_FILE_PATH`` set at 
build time). First ch
 raising the lower bound to a release that ships wheels avoids the build — a 
download at test
 time makes the job depend on the upstream host being reachable. Bundling such 
SDKs in the base image has licence,
 maintenance, and image-size costs that the project does not want to pay on 
every CI run.
-The lowest-direct-dependency provider tests still call ``uv sync 
--all-extras`` inside the
+The lowest-direct-dependency provider tests still ``uv sync`` every extra of 
the provider inside the
 provider directory, so simply mocking the package in tests is not enough — the 
sync itself
 must succeed first. Use the per-provider pre-extras-install manifest:
 
@@ -173,7 +173,7 @@ must succeed first. Use the per-provider pre-extras-install 
manifest:
 
 2. **Register the provider** in ``PROVIDERS_NEEDING_PRE_EXTRAS_INSTALL`` in
    ``scripts/docker/entrypoint_ci.sh``. The hook runs immediately before
-   ``check_force_lowest_dependencies`` calls ``uv sync --all-extras`` for that 
provider. The
+   ``check_force_lowest_dependencies`` calls ``uv sync`` with every extra of 
that provider. The
    list is explicit on purpose so maintainers see when a new provider takes on 
this shape of
    cost, and so the surface for "drive-by privileged code" stays small.
 
@@ -221,7 +221,7 @@ must succeed first. Use the per-provider pre-extras-install 
manifest:
      observed to fail DNS resolution for that host.
    - ``env`` (optional mapping): each name must match ``^[A-Z][A-Z0-9_]*$``, 
each value must
      be a string. The interpreter writes ``export NAME='value'`` lines that 
the entrypoint
-     hook sources into the shell that subsequently runs ``uv sync 
--all-extras``.
+     hook sources into the shell that subsequently runs ``uv sync``.
 
    Any unknown top-level or per-entry key is a hard error.
 
diff --git a/contributing-docs/13_airflow_dependencies_and_extras.rst 
b/contributing-docs/13_airflow_dependencies_and_extras.rst
index 794b835c086..deecaf7636b 100644
--- a/contributing-docs/13_airflow_dependencies_and_extras.rst
+++ b/contributing-docs/13_airflow_dependencies_and_extras.rst
@@ -118,6 +118,11 @@ When you add a new dependency, you should make sure that:
   all packages with all extras can be installed together without conflicts, 
but this might be sometimes
   difficult and slow as some of the extras require some additional system 
level dependencies to be installed
   (for example ``mysql`` or ``postgres`` extras require client libraries to be 
installed on the system).
+  Extras that ``[tool.uv] conflicts`` in the root ``pyproject.toml`` declares 
as conflicting cannot be
+  synced together, so leave one of each group out with ``--no-extra`` (today
+  ``uv sync --all-packages --all-extras --no-extra llamaindex``). The 
lowest-direct dependency tests
+  leave the same extras out through ``LOWEST_DEPENDENCIES_EXCLUDED_EXTRAS`` in
+  ``scripts/docker/entrypoint_ci.sh``.
 
 * Make sure to run all tests after modifying dependencies to make sure that 
nothing is broken
 
diff --git a/dev/breeze/src/airflow_breeze/utils/verification_plan.py 
b/dev/breeze/src/airflow_breeze/utils/verification_plan.py
index 71cde6287c1..4d44ba4f1e8 100644
--- a/dev/breeze/src/airflow_breeze/utils/verification_plan.py
+++ b/dev/breeze/src/airflow_breeze/utils/verification_plan.py
@@ -72,6 +72,11 @@ FLAG_COMMANDS: dict[str, tuple[tuple[str, str, str], ...]] = 
{
             'breeze shell --backend none --skip-db-tests "bash 
/opt/airflow/scripts/in_container/run_agent_framework_tests.sh openai-agents"',
             "breeze",
         ),
+        (
+            "unit",
+            'breeze shell --backend none --skip-db-tests "bash 
/opt/airflow/scripts/in_container/run_agent_framework_tests.sh llama-index"',
+            "breeze",
+        ),
     ),
     "run_breeze_integration_tests": (
         ("unit", "cd dev/breeze && uv run --locked pytest", "host"),
diff --git a/providers/common/ai/docs/frameworks/index.rst 
b/providers/common/ai/docs/frameworks/index.rst
index 661e3ca98d1..7b1ecf84e9c 100644
--- a/providers/common/ai/docs/frameworks/index.rst
+++ b/providers/common/ai/docs/frameworks/index.rst
@@ -148,25 +148,31 @@ Tested versions
      - Pins OpenTelemetry at 1.42.1 or lower, below the version in Airflow's 
constraints
        file. Airflow itself accepts 1.42.1.
    * - OpenAI Agents SDK
-     - 0.20.0 and 0.23.1
-     - 0.21.0 and later require ``openai>=3``, while Airflow's constraints 
file pins
-       ``openai`` below 3, so installing with that file gives 0.20.
+     - 0.20.0, 0.23.1 and 0.24.0
+     - 0.21.0 and later require ``openai>=3``, so installing with a 
constraints file that
+       pins ``openai`` below 3 gives 0.20.
+   * - LlamaIndex
+     - ``llama-index-core`` 0.14.25, ``llama-index-llms-openai`` 0.8.3
+     - ``llama-index-llms-openai`` caps ``openai`` below 3, so the 
``[llamaindex]`` extra
+       cannot share an environment with the ``[openai]`` extra or with a 
constraints file
+       that pins ``openai`` 3. See :doc:`../hooks/llamaindex`.
    * - Claude Agent SDK
      - 0.2.168
      - Bundles the Claude Code CLI as the subprocess the SDK talks to.
 
 These are the versions the adapter tests have been run against. Strands and 
ADK cap
-packages below the versions in Airflow's dependency lock, and current OpenAI 
Agents SDK
-releases need ``openai`` 3, so CI runs their adapter tests in a job of their 
own, one
-framework at a time. The Claude Agent SDK adapter has no such conflict, so CI 
runs its
-tests.
+packages below the versions in Airflow's dependency lock, LlamaIndex caps 
``openai`` below
+the version in it, and no Airflow package depends on the OpenAI Agents SDK, so 
CI runs their
+tests in a job of their own, one framework at a time. The Claude Agent SDK 
adapter has no
+such conflict, so CI runs its tests.
 
 Outside canary runs, the job holds every package already in the CI image at its
 installed version with ``--override``, so Strands' and ADK's own dependency 
caps are
-overridden. It installs the newest framework release that is older than the 
repository's
-``exclude-newer`` window, which for the OpenAI Agents SDK means the newest 
release that
-accepts ``openai`` 2.x, not the versions in the table above. It therefore does 
not show
-that those versions work in the environment a user gets. Canary runs, which 
include
+overridden. LlamaIndex is the exception for ``openai``: the job lets its cap 
bring
+``openai`` down to 2.x, because a run on openai 3 would test a pairing no user 
gets. It
+installs the newest framework release that is older than the repository's
+``exclude-newer`` window, so it does not show that the versions in the table 
above work in
+the environment a user gets. Canary runs, which include
 scheduled and manual runs on ``main`` and pull requests labeled ``canary``, 
install each
 framework's newest release with its own dependency pins instead.
 
diff --git a/providers/common/ai/docs/hooks/llamaindex.rst 
b/providers/common/ai/docs/hooks/llamaindex.rst
index 4f35f4b10c5..6e0e9906f96 100644
--- a/providers/common/ai/docs/hooks/llamaindex.rst
+++ b/providers/common/ai/docs/hooks/llamaindex.rst
@@ -142,3 +142,9 @@ That extra installs ``llama-index-core``, 
``llama-index-embeddings-openai``,
 and ``llama-index-llms-openai`` -- enough to back the hook's default
 OpenAI return values. For other LlamaIndex vendor packages, install
 their integration package separately.
+
+``llama-index-llms-openai`` caps ``openai`` below 3, while this provider's 
``openai`` extra
+needs ``openai`` 3, so the two extras cannot be installed in one environment. 
For the same
+reason the ``llamaindex`` extra fails to install with a constraints file that 
pins
+``openai`` 3 or later: build the worker image without the constraints file for 
this step,
+or with a copy of it that pins ``openai`` below 3.
diff --git a/providers/common/ai/pyproject.toml 
b/providers/common/ai/pyproject.toml
index 7b02e5161f6..ca44e12fdc2 100644
--- a/providers/common/ai/pyproject.toml
+++ b/providers/common/ai/pyproject.toml
@@ -88,10 +88,9 @@ dependencies = [
 # runner adapter in airflow.providers.common.ai.tools.anthropic relies on. 
openai
 # 2.47.0 is the first release that accepts the httpx2 client 
pydantic-ai-slim>=2.33 hands it
 # (2.45 and 2.46 raise TypeError on it); pydantic-ai-slim[openai]>=2.33.0 
itself asks for
-# openai>=3, so this floor only matters where that requirement is overridden, 
as in this
-# repository's lock. anthropic is capped below 2 because pydantic-ai's 
Anthropic model
-# (up to 2.59.0) calls BetaMessageParam(...), which anthropic 2 turned into a 
Union that
-# cannot be instantiated.
+# openai>=3, so this floor only matters to an install that overrides that 
requirement.
+# anthropic is capped below 2 because pydantic-ai's Anthropic model (up to 
2.59.0) calls
+# BetaMessageParam(...), which anthropic 2 turned into a Union that cannot be 
instantiated.
 "anthropic" = ["pydantic-ai-slim[anthropic]>=2.36.0", "anthropic>=1.1.0,<2"]
 "bedrock" = ["pydantic-ai-slim[bedrock]>=2.36.0"]
 "google" = ["pydantic-ai-slim[google]>=2.36.0"]
@@ -198,9 +197,6 @@ dev = [
     "pydantic-ai-skills>=1.2.0,<2",
     "apache-airflow-providers-common-sql[datafusion]",
     "langchain>=1.0.0",
-    "llama-index-core>=0.14.5",
-    "llama-index-embeddings-openai>=0.6.0",
-    "llama-index-llms-openai>=0.6.8",
     # @task.llm_batch's OpenAI/Anthropic adapters call these SDKs directly. 
The dev group
     # needs them so the adapter tests, which build real SDK models, run 
instead of skipping.
     "openai>=2.47.0",
diff --git a/providers/common/ai/tests/unit/common/ai/hooks/test_llamaindex.py 
b/providers/common/ai/tests/unit/common/ai/hooks/test_llamaindex.py
index 3274519629c..60d68166e3b 100644
--- a/providers/common/ai/tests/unit/common/ai/hooks/test_llamaindex.py
+++ b/providers/common/ai/tests/unit/common/ai/hooks/test_llamaindex.py
@@ -16,6 +16,7 @@
 # under the License.
 from __future__ import annotations
 
+import importlib.util
 import warnings
 from unittest.mock import MagicMock, patch
 
@@ -24,6 +25,13 @@ import pytest
 from airflow.exceptions import AirflowProviderDeprecationWarning
 from airflow.providers.common.ai.hooks.llamaindex import LlamaIndexHook
 
+# The hook imports llama-index only when it builds a model, so only those 
tests need it.
+requires_llama_index = pytest.mark.skipif(
+    importlib.util.find_spec("llama_index") is None,
+    reason="llama-index is installed only in the agent framework CI job "
+    "(scripts/in_container/run_agent_framework_tests.sh)",
+)
+
 
 def _conn(password: str = "", host: str = "", extra: dict | None = None) -> 
MagicMock:
     mock_conn = MagicMock()
@@ -176,6 +184,7 @@ class TestResolveModel:
             )
 
 
+@requires_llama_index
 class TestGetEmbeddingModel:
     @patch("llama_index.embeddings.openai.OpenAIEmbedding")
     @patch.object(LlamaIndexHook, "get_connection")
@@ -295,6 +304,7 @@ class TestGetEmbeddingModel:
             hook.get_embedding_model()
 
 
+@requires_llama_index
 class TestGetLlm:
     @patch("llama_index.llms.openai.OpenAI")
     @patch.object(LlamaIndexHook, "get_connection")
@@ -316,6 +326,7 @@ class TestGetLlm:
             hook.get_llm()
 
 
+@requires_llama_index
 class TestConnectionTest:
     @patch("llama_index.llms.openai.OpenAI")
     @patch.object(LlamaIndexHook, "get_connection")
diff --git 
a/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_embedding.py
 
b/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_embedding.py
index f744a757f21..f88550e2e13 100644
--- 
a/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_embedding.py
+++ 
b/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_embedding.py
@@ -20,6 +20,7 @@ from unittest.mock import MagicMock, patch
 
 import pytest
 
+# Installed only in the agent framework CI job 
(scripts/in_container/run_agent_framework_tests.sh).
 pytest.importorskip("llama_index.core")
 
 from llama_index.core import MockEmbedding
@@ -30,12 +31,7 @@ from 
airflow.providers.common.ai.operators.llamaindex_embedding import LlamaInde
 
 @pytest.fixture
 def _li(monkeypatch):
-    """Patch the two LlamaIndex constructors the operator uses inside 
execute().
-
-    ``llama_index`` (core + openai embeddings) is a real test dependency
-    declared in ``providers/common/ai/pyproject.toml``'s dev group, so
-    ``@patch("llama_index.core.X")`` resolves against the real module.
-    """
+    """Patch the two LlamaIndex constructors the operator uses inside 
execute()."""
     VectorStoreIndex = MagicMock(name="VectorStoreIndex")
     SentenceSplitter = MagicMock(name="SentenceSplitter")
     monkeypatch.setattr("llama_index.core.VectorStoreIndex", VectorStoreIndex)
diff --git 
a/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_retrieval.py
 
b/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_retrieval.py
index e3c720dfd0a..8b0862ed2cb 100644
--- 
a/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_retrieval.py
+++ 
b/providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_retrieval.py
@@ -20,18 +20,15 @@ from unittest.mock import MagicMock, patch
 
 import pytest
 
+# Installed only in the agent framework CI job 
(scripts/in_container/run_agent_framework_tests.sh).
+pytest.importorskip("llama_index.core")
+
 from airflow.providers.common.ai.operators.llamaindex_retrieval import 
LlamaIndexRetrievalOperator
 
 
 @pytest.fixture
 def _li(monkeypatch):
-    """Patch the two LlamaIndex symbols the retrieval operator uses inside 
execute().
-
-    ``llama_index`` (core + openai embeddings) is a real test dependency
-    declared in ``providers/common/ai/pyproject.toml``'s dev group, so
-    ``monkeypatch.setattr("llama_index.core.X", ...)`` resolves against the
-    real module.
-    """
+    """Patch the two LlamaIndex symbols the retrieval operator uses inside 
execute()."""
     StorageContext = MagicMock(name="StorageContext")
     load_index_from_storage = MagicMock(name="load_index_from_storage")
     monkeypatch.setattr("llama_index.core.StorageContext", StorageContext)
diff --git a/providers/google/README.rst b/providers/google/README.rst
index 3bc96c324cd..935121f33b2 100644
--- a/providers/google/README.rst
+++ b/providers/google/README.rst
@@ -77,7 +77,14 @@ PIP package                                 Version required
 ``google-auth``                             ``>=2.29.0``
 ``google-auth-httplib2``                    ``>=0.0.1``
 ``google-genai``                            ``>=2.8.0``
-``google-cloud-aiplatform[evaluation]``     ``>=1.164.0``
+``google-cloud-aiplatform``                 ``>=1.164.0``
+``jsonschema``                              ``>=4.19.1``
+``pyyaml``                                  ``>=6.0.3``
+``ruamel.yaml``                             ``>=0.18.0``
+``scikit-learn``                            ``>=1.4.2; python_version < 
"3.13"``
+``scikit-learn``                            ``>=1.5.2; python_version >= 
"3.13" and python_version < "3.14"``
+``scikit-learn``                            ``>=1.7.2; python_version >= 
"3.14"``
+``tqdm``                                    ``>=4.67.1``
 ``ray[default]``                            ``>=2.42.0; python_version < 
"3.13"``
 ``ray[default]``                            ``>=2.49.0; python_version >= 
"3.13" and python_version < "3.14"``
 ``ray[default]``                            ``>=2.55.0; python_version >= 
"3.14" and python_version < "3.15"``
diff --git a/providers/google/docs/changelog.rst 
b/providers/google/docs/changelog.rst
index 2ab0b7379df..576c77d9724 100644
--- a/providers/google/docs/changelog.rst
+++ b/providers/google/docs/changelog.rst
@@ -27,6 +27,12 @@
 Changelog
 ---------
 
+.. note::
+    The provider no longer installs ``litellm``. It now depends on 
``google-cloud-aiplatform`` and the
+    dependencies of its ``evaluation`` extra except ``litellm``, which the 
extra caps below the fix for
+    a critical advisory. If your tasks call ``vertexai.Client().evals`` with a 
model that LiteLLM
+    serves, install ``litellm`` yourself; without it those calls raise 
``ImportError``.
+
 22.9.0
 ......
 
diff --git a/providers/google/docs/index.rst b/providers/google/docs/index.rst
index e274e1b6196..981aa43e4ac 100644
--- a/providers/google/docs/index.rst
+++ b/providers/google/docs/index.rst
@@ -130,7 +130,14 @@ PIP package                                 Version 
required
 ``google-auth``                             ``>=2.29.0``
 ``google-auth-httplib2``                    ``>=0.0.1``
 ``google-genai``                            ``>=2.8.0``
-``google-cloud-aiplatform[evaluation]``     ``>=1.164.0``
+``google-cloud-aiplatform``                 ``>=1.164.0``
+``jsonschema``                              ``>=4.19.1``
+``pyyaml``                                  ``>=6.0.3``
+``ruamel.yaml``                             ``>=0.18.0``
+``scikit-learn``                            ``>=1.4.2; python_version < 
"3.13"``
+``scikit-learn``                            ``>=1.5.2; python_version >= 
"3.13" and python_version < "3.14"``
+``scikit-learn``                            ``>=1.7.2; python_version >= 
"3.14"``
+``tqdm``                                    ``>=4.67.1``
 ``ray[default]``                            ``>=2.42.0; python_version < 
"3.13"``
 ``ray[default]``                            ``>=2.49.0; python_version >= 
"3.13" and python_version < "3.14"``
 ``ray[default]``                            ``>=2.55.0; python_version >= 
"3.14" and python_version < "3.15"``
diff --git a/providers/google/pyproject.toml b/providers/google/pyproject.toml
index 4a9cc29999a..8eb7be77f0d 100644
--- a/providers/google/pyproject.toml
+++ b/providers/google/pyproject.toml
@@ -83,10 +83,22 @@ dependencies = [
     # google-cloud-aiplatform doesn't install ray for python 3.12 (issue: 
https://github.com/googleapis/python-aiplatform/issues/5252).
     # Temporarily lock in ray 2.42.0 which is compatible with python 3.12 
until linked issue is solved.
     # Remove the ray dependency as well as google-cloud-bigquery-storage once 
linked issue is fixed
-    # Floor raised to 1.164.0: earlier "evaluation" extras cap litellm below 
the version that
-    # carries the fixes for CVE-2026-35030 and its follow-on advisories on 
Python 3.14.
-    # - https://github.com/googleapis/python-aiplatform/issues/7057
-    "google-cloud-aiplatform[evaluation]>=1.164.0",
+    # The dependencies of google-cloud-aiplatform's "evaluation" extra, except 
litellm, which
+    # vertexai.preview.evaluation (what the generative model hook uses) never 
imports; only the
+    # vertexai._genai evals client does, behind an ImportError guard. The 
extra caps litellm at a
+    # version that still requires openai<3, and below the fix for a critical 
litellm advisory:
+    # https://github.com/googleapis/python-aiplatform/issues/7252
+    # The extra's pandas is listed further down. The floors of jsonschema, 
pyyaml and tqdm match
+    # the other Airflow distributions. scikit-learn 1.4.2 is the first release 
that supports
+    # numpy 2, 1.5.2 the first with Python 3.13 wheels and 1.7.2 the first 
with Python 3.14 wheels.
+    "google-cloud-aiplatform>=1.164.0",
+    "jsonschema>=4.19.1",
+    "pyyaml>=6.0.3",
+    "ruamel.yaml>=0.18.0",
+    "scikit-learn>=1.4.2;python_version<'3.13'",
+    "scikit-learn>=1.5.2;python_version>='3.13' and python_version<'3.14'",
+    "scikit-learn>=1.7.2;python_version>='3.14'",
+    "tqdm>=4.67.1",
     "ray[default]>=2.42.0;python_version<'3.13'",
     "ray[default]>=2.49.0;python_version>='3.13' and python_version <'3.14'",
     "ray[default]>=2.55.0;python_version>='3.14' and python_version <'3.15'",
diff --git a/pyproject.toml b/pyproject.toml
index 75853048f26..0d5645e6682 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1467,24 +1467,22 @@ ci-image = [
 # floor; `scripts/ci/prek/upgrade_important_versions.py` deliberately skips it.
 required-version = ">=0.13.4"
 no-build-isolation-package = ["sphinx-redoc"]
-# pydantic-ai-slim[openai]>=2.33 declares openai>=3 (>=3.8 from 2.39), while
-# llama-index-llms-openai (<=0.8.1) and litellm (<=1.102.0, pulled in by the 
Google provider's
-# google-cloud-aiplatform[evaluation]) still cap openai below 3. Without this 
override the
-# workspace lock cannot move pydantic-ai-slim past 2.31, which is incompatible 
with anthropic
-# 1.x, so the Anthropic path could not run in the CI image at all. Holding 
openai on 2.x is the
-# pairing constraints-main already ships and the one `pip check` in the image 
build accepts
-# (pip ignores extra-gated requirements, but not llama-index's unconditional 
cap). pydantic-ai's
-# OpenAI model works against openai 2.x at runtime; the declared floor tracks 
the SDK's httpx2
-# move. Published wheels are unaffected: overrides only shape uv.lock and the 
CI image. Drop this
-# once run-llama/llama_index#22939 and BerriAI/litellm#40317 land and 
google-cloud-aiplatform
-# lifts its litellm cap (<1.86 below Python 3.14) far enough to reach the 
fixed litellm.
-override-dependencies = ["openai>=2.47.0,<3"]
-# The override replaces every package's openai requirement, not only 
pydantic-ai-slim's, so the
-# resolver no longer rejects a release that needs openai>=3 unconditionally, 
and only `pip check`
-# in the image build catches it. Cap each such package here at its last openai 
2.x release, which
-# is what the resolver would pick without the override. azure-ai-projects 
2.5.0 moved to
-# openai>=3.0.0; the Azure provider needs >=2.2.0.
-constraint-dependencies = ["azure-ai-projects<2.5"]
+# Common AI's "llamaindex" extra cannot be installed alongside its "openai" 
extra:
+# llama-index-llms-openai (up to 0.8.3) caps openai below 3, and 
pydantic-ai-slim[openai]>=2.33
+# needs openai>=3. Declaring them as conflicting lets uv.lock resolve each one 
on its own, so the
+# CI image gets openai 3 and the LlamaIndex tests run in the agent framework 
job instead, with
+# the openai 2.x that llama-index pulls in. Remove this once 
run-llama/llama_index#22939 is
+# released and the llama-index packages are back in Common AI's dev group, 
together with the
+# workarounds that exist only because of it: 
LOWEST_DEPENDENCIES_EXCLUDED_EXTRAS in
+# scripts/docker/entrypoint_ci.sh (otherwise the "llamaindex" extra silently 
stays out of the
+# lowest-dependency sync), the llama-index entry in the agent framework CI 
matrix and in breeze's
+# verification plan, and released=(openai) in 
scripts/in_container/run_agent_framework_tests.sh.
+conflicts = [
+    [
+        { package = "apache-airflow-providers-common-ai", extra = "llamaindex" 
},
+        { package = "apache-airflow-providers-common-ai", extra = "openai" },
+    ],
+]
 # Synchroonize with scripts/ci/prek/upgrade_important_versions.py
 exclude-newer = "4 days"
 
@@ -1681,7 +1679,6 @@ qdrant-client = "Capped (#62193)"
 airbyte-api = "1.x breaks provider tests (#69081)"
 mysql-connector-python = "Releases without wheels for >=3.12 (#60889, #66026)"
 anthropic = "Provider SDK migration is version-sensitive (#72072, #72094)"
-azure-ai-projects = "2.5+ needs openai>=3, broke main (#73621, #73627)"
 
 [tool.uv.pip]
 # Synchroonize with scripts/ci/prek/upgrade_important_versions.py
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index c487ea60a75..d71181f064a 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -432,6 +432,11 @@ function reinstall_shared_distributions() {
 # contributing-docs/12_provider_distributions.rst.
 PROVIDERS_NEEDING_PRE_EXTRAS_INSTALL=()
 
+# Extras check_force_lowest_dependencies leaves out of a provider's sync, as
+# "<provider id>:<extra>", because the root pyproject.toml declares them as 
conflicting with
+# another extra of the same provider ([tool.uv] conflicts), and uv rejects 
syncing both.
+LOWEST_DEPENDENCIES_EXCLUDED_EXTRAS=("common.ai:llamaindex")
+
 function run_pre_extras_install_if_registered() {
     local provider_id="${1}"
     local registered_provider
@@ -479,6 +484,17 @@ function check_force_lowest_dependencies() {
         fi
         cd "${AIRFLOW_SOURCES}/providers/${provider_id/.//}" || exit 1
         run_pre_extras_install_if_registered "${provider_id}"
+        # Every extra of the provider is named instead of passing 
--all-extras: uv rejects
+        # --all-extras whenever a [tool.uv] conflicts group is reachable, even 
through another
+        # workspace provider (amazon -> common.ai), and --no-extra only 
accepts the provider's
+        # own extras. Both install the same packages.
+        local -a extra_flags=()
+        local extra
+        while IFS= read -r extra; do
+            if [[ -n "${extra}" && " ${LOWEST_DEPENDENCIES_EXCLUDED_EXTRAS[*]} 
" != *" ${provider_id}:${extra} "* ]]; then
+                extra_flags+=(--extra "${extra}")
+            fi
+        done < <(python -c 'import tomllib; 
print("\n".join(tomllib.load(open("pyproject.toml", 
"rb"))["project"].get("optional-dependencies", {})))')
         # --no-binary  is needed in order to avoid libxml and xmlsec using 
different version of libxml2
         # (binary lxml embeds its own libxml2, while xmlsec uses system one).
         # See https://bugs.launchpad.net/lxml/+bug/2110068
@@ -487,8 +503,8 @@ function check_force_lowest_dependencies() {
         for attempt in 1 2 3; do
             echo "Attempt ${attempt} of syncing to lowest dependencies"
             set -x
-            if UV_LOCK_TIMEOUT=200 uv sync --resolution lowest-direct 
--no-binary-package lxml --no-binary-package xmlsec --all-extras \
-                --no-python-downloads --no-managed-python; then
+            if UV_LOCK_TIMEOUT=200 uv sync --resolution lowest-direct 
--no-binary-package lxml --no-binary-package xmlsec \
+                "${extra_flags[@]}" --no-python-downloads --no-managed-python; 
then
                 set +x
                 sync_successful="true"
                 break
diff --git a/scripts/in_container/run_agent_framework_tests.sh 
b/scripts/in_container/run_agent_framework_tests.sh
index 21d285da4a9..4c7f60e0115 100755
--- a/scripts/in_container/run_agent_framework_tests.sh
+++ b/scripts/in_container/run_agent_framework_tests.sh
@@ -19,23 +19,22 @@
 # Runs the common.ai adapter tests for agent frameworks that cannot join the 
workspace lock.
 #
 # Strands Agents caps mcp, and Google ADK caps opentelemetry and websockets, 
below the versions
-# uv.lock resolves; the OpenAI Agents SDK needs openai>=3 from 0.21.0, while 
the workspace holds
-# openai below 3, so only its older releases could join the lock. Their 
adapter tests are skipped
-# everywhere else in CI. This installs one framework into the CI image and 
runs the tests of the
-# framework-neutral tools and their adapters, and of durable execution for 
Strands and the OpenAI
-# Agents SDK; the other frameworks' tests skip themselves. One framework per 
invocation, so a bad
-# release of one cannot mask the others.
+# uv.lock resolves. llama-index-llms-openai caps openai below 3, so Common 
AI's "llamaindex" extra
+# is declared as conflicting with its "openai" extra and the image gets openai 
3 without it. No
+# workspace package depends on the OpenAI Agents SDK, so it is not locked 
either. Their tests are
+# skipped everywhere else in CI. This installs one framework into the CI image 
and runs the tests
+# of the framework-neutral tools and their adapters, of durable execution for 
Strands and the
+# OpenAI Agents SDK, and of the LlamaIndex hook and operators; the other 
frameworks' tests skip
+# themselves. One framework per invocation, so a bad release of one cannot 
mask the others.
 #
 # By default every package already in the image is held at its installed 
version with uv's
 # --override, so the framework is tested against the same dependencies as the 
rest of Airflow and
 # its caps on them are overridden. With --framework-pins the framework's own 
requirements win
 # instead, which is the environment a user who installs it gets.
 #
-# An override replaces a requirement rather than relaxing a cap, so the OpenAI 
Agents SDK's own
-# openai>=3 would be replaced too, and its newest release would be tested 
against the image's
-# openai 2.x, a pairing no user gets. While the image has openai 2.x, holding 
its packages
-# therefore installs the newest release that accepts it, which is what 
Airflow's constraints
-# resolve to.
+# An override replaces a requirement rather than relaxing a cap, so holding 
the image's openai 3
+# would test LlamaIndex against an openai its packages reject, a pairing no 
user gets. A framework
+# can therefore release named packages from the hold, and only those may 
change.
 #
 # The newest framework release older than the repository's uv exclude-newer 
window is installed.
 set -euo pipefail
@@ -45,25 +44,33 @@ TEST_PATHS=(
     "providers/common/ai/tests/unit/common/ai/durable/test_strands.py"
     "providers/common/ai/tests/unit/common/ai/durable/test_strands_storage.py"
     "providers/common/ai/tests/unit/common/ai/durable/test_openai_agents.py"
+    "providers/common/ai/tests/unit/common/ai/hooks/test_llamaindex.py"
+    
"providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_embedding.py"
+    
"providers/common/ai/tests/unit/common/ai/operators/test_llamaindex_retrieval.py"
 )
 
+cd "${AIRFLOW_SOURCES:-/opt/airflow}"
+
 framework="${1:-}"
-# What to install when the image's packages are held; with --framework-pins 
the newest release.
-held_requirement="${framework}"
+requirements=("${framework}")
+# Image packages the framework caps below their installed version, released 
from the hold.
+released=()
 case "${framework}" in
     strands-agents) import_check="import strands" ;;
     google-adk) import_check="import google.adk" ;;
-    openai-agents)
-        import_check="import agents"
-        if python -c 'import sys; from importlib.metadata import version; 
sys.exit(int(version("openai").split(".")[0]) >= 3)'; then
-            held_requirement="openai-agents<0.21"
-        fi
+    openai-agents) import_check="import agents" ;;
+    llama-index)
+        mapfile -t requirements < <(python -c 'import tomllib; 
print("\n".join(tomllib.load(open("providers/common/ai/pyproject.toml", 
"rb"))["project"]["optional-dependencies"]["llamaindex"]))')
+        import_check="import llama_index.core, llama_index.embeddings.openai, 
llama_index.llms.openai"
+        released=(openai)
         ;;
     *)
-        echo "Usage: $0 <strands-agents|google-adk|openai-agents> 
[--framework-pins]" >&2
+        echo "Usage: $0 <strands-agents|google-adk|openai-agents|llama-index> 
[--framework-pins]" >&2
         exit 1
         ;;
 esac
+# Matches the freeze lines of the released packages; with none released it 
matches nothing.
+released_lines="^($(IFS='|'; echo "${released[*]}"))=="
 
 framework_pins="false"
 if [[ ${2:-} == "--framework-pins" ]]; then
@@ -73,15 +80,12 @@ elif [[ -n ${2:-} ]]; then
     exit 1
 fi
 
-cd "${AIRFLOW_SOURCES:-/opt/airflow}"
-
 if [[ ${framework_pins} == "true" ]]; then
     echo "Installing ${framework} with its own dependency pins"
-    # The workspace's [tool.uv] overrides and constraints, such as its 
openai<3, shape uv.lock, not
-    # what a user who installs the framework gets, so leave them out and keep 
only its
-    # exclude-newer window.
+    # The workspace's [tool.uv] settings shape uv.lock, not what a user who 
installs the framework
+    # gets, so leave them out and keep only its exclude-newer window.
     exclude_newer=$(python -c 'import tomllib; 
print(tomllib.load(open("pyproject.toml", 
"rb"))["tool"]["uv"]["exclude-newer"])')
-    uv pip install --no-config --exclude-newer "${exclude_newer}" 
"${framework}"
+    uv pip install --no-config --exclude-newer "${exclude_newer}" 
"${requirements[@]}"
 else
     overrides=$(mktemp)
     before=$(mktemp)
@@ -91,11 +95,11 @@ else
     # Only name==version lines: editable and local installs cannot be 
expressed as an override,
     # and the frameworks do not depend on any of them. Overriding the rest 
means nothing the
     # image ships should change; the check below is there in case something 
still does.
-    grep -E '^[A-Za-z0-9_.-]+==' "${before}" > "${overrides}"
-    echo "Installing ${held_requirement}, holding the image's $(wc -l < 
"${overrides}") installed packages"
-    uv pip install --override "${overrides}" "${held_requirement}"
+    grep -E '^[A-Za-z0-9_.-]+==' "${before}" | grep -viE "${released_lines}" > 
"${overrides}"
+    echo "Installing ${framework}, holding the image's $(wc -l < 
"${overrides}") installed packages"
+    uv pip install --override "${overrides}" "${requirements[@]}"
     uv pip freeze | sort > "${after}"
-    changed=$(comm -23 "${before}" "${after}")
+    changed=$(comm -23 "${before}" "${after}" | grep -viE "${released_lines}" 
|| true)
     if [[ -n ${changed} ]]; then
         echo "Installing ${framework} changed packages the image already had:" 
>&2
         echo "${changed}" >&2
@@ -104,7 +108,7 @@ else
 fi
 
 # Log the versions that decide whether the adapter works; the framework itself 
must be among them.
-uv pip freeze | grep -iE 
'^(strands-agents|google-adk|openai-agents|openai|mcp|opentelemetry-(api|sdk)|websockets|google-genai)=='
 \
+uv pip freeze | grep -iE 
'^(strands-agents|google-adk|openai-agents|llama-index-[a-z-]+|openai|mcp|opentelemetry-(api|sdk)|websockets|google-genai)=='
 \
     || { echo "${framework} is not installed after uv pip install" >&2; exit 
1; }
 
 # The adapter tests skip themselves when their framework is missing, so a 
broken install would
diff --git a/uv.lock b/uv.lock
index 4aafd299c14..4a3aa09d35d 100644
--- a/uv.lock
+++ b/uv.lock
@@ -29,6 +29,10 @@ resolution-markers = [
     "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
     "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
 ]
+conflicts = [[
+    { package = "apache-airflow-providers-common-ai", extra = "llamaindex" },
+    { package = "apache-airflow-providers-common-ai", extra = "openai" },
+]]
 
 [options]
 exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included 
for backwards compatibility when using relative exclude-newer values.
@@ -324,8 +328,6 @@ members = [
     "apache-airflow-task-sdk",
     "apache-airflow-task-sdk-integration-tests",
 ]
-constraints = [{ name = "azure-ai-projects", specifier = "<2.5" }]
-overrides = [{ name = "openai", specifier = ">=2.47.0,<3" }]
 
 [[package]]
 name = "a2wsgi"
@@ -4695,8 +4697,8 @@ modal = [
     { name = "modal" },
 ]
 openai = [
-    { name = "openai" },
-    { name = "pydantic-ai-slim", extra = ["openai"] },
+    { name = "openai", version = "3.42.0", source = { registry = 
"https://pypi.org/simple"; } },
+    { name = "pydantic-ai-slim", extra = ["openai"], marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
 ]
 opensandbox = [
     { name = "opensandbox" },
@@ -4743,10 +4745,8 @@ dev = [
     { name = "grpcio" },
     { name = "islo" },
     { name = "langchain" },
-    { name = "llama-index-core" },
-    { name = "llama-index-embeddings-openai" },
-    { name = "llama-index-llms-openai" },
-    { name = "openai" },
+    { name = "openai", version = "2.54.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "openai", version = "3.42.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
     { name = "opensandbox" },
     { name = "openshell" },
     { name = "protobuf" },
@@ -4822,9 +4822,6 @@ dev = [
     { name = "grpcio", specifier = ">=1.78.0" },
     { name = "islo", specifier = ">=0.3.19" },
     { name = "langchain", specifier = ">=1.0.0" },
-    { name = "llama-index-core", specifier = ">=0.14.5" },
-    { name = "llama-index-embeddings-openai", specifier = ">=0.6.0" },
-    { name = "llama-index-llms-openai", specifier = ">=0.6.8" },
     { name = "openai", specifier = ">=2.47.0" },
     { name = "opensandbox", specifier = ">=1.1.0" },
     { name = "openshell", specifier = ">=0.1.2,<0.2" },
@@ -5885,7 +5882,7 @@ dependencies = [
     { name = "google-api-python-client" },
     { name = "google-auth" },
     { name = "google-auth-httplib2" },
-    { name = "google-cloud-aiplatform", extra = ["evaluation"] },
+    { name = "google-cloud-aiplatform" },
     { name = "google-cloud-alloydb" },
     { name = "google-cloud-automl" },
     { name = "google-cloud-batch" },
@@ -5929,6 +5926,7 @@ dependencies = [
     { name = "grpcio-gcp" },
     { name = "httpx2" },
     { name = "immutabledict" },
+    { name = "jsonschema" },
     { name = "looker-sdk" },
     { name = "pandas" },
     { name = "pandas-gbq" },
@@ -5936,10 +5934,14 @@ dependencies = [
     { name = "pyarrow" },
     { name = "pydantic", marker = "python_full_version >= '3.14'" },
     { name = "python-slugify" },
+    { name = "pyyaml" },
     { name = "ray", extra = ["default"], marker = "python_full_version < 
'3.15'" },
+    { name = "ruamel-yaml" },
+    { name = "scikit-learn" },
     { name = "sqlalchemy-bigquery" },
     { name = "sqlalchemy-spanner" },
     { name = "tenacity" },
+    { name = "tqdm" },
 ]
 
 [package.optional-dependencies]
@@ -6087,7 +6089,7 @@ requires-dist = [
     { name = "google-api-python-client", specifier = ">=2.195.0" },
     { name = "google-auth", specifier = ">=2.29.0" },
     { name = "google-auth-httplib2", specifier = ">=0.0.1" },
-    { name = "google-cloud-aiplatform", extras = ["evaluation"], specifier = 
">=1.164.0" },
+    { name = "google-cloud-aiplatform", specifier = ">=1.164.0" },
     { name = "google-cloud-alloydb", specifier = ">=0.9.0" },
     { name = "google-cloud-automl", specifier = ">=2.19.0" },
     { name = "google-cloud-batch", specifier = ">=0.21.0" },
@@ -6132,6 +6134,7 @@ requires-dist = [
     { name = "grpcio-gcp", specifier = ">=0.2.2" },
     { name = "httpx2", specifier = ">=2.0.0" },
     { name = "immutabledict", specifier = ">=4.2.0" },
+    { name = "jsonschema", specifier = ">=4.19.1" },
     { name = "looker-sdk", specifier = ">=22.4.0,!=24.18.0" },
     { name = "pandas", marker = "python_full_version < '3.13'", specifier = 
">=2.1.2" },
     { name = "pandas", marker = "python_full_version == '3.13.*'", specifier = 
">=2.2.3" },
@@ -6143,12 +6146,18 @@ requires-dist = [
     { name = "pyarrow", marker = "python_full_version >= '3.14'", specifier = 
">=22.0.0" },
     { name = "pydantic", marker = "python_full_version >= '3.14'", specifier = 
">=2.13.1" },
     { name = "python-slugify", specifier = ">=7.0.0" },
+    { name = "pyyaml", specifier = ">=6.0.3" },
     { name = "ray", extras = ["default"], marker = "python_full_version < 
'3.13'", specifier = ">=2.42.0" },
     { name = "ray", extras = ["default"], marker = "python_full_version == 
'3.13.*'", specifier = ">=2.49.0" },
     { name = "ray", extras = ["default"], marker = "python_full_version == 
'3.14.*'", specifier = ">=2.55.0" },
+    { name = "ruamel-yaml", specifier = ">=0.18.0" },
+    { name = "scikit-learn", marker = "python_full_version < '3.13'", 
specifier = ">=1.4.2" },
+    { name = "scikit-learn", marker = "python_full_version == '3.13.*'", 
specifier = ">=1.5.2" },
+    { name = "scikit-learn", marker = "python_full_version >= '3.14'", 
specifier = ">=1.7.2" },
     { name = "sqlalchemy-bigquery", specifier = ">=1.2.1" },
     { name = "sqlalchemy-spanner", specifier = ">=1.6.2" },
     { name = "tenacity", specifier = ">=8.3.0" },
+    { name = "tqdm", specifier = ">=4.67.1" },
 ]
 provides-extras = ["apache-beam", "cncf-kubernetes", "fab", "leveldb", 
"oracle", "facebook", "amazon", "apache-cassandra", "microsoft-azure", 
"microsoft-mssql", "mongo", "mysql", "openlineage", "postgres", "presto", 
"salesforce", "sftp", "ssh", "trino", "http", "standard", "common-ai", 
"common-messaging"]
 
@@ -7230,7 +7239,8 @@ source = { editable = "providers/openai" }
 dependencies = [
     { name = "apache-airflow" },
     { name = "apache-airflow-providers-common-compat" },
-    { name = "openai" },
+    { name = "openai", version = "2.54.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "openai", version = "3.42.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
 ]
 
 [package.dev-dependencies]
@@ -8284,7 +8294,8 @@ dependencies = [
 
 [package.optional-dependencies]
 common-ai = [
-    { name = "apache-airflow-providers-common-ai", extra = ["openai"] },
+    { name = "apache-airflow-providers-common-ai" },
+    { name = "apache-airflow-providers-common-ai", extra = ["openai"], marker 
= "extra == 'extra-34-apache-airflow-providers-common-ai-openai'" },
 ]
 microsoft-azure = [
     { name = "apache-airflow-providers-microsoft-azure" },
@@ -10214,7 +10225,8 @@ dependencies = [
     { name = "azure-identity" },
     { name = "azure-storage-blob" },
     { name = "isodate" },
-    { name = "openai" },
+    { name = "openai", version = "2.54.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "openai", version = "3.42.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
     { name = "typing-extensions" },
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/0c/dd/178a6a5b4098c3ef032ec5669f13b2c9ffbfd4b17092bcd1c34888fef7be/azure_ai_projects-2.4.0.tar.gz";,
 hash = 
"sha256:121154f70cf7de350a38a75e1da710f4e98b7d8114bc3b1ea25124469e34186f", size 
= 39729773, upload-time = "2026-07-27T21:53:02.819Z" }
@@ -10700,8 +10712,8 @@ name = "banks"
 version = "2.5.1"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
-    { name = "deprecated", version = "1.3.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version < '3.12'" },
-    { name = "deprecated", version = "3.0.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version >= '3.12'" },
+    { name = "deprecated", version = "1.3.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version < '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
+    { name = "deprecated", version = "3.0.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version >= '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
     { name = "filetype" },
     { name = "griffe" },
     { name = "jinja2" },
@@ -12908,58 +12920,6 @@ client = [
     { name = "starlette" },
 ]
 
-[[package]]
-name = "fastuuid"
-version = "0.14.0"
-source = { registry = "https://pypi.org/simple"; }
-sdist = { url = 
"https://files.pythonhosted.org/packages/c3/7d/d9daedf0f2ebcacd20d599928f8913e9d2aea1d56d2d355a93bfa2b611d7/fastuuid-0.14.0.tar.gz";,
 hash = 
"sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26", size 
= 18232, upload-time = "2025-10-19T22:19:22.402Z" }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/98/f3/12481bda4e5b6d3e698fbf525df4443cc7dce746f246b86b6fcb2fba1844/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl";,
 hash = 
"sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34", size 
= 516386, upload-time = "2025-10-19T22:42:40.176Z" },
-    { url = 
"https://files.pythonhosted.org/packages/59/19/2fc58a1446e4d72b655648eb0879b04e88ed6fa70d474efcf550f640f6ec/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7", size 
= 264569, upload-time = "2025-10-19T22:25:50.977Z" },
-    { url = 
"https://files.pythonhosted.org/packages/78/29/3c74756e5b02c40cfcc8b1d8b5bac4edbd532b55917a6bcc9113550e99d1/fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl";,
 hash = 
"sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1", size 
= 254366, upload-time = "2025-10-19T22:29:49.166Z" },
-    { url = 
"https://files.pythonhosted.org/packages/52/96/d761da3fccfa84f0f353ce6e3eb8b7f76b3aa21fd25e1b00a19f9c80a063/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc", size 
= 278978, upload-time = "2025-10-19T22:35:41.306Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fc/c2/f84c90167cc7765cb82b3ff7808057608b21c14a38531845d933a4637307/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";,
 hash = 
"sha256:bbb0c4b15d66b435d2538f3827f05e44e2baafcc003dd7d8472dc67807ab8fd8", size 
= 279692, upload-time = "2025-10-19T22:25:36.997Z" },
-    { url = 
"https://files.pythonhosted.org/packages/af/7b/4bacd03897b88c12348e7bd77943bac32ccf80ff98100598fcff74f75f2e/fastuuid-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl";,
 hash = 
"sha256:cd5a7f648d4365b41dbf0e38fe8da4884e57bed4e77c83598e076ac0c93995e7", size 
= 303384, upload-time = "2025-10-19T22:29:46.578Z" },
-    { url = 
"https://files.pythonhosted.org/packages/c0/a2/584f2c29641df8bd810d00c1f21d408c12e9ad0c0dafdb8b7b29e5ddf787/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl";,
 hash = 
"sha256:c0a94245afae4d7af8c43b3159d5e3934c53f47140be0be624b96acd672ceb73", size 
= 460921, upload-time = "2025-10-19T22:36:42.006Z" },
-    { url = 
"https://files.pythonhosted.org/packages/24/68/c6b77443bb7764c760e211002c8638c0c7cce11cb584927e723215ba1398/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_i686.whl";,
 hash = 
"sha256:2b29e23c97e77c3a9514d70ce343571e469098ac7f5a269320a0f0b3e193ab36", size 
= 480575, upload-time = "2025-10-19T22:28:18.975Z" },
-    { url = 
"https://files.pythonhosted.org/packages/5a/87/93f553111b33f9bb83145be12868c3c475bf8ea87c107063d01377cc0e8e/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl";,
 hash = 
"sha256:1e690d48f923c253f28151b3a6b4e335f2b06bf669c68a02665bc150b7839e94", size 
= 452317, upload-time = "2025-10-19T22:25:32.75Z" },
-    { url = 
"https://files.pythonhosted.org/packages/9e/8c/a04d486ca55b5abb7eaa65b39df8d891b7b1635b22db2163734dc273579a/fastuuid-0.14.0-cp311-cp311-win32.whl";,
 hash = 
"sha256:a6f46790d59ab38c6aa0e35c681c0484b50dc0acf9e2679c005d61e019313c24", size 
= 154804, upload-time = "2025-10-19T22:24:15.615Z" },
-    { url = 
"https://files.pythonhosted.org/packages/9c/b2/2d40bf00820de94b9280366a122cbaa60090c8cf59e89ac3938cf5d75895/fastuuid-0.14.0-cp311-cp311-win_amd64.whl";,
 hash = 
"sha256:e150eab56c95dc9e3fefc234a0eedb342fac433dacc273cd4d150a5b0871e1fa", size 
= 156099, upload-time = "2025-10-19T22:24:31.646Z" },
-    { url = 
"https://files.pythonhosted.org/packages/02/a2/e78fcc5df65467f0d207661b7ef86c5b7ac62eea337c0c0fcedbeee6fb13/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl";,
 hash = 
"sha256:77e94728324b63660ebf8adb27055e92d2e4611645bf12ed9d88d30486471d0a", size 
= 510164, upload-time = "2025-10-19T22:31:45.635Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2b/b3/c846f933f22f581f558ee63f81f29fa924acd971ce903dab1a9b6701816e/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:caa1f14d2102cb8d353096bc6ef6c13b2c81f347e6ab9d6fbd48b9dea41c153d", size 
= 261837, upload-time = "2025-10-19T22:38:38.53Z" },
-    { url = 
"https://files.pythonhosted.org/packages/54/ea/682551030f8c4fa9a769d9825570ad28c0c71e30cf34020b85c1f7ee7382/fastuuid-0.14.0-cp312-cp312-macosx_11_0_arm64.whl";,
 hash = 
"sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070", size 
= 251370, upload-time = "2025-10-19T22:40:26.07Z" },
-    { url = 
"https://files.pythonhosted.org/packages/14/dd/5927f0a523d8e6a76b70968e6004966ee7df30322f5fc9b6cdfb0276646a/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:0c9ec605ace243b6dbe3bd27ebdd5d33b00d8d1d3f580b39fdd15cd96fd71796", size 
= 277766, upload-time = "2025-10-19T22:37:23.779Z" },
-    { url = 
"https://files.pythonhosted.org/packages/16/6e/c0fb547eef61293153348f12e0f75a06abb322664b34a1573a7760501336/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";,
 hash = 
"sha256:808527f2407f58a76c916d6aa15d58692a4a019fdf8d4c32ac7ff303b7d7af09", size 
= 278105, upload-time = "2025-10-19T22:26:56.821Z" },
-    { url = 
"https://files.pythonhosted.org/packages/2d/b1/b9c75e03b768f61cf2e84ee193dc18601aeaf89a4684b20f2f0e9f52b62c/fastuuid-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl";,
 hash = 
"sha256:2fb3c0d7fef6674bbeacdd6dbd386924a7b60b26de849266d1ff6602937675c8", size 
= 301564, upload-time = "2025-10-19T22:30:31.604Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fc/fa/f7395fdac07c7a54f18f801744573707321ca0cee082e638e36452355a9d/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl";,
 hash = 
"sha256:ab3f5d36e4393e628a4df337c2c039069344db5f4b9d2a3c9cea48284f1dd741", size 
= 459659, upload-time = "2025-10-19T22:31:32.341Z" },
-    { url = 
"https://files.pythonhosted.org/packages/66/49/c9fd06a4a0b1f0f048aacb6599e7d96e5d6bc6fa680ed0d46bf111929d1b/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_i686.whl";,
 hash = 
"sha256:b9a0ca4f03b7e0b01425281ffd44e99d360e15c895f1907ca105854ed85e2057", size 
= 478430, upload-time = "2025-10-19T22:26:22.962Z" },
-    { url = 
"https://files.pythonhosted.org/packages/be/9c/909e8c95b494e8e140e8be6165d5fc3f61fdc46198c1554df7b3e1764471/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl";,
 hash = 
"sha256:3acdf655684cc09e60fb7e4cf524e8f42ea760031945aa8086c7eae2eeeabeb8", size 
= 450894, upload-time = "2025-10-19T22:27:01.647Z" },
-    { url = 
"https://files.pythonhosted.org/packages/90/eb/d29d17521976e673c55ef7f210d4cdd72091a9ec6755d0fd4710d9b3c871/fastuuid-0.14.0-cp312-cp312-win32.whl";,
 hash = 
"sha256:9579618be6280700ae36ac42c3efd157049fe4dd40ca49b021280481c78c3176", size 
= 154374, upload-time = "2025-10-19T22:29:19.879Z" },
-    { url = 
"https://files.pythonhosted.org/packages/cc/fc/f5c799a6ea6d877faec0472d0b27c079b47c86b1cdc577720a5386483b36/fastuuid-0.14.0-cp312-cp312-win_amd64.whl";,
 hash = 
"sha256:d9e4332dc4ba054434a9594cbfaf7823b57993d7d8e7267831c3e059857cf397", size 
= 156550, upload-time = "2025-10-19T22:27:49.658Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a5/83/ae12dd39b9a39b55d7f90abb8971f1a5f3c321fd72d5aa83f90dc67fe9ed/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl";,
 hash = 
"sha256:77a09cb7427e7af74c594e409f7731a0cf887221de2f698e1ca0ebf0f3139021", size 
= 510720, upload-time = "2025-10-19T22:42:34.633Z" },
-    { url = 
"https://files.pythonhosted.org/packages/53/b0/a4b03ff5d00f563cc7546b933c28cb3f2a07344b2aec5834e874f7d44143/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:9bd57289daf7b153bfa3e8013446aa144ce5e8c825e9e366d455155ede5ea2dc", size 
= 262024, upload-time = "2025-10-19T22:30:25.482Z" },
-    { url = 
"https://files.pythonhosted.org/packages/9c/6d/64aee0a0f6a58eeabadd582e55d0d7d70258ffdd01d093b30c53d668303b/fastuuid-0.14.0-cp313-cp313-macosx_11_0_arm64.whl";,
 hash = 
"sha256:ac60fc860cdf3c3f327374db87ab8e064c86566ca8c49d2e30df15eda1b0c2d5", size 
= 251679, upload-time = "2025-10-19T22:36:14.096Z" },
-    { url = 
"https://files.pythonhosted.org/packages/60/f5/a7e9cda8369e4f7919d36552db9b2ae21db7915083bc6336f1b0082c8b2e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:ab32f74bd56565b186f036e33129da77db8be09178cd2f5206a5d4035fb2a23f", size 
= 277862, upload-time = "2025-10-19T22:36:23.302Z" },
-    { url = 
"https://files.pythonhosted.org/packages/f0/d3/8ce11827c783affffd5bd4d6378b28eb6cc6d2ddf41474006b8d62e7448e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";,
 hash = 
"sha256:33e678459cf4addaedd9936bbb038e35b3f6b2061330fd8f2f6a1d80414c0f87", size 
= 278278, upload-time = "2025-10-19T22:29:43.809Z" },
-    { url = 
"https://files.pythonhosted.org/packages/a2/51/680fb6352d0bbade04036da46264a8001f74b7484e2fd1f4da9e3db1c666/fastuuid-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl";,
 hash = 
"sha256:1e3cc56742f76cd25ecb98e4b82a25f978ccffba02e4bdce8aba857b6d85d87b", size 
= 301788, upload-time = "2025-10-19T22:36:06.825Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fa/7c/2014b5785bd8ebdab04ec857635ebd84d5ee4950186a577db9eff0fb8ff6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl";,
 hash = 
"sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022", size 
= 459819, upload-time = "2025-10-19T22:35:31.623Z" },
-    { url = 
"https://files.pythonhosted.org/packages/01/d2/524d4ceeba9160e7a9bc2ea3e8f4ccf1ad78f3bde34090ca0c51f09a5e91/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_i686.whl";,
 hash = 
"sha256:09098762aad4f8da3a888eb9ae01c84430c907a297b97166b8abc07b640f2995", size 
= 478546, upload-time = "2025-10-19T22:26:03.023Z" },
-    { url = 
"https://files.pythonhosted.org/packages/bc/17/354d04951ce114bf4afc78e27a18cfbd6ee319ab1829c2d5fb5e94063ac6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl";,
 hash = 
"sha256:1383fff584fa249b16329a059c68ad45d030d5a4b70fb7c73a08d98fd53bcdab", size 
= 450921, upload-time = "2025-10-19T22:31:02.151Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fb/be/d7be8670151d16d88f15bb121c5b66cdb5ea6a0c2a362d0dcf30276ade53/fastuuid-0.14.0-cp313-cp313-win32.whl";,
 hash = 
"sha256:a0809f8cc5731c066c909047f9a314d5f536c871a7a22e815cc4967c110ac9ad", size 
= 154559, upload-time = "2025-10-19T22:36:36.011Z" },
-    { url = 
"https://files.pythonhosted.org/packages/22/1d/5573ef3624ceb7abf4a46073d3554e37191c868abc3aecd5289a72f9810a/fastuuid-0.14.0-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:0df14e92e7ad3276327631c9e7cec09e32572ce82089c55cb1bb8df71cf394ed", size 
= 156539, upload-time = "2025-10-19T22:33:35.898Z" },
-    { url = 
"https://files.pythonhosted.org/packages/16/c9/8c7660d1fe3862e3f8acabd9be7fc9ad71eb270f1c65cce9a2b7a31329ab/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl";,
 hash = 
"sha256:b852a870a61cfc26c884af205d502881a2e59cc07076b60ab4a951cc0c94d1ad", size 
= 510600, upload-time = "2025-10-19T22:43:44.17Z" },
-    { url = 
"https://files.pythonhosted.org/packages/4c/f4/a989c82f9a90d0ad995aa957b3e572ebef163c5299823b4027986f133dfb/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:c7502d6f54cd08024c3ea9b3514e2d6f190feb2f46e6dbcd3747882264bb5f7b", size 
= 262069, upload-time = "2025-10-19T22:43:38.38Z" },
-    { url = 
"https://files.pythonhosted.org/packages/da/6c/a1a24f73574ac995482b1326cf7ab41301af0fabaa3e37eeb6b3df00e6e2/fastuuid-0.14.0-cp314-cp314-macosx_11_0_arm64.whl";,
 hash = 
"sha256:1ca61b592120cf314cfd66e662a5b54a578c5a15b26305e1b8b618a6f22df714", size 
= 251543, upload-time = "2025-10-19T22:32:22.537Z" },
-    { url = 
"https://files.pythonhosted.org/packages/1a/20/2a9b59185ba7a6c7b37808431477c2d739fcbdabbf63e00243e37bd6bf49/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";,
 hash = 
"sha256:aa75b6657ec129d0abded3bec745e6f7ab642e6dba3a5272a68247e85f5f316f", size 
= 277798, upload-time = "2025-10-19T22:33:53.821Z" },
-    { url = 
"https://files.pythonhosted.org/packages/ef/33/4105ca574f6ded0af6a797d39add041bcfb468a1255fbbe82fcb6f592da2/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";,
 hash = 
"sha256:a8a0dfea3972200f72d4c7df02c8ac70bad1bb4c58d7e0ec1e6f341679073a7f", size 
= 278283, upload-time = "2025-10-19T22:29:02.812Z" },
-    { url = 
"https://files.pythonhosted.org/packages/fe/8c/fca59f8e21c4deb013f574eae05723737ddb1d2937ce87cb2a5d20992dc3/fastuuid-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl";,
 hash = 
"sha256:1bf539a7a95f35b419f9ad105d5a8a35036df35fdafae48fb2fd2e5f318f0d75", size 
= 301627, upload-time = "2025-10-19T22:35:54.985Z" },
-    { url = 
"https://files.pythonhosted.org/packages/cb/e2/f78c271b909c034d429218f2798ca4e89eeda7983f4257d7865976ddbb6c/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl";,
 hash = 
"sha256:9a133bf9cc78fdbd1179cb58a59ad0100aa32d8675508150f3658814aeefeaa4", size 
= 459778, upload-time = "2025-10-19T22:28:00.999Z" },
-    { url = 
"https://files.pythonhosted.org/packages/1e/f0/5ff209d865897667a2ff3e7a572267a9ced8f7313919f6d6043aed8b1caa/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_i686.whl";,
 hash = 
"sha256:f54d5b36c56a2d5e1a31e73b950b28a0d83eb0c37b91d10408875a5a29494bad", size 
= 478605, upload-time = "2025-10-19T22:36:21.764Z" },
-    { url = 
"https://files.pythonhosted.org/packages/e0/c8/2ce1c78f983a2c4987ea865d9516dbdfb141a120fd3abb977ae6f02ba7ca/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl";,
 hash = 
"sha256:ec27778c6ca3393ef662e2762dba8af13f4ec1aaa32d08d77f71f2a70ae9feb8", size 
= 450837, upload-time = "2025-10-19T22:34:37.178Z" },
-    { url = 
"https://files.pythonhosted.org/packages/df/60/dad662ec9a33b4a5fe44f60699258da64172c39bd041da2994422cdc40fe/fastuuid-0.14.0-cp314-cp314-win32.whl";,
 hash = 
"sha256:e23fc6a83f112de4be0cc1990e5b127c27663ae43f866353166f87df58e73d06", size 
= 154532, upload-time = "2025-10-19T22:35:18.217Z" },
-    { url = 
"https://files.pythonhosted.org/packages/1f/f6/da4db31001e854025ffd26bc9ba0740a9cbba2c3259695f7c5834908b336/fastuuid-0.14.0-cp314-cp314-win_amd64.whl";,
 hash = 
"sha256:df61342889d0f5e7a32f7284e55ef95103f2110fee433c2ae7c2c0956d76ac8a", size 
= 156457, upload-time = "2025-10-19T22:33:44.579Z" },
-]
-
 [[package]]
 name = "filelock"
 version = "4.2.4"
@@ -13759,18 +13719,6 @@ wheels = [
     { url = 
"https://files.pythonhosted.org/packages/4a/29/8bb9f8df34e925d4ec895104e2aa33fea5ac9cf43dd96654888224da47ac/google_cloud_aiplatform-1.164.0-py2.py3-none-any.whl";,
 hash = 
"sha256:042dbbd9f48524ad4ac34c25b00be4f4ca8b1b38fd6d5d277cc80501777974a0", size 
= 9432429, upload-time = "2026-08-12T20:40:48.936Z" },
 ]
 
-[package.optional-dependencies]
-evaluation = [
-    { name = "jsonschema" },
-    { name = "litellm", version = "1.85.7", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version < '3.14'" },
-    { name = "litellm", version = "1.96.2", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version >= '3.14'" },
-    { name = "pandas" },
-    { name = "pyyaml" },
-    { name = "ruamel-yaml" },
-    { name = "scikit-learn" },
-    { name = "tqdm" },
-]
-
 [[package]]
 name = "google-cloud-alloydb"
 version = "0.11.4"
@@ -16908,89 +16856,6 @@ wheels = [
     { url = 
"https://files.pythonhosted.org/packages/13/d4/1152d1c7ab42d8b908be64fd200ddc870dc9d4925e951198702084aa1a7d/linkify_it_py-2.2.0-py3-none-any.whl";,
 hash = 
"sha256:3adc40eb5af300b2605fcfdb968c24e1d780a90f1f2221af7c15e5111e94d443", size 
= 21971, upload-time = "2026-08-29T07:07:07.164Z" },
 ]
 
-[[package]]
-name = "litellm"
-version = "1.85.7"
-source = { registry = "https://pypi.org/simple"; }
-resolution-markers = [
-    "python_full_version == '3.13.*' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
-    "python_full_version == '3.13.*' and sys_platform == 'win32'",
-    "python_full_version == '3.13.*' and sys_platform == 'emscripten'",
-    "(python_full_version == '3.13.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.13.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
-    "python_full_version == '3.12.*' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
-    "python_full_version == '3.12.*' and sys_platform == 'win32'",
-    "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
-    "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
-    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
-    "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
-    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
-    "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
-    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
-    "python_full_version < '3.11.3' and sys_platform == 'win32'",
-    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
-    "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
-]
-dependencies = [
-    { name = "aiohttp" },
-    { name = "click" },
-    { name = "fastuuid" },
-    { name = "httpx" },
-    { name = "importlib-metadata" },
-    { name = "jinja2" },
-    { name = "jsonschema" },
-    { name = "openai" },
-    { name = "pydantic" },
-    { name = "python-dotenv" },
-    { name = "tiktoken" },
-    { name = "tokenizers" },
-]
-sdist = { url = 
"https://files.pythonhosted.org/packages/0d/59/364fa090acef716effd88e6432d3442982b1f965b2d291f1528db0e6aabb/litellm-1.85.7.tar.gz";,
 hash = 
"sha256:461cc5d5a6c7d5086b67f06f1d5a00c40d6fb0240099764cb040dc4a28452938", size 
= 15363830, upload-time = "2026-06-24T04:54:55.115Z" }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/bd/3b/baf1f8736c572f308eea14100372c39b3f70ee540e8cda537edd594628fc/litellm-1.85.7-py3-none-any.whl";,
 hash = 
"sha256:4e07ec1c22aa81897daed83d7e98eb05187a82827918c240e2952384780f9c62", size 
= 16996595, upload-time = "2026-06-24T04:54:51.974Z" },
-]
-
-[[package]]
-name = "litellm"
-version = "1.96.2"
-source = { registry = "https://pypi.org/simple"; }
-resolution-markers = [
-    "python_full_version >= '3.15' and sys_platform == 'win32'",
-    "python_full_version >= '3.15' and sys_platform == 'emscripten'",
-    "python_full_version >= '3.15' and sys_platform != 'emscripten' and 
sys_platform != 'win32'",
-    "python_full_version == '3.14.*' and sys_platform == 'win32'",
-    "python_full_version == '3.14.*' and sys_platform == 'emscripten'",
-    "python_full_version == '3.14.*' and sys_platform != 'emscripten' and 
sys_platform != 'win32'",
-]
-dependencies = [
-    { name = "aiohttp" },
-    { name = "click" },
-    { name = "fastuuid" },
-    { name = "httpx" },
-    { name = "importlib-metadata" },
-    { name = "jinja2" },
-    { name = "jsonschema" },
-    { name = "openai" },
-    { name = "pydantic" },
-    { name = "pydantic-settings" },
-    { name = "python-dotenv" },
-    { name = "tiktoken" },
-    { name = "tokenizers" },
-]
-sdist = { url = 
"https://files.pythonhosted.org/packages/79/fe/d03be8a6be6914fabacef29457a2b3d02128c52c448cc6f3019b8e63488b/litellm-1.96.2.tar.gz";,
 hash = 
"sha256:80d477ae092b05ce023b5084542cb3cb75999b52b1dd2e4d834fb348effc9399", size 
= 17682558, upload-time = "2026-08-11T21:12:24.117Z" }
-wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/46/85/653d0095a163cc9a1f2f1aa629cf4493c57c3abe13bd806290fc5d57458b/litellm-1.96.2-cp310-abi3-macosx_10_12_x86_64.whl";,
 hash = 
"sha256:0aa667c6fc58b20ff04fe5efaac5cf48b1e224bac32dbf22ced2e5ee695bc4ba", size 
= 24102871, upload-time = "2026-08-11T21:12:06.152Z" },
-    { url = 
"https://files.pythonhosted.org/packages/29/a1/1322630271fbb291e97b54eb46baa8c4f512130a620a8428c7460b4ef414/litellm-1.96.2-cp310-abi3-macosx_11_0_arm64.whl";,
 hash = 
"sha256:e5d96d16b37a043e482a134a71b0c1df4e700603fc14df22e4bd27dc9e38f5c4", size 
= 23760722, upload-time = "2026-08-11T21:12:09.257Z" },
-    { url = 
"https://files.pythonhosted.org/packages/17/0e/e0e2734194072a438298e94dbc3c37879d335fdf50881ce8995daa6878d1/litellm-1.96.2-cp310-abi3-manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:1a42d68b903f6b605bd7744e9700b16a725f897c5edcc448e491cec14cd5a9db", size 
= 23898969, upload-time = "2026-08-11T21:12:11.68Z" },
-    { url = 
"https://files.pythonhosted.org/packages/b5/84/993c40c116c699383741fd27da515c71b395609859148ea32720925eaeaf/litellm-1.96.2-cp310-abi3-manylinux_2_28_x86_64.whl";,
 hash = 
"sha256:76e9c72cb6757bb7c35cd23e3e4fc028910795910ae92491076bd50f7b61f205", size 
= 24264588, upload-time = "2026-08-11T21:12:14.18Z" },
-    { url = 
"https://files.pythonhosted.org/packages/d8/02/21dc260ae3fd72b23544abce23ad5f3d563e3d39a4f617bba6d98f4b9c31/litellm-1.96.2-cp310-abi3-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:1f304b8854e385946469d2dcf8ef88e24357120671caeaddea11b085b0302308", size 
= 23973160, upload-time = "2026-08-11T21:12:16.616Z" },
-    { url = 
"https://files.pythonhosted.org/packages/64/5d/e79f86b43f07aff7f796faf3c6d1025f6ab9da43f72b7c555a26811af191/litellm-1.96.2-cp310-abi3-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:8c21a57a0f3507176492a4f65361a4302af1a0723c97e96961c7ed0e96934832", size 
= 24360615, upload-time = "2026-08-11T21:12:18.947Z" },
-    { url = 
"https://files.pythonhosted.org/packages/3e/6a/c2e3058fd3766eebe5685c688d9e85adb9749e946580f46214a651661522/litellm-1.96.2-cp310-abi3-win_amd64.whl";,
 hash = 
"sha256:0168e49cffecb0b45a0d044ecb7e5f7f6fc9e14d974b50f54edfa9d8e0db9c1d", size 
= 24154302, upload-time = "2026-08-11T21:12:21.221Z" },
-]
-
 [[package]]
 name = "llama-index-core"
 version = "0.14.25"
@@ -17000,16 +16865,16 @@ dependencies = [
     { name = "aiosqlite" },
     { name = "banks" },
     { name = "dataclasses-json" },
-    { name = "deprecated", version = "1.3.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version < '3.12'" },
-    { name = "deprecated", version = "3.0.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version >= '3.12'" },
+    { name = "deprecated", version = "1.3.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version < '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
+    { name = "deprecated", version = "3.0.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version >= '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
     { name = "dirtyjson" },
     { name = "filetype" },
     { name = "fsspec" },
     { name = "httpx" },
     { name = "llama-index-workflows" },
     { name = "nest-asyncio" },
-    { name = "networkx", version = "3.6.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version < '3.12'" },
-    { name = "networkx", version = "3.7", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version >= '3.12'" },
+    { name = "networkx", version = "3.6.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version < '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
+    { name = "networkx", version = "3.7", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version >= '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
     { name = "nltk" },
     { name = "numpy" },
     { name = "pillow" },
@@ -17018,7 +16883,7 @@ dependencies = [
     { name = "pyyaml" },
     { name = "requests" },
     { name = "setuptools" },
-    { name = "sqlalchemy", extra = ["asyncio"] },
+    { name = "sqlalchemy", extra = ["asyncio"], marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
     { name = "tenacity" },
     { name = "tiktoken" },
     { name = "tinytag" },
@@ -17038,7 +16903,7 @@ version = "0.7.0"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "llama-index-core" },
-    { name = "openai" },
+    { name = "openai", version = "2.54.0", source = { registry = 
"https://pypi.org/simple"; } },
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/e1/b3/7a972c0d0eef29a0cd89f4fd2f25c73665439951adc3f28a397cfa3cf3d5/llama_index_embeddings_openai-0.7.0.tar.gz";,
 hash = 
"sha256:5842ef9503501a713363ea8b28462f4ee4f5e778a5c852399f771ff417906507", size 
= 7625, upload-time = "2026-08-31T15:53:11.079Z" }
 wheels = [
@@ -17050,8 +16915,8 @@ name = "llama-index-instrumentation"
 version = "0.6.0"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
-    { name = "deprecated", version = "1.3.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version < '3.12'" },
-    { name = "deprecated", version = "3.0.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "python_full_version >= '3.12'" },
+    { name = "deprecated", version = "1.3.1", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version < '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
+    { name = "deprecated", version = "3.0.0", source = { registry = 
"https://pypi.org/simple"; }, marker = "(python_full_version >= '3.12' and extra 
== 'extra-34-apache-airflow-providers-common-ai-llamaindex') or (extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex' and extra == 
'extra-34-apache-airflow-providers-common-ai-openai')" },
     { name = "pydantic" },
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/70/ac/ffc116bac024cb0a54b4d28ca9b421e9a08f408c1fcc0039a36de2c0c97b/llama_index_instrumentation-0.6.0.tar.gz";,
 hash = 
"sha256:b185c4e28a7f32899c27649cc2e2d7d54267fa2ff0cd43cbe2b5212bae98fe3a", size 
= 56517, upload-time = "2026-08-29T15:33:16.861Z" }
@@ -17065,7 +16930,7 @@ version = "0.8.3"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "llama-index-core" },
-    { name = "openai" },
+    { name = "openai", version = "2.54.0", source = { registry = 
"https://pypi.org/simple"; } },
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/4e/f3/32798fca5abd745bdce5bc43246eb3ce8346c2a2f905c90ad19ed51b49e9/llama_index_llms_openai-0.8.3.tar.gz";,
 hash = 
"sha256:a27c174fb8670209581513cb592291508043f10b5afea5198454501921808ba6", size 
= 27976, upload-time = "2026-10-12T19:29:01.214Z" }
 wheels = [
@@ -18946,21 +18811,94 @@ wheels = [
 name = "openai"
 version = "2.54.0"
 source = { registry = "https://pypi.org/simple"; }
+resolution-markers = [
+    "python_full_version >= '3.15' and sys_platform == 'win32'",
+    "python_full_version >= '3.15' and sys_platform == 'emscripten'",
+    "python_full_version >= '3.15' and sys_platform != 'emscripten' and 
sys_platform != 'win32'",
+    "python_full_version == '3.14.*' and sys_platform == 'win32'",
+    "python_full_version == '3.14.*' and sys_platform == 'emscripten'",
+    "python_full_version == '3.14.*' and sys_platform != 'emscripten' and 
sys_platform != 'win32'",
+    "python_full_version == '3.13.*' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version == '3.13.*' and sys_platform == 'win32'",
+    "python_full_version == '3.13.*' and sys_platform == 'emscripten'",
+    "(python_full_version == '3.13.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.13.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
+    "python_full_version == '3.12.*' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version == '3.12.*' and sys_platform == 'win32'",
+    "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
+    "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
+    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
+    "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
+    "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
+    "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
+]
 dependencies = [
-    { name = "anyio" },
-    { name = "distro" },
-    { name = "httpx" },
-    { name = "jiter" },
-    { name = "pydantic" },
-    { name = "sniffio" },
-    { name = "tqdm" },
-    { name = "typing-extensions" },
+    { name = "anyio", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "distro", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "httpx", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "jiter", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "pydantic", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "sniffio", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "tqdm", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
+    { name = "typing-extensions", marker = "extra == 
'extra-34-apache-airflow-providers-common-ai-llamaindex'" },
 ]
 sdist = { url = 
"https://files.pythonhosted.org/packages/50/9a/8c75e8c8a5b407a0586faeb2afac91674ff955c191ecc1d6d3b6669f6788/openai-2.54.0.tar.gz";,
 hash = 
"sha256:e3e6f8bc1ba30ddf381ace1a14340eed381cb984a1a59bd0f34b5be3b5d49cfa", size 
= 1100285, upload-time = "2026-08-11T18:46:59.035Z" }
 wheels = [
     { url = 
"https://files.pythonhosted.org/packages/64/a8/bb76c7356de8ad57f59d5ff993d434df0607f07f08bcc9c9a5c275e399c0/openai-2.54.0-py3-none-any.whl";,
 hash = 
"sha256:89089789197ccdb87f173a03145ed1598d00795220c93e96cf712b1cbf5e5f2b", size 
= 1660351, upload-time = "2026-08-11T18:46:56.684Z" },
 ]
 
+[[package]]
+name = "openai"
+version = "3.42.0"
+source = { registry = "https://pypi.org/simple"; }
+resolution-markers = [
+    "python_full_version >= '3.15' and sys_platform == 'win32'",
+    "python_full_version >= '3.15' and sys_platform == 'emscripten'",
+    "python_full_version >= '3.15' and sys_platform != 'emscripten' and 
sys_platform != 'win32'",
+    "python_full_version == '3.14.*' and sys_platform == 'win32'",
+    "python_full_version == '3.14.*' and sys_platform == 'emscripten'",
+    "python_full_version == '3.14.*' and sys_platform != 'emscripten' and 
sys_platform != 'win32'",
+    "python_full_version == '3.13.*' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version == '3.13.*' and sys_platform == 'win32'",
+    "python_full_version == '3.13.*' and sys_platform == 'emscripten'",
+    "(python_full_version == '3.13.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.13.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
+    "python_full_version == '3.12.*' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version == '3.12.*' and sys_platform == 'win32'",
+    "python_full_version == '3.12.*' and sys_platform == 'emscripten'",
+    "(python_full_version == '3.12.*' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version == '3.12.*' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
+    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform == 'emscripten'",
+    "(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.5' and python_full_version < '3.12' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine == 'arm64' and sys_platform == 'darwin'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'win32'",
+    "python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform == 'emscripten'",
+    "(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
platform_machine != 'arm64' and sys_platform == 'darwin') or 
(python_full_version >= '3.11.3' and python_full_version < '3.11.5' and 
sys_platform != 'darwin' and sys_platform != 'emscripten' and sys_platform != 
'win32')",
+    "python_full_version < '3.11.3' and platform_machine == 'arm64' and 
sys_platform == 'darwin'",
+    "python_full_version < '3.11.3' and sys_platform == 'win32'",
+    "python_full_version < '3.11.3' and sys_platform == 'emscripten'",
+    "(python_full_version < '3.11.3' and platform_machine != 'arm64' and 
sys_platform == 'darwin') or (python_full_version < '3.11.3' and sys_platform 
!= 'darwin' and sys_platform != 'emscripten' and sys_platform != 'win32')",
+]
+dependencies = [
+    { name = "anyio", marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
+    { name = "httpx2", marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
+    { name = "jiter", marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
+    { name = "pydantic", marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
+    { name = "sniffio", marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
+    { name = "typing-extensions", marker = "extra != 
'extra-34-apache-airflow-providers-common-ai-llamaindex' or extra == 
'extra-34-apache-airflow-providers-common-ai-openai'" },
+]
+sdist = { url = 
"https://files.pythonhosted.org/packages/f9/ef/c17c9ca921c1991b0a7185e8282da1996d09292b0caaf2e7cffd7e051eb6/openai-3.42.0.tar.gz";,
 hash = 
"sha256:deffe27f9e20e4f1d9d471978d12f23aa119382494c0a9860795e66943d0fe42", size 
= 2353482, upload-time = "2026-10-31T00:27:26.502Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/c5/79/904afac12186d9ab9e3f731eb798e36dc0f5b991a557c4304b0a43e393c1/openai-3.42.0-py3-none-any.whl";,
 hash = 
"sha256:efb9d089ecf66c668289f647717389df98b40b954cd86d4fe54eddce39aabb3f", size 
= 2397860, upload-time = "2026-10-31T00:27:24.493Z" },
+]
+
 [[package]]
 name = "openapi-schema-validator"
 version = "0.9.0"
@@ -20905,7 +20843,7 @@ mcp = [
     { name = "fastmcp-slim", extra = ["client"] },
 ]
 openai = [
-    { name = "openai" },
+    { name = "openai", version = "3.42.0", source = { registry = 
"https://pypi.org/simple"; } },
     { name = "tiktoken" },
 ]
 

Reply via email to