Skip to content

Latest commit

 

History

History
1403 lines (838 loc) · 68.2 KB

File metadata and controls

1403 lines (838 loc) · 68.2 KB

Changelog

All notable changes to the Nucleus Python Client will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.22.3 - 2026-09-18

Added

  • Benchmark taxonomy rollup on create_benchmark / update_benchmark. You can now set a benchmark's class taxonomy when creating it via rollup_groups, an existing allowed_label_matches_id, or class_agnostic=True (the three are mutually exclusive). update_benchmark accepts the same fields to set/replace a draft's rollups (pass allowed_label_matches_id=None to clear it). Benchmark now surfaces allowed_label_matches_id and class_agnostic on read.

    benchmark = client.create_benchmark(
        "city-streets-v1",
        slice_id="slc_...",
        rollup_groups=[RollupGroup("vehicle", ["car", "truck"])],
    )

Fixed

  • Benchmark taxonomy exclusivity now counts every field that will be sent. update_benchmark(..., rollup_groups=..., allowed_label_matches_id=None) and class_agnostic=False mixed with another taxonomy used to pass the client check and then get rejected by the backend.

0.22.2 - 2026-09-01

Added

  • Model.model_runs(). Lists the ids of every model run for a model — the model-scoped counterpart to Dataset.model_runs(), which only lists a single dataset's runs. Pass include_versions=True to union runs across the model's version lineage (its version root and all descendants). Results are scoped server-side to runs on datasets you can read.

    run_ids = model.model_runs()

0.22.1 - 2026-08-31

Deprecated

  • allowed_label_matches on Evaluation V2. create_evaluation_v2_preset(), update_evaluation_v2_preset(), create_benchmark_evaluation_v2(), and Benchmark.create_evaluation_v2() still accept allowed_label_matches / allowed_label_matches_id for backwards compatibility, but they now emit a DeprecationWarning. Use rollup_groups instead. AllowedLabelMatch and the corresponding fields on EvaluationV2 / EvaluationV2Preset are likewise marked deprecated.

0.22.0 - 2026-08-26

Added

  • Run-free ("model v2") predictions. Predictions can now be uploaded and read directly against a Model, with no ModelRun or Dataset involved — the concept is (model, dataset_item) -> prediction. New methods on Model:
    • Model.upload_predictions(predictions, update=False, batch_size=5000, ...) — upserts predictions onto the model (box / polygon / cuboid only), targeting model/{id}/predictions, and reusing the existing PredictionUploader batching machinery. Synchronous only for now: asynchronous=True raises NotImplementedError.
    • Model.predictions_loc(dataset_item_id), Model.predictions_refloc(reference_id), Model.predictions_iloc(i) — model-scoped reads returning the same shape as their Dataset equivalents.
    • Model.copy_predictions_from_run(model_run_id) — synchronously backfills the run-free store from an existing model run, returning a dict {model_id, model_run_ids, predictions_copied, predictions_skipped_unsupported}.
  • Model-anchored benchmark evaluations. NucleusClient.create_benchmark_evaluation_v2() accepts a model_id (a prj_* id or a Model) as an alternative to model_run_id; the model-anchored flow evaluates the model's run-free predictions and ignores model runs. Provide exactly one of the two. EvaluationV2 now exposes an optional model_id field alongside model_run_id.
  • list_evaluations_v2 accepts a model. NucleusClient.list_evaluations_v2() takes exactly one of model_run_id (run_*) or model_id (prj_* or a Model). The model-anchored path hits GET model/{id}/evaluationsV2 and returns that model's run-free evaluations.

Changed

  • The existing run-based prediction paths (Dataset.upload_predictions, ModelRun.add_predictions, create_benchmark_evaluation_v2(model_run_id=...)) are unchanged and continue to work; the model-centric methods are purely additive.

Deprecated

  • Model-run-anchored Evaluation V2 is deprecated in favor of the run-free (model_id) path. Benchmark.create_evaluation_v2() gains a model_id argument (run-free anchor) to match create_benchmark_evaluation_v2(). Passing model_run_id to create_benchmark_evaluation_v2(), Benchmark.create_evaluation_v2(), or list_evaluations_v2() now emits a DeprecationWarning; all keep working. EvaluationV2.model_run_id is documented as deprecated (it is None on run-free evaluations). On the leaderboard, LeaderboardRankingEntry / LeaderboardF1CurveEntry model_run_id and model_run_name are deprecated and now Optional (they are None for run-free evaluations — previously model_run_id was a required field and would fail to parse), and collapse="allRuns" on leaderboard_ranking() is discouraged. Prefer anchoring on and identifying evaluations by model_id.

Removed

  • allowed_label_matches removed from the EvaluationV2 surface (breaking). The run-free (model-source) eval path — the one this SDK now steers toward — rejects allowedLabelMatches server-side (400, "use rollupGroups"); it only survives as a legacy fallback on the deprecated model-run path, where rollupGroups wins anyway. Removed the AllowedLabelMatch class (and its top-level export), the allowed_label_matches / allowed_label_matches_id arguments from create_benchmark_evaluation_v2(), Benchmark.create_evaluation_v2(), create_evaluation_v2_preset(), and update_evaluation_v2_preset(), and the allowed_label_matches* fields from EvaluationV2 and EvaluationV2Preset. Use rollup_groups (:class:RollupGroup) exclusively.
  • dataset_id dropped from the EvaluationV2 surface (breaking). An evaluation is no longer anchored on a single dataset — a model run now carries a set of datasets and a benchmark's items may span several — so the backend no longer returns a denormalized dataset on evaluations or leaderboards. Removed EvaluationV2.dataset_id, and dataset_id / dataset_name from LeaderboardRankingEntry and LeaderboardF1CurveEntry, matching the current backend responses. Without this, EvaluationV2.from_json raised KeyError: 'dataset_id' on every model-anchored (run-free) benchmark evaluation, since those payloads never carry a dataset_id.

Fixed

  • Model.predictions_loc / predictions_refloc / predictions_iloc now actually parse their responses. The run-free read endpoints return a flat {"predictions": [...]} list (each element carrying its own "type"), but format_prediction_response only understood the legacy type-keyed {"annotations": {"box": [...]}} shape, so these methods returned the raw payload unparsed instead of the documented {"box": [...], "polygon": [...], "cuboid": [...]} dict.

0.21.2 - 2026-08-17

Added

  • Benchmark versioning / lineage. create_benchmark() accepts parent_benchmark_id to create a new version downstream of an existing benchmark: the child inherits the parent's items, the source arguments add on top, and removed_item_ids prune inherited items (parent ∪ added ∖ removed). Version defaults to a minor bump; pass bump_type="major" or explicit version_major + version_minor (must exceed the parent's). Benchmark now exposes parent_benchmark_id, version_major, version_minor, and version_label.
  • Draft benchmarks. create_benchmark(..., draft=True) creates a mutable draft (sources optional). Add items across many calls with Benchmark.add_items() / NucleusClient.add_benchmark_items() (async, same sources as create), remove with Benchmark.remove_items() / NucleusClient.remove_benchmark_items(), then freeze with Benchmark.finalize() / NucleusClient.finalize_benchmark(). A draft cannot be evaluated until finalized; a finalized benchmark is immutable (make a new version instead).

