3lc-compute-plugin-yolo 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,33 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+ workflow_call:
9
+
10
+ concurrency:
11
+ group: ci-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ ruff:
16
+ name: ruff (lint + format)
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v5
23
+ with:
24
+ version: "0.8.15"
25
+
26
+ # Ruff runs STANDALONE (uvx): linting must not require resolving the per-plugin ML
27
+ # stacks (torch / timm / sam3 / ultralytics) — that would be slow and need extra
28
+ # indexes. Config lives in pyproject [tool.ruff]; pin matches 3lc-plugin-sdk.
29
+ - name: Ruff lint
30
+ run: uvx --from 'ruff>=0.15,<0.16' ruff check .
31
+
32
+ - name: Ruff format check
33
+ run: uvx --from 'ruff>=0.15,<0.16' ruff format --check .
@@ -0,0 +1,111 @@
1
+ name: Release
2
+
3
+ # Tag (`v*`) pushes publish to public PyPI via Trusted Publishing (GitHub OIDC, no secrets).
4
+ # Mirrors 3lc-compute-plugin-sdk / 3lc-compute-plugins release.yml. To cut a release: bump
5
+ # `version` in pyproject.toml AND src/tlc_plugin_yolo/plugin.toml (they move together),
6
+ # update CHANGELOG.md, commit, then push a tag `vX.Y.Z` that matches the version.
7
+ #
8
+ # Manual (workflow_dispatch) runs publish build-numbered prereleases to the legacy CloudRepo
9
+ # index (pypi.3lc.ai) — kept as a grace-period fallback; retire that job (and the CLOUDREPO_*
10
+ # secrets/vars on the "release" environment) once nothing consumes the CloudRepo index. The
11
+ # split deliberately keeps build-numbered versions OFF PyPI: `X.Y.Z.N` sorts above `X.Y.Z`,
12
+ # so a prerelease build would win over the real release in `>=X.Y,<X.Y+1`-style pins.
13
+ #
14
+ # NOTE: `uv build --no-sources` builds the WHEEL only — it does not resolve or install the
15
+ # heavy [yolo] extra. The wheel's metadata carries the SDK pin and the extra's dependency
16
+ # list, resolved from their indexes at install time.
17
+
18
+ on:
19
+ push:
20
+ tags: ["v*"]
21
+ workflow_dispatch:
22
+
23
+ jobs:
24
+ # Gate the release on CI (ruff lint + format). ci.yml is reusable via workflow_call.
25
+ test:
26
+ uses: ./.github/workflows/ci.yml
27
+ secrets: inherit
28
+
29
+ # Tag (`v*`) pushes → the real release, to public PyPI.
30
+ publish-pypi:
31
+ if: github.event_name == 'push'
32
+ needs: test
33
+ runs-on: ubuntu-latest
34
+ environment: release
35
+ permissions:
36
+ contents: read
37
+ id-token: write # OIDC token for PyPI Trusted Publishing
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+
41
+ - name: Install uv
42
+ uses: astral-sh/setup-uv@v5
43
+ with:
44
+ version: "0.8.15"
45
+
46
+ - name: Verify tag matches pyproject version
47
+ run: |
48
+ PKG=$(uv version --output-format json | jq -r '.version')
49
+ TAG="${GITHUB_REF_NAME#v}"
50
+ echo "pyproject=$PKG tag=$TAG"
51
+ [ "$PKG" = "$TAG" ] || { echo "::error::tag $GITHUB_REF_NAME ($TAG) != pyproject version $PKG"; exit 1; }
52
+
53
+ # The version the plugin card reports comes from its manifest; a tag with a drifting
54
+ # manifest would ship a plugin that misreports its own release.
55
+ - name: Verify plugin manifest matches pyproject version
56
+ run: |
57
+ PKG=$(uv version --output-format json | jq -r '.version')
58
+ FAIL=0
59
+ for MANIFEST in src/*/plugin.toml; do
60
+ V=$(grep -Po '^version\s*=\s*"\K[^"]+' "$MANIFEST")
61
+ echo "$MANIFEST: $V"
62
+ [ "$V" = "$PKG" ] || { echo "::error::$MANIFEST version $V != pyproject version $PKG"; FAIL=1; }
63
+ done
64
+ exit $FAIL
65
+
66
+ # --no-sources strips [tool.uv.sources] so the released wheel never bakes in a dev
67
+ # index/path override (the published artifact resolves deps from PyPI).
68
+ - name: Build
69
+ run: uv build --no-sources
70
+
71
+ - name: Publish to PyPI
72
+ run: uv publish --trusted-publishing always
73
+
74
+ # Manual (workflow_dispatch) runs → build-numbered prereleases to the legacy CloudRepo index.
75
+ publish-cloudrepo-prerelease:
76
+ if: github.event_name == 'workflow_dispatch'
77
+ needs: test
78
+ runs-on: ubuntu-latest
79
+ environment: release
80
+ env:
81
+ UV_PUBLISH_URL: ${{ vars.CLOUDREPO_PUBLISH_URL }}
82
+ UV_PUBLISH_USERNAME: ${{ secrets.CLOUDREPO_USERNAME }}
83
+ UV_PUBLISH_PASSWORD: ${{ secrets.CLOUDREPO_PASSWORD }}
84
+ steps:
85
+ - uses: actions/checkout@v4
86
+
87
+ - name: Install uv
88
+ uses: astral-sh/setup-uv@v5
89
+ with:
90
+ version: "0.8.15"
91
+
92
+ - name: Verify the 'release' environment is configured
93
+ run: |
94
+ : "${UV_PUBLISH_URL:?set the CLOUDREPO_PUBLISH_URL variable on the 'release' environment}"
95
+ : "${UV_PUBLISH_USERNAME:?set the CLOUDREPO_USERNAME secret on the 'release' environment}"
96
+ : "${UV_PUBLISH_PASSWORD:?set the CLOUDREPO_PASSWORD secret on the 'release' environment}"
97
+
98
+ # A 4th version segment keeps every prerelease publish unique (CloudRepo has overwrites
99
+ # disabled) while sorting above the base version, so `<X.Y+1`-style pins still resolve it
100
+ # — unlike `.devN` (sorts below) or `+localN` (rejected on upload).
101
+ - name: Stamp build-numbered version
102
+ run: |
103
+ BASE=$(uv version --output-format json | jq -r '.version')
104
+ uv version "${BASE}.${GITHUB_RUN_NUMBER}"
105
+ echo "prerelease build version: ${BASE}.${GITHUB_RUN_NUMBER}"
106
+
107
+ - name: Build
108
+ run: uv build --no-sources
109
+
110
+ - name: Publish to CloudRepo
111
+ run: uv publish
@@ -0,0 +1,14 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ .venv/
7
+ venv/
8
+ uv.lock
9
+ .mypy_cache/
10
+ .ruff_cache/
11
+ .pytest_cache/
12
+ .vscode/
13
+ .idea/
14
+ .DS_Store
@@ -0,0 +1,76 @@
1
+ # Changelog
2
+
3
+ All notable changes to `3lc-compute-plugin-yolo` are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ Nothing yet.
11
+
12
+ ## [0.2.0] - 2026-08-19
13
+
14
+ Also covers the unreleased 0.1.5 bump (#4), which was never tagged.
15
+
16
+ ### Added
17
+ - The pretrained-checkpoint field uses the SDK's shared data-source picker: browse the compute
18
+ node's filesystem (confined to operator-configured roots) instead of typing a path blind.
19
+ The SDK's `/browse` route is mounted alongside the plugin's own routes (#7).
20
+
21
+ ### Changed
22
+ - **Distribution moved to PyPI**: tagged releases publish `3lc-compute-plugin-yolo` to public
23
+ PyPI via Trusted Publishing; the CloudRepo index (pypi.3lc.ai) is no longer needed to install
24
+ the plugin. Manual prerelease builds keep publishing to CloudRepo for a grace period (#7).
25
+ - The plugin SDK pin is `>=0.2.2,<0.3.0`, resolved from public PyPI (the SDK's home since
26
+ 0.2.2) — no custom indexes remain besides the CUDA torch index (#7). Earlier steps on the
27
+ way: the pin was widened to `>=0.2.0,<0.3.0` (#3), and `3lc` moved to public PyPI with the
28
+ 3.2 rust release (#5).
29
+ - The plugin presents itself as "Ultralytics YOLO" and surfaces the Ultralytics dual-license
30
+ terms (AGPL-3.0 / Enterprise License) in the manifest and README (#4).
31
+
32
+ ### Fixed
33
+ - Training jobs are attributed to the configured 3LC project in the generic Queue &
34
+ Progress panel: the run request now carries `project_name`, which the host reads from
35
+ the request body only — the value stored in the saved config never reached the job
36
+ record, so jobs were hidden from every project-filtered view (#6).
37
+ - A `~`-prefixed pretrained-checkpoint path is expanded at ingress instead of reaching the
38
+ model loader literally and failing mid-job with an opaque file-not-found (#7).
39
+
40
+ ## [0.1.4] - 2026-08-07
41
+
42
+ ### Changed
43
+ - The `[yolo]` extra requires `3lc-ultralytics>=0.4.0`.
44
+
45
+ ## [0.1.3] - 2026-07-03
46
+
47
+ ### Fixed
48
+ - The plugin manifest version and the distribution version are bumped together, so the version
49
+ the plugin card reports matches the installed distribution.
50
+
51
+ ## [0.1.2] - 2026-07-03
52
+
53
+ ### Fixed
54
+ - The CUDA torch index is applied on Windows as well as Linux, so GPU-enabled installs work on
55
+ Windows hosts.
56
+
57
+ ### Changed
58
+ - The plugin SDK dependency is resolved from the public package index under its final name
59
+ `3lc-compute-plugin-sdk` (was a git pin).
60
+
61
+ ## [0.1.1] - 2026-07-01
62
+
63
+ ### Added
64
+ - `3lc[pacmap,umap]` extras added to the `[yolo]` provision extra, so embedding visualizations
65
+ work out of the box.
66
+
67
+ ## [0.1.0] - 2026-07-01
68
+
69
+ First release, extracted from the `3lc-compute-plugins` umbrella into its own repository.
70
+
71
+ ### Added
72
+ - The YOLO training plugin for the 3LC compute service: fine-tune YOLO detection and
73
+ segmentation models on 3LC tables via the Ultralytics stack, with per-sample metrics and
74
+ embeddings collected to 3LC runs. GPU-classed and venv-isolated; distributed as
75
+ `3lc-compute-plugin-yolo`. This plugin carries the AGPL-licensed Ultralytics dependency stack
76
+ in its own isolated venv (the reason it lives in a standalone repository).