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" },
]