Skip to content

feat(platform): add RTX_PRO_6000 to the GPUType enum - #719

Closed
oatanas wants to merge 12 commits into
feat/PYSDK-133/integrationfrom
feat/HETA-1792-rtx-pro-6000-gpu-type
Closed

feat(platform): add RTX_PRO_6000 to the GPUType enum#719
oatanas wants to merge 12 commits into
feat/PYSDK-133/integrationfrom
feat/HETA-1792-rtx-pro-6000-gpu-type

Conversation

@oatanas

@oatanas oatanas commented Sep 11, 2026

Copy link
Copy Markdown

Summary

Adds RTX_PRO_6000 to platform.GPUType. The he-tme application already accepts RTX PRO 6000 (sm_120) GPUs for HETA-1792, but the SDK enum stopped at L4 and A100.

This is not only a CLI-help issue: Runs.submit() calls validate_run_sdk_metadata(custom_metadata["sdk"]) on every submission, which validates pipeline.gpu.gpu_type against this enum. Verified against the released SDK:

pipeline.gpu.gpu_type
  Input should be 'L4' or 'A100' [type=enum, input_value='RTX_PRO_6000', input_type=str]

Because the gate is inside submit(), and that method has no opt-out, a downstream caller cannot route around it — stargate's "pass unknown GPU types through" change ([stargate#378] still failed here. Adding the member is the fix.

Schema version

Bumps SDK_METADATA_SCHEMA_VERSION to 0.0.7 and regenerates docs/source/_static/sdk_run_custom_metadata_schema_{v0.0.7,latest}.json. This follows the precedent of 0.0.6, which was bumped for the equivalent change of adding FLEX_START to the provisioning-mode enum. The change only widens what validates, so metadata written against 0.0.6 remains valid.

Not included

CLI_REFERENCE.md is left untouched. It has already drifted from the CLI on main (regenerating it locally rewrites ~745 lines, mostly a TEXT<str> typer formatting change plus sections that disappear unless every extra is installed), so refreshing it belongs in its own chore commit via nox -s docs.

Test plan

  • pytest tests/aignostics/platform/sdk_metadata_test.py -m unit — 71 passed
  • pytest tests/aignostics/platform -m unit — 413 passed; 3 pre-existing timeout failures in runs_test.py (test_runs_submit_*) reproduce identically on a clean main checkout in this environment and are unrelated
  • ruff check / ruff format --check clean on the changed files
  • Regenerated schema contains "enum": ["L4", "A100", "RTX_PRO_6000"]

dima-aignostics and others added 12 commits August 6, 2026 11:39
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Oliver Meyer <oliverm@aignostics.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* docs: add "Get started with the API" developer guide

Adds a guide for developers calling the Platform API directly over HTTPS,
for integrations in other languages or existing pipelines that do not
depend on the Python SDK.

Walks one full workflow with curl: authentication via the OAuth 2.0
device flow and refresh token grant (including what the tokens are and
why authentication is tied to a user), reading an application version's
input contract, making slides reachable through signed URLs, submitting
an analysis, following per-slide progress through the run and item state
model, downloading results, and the 30-day retention window. Closes with
retry, idempotency and caching conventions.

Links the guide from the docs index and the interface table in README.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

[skip:test:long_running]

* docs: address review feedback on the API guide

- Spell out how to make slides reachable: store the slide in S3-compliant
  object storage and mint a signed URL valid for at least seven days, plus
  the bucket and HMAC credentials the platform provides per organization,
  with an upload-and-presign example.
- Flag the submit example as specific to Atlas H&E-TME 1.3.0, since artifact
  names and metadata differ per application and version, and point back to
  reading the version contract first.
- Add a hello-world script taking only a client ID: device flow login, then
  GET /v1/me to confirm API access.

[skip:test:long_running]

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: tighten the API guide

Cut ~300 words (18%) without dropping a fact or an example. The device
flow was explained three times over — conceptually, then step by step,
then as a script — so "How it works" now states what a token is and
links RFC 8628, leaving the steps to show the calls. The user-code
comparison rationale moves into Step 2, where the comparison happens.
Remainder is line-level trimming of the submit, follow, download and
conventions sections.

Net effect: the guide is shorter than before the review feedback, with
the storage table, version caveat and hello world script added.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs: add "Get started with Console" user guide

Adds a guide for the flow where slides are uploaded to the organization's
bucket with the Python SDK and analyzed in Console at
platform.aignostics.com, which is easier for non-technical users than the
Launchpad GUI.