Changed

  • Benchmark.status can now be "draft" (in addition to "building" / "ready" / "failed"). A draft benchmark cannot be evaluated until finalized.

0.21.1 - 2026-08-15

Added

  • NucleusClient.merge_model_runs(). Merges two or more model runs into one new run holding the union of their predictions, leaving the sources untouched. A benchmark evaluation names a single model run and a benchmark's items may span datasets, so a model uploaded as several runs previously had no single run covering the benchmark — every uncovered item scored as a false negative. Merge first, wait for the copy to finish, then pass the new run to create_benchmark_evaluation_v2(). All source runs must belong to the same model.

    The copy runs asynchronously: the call returns {"model_run_id", "dataset_ids", "job"} immediately, but the new run is empty until the job completes — call job.sleep_until_complete() before evaluating. The merge is a full union: predictions are copied, never deduplicated, and colliding annotation_ids are rewritten rather than dropped. Copy counts (predictions_copied, predictions_ignored, annotation_ids_rewritten) are reported on the job.

0.21.0 - 2026-08-19

Added

  • Model.create_run(name) + ModelRun.add_predictions(predictions, ...). Create a model run with just a name, then attach predictions — no dataset needed up front:
    run = model.create_run(name="my-run")
    run.add_predictions(predictions)
    Each prediction identifies its target item by dataset_item_id (the di_* id returned on exported items), so predictions can come from anywhere and a single run can cover items across multiple datasets. add_predictions posts to POST /nucleus/modelRun/:modelRunId/uploadPredictions and supports update / batch_size / file-batching arguments; asynchronous=True raises NotImplementedError for now.
    • create_run still accepts the old dataset= / predictions= arguments for backwards compatibility (the deprecated dataset-bound path); omit them to use the flow above.
  • Per-prediction target. Every prediction type (box, line, polygon, keypoints, cuboid, category, scene_category, segmentation) emits its dataset_item_id in to_payload (as item_id) when set, which is how the dataset-less upload route resolves each item.

Changed

  • reference_id is now optional on predictions. A prediction can be constructed from its dataset_item_id alone (at least one of reference_id / dataset_item_id is required). Annotations still require reference_id. Existing prediction code that passes reference_id is unaffected.

Server dependency: requires the POST /nucleus/model/:modelId/modelRun/create and POST /nucleus/modelRun/:modelRunId/uploadPredictions routes in scaleapi. Unit tests pass regardless; live calls 404 until that deploys.

0.20.2 - 2026-08-18

Added

  • dataset_item_id on exported items and objects. Batch exports now carry the Nucleus-internal dataset item id (di_*) everywhere reference_id already appeared: on DatasetItem, and on every exported annotation and prediction (box, line, polygon, keypoints, cuboid, category, multicategory, segmentation). Video/scene exports carry it on each track frame. Previously only reference_id was returned, so keying predictions back to items required a second lookup. The field is server-assigned and read-only: it is populated by from_json, left None on objects you construct locally, excluded from __eq__, passed keyword-only on constructors, and never sent in to_payload. Exports from an older backend that does not return it simply leave it None.
  • Multi-dataset model runs. Dataset.upload_predictions_for_model_run(model_run_id, predictions, ...) uploads predictions for an existing run against this dataset, adding the dataset to the run's set if it isn't there already. This is what lets a single model run be scored against a benchmark whose items span several datasets. Supports the same update / asynchronous / batch_size / file-batching / trained_slice_id arguments as upload_predictions.
    • A run's dataset set only ever grows — a later upload never removes a dataset, so it cannot widen who can read the run.
    • Access: write on this dataset and on every dataset the run already covers. Runs are visible only to users who can read all of their datasets, so adding one can remove the run from a collaborator's view.
    • Dataset.upload_predictions is unchanged and still cannot widen a run: it identifies the run by (dataset, model), so it finds the run already on this dataset or creates a new one.

Changed

  • Benchmark evaluations no longer require the run to cover the benchmark's datasets. create_benchmark_evaluation_v2 previously failed when the benchmark contained items outside the model run's dataset. Those members are now scored as false negatives like any other uncovered item, so a partial run ranks comparably instead of being rejected. Docstrings on create_benchmark_evaluation_v2 and Benchmark.create_evaluation_v2 updated accordingly.
  • PredictionUploader accepts dataset_id together with model_run_id to select the new endpoint. Previously that combination was rejected by an assertion. The other two forms — (dataset_id, model_id) and model_run_id alone — route exactly as before.

Deprecated

  • ModelRun.predict() (already deprecated with the rest of ModelRun) infers its target dataset from the run, so it fails for a run spanning several datasets. Use Dataset.upload_predictions_for_model_run instead.

Server dependency: requires the POST /nucleus/dataset/:datasetId/modelRun/:modelRunId/uploadPredictions route and the multi-dataset model-run work in scaleapi. Unit tests pass regardless; live calls 404 until that deploys.

0.20.1 - 2026-08-13

Added

  • Model weights. Attach a raw weights artifact (any binary, no format constraints) to a model and fetch it back: NucleusClient.upload_model_weights(model, path), download_model_weights(model, path), get_model_weights(model), and delete_model_weights(model), plus Model.upload_weights() / download_weights() / weights() / delete_weights() and the new ModelWeights metadata type (present, status, size_bytes, original_filename, content_type, download_url). Artifacts up to 10 GB are supported; uploading requires edit access on the model, downloading is available to anyone who can see it.
  • Large artifacts are handled without any extra work on the caller's part: transfers stream directly to/from storage, show a tqdm progress bar by default (pass progress=False to silence it), and automatically retry transient storage failures (network blips, 429s, 5xx) with exponential backoff.

0.20.0 - 2026-08-11

Added

  • Multi-source create_benchmark(). Members can now come from any combination of item_ids, (dataset_id, ref_id) items, one or more slices (slice_id / slice_ids), and one or more datasets (dataset_id / dataset_ids) — unioned and de-duplicated server-side. At least one source is required (previously exactly one).

Changed

  • create_benchmark() is now asynchronous. The server creates the benchmark in a "building" state and streams its members in via a background job (removing the previous item-count ceiling on slice/dataset-sourced benchmarks). create_benchmark() blocks on that job by default and returns the completed "ready" benchmark — the return type is unchanged, so existing blocking callers are unaffected. Pass wait_for_completion=False to return the "building" benchmark immediately and poll it yourself via Benchmark.refresh() (checking the new Benchmark.status field). A failed build job raises JobError. Benchmark now exposes status ("building" / "ready" / "failed").

