Skip to content

feat: add support for Python 3.14#933

Merged
rapids-bot[bot] merged 6 commits intoNVIDIA:mainfrom
gforsyth:python-3.14
Mar 12, 2026
Merged

feat: add support for Python 3.14#933
rapids-bot[bot] merged 6 commits intoNVIDIA:mainfrom
gforsyth:python-3.14

Conversation

@gforsyth
Copy link
Contributor

@gforsyth gforsyth commented Mar 4, 2026

Description

Contributes to rapidsai/build-planning#205

This PR adds support for Python 3.14.

Notes for Reviewers

This is part of ongoing work to add Python 3.14 support across RAPIDS.
It temporarily introduces a build/test matrix including Python 3.14, from rapidsai/shared-workflows#508.

A follow-up PR will revert back to pointing at the main branch of shared-workflows once all
RAPIDS repos have added Python 3.14 support.

This will fail until all dependencies have been updated to Python 3.14

CI here is expected to fail until all of this project's upstream dependencies support Python 3.14.

This can be merged whenever all CI jobs are passing.

@gforsyth gforsyth added non-breaking Introduces a non-breaking change improvement Improves an existing functionality labels Mar 4, 2026
@copy-pr-bot
Copy link

copy-pr-bot bot commented Mar 4, 2026

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@gforsyth
Copy link
Contributor Author

gforsyth commented Mar 4, 2026

/ok to test

@gforsyth
Copy link
Contributor Author

gforsyth commented Mar 5, 2026

/ok to test

@anandhkb anandhkb added this to the 26.04 milestone Mar 8, 2026
@gforsyth
Copy link
Contributor Author

gforsyth commented Mar 9, 2026

/ok to test

1 similar comment
@gforsyth
Copy link
Contributor Author

gforsyth commented Mar 9, 2026

/ok to test

@gforsyth
Copy link
Contributor Author

gforsyth commented Mar 9, 2026

/ok to test

2 similar comments
@gforsyth
Copy link
Contributor Author

/ok to test

@gforsyth
Copy link
Contributor Author

/ok to test

@gforsyth
Copy link
Contributor Author

/ok to test

@gforsyth
Copy link
Contributor Author

/ok to test

@gforsyth
Copy link
Contributor Author

/ok to test

@gforsyth
Copy link
Contributor Author

/ok to test

@gforsyth gforsyth marked this pull request as ready for review March 11, 2026 16:52
@gforsyth gforsyth requested review from a team as code owners March 11, 2026 16:52
host:
- pip
- python =${{ py_version }}
- python-gil =${{ py_version }}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're in the era of free-threaded Python, so we specify python-gil to get the GIL version

Comment on lines +73 to +78
ctx = get_context("fork")
complete = ctx.Event()

from cuopt_server.utils import solver

