Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .github/workflows/konfai_apps_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.11", "3.12", "3.13"]

steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
Expand Down Expand Up @@ -70,9 +70,6 @@ jobs:
run: |
pip install -e ./konfai-apps

- name: Pin gloo to the loopback interface on macOS
if: runner.os == 'macOS'
run: echo "GLOO_SOCKET_IFNAME=lo0" >> "$GITHUB_ENV"
- name: Run apps tests
run: |
python -m pytest -q konfai-apps/tests
2 changes: 1 addition & 1 deletion .github/workflows/konfai_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.11", "3.12", "3.13"]

steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/konfai_mcp_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.11", "3.12", "3.13"]

steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/konfai_studio_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.11", "3.12", "3.13"]

steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ jobs:

- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: "3.10"
python-version: "3.11"

- name: Set up Node
if: matrix.name == 'konfai-studio'
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<p><strong>From images on disk to reproducible experiments, production inference, and reusable clinical applications.</strong></p>
<p>
<a href="https://pypi.org/project/konfai/"><img src="https://img.shields.io/pypi/v/konfai" alt="PyPI version" /></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.10%2B-blue.svg" alt="Python 3.10+" /></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.11%2B-blue.svg" alt="Python 3.11+" /></a>
<a href="https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml"><img src="https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml/badge.svg" alt="CI" /></a>
<a href="https://konfai.readthedocs.io/en/latest/"><img src="https://readthedocs.org/projects/konfai/badge/?version=latest" alt="Documentation" /></a>
<a href="https://github.com/fideus-labs/KonfAI/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="Apache-2.0" /></a>
Expand Down
2 changes: 1 addition & 1 deletion apps/impact_reg/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)
[![PyPI version](https://img.shields.io/pypi/v/impact_reg_konfai.svg?color=blue)](https://pypi.org/project/impact_reg_konfai/)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
[![CI](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml/badge.svg)](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml)
[![Paper](https://img.shields.io/badge/📌%20Paper-KonfAI-blue)](https://www.arxiv.org/abs/2508.09823)

Expand Down
2 changes: 1 addition & 1 deletion apps/impact_reg/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version", "dependencies"]
description = "Fast and lightweight CLI for pairwise registration workflows with IMPACT-Reg presets through the KonfAI runtime."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
9 changes: 1 addition & 8 deletions apps/impact_reg/tests/unit/test_displacement_field_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
)
from konfai.utils.errors import TransformError # noqa: E402
from konfai.utils.ITK import read_displacement_field # noqa: E402
from konfai.utils.ome_zarr import _zarr_v3_available, is_displacement_field, write_ome_zarr # noqa: E402
from konfai.utils.ome_zarr import is_displacement_field, write_ome_zarr # noqa: E402


def _write_displacement_field(field: "sitk.Image", dest: Path) -> None:
Expand All @@ -59,13 +59,6 @@ def _write_displacement_field(field: "sitk.Image", dest: Path) -> None:
sitk.WriteImage(field, str(dest))


# The OME-Zarr side of these tests writes an RFC-5 field, a zarr v3 store that zarr 2.x
# (Python 3.10) cannot write.
pytestmark = pytest.mark.skipif(
not _zarr_v3_available(),
reason="NGFF RFC-5 displacement fields need a zarr v3 store (zarr>=3, Python>=3.11)",
)

SPACING = (1.5, 1.5, 2.0)
ORIGIN = (7.0, -3.0, 10.0)
# A 90 deg in-plane rotation: non-identity, so a Direction dropped on the store round-trip changes
Expand Down
3 changes: 0 additions & 3 deletions apps/impact_reg/tests/unit/test_orchestration.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,6 @@ def test_register_reads_a_store_moving_against_an_itk_field(tmp_path: Path) -> N
per group, so a caller's OME-Zarr moving registers against the ``.mha`` field every published
preset declares."""
ome_zarr = pytest.importorskip("konfai.utils.ome_zarr")
if not ome_zarr._zarr_v3_available():
pytest.skip("writing an OME-Zarr moving needs zarr 3")

volume = np.arange(8**3, dtype=np.float32).reshape(8, 8, 8)
moving = tmp_path / "moving.ome.zarr"
ome_zarr.write_ome_zarr(moving, volume[None], spacing=(1.0, 1.0, 1.0), origin=(0.0, 0.0, 0.0))
Expand Down
2 changes: 1 addition & 1 deletion apps/impact_seg/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)
[![PyPI version](https://img.shields.io/pypi/v/impact_seg_konfai.svg?color=blue)](https://pypi.org/project/impact_seg_konfai/)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
[![CI](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml/badge.svg)](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml)
[![Paper](https://img.shields.io/badge/📌%20Paper-KonfAI-blue)](https://www.arxiv.org/abs/2508.09823)

Expand Down
2 changes: 1 addition & 1 deletion apps/impact_seg/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version", "dependencies"]
description = "Fast and lightweight CLI for anatomical segmentation with 2.5D U-Net models using a residual encoder within the KonfAI framework."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
2 changes: 1 addition & 1 deletion apps/impact_synth/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)
[![PyPI version](https://img.shields.io/pypi/v/impact_synth_konfai.svg?color=blue)](https://pypi.org/project/impact_synth_konfai/)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
[![CI](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml/badge.svg)](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml)
[![Paper](https://img.shields.io/badge/📌%20Paper-KonfAI-blue)](https://arxiv.org/abs/2510.21358)

Expand Down
2 changes: 1 addition & 1 deletion apps/impact_synth/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version", "dependencies"]
description = "Fast and lightweight CLI for synthetic CT generation using IMPACT-Synth models within the KonfAI framework."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
2 changes: 1 addition & 1 deletion apps/mrsegmentator/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)
[![PyPI version](https://img.shields.io/pypi/v/mrsegmentator-konfai.svg?color=blue)](https://pypi.org/project/mrsegmentator-konfai/)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
[![CI](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml/badge.svg)](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml)
[![Paper](https://img.shields.io/badge/📌%20Paper-KonfAI-blue)](https://www.arxiv.org/abs/2508.09823)

Expand Down
2 changes: 1 addition & 1 deletion apps/mrsegmentator/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version", "dependencies"]
description = "Fast and lightweight MRSegmentator CLI powered by the KonfAI framework."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
2 changes: 1 addition & 1 deletion apps/totalsegmentator/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)
[![PyPI version](https://img.shields.io/pypi/v/totalsegmentator-konfai.svg?color=blue)](https://pypi.org/project/totalsegmentator-konfai/)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![Python](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
[![CI](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml/badge.svg)](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_ci.yml)
[![CI](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_apps_ci.yml/badge.svg)](https://github.com/fideus-labs/KonfAI/actions/workflows/konfai_apps_ci.yml)
[![Paper](https://img.shields.io/badge/📌%20Paper-KonfAI-blue)](https://www.arxiv.org/abs/2508.09823)
Expand Down
2 changes: 1 addition & 1 deletion apps/totalsegmentator/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version", "dependencies"]
description = "Fast and lightweight TotalSegmentator CLI powered by the KonfAI framework."
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
4 changes: 2 additions & 2 deletions docs/source/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ cloned KonfAI checkout.**

## Prerequisites

- **Python 3.10 or later**: the minimum version declared in `pyproject.toml`
- **Python 3.11 or later**: the minimum version declared in `pyproject.toml`
- **Pixi**: install once with:

```bash
Expand Down Expand Up @@ -140,7 +140,7 @@ pixi run test -- tests/unit/test_config.py -v
### What CI runs

The GitHub Actions workflow in `.github/workflows/konfai_ci.yml` runs `pytest`
across Python `3.10` to `3.13` on Linux, macOS, and Windows.
across Python `3.11` to `3.13` on Linux, macOS, and Windows.

### The konfai-apps test suite

Expand Down
2 changes: 1 addition & 1 deletion docs/source/getting-started/installation.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Installation

KonfAI needs **Python 3.10 or newer**. This is the line most people want:
KonfAI needs **Python 3.11 or newer**. This is the line most people want:

```bash
python -m pip install "konfai[imaging]"
Expand Down
2 changes: 1 addition & 1 deletion docs/source/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ KonfAI
<div class="kf-herometa">
<span><b>pip</b> install "konfai[imaging]"</span>
<span><b>Apache-2.0</b></span>
<span><b>Python</b> 3.10+</span>
<span><b>Python</b> 3.11+</span>
</div>
</div>

Expand Down
2 changes: 1 addition & 1 deletion docs/source/quickstart.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ first, so it is the shortest path to seeing KonfAI work.
Install
-------

You need Python 3.10 or newer. A GPU makes it faster, and every command below
You need Python 3.11 or newer. A GPU makes it faster, and every command below
works with ``--cpu 1`` instead of ``--gpu 0``.

.. code-block:: bash
Expand Down
2 changes: 1 addition & 1 deletion konfai-apps/konfai_apps/app_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,7 @@ async def sse_log_stream(job: Job):
while True:
try:
line = await asyncio.wait_for(job.log_q.get(), timeout=SSE_HEARTBEAT_S)
except asyncio.TimeoutError:
except TimeoutError:
# Keep the connection alive during quiet periods without signalling
# completion. Stop only once the job itself has terminated (guards
# against a completion marker dropped from a saturated queue).
Expand Down
2 changes: 1 addition & 1 deletion konfai-apps/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version", "dependencies"]
description = "Standalone KonfAI Apps package with local and remote app execution"
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
5 changes: 0 additions & 5 deletions konfai-mcp/konfai_mcp/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import importlib
import inspect
import os
import types
from typing import Any

from konfai_mcp.classpaths import public_module
Expand Down Expand Up @@ -115,10 +114,6 @@ def _list_subclasses(module_path: str, base_name: str) -> list[dict[str, Any]]:
base = getattr(module, base_name)
components: list[dict[str, Any]] = []
for name, obj in inspect.getmembers(module, inspect.isclass):
# A subscripted builtin generic (konfai.data.geometry.SpatialStages) passes isclass on
# Python 3.10 but is not a class there, and issubclass refuses it.
if isinstance(obj, types.GenericAlias):
continue
if obj is base or not issubclass(obj, base):
continue
if inspect.isabstract(obj) or name.startswith("_"):
Expand Down
4 changes: 2 additions & 2 deletions konfai-mcp/konfai_mcp/server_experiments.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import tempfile
from dataclasses import dataclass
from datetime import datetime, timezone
from datetime import UTC, datetime
from pathlib import Path
from typing import Any, Literal, cast

Expand Down Expand Up @@ -62,7 +62,7 @@ class SessionService(DatasetInspectionMixin, MetricsServiceMixin):
def _isoformat(self, timestamp: float | None) -> str | None:
if timestamp is None:
return None
return datetime.fromtimestamp(timestamp, tz=timezone.utc).isoformat()
return datetime.fromtimestamp(timestamp, tz=UTC).isoformat()

def session_name(self) -> str:
return self.workspace_layout.current_session or "default"
Expand Down
2 changes: 1 addition & 1 deletion konfai-mcp/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dynamic = ["version"]
description = "Standalone MCP server package for KonfAI experimentation workflows"
readme = "README.md"
license = "Apache-2.0"
requires-python = ">=3.10"
requires-python = ">=3.11"

authors = [
{ name = "Valentin Boussot", email = "boussot.v@gmail.com" }
Expand Down
4 changes: 2 additions & 2 deletions konfai-mcp/tests/test_mcp_server_apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -859,8 +859,8 @@ async def scenario() -> dict[str, dict]:
properties = schemas[name].get("properties", {})
missing = required_params - set(properties)
assert not missing, f"{name} lost parameters on the wire: {missing}"
# pydantic places a union param's description inside anyOf on some versions (the 3.10 leg):
# documented means present anywhere in the property's subtree.
# pydantic places a union param's description inside anyOf on some versions: documented
# means present anywhere in the property's subtree.
undocumented = [p for p in required_params if '"description"' not in json.dumps(properties[p])]
assert not undocumented, f"{name} has undocumented parameters: {undocumented}"

Expand Down
Loading
Loading