0.19.1 - 2026-08-07

Added

  • Benchmarks. Full support for benchmark-paradigm evaluation: NucleusClient.create_benchmark() (members from item_ids, (dataset_id, ref_id) items pairs, a slice_id, or a dataset_id; membership frozen at creation), list_benchmarks(), get_benchmark(), update_benchmark(), delete_benchmark(), and list_benchmark_items(), plus the new Benchmark resource with refresh() / update() / delete() / items() / create_evaluation_v2().
  • Benchmark evaluations. create_benchmark_evaluation_v2(benchmark_id, model_run_id, ...) evaluates a model run against every benchmark item (uncovered items score as false negatives, keeping leaderboard scores comparable). Accepts rollup_groups, legacy allowed_label_matches / allowed_label_matches_id, exclusion_rules, and preset. Benchmark evaluations are the only creation surface — dataset/slice-scoped evaluation creation is deprecated platform-wide and was never shipped in this SDK.
  • Rollup groups. The new RollupGroup type (class_name + labels) is the primary label configuration: each group evaluates a set of raw labels as one class. Presets support it end to end — create_evaluation_v2_preset() / update_evaluation_v2_preset() accept rollup_groups (mutually exclusive with allowed_label_matches), and EvaluationV2Preset exposes the field.
  • Exclusion rules. MetadataExclusionRule, LabelExclusionRule, and BoxAreaExclusionRule (or equivalent dicts) drop items/annotations before metrics are computed, passed via exclusion_rules on benchmark evaluation create and presets. EvaluationV2 exposes benchmark_id, rollup_groups, slice_id, exclusion_rules, and exclusion_stats.
  • Evaluation V2 presets. Save and reuse evaluation configurations (name + label configuration + exclusion_rules) via list_evaluation_v2_presets(), create_evaluation_v2_preset(), update_evaluation_v2_preset(), and delete_evaluation_v2_preset(), plus the EvaluationV2Preset resource (with update() / delete()). Passing preset= to create_benchmark_evaluation_v2 seeds the label configuration and rules (explicit arguments override the preset's values).
  • Results. EvaluationV2.charts() (mAP summary, per-class AP, confusion matrix, PR/F1 curves, TIDE attribution, AP by size) and EvaluationV2.examples() (paginated TP/FP/FN match rows; match_type optional) with EvaluationV2FilterArgs filtering (confidence/IoU ranges, labels, metadata predicates, gt_area_range, slice_ids).
  • Cancel & retry. EvaluationV2.cancel() stops a running evaluation; EvaluationV2.retry() re-runs a failed one, reusing its configuration.
  • Benchmark leaderboards. leaderboard_ranking(metric_type, benchmark_ids, ...) ranks model runs on one or more benchmarks (metrics: MAP_50, MAP_50_95, AP_SMALL, AP_MEDIUM, AP_LARGE, PRECISION, RECALL, F1; scope / collapse controls), and leaderboard_f1_curve(benchmark_ids, ...) returns F1-vs-confidence curves for the top runs. Requires a Nucleus deployment with leaderboard support.
  • Filter schema discovery. EvaluationV2.filter_schema() / NucleusClient.get_evaluation_v2_filter_schema() return the evaluation's filter vocabulary (gt_labels, pred_labels, and item-metadata fields with inferred value types) — the valid inputs for EvaluationV2FilterArgs. Requires the same Nucleus deployment as the leaderboard methods.
  • Dataset.evaluation_label_schema() returns the dataset's ground-truth and prediction label vocabularies (gt_labels / prediction_labels) for building rollup groups, label matches, and label exclusion rules.

Note: an unreleased 0.18.9 iteration of this branch carried dataset/slice-scoped creation (create_evaluation_v2, create_evaluations_v2_batch, only_items_with_predictions); that surface was removed before release as the platform moved to the benchmark paradigm.

0.19.0 - 2026-07-07

Changed

  • Breaking: dataset.append() now always uses the async pipeline and returns an AsyncJob. The asynchronous and batch_size parameters are deprecated and ignored. All uploads (local and remote) go through the async Step Function pipeline, which handles phash computation, image optimization, and NLS search indexing.
  • dataset.add_items_from_dir() now returns the AsyncJob for the upload (or None when no items are found) instead of blocking. Call job.sleep_until_complete() to wait until items are queryable and to surface upload errors.

Removed

  • Synchronous upload paths for images and videos. All uploads now use the async pipeline. Use job.sleep_until_complete() to block until processing finishes.
  • UploadResponse class — append() now returns AsyncJob.
  • construct_append_payload() and construct_append_scenes_payload() functions.
  • check_all_paths_remote() function.
  • The already deprecated dataset.append_scenes() method — use dataset.append() instead.
  • Synchronous branches from _append_scenes() and _append_video_scenes().

0.18.8 - 2026-06-17

Fixed

  • Build macOS wheels as native arm64 wheels on the CircleCI Apple Silicon runner instead of requesting universal2, which produced an arm64 wheel that cibuildwheel then tried to test under x86_64.

Tooling / CI

  • Pin cibuildwheel in release wheel jobs, run the Linux wheel builder from a compatible Python host, and select a Python 3.11+ Windows host interpreter so the Python 3.10 through 3.14 wheel matrix is deterministic.

0.18.7 - 2026-06-17

Fixed

  • Renamed the custom Poetry build hook so it no longer shadows the PyPI build package imported by cibuildwheel during macOS and Windows wheel builds.

0.18.6 - 2026-06-15

Added

  • Native C acceleration for deduplicate_by_phash. When the compiled extension is available, all threshold values are handled in native code: thresholds 0 through 11 use the chunked Hamming index, thresholds 12 through 63 use a native linear scan, and threshold 64 uses the keep-first fast path. The public Python API is unchanged and falls back to the pure-Python implementation when the native extension is unavailable.

Tooling / CI

  • Publish Linux x86_64, macOS universal2, and Windows amd64 wheels for Python 3.10 through 3.14 using cibuildwheel, alongside the source distribution.

0.18.5 - 2026-05-28

Added

  • Evaluations V2 client support for COCO-style metrics on model runs via stored evaluation_match_v2 rows. NucleusClient exposes create_evaluation_v2(), get_evaluation_v2(), and list_evaluations_v2(). The EvaluationV2 resource supports wait_for_completion(), charts() (mAP, confusion matrix, PR curve, TIDE, and related aggregates), examples() (paginated TP/FP/FN rows), delete(), and refresh(). AllowedLabelMatch configures allowed ground-truth / prediction label pairs; filter and response types include EvaluationV2FilterArgs, EvaluationV2Charts, EvaluationV2ExamplesPage, and EvaluationV2MatchExample. Sphinx docs cover the workflow under Evaluations V2.

0.18.4 - 2026-06-08

Added

  • deduplicate_by_phash local utility for deduplicating DatasetItem objects or items_and_annotation_generator() rows by DatasetItem.phash without making API calls. The utility supports Hamming-distance thresholds from 0 to 64 and returns the surviving input objects, their DatasetItems, reference IDs, and DeduplicationStats.

0.18.3 - 2026-05-18

Added

  • DatasetItem.phash field exposing the 64-character "0/1" perceptual-hash string when populated by the Nucleus backend. Available on every SDK method that yields a DatasetItem (e.g. items_and_annotation_generator, items_generator, query_items, dataset.items, iloc/refloc/loc).

0.18.2 - 2026-05-08

Added

  • Dataset tags are now exposed through the SDK so customers can identify datasets labeled by Scale vs other vendors. Dataset.info() now returns a tags field, and Dataset exposes get_tags(), add_tags(), and remove_tags() methods.

0.18.1 - 2026-05-05

Changed

  • Dataset.deduplicate() and Dataset.deduplicate_by_ids() now run asynchronously and return a DeduplicationJob instead of returning a DeduplicationResult directly. Call job.result() to wait for completion and retrieve the result.

Removed

  • Sync deduplication support for Dataset.deduplicate() and Dataset.deduplicate_by_ids().

0.18.0 - 2026-04-29

Removed

  • Dropped support for Python 3.7, 3.8, and 3.9. The minimum supported Python version is now 3.10, and the SDK now supports Python 3.10, 3.11, 3.12, 3.13, and 3.14.

Changed

  • DatasetItem.reference_id is now typed Optional[str] (defaulting to None) instead of str with a "DUMMY_VALUE" sentinel. The field is still required at runtime: __post_init__ now asserts reference_id is not None. This matches the existing docstring (already documented as Optional[str]) and removes the magic sentinel.
  • nucleus/async_utils.py now passes aiohttp.ClientTimeout(total=DEFAULT_NETWORK_TIMEOUT_SEC) to session.post/session.get instead of a bare integer (no behavioral change; aligns with the typed aiohttp API).
  • NucleusClient.list_autotags now always returns a list (List[dict]) regardless of the response shape, matching its declared return type.

Fixed

  • All mypy --ignore-missing-imports nucleus errors and notes resolved (zero issues across all source files):
    • nucleus/evaluation_match.py: widen infer_confusion_category parameters to Optional[str].
    • nucleus/annotation.py: default TYPE_KEY lookup to ""; make Segment.index Optional[int]; type Segment.to_payload's payload as Dict[str, Any].
    • nucleus/prediction.py: default TYPE_KEY lookup to "".
    • nucleus/camera_params.py: make camera_model, k1k4, p1, p2 Optional[...] to match from_json.
    • nucleus/metrics/segmentation_utils.py & segmentation_metrics.py: replace np.float_ (removed in NumPy 2.x) with np.float64; use shape[-1] to satisfy NumPy stub typing.
    • nucleus/test_launch_integration.py: use Image.Image (the class) instead of Image (the module) in return annotations.
    • nucleus/dataset.py: default dataset_item_jsons to [] so the comprehension always iterates.
    • nucleus/scene.py: annotate Frame.__init__ and VideoScene.info so their bodies are type-checked.

Tooling / CI

  • Expanded CircleCI installation matrix from [3.10, 3.11] to [3.10, 3.11, 3.12, 3.13, 3.14], so every supported Python version is exercised on every PR (build sdist, install with each extras combination, smoke-test import nucleus).
  • Fixed pytest 9 fixture-mark errors across the test suite (tests/cli/conftest.py, tests/validate/conftest.py, tests/test_scene.py, tests/test_video_scene.py); pytest 9 turns @pytest.mark.* on a fixture into a hard error.
  • Cleaned up several pylint findings across the codebase (E0606, W3101, R1737, R1728, C3001, C3002, W0719).
  • Updated pylint disables (+R0913, -R0201).
  • Re-applied black formatting after the lint pass.
  • Replaced removed NumPy alias np.float with np.float64 in nucleus/metrics/segmentation_utils.py (in addition to the previously fixed np.float_).

0.17.14 - 2026-04-14

Changed

  • api_key and limited_access_key are now mutually exclusive in NucleusClient. Passing both (or setting NUCLEUS_API_KEY while also passing limited_access_key) raises a ValueError.

Fixed

  • Docstring improvements across NucleusClient: fixed copy-paste errors (get_job, get_slice, delete_slice), removed phantom stats_only parameter from list_jobs, corrected make_request parameter name, and restructured create_launch_model/create_launch_model_from_dir docs for proper rendering.
  • Suppressed Sphinx warnings from inherited pydantic BaseModel methods by removing inherited-members from autoapi options.

0.17.13 - 2026-03-06

Fixed

  • Removed the deprecated pkg_resources package and replaced it with importlib-metadata
  • Resolved ~79 errors/warnings in sphinx auto doc build errors

0.17.12 - 2026-02-23

Added

  • Dataset.deduplicate() method to deduplicate images using perceptual hashing. Accepts optional reference_ids to deduplicate specific items, or deduplicates the entire dataset when only threshold is provided. Required threshold parameter (0-64) controls similarity matching (lower = stricter, 0 = exact matches only).
  • Dataset.deduplicate_by_ids() method for deduplication using internal dataset_item_ids directly, avoiding the reference ID to item ID mapping for improved efficiency.
  • DeduplicationResult and DeduplicationStats dataclasses for structured deduplication results.

Example usage:

dataset = client.get_dataset("ds_...")

# Deduplicate entire dataset
result = dataset.deduplicate(threshold=10)

# Deduplicate specific items by reference IDs
result = dataset.deduplicate(threshold=10, reference_ids=["ref_1", "ref_2", "ref_3"])

# Deduplicate by internal item IDs (more efficient if you have them)
result = dataset.deduplicate_by_ids(threshold=10, dataset_item_ids=["item_1", "item_2"])

# Access results
print(f"Threshold: {result.stats.threshold}")
print(f"Original: {result.stats.original_count}, Unique: {result.stats.deduplicated_count}")
print(result.unique_reference_ids)

0.17.11 - 2025-11-03

Added

  • Support passing a limited access key via NucleusClient(limited_access_key=...). When provided, the client sends the x-limited-access-key header on all requests (sync and async).
  • Allow using the SDK without a standard API key when a limited_access_key is supplied. In this mode, Basic Auth is omitted and only the limited access header is used.

Example usage:

client = nucleus.NucleusClient(limited_access_key="<LIMITED_ACCESS_KEY>")
#...

Changed

  • Connection accepts extra_headers and only includes Basic Auth when api_key is provided. This enables header-only auth with limited access keys.
  • Header propagation applies across all request paths, including Validate endpoints and concurrent async helpers.
  • Tests updated to be tolerant of limited-access-only runs.
  • NoAPIKey error messaging updated to account for limited_access_key support.

0.17.10 - 2025-03-19

Added

  • Adding page size variable to items_and_annotation_generator() to reduce timeout errors for customers with large datasets

0.17.9 - 2025-03-11

Added

  • Adding export_class_labels methods to datasets and slices to extract unique class labels of the annotations in the dataset/slice.

0.17.8 - 2025-01-02

Added

  • Adding only_most_recent_tasks parameter for dataset.scene_and_annotation_generator() and dataset.items_and_annotation_generator() to accommodate for multiple sets of ground truth caused by relabeled tasks. Also returns the task_id in the annotation results.

0.17.7 - 2024-11-05

Added

  • Adding slice_id parameter for dataset.scene_and_annotation_generator().

Example usage:

dataset = client.get_dataset("ds_...")
for scene in dataset.scene_and_annotation_generator(slice_id="slc_..."):
  #...

0.17.6 - 2024-07-03

Added

  • Method for downloading all annotations grouped by scene and track_reference_id.

Example usage:

dataset = client.get_dataset("ds_...")
for scene in dataset.scene_and_annotation_generator():
  #...

0.17.5 - 2024-04-15

Added

  • Method for uploading lidar semantic segmentation predictions, via dataset.upload_lidar_semseg_predictions

Example usage:

dataset = client.get_dataset("ds_...")
model = client.get_model("prj_...")
pointcloud_ref_id = 'pc_ref_1'
predictions_s3 = "s3://temp/predictions.json"

dataset.upload_lidar_semseg_predictions(model, pointcloud_ref_id, predictions_s3)

For the expected format of the s3 predictions, refer to the documentation here

0.17.4 - 2024-03-25

Modified

  • In Model.run, added the model_run_name parameter. This allows the creation of multiple model runs for datasets.

[0.17.3] - 2024-02-29

Added

  • Added the environment variable S3_ENDPOINT to accomodate for nonstandard S3 Endpoint URLs when asking for presigned URLs

0.17.2 - 2024-02-28

Modified

  • In Dataset.create_slice, the reference_ids parameter is now optional. If left unspecified, it will create an empty slice

0.17.1 - 2024-02-22

Added

  • Environment variable NUCLEUS_SKIP_SSL_VERIFY to skip SSL verification on requests

0.17.0 - 2024-02-06

Added

  • Added dataset.add_items_from_dir
  • Added pytest-xdist for test parallelization

Fixes

  • Fix test test_models.test_remove_invalid_tag_from_model

0.16.18 - 2024-02-06

Added

  • Add the ability to add and remove trained_slice_id to a model

0.16.17 - 2024-01-29

Fixes

  • Update documentation

0.16.16 - 2024-01-25

Fixes

  • Minor fixes to docstring

0.16.15 - 2024-01-11

Fixes

  • Fix lidar concurrent lidar pointcloud to also return intensity in case it exists in the response.

0.16.14 - 2024-01-03

Fixes

  • Open up Pydantic version requirements as was fixed in 0.16.11

0.16.13 - 2023-12-13

Added

  • Added trained_slice_id parameter to dataset.upload_predictions() to specify the slice ID used to train the model.

Fixes

  • Fix offset generation for image chips in dataset.items_and_annotation_chip_generator()

0.16.12 - 2023-11-29

Added

  • Added tag support for slices.

Example:

>>> slc = client.get_slice('slc_id')
>>> tags = slc.tags
>>> slc.add_tags(['new_tag_1', 'new_tag_2'])

0.16.11 - 2023-11-22

Added

  • Added num_processes parameter to dataset.items_and_annotation_chip_generator() to specify parallel processing.
  • Method to allow for concurrent task fetches for pointcloud data

Example:

>>> task_ids = ['task_1', 'task_2']
>>> resp = client.download_pointcloud_tasks(task_ids=task_ids, frame_num=1)
>>> resp
{
  'task_1': [Point3D(x=5, y=10.7, z=-2.3), ...],
  'task_2': [Point3D(x=1.3 y=11.1, z=1.5), ...],
}

Fixes

  • Support environments using pydantic>=2

0.16.10 - 2023-11-22

Allow creating a dataset by crawling all images in a directory, recursively. Also supports privacy mode datasets.

Example structure:

~/Documents/
    data/
        2022/
            - img01.png
            - img02.png
        2023/
            - img01.png
            - img02.png

Default Example:

data_dir = "~/Documents/data"
client.create_dataset_from_dir(data_dir)
# this will create a dataset named "data" and will contain 4 images, with the ref IDs:
# ["2022/img01.png", "2022/img02.png", "2023/img01.png", "2023/img02.png"]

Example Privacy Mode:

This requires that a proxy (or file server) is setup and can serve files relative to the data_dir

data_dir = "~/Documents/data"
client.create_dataset_from_dir(
    data_dir,
    dataset_name='my-dataset',
    use_privacy_mode=True,
    privacy_mode_proxy="http://localhost:5000/assets/"
)

This would create a dataset my-dataset, and when opened in Nucleus, the images would be requested to the path: <privacy_mode_proxy>/<img ref id>, for example: http://localhost:5000/assets/2022/img01.png

0.16.9 - 2023-11-17

Fixes

  • Minor fixes to video scene upload on privacy mode

0.16.8 - 2023-11-16

Added

Dataset Item width and height

  • Allow passing width and height to DatasetItem
  • This is required when using privacy mode

Dataset Item Fetch

  • Added dataset.items_and_annotation_chip_generator() functionality to generate chips of images in s3 or locally.
  • Added query parameter for dataset.items_and_annotation_generator() to filter dataset items.

Removed

  • upload_to_scale is no longer a property in DatasetItem, users should instead specify use_privacy_mode on the dataset during creation

0.16.7 - 2023-11-03

Added

  • Allow direct embedding vector upload together with dataset items. DatasetItem now has an additional parameter called embedding_info which can be used to directly upload embeddings when a dataset is uploaded.
  • Added dataset.embedding_indexes property, which exposes information about every embedding index which belongs to the dataset.

0.16.6 - 2023-11-01

Added

  • Allow datasets to be created in "privacy mode". For example, client.create_dataset('name', use_privacy_mode=True).
  • Privacy Mode lets customers use Nucleus without sensitive raw data ever leaving their servers.
  • When set to True, you can submit URLs to Nucleus that link to raw data assets like images or point clouds, instead of transferring that data to Scale. Access control is then completely in the hands of users: URLs may optionally be protected behind your corporate VPN or an IP whitelist. When you load a Nucleus web page, your browser will directly fetch the raw data from your servers without it ever being accessible to Scale.

0.16.5 - 2023-10-30

Added

  • Added a description to the slice info.

Changed

  • Made skeleton key optional on KeypointsAnnotation.

0.16.4 - 2023-10-23

Added

  • Added a query_objects method on the Dataset class.
  • Example
>>> ds = client.get_dataset('ds_id')
>>> objects = ds.query_objects('annotations.metadata.distance_to_device > 150', ObjectQueryType.GROUND_TRUTH_ONLY)
[CuboidAnnotation(label="", dimensions={}, ...), ...]
  • Added EvaluationMatch class to represent IOU Matches, False Positives and False Negatives retrieved through the query_objects method

0.16.3 - 2023-10-10

Added

  • Added a query_scenes method on the Dataset class.
  • Example
>>> ds = client.get_dataset('ds_id')
>>> scenes = ds.query_scenes('scene.metadata.foo = "baz"')
[Scene(reference_id="", metadata={}, ...), ...]

0.16.2 - 2023-10-03

Fixed

  • Raise error on all error states for AsyncJob.sleep_until_complete(). Before it only handled the deprecated "Errored"

0.16.1 - 2023-09-18

Added

  • Added asynchronous parameter for slice.export_embeddings() and dataset.export_embeddings() to allow embeddings to be exported asynchronously.

Changed

  • Changed slice.export_embeddings() and dataset.export_embeddings() to be asynchronous by deafult.

0.16.0 - 2023-09-18

Removed

  • Support for Python 3.6 - it is end of life for more than a year

Fixed

  • Development environment for Python 3.11

0.15.11 - 2023-09-15

Added

  • Added slice.export_raw_json() functionality to support raw export of object slices (annotations, predictions, item and scene level data). Currently does not support image slices.

0.15.10 - 2023-07-20

Added

  • Fix slice.export_predictions(args) and slice.export_predictions_generator(args) methods to return Predictions instead of Annotations

0.15.9 - 2023-06-26

Added

  • Support for Scale Launch client v1.0.0 and higher for the Nucleus + Launch integration

0.15.7 - 2023-06-09

Added

  • Allow for downloading pointcloud data for a give task and frame number, example:
import nucleus
import numpy as np
client = nucleus.NucleusClient(API_KEY)
pts = client.download_pointcloud_task(task_id, frame_num=1)
np_pts = np.array([pt.to_list() for pt in pts])

0.15.6 - 2023-06-03

Changed

  • Document new restrictions to slice create/append.
  • Dataset.create_slice and Slice.append methods cannot exceed 10,000 items per request.

0.15.5 - 2023-05-8

Fixed

  • Give default annotation_id to KeypointAnnotations when not specified

0.15.4 - 2023-03-21

Changed

  • Added create_slice_by_ids to create slices from dataset item, scene, and object IDs

0.15.3 - 2023-03-02

Changed

  • Allow denormalized scores in EvaluationResults

0.15.2 - 2023-02-10

Changed

  • Fix client.create_launch_model_from_dir(args) method

0.15.1 - 2023-01-16

Changed

  • Better filter tuning of client.list_jobs(args) method

Added

  • Dataset method to filter jobs, and statistics on running jobs Example:
>>> client = nucleus.NucleusClient(API_KEY)
>>> ds = client.get_dataset(ds_id)
>>> ds.jobs(show_completed=True, stats_only=True)
{'autotagInference': {'Cancelled': 1, 'Completed': 11},
 'modelRunCommit': {'Completed': 7, 'Errored_Server': 1, 'Running': 1},
 'sliceQuery': {'Completed': 40, 'Running': 2}}

Detailed Example

>>> from nucleus.job import CustomerJobTypes
>>> client = nucleus.NucleusClient(API_KEY)
>>> ds = client.get_dataset(ds_id)
>>> from_date = "2022-12-20"; to_date = "2023-01-15"
>>> job_types = [CustomerJobTypes.MODEL_INFERENCE_RUN, CustomerJobTypes.UPLOAD_DATASET_ITEMS]
>>> ds.jobs(
  from_date=from_date,
  to_date=to_date,
  show_completed=True,
  job_types=job_types,
  limit=150
)
# ... returns list of AsyncJob objects

0.15.0 - 2022-12-19

Changed

  • dataset.slices now returns a list of Slice objects instead of a list of IDs

Added

Retrieve a slice from a dataset by its name, or all slices of a particular type from a dataset. Where type is one of ["dataset_item", "object", "scene"].

  • dataset.get_slices(name, slice_type): List[Slice]
from nucleus.slice import SliceType
dataset.get_slices(name="My Slice")
dataset.get_slices(slice_type=SliceType.DATASET_ITEM)

0.14.30 - 2022-11-29

Added

  • Support for uploading track-level metrics to external evaluation functions using track_ref_ids

0.14.29 - 2022-11-22

Added

  • Support for Tracks, enabling ground truth annotations and model predictions to be grouped across dataset items and scenes
  • Helpers to update track metadata, as well as to create and delete tracks at the dataset level

0.14.28 - 2022-11-17

Added

  • Support for appending to slice with scene reference IDs
  • Better error handling when appending to a slice with non-existent reference IDs

0.14.27 - 2022-11-04

Added

  • Support for scene-level external evaluation functions
  • Support for uploading custom scene-level metrics

0.14.26 - 2022-11-01

Added

  • Support for fetching scene from a DatasetItem.reference_id Example:
dataset = client.get_dataset("<dataset_id>")
assert dataset.is_scene  # only works on scene datasets
some_item = dataset.iloc(0)
dataset.get_scene_from_item_ref_id(some_item['item'].reference_id)

0.14.25 - 2022-10-20

Updated

  • Items of a slice can be retrieved by Slice property .item
  • The type of items returned from .items is based on the slice type:
    • slice.type == 'dataset_item' => list of DatasetItem objects
    • slice.type == 'object' => list of Annotation/Prediction objects
    • slice.type == 'scene' => list of Scene objects

0.14.24 - 2022-10-19

Fixed

  • Late imports for seldomly used heavy libraries. Sped up CLI invocation and autocomplation. If you had shell completions installed before we recommend removeing them from your .(bash|zsh)rc file and reinstalling with nu install-completions

0.14.23 - 2022-10-17

Added

  • Support for building slices via Nucleus' Smart Sample

0.14.22 - 2022-10-14

Added

  • Trigger for calculating Validate metrics for a model. This allows underperforming slice discovery and more model analysis

0.14.21 - 2022-09-28

Added

  • Support for context_attachment metadata values. See upload metadata for more information.

0.14.20 - 2022-09-23

Fixed

  • Local uploads are correctly batched and prevents flooding the network with requests

0.14.19 - 2022-08-26

Added

  • Support for Coordinate metadata values. See upload metadata for more information.

0.14.18 - 2022-08-16

Added

  • Metadata and confidence support for scene categories

0.14.17 - 2022-08-15

Fixed

  • Fix AsyncJob status payload keys causing test failures
  • Fix AsyncJob export test
  • Fix page_size for {Dataset,Slice}.items_and_annotatation_generator()
  • Change to simple dependency install step to fix CircleCI caching failures

0.14.16 - 2022-08-12

Added

  • Scene categorization support

0.14.15 - 2022-08-11

Removed

  • Removed s3fs, fsspec dependencies for simpler installation in various environments

0.14.14 - 2022-08-11

Added

  • client.slices to list all of users slices independent of dataset
  • Added optional parameter asynchronous: bool to Dataset.update_item_metadata and Dataset.update_scene_metadata, allowing the update to run as a background job when set to True

Fixed

  • Validate unit test listing and evaluation history listing. Now uses new bulk fetch endpoints for faster listing.

0.14.13 - 2022-08-10

Fixed

  • Fix payload parsing for scene export

0.14.12 - 2022-08-05

Added

  • Added auto-paginated Slice.export_predictions_generator

Fixed

  • Change {Dataset,Slice}.items_and_annotation_generator to work with improved paginate endpoint

0.14.11 - 2022-07-20

Fixed

  • Various docstring and typing updates

0.14.10 - 2022-07-20

Added

  • Dataset.items_and_annotation_generator()

Fixed

  • Slice.items_and_annotation_generator() bug

0.14.9 - 2022-07-14

Fixed

  • NoneType errors in Validate

0.14.8 - 2022-07-14

Fixed

  • Segmentation metrics filtering. Prior version artificially boosted performance when filtering was applied.

0.14.7 - 2022-07-07

Added

  • Support running structured queries and retrieving item results via API

0.14.6 - 2022-07-07

Fixed

  • Dataset.delete_annotations now defaults reference_ids to an empty list and keep_history to true

0.14.5 - 2022-07-05

Fixed

  • Averaging of rich semantic segmentation taxonomies not taking into account missing classes

0.14.4 - 2022-06-21

Fixed

  • Regression that caused Validate filter statements to not work

0.14.3 - 2022-06-21

Fixed

  • CLI installation without GEOS errored out. Now handled by importer.

0.14.2 - 2022-06-21

Fixed

  • Better error reporting when everything is filtered out by a filter statement in a Validate evaluation function

0.14.1 - 2022-06-20

Fixed

  • Adapt Segmentation metrics to better support instance segmentation
  • Change Segmentation/Polygon metrics to use new segmentation metrics

0.14.0 - 2022-06-16

Added

  • Allow creation/deletion of model tags on new and existing models, eg:
# on model creation
model = client.create_model(name="foo_model", reference_id="foo-model-ref", tags=["some tag"])

# on existing models
existing_model = client.models[0]
existing_model.add_tags(['tag a', 'tag b'])

# remove tag
existing_model.remove_tags(['tag a'])

0.13.5 - 2022-06-15

Fixed

  • Guard against invalid skeleton indexes in KeypointsAnnotation

0.13.4 - 2022-06-09

Fixed

  • Guard against extras imports

0.13.3 - 2022-06-09

Fixed

  • Make installation of scale-launch optional (again!).

0.13.2 - 2022-06-08

Fixed

  • Open up requirements for easier installation in more environments. Add more optional installs under metrics

0.13.1 - 2022-06-08

Fixed

  • Make installation of scale-launch optional

0.13.0 - 2022-06-08

Added

  • Segmentation functions to Validate API

0.12.4 - 2022-06-02

Fixed

  • Poetry dependency list

0.12.3 - 2022-06-02

Added

  • New methods to export associated Scale task info at either the item or scene level.
  • Dataset.export_scale_task_info
  • Slice.export_scale_task_info

0.12.2 - 2022-06-02

Added

  • Allow users to upload external evaluation results calculated on the client side.

0.12.1 - 2022-06-02

Added

  • Suppress warning statement when un-implemented standard configs found

0.12.0 - 2022-05-27

Added

  • Allow users to create external evaluation functions for Scenario Tests in Validate.

0.11.2 - 2022-05-20

Changed

  • Restored backward compatibility of video constructor by adding back deprecated attachment_type argument

0.11.1 - 2022-05-19

Added

  • Exporting model predictions from a slice

0.11.0 - 2022-05-13

Added

  • Segmentation prediction masks can now be evaluated against polygon annotation with new Validate functions
  • New function SegmentationToPolyIOU, configurable through client.validate.eval_functions.segmentation_to_poly_iou
  • New function SegmentationToPolyRecall, configurable through client.validate.eval_functions.segmentation_to_poly_recall
  • New function SegmentationToPolyPrecision, configurable through client.validate.eval_functions.segmentation_to_poly_precision
  • New function SegmentationToPolyMAP, configurable through client.validate.eval_functions.segmentation_to_poly_map
  • New function SegmentationToPolyAveragePrecision, configurable through client.validate.eval_functions.segmentation_to_poly_ap

0.10.8 - 2022-05-10

Fixed

  • Add checks for duplicate (reference_id, annotation_id) when uploading Annotations or Predictions

0.10.7 - 2022-05-09

Fixed

  • Add checks for duplicate reference IDs

0.10.6 - 2022-05-06

Added

  • Video privacy mode

Changed

  • Removed attachment_type argument in video upload API

0.10.5 - 2022-05-04

Fixed

  • Invalid polygons are dropped from PolygonMetric iou matching

0.10.4) - 2022-05-02