s = Process(
s = ctx.Process(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In Python 3.14, the default method for multiprocessing changed from fork to forkserver -- forkserver is easier to reason about, but requires, in this case, pickling things that cannot be pickled.

For now, explicitly enabling a fork process to match the existing behavior with Python 3.11-3.13

)
parser.add_argument(
"--compare", action="store_true", help="Compare 1% vs 0.1% gap"
"--compare", action="store_true", help="Compare 1%% vs 0.1%% gap"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

% need to be escaped with a second % - this is now an error from argparse in Python 3.14

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh wow, I didn't realize that argparse had format specifiers like this. Just read about them at https://docs.python.org/3/library/argparse.html

Ok yeah makes sense.

@coderabbitai
Copy link

coderabbitai bot commented Mar 11, 2026

📝 Walkthrough

Walkthrough

Multiple repositories across CI/CD workflows, documentation, and Python packages are updated to support Python 3.14, including version bumps for dependencies (msgpack, numba), conda recipe changes from python to python-gil, and multiprocessing context adjustments using fork-safety primitives.

Changes

Cohort / File(s) Summary
CI/CD Workflow Updates
.github/workflows/build.yaml, .github/workflows/pr.yaml
Updated reusable workflow references from main branch to python-3.14 tag across all jobs (conda-cpp-build, conda-python-build, wheels-build, docs, tests, etc.). No changes to job parameters or conditional logic.
Documentation and System Requirements
CONTRIBUTING.md, README.md, docs/cuopt/source/system-requirements.rst
Updated Python version support from <=3.13.x to <=3.14.x. Updated container image examples to reflect Python 3.14 tags (py3.14 for CUDA 12.x and 13.x).
Conda Environment Dependency Files
conda/environments/all_cuda-129_arch-*.yaml, conda/environments/all_cuda-131_arch-*.yaml
Updated dependency versions: msgpack-python 1.1.0→1.1.2; numba-cuda constraint relaxed; numba upper bound set to <0.65.0; Python constraint expanded from <3.14 to <3.15.
Conda Recipe Manifests
conda/recipes/cuopt*/recipe.yaml, conda/recipes/mps-parser/recipe.yaml
Changed host build dependency from python=${{ py_version }} to python-gil=${{ py_version }}; bumped msgpack-python 1.1.0→1.1.2; updated SPDX copyright year to 2025-2026; adjusted numba/numba-cuda constraints.
Dependency Configuration & Classifiers
dependencies.yaml, python/cuopt*/pyproject.toml, python/libcuopt/pyproject.toml
Updated dependency version constraints (msgpack 1.1.0→1.1.2, numba-cuda constraint relaxed, numba upper bound added); added "Programming Language :: Python :: 3.14" classifier across multiple pyproject.toml files.
Multiprocessing Context Updates
python/cuopt_server/cuopt_server/cuopt_service.py, python/cuopt_server/cuopt_server/utils/process_handler.py
Replaced direct multiprocessing primitives (Event, Process, Queue) with fork-context variants via get_context("fork"). All IPC objects and process creation now use context-bound methods for fork-safety.
Minor Documentation Fix
skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py
Escaped percent signs in help text for --compare command-line flag by doubling them.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: add support for Python 3.14' directly and clearly reflects the main change across the entire changeset—adding support for Python 3.14 through version constraints, classifiers, workflows, and dependencies.
Description check ✅ Passed The description clearly relates to the changeset by explaining the PR adds Python 3.14 support as part of RAPIDS-wide work, references the temporary use of a shared-workflows branch, and notes CI expectations—all of which align with the actual changes present.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
conda/recipes/cuopt/recipe.yaml (1)

72-79: ⚠️ Potential issue | 🔴 Critical

Keep python in requirements.host and add python-gil as an additional constraint.

Line 78 replaces python with python-gil, but python-gil is a selector metapackage that does not provide the standard Python ABI/version runtime pinning. The built artifact will lack correct runtime Python version/ABI constraints, risking installability on incompatible Python variants.

Use the recommended pattern instead:

  • Retain python =${{ py_version }} in requirements.host (and run for extension packages) to emit standard runtime constraints.
  • Add python-gil as an additional constraint in run_constrained or as a direct run dependency to enforce the GIL variant selection.

Apply this fix to all recipes switched to python-gil in this PR.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@conda/recipes/cuopt/recipe.yaml` around lines 72 - 79, The host requirements
replaced the standard python pin with the selector metapackage python-gil;
restore the proper Python ABI pin by adding back "python =${{ py_version }}"
under requirements.host (keep cython, pip, etc.), and add "python-gil" as an
additional constraint — either in run_constrained or as a run dependency for the
extension package so the GIL variant is enforced without losing the standard
runtime Python ABI/version pinning; update any other recipes in this PR that
switched to python-gil the same way.
🧹 Nitpick comments (4)
python/cuopt_server/cuopt_server/utils/process_handler.py (1)

73-78: Extract the context selection to a shared location to avoid duplication.

cuopt_service.py and process_handler.py both independently hardcode get_context("fork") for the multiprocessing context. This creates two sources of truth and makes it easy to accidentally mix contexts across Process/Event/Queue objects if one location is changed without updating the other. Extract this to a shared constant or helper function, or pass the chosen context to create_abort_list_and_process() as a parameter.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@python/cuopt_server/cuopt_server/utils/process_handler.py` around lines 73 -
78, Both cuopt_service.py and process_handler.py call get_context("fork")
independently; extract the multiprocessing context to a single shared symbol
(e.g., a module-level constant or helper like DEFAULT_MP_CONTEXT =
get_context("fork") or get_default_context()) and update
create_abort_list_and_process() to accept the context as a parameter (or import
the shared symbol) so ctx, ctx.Event(), ctx.Process(...) in process_handler.py
use that single source; update cuopt_service.py to use the same shared
constant/helper instead of calling get_context("fork") directly to avoid
mismatched contexts.
docs/cuopt/source/system-requirements.rst (1)

28-29: Use one Python range format throughout the page.

The main requirements block uses >= 3.11.* and <= 3.14.*, but the thin-client section switches to >= 3.11.x <= 3.14.x. Unifying the notation will make the supported range easier to scan and less ambiguous.

As per coding guidelines: "Consistency: Version numbers, parameter types, and terminology match code".

Also applies to: 101-101

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/cuopt/source/system-requirements.rst` around lines 28 - 29, Replace
inconsistent Python version range formats so the page uses a single notation;
locate occurrences of ">= 3.11.* and <= 3.14.*" and ">= 3.11.x <= 3.14.x"
(including the thin-client section) and standardize them to one format (pick the
project's preferred style, e.g., ">= 3.11.* and <= 3.14.*") across the document;
ensure both the main requirements block and the thin-client section use the
exact same string to maintain consistency.
.github/workflows/build.yaml (1)

48-48: Replace mutable branch refs with immutable commit SHAs for reproducibility and stability.

All rapidsai/shared-workflows references in this file use the @python-3.14 branch, which is mutable. Future changes to that branch will silently alter build behavior, and branch deletion or cleanup upstream would break these jobs entirely. Pin these workflow refs to specific commit SHAs instead to ensure reproducible and stable builds.

Also applies to: 58, 68, 76, 91, 102, 115, 126, 138, 148, 163, 174, 188, 204

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/build.yaml at line 48, The workflow references use mutable
branch refs (e.g., the line "uses:
rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14")
which makes builds non‑reproducible; replace each "@python-3.14" ref (and the
other occurrences mentioned) with the corresponding immutable commit SHA from
the rapidsai/shared-workflows repo so the "uses:" entries point to a specific
commit SHA instead of the branch name, updating all listed occurrences (lines
referencing rapidsai/shared-workflows at the noted positions) to the matching
commit SHAs.
dependencies.yaml (1)

349-350: Encode the Python 3.14 Numba floor directly in the dependency matrix.

Numba 0.61 adds Python 3.13 support, and Python 3.14 support arrives in 0.63.0. Keeping the floor at numba>=0.60.0 means the new py: "3.14" environments rely on the resolver to filter out older Numba releases instead of expressing the compatibility floor here. Consider a py: "3.14"-specific numba>=0.63,<0.65 constraint, or raise the shared floor if older Python jobs no longer need 0.60–0.62. (numba.readthedocs.io)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@dependencies.yaml` around lines 349 - 350, The dependency matrix currently
pins numba as "numba>=0.60.0,<0.65.0" which does not express that Python 3.14
requires numba>=0.63; update the matrix so that the Python 3.14 job (py: "3.14")
explicitly uses a stricter constraint (e.g., numba>=0.63,<0.65) or raise the
shared floor to >=0.63 if older Python jobs no longer need 0.60–0.62; adjust the
numba entry in dependencies.yaml and any matrix/job entries that reference numba
so the resolver does not have to implicitly filter incompatible releases.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/pr.yaml:
- Line 37: The workflow uses mutable branch refs (e.g. the string "uses:
rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.14");
replace every instance of the branch ref "@python-3.14" (and any other
branch-style refs) with the corresponding immutable commit SHA for the target
repository/workflow so each "uses: rapidsai/shared-workflows/...@<commit-sha>"
invocation is pinned (apply the same change for all other occurrences of the
same pattern in this file).

In `@README.md`:
- Line 139: Replace the reStructuredText link syntax with Markdown by changing
"`cuOpt dockerhub page <https://hub.docker.com/r/nvidia/cuopt/tags>`_" to
"[cuOpt dockerhub page](https://hub.docker.com/r/nvidia/cuopt/tags)" and fix the
Python tag mismatch in the example by updating "25.10.0-cuda12.9-py3.13" and
"25.10.0-cuda13.0-py3.13" to use "py3.14" (e.g., "25.10.0-cuda12.9-py3.14" or
"25.10.0-cuda13.0-py3.14") so the note about `py3.14` matches the example.

---

Outside diff comments:
In `@conda/recipes/cuopt/recipe.yaml`:
- Around line 72-79: The host requirements replaced the standard python pin with
the selector metapackage python-gil; restore the proper Python ABI pin by adding
back "python =${{ py_version }}" under requirements.host (keep cython, pip,
etc.), and add "python-gil" as an additional constraint — either in
run_constrained or as a run dependency for the extension package so the GIL
variant is enforced without losing the standard runtime Python ABI/version
pinning; update any other recipes in this PR that switched to python-gil the
same way.

---

Nitpick comments:
In @.github/workflows/build.yaml:
- Line 48: The workflow references use mutable branch refs (e.g., the line
"uses:
rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@python-3.14")
which makes builds non‑reproducible; replace each "@python-3.14" ref (and the
other occurrences mentioned) with the corresponding immutable commit SHA from
the rapidsai/shared-workflows repo so the "uses:" entries point to a specific
commit SHA instead of the branch name, updating all listed occurrences (lines
referencing rapidsai/shared-workflows at the noted positions) to the matching
commit SHAs.

In `@dependencies.yaml`:
- Around line 349-350: The dependency matrix currently pins numba as
"numba>=0.60.0,<0.65.0" which does not express that Python 3.14 requires
numba>=0.63; update the matrix so that the Python 3.14 job (py: "3.14")
explicitly uses a stricter constraint (e.g., numba>=0.63,<0.65) or raise the
shared floor to >=0.63 if older Python jobs no longer need 0.60–0.62; adjust the
numba entry in dependencies.yaml and any matrix/job entries that reference numba
so the resolver does not have to implicitly filter incompatible releases.

In `@docs/cuopt/source/system-requirements.rst`:
- Around line 28-29: Replace inconsistent Python version range formats so the
page uses a single notation; locate occurrences of ">= 3.11.* and <= 3.14.*" and
">= 3.11.x <= 3.14.x" (including the thin-client section) and standardize them
to one format (pick the project's preferred style, e.g., ">= 3.11.* and <=
3.14.*") across the document; ensure both the main requirements block and the
thin-client section use the exact same string to maintain consistency.

In `@python/cuopt_server/cuopt_server/utils/process_handler.py`:
- Around line 73-78: Both cuopt_service.py and process_handler.py call
get_context("fork") independently; extract the multiprocessing context to a
single shared symbol (e.g., a module-level constant or helper like
DEFAULT_MP_CONTEXT = get_context("fork") or get_default_context()) and update
create_abort_list_and_process() to accept the context as a parameter (or import
the shared symbol) so ctx, ctx.Event(), ctx.Process(...) in process_handler.py
use that single source; update cuopt_service.py to use the same shared
constant/helper instead of calling get_context("fork") directly to avoid
mismatched contexts.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ae66a88a-3353-4e36-a1a8-6f91cd8309be

📥 Commits

Reviewing files that changed from the base of the PR and between 2b21118 and 8646ada.

📒 Files selected for processing (22)
  • .github/workflows/build.yaml
  • .github/workflows/pr.yaml
  • CONTRIBUTING.md
  • README.md
  • conda/environments/all_cuda-129_arch-aarch64.yaml
  • conda/environments/all_cuda-129_arch-x86_64.yaml
  • conda/environments/all_cuda-131_arch-aarch64.yaml
  • conda/environments/all_cuda-131_arch-x86_64.yaml
  • conda/recipes/cuopt-server/recipe.yaml
  • conda/recipes/cuopt-sh-client/recipe.yaml
  • conda/recipes/cuopt/recipe.yaml
  • conda/recipes/mps-parser/recipe.yaml
  • dependencies.yaml
  • docs/cuopt/source/system-requirements.rst
  • python/cuopt/cuopt/linear_programming/pyproject.toml
  • python/cuopt/pyproject.toml
  • python/cuopt_self_hosted/pyproject.toml
  • python/cuopt_server/cuopt_server/cuopt_service.py
  • python/cuopt_server/cuopt_server/utils/process_handler.py
  • python/cuopt_server/pyproject.toml
  • python/libcuopt/pyproject.toml
  • skills/cuopt-lp-milp-api-python/assets/mps_solver/model.py

- test-self-hosted-server
secrets: inherit
uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@main
uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.14
Copy link

@coderabbitai coderabbitai bot Mar 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Resolve the current head SHA for the temporary shared-workflows branch.
# Use the returned SHA in place of `python-3.14` for the refs in this file.
gh api repos/rapidsai/shared-workflows/git/ref/heads/python-3.14 --jq '.object.sha'

Repository: NVIDIA/cuopt

Length of output: 216


🏁 Script executed:

# First, check the file structure and size
wc -l .github/workflows/pr.yaml

# Read the entire file to see all the references
cat -n .github/workflows/pr.yaml

Repository: NVIDIA/cuopt

Length of output: 21773


Pin all shared-workflows refs to immutable commit SHAs.

This PR uses mutable branch references (@python-3.14) for 15 reusable workflow invocations across the file. Branch refs make CI non-reproducible and leave this workflow brittle if the branch is force-pushed or deleted before a follow-up PR switches to a stable reference. Replace each @python-3.14 ref with a commit SHA.

Also applies to: 114, 282, 288, 295, 311, 318, 335, 348, 360, 371, 380, 396, 408, 420

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pr.yaml at line 37, The workflow uses mutable branch refs
(e.g. the string "uses:
rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@python-3.14");
replace every instance of the branch ref "@python-3.14" (and any other
branch-style refs) with the corresponding immutable commit SHA for the target
repository/workflow so each "uses: rapidsai/shared-workflows/...@<commit-sha>"
invocation is pinned (apply the same change for all other occurrences of the
same pattern in this file).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, we control this reference and it's only temporary anyway.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gforsyth, understood! Since you control the upstream rapidsai/shared-workflows repository and the @python-3.14 reference is intentionally temporary (to be reverted to @main once all RAPIDS repos add Python 3.14 support), the mutable branch ref is perfectly reasonable here. I'll take note of this for future reviews.


✏️ Learnings added
Learnt from: gforsyth
Repo: NVIDIA/cuopt PR: 933
File: .github/workflows/pr.yaml:37-37
Timestamp: 2026-03-11T17:18:07.089Z
Learning: In NVIDIA/cuopt PRs that add support for a new Python version (e.g. Python 3.14), the `.github/workflows/pr.yaml` and `.github/workflows/build.yaml` files intentionally use mutable branch references (e.g. `python-3.14`) for `rapidsai/shared-workflows` reusable workflows. This is a temporary, controlled reference as part of a RAPIDS-wide rollout pattern. Do not flag these as needing to be pinned to immutable commit SHAs — they will be reverted to `main` in a follow-up PR once all RAPIDS repositories add support.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

```

Note: The ``latest`` tag is the latest stable release of cuOpt. If you want to use a specific version, you can use the ``<version>-cuda12.9-py3.13`` or ``<version>-cuda13.0-py3.13`` tag. For example, to use cuOpt 25.10.0, you can use the ``25.10.0-cuda12.9-py3.13`` or ``25.10.0-cuda13.0-py3.13`` tag. Please refer to `cuOpt dockerhub page <https://hub.docker.com/r/nvidia/cuopt/tags>`_ for the list of available tags.
Note: The ``latest`` tag is the latest stable release of cuOpt. If you want to use a specific version, you can use the ``<version>-cuda12.9-py3.14`` or ``<version>-cuda13.0-py3.14`` tag. For example, to use cuOpt 25.10.0, you can use the ``25.10.0-cuda12.9-py3.13`` or ``25.10.0-cuda13.0-py3.13`` tag. Please refer to `cuOpt dockerhub page <https://hub.docker.com/r/nvidia/cuopt/tags>`_ for the list of available tags.
Copy link

@coderabbitai coderabbitai bot Mar 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# Check the README.md file around line 139 to see the exact content
head -n 145 README.md | tail -n 20

Repository: NVIDIA/cuopt

Length of output: 1875


🏁 Script executed:

# Also check the context around line 133-136 to see the full picture of version changes
head -n 145 README.md | tail -n 30

Repository: NVIDIA/cuopt

Length of output: 1875


🏁 Script executed:

# Check line 60 as well to understand the Python version support range
sed -n '55,65p' README.md

Repository: NVIDIA/cuopt

Length of output: 1875


Fix link syntax and Python version inconsistency.

Line 139 uses reStructuredText link syntax (`text <url>`_) which renders as literal text in Markdown instead of a hyperlink. Change to [cuOpt dockerhub page](https://hub.docker.com/r/nvidia/cuopt/tags).

Additionally, the note introduces py3.14 tags but the example uses py3.13—update the example to 25.10.0-cuda12.9-py3.14 or 25.10.0-cuda13.0-py3.14 for consistency, or clarify if 25.10.0 is intentionally a pre-3.14 release.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` at line 139, Replace the reStructuredText link syntax with
Markdown by changing "`cuOpt dockerhub page
<https://hub.docker.com/r/nvidia/cuopt/tags>`_" to "[cuOpt dockerhub
page](https://hub.docker.com/r/nvidia/cuopt/tags)" and fix the Python tag
mismatch in the example by updating "25.10.0-cuda12.9-py3.13" and
"25.10.0-cuda13.0-py3.13" to use "py3.14" (e.g., "25.10.0-cuda12.9-py3.14" or
"25.10.0-cuda13.0-py3.14") so the note about `py3.14` matches the example.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no 25.10 release with Python 3.14 support and there never will be

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gforsyth, that makes perfect sense — 25.10.0 predates Python 3.14 support, so using py3.13 in that example is entirely correct. I was wrong to flag it as inconsistent. My apologies for the noise!

The only remaining point from my comment would be the reStructuredText link syntax (`cuOpt dockerhub page <https://hub.docker.com/r/nvidia/cuopt/tags>`_) in that same line, which won't render as a hyperlink in Markdown — but that's a pre-existing issue, not introduced by this PR, so feel free to ignore it here.

(ᴗ_ ᴗ。)


✏️ Learnings added
Learnt from: gforsyth
Repo: NVIDIA/cuopt PR: 933
File: README.md:139-139
Timestamp: 2026-03-11T17:19:28.053Z
Learning: In NVIDIA/cuopt README.md, the versioned example container tags (e.g., `25.10.0-cuda12.9-py3.13`) are intentionally pinned to the Python version that was supported at the time of that release. Do not flag these as inconsistent when a newer Python version (e.g., py3.14) is added to the `latest` tag examples — older release tags correctly reflect the Python versions available at release time.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: gforsyth
Repo: NVIDIA/cuopt PR: 933
File: .github/workflows/pr.yaml:37-37
Timestamp: 2026-03-11T17:18:07.089Z
Learning: In NVIDIA/cuopt PRs that add support for a new Python version (e.g. Python 3.14), the `.github/workflows/pr.yaml` and `.github/workflows/build.yaml` files intentionally use mutable branch references (e.g. `python-3.14`) for `rapidsai/shared-workflows` reusable workflows. This is a temporary, controlled reference as part of a RAPIDS-wide rollout pattern. Do not flag these as needing to be pinned to immutable commit SHAs — they will be reverted to `main` in a follow-up PR once all RAPIDS repositories add support.

Learnt from: gforsyth
Repo: NVIDIA/cuopt PR: 809
File: python/libcuopt/pyproject.toml:20-20
Timestamp: 2026-01-29T15:24:25.013Z
Learning: In Python packaging, `requires-python` in pyproject.toml should generally only specify a minimum version (e.g., `requires-python = ">=3.11"`), not an upper bound. Setting upper bounds goes against Python packaging best practices and can cause dependency resolution issues. Use the classifiers field to document tested/supported Python versions instead.

Copy link
Member

@jameslamb jameslamb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look great to me!

I left very very minor comments, would be fine to merge this if you get other approvals, don't let any of them hold you up.

)
parser.add_argument(
"--compare", action="store_true", help="Compare 1% vs 0.1% gap"
"--compare", action="store_true", help="Compare 1%% vs 0.1%% gap"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh wow, I didn't realize that argparse had format specifiers like this. Just read about them at https://docs.python.org/3/library/argparse.html

Ok yeah makes sense.

### Python requirements

* Python >=3.11, <=3.13
* Python >=3.11, <=3.14
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tmckayus @rgsl888prabhu can we replace stuff like this with links to the RAPIDS install selector?

https://docs.rapids.ai/install/

Or is there a specific reason that these need to be hard-coded entries?

This type of stuff is a bit of a pain to update when we change the support matrix for RAPIDS.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think selector would be an awesome upgrade, we can work this.

@jameslamb jameslamb removed the request for review from KyleFromNVIDIA March 11, 2026 17:40
### Python requirements

* Python >=3.11, <=3.13
* Python >=3.11, <=3.14
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think selector would be an awesome upgrade, we can work this.

@rgsl888prabhu
Copy link
Collaborator

/merge

@rapids-bot rapids-bot bot merged commit d531ad1 into NVIDIA:main Mar 12, 2026
106 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvement Improves an existing functionality non-breaking Introduces a non-breaking change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants