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 4aeb647a51a Fix `common.ai` Anthropic models failing against anthropic
1.x in the CI image (#73511)
4aeb647a51a is described below
commit 4aeb647a51a9ea2a0cb9fee04939078d175cf34f
Author: Kaxil Naik <[email protected]>
AuthorDate: Tue Sep 22 09:31:21 2026 +0100
Fix `common.ai` Anthropic models failing against anthropic 1.x in the CI
image (#73511)
pydantic-ai-slim below 2.33 cannot talk to anthropic 1.x: it hands the SDK
an
httpx v1 client that anthropic rejects, and it passes temperature as a
messages.create() kwarg that anthropic 1.x removed. The workspace lock was
stuck
on 2.31.1 because pydantic-ai-slim[openai]>=2.33 declares openai>=3 while
llama-index-llms-openai and litellm (via the Google provider's aiplatform
evaluation extra) cap openai below 3.
Raise the provider's floor to 2.33.0 and add a workspace uv override that
holds
openai on 2.x, the pairing constraints-main already ships and the one the CI
image's pip check accepts. The lock moves only pydantic-ai-slim and
pydantic-graph to 2.44.0. Published wheels are unchanged apart from the
floor.
* Raise common.ai openai and llama-index floors to versions that work at
the lowest resolution
With the openai override in place, the lowest-direct-dependency run
installs the
provider's own floors instead of the ones upstream caps used to force.
openai 2.45
and 2.46 reject the httpx2 client pydantic-ai-slim>=2.33 hands them; 2.47.0
is the
first that accepts it. llama-index-llms-openai 0.6.0 declares
llama-index-core>=0.13
but imports a type core only gained in 0.14; 0.6.8 is the first release
whose
metadata matches, and it needs core>=0.14.5. The override's lower bound
moves to
2.47.0 too, since it replaces the provider's floor during that resolution.
---
providers/common/ai/README.rst | 2 +-
providers/common/ai/docs/index.rst | 14 ++++++------
providers/common/ai/pyproject.toml | 44 ++++++++++++++++++++++----------------
pyproject.toml | 11 ++++++++++
uv.lock | 42 ++++++++++++++++++------------------
5 files changed, 65 insertions(+), 48 deletions(-)
diff --git a/providers/common/ai/README.rst b/providers/common/ai/README.rst
index 06fd5e0eff9..157cc06918f 100644
--- a/providers/common/ai/README.rst
+++ b/providers/common/ai/README.rst
@@ -56,7 +56,7 @@ PIP package Version required
``apache-airflow`` ``>=3.0.0``
``apache-airflow-providers-common-compat`` ``>=1.15.0``
``apache-airflow-providers-standard`` ``>=1.12.1``
-``pydantic-ai-slim`` ``>=2.23.0``
+``pydantic-ai-slim`` ``>=2.33.0``
========================================== ==================
Optional cross provider package dependencies
diff --git a/providers/common/ai/docs/index.rst
b/providers/common/ai/docs/index.rst
index 12ef3431d5c..dde903f39b0 100644
--- a/providers/common/ai/docs/index.rst
+++ b/providers/common/ai/docs/index.rst
@@ -243,7 +243,7 @@ PIP package Version required
``apache-airflow`` ``>=3.0.0``
``apache-airflow-providers-common-compat`` ``>=1.15.0``
``apache-airflow-providers-standard`` ``>=1.12.1``
-``pydantic-ai-slim`` ``>=2.23.0``
+``pydantic-ai-slim`` ``>=2.33.0``
========================================== ==================
Optional cross provider package dependencies
@@ -280,12 +280,12 @@ Install them when installing from PyPI. For example:
==============
=======================================================================================================================================
Extra Dependencies
==============
=======================================================================================================================================
-``anthropic`` ``pydantic-ai-slim[anthropic]>=2.23.0``, ``anthropic>=1.0.0``
-``bedrock`` ``pydantic-ai-slim[bedrock]>=2.23.0``
-``google`` ``pydantic-ai-slim[google]>=2.23.0``
-``openai`` ``pydantic-ai-slim[openai]>=2.23.0``, ``openai>=2.45.0``
+``anthropic`` ``pydantic-ai-slim[anthropic]>=2.33.0``, ``anthropic>=1.0.0``
+``bedrock`` ``pydantic-ai-slim[bedrock]>=2.33.0``
+``google`` ``pydantic-ai-slim[google]>=2.33.0``
+``openai`` ``pydantic-ai-slim[openai]>=2.33.0``, ``openai>=2.47.0``
``typesafe`` ``typesafe-sdk>=0.6.0``
-``mcp`` ``pydantic-ai-slim[mcp]>=2.23.0``
+``mcp`` ``pydantic-ai-slim[mcp]>=2.33.0``
``modal`` ``modal>=1.5.0``
``code-mode`` ``pydantic-ai-harness[codemode]>=0.3.0``
``shields`` ``pydantic-ai-shields>=0.3.4``
@@ -295,7 +295,7 @@ Extra Dependencies
``sql`` ``apache-airflow-providers-common-sql>=1.33.0``,
``sqlglot>=30.0.0``
``common.sql`` ``apache-airflow-providers-common-sql>=1.33.0``
``langchain`` ``langchain>=1.0.0``
-``llamaindex`` ``dataclasses-json>=0.6.7``, ``llama-index-core>=0.13.0``,
``llama-index-embeddings-openai>=0.6.0``, ``llama-index-llms-openai>=0.6.0``
+``llamaindex`` ``dataclasses-json>=0.6.7``, ``llama-index-core>=0.14.5``,
``llama-index-embeddings-openai>=0.6.0``, ``llama-index-llms-openai>=0.6.8``
``pdf`` ``pypdf>=4.0.0``
``docx`` ``python-docx>=1.0.0``
``git`` ``apache-airflow-providers-git``
diff --git a/providers/common/ai/pyproject.toml
b/providers/common/ai/pyproject.toml
index 94d5204eb54..a92d0efbbec 100644
--- a/providers/common/ai/pyproject.toml
+++ b/providers/common/ai/pyproject.toml
@@ -70,32 +70,35 @@ dependencies = [
"apache-airflow>=3.0.0",
"apache-airflow-providers-common-compat>=1.15.0",
"apache-airflow-providers-standard>=1.12.1", # use next version
- # Requires the pydantic-ai cost API (RunUsage.cost,
UsageLimits.cost_limit),
- # landed in 2.23.0 via https://github.com/pydantic/pydantic-ai/pull/2684.
- "pydantic-ai-slim>=2.23.0",
+ # 2.33.0 is the first release that works with anthropic>=1: it moved to
httpx2 alongside
+ # the SDK and stopped passing temperature/top_p/top_k as messages.create()
kwargs, both
+ # of which raise TypeError on 2.31 and earlier. The cost API this provider
relies on
+ # (RunUsage.cost, UsageLimits.cost_limit) landed earlier, in 2.23.0.
+ "pydantic-ai-slim>=2.33.0",
]
# The optional dependencies should be modified in place in the generated file
# Any change in the dependencies is preserved when the file is regenerated
[project.optional-dependencies]
# @task.llm_batch talks to the provider batch APIs through the vendor SDKs
directly, since
-# pydantic-ai has no batch abstraction. anthropic 1.0.0 is the first stable
major; openai
-# 2.45.0 is the floor pydantic-ai-slim[openai]>=2.23.0 already imposes.
-"anthropic" = ["pydantic-ai-slim[anthropic]>=2.23.0", "anthropic>=1.0.0"]
-"bedrock" = ["pydantic-ai-slim[bedrock]>=2.23.0"]
-"google" = ["pydantic-ai-slim[google]>=2.23.0"]
-"openai" = ["pydantic-ai-slim[openai]>=2.23.0", "openai>=2.45.0"]
+# pydantic-ai has no batch abstraction. anthropic 1.0.0 is the first stable
major. 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" = ["pydantic-ai-slim[anthropic]>=2.33.0", "anthropic>=1.0.0"]
+"bedrock" = ["pydantic-ai-slim[bedrock]>=2.33.0"]
+"google" = ["pydantic-ai-slim[google]>=2.33.0"]
+"openai" = ["pydantic-ai-slim[openai]>=2.33.0", "openai>=2.47.0"]
# TypeSafe Jev: answers typed questions (pick one of N, a bounded score, a
yes/no
# probability) and cannot emit text, so it fits a branch or a classification
but not a
# summary. It arrives through pydantic-ai's own ``typesafe:`` provider, so the
hook needs
# no changes -- setting ``model_id`` or the connection's Model field is the
integration.
# The adapter itself ships inside pydantic-ai-slim from 2.45.0
(pydantic/pydantic-ai#8450);
# this extra only adds the pre-1.0 typesafe-sdk it talks to, which is why it
is opt-in. It
-# deliberately does not raise the pydantic-ai-slim floor: from 2.31 the
``openai`` extra
-# needs openai>=3.8 while llama-index-llms-openai and the Google provider's
litellm need
-# openai<3, so a higher floor makes the workspace unsatisfiable. The guide
says 2.45+.
+# deliberately does not raise the pydantic-ai-slim floor to 2.45; the guide
says 2.45+.
"typesafe" = ["typesafe-sdk>=0.6.0"]
-"mcp" = ["pydantic-ai-slim[mcp]>=2.23.0"]
+"mcp" = ["pydantic-ai-slim[mcp]>=2.33.0"]
# Modal-hosted sandboxes for SandboxToolset, the backend to use where the
worker host
# cannot run microVMs -- Kubernetes, most notably. Needs no host-level
installation,
# only Modal credentials.
@@ -133,11 +136,14 @@ dependencies = [
"langchain" = [
"langchain>=1.0.0",
]
+# llama-index-llms-openai 0.6.8 is the first release that works with openai
2.x and whose
+# metadata matches its imports (0.6.0 declares llama-index-core>=0.13.0 but
needs the
+# ThinkingBlock type core only gained in 0.14); it requires
llama-index-core>=0.14.5.
"llamaindex" = [
"dataclasses-json>=0.6.7",
- "llama-index-core>=0.13.0",
+ "llama-index-core>=0.14.5",
"llama-index-embeddings-openai>=0.6.0",
- "llama-index-llms-openai>=0.6.0",
+ "llama-index-llms-openai>=0.6.8",
]
"pdf" = ["pypdf>=4.0.0"]
"docx" = ["python-docx>=1.0.0"]
@@ -156,16 +162,16 @@ dev = [
"apache-airflow-providers-standard",
# Additional devel dependencies (do not remove this line and add extra
development dependencies)
"sqlglot>=30.0.0",
- "pydantic-ai-slim[mcp]>=2.23.0",
+ "pydantic-ai-slim[mcp]>=2.33.0",
"pydantic-ai-skills>=1.2.0",
"apache-airflow-providers-common-sql[datafusion]",
"langchain>=1.0.0",
- "llama-index-core>=0.13.0",
+ "llama-index-core>=0.14.5",
"llama-index-embeddings-openai>=0.6.0",
- "llama-index-llms-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.45.0",
+ "openai>=2.47.0",
"anthropic>=1.0.0",
]
diff --git a/pyproject.toml b/pyproject.toml
index 14af9aa3600..e9e765957b9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1442,6 +1442,17 @@ ci-image = [
# floor; `scripts/ci/prek/upgrade_important_versions.py` deliberately skips it.
required-version = ">=0.11.8"
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 both
allow openai 3.
+override-dependencies = ["openai>=2.47.0,<3"]
# Synchroonize with scripts/ci/prek/upgrade_important_versions.py
exclude-newer = "4 days"
diff --git a/uv.lock b/uv.lock
index a47f2392617..ab4c7c10ab1 100644
--- a/uv.lock
+++ b/uv.lock
@@ -315,6 +315,7 @@ members = [
"apache-airflow-task-sdk",
"apache-airflow-task-sdk-integration-tests",
]
+overrides = [{ name = "openai", specifier = ">=2.47.0,<3" }]
[[package]]
name = "a2wsgi"
@@ -4703,22 +4704,22 @@ requires-dist = [
{ name = "fastavro", marker = "python_full_version >= '3.14' and extra ==
'avro'", specifier = ">=1.12.1" },
{ name = "fastavro", marker = "python_full_version < '3.14' and extra ==
'avro'", specifier = ">=1.10.0" },
{ name = "langchain", marker = "extra == 'langchain'", specifier =
">=1.0.0" },
- { name = "llama-index-core", marker = "extra == 'llamaindex'", specifier =
">=0.13.0" },
+ { name = "llama-index-core", marker = "extra == 'llamaindex'", specifier =
">=0.14.5" },
{ name = "llama-index-embeddings-openai", marker = "extra ==
'llamaindex'", specifier = ">=0.6.0" },
- { name = "llama-index-llms-openai", marker = "extra == 'llamaindex'",
specifier = ">=0.6.0" },
+ { name = "llama-index-llms-openai", marker = "extra == 'llamaindex'",
specifier = ">=0.6.8" },
{ name = "modal", marker = "extra == 'modal'", specifier = ">=1.5.0" },
- { name = "openai", marker = "extra == 'openai'", specifier = ">=2.45.0" },
+ { name = "openai", marker = "extra == 'openai'", specifier = ">=2.47.0" },
{ name = "pyarrow", marker = "python_full_version >= '3.14' and extra ==
'parquet'", specifier = ">=22.0.0" },
{ name = "pyarrow", marker = "python_full_version < '3.14' and extra ==
'parquet'", specifier = ">=18.0.0" },
{ name = "pydantic-ai-harness", extras = ["codemode"], marker = "extra ==
'code-mode'", specifier = ">=0.3.0" },
{ name = "pydantic-ai-shields", marker = "extra == 'shields'", specifier =
">=0.3.4" },
{ name = "pydantic-ai-skills", marker = "extra == 'skills'", specifier =
">=1.2.0" },
- { name = "pydantic-ai-slim", specifier = ">=2.23.0" },
- { name = "pydantic-ai-slim", extras = ["anthropic"], marker = "extra ==
'anthropic'", specifier = ">=2.23.0" },
- { name = "pydantic-ai-slim", extras = ["bedrock"], marker = "extra ==
'bedrock'", specifier = ">=2.23.0" },
- { name = "pydantic-ai-slim", extras = ["google"], marker = "extra ==
'google'", specifier = ">=2.23.0" },
- { name = "pydantic-ai-slim", extras = ["mcp"], marker = "extra == 'mcp'",
specifier = ">=2.23.0" },
- { name = "pydantic-ai-slim", extras = ["openai"], marker = "extra ==
'openai'", specifier = ">=2.23.0" },
+ { name = "pydantic-ai-slim", specifier = ">=2.33.0" },
+ { name = "pydantic-ai-slim", extras = ["anthropic"], marker = "extra ==
'anthropic'", specifier = ">=2.33.0" },
+ { name = "pydantic-ai-slim", extras = ["bedrock"], marker = "extra ==
'bedrock'", specifier = ">=2.33.0" },
+ { name = "pydantic-ai-slim", extras = ["google"], marker = "extra ==
'google'", specifier = ">=2.33.0" },
+ { name = "pydantic-ai-slim", extras = ["mcp"], marker = "extra == 'mcp'",
specifier = ">=2.33.0" },
+ { name = "pydantic-ai-slim", extras = ["openai"], marker = "extra ==
'openai'", specifier = ">=2.33.0" },
{ name = "pypdf", marker = "extra == 'pdf'", specifier = ">=4.0.0" },
{ name = "python-docx", marker = "extra == 'docx'", specifier = ">=1.0.0"
},
{ name = "sqlglot", marker = "extra == 'sql'", specifier = ">=30.0.0" },
@@ -4738,12 +4739,12 @@ dev = [
{ name = "apache-airflow-providers-standard", editable =
"providers/standard" },
{ name = "apache-airflow-task-sdk", editable = "task-sdk" },
{ name = "langchain", specifier = ">=1.0.0" },
- { name = "llama-index-core", specifier = ">=0.13.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.0" },
- { name = "openai", specifier = ">=2.45.0" },
+ { name = "llama-index-llms-openai", specifier = ">=0.6.8" },
+ { name = "openai", specifier = ">=2.47.0" },
{ name = "pydantic-ai-skills", specifier = ">=1.2.0" },
- { name = "pydantic-ai-slim", extras = ["mcp"], specifier = ">=2.23.0" },
+ { name = "pydantic-ai-slim", extras = ["mcp"], specifier = ">=2.33.0" },
{ name = "sqlglot", specifier = ">=30.0.0" },
]
docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
@@ -20797,22 +20798,22 @@ wheels = [
[[package]]
name = "pydantic-ai-slim"
-version = "2.31.1"
+version = "2.44.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
{ name = "genai-prices" },
{ name = "griffelib" },
- { name = "httpx" },
+ { name = "httpx2" },
{ name = "opentelemetry-api" },
{ name = "pydantic" },
{ name = "pydantic-graph" },
{ name = "typing-inspection" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/28/9d/a100fed1873151d930c45ed4e394647ba4d0bad5794d24d384b20dad3bad/pydantic_ai_slim-2.31.1.tar.gz",
hash =
"sha256:f04611e65e9a619b077732651240753cfb058bd844bd3c4e1eea549a48d38376", size
= 1214403, upload-time = "2026-08-18T03:39:52.762Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/00/dc/563e7157b940f0274b0687e523f46f9d3ea4936e472c66c8c17b7856eb2e/pydantic_ai_slim-2.44.0.tar.gz",
hash =
"sha256:88be3150dc6c89383e4dd596414dda3479c2773ee6e9e40789596d82fc34a783", size
= 1519519, upload-time = "2026-09-17T04:11:32.578Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/e4/76/90841be18ff357a39c27d5bee5246af6bb71f13399b55ab318c4c32cc4c8/pydantic_ai_slim-2.31.1-py3-none-any.whl",
hash =
"sha256:4647d801c5febbd150203d130ddff6db2c481675626b648653e832f419609702", size
= 1432432, upload-time = "2026-08-18T03:39:45.947Z" },
+ { url =
"https://files.pythonhosted.org/packages/8b/69/1acef0ae723f28ec0554cfad06fac1004b6d75ef2540ef29ff8e46688d58/pydantic_ai_slim-2.44.0-py3-none-any.whl",
hash =
"sha256:67063d1b2900e92dc558079fa3854e0141ed6f81ec5fb7d9c4d1b3b86bd0c9b6", size
= 1800583, upload-time = "2026-09-17T04:11:23.706Z" },
]
[package.optional-dependencies]
@@ -20967,18 +20968,17 @@ wheels = [
[[package]]
name = "pydantic-graph"
-version = "2.31.1"
+version = "2.44.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
- { name = "httpx" },
{ name = "logfire-api" },
{ name = "pydantic" },
{ name = "typing-inspection" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/2e/40/da6b9b7ee8c77b5c5e910ecc49a7d4ed93422a9bddb1726ed876b6abbeea/pydantic_graph-2.31.1.tar.gz",
hash =
"sha256:ac5f34e7bbf518a18a9c22f1e33418c3343542a8ea269ee8ee58e637e3f4fd56", size
= 45179, upload-time = "2026-08-18T03:39:54.732Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/1e/3d/22cecd0197d171cdf09e47de5e8ab906ce8b7632f282433046340564cf03/pydantic_graph-2.44.0.tar.gz",
hash =
"sha256:e6d62aa8579b83815b9adcb3dbff210647951ef4fa5f6526b24ee9d168d385bb", size
= 45191, upload-time = "2026-09-17T04:11:35.238Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/c6/40/ca98101077f17c1773c1aad617d03f6a0666936a8c6aeb4aac4c3e61eb54/pydantic_graph-2.31.1-py3-none-any.whl",
hash =
"sha256:7a5a9a8143d52f509a917263eeb49b4466eda6caf5131d1e71143fc6e9710157", size
= 52662, upload-time = "2026-08-18T03:39:49.133Z" },
+ { url =
"https://files.pythonhosted.org/packages/d7/21/699faf6b87b785e15a7ebe163052ac74606a19d5275211e28bf725e17e22/pydantic_graph-2.44.0-py3-none-any.whl",
hash =
"sha256:7a7aec1399d8dfc09f0485c4f9749c568bc451ed517ee1f3e903c3d216ea17e5", size
= 52698, upload-time = "2026-09-17T04:11:27.685Z" },
]
[[package]]