Added

  • Additional check added for KeypointsAnnotation names validation
  • MP4 video upload

0.10.3 - 2022-04-22

Fixed

  • Polygon and bounding box matching uses Shapely again providing faster evaluations
  • Evaluation function passing fixed for Polygon and Boundingbox configurations

0.10.1 - 2022-04-21

Added

  • Added check for payload size

0.10.0) - 2022-04-21

Added

  • KeypointsAnnotation added
  • KeypointsPrediction added

0.9.0 - 2022-04-07

Added

  • Validate metrics support metadata and field filtering on input annotation and predictions
  • 3D/Cuboid metrics: Recall, Precision, 3D IOU and birds eye 2D IOU```
  • Shapely can be used for metric development if the optional scale-nucleus[shapely] is installed
  • Full support for passing parameters to evaluation configurations

0.8.4 - 2022-04-06

  • Changing camera_params of dataset items can now be done through the dataset method update_items_metadata

0.8.3 - 2022-03-29

Added

  • new Validate functionality to intialize scenario tests without a threshold, and to set test thresholds based on a baseline model.

0.8.2 - 2022-03-18

Added

  • a fix to the CameraModels enumeration to fix export of camera calibrations for 3D scenes

0.8.1 - 2022-03-18

Added

  • slice.items_generator() and dataset.items_generator() to allow for export of dataset items at any scale.

0.8.0 - 2022-03-16

Added

  • mask_url can now be a local file for segmentation annotations or predictions, meaning local upload is now supported for segmentations
  • Camera params for sensor fusion ingest now support additional camera params to accommodate fisheye camera, etc.
  • More detailed parameters to control for upload in case of timeouts (see dataset.upload_predictions, dataset.append, and dataset.upload_predictions)

Fixed

  • Artificially low concurrency for local uploads (all local uploads should be faster now)
  • Client no longer uses the deprecated (and now removed) segmentation-specific server endpoints
  • Fixed a bug where retries for local uploads were not working properly: should improve local upload robustness

Removed

  • client.predict, client.annotate, which have been marked as deprecated for several months.

0.7.0 - 2022-03-09

Added

  • LineAnnotation added
  • LinePrediction added

0.6.7 - 2021-03-08

Added

  • get_autotag_refinement_metrics
  • Get model using model_run_id
  • Video API change to require image_location instead of video_frame_location in DatasetItems

0.6.6 - 2021-02-18

Added

  • Video upload support

0.6.5 - 2021-02-16

Fixed

  • Dataset.update_autotag docstring formatting
  • BoxPrediction dataclass parameter typing
  • validate.scenario_test_evaluation typo

0.6.4 - 2021-02-16

Fixes

  • Categorization metrics are patched to run properly on Validate evaluation service

0.6.3 - 2021-02-15

Added

  • Add categorization f1 score to metrics

0.6.1 - 2021-02-08

Added

  • Adapt scipy and click dependencies to allow Google COLAB usage without update

0.6.0 - 2021-02-07

Added

  • Nucleus CLI interface nu. Installation instructions are in the README.md.

0.5.4 - 2022-01-28

Added

  • Add NucleusClient.get_job to retrieve AsyncJobs by job ID

0.5.3 - 2022-01-25

Added

  • Add average precision to polygon metrics
  • Add mean average precision to polygon metrics

0.5.2 - 2022-01-20

Added

  • Add Dataset.delete_scene

Fixed

  • Removed Shapely dependency

0.5.1 - 2022-01-11

Fixed

  • Updated dependencies for full Python 3.6 compatibility

0.5.0 - 2022-01-10

Added

  • nucleus.metrics module for computing metrics between Nucleus Annotation and Prediction objects.

0.4.5 - 2022-01-07

Added

  • Dataset.scenes property that fetches the Scale-generated ID, reference ID, type, and metadata of all scenes in the Dataset.

0.4.4 - 2022-01-04

Added

  • Slice.export_raw_items() method that fetches accessible (signed) URLs for all items in the Slice.

0.4.3 - 2022-01-03

Added

  • Improved error messages for categorization

Changed

  • Category taxonomies are now updatable

0.4.2 - 2021-12-16

Added

  • Slice.name property that fetches the Slice's user-defined name.
    • The Slice's items are no longer fetched unnecessarily; this used to cause considerable latency.
  • Slice.items property that fetches all items contained in the Slice.

Changed

  • Slice.info() now only retrieves the Slice's name, slice_id, and dataset_id.
    • The Slice's items are no longer fetched unnecessarily; this used to cause considerable latency.
    • This method issues a warning to use Slice.items when attempting to items.

### Deprecated

  • NucleusClient.slice_info(..) is deprecated in favor of Slice.info().

0.4.1 - 2021-12-13

Changed

  • Datasets in Nucleus now fall under two categories: scene or item.
    • Scene Datasets can only have scenes uploaded to them.
    • Item Datasets can only have items uploaded to them.
  • NucleusClient.create_dataset now requires a boolean parameter is_scene to immutably set whether the Dataset is a scene or item Dataset.

0.4.0 - 2021-08-12

Added

  • NucleusClient.modelci client extension that houses all features related to Model CI, a continuous integration and testing framework for evaluation machine learning models.
  • NucleusClient.modelci.UnitTest- class to represent a Model CI unit test.
  • NucleusClient.modelci.UnitTestEvaluation- class to represent an evaluation result of a Model CI unit test.
  • NucleusClient.modelci.UnitTestItemEvaluation- class to represent an evaluation result of an individual dataset item within a Model CI unit test.
  • NucleusClient.modelci.eval_functions- Collection class housing a library of standard evaluation functions used in computer vision.

0.3.0 - 2021-11-23

Added

  • NucleusClient.datasets property that lists Datasets in a human friendlier manner than NucleusClient.list_datasets()
  • NucleusClient.models property, this is preferred over the deprecated list_models
  • NucleusClient.jobs property. NucleusClient.list_jobs is still the preferred method to use if you filter jobs on access.
  • Deprecated method access now produces a deprecation warning in the logs.

Deprecated

  • Model runs have been deprecated and will be removed in the near future. Use a Model directly instead. The following functions have all been deprecated as a part of that.
    • NucleusClient.get_model_run(..)
    • NucleusClient.delete_model_run(..)
    • NucleusClient.create_model_run(..)
    • NucleusClient.commit_model_run(..)
    • NucleusClient.model_run_info(..)
    • NucleusClient.predictions_ref_id(..)
    • NucleusClient.predictions_iloc(..)
    • NucleusClient.predictions_loc(..)
    • Dataset.create_model_run(..)
    • Dataset.model_runs(..)
  • NucleusClient.list_datasets is deprecated in favor of NucleusClient.datasets. The latter allows for direct usage of Dataset objects.
  • NucleusClient.list_models is deprecated in favor of NucleusClient.models.
  • NucleusClient.get_dataset_items is deprecated in favor of Dataset.items to make the object model more consistent.
  • NucleusClient.delete_dataset_item is deprecated in favor of Dataset.delete_item to make the object model more consistent.
  • NucleusClient.populate_dataset is deprecated in favor of Dataset.append to make the object model more consistent.
  • NucleusClient.ingest_tasks is deprecated in favor of Dataset.ingest_tasks to make the object model more consistent.
  • NucleusClient.add_model is deprecated in favor of NucleusClient.create_model for consistent terminology.
  • NucleusClient.dataset_info is deprecated in favor of Dataset.info to make the object model more consistent.
  • NucleusClient.delete_annotations is deprecated in favor of Dataset.delete_annotations to make the object model more consistent.
  • NucleusClient.predict is deprecated in favor of Dataset.upload_predictions to make the object model more consistent.
  • NucleusClient.dataitem_ref_id is deprecated in favor of Dataset.refloc to make the object model more consistent.
  • NucleusClient.dataitem_iloc is deprecated in favor of Dataset.iloc to make the object model more consistent.
  • NucleusClient.dataitem_loc is deprecated in favor of Dataset.loc to make the object model more consistent.
  • NucleusClient.create_slice is deprecated in favor of Dataset.create_slice to make the object model more consistent.
  • NucleusClient.create_custom_index is deprecated in favor of Dataset.create_custom_index to make the object model more consistent.
  • NucleusClient.delete_custom_index is deprecated in favor of Dataset.delete_custom_index to make the object model more consistent.
  • NucleusClient.set_continuous_indexing is deprecated in favor of Dataset.set_continuous_indexing to make the object model more consistent.
  • NucleusClient.create_image_index is deprecated in favor of Dataset.create_image_index to make the object model more consistent.
  • NucleusClient.create_object_index is deprecated in favor of Dataset.create_object_index to make the object model more consistent.
  • Dataset.append_scenes is deprecated in favor of Dataset.append for a simpler interface.

Refer to GitHub release notes for older releases.