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 663a7920389 Support excluding files from `common.ai` Agent Skills
discovery (#69924)
663a7920389 is described below
commit 663a79203891e04111e4a0cea079cc34011a9ad9
Author: Kaxil Naik <[email protected]>
AuthorDate: Wed Jul 15 18:10:33 2026 +0100
Support excluding files from `common.ai` Agent Skills discovery (#69924)
`AgentSkillsToolset` now accepts an optional `exclude_resources` list of
glob
patterns, forwarded to `pydantic-ai-skills`' `SkillsToolset`, to keep
matched
files out of a skill's discovered resources. It mirrors the existing
`exclude_tools` escape hatch and is resolved per-run on the worker.
pydantic-ai-skills 1.2.0 broadened resource discovery from a fixed
seven-extension allowlist to every readable text file in a skill bundle, so
`.sql`/`.toml`/`.jinja` assets are exposed with no extra config. That also
widens what reaches the model, so `exclude_resources` is the trim knob for
secrets or scratch files (e.g. `["*.env", "secrets/*"]`). It removes files
from
resource discovery only, not from `run_skill_script` filesystem access, so
pair
it with `exclude_tools={"run_skill_script"}` when files are genuinely
sensitive.
The `[skills]` floor moves to `pydantic-ai-skills>=1.2.0` (the version that
adds
the parameter). 1.2.0 was published inside the repo's 4-day exclude-newer
window, so a temporary per-package `exclude-newer-package` override lets it
resolve; remove it once the window advances past 2026-07-15.
---
providers/common/ai/docs/index.rst | 2 +-
providers/common/ai/docs/toolsets.rst | 10 ++
providers/common/ai/pyproject.toml | 4 +-
.../airflow/providers/common/ai/toolsets/skills.py | 20 ++-
.../tests/unit/common/ai/toolsets/test_skills.py | 50 +++++++
pyproject.toml | 8 ++
uv.lock | 147 +++++++--------------
7 files changed, 137 insertions(+), 104 deletions(-)
diff --git a/providers/common/ai/docs/index.rst
b/providers/common/ai/docs/index.rst
index 7de5f5a8ac4..de6904e45b3 100644
--- a/providers/common/ai/docs/index.rst
+++ b/providers/common/ai/docs/index.rst
@@ -246,7 +246,7 @@ Extra Dependencies
``openai`` ``pydantic-ai-slim[openai]``
``mcp`` ``pydantic-ai-slim[mcp]``
``code-mode`` ``pydantic-ai-harness[codemode]>=0.3.0``
-``skills`` ``apache-airflow-providers-git>=0.4.0``,
``pydantic-ai-skills>=0.11.0``
+``skills`` ``apache-airflow-providers-git>=0.4.0``,
``pydantic-ai-skills>=1.2.0``
``avro`` ``fastavro>=1.10.0; python_version < "3.14"``,
``fastavro>=1.12.1; python_version >= "3.14"``
``parquet`` ``pyarrow>=18.0.0; python_version < '3.14'``,
``pyarrow>=22.0.0; python_version >= '3.14'``
``sql`` ``apache-airflow-providers-common-sql``, ``sqlglot>=30.0.0``
diff --git a/providers/common/ai/docs/toolsets.rst
b/providers/common/ai/docs/toolsets.rst
index faa407d6676..5c46ee45616 100644
--- a/providers/common/ai/docs/toolsets.rst
+++ b/providers/common/ai/docs/toolsets.rst
@@ -437,6 +437,16 @@ Parameters
:class:`~airflow.providers.common.ai.skills.GitSkills`.
- ``exclude_tools``: Optional set of skill tool names to hide from the agent
(e.g. ``{"run_skill_script"}`` to disable on-worker script execution).
+- ``exclude_resources``: Optional glob patterns to exclude from resource
+ discovery, added on top of the built-in defaults (``__pycache__``, ``*.pyc``,
+ ``*.pyo``, ``.DS_Store``, ``.git``). A skill exposes every readable text file
+ it contains as a resource; these patterns keep matched files out of the
+ resource list and the ``read_skill_resource`` tool (e.g.
+ ``["*.env", "secrets/*"]``). Each pattern matches the full skill-relative
path
+ or any single path component. This hides files from resource discovery only
--
+ it does not stop a skill's ``run_skill_script`` from reading them off disk,
so
+ pair it with ``exclude_tools={"run_skill_script"}`` when the files are
+ genuinely sensitive.
Using Agent Skills with other frameworks
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/providers/common/ai/pyproject.toml
b/providers/common/ai/pyproject.toml
index e6e2926d921..301db295e80 100644
--- a/providers/common/ai/pyproject.toml
+++ b/providers/common/ai/pyproject.toml
@@ -92,7 +92,7 @@ dependencies = [
# upstream in pydantic/pydantic-ai#5230; revisit this extra once that lands.
"skills" = [
"apache-airflow-providers-git>=0.4.0",
- "pydantic-ai-skills>=0.11.0",
+ "pydantic-ai-skills>=1.2.0",
]
"avro" = [
'fastavro>=1.10.0; python_version < "3.14"',
@@ -136,7 +136,7 @@ dev = [
# Additional devel dependencies (do not remove this line and add extra
development dependencies)
"sqlglot>=30.0.0",
"pydantic-ai-slim[mcp]",
- "pydantic-ai-skills>=0.11.0",
+ "pydantic-ai-skills>=1.2.0",
"apache-airflow-providers-common-sql[datafusion]",
"langchain>=1.0.0",
"llama-index-core>=0.13.0",
diff --git
a/providers/common/ai/src/airflow/providers/common/ai/toolsets/skills.py
b/providers/common/ai/src/airflow/providers/common/ai/toolsets/skills.py
index 6df834e2dc2..fdbf5933c84 100644
--- a/providers/common/ai/src/airflow/providers/common/ai/toolsets/skills.py
+++ b/providers/common/ai/src/airflow/providers/common/ai/toolsets/skills.py
@@ -57,6 +57,16 @@ class AgentSkillsToolset(AbstractToolset):
:param sources: Skill sources -- local directory paths and/or
``GitSkills``.
:param exclude_tools: Optional set of skill tool names to hide from the
agent
(e.g. ``{"run_skill_script"}`` to disable on-worker script execution).
+ :param exclude_resources: Optional glob patterns to exclude from resource
+ discovery, added on top of the built-in defaults (``__pycache__``,
+ ``*.pyc``, ``*.pyo``, ``.DS_Store``, ``.git``). A skill exposes every
+ readable text file it contains as a resource; these patterns keep
matched
+ files out of the resource list and the ``read_skill_resource`` tool
+ (e.g. ``["*.env", "secrets/*"]``). Patterns match the full
skill-relative
+ path or any single path component. This hides files from resource
+ discovery only -- it does not stop a skill's ``run_skill_script`` from
+ reading them off disk, so pair it with
``exclude_tools={"run_skill_script"}``
+ when the files are genuinely sensitive. Requires
``pydantic-ai-skills>=1.2.0``.
Requires the ``skills`` extra: ``pip install
"apache-airflow-providers-common-ai[skills]"``.
"""
@@ -66,9 +76,11 @@ class AgentSkillsToolset(AbstractToolset):
sources: list[SkillSource],
*,
exclude_tools: set[str] | None = None,
+ exclude_resources: list[str] | None = None,
) -> None:
self._sources = list(sources)
self._exclude_tools = exclude_tools
+ self._exclude_resources = exclude_resources
self._inner: Any = None
self._cleanup: Callable[[], None] | None = None
@@ -80,7 +92,11 @@ class AgentSkillsToolset(AbstractToolset):
# Per-run isolation: pydantic-ai shares one toolset instance across
runs,
# but we hold per-run clone/cleanup state on __aenter__/__aexit__. Hand
# each run its own instance so concurrent runs never clobber each
other.
- return AgentSkillsToolset(self._sources,
exclude_tools=self._exclude_tools)
+ return AgentSkillsToolset(
+ self._sources,
+ exclude_tools=self._exclude_tools,
+ exclude_resources=self._exclude_resources,
+ )
async def __aenter__(self) -> AgentSkillsToolset:
# Resolve + clone at run time, on the worker -- not at DAG-parse time.
@@ -98,6 +114,8 @@ class AgentSkillsToolset(AbstractToolset):
kwargs: dict[str, Any] = {"directories": directories}
if self._exclude_tools:
kwargs["exclude_tools"] = self._exclude_tools
+ if self._exclude_resources:
+ kwargs["exclude_resources"] = self._exclude_resources
self._inner = SkillsToolset(**kwargs)
await self._inner.__aenter__()
except BaseException:
diff --git a/providers/common/ai/tests/unit/common/ai/toolsets/test_skills.py
b/providers/common/ai/tests/unit/common/ai/toolsets/test_skills.py
index a3bf781f803..a0e768da563 100644
--- a/providers/common/ai/tests/unit/common/ai/toolsets/test_skills.py
+++ b/providers/common/ai/tests/unit/common/ai/toolsets/test_skills.py
@@ -107,6 +107,56 @@ class TestLifecycle:
assert captured["exclude_tools"] == {"run_skill_script"}
assert captured["directories"] == ["/x"]
+ def test_exclude_resources_passed_to_inner(self):
+ captured: dict = {}
+
+ def fake_skillstoolset(**kwargs):
+ captured.update(kwargs)
+ return _FakeInner(**kwargs)
+
+ toolset = AgentSkillsToolset(sources=["/x"],
exclude_resources=["*.env", "secrets/*"])
+ with patch(
+ "airflow.providers.common.ai.toolsets.skills._materialize_skills",
+ autospec=True,
+ return_value=(["/x"], lambda: None),
+ ):
+ with patch("pydantic_ai_skills.SkillsToolset",
fake_skillstoolset): # noqa: spec
+ asyncio.run(_enter_exit(toolset))
+
+ assert captured["exclude_resources"] == ["*.env", "secrets/*"]
+
+ def test_no_optional_kwargs_when_unset(self):
+ # Omit exclude_tools/exclude_resources entirely so an older
pydantic-ai-skills
+ # that lacks the kwarg still works when the feature is not used.
+ captured: dict = {}
+
+ def fake_skillstoolset(**kwargs):
+ captured.update(kwargs)
+ return _FakeInner(**kwargs)
+
+ toolset = AgentSkillsToolset(sources=["/x"])
+ with patch(
+ "airflow.providers.common.ai.toolsets.skills._materialize_skills",
+ autospec=True,
+ return_value=(["/x"], lambda: None),
+ ):
+ with patch("pydantic_ai_skills.SkillsToolset",
fake_skillstoolset): # noqa: spec
+ asyncio.run(_enter_exit(toolset))
+
+ assert "exclude_tools" not in captured
+ assert "exclude_resources" not in captured
+
+ def test_for_run_propagates_optional_kwargs(self):
+ # for_run hands each run its own instance; dropping a kwarg here would
+ # silently expose excluded files in concurrent runs.
+ toolset = AgentSkillsToolset(
+ sources=["/x"], exclude_tools={"run_skill_script"},
exclude_resources=["*.env"]
+ )
+ per_run = asyncio.run(toolset.for_run(MagicMock())) # noqa: spec
(for_run ignores ctx)
+ assert per_run is not toolset
+ assert per_run._exclude_tools == {"run_skill_script"}
+ assert per_run._exclude_resources == ["*.env"]
+
class TestCleanup:
def test_cleanup_runs_if_inner_construction_fails(self):
diff --git a/pyproject.toml b/pyproject.toml
index 2d0c363e03e..d36ce3af879 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1560,6 +1560,12 @@ apache-airflow-task-sdk-integration-tests = false
# Manual overrides (kept outside the auto-generated block above so the
# update_airflow_pyproject_toml.py script doesn't clobber them).
+# Temporary: pydantic-ai-skills 1.2.0 (adds exclude_resources, required by the
+# apache-airflow-providers-common-ai[skills] floor) was published 2026-07-15,
+# inside the "4 days" exclude-newer window. This pins the per-package cutoff
just
+# past that release so 1.2.0 resolves while any later release stays
quarantined.
+# Remove once the rolling window advances past 2026-07-15.
+pydantic-ai-skills = "2026-07-16T00:00:00Z"
[tool.uv.pip]
# Synchroonize with scripts/ci/prek/upgrade_important_versions.py
@@ -1706,6 +1712,8 @@ apache-airflow-task-sdk-integration-tests = false
# Manual overrides — see the matching block under
# `[tool.uv.exclude-newer-package]` above for rationale.
+# Temporary: see the pydantic-ai-skills note in
`[tool.uv.exclude-newer-package]`.
+pydantic-ai-skills = "2026-07-16T00:00:00Z"
[tool.uv.sources]
# These names must match the names as defined in the pyproject.toml of the
workspace items,
diff --git a/uv.lock b/uv.lock
index b5e8f242a27..c9cdbd24b61 100644
--- a/uv.lock
+++ b/uv.lock
@@ -33,6 +33,7 @@ apache-airflow-providers-openlineage = false
apache-airflow-providers-sftp = false
apache-airflow-e2e-tests = false
apache-airflow-shared-logging = false
+apache-airflow-providers-common-dataquality = false
apache-airflow-providers-apache-drill = false
apache-airflow-providers-pgvector = false
apache-airflow-providers-imap = false
@@ -52,7 +53,6 @@ apache-airflow-providers-telegram = false
apache-airflow-providers-celery = false
apache-airflow-providers-docker = false
apache-airflow-providers-sendgrid = false
-apache-airflow-providers-common-dataquality = false
apache-airflow-providers-common-ai = false
apache-airflow = false
apache-airflow-shared-observability = false
@@ -64,9 +64,9 @@ apache-airflow-providers-apache-cassandra = false
apache-airflow-providers-asana = false
apache-airflow-providers-oracle = false
apache-airflow-providers-mysql = false
+apache-airflow-providers-teradata = false
apache-airflow-providers-alibaba = false
apache-airflow-providers-microsoft-mssql = false
-apache-airflow-providers-teradata = false
apache-airflow-providers-jdbc = false
apache-airflow-helm-chart = false
apache-airflow-providers-anthropic = false
@@ -83,6 +83,7 @@ apache-airflow-providers-salesforce = false
apache-airflow-providers-ssh = false
apache-airflow-providers-papermill = false
apache-airflow-providers-google = false
+pydantic-ai-skills = "2026-07-16T00:00:00Z"
apache-airflow-providers-microsoft-psrp = false
apache-airflow-providers-vertica = false
apache-airflow-providers-apache-hdfs = false
@@ -204,12 +205,12 @@ members = [
"apache-airflow-providers-cohere",
"apache-airflow-providers-common-ai",
"apache-airflow-providers-common-compat",
+ "apache-airflow-providers-common-dataquality",
"apache-airflow-providers-common-io",
"apache-airflow-providers-common-messaging",
"apache-airflow-providers-common-sql",
"apache-airflow-providers-databricks",
"apache-airflow-providers-datadog",
- "apache-airflow-providers-common-dataquality",
"apache-airflow-providers-dbt-cloud",
"apache-airflow-providers-dingding",
"apache-airflow-providers-discord",
@@ -1034,12 +1035,12 @@ all = [
{ name = "apache-airflow-providers-cohere" },
{ name = "apache-airflow-providers-common-ai" },
{ name = "apache-airflow-providers-common-compat" },
+ { name = "apache-airflow-providers-common-dataquality" },
{ name = "apache-airflow-providers-common-io" },
{ name = "apache-airflow-providers-common-messaging" },
{ name = "apache-airflow-providers-common-sql", extra = ["pandas",
"polars"] },
{ name = "apache-airflow-providers-databricks" },
{ name = "apache-airflow-providers-datadog" },
- { name = "apache-airflow-providers-common-dataquality" },
{ name = "apache-airflow-providers-dbt-cloud" },
{ name = "apache-airflow-providers-dingding" },
{ name = "apache-airflow-providers-discord" },
@@ -1221,6 +1222,9 @@ common-ai = [
common-compat = [
{ name = "apache-airflow-providers-common-compat" },
]
+common-dataquality = [
+ { name = "apache-airflow-providers-common-dataquality" },
+]
common-io = [
{ name = "apache-airflow-providers-common-io" },
]
@@ -1236,9 +1240,6 @@ databricks = [
datadog = [
{ name = "apache-airflow-providers-datadog" },
]
-common-dataquality = [
- { name = "apache-airflow-providers-common-dataquality" },
-]
dbt-cloud = [
{ name = "apache-airflow-providers-dbt-cloud" },
]
@@ -1636,6 +1637,8 @@ requires-dist = [
{ name = "apache-airflow-providers-common-ai", marker = "extra ==
'common-ai'", editable = "providers/common/ai" },
{ name = "apache-airflow-providers-common-compat", marker = "extra ==
'all'", editable = "providers/common/compat" },
{ name = "apache-airflow-providers-common-compat", marker = "extra ==
'common-compat'", editable = "providers/common/compat" },
+ { name = "apache-airflow-providers-common-dataquality", marker = "extra ==
'all'", editable = "providers/common/dataquality" },
+ { name = "apache-airflow-providers-common-dataquality", marker = "extra ==
'common-dataquality'", editable = "providers/common/dataquality" },
{ name = "apache-airflow-providers-common-io", marker = "extra == 'all'",
editable = "providers/common/io" },
{ name = "apache-airflow-providers-common-io", marker = "extra ==
'common-io'", editable = "providers/common/io" },
{ name = "apache-airflow-providers-common-messaging", marker = "extra ==
'all'", editable = "providers/common/messaging" },
@@ -1648,8 +1651,6 @@ requires-dist = [
{ name = "apache-airflow-providers-databricks", marker = "extra ==
'databricks'", editable = "providers/databricks" },
{ name = "apache-airflow-providers-datadog", marker = "extra == 'all'",
editable = "providers/datadog" },
{ name = "apache-airflow-providers-datadog", marker = "extra ==
'datadog'", editable = "providers/datadog" },
- { name = "apache-airflow-providers-common-dataquality", marker = "extra ==
'all'", editable = "providers/common/dataquality" },
- { name = "apache-airflow-providers-common-dataquality", marker = "extra ==
'common-dataquality'", editable = "providers/common/dataquality" },
{ name = "apache-airflow-providers-dbt-cloud", marker = "extra == 'all'",
editable = "providers/dbt/cloud" },
{ name = "apache-airflow-providers-dbt-cloud", marker = "extra ==
'dbt-cloud'", editable = "providers/dbt/cloud" },
{ name = "apache-airflow-providers-dingding", marker = "extra == 'all'",
editable = "providers/dingding" },
@@ -1796,7 +1797,7 @@ requires-dist = [
{ name = "sentry-sdk", marker = "extra == 'sentry'", specifier =
">=2.30.0" },
{ name = "uv", marker = "extra == 'uv'", specifier = ">=0.11.26" },
]
-provides-extras = ["all-core", "async", "graphviz", "gunicorn", "kerberos",
"memray", "otel", "statsd", "all-task-sdk", "airbyte", "akeyless", "alibaba",
"amazon", "anthropic", "apache-cassandra", "apache-drill", "apache-druid",
"apache-flink", "apache-hdfs", "apache-hive", "apache-iceberg",
"apache-impala", "apache-kafka", "apache-kylin", "apache-livy", "apache-pig",
"apache-pinot", "apache-spark", "apache-tinkerpop", "apprise", "arangodb",
"asana", "atlassian-jira", "celery", "clickhou [...]
+provides-extras = ["all-core", "async", "graphviz", "gunicorn", "kerberos",
"memray", "otel", "statsd", "all-task-sdk", "airbyte", "akeyless", "alibaba",
"amazon", "anthropic", "apache-cassandra", "apache-drill", "apache-druid",
"apache-flink", "apache-hdfs", "apache-hive", "apache-iceberg",
"apache-impala", "apache-kafka", "apache-kylin", "apache-livy", "apache-pig",
"apache-pinot", "apache-spark", "apache-tinkerpop", "apprise", "arangodb",
"asana", "atlassian-jira", "celery", "clickhou [...]
[package.metadata.requires-dev]
ci-image = [
@@ -4494,7 +4495,7 @@ requires-dist = [
{ 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-skills", marker = "extra == 'skills'", specifier =
">=0.11.0" },
+ { name = "pydantic-ai-skills", marker = "extra == 'skills'", specifier =
">=1.2.0" },
{ name = "pydantic-ai-slim", specifier = ">=2.0.0" },
{ name = "pydantic-ai-slim", extras = ["anthropic"], marker = "extra ==
'anthropic'" },
{ name = "pydantic-ai-slim", extras = ["bedrock"], marker = "extra ==
'bedrock'" },
@@ -4521,7 +4522,7 @@ dev = [
{ name = "llama-index-core", specifier = ">=0.13.0" },
{ name = "llama-index-embeddings-openai", specifier = ">=0.6.0" },
{ name = "llama-index-llms-openai", specifier = ">=0.6.0" },
- { name = "pydantic-ai-skills", specifier = ">=0.11.0" },
+ { name = "pydantic-ai-skills", specifier = ">=1.2.0" },
{ name = "pydantic-ai-slim", extras = ["mcp"] },
{ name = "sqlglot", specifier = ">=30.0.0" },
]
@@ -4574,6 +4575,35 @@ dev = [
]
docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
+[[package]]
+name = "apache-airflow-providers-common-dataquality"
+version = "0.1.0"
+source = { editable = "providers/common/dataquality" }
+dependencies = [
+ { name = "apache-airflow" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "apache-airflow" },
+ { name = "apache-airflow-devel-common" },
+ { name = "apache-airflow-task-sdk" },
+]
+docs = [
+ { name = "apache-airflow-devel-common", extra = ["docs"] },
+]
+
+[package.metadata]
+requires-dist = [{ name = "apache-airflow", editable = "." }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "apache-airflow", editable = "." },
+ { name = "apache-airflow-devel-common", editable = "devel-common" },
+ { name = "apache-airflow-task-sdk", editable = "task-sdk" },
+]
+docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
+
[[package]]
name = "apache-airflow-providers-common-io"
version = "1.8.0"
@@ -4907,37 +4937,6 @@ dev = [
]
docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
-[[package]]
-name = "apache-airflow-providers-common-dataquality"
-version = "0.1.0"
-source = { editable = "providers/common/dataquality" }
-dependencies = [
- { name = "apache-airflow" },
-]
-
-[package.dev-dependencies]
-dev = [
- { name = "apache-airflow" },
- { name = "apache-airflow-devel-common" },
- { name = "apache-airflow-task-sdk" },
-]
-docs = [
- { name = "apache-airflow-devel-common", extra = ["docs"] },
-]
-
-[package.metadata]
-requires-dist = [
- { name = "apache-airflow", editable = "." },
-]
-
-[package.metadata.requires-dev]
-dev = [
- { name = "apache-airflow", editable = "." },
- { name = "apache-airflow-devel-common", editable = "devel-common" },
- { name = "apache-airflow-task-sdk", editable = "task-sdk" },
-]
-docs = [{ name = "apache-airflow-devel-common", extras = ["docs"], editable =
"devel-common" }]
-
[[package]]
name = "apache-airflow-providers-dbt-cloud"
version = "4.9.2"
@@ -6741,7 +6740,7 @@ source = { editable = "providers/openai" }
dependencies = [
{ name = "apache-airflow" },
{ name = "apache-airflow-providers-common-compat" },
- { name = "openai", extra = ["datalib"] },
+ { name = "openai" },
]
[package.dev-dependencies]
@@ -6759,7 +6758,7 @@ docs = [
requires-dist = [
{ name = "apache-airflow", editable = "." },
{ name = "apache-airflow-providers-common-compat", editable =
"providers/common/compat" },
- { name = "openai", extras = ["datalib"], specifier = ">=2.37.0" },
+ { name = "openai", specifier = ">=2.37.0" },
]
[package.metadata.requires-dev]
@@ -17447,16 +17446,6 @@ wheels = [
{ url =
"https://files.pythonhosted.org/packages/ae/f4/561ed79fd94876160018a5e75254cfcb9b0e62d4dded9dcb20072e86d623/openai-2.44.0-py3-none-any.whl",
hash =
"sha256:0a2a3ab2e29aeda368700f662ff9ba0f9df17ba4c54577a64e08b8115a3cc0ad", size
= 1366216, upload-time = "2026-06-24T20:55:58.882Z" },
]
-[package.optional-dependencies]
-datalib = [
- { name = "numpy", version = "2.2.6", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "numpy", version = "2.4.6", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" },
- { name = "numpy", version = "2.5.0", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
- { name = "pandas" },
- { name = "pandas-stubs", version = "2.3.3.260113", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
- { name = "pandas-stubs", version = "3.0.3.260530", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
-]
-
[[package]]
name = "openapi-schema-validator"
version = "0.9.0"
@@ -18101,48 +18090,6 @@ wheels = [
{ url =
"https://files.pythonhosted.org/packages/06/3d/2f0e9c5cbc456d34f48215645d876f7885a15e09a72a07d1de3ddb181c38/pandas_gbq-0.35.0-py3-none-any.whl",
hash =
"sha256:258de481019566611031919997bf9c1ece4ca30a4dd02d3fc3664b251d446182", size
= 50773, upload-time = "2026-04-10T00:40:59.337Z" },
]
-[[package]]
-name = "pandas-stubs"
-version = "2.3.3.260113"
-source = { registry = "https://pypi.org/simple" }
-resolution-markers = [
- "python_full_version < '3.11' and platform_machine == 'arm64' and
sys_platform == 'darwin'",
- "(python_full_version < '3.11' and platform_machine != 'arm64') or
(python_full_version < '3.11' and sys_platform != 'darwin')",
-]
-dependencies = [
- { name = "numpy", version = "2.2.6", source = { registry =
"https://pypi.org/simple" } },
- { name = "types-pytz" },
-]
-sdist = { url =
"https://files.pythonhosted.org/packages/92/5d/be23854a73fda69f1dbdda7bc10fbd6f930bd1fa87aaec389f00c901c1e8/pandas_stubs-2.3.3.260113.tar.gz",
hash =
"sha256:076e3724bcaa73de78932b012ec64b3010463d377fa63116f4e6850643d93800", size
= 116131, upload-time = "2026-01-13T22:30:16.704Z" }
-wheels = [
- { url =
"https://files.pythonhosted.org/packages/d1/c6/df1fe324248424f77b89371116dab5243db7f052c32cc9fe7442ad9c5f75/pandas_stubs-2.3.3.260113-py3-none-any.whl",
hash =
"sha256:ec070b5c576e1badf12544ae50385872f0631fc35d99d00dc598c2954ec564d3", size
= 168246, upload-time = "2026-01-13T22:30:15.244Z" },
-]
-
-[[package]]
-name = "pandas-stubs"
-version = "3.0.3.260530"
-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.*'",
- "python_full_version == '3.13.*' and platform_machine == 'arm64' and
sys_platform == 'darwin'",
- "(python_full_version == '3.13.*' and platform_machine != 'arm64') or
(python_full_version == '3.13.*' and sys_platform != 'darwin')",
- "python_full_version == '3.12.*' and platform_machine == 'arm64' and
sys_platform == 'darwin'",
- "(python_full_version == '3.12.*' and platform_machine != 'arm64') or
(python_full_version == '3.12.*' and sys_platform != 'darwin')",
- "python_full_version == '3.11.*' and platform_machine == 'arm64' and
sys_platform == 'darwin'",
- "(python_full_version == '3.11.*' and platform_machine != 'arm64') or
(python_full_version == '3.11.*' and sys_platform != 'darwin')",
-]
-dependencies = [
- { name = "numpy", version = "2.4.6", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
- { name = "numpy", version = "2.5.0", source = { registry =
"https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
-]
-sdist = { url =
"https://files.pythonhosted.org/packages/3d/aa/c41a8a0ff86fd85dbb3ec0c1f3fa488ca64a8b5f82654ae1b07d84acefe5/pandas_stubs-3.0.3.260530.tar.gz",
hash =
"sha256:d1efe47b2e5a312c047d7feabec5cb7a55365747983420077e9fcbe9ab74f714", size
= 113183, upload-time = "2026-05-30T17:47:40.34Z" }
-wheels = [
- { url =
"https://files.pythonhosted.org/packages/0b/e0/99ec5b02203c4e9ce878bc63d8caa06ac1f891e4d63bded9a5ced70fcb4f/pandas_stubs-3.0.3.260530-py3-none-any.whl",
hash =
"sha256:a6277eb1c8cebf48d9b2413fcd2e9a6b4ff479c934a223c29eacbc3058c4cb55", size
= 173780, upload-time = "2026-05-30T17:47:39.13Z" },
-]
-
[[package]]
name = "pandocfilters"
version = "1.5.1"
@@ -19277,16 +19224,16 @@ codemode = [
[[package]]
name = "pydantic-ai-skills"
-version = "1.1.0"
+version = "1.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "pydantic-ai-slim" },
{ name = "pyyaml" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/7c/0c/ee3e5bd2d003170f96f2fe5d1ec3f4525930183378841fb1b9147c5129cc/pydantic_ai_skills-1.1.0.tar.gz",
hash =
"sha256:66f85a63088a30863a3363a36830beedf60c32517473663c3da6557f1a838006", size
= 9028209, upload-time = "2026-06-27T18:48:29.181Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/5e/90/5f20728badc7d17ca0e81f24dc35a96c02f008323dce393d0e70a8465144/pydantic_ai_skills-1.2.0.tar.gz",
hash =
"sha256:e52f7e8243343dfa94206aae11cd142120edb8990fc392b1d8af32f99b6d351e", size
= 9031839, upload-time = "2026-07-15T02:37:26.37Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/8a/6c/406ce642127956ac3068bc12e0f64d876af53688ca6992ca5aa077926c3d/pydantic_ai_skills-1.1.0-py3-none-any.whl",
hash =
"sha256:72a0d9099f4562c96ed7f882f6b3e77589cd5e7d4c6d48c550904931ca56df1d", size
= 62211, upload-time = "2026-06-27T18:48:27.272Z" },
+ { url =
"https://files.pythonhosted.org/packages/a5/74/143ca60dd9bfa11ce0349ee58bbdd646798c8bdc031588d67a8bea96797d/pydantic_ai_skills-1.2.0-py3-none-any.whl",
hash =
"sha256:7ff4eb4b307deb6ef3bf31a6d9493c1e3a8e9b866a13b866a9ea4606bd914206", size
= 63883, upload-time = "2026-07-15T02:37:24.117Z" },
]
[[package]]