From 3057f1c190afff5111b4d9026d0794cd7c4848cc Mon Sep 17 00:00:00 2001 From: Andres Contreras Date: Wed, 14 Oct 2026 12:32:55 -0700 Subject: [PATCH 1/3] Adopt stable Agentic 26.10.1 while preserving the qualified EDA runtime --- .github/workflows/docker-publish.yaml | 3 +- .github/workflows/pr-gate.yaml | 7 +- CHANGELOG.md | 11 + README.md | 2 +- docs/deployment.md | 6 +- docs/released-server-install.md | 28 +- openapi.json | 2 +- pyproject.toml | 31 +- sdks/java/README.md | 6 +- sdks/java/pom.xml | 3 +- .../com/firefly/flycanon/sdk/CanonClient.java | 2 +- sdks/python/README.md | 6 +- sdks/python/pyproject.toml | 4 +- sdks/python/src/flycanon_sdk/__init__.py | 2 +- sdks/python/tests/test_client.py | 4 +- sdks/python/uv.lock | 2 +- uv.lock | 333 +++++++++--------- 17 files changed, 221 insertions(+), 231 deletions(-) diff --git a/.github/workflows/docker-publish.yaml b/.github/workflows/docker-publish.yaml index ad48fcc..1ae00eb 100644 --- a/.github/workflows/docker-publish.yaml +++ b/.github/workflows/docker-publish.yaml @@ -1,4 +1,5 @@ # Copyright 2026 Firefly Software Foundation +# SPDX-License-Identifier: Apache-2.0 # # Multi-arch image build + GHCR push. # @@ -57,7 +58,7 @@ concurrency: env: REGISTRY: ghcr.io PYFLY_REF: v26.09.04 - AGENTIC_REF: v26.06.16 + AGENTIC_REF: v26.10.1 jobs: publish: diff --git a/.github/workflows/pr-gate.yaml b/.github/workflows/pr-gate.yaml index 9efd733..85268f0 100644 --- a/.github/workflows/pr-gate.yaml +++ b/.github/workflows/pr-gate.yaml @@ -1,4 +1,5 @@ # Copyright 2026 Firefly Software Foundation +# SPDX-License-Identifier: Apache-2.0 # # PR gate -- runs on every pull request and on workflow_dispatch. # Checks: @@ -35,10 +36,10 @@ concurrency: env: PYTHON_VERSION: "3.13" # Sibling checkouts staged as BuildKit / path contexts. The Python - # dependency itself resolves from the git tags in pyproject.toml - # (locked in uv.lock), so keep these equal to those tags. + # dependencies resolve from the PyFly tag and published Agentic wheel + # in pyproject.toml (locked in uv.lock). Keep these source tags aligned. PYFLY_REF: v26.09.04 - AGENTIC_REF: v26.06.16 + AGENTIC_REF: v26.10.1 jobs: lint: diff --git a/CHANGELOG.md b/CHANGELOG.md index d9826f3..d440aa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to **flycanon** are documented here. +## [26.10.2] - 2026-10-14 + +### Dependencies + +- Adopt the published Agentic `26.10.1` wheel, with its exact digest recorded in the lock. Remove the obsolete Mistral 1.x resolver override and undeclared Agentic `rest`/`redis` extras; Canon continues to supply web and Redis support through its existing dependencies. +- Retain the qualified PyFly `v26.09.04` pin and existing EDA migration history. A later PyFly upgrade requires a separately qualified drain or replay of queued legacy outbox events. + +### Distribution + +- Synchronize server and SDK versions, workflow references, and released-server installation examples for `26.10.2`. HTTP schemas and Canon's Azure builder and independent RLM cache behavior retain their existing contracts. + ## [26.10.0] - 2026-10-12 ### Fixed diff --git a/README.md b/README.md index f8baa2c..db77dd6 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ over whole documents with citations — all behind a single HTTP service. [![agentic](https://img.shields.io/badge/genai-fireflyframework--agentic-purple)](https://github.com/fireflyframework/fireflyframework-agentic) [![OpenAPI](https://img.shields.io/badge/api-openapi%203.1-green)](docs/api-reference.md) [![vector store](https://img.shields.io/badge/vector--store-pgvector%20%7C%20qdrant%20%7C%20chroma-336791)](docs/architecture.md#retrieval-backend-pluggable-dense-store) -[![Version](https://img.shields.io/badge/version-26.10.1-green.svg)](#) +[![Version](https://img.shields.io/badge/version-26.10.2-green.svg)](#) [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) diff --git a/docs/deployment.md b/docs/deployment.md index a8a5d66..53a0324 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -43,7 +43,7 @@ For a host installation using the released wheel, follow [Install the released s ```bash docker pull ghcr.io/fireflyframework/flycanon:latest # latest main -docker pull ghcr.io/fireflyframework/flycanon:26.10.1 # specific release +docker pull ghcr.io/fireflyframework/flycanon:26.10.2 # specific release docker pull ghcr.io/fireflyframework/flycanon:26.10 # latest 26.10.x ``` @@ -681,12 +681,12 @@ The recommended upgrade dance: ```bash # 1. Pull the new image -docker pull ghcr.io/fireflyframework/flycanon:26.10.1 +docker pull ghcr.io/fireflyframework/flycanon:26.10.2 # 2. Run migrations against the live database docker run --rm \ --env-file .env \ - ghcr.io/fireflyframework/flycanon:26.10.1 migrate + ghcr.io/fireflyframework/flycanon:26.10.2 migrate # 3. Roll the API + worker deployments docker compose --env-file .env up -d diff --git a/docs/released-server-install.md b/docs/released-server-install.md index b1bfa89..f9549db 100644 --- a/docs/released-server-install.md +++ b/docs/released-server-install.md @@ -1,45 +1,49 @@ # Install the released server -The server wheel requires Python 3.13 and explicit framework Git references. Package installers do not apply the repository's `[tool.uv.sources]` settings when installing a wheel. Installing only `flycanon-26.10.1-py3-none-any.whl` may fail because the matching Agentic version is not available from the package index. +The server wheel requires Python 3.13 and explicit framework references. Package installers do not apply the repository's `[tool.uv.sources]` settings when installing a wheel. Use the release requirements file to reproduce the qualified framework selection. Use the released source archive for the operator configuration and migration files, and install the released wheel for the Python application. This keeps the runtime configuration and executable package on the same version. ## Download and verify -Download `flycanon-26.10.1-py3-none-any.whl`, `flycanon-26.10.1.tar.gz`, `runtime-requirements-26.10.1.txt`, and `SHA256SUMS` from the [26.10.1 release](https://github.com/fireflyframework/flycanon/releases/tag/v26.10.1). Verify the downloaded files against their matching checksum entries before extracting or installing them. +Download `flycanon-26.10.2-py3-none-any.whl`, `flycanon-26.10.2.tar.gz`, `runtime-requirements-26.10.2.txt`, and `SHA256SUMS` from the [26.10.2 release](https://github.com/fireflyframework/flycanon/releases/tag/v26.10.2). Verify the downloaded files against their matching checksum entries before extracting or installing them. ```bash -tar -xzf flycanon-26.10.1.tar.gz -cd flycanon-26.10.1 +tar -xzf flycanon-26.10.2.tar.gz +cd flycanon-26.10.2 uv venv --python 3.13 .venv -uv pip install --python .venv/bin/python -r ../runtime-requirements-26.10.1.txt +uv pip install --python .venv/bin/python -r ../runtime-requirements-26.10.2.txt ``` -The requirements file selects the released server wheel and these canonical framework tags: +The requirements file selects the released server wheel and these canonical framework references: ```text pyfly @ git+https://github.com/fireflyframework/fireflyframework-pyfly.git@v26.09.04 -fireflyframework-agentic @ git+https://github.com/fireflyframework/fireflyframework-agentic.git@v26.06.16 +fireflyframework-agentic @ https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl ``` The equivalent installation without a requirements file is: ```bash uv pip install --python .venv/bin/python \ - 'flycanon @ https://github.com/fireflyframework/flycanon/releases/download/v26.10.1/flycanon-26.10.1-py3-none-any.whl' \ + 'flycanon @ https://github.com/fireflyframework/flycanon/releases/download/v26.10.2/flycanon-26.10.2-py3-none-any.whl' \ 'pyfly @ git+https://github.com/fireflyframework/fireflyframework-pyfly.git@v26.09.04' \ - 'fireflyframework-agentic @ git+https://github.com/fireflyframework/fireflyframework-agentic.git@v26.06.16' + 'fireflyframework-agentic @ https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl' ``` A fresh installation with these references resolved all runtime dependencies without `--no-deps` or a separate resolver override. Installing optional providers may require additional extras and configuration; this command does not verify cloud accounts or model-provider credentials. +## Framework migration compatibility + +This release retains PyFly `v26.09.04` and the existing PostgreSQL EDA outbox. A later PyFly upgrade uses different outbox tables and requires a separate drain or replay of queued legacy events. Qualify that cutover before changing the PyFly pin; the current migration history and Azure/RLM behavior remain the existing ones. + ## Configure the runtime -Keep `pyfly.yaml`, `alembic.ini`, `migrations/`, and `env_template` from the source archive in the working directory. The wheel does not supply the root-level `pyfly.yaml`. The release also provides a byte-identical `pyfly-26.10.1.yaml` copy for operators who already have a migration scaffold; install it as `pyfly.yaml` in the runtime working directory. +Keep `pyfly.yaml`, `alembic.ini`, `migrations/`, and `env_template` from the source archive in the working directory. The wheel does not supply the root-level `pyfly.yaml`. The release also provides a byte-identical `pyfly-26.10.2.yaml` copy for operators who already have a migration scaffold; install it as `pyfly.yaml` in the runtime working directory. The configuration selects the PostgreSQL event adapter and separate API/worker consumer groups. Starting without it can activate framework defaults, including an attempted Kafka connection to `localhost:9092` and a separate management listener. Do not rely on those defaults for the released service. -Set the database URL, embedding model and dimensions, provider credentials, platform API keys, object-storage location, and optional Redis settings for your environment. Use [`env_template`](https://github.com/fireflyframework/flycanon/blob/v26.10.1/env_template) and the [deployment guide](https://github.com/fireflyframework/flycanon/blob/v26.10.1/docs/deployment.md) for the exact settings. Store real secrets outside published configuration and supply them through your operator's environment or secret manager. +Set the database URL, embedding model and dimensions, provider credentials, platform API keys, object-storage location, and optional Redis settings for your environment. Use [`env_template`](https://github.com/fireflyframework/flycanon/blob/v26.10.2/env_template) and the [deployment guide](https://github.com/fireflyframework/flycanon/blob/v26.10.2/docs/deployment.md) for the exact settings. Store real secrets outside published configuration and supply them through your operator's environment or secret manager. Provision the PostgreSQL database, required extensions and roles using the deployment guide. Apply migrations as a separate operator step before serving a new database: @@ -68,4 +72,4 @@ The standard `flycanon serve` command listens on all interfaces using `FLYCANON_ curl -fsS http://127.0.0.1:8500/api/v1/version ``` -Verify authenticated source ingestion, source retrieval and canonical-memory retrieval in the intended tenant and workspace. A version response confirms the running package, while those operations exercise the configured database, retrieval and authorization boundaries. The release acceptance used a fresh wheel installation and verified source/memory retrieval for two independent project workspaces with no cross-project results; a newly provisioned operator environment still needs its own acceptance checks. +Verify authenticated source ingestion, source retrieval and canonical-memory retrieval in the intended tenant and workspace. A version response confirms the running package, while those operations exercise the configured database, retrieval and authorization boundaries. The release checks include a fresh wheel installation and native PostgreSQL tests for tenant/workspace isolation. A newly provisioned operator environment still needs authenticated ingestion and retrieval checks with its own configuration. diff --git a/openapi.json b/openapi.json index 9e62f59..d11d58d 100644 --- a/openapi.json +++ b/openapi.json @@ -5103,7 +5103,7 @@ "url": "https://github.com/fireflyframework/flycanon/blob/main/LICENSE" }, "title": "flycanon", - "version": "26.10.1" + "version": "26.10.2" }, "openapi": "3.1.0", "paths": { diff --git a/pyproject.toml b/pyproject.toml index 2b7fc7f..caef666 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,10 @@ +# Copyright 2026 Firefly Software Foundation +# SPDX-License-Identifier: Apache-2.0 [project] name = "flycanon" # CalVer YY.MM.PP -- bumped per release. Note that PEP 440 normalises # ``26.05.04`` -> ``26.5.4`` in the built wheel filename. -version = "26.10.1" +version = "26.10.2" description = "Operational Knowledge Repository -- versioned, provenance-tracked canonical knowledge with hybrid retrieval and RAG, exposed as a standalone HTTP microservice over fireflyframework-pyfly and -agentic. Part of Firefly Framework, platform-agnostic by design." readme = "README.md" requires-python = ">=3.13,<3.14" @@ -25,7 +27,7 @@ dependencies = [ # ChunkHit / HybridRetriever / reciprocal_rank_fusion -- lives in # ``core/services/retrieval/fusion.py``. Document intake runs on # flycanon's own per-format SourceLoaders. - "fireflyframework-agentic[rest,security,redis,openai-embeddings,binary,vectorstores-pgvector]>=26.6.16", + "fireflyframework-agentic[security,openai-embeddings,binary,vectorstores-pgvector]>=26.10.1", # Source intake -- the high-fidelity per-format SourceLoaders. Binary # normalisation (HEIC / SVG / TIFF rasterisation, archive + email @@ -153,30 +155,11 @@ azure = [ requires = ["hatchling>=1.18"] build-backend = "hatchling.build" -[tool.uv] -# fireflyframework-agentic depends on pydantic-ai>=1.99, whose transitive -# ``pydantic-ai-slim[mistral]`` drags in ``mistralai>=2.0.0`` -- which exists -# on PyPI only as pre-releases (2.x rc builds) and forces in -# ``opentelemetry-semantic-conventions==0.60b1``. flycanon never uses the -# mistral provider, so pin mistralai to the stable 1.x line to keep the -# resolver on stable wheels. Drop once mistralai 2.x reaches stable or -# pydantic-ai stops requesting it. -override-dependencies = [ - "mistralai>=1.0.0,<2.0.0", -] - [tool.uv.sources] -# Both framework deps are consumed from their published git tags so fresh -# clones / CI resolve them without any sibling path; uv.lock pins the exact -# commits behind the tags. 26.7.1 moved to pyfly v26.09.04 / agentic -# v26.06.14 (the pins the dworkers programme runs on); the suite passed -# unchanged on them. agentic moved to v26.06.16 on 2026-09-24: its vector -# store asked `pg_extension` before `CREATE EXTENSION`, without which first -# use of the store fails on a managed PostgreSQL that already has it. Note pyfly v26.09 subscribes a CQRS cache-invalidation -# bridge on the EDA bus in every process -- see the ``pyfly.eda.group`` -# comment in pyfly.yaml for the consumer-group split that requires. +# Qualified runtime references: PyFly retains the existing EDA schema; Agentic +# resolves from its immutable published wheel. uv.lock records the wheel digest. pyfly = { git = "https://github.com/fireflyframework/fireflyframework-pyfly.git", tag = "v26.09.04" } -fireflyframework-agentic = { git = "https://github.com/fireflyframework/fireflyframework-agentic.git", tag = "v26.06.16" } +fireflyframework-agentic = { url = "https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl" } [tool.hatch.build.targets.wheel] packages = ["src/flycanon"] diff --git a/sdks/java/README.md b/sdks/java/README.md index d08f3f7..66e2fc4 100644 --- a/sdks/java/README.md +++ b/sdks/java/README.md @@ -41,7 +41,7 @@ Compatible with **flycanon service version `26.10.x`**. | SDK | Service | |-----|---------| -| `26.10.1` | `26.10.x` (unchanged HTTP contract; identifier-aware PII matching) | +| `26.10.2` | `26.10.x` (unchanged HTTP contract; Agentic dependency adoption) | | `26.5.7` | `26.5.x` | ## Install @@ -50,7 +50,7 @@ Compatible with **flycanon service version `26.10.x`**. com.firefly flycanon-sdk - 26.10.1 + 26.10.2 ``` @@ -418,7 +418,7 @@ use). ## Versioning The SDK pins its version to the service's CalVer (`YY.MM.PP`), so -`flycanon-sdk@26.10.1` is the matching client for service version +`flycanon-sdk@26.10.2` is the matching client for service version `26.10.x`. Upgrade the SDK in lockstep with the service. Both clients (`CanonClient`, `ReactiveCanonClient`) ship from the same artifact -- no separate dependency to manage. diff --git a/sdks/java/pom.xml b/sdks/java/pom.xml index 1da7bf7..749e7b1 100644 --- a/sdks/java/pom.xml +++ b/sdks/java/pom.xml @@ -1,6 +1,7 @@ com.firefly flycanon-sdk - 26.10.1 + 26.10.2 jar flycanon-sdk diff --git a/sdks/java/src/main/java/com/firefly/flycanon/sdk/CanonClient.java b/sdks/java/src/main/java/com/firefly/flycanon/sdk/CanonClient.java index 990cb93..e77ea45 100644 --- a/sdks/java/src/main/java/com/firefly/flycanon/sdk/CanonClient.java +++ b/sdks/java/src/main/java/com/firefly/flycanon/sdk/CanonClient.java @@ -94,7 +94,7 @@ public final class CanonClient { static final String HEADER_IDEMPOTENCY_KEY = "Idempotency-Key"; /** SDK version. Mirrors {@code pom.xml}. */ - public static final String SDK_VERSION = "26.10.1"; + public static final String SDK_VERSION = "26.10.2"; private final RestClient restClient; private final ObjectMapper mapper; diff --git a/sdks/python/README.md b/sdks/python/README.md index 77c8a54..e56d5a6 100644 --- a/sdks/python/README.md +++ b/sdks/python/README.md @@ -33,7 +33,7 @@ Compatible with **flycanon service version `26.10.x`**. | SDK | Service | |-----|---------| -| `26.10.1` | `26.10.x` (unchanged HTTP contract; identifier-aware PII matching) | +| `26.10.2` | `26.10.x` (unchanged HTTP contract; Agentic dependency adoption) | | `26.8.0` | `26.8.x` (embedding sets, `flycanon reindex`, `ChunkStats.by_embedding_model`) | | `26.7.1` | `26.7.x` (routes realigned: `?mode=async`, `/query/stream`, `/conversations/{id}/turn`, `/query/suggest`, `?after_id=`; `X-API-Key`; `delete_source`, `purge_workspace`) | | `26.5.7` | `26.5.x` | @@ -41,9 +41,9 @@ Compatible with **flycanon service version `26.10.x`**. ## Install ```bash -uv add https://github.com/fireflyframework/flycanon/releases/download/v26.10.1/flycanon_sdk-26.10.1-py3-none-any.whl +uv add https://github.com/fireflyframework/flycanon/releases/download/v26.10.2/flycanon_sdk-26.10.2-py3-none-any.whl # or -pip install https://github.com/fireflyframework/flycanon/releases/download/v26.10.1/flycanon_sdk-26.10.1-py3-none-any.whl +pip install https://github.com/fireflyframework/flycanon/releases/download/v26.10.2/flycanon_sdk-26.10.2-py3-none-any.whl ``` ## Quick start diff --git a/sdks/python/pyproject.toml b/sdks/python/pyproject.toml index 5ce66c8..c0d2e5b 100644 --- a/sdks/python/pyproject.toml +++ b/sdks/python/pyproject.toml @@ -1,6 +1,8 @@ +# Copyright 2026 Firefly Software Foundation +# SPDX-License-Identifier: Apache-2.0 [project] name = "flycanon-sdk" -version = "26.10.1" +version = "26.10.2" description = "Async-first Python client for the flycanon Operational Knowledge Repository service." readme = "README.md" requires-python = ">=3.11" diff --git a/sdks/python/src/flycanon_sdk/__init__.py b/sdks/python/src/flycanon_sdk/__init__.py index 815cc08..7fa33df 100644 --- a/sdks/python/src/flycanon_sdk/__init__.py +++ b/sdks/python/src/flycanon_sdk/__init__.py @@ -120,7 +120,7 @@ WorkspaceUpdated, ) -__version__ = "26.10.1" +__version__ = "26.10.2" __all__ = [ "CANON_WORKSPACES_TOPIC", diff --git a/sdks/python/tests/test_client.py b/sdks/python/tests/test_client.py index cfa696d..46d2ea7 100644 --- a/sdks/python/tests/test_client.py +++ b/sdks/python/tests/test_client.py @@ -592,7 +592,7 @@ async def test_answer_returns_typed_response() -> None: def test_sdk_version_declares_current_release() -> None: - assert __version__ == "26.10.1" + assert __version__ == "26.10.2" def test_canon_workspaces_topic_constant() -> None: @@ -674,7 +674,7 @@ async def test_user_agent_advertises_sdk_version() -> None: } ) await client.version() - assert "flycanon-sdk-python/26.10.1" in route.calls.last.request.headers["User-Agent"] + assert "flycanon-sdk-python/26.10.2" in route.calls.last.request.headers["User-Agent"] # ---------------------------------------------------------------------- diff --git a/sdks/python/uv.lock b/sdks/python/uv.lock index 57000fb..1b946d9 100644 --- a/sdks/python/uv.lock +++ b/sdks/python/uv.lock @@ -44,7 +44,7 @@ wheels = [ [[package]] name = "flycanon-sdk" -version = "26.10.1" +version = "26.10.2" source = { editable = "." } dependencies = [ { name = "httpx" }, diff --git a/uv.lock b/uv.lock index c122abd..0a6c5c2 100644 --- a/uv.lock +++ b/uv.lock @@ -7,9 +7,6 @@ resolution-markers = [ "sys_platform != 'emscripten' and sys_platform != 'win32'", ] -[manifest] -overrides = [{ name = "mistralai", specifier = ">=1.0.0,<2.0.0" }] - [[package]] name = "accelerate" version = "1.15.0" @@ -201,21 +198,21 @@ wheels = [ [[package]] name = "anthropic" -version = "0.125.0" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "distro" }, { name = "docstring-parser" }, - { name = "httpx" }, + { name = "httpx2" }, { name = "jiter" }, + { name = "opentelemetry-api" }, { name = "pydantic" }, { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/f8/6f0560884b5363848347bd640b6c1d04abc25e7aa61787a232f790c6b60a/anthropic-0.125.0.tar.gz", hash = "sha256:e0cdd336580cb7411c1cdab69f80973e9bf4bff7f8e08141811d46307d45c682", size = 1112593, upload-time = "2026-08-19T22:00:42.837Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/c2/be99fac19b24c22b00d2a63ac1756b203bd3058ff54a14028c43b9f33116/anthropic-1.14.0.tar.gz", hash = "sha256:d9284895864a8457ed87f0accc51fd488ad9743952e597c814e7dc9d78ac8e38", size = 1715378, upload-time = "2026-10-14T17:13:33.508Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/1a/b1bd30cda3790557e8791bec5922a6ec8fabb6fa8b008c76a39cf7be6152/anthropic-0.125.0-py3-none-any.whl", hash = "sha256:3486013602eca76d8b12540764e53654f02cf4951110bca86cf06e67428a9f21", size = 1184067, upload-time = "2026-08-19T22:00:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/5d/66/c395049fa6bf20b7f244adc8b7466f86a416b11f03528fa325868483de3a/anthropic-1.14.0-py3-none-any.whl", hash = "sha256:abd787048378abfabeebbad917ae0f9eae1eb4dfaa0a754096b5eea02dcf8c12", size = 2043565, upload-time = "2026-10-14T17:13:35.513Z" }, ] [[package]] @@ -908,21 +905,6 @@ nvtx = [ { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] -[[package]] -name = "cyclopts" -version = "4.25.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "docstring-parser" }, - { name = "rich" }, - { name = "rich-rst" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/16/8f/6caec9cf291ba294a0d0669b0388e5676d8887d8b75a8c3ad0a2dc2eeed9/cyclopts-4.25.2.tar.gz", hash = "sha256:0776bc1fa796cd351646c345b7420279e58d6c2c4a8f5d5dd54dea85bdb2de8f", size = 202467, upload-time = "2026-09-08T16:58:04.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/0e/eadf712ca776fd96982c09348dd8f141ae6f96746a4eabc3e3fb54dea738/cyclopts-4.25.2-py3-none-any.whl", hash = "sha256:51b42513eea5e4ba6a08b68acf187b81f1191032cf77b9631086cfa2c88fa7a4", size = 242400, upload-time = "2026-09-08T16:58:02.696Z" }, -] - [[package]] name = "defusedxml" version = "0.7.1" @@ -1274,18 +1256,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f5/54/8351d388f94fbb0870e8cffaae41d3cc607acc8d6a8a6a217e2794829593/fastavro-1.12.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:55dea7e74b834d4b70467fc19c5b9ccb5509fe39abc4d26891187c1b22176423", size = 3337096, upload-time = "2026-04-24T14:37:09.452Z" }, ] -[[package]] -name = "fastmcp" -version = "3.4.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastmcp-slim", extra = ["client", "server"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/62/dd/fd444d94ae7afdaf5b6dd168799d34023f576b405872d6a27d5686a9d1f4/fastmcp-3.4.7.tar.gz", hash = "sha256:43117aca886f5ee2f6a569bba91cef02b59c339aad04ba29950ff18d251c822a", size = 28808982, upload-time = "2026-08-10T21:17:55.045Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/14/6d950459cc831fa17fe2d1797926b6eb2d2f2af50f830e62d0c098cc1ec8/fastmcp-3.4.7-py3-none-any.whl", hash = "sha256:e4e7698cb4af5bc667b1901685261fa2f3526dc73d243a461fca42500c8dbe56", size = 8016, upload-time = "2026-08-10T21:17:51.391Z" }, -] - [[package]] name = "fastmcp-slim" version = "3.4.7" @@ -1313,29 +1283,6 @@ client = [ { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, { name = "starlette" }, ] -server = [ - { name = "authlib" }, - { name = "cyclopts" }, - { name = "exceptiongroup" }, - { name = "griffelib" }, - { name = "httpx" }, - { name = "joserfc" }, - { name = "jsonref" }, - { name = "jsonschema-path" }, - { name = "mcp" }, - { name = "openapi-pydantic" }, - { name = "opentelemetry-api" }, - { name = "packaging" }, - { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, - { name = "pyperclip" }, - { name = "python-multipart" }, - { name = "pyyaml" }, - { name = "starlette" }, - { name = "uncalled-for" }, - { name = "uvicorn" }, - { name = "watchfiles" }, - { name = "websockets" }, -] [[package]] name = "filelock" @@ -1357,8 +1304,8 @@ wheels = [ [[package]] name = "fireflyframework-agentic" -version = "26.6.16" -source = { git = "https://github.com/fireflyframework/fireflyframework-agentic.git?tag=v26.06.16#36f4cd44fc276d7917ebfafa70f51d5846964c00" } +version = "26.10.1" +source = { url = "https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl" } dependencies = [ { name = "genai-prices" }, { name = "httpx" }, @@ -1367,11 +1314,14 @@ dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-sdk" }, { name = "pydantic" }, - { name = "pydantic-ai" }, + { name = "pydantic-ai", extra = ["ag-ui", "bedrock", "cohere", "groq", "huggingface", "mistral", "retries", "spec", "temporal", "ui", "xai"] }, { name = "pydantic-settings" }, { name = "python-dotenv" }, { name = "pyyaml" }, ] +wheels = [ + { url = "https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl", hash = "sha256:ab9bf27b29e39a2d198c17d47f7bacd7d73c6348299a4e432f3dc56bbb391dda" }, +] [package.optional-dependencies] binary = [ @@ -1398,6 +1348,68 @@ vectorstores-qdrant = [ { name = "qdrant-client" }, ] +[package.metadata] +requires-dist = [ + { name = "asyncpg", marker = "extra == 'postgres'", specifier = ">=0.30.0" }, + { name = "asyncpg", marker = "extra == 'vectorstores-pgvector'", specifier = ">=0.30.0" }, + { name = "boto3", marker = "extra == 'bedrock-embeddings'", specifier = ">=1.35.0" }, + { name = "cairosvg", marker = "extra == 'binary'", specifier = ">=2.9.1" }, + { name = "chromadb", marker = "extra == 'vectorstores-chroma'", specifier = ">=0.5.0" }, + { name = "cohere", marker = "extra == 'cohere-embeddings'", specifier = ">=5.0.0" }, + { name = "cryptography", marker = "extra == 'security'", specifier = ">=50.0.0" }, + { name = "extract-msg", marker = "extra == 'binary'", specifier = ">=0.51" }, + { name = "fireflyframework-agentic", extras = ["postgres", "mongodb", "security", "embeddings", "openai-embeddings", "cohere-embeddings", "google-embeddings", "mistral-embeddings", "voyage-embeddings", "azure-embeddings", "bedrock-embeddings", "ollama-embeddings", "vectorstores-chroma", "vectorstores-pinecone", "vectorstores-qdrant", "vectorstores-pgvector", "vectorstores-sqlite-vec", "watch", "binary", "script-execution"], marker = "extra == 'all'" }, + { name = "genai-prices", specifier = ">=0.1.9,<0.2" }, + { name = "google-generativeai", marker = "extra == 'google-embeddings'", specifier = ">=0.8.0" }, + { name = "httpx", specifier = ">=0.28.0" }, + { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.28.0" }, + { name = "httpx", marker = "extra == 'ollama-embeddings'", specifier = ">=0.28.0" }, + { name = "jinja2", specifier = ">=3.1.0" }, + { name = "langchain-anthropic", marker = "extra == 'evaluation'", specifier = ">=0.3" }, + { name = "langchain-community", marker = "extra == 'evaluation'", specifier = ">=0.3.31,<0.4" }, + { name = "langchain-ollama", marker = "extra == 'evaluation'", specifier = ">=0.3" }, + { name = "langchain-openai", marker = "extra == 'evaluation'", specifier = ">=0.3" }, + { name = "markdown-it-py", specifier = ">=3.0" }, + { name = "mistralai", marker = "extra == 'mistral-embeddings'", specifier = ">=1.0.0" }, + { name = "motor", marker = "extra == 'mongodb'", specifier = ">=3.6.0" }, + { name = "numpy", marker = "extra == 'embeddings'", specifier = ">=1.26.0" }, + { name = "numpy", marker = "extra == 'evaluation'", specifier = ">=1.26.0" }, + { name = "numpy", marker = "extra == 'reasoning-eval'", specifier = ">=2.0.0" }, + { name = "openai", marker = "extra == 'azure-embeddings'", specifier = ">=1.0.0" }, + { name = "openai", marker = "extra == 'openai-embeddings'", specifier = ">=1.0.0" }, + { name = "opentelemetry-api", specifier = ">=1.29.0" }, + { name = "opentelemetry-sdk", specifier = ">=1.29.0" }, + { name = "pandas", marker = "extra == 'reasoning-eval'", specifier = ">=2.2.0" }, + { name = "pdfplumber", marker = "extra == 'dev'", specifier = ">=0.11.0" }, + { name = "pillow", marker = "extra == 'binary'", specifier = ">=12.3.0" }, + { name = "pillow-heif", marker = "extra == 'binary'", specifier = ">=0.18" }, + { name = "pinecone", marker = "extra == 'vectorstores-pinecone'", specifier = ">=5.0.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.8.0" }, + { name = "py7zr", marker = "extra == 'binary'", specifier = ">=1.1.4" }, + { name = "pydantic", specifier = ">=2.13,<3" }, + { name = "pydantic-ai", extras = ["ag-ui", "bedrock", "cohere", "groq", "huggingface", "mistral", "retries", "spec", "temporal", "ui", "xai"], specifier = ">=2.53.0,<3" }, + { name = "pydantic-monty", marker = "extra == 'script-execution'", specifier = ">=0.0.18" }, + { name = "pydantic-settings", specifier = ">=2.14.2,<3" }, + { name = "pymongo", marker = "extra == 'mongodb'", specifier = ">=4.18.2" }, + { name = "pypdf", marker = "extra == 'binary'", specifier = ">=6.19.0" }, + { name = "pyright", marker = "extra == 'dev'", specifier = ">=1.1.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=5.0.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=6.0.0" }, + { name = "python-dotenv", specifier = ">=1.0.0" }, + { name = "pyyaml", specifier = ">=6.0" }, + { name = "qdrant-client", marker = "extra == 'vectorstores-qdrant'", specifier = ">=1.12.0" }, + { name = "ragas", marker = "extra == 'evaluation'", specifier = ">=0.2.6,<0.2.7" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.9.0" }, + { name = "sqlalchemy", marker = "extra == 'postgres'", specifier = ">=2.0.0" }, + { name = "sqlite-vec", marker = "extra == 'vectorstores-sqlite-vec'", specifier = ">=0.1.6" }, + { name = "testcontainers", marker = "extra == 'dev'", specifier = ">=4.10.0" }, + { name = "voyageai", marker = "extra == 'voyage-embeddings'", specifier = ">=0.3.0" }, + { name = "watchfiles", marker = "extra == 'watch'", specifier = ">=0.24.0" }, +] +provides-extras = ["all", "azure-embeddings", "bedrock-embeddings", "binary", "cohere-embeddings", "dev", "embeddings", "evaluation", "google-embeddings", "mistral-embeddings", "mongodb", "ollama-embeddings", "openai-embeddings", "postgres", "reasoning-eval", "script-execution", "security", "vectorstores-chroma", "vectorstores-pgvector", "vectorstores-pinecone", "vectorstores-qdrant", "vectorstores-sqlite-vec", "voyage-embeddings", "watch"] + [[package]] name = "flatbuffers" version = "25.12.19" @@ -1408,7 +1420,7 @@ wheels = [ [[package]] name = "flycanon" -version = "26.10.1" +version = "26.10.2" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, @@ -1479,9 +1491,9 @@ requires-dist = [ { name = "boto3", marker = "extra == 'dev'", specifier = ">=1.34" }, { name = "boto3", marker = "extra == 's3'", specifier = ">=1.34" }, { name = "docling", marker = "extra == 'docling'", specifier = ">=2.0" }, - { name = "fireflyframework-agentic", extras = ["rest", "security", "redis", "openai-embeddings", "binary", "vectorstores-pgvector"], git = "https://github.com/fireflyframework/fireflyframework-agentic.git?tag=v26.06.16" }, - { name = "fireflyframework-agentic", extras = ["vectorstores-chroma"], marker = "extra == 'chroma'", git = "https://github.com/fireflyframework/fireflyframework-agentic.git?tag=v26.06.16" }, - { name = "fireflyframework-agentic", extras = ["vectorstores-qdrant"], marker = "extra == 'qdrant'", git = "https://github.com/fireflyframework/fireflyframework-agentic.git?tag=v26.06.16" }, + { name = "fireflyframework-agentic", extras = ["security", "openai-embeddings", "binary", "vectorstores-pgvector"], url = "https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl" }, + { name = "fireflyframework-agentic", extras = ["vectorstores-chroma"], marker = "extra == 'chroma'", url = "https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl" }, + { name = "fireflyframework-agentic", extras = ["vectorstores-qdrant"], marker = "extra == 'qdrant'", url = "https://github.com/fireflyframework/fireflyframework-agentic/releases/download/v26.10.1/fireflyframework_agentic-26.10.1-py3-none-any.whl" }, { name = "httpx", specifier = ">=0.28.0" }, { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.28" }, { name = "langdetect", specifier = ">=1.0.9" }, @@ -1568,15 +1580,15 @@ wheels = [ [[package]] name = "genai-prices" -version = "0.0.73" +version = "0.1.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx2" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/0b/4b430d9c6ff0c76e42b91fc4cedff84dfbefa1a35b885fad45a22d29303f/genai_prices-0.0.73.tar.gz", hash = "sha256:ddad5b23dadd7aac8a58ab5af7506addb062114037e96427324703e50bc35077", size = 88406, upload-time = "2026-07-29T12:48:58.215Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/92/10212781b3416bc590b6a55c5643073282a2ff26e003b38ab27bad3ae5d2/genai_prices-0.1.12.tar.gz", hash = "sha256:d1493977cb7f61bc436516a166f644f5bbb01e1a83365e2914c99c6298f77ca4", size = 134740, upload-time = "2026-10-14T11:22:23.819Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/85/527a729ecd58b7169430e47febdab2e3f91193d0e3f5a56d721c04525709/genai_prices-0.0.73-py3-none-any.whl", hash = "sha256:64dfbbf55df91db6b74ff2b24ac752b8154952e0aed4e62868d6cd42710bf742", size = 92507, upload-time = "2026-07-29T12:48:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/86/3f/28a7a4b9d67a9cc21d705ce6476557007841abeba6f2d5b58aa9bda9f795/genai_prices-0.1.12-py3-none-any.whl", hash = "sha256:89d98303c5b7a366a05136ba03884c5951ec9a9ceb28fef62c7fa719f2828182", size = 142670, upload-time = "2026-10-14T11:22:22.688Z" }, ] [[package]] @@ -1599,7 +1611,7 @@ requests = [ [[package]] name = "google-genai" -version = "2.24.0" +version = "2.30.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1613,9 +1625,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/35/26/176d04f442e82d60cadc74cfaf81f01017062ce274a790455a57aec48c8f/google_genai-2.24.0.tar.gz", hash = "sha256:814b63d05dca4776c5a322699eb30c565040cf8d5fd77c38714076535fb2e019", size = 705409, upload-time = "2026-09-16T22:38:37.367Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/8a/76e592bca2a4ff63a8ba8025012ccae2d1a9aa1762af2278f43756045e12/google_genai-2.30.1.tar.gz", hash = "sha256:a348b28b86a98fbc8e0bea759e14ae3ac807954355df8638079715d027cd14d5", size = 736895, upload-time = "2026-10-13T14:11:18.246Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/5b/87913fe392ba7b6402577259289ed3740c577956554a674b191a2971d33e/google_genai-2.24.0-py3-none-any.whl", hash = "sha256:59e5f2d88bc2d6ed04aa1aa14cb5629090cfe9458401745e620b24d1fe9893d7", size = 1142675, upload-time = "2026-09-16T22:38:35.332Z" }, + { url = "https://files.pythonhosted.org/packages/46/28/faa7c02d87df1343aa8e51c816694a82eb37f41d0e83253e6e75a00b96ec/google_genai-2.30.1-py3-none-any.whl", hash = "sha256:1bb8961c60f7100439a45067a32764a18da0f8d0f95954ffc777d1f8225a2469", size = 1199070, upload-time = "2026-10-13T14:11:16.459Z" }, ] [[package]] @@ -1942,15 +1954,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "invoke" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/bd/b461d3424a24c80490313fd77feeb666ca4f6a28c7e72713e3d9095719b4/invoke-2.2.1.tar.gz", hash = "sha256:515bf49b4a48932b79b024590348da22f39c4942dff991ad1fb8b8baea1be707", size = 304762, upload-time = "2025-10-11T00:36:35.172Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/4b/b99e37f88336009971405cbb7630610322ed6fbfa31e1d7ab3fbf3049a2d/invoke-2.2.1-py3-none-any.whl", hash = "sha256:2413bc441b376e5cd3f55bb5d364f973ad8bdd7bf87e53c79de3c11bf3feecc8", size = 160287, upload-time = "2025-10-11T00:36:33.703Z" }, -] - [[package]] name = "jaraco-classes" version = "3.4.0" @@ -2048,6 +2051,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/c5/82addfd375e5ee6520644e0553e4aadde92d668c4fc99cc716d337fe7bb3/joserfc-1.7.5-py3-none-any.whl", hash = "sha256:add2c2c84e8373b084d526a8b53daba5d7a513a118cd2dcd9fc9f979d0922159", size = 71269, upload-time = "2026-08-29T13:05:40.718Z" }, ] +[[package]] +name = "jsonpath-python" +version = "1.1.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/18/4ca8742534a5993ff383f7602e325ce2d5d7cc93d72ac5e1cdedbea8a458/jsonpath_python-1.1.6.tar.gz", hash = "sha256:dded9932b4ec41fb8726e09c83afa4e6be618f938c2db287cc2a81723c639671", size = 88178, upload-time = "2026-05-07T01:26:34.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8a/1270a6803bd821cbfcdda387eaa13cb41a7b1f7b9bd145979b3bfb9d6cb7/jsonpath_python-1.1.6-py3-none-any.whl", hash = "sha256:a1c50afd8d3fbbaf47a4873bc890dcb3c15da96f5c020327977d844d8731a2d4", size = 14453, upload-time = "2026-05-07T01:26:33.306Z" }, +] + [[package]] name = "jsonref" version = "1.1.0" @@ -2072,21 +2084,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, ] -[[package]] -name = "jsonschema-path" -version = "0.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "pathable" }, - { name = "pyyaml" }, - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", size = 19597, upload-time = "2026-05-19T20:45:00.971Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", size = 24077, upload-time = "2026-05-19T20:44:59.225Z" }, -] - [[package]] name = "jsonschema-specifications" version = "2025.9.1" @@ -2339,23 +2336,21 @@ wheels = [ [[package]] name = "mistralai" -version = "1.12.4" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "eval-type-backport" }, - { name = "httpx" }, - { name = "invoke" }, + { name = "httpx2" }, + { name = "jsonpath-python" }, { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-proto-http" }, - { name = "opentelemetry-sdk" }, + { name = "opentelemetry-semantic-conventions" }, { name = "pydantic" }, { name = "python-dateutil" }, - { name = "pyyaml" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/12/c3476c53e907255b5f485f085ba50dd9a84b40fe662e9a888d6ded26fa7b/mistralai-1.12.4.tar.gz", hash = "sha256:e52b53bab58025dcd208eeac13e3c3df5778d4112eeca1f08124096c7738929f", size = 243129, upload-time = "2026-02-20T17:55:13.73Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/dc/7756ce9cf855ec0db089770a176ed652cded4c5ecd61931fb0b9331e655f/mistralai-3.2.0.tar.gz", hash = "sha256:b3f2139bde538fe8ed4a19e2adb624fd46dfd175b609231c0836bba21d738730", size = 643870, upload-time = "2026-10-09T09:41:12.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/f9/98d825105c450b9c67c27026caa374112b7e466c18331601d02ca278a01b/mistralai-1.12.4-py3-none-any.whl", hash = "sha256:7b69fcbc306436491ad3377fbdead527c9f3a0ce145ec029bf04c6308ff2cca6", size = 509321, upload-time = "2026-02-20T17:55:15.27Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/c499fb9a610f4abe2f8e7ad7e18f7f0254ddec49c7971116fe1e110da37b/mistralai-3.2.0-py3-none-any.whl", hash = "sha256:66c1cd32e886b2bc55f67d61cdba6d8c2c38e68720a6b6d69bb3fe7b10034779", size = 1532235, upload-time = "2026-10-09T09:41:10.005Z" }, ] [[package]] @@ -2800,7 +2795,7 @@ wheels = [ [[package]] name = "openai" -version = "3.14.1" +version = "3.31.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -2810,21 +2805,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/a5/bc3681f645a0d026332047cc19a703315979740a11a5763f46c163abd614/openai-3.14.1.tar.gz", hash = "sha256:2f3423a71af767d9071b059cf6df1e97a721c3a8d19417375ad7993d4df0d346", size = 1634770, upload-time = "2026-09-15T23:13:35.708Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/13/d1caa2b2385ed22a1e10e1fd7fc09a92e282cffadad49c569827315f468a/openai-3.14.1-py3-none-any.whl", hash = "sha256:a6758739282f3b1cafe8df1204f7a2f7b1e9edbbcfa41c0efba687448fbc51cf", size = 2003545, upload-time = "2026-09-15T23:13:33.164Z" }, -] - -[[package]] -name = "openapi-pydantic" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/99/d0c5b9e60eb131bfe5f6f818e9b25650b64004ff84512c0f7e00a246b826/openai-3.31.0.tar.gz", hash = "sha256:58110edba9acaf29cb2a675a1cbcccdd9f2fdb4932baed474dc847a7639e5d02", size = 2117207, upload-time = "2026-10-14T05:39:33.445Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, + { url = "https://files.pythonhosted.org/packages/69/22/66014c8fede0aa2b3381cf80c5102219b78657b3e61776cdab8f0b78675a/openai-3.31.0-py3-none-any.whl", hash = "sha256:e5839f6670483f368de40ce3422f524c1afaf12ff8660539f53489e200db8d78", size = 2235454, upload-time = "2026-10-14T05:39:31.197Z" }, ] [[package]] @@ -3096,15 +3079,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/ec/28a57266b753799a87b8bc79e7887ac6fd981b8c6d2978a0b7e7b6bd708c/pandas-3.0.5-cp313-cp313-win_arm64.whl", hash = "sha256:66266d3442a5e8b3c90274c2b8b230bee42dd1c286bc822cc2f9f2c7e12b883e", size = 9094790, upload-time = "2026-07-22T22:18:47.468Z" }, ] -[[package]] -name = "pathable" -version = "0.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", size = 18970, upload-time = "2026-05-19T18:15:11.911Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", size = 18983, upload-time = "2026-05-19T18:15:10.728Z" }, -] - [[package]] name = "pcodedmp" version = "1.2.6" @@ -3346,7 +3320,7 @@ memory = [ [[package]] name = "py7zr" -version = "1.1.3" +version = "1.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-zstd" }, @@ -3360,9 +3334,9 @@ dependencies = [ { name = "pyppmd" }, { name = "texttable" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/59/3f/ac248f25f3901d3d6cf80ac99d5bac6fd1e5e6543c1812c79b02b6074c60/py7zr-1.1.3.tar.gz", hash = "sha256:8d51894abb38355bf14881088bb97f01fe4cb5b14ebe22f66d6297668c7e1a74", size = 71695, upload-time = "2026-06-19T09:28:29.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/31/d5469ec310b57c730785068c227caf2263391be846ae5e99488f69b394eb/py7zr-1.1.4.tar.gz", hash = "sha256:7674697559bd06b697bf6e8249985cee6dc704a4b07b8e11f24d0b1695707c3e", size = 76503, upload-time = "2026-10-12T11:31:18.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/40/dc7f804abd0ea167ea8d4d9b3f5455321aaf671d040fcef647e9e952e714/py7zr-1.1.3-py3-none-any.whl", hash = "sha256:17934a35089e026dec6c72ee275d9b841e646881ef822d618e805c3006661d9a", size = 72242, upload-time = "2026-06-19T09:28:27.512Z" }, + { url = "https://files.pythonhosted.org/packages/96/bd/72bace0bf4025af8ab4bf972394fab466d4b565cdbea805281fbee9a8dbc/py7zr-1.1.4-py3-none-any.whl", hash = "sha256:f6f868a457a6bd485b78d26e619045718bcd0b7720a6bf97d5fe86a1523423e8", size = 75484, upload-time = "2026-10-12T11:31:16.526Z" }, ] [[package]] @@ -3511,32 +3485,68 @@ email = [ [[package]] name = "pydantic-ai" -version = "1.107.6" +version = "2.56.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pydantic-ai-slim", extra = ["ag-ui", "anthropic", "bedrock", "cli", "cohere", "evals", "fastmcp", "google", "groq", "huggingface", "logfire", "mcp", "mistral", "openai", "retries", "spec", "temporal", "ui", "vertexai", "xai"] }, + { name = "pydantic-ai-slim", extra = ["anthropic", "cli", "evals", "google", "logfire", "mcp", "openai", "web"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/c8/41c6a9685c7d86082c9e4f7d86e29f8b163089accf26e41e009e205b07ee/pydantic_ai-1.107.6.tar.gz", hash = "sha256:eb4d3dc0d193a6661eb985b43e858ee8bb4271969a9c5c7cb3dd7d996a99396a", size = 18747, upload-time = "2026-09-17T04:13:12.98Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/5f/ca24cdaf9ce3ae3a48f3cfba9ecb8ddc328d9304306a7d7448702406cb3a/pydantic_ai-2.56.0.tar.gz", hash = "sha256:2553f396e9478a4f0d7f60762bb7ba686837cb765310c2d8328cf56a299455a0", size = 28982, upload-time = "2026-10-13T23:50:08.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/64/72ff998a79459c41f0e40f079a06ad45934fb2c095f604b9d44b983620b8/pydantic_ai-1.107.6-py3-none-any.whl", hash = "sha256:1405ba853da7d73375043e7d3ec9eac062a1621bf47d219a6534062ddb238088", size = 7610, upload-time = "2026-09-17T04:13:03.658Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f6/af7789327b75fadedeb3272597b52df3074bc52b86562e1384daf4ce4d1c/pydantic_ai-2.56.0-py3-none-any.whl", hash = "sha256:bbf067d794fa72031211ec1ed35f6e5fc3efa4a3a1ba655e966cb07f623f34e3", size = 10146, upload-time = "2026-10-13T23:49:55.53Z" }, +] + +[package.optional-dependencies] +ag-ui = [ + { name = "pydantic-ai-slim", extra = ["ag-ui"] }, +] +bedrock = [ + { name = "pydantic-ai-slim", extra = ["bedrock"] }, +] +cohere = [ + { name = "pydantic-ai-slim", extra = ["cohere"] }, +] +groq = [ + { name = "pydantic-ai-slim", extra = ["groq"] }, +] +huggingface = [ + { name = "pydantic-ai-slim", extra = ["huggingface"] }, +] +mistral = [ + { name = "pydantic-ai-slim", extra = ["mistral"] }, +] +retries = [ + { name = "pydantic-ai-slim", extra = ["retries"] }, +] +spec = [ + { name = "pydantic-ai-slim", extra = ["spec"] }, +] +temporal = [ + { name = "pydantic-ai-slim", extra = ["temporal"] }, +] +ui = [ + { name = "pydantic-ai-slim", extra = ["ui"] }, +] +xai = [ + { name = "pydantic-ai-slim", extra = ["xai"] }, ] [[package]] name = "pydantic-ai-slim" -version = "1.107.6" +version = "2.56.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "anyio" }, { 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/79/c0/219bfcca8aa66cc877163a941e20239669944e6dcc244dc73263a2b199ea/pydantic_ai_slim-1.107.6.tar.gz", hash = "sha256:33b7a84e28448aa5ae4190158f703fd3d7de948c7610252b993420d6bc84b9a5", size = 795661, upload-time = "2026-09-17T04:13:15.557Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/27/aa416a938b4eb29731e415c429cb5c80804ff5442e8624d5e9113fc6b2c7/pydantic_ai_slim-2.56.0.tar.gz", hash = "sha256:58e8a3381749d448a7409f6cbf7acd13fa0549fa6668aa06a13e89695fe5f6a6", size = 1883767, upload-time = "2026-10-13T23:50:12.691Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/41/140a5e2d339e20d50e7685ffdc463977ae708f139a035fc658eced234afb/pydantic_ai_slim-1.107.6-py3-none-any.whl", hash = "sha256:09e0d02c93245586d7728fde101ad2689a07e576003f77249db9f63abfec4c7b", size = 980478, upload-time = "2026-09-17T04:13:06.756Z" }, + { url = "https://files.pythonhosted.org/packages/ed/68/e39e2f540e70cac0ee6b9bef3f9274c2f9e99ab7fa25bc10e04afd021c61/pydantic_ai_slim-2.56.0-py3-none-any.whl", hash = "sha256:e257196b6b6d6919e8c2d9fd02365e8ded873e99ff0d283d41c3739b0f47de99", size = 2203183, upload-time = "2026-10-13T23:50:00.72Z" }, ] [package.optional-dependencies] @@ -3563,9 +3573,6 @@ cohere = [ evals = [ { name = "pydantic-evals" }, ] -fastmcp = [ - { name = "fastmcp" }, -] google = [ { name = "google-genai" }, ] @@ -3578,6 +3585,7 @@ huggingface = [ ] logfire = [ { name = "logfire", extra = ["httpx"] }, + { name = "opentelemetry-instrumentation-httpx" }, ] mcp = [ { name = "fastmcp-slim", extra = ["client"] }, @@ -3590,6 +3598,7 @@ openai = [ { name = "tiktoken" }, ] retries = [ + { name = "httpx" }, { name = "tenacity" }, ] spec = [ @@ -3602,9 +3611,9 @@ temporal = [ ui = [ { name = "starlette" }, ] -vertexai = [ - { name = "google-auth" }, - { name = "requests" }, +web = [ + { name = "starlette" }, + { name = "uvicorn" }, ] xai = [ { name = "xai-sdk" }, @@ -3638,7 +3647,7 @@ wheels = [ [[package]] name = "pydantic-evals" -version = "1.107.6" +version = "2.56.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -3648,24 +3657,24 @@ dependencies = [ { name = "pyyaml" }, { name = "rich" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/84/866ef2fe23dd60f2c83dd7c1003bbc0685226634911bdc7f31b138b74518/pydantic_evals-1.107.6.tar.gz", hash = "sha256:7319926d6988ec8ac8026b3a25582c8c40794a45f4bfd28aa207614bbe0968b7", size = 78544, upload-time = "2026-09-17T04:13:17.119Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/1a/a346e1dcd180d33c641316067e641c872b4ad483793e3d6db03eed4eadfa/pydantic_evals-2.56.0.tar.gz", hash = "sha256:fdcd90326eccaffb539cb991381ea79152f792e6f6226416ee73d7fec92da18b", size = 91885, upload-time = "2026-10-13T23:50:15.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/bc/299d19d27e237c407a77edb3f72d81a1cac0dd09964ea8cc9beac4e61f96/pydantic_evals-1.107.6-py3-none-any.whl", hash = "sha256:dc9109f022885283908e2d1fd98b33d96d0decf40d3b12e7b2d158af62b33d28", size = 93586, upload-time = "2026-09-17T04:13:08.866Z" }, + { url = "https://files.pythonhosted.org/packages/17/16/2209402b932a415cf67b35af3052684afaac96539591a1ff7342dfefdb0e/pydantic_evals-2.56.0-py3-none-any.whl", hash = "sha256:d809ba1a78d21e1770525062775afe21ac627d80e4ec1ced7a584bbca077abdf", size = 107158, upload-time = "2026-10-13T23:50:04.561Z" }, ] [[package]] name = "pydantic-graph" -version = "1.107.6" +version = "2.56.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, + { name = "anyio" }, { name = "logfire-api" }, { name = "pydantic" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/61/50e9efd4deeef8a134c69d726eb4820f93020a9598b6151c34e0cc8ba672/pydantic_graph-1.107.6.tar.gz", hash = "sha256:ad11b85c14b84e2c4287b8325f2fccae96d60cd24a6d748d89ce8bbc6d505ac0", size = 62567, upload-time = "2026-09-17T04:13:18.332Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/dd/7be24637a329197e21e50a50735e9a33ede1485f9d73da6df30ca2813494/pydantic_graph-2.56.0.tar.gz", hash = "sha256:d740518239671dcc1a160a73116ca16795889b54ae5e7d6c3e98e899881fb2bf", size = 45835, upload-time = "2026-10-13T23:50:16.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/2f/4f94314f952d242de53e6ae0f250d249609710ce500209f0acf46a7133a8/pydantic_graph-1.107.6-py3-none-any.whl", hash = "sha256:f77b0949d6c89279baaf15c45d07cb34f123fdc183b72144d113b40b678e6132", size = 80106, upload-time = "2026-09-17T04:13:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/85/e6/8b6c4593e056f8146155fab3f2ccbda35f54f5343918ee94b48c27db5dfd/pydantic_graph-2.56.0-py3-none-any.whl", hash = "sha256:69f38003ecd20c8048d0327ee2cf5d27185eb887bb0d752e1cbed718d9836db7", size = 53280, upload-time = "2026-10-13T23:50:06.228Z" }, ] [[package]] @@ -4261,19 +4270,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] -[[package]] -name = "rich-rst" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pygments" }, - { name = "rich" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e2/d6/d0b9fafc73b65767200da027acab1db1bdb1048f4fea5ebf659df01c700e/rich_rst-2.1.0.tar.gz", hash = "sha256:f4d117b49697f338769759fa5cacf5197da4888b347b9fda2e50aef5cd8d93bd", size = 302732, upload-time = "2026-07-05T02:59:44.308Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/68/1fc93dd759605b5d00fc98b50200739e41ed32bd22d6ba35ca6c3932371b/rich_rst-2.1.0-py3-none-any.whl", hash = "sha256:7ecd1343ee12c879d0e7ae74c3eb6d263b023d2929c6d114212eb1fd91057255", size = 272987, upload-time = "2026-07-05T02:59:42.792Z" }, -] - [[package]] name = "rpds-py" version = "2026.6.3" @@ -4969,15 +4965,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115, upload-time = "2026-06-29T08:03:38.666Z" }, ] -[[package]] -name = "uncalled-for" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5a/92ce0b3ea5481915f55da994c2c2c5f7a3c09949afde196ee89f8ab961aa/uncalled_for-0.4.0.tar.gz", hash = "sha256:335b95bd2422332ec210d518f314a16e4c640921c39fc8bf2ad095bd3538f4af", size = 56979, upload-time = "2026-08-10T14:51:46.247Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/40/97cec87c077eb3291fc7905e6633e08b7ca593c57d30238444bcb6bb3d53/uncalled_for-0.4.0-py3-none-any.whl", hash = "sha256:16c4bb3337532e4bd5569adc192285976f3ad5305402256d34c67a12b5c968bd", size = 15502, upload-time = "2026-08-10T14:51:45.068Z" }, -] - [[package]] name = "urllib3" version = "2.8.0" From 98873d2dee576957b798cfeb940a36902ac01ef5 Mon Sep 17 00:00:00 2001 From: Andres Contreras Date: Wed, 14 Oct 2026 12:38:16 -0700 Subject: [PATCH 2/3] Keep framework names lowercase in release guidance --- CHANGELOG.md | 2 +- docs/deployment.md | 8 ++++---- docs/released-server-install.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d440aa1..9521451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ All notable changes to **flycanon** are documented here. ### Dependencies - Adopt the published Agentic `26.10.1` wheel, with its exact digest recorded in the lock. Remove the obsolete Mistral 1.x resolver override and undeclared Agentic `rest`/`redis` extras; Canon continues to supply web and Redis support through its existing dependencies. -- Retain the qualified PyFly `v26.09.04` pin and existing EDA migration history. A later PyFly upgrade requires a separately qualified drain or replay of queued legacy outbox events. +- Retain the qualified pyfly `v26.09.04` pin and existing EDA migration history. A later pyfly upgrade requires a separately qualified drain or replay of queued legacy outbox events. ### Distribution diff --git a/docs/deployment.md b/docs/deployment.md index 53a0324..67e058b 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -37,7 +37,7 @@ all three. The differences are how you wire the dependencies. ## Install from release packages -For a host installation using the released wheel, follow [Install the released server](released-server-install.md). A wheel install needs explicit framework Git references and the matching source archive for `pyfly.yaml` and migrations. +For a host installation using the released wheel, follow [Install the released server](released-server-install.md). A wheel install needs explicit framework references and the matching source archive for `pyfly.yaml` and migrations. ## Pull the image @@ -380,15 +380,15 @@ finds its table and only verifies it. Before 26.7.1 every process created those lazily, and PostgreSQL refuses that for `flycanon_app`: it checks `CREATE` on the schema before it honours `CREATE TABLE IF NOT EXISTS`, and demands ownership before `CREATE INDEX IF NOT EXISTS`. One piece of that -lazy DDL remains, in PyFly rather than flycanon: `PostgresEventBus.start()` +lazy DDL remains, in pyfly rather than flycanon: `PostgresEventBus.start()` still runs the outbox `CREATE TABLE / INDEX IF NOT EXISTS` in every -process. Until PyFly skips it on existing tables, a `serve` process that +process. Until pyfly skips it on existing tables, a `serve` process that runs as `flycanon_app` needs the two statements below on top of the grants above; they widen nothing else (the role stays NOBYPASSRLS, and the two outbox tables hold no tenant rows): ```sql --- Temporary, for PyFly's outbox DDL at boot (see the note above). +-- Temporary, for pyfly's outbox DDL at boot (see the note above). GRANT CREATE ON SCHEMA public TO flycanon_app; ALTER TABLE pyfly_eda_outbox OWNER TO flycanon_app; -- or a NOLOGIN role ALTER TABLE pyfly_eda_offsets OWNER TO flycanon_app; -- both roles belong to diff --git a/docs/released-server-install.md b/docs/released-server-install.md index f9549db..d151d72 100644 --- a/docs/released-server-install.md +++ b/docs/released-server-install.md @@ -35,7 +35,7 @@ A fresh installation with these references resolved all runtime dependencies wit ## Framework migration compatibility -This release retains PyFly `v26.09.04` and the existing PostgreSQL EDA outbox. A later PyFly upgrade uses different outbox tables and requires a separate drain or replay of queued legacy events. Qualify that cutover before changing the PyFly pin; the current migration history and Azure/RLM behavior remain the existing ones. +This release retains pyfly `v26.09.04` and the existing PostgreSQL EDA outbox. A later pyfly upgrade uses different outbox tables and requires a separate drain or replay of queued legacy events. Qualify that cutover before changing the pyfly pin; the current migration history and Azure/RLM behavior remain the existing ones. ## Configure the runtime From 71cd06f664961514a9a8f1e5eba6112595ddecc6 Mon Sep 17 00:00:00 2001 From: Andres Contreras Date: Wed, 14 Oct 2026 12:43:11 -0700 Subject: [PATCH 3/3] Generate standalone requirements for the published Agentic wheel --- .github/workflows/publish-sdks.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-sdks.yaml b/.github/workflows/publish-sdks.yaml index 1adaff0..254cdea 100644 --- a/.github/workflows/publish-sdks.yaml +++ b/.github/workflows/publish-sdks.yaml @@ -1,4 +1,5 @@ # Copyright 2026 Firefly Software Foundation +# SPDX-License-Identifier: Apache-2.0 # # Publish the Java + Python SDKs. # @@ -272,7 +273,11 @@ jobs: requirements = [f"flycanon @ https://github.com/fireflyframework/flycanon/releases/download/v{version}/flycanon-{wheel_version}-py3-none-any.whl"] for name in ("pyfly", "fireflyframework-agentic"): source = project["tool"]["uv"]["sources"][name] - requirements.append(f"{name} @ git+{source['git']}@{source['tag']}") + if "url" in source: + reference = source["url"] + else: + reference = f"git+{source['git']}@{source['tag']}" + requirements.append(f"{name} @ {reference}") pathlib.Path(f"dist/runtime-requirements-{version}.txt").write_text("\n".join(requirements) + "\n") pathlib.Path(f"dist/pyfly-{version}.yaml").write_bytes(pathlib.Path("pyfly.yaml").read_bytes()) pathlib.Path(f"dist/INSTALL-SERVER-{version}.md").write_bytes(pathlib.Path("docs/released-server-install.md").read_bytes())