Structure follows sign up -> upload your slides -> analyze your slides
with Atlas H&E-TME, with five screenshots of Console (create run form,
slide selection from the bucket, run parameters, viewer overlays, result
download), the 30-day result retention window, and a troubleshooting
section.

Links the guide from the docs index and the interface table in README.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: hide the MCP server guide from the published documentation

The MCP server is not yet usable for customers, so advertising it in the
documentation sends readers to instructions they cannot act on.

Excludes get_started_mcp.rst from the Sphinx build, drops it from the
"Get started" toctree, and comments out the MCP row in the interface
table. The guide and its partial stay in the repository; each change
carries a note on how to restore it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: address review feedback on the Console guide

- Create the download target folder before use: `dataset idc download`
  declares target with exists=True, so a missing directory aborts with
  "Invalid value for 'target'". Adds mkdir and names the error.
- Use my-slides consistently: Step 4 now downloads the example slide into
  the same folder Step 5 uploads, instead of introducing data/.
- Stop promising a progress bar unconditionally. The bar shares a line
  with a long description and 6 further columns, so rich squeezes it to
  zero glyphs at 80 columns and 2 at 100; it needs ~160 to render fully.
  The guide now describes the messages and when the bar appears.
- Fix image paths for GitHub: _static/console/* resolved only relative to
  docs/source, so the images 404 when reading the partial on GitHub.
  ../source/_static/console/* resolves in both GitHub and the Sphinx
  build (verified: build succeeded, images copied to _images/).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: keep the invite guidance in the README partial

README.md is generated from docs/partials/README_*.md (noxfile.py
_generate_readme), but #693 added the "Inviting and managing users"
section to README.md only. Regenerating the README therefore dropped it,
which is what this branch did.

Moves the section into docs/partials/README_platform.md, next to the
roles it belongs with, and regenerates README.md so the content survives
the next regeneration.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Lock file maintenance bumped ruff (0.15->0.16) and typer (0.26->0.27),
breaking CI:

- ruff 0.16 stabilizes PLR0917 (too-many-positional-arguments) into the
  ALL selection; append PLR0917 to the existing per-site noqa on the 34
  affected functions (PLR0913 stays, it is an independent rule).
- ruff 0.16 formats Python code blocks embedded in Markdown; reformat the
  snippet in tests/CLAUDE.md accordingly.
- typer 0.27 renders the missing-argument metavar as the parameter name
  ('run_id') instead of upper-case ('RUN_ID'); update the assertion in
  test_cli_run_result_delete_fails_on_no_arg.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The he-tme application accepts RTX PRO 6000 (sm_120) GPUs, but the SDK enum
stopped at L4 and A100, so `validate_run_sdk_metadata` — which `Runs.submit`
calls on every submission — rejected the run before it reached the platform:

    pipeline.gpu.gpu_type
      Input should be 'L4' or 'A100' [type=enum, input_value='RTX_PRO_6000']

That gate is inside the SDK, so no caller could work around it; passing the
string through from a downstream CLI still failed here.

Bumps SDK_METADATA_SCHEMA_VERSION to 0.0.7 and regenerates the published run
schema, following 0.0.6, which was bumped for the equivalent change (adding
FLEX_START to the provisioning-mode enum). Adding an enum member widens what
validates, so runs written against 0.0.6 stay valid.

CLI_REFERENCE.md is left alone: it has drifted from the current CLI on main
already, and `nox -s docs` regenerates it with all extras installed.

Refs HETA-1792

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CNyXyfHNFAgv7zUYjUG22P
@oatanas
oatanas requested a review from a team as a code owner September 11, 2026 10:01
@oatanas oatanas closed this Sep 11, 2026
@oatanas oatanas reopened this Sep 11, 2026
@oatanas
oatanas changed the base branch from main to feat/PYSDK-133/integration September 11, 2026 10:21
@codecov

codecov Bot commented Sep 11, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
1022 1 1021 15
View the top 1 failed test(s) by shortest run time
tests.aignostics.application.cli_test::test_cli_run_submit_and_describe_and_cancel_and_download_and_delete
Stack Traces | 20.6s run time
runner = <typer.testing.CliRunner object at 0x7f66b93e12b0>
tmp_path = PosixPath('.../pytest-20/popen-gw5/test_cli_run_submit_and_descri0')
silent_logging = None
record_property = <function record_property.<locals>.append_property at 0x7f66bad803b0>

    @pytest.mark.e2e
    @pytest.mark.long_running
    @pytest.mark.flaky(retries=3, delay=5)
    @pytest.mark.timeout(timeout=60 * 10)
    @pytest.mark.skipif(
        (platform.system() == "Linux" and platform.machine() in {"aarch64", "arm64"})
        or (platform.system() in {"Darwin", "Windows"}),
        reason=(
            "Only run on Linux x86_64 / GitHub Actions ubuntu-latest to avoid creating unnecessary load on the platform."
        ),
    )
    def test_cli_run_submit_and_describe_and_cancel_and_download_and_delete(  # noqa: PLR0915
        runner: CliRunner, tmp_path: Path, silent_logging, record_property
    ) -> None:
        """Check run submit command runs successfully."""
        record_property("tested-item-id", "TC-APPLICATION-CLI-02")
        with submitted_run(
            runner,
            tmp_path,
            CSV_CONTENT_SPOT0,
            extra_args=[
                "--note",
                "note_of_this_complex_test",
                "--tags",
                "cli-test,test_cli_run_submit_and_describe_and_cancel_and_download_and_delete,further-tag",
                "--deadline",
                (datetime.now(tz=UTC) + timedelta(minutes=10)).isoformat(),
                "--onboard-to-aignostics-portal",
                "--gpu-type",
                PIPELINE_GPU_TYPE,
                "--force",
            ],
        ) as run_id:
            # Test that we can find this run by it's note via the query parameter
            list_result = runner.invoke(
                cli,
                [
                    "application",
                    "run",
                    "list",
                    "--query",
                    "note_of_this_complex_test",
                    "--limit",
                    str(LIST_APPLICATION_RUNS_MAX_PAGE_SIZE),
                ],
            )
            assert list_result.exit_code == 0
            list_output = normalize_output(list_result.stdout)
>           assert run_id in list_output, f"Run ID '{run_id}' not found when filtering by note via query"
E           AssertionError: Run ID '00a7870e-1fa3-47b8-92e5-3561617f838b' not found when filtering by note via query
E           assert '00a7870e-1fa3-47b8-92e5-3561617f838b' in "Application Run IDs:- b4e06ea5-976f-42bb-91a6-3b244171cc77 of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-10 12:45:48 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 534be2a1-b546-4037-96de-db3ecfb4b49d of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-09 12:46:27 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- a05fb6d7-868d-46cc-87fa-2a60d0b6e14c of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-09 06:28:25 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 50e06d00-fae9-4ee1-85ed-0ede36d8a555 of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-08 12:47:43 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 1d449c32-ecf5-4ed2-89bd-43f99d923a1c of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-07 12:47:11 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- e2cb4d6b-67c6-4b18-b80c-082b44558c23 of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-06 12:44:16 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- c0e0986c-cfd4-4152-9bb2-58cec28a5841 of he-tme (2.0.0-rc1-blood) (submitted: 2026-09-05 12:43:31 UTC, status: TER... efc6d458-cd20-433a-a047-573581633c52 of he-tme (1.3.0) (submitted: 2026-07-30 13:06:00 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 4f512b72-b700-4fce-b40e-6e8a72b4a956 of he-tme (1.3.0) (submitted: 2026-07-30 12:09:23 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 707471b3-a048-4e2f-9fe9-96138f5193a2 of he-tme (1.3.0) (submitted: 2026-07-30 10:06:51 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 1a1c701a-f34e-498e-b4c8-79dfd6050def of he-tme (1.3.0) (submitted: 2026-07-30 08:25:46 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 09aa81fb-bda3-4667-a528-4d1e70288a0d of he-tme (1.3.0) (submitted: 2026-07-29 13:12:36 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- 38112340-55c8-4a09-9101-6f3aecce5950 of he-tme (1.3.0-rc.1) (submitted: 2026-07-28 13:05:24 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)- b4e81961-f7f1-4e52-8537-76794b008f34 of he-tme (1.3.0-rc.1) (submitted: 2026-07-27 13:31:15 UTC, status: TERMINATED (RunTerminationReason.CANCELED_BY_USER), output: NONE)Listed '100' run(s)."

.../aignostics/application/cli_test.py:569: AssertionError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@sonarqubecloud

Copy link
Copy Markdown

@oatanas

oatanas commented Sep 11, 2026

Copy link
Copy Markdown
Author

Superseded by #720, which targets feat/PYSDK-133/integration (the correct base for this work) instead of main. Same change, re-applied by hand because that branch renames the package to src/aignostics_sdk/.

@oatanas oatanas closed this Sep 11, 2026
@oatanas
oatanas deleted the feat/HETA-1792-rtx-pro-6000-gpu-type branch September 11, 2026 11:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants