Skip to content

Upgrading wandb 0.28 to 0.29

Breaking0.28.2 → 0.29.0Breaking15Security1New9Changed7Fixed5

BreakingUpgrade verdict

11 breaking changes and a security fix.

  • A leftover configuration option that did nothing is gone.
  • Code that read `.length` on paginated results must call `len()` on them instead.
  • The old "best" summary option and goal argument are gone; pick min or max instead.
  • Passing quiet to finish() no longer works; set it in settings instead.
Top 4 of 12 that need code or config changes

Adds xxhash >=3.0.0.

Installs 18 packages in all (was 17).

Breaking11
Removes the deprecated start_method setting that already had no effect.
start_method
Removes the .length property on paginated objects; use len(...) instead.
Api.runs()Api.sweeps()run.files().length
Removes the deprecated summary="best" option and goal argument of run.define_metric(); use summary="min" or summary="max".
run.define_metric()summarygoal
Removes the deprecated quiet argument of run.finish() and wandb.finish(); use wandb.Settings(quiet=...).
run.finish()wandb.finish()wandb.Settings
Removes deprecated run.project_name(), run.get_url(), run.get_project_url() and run.get_sweep_url() methods in favor of properties.
run.project_name()run.get_url()run.get_project_url()run.get_sweep_url()run.projectrun.urlrun.project_urlrun.sweep_url
wandb.Image no longer normalizes pixel values; callers must ensure data is within [0, 255].
wandb.Image
Removes wandb.tensorboard.log() and wandb.tensorflow.log().
wandb.tensorboard.log()wandb.tensorflow.log()
Removes the deprecated .length property from SizedPaginator; use len() instead.
wandb.apis.paginator.SizedPaginator.length
Removes the deprecated normalize argument from wandb.Image; pixel values must already be in [0, 255].
wandb.Imagenormalize
wandb.Video() now requires the format argument when initializing from a numpy array or raw bytes.
wandb.Video()format
wandb.Video() now requires the format argument when initializing from a numpy array or an io object.
wandb.Video()
Security1
Rejects file or artifact names containing relative paths when downloading via artifact.files() and artifact.checkout().
artifact.files()artifact.checkout()

Generated by DepDelta from published Python source. Not mixed with prose notes.

  • changed: function define_metric(name: str, step_metric: str | wandb_metric.Metric | None=…, step_sync: bool | None=…, hidden: bool | None=…, summary: str | None=…, goal: str | None=…, overwrite: bool | None=…) -> wandb_metric.Metric → function define_metric(name: str, step_metric: str | wandb_metric.Metric | None=…, step_sync: bool | None=…, hidden: bool | None=…, summary: str | None=…, overwrite: bool | None=…) -> wandb_metric.Metric
  • changed: function finish(exit_code: int | None=…, quiet: bool | None=…) -> None → function finish(exit_code: int | None=…) -> None
  • removed: property SizedPaginator.length -> int | None
  • added: export ConsoleLogLine
  • added: export ConsoleLogs
  • changed: method Api.run(path=…) → method Api.run(path: str=…) -> public.Run
  • removed: class Automations(_LegacyAutomationsPaginator)
  • removed: constructor Automations(service_api: ServiceApi, variables: Mapping[str, Any], per_page: int=…, *, start: str | None=…, _query: str, omit_variables: Iterable[str] | None=…, omit_fragments: Iterable[str] | None=…, omit_fields: Iterable[str] | None=…, rename_fields: Mapping[str, str] | None=…)
  • removed: field Automations.QUERY: str
  • changed: constructor LegacyAutomations(service_api: ServiceApi, *, name: str | None=…, per_page: int=…, start: str | None=…, omit_fragments: Iterable[str] | None=…) → constructor LegacyAutomations(service_api: ServiceApi, *, name: str | None=…, per_page: int=…, start: str | None=…)
  • changed: constructor LegacyEntityAutomations(service_api: ServiceApi, entity: str, *, name: str | None=…, per_page: int=…, start: str | None=…, omit_fragments: Iterable[str] | None=…) → constructor LegacyEntityAutomations(service_api: ServiceApi, entity: str, *, name: str | None=…, per_page: int=…, start: str | None=…)
  • added: class EntityAutomations(RelayPaginator['TriggerFields', 'Automation'])
  • added: constructor EntityAutomations(service_api: ServiceApi, entity: str, *, filter: dict[str, Any] | None=…, per_page: int=…, start: str | None=…)
  • added: field EntityAutomations.QUERY: ClassVar[str | None]
  • added: field EntityAutomations.last_response: Connection[TriggerFields] | None
  • added: variable Automations: TypeAlias
  • added: class ConsoleLogLine
  • added: class ConsoleLogs(Paginator[ConsoleLogLine])
  • added: constructor ConsoleLogs(service_api: ServiceApi, run: Run, per_page: int=…, last: int | None=…)
  • added: field ConsoleLogLine.content: str
  • added: field ConsoleLogLine.label: str
  • added: field ConsoleLogLine.level: str
  • added: field ConsoleLogLine.number: int
  • added: field ConsoleLogLine.timestamp: datetime | None
  • added: field ConsoleLogs.last_response: apb.ReadRunConsoleLogsResponse | None
  • added: method ConsoleLogs.convert_objects() -> list[ConsoleLogLine]
  • added: method ConsoleLogs.update_variables() -> None
  • added: property ConsoleLogs.cursor -> str | None
  • added: property ConsoleLogs.more -> bool
  • changed: constructor Versions(service_api: ServiceApi, organization: str, registry_filter: _RegistryFilter | None=…, collection_filter: _CollectionFilter | None=…, artifact_filter: _VersionFilter | None=…, per_page: PositiveInt=…, start: str | None=…) → constructor Versions(service_api: ServiceApi, organization: str, registry_filter: FilterDict | None=…, collection_filter: FilterDict | None=…, artifact_filter: FilterDict | None=…, order: _VersionOrder | None=…, per_page: PositiveInt=…, start: str | None=…)
  • changed: method Collections.versions(filter: _VersionFilter | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator → method Collections.versions(filter: FilterDict | None=…, order: _VersionOrder | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator
  • changed: method CollectionsIterator.versions(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator → method CollectionsIterator.versions(filter: dict[str, Any] | None=…, order: _VersionOrder | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator
  • changed: method Registries.versions(filter: _VersionFilter | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator → method Registries.versions(filter: FilterDict | None=…, order: _VersionOrder | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator
  • changed: method Registry.versions(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> Versions → method Registry.versions(filter: dict[str, Any] | None=…, order: _VersionOrder | None=…, per_page: PositiveInt=…, start: str | None=…) -> Versions
  • added: method Run.console_logs(*, per_page: int=…, last: int | None=…) -> public.ConsoleLogs
  • added: method ServiceApi.org_feature_flags(org: str, *features: str, timeout: float=…) -> dict[str, bool]
  • added: export RegistryScope
  • added: field EventType.LINK_MODEL
  • added: field EventType.RUN_METRIC
  • added: class RegistryScope(_BaseScope, ProjectScopeFields)
  • added: field ProjectScope.is_registry: Literal[False]
  • added: field RegistryScope.is_registry: Literal[True]
  • added: field RegistryScope.name: Annotated[str, Field(validation_alias=full_name)]
  • added: field RegistryScope.scope_type: Literal[ScopeType.PROJECT]
  • changed: function list_sandboxes(status: str | None, include_stopped: bool, tags: tuple[str, ...], output_format: str) -> None → function list_sandboxes(status: str | None, show_terminated: bool, tags: tuple[str, ...], output_format: str) -> None
  • added: function inspect(path: str | None=…) -> None
  • added: function launch_inspect(path: str | None) -> Never
  • removed: variable START_METHOD
  • added: function wrap_ansi(text: str, *, width: int, max_lines: int) -> Generator[str]
  • changed: method DynamicBlock.set_text(text: str, prefix: bool=…) -> None → method DynamicBlock.set_text(text: str) -> None
  • removed: export log
  • removed: function log(tf_summary_str_or_pb: Any, step: int=…, namespace: str=…) -> None
  • removed: export log
  • changed: constructor Artifact(name: str, type: str, description: str | None=…, metadata: dict[str, Any] | None=…, incremental: bool=…, use_as: str | None=…, storage_region: str | None=…) -> None → constructor Artifact(name: str, type: str, description: str | None=…, metadata: dict[str, Any] | None=…, incremental: bool=…, use_as: str | None=…, storage_region: str | None=…, digest_algorithm: Literal['MD5', 'XXH128']=…) -> None
  • changed: method Artifact.new_file(name: str, mode: str=…, encoding: str | None=…) -> Generator[IO] → method Artifact.new_file(name: str, mode: str=…, encoding: str | None=…, policy: Literal['mutable', 'immutable']=…) -> Generator[IO]
  • added: property Artifact.digest_algorithm -> ArtifactDigestAlgorithm
  • added: property Artifact.linked_at -> str | None
  • removed: method ArtifactFileCache.check_md5_obj_path(b64_md5: B64MD5, size: int) -> tuple[FilePathStr, bool, Opener]
  • added: method ArtifactFileCache.check_digest_obj_path(digest: B64Digest, size: int, algorithm: ArtifactDigestAlgorithm=…) -> tuple[FilePathStr, bool, Opener]
  • changed: method ArtifactManifest.digest() -> HexMD5 → method ArtifactManifest.digest() -> HexDigest
  • changed: static method ArtifactManifest.from_manifest_json(manifest_json: dict[str, Any]) -> ArtifactManifest → static method ArtifactManifest.from_manifest_json(manifest_json: dict[str, Any], digest_algorithm: ArtifactDigestAlgorithm=…) -> ArtifactManifest
  • added: field ArtifactManifest.digest_algorithm: Annotated[ArtifactDigestAlgorithm, Field(exclude=True, repr=False)]
  • added: method ArtifactManifest.hash_contents_with_md5() -> None
  • changed: field ArtifactManifestEntry.digest: Union[B64MD5, ETag, URIStr, FilePathStr] → field ArtifactManifestEntry.digest: Union[B64Digest, ETag, URIStr, FilePathStr]
  • added: method ArtifactManifestEntry.digest_algorithm() -> ArtifactDigestAlgorithm
  • added: variable DIGEST_ALGORITHM_EXTRA_KEY: Final[str]
  • added: variable DIGEST_ALGORITHM_TO_STR: Final[Dict[ArtifactDigestAlgorithm, str]]
  • changed: method ArtifactManifestV1.digest() -> HexMD5 → method ArtifactManifestV1.digest() -> HexDigest
  • changed: static method ArtifactManifestV1.from_manifest_json(manifest_json: dict[str, Any]) -> ArtifactManifestV1 → static method ArtifactManifestV1.from_manifest_json(manifest_json: dict[str, Any], digest_algorithm: ArtifactDigestAlgorithm=…) -> ArtifactManifestV1
  • added: field ArtifactManifestV1.digest_algorithm: Annotated[ArtifactDigestAlgorithm, Field(exclude=True, repr=False)]
  • added: method ArtifactManifestV1.hash_contents_with_md5() -> None
  • changed: constructor Image(data_or_path: ImageDataOrPathType, mode: str | None=…, caption: str | None=…, grouping: int | None=…, classes: Classes | Sequence[dict] | None=…, boxes: dict[str, BoundingBoxes2D] | dict[str, dict] | None=…, masks: dict[str, ImageMask] | dict[str, dict] | None=…, file_type: str | None=…, normalize: bool=…) -> None → constructor Image(data_or_path: ImageDataOrPathType, mode: str | None=…, caption: str | None=…, grouping: int | None=…, classes: Classes | Sequence[dict] | None=…, boxes: dict[str, BoundingBoxes2D] | dict[str, dict] | None=…, masks: dict[str, ImageMask] | dict[str, dict] | None=…, file_type: str | None=…) -> None
  • changed: static method Api.file_current(fname: str, md5: B64MD5) -> bool → static method Api.file_current(fname: str, md5: B64Digest) -> bool
  • removed: variable B64MD5: TypeAlias
  • removed: variable HexMD5: TypeAlias
  • changed: function b64_to_hex_id(string: B64MD5) -> HexMD5 → function b64_to_hex_id(string: B64Digest) -> HexDigest
  • changed: function hex_to_b64_id(encoded_string: str | bytes) -> B64MD5 → function hex_to_b64_id(encoded_string: str | bytes) -> B64Digest
  • changed: function md5_file_b64(*paths: StrPath) -> B64MD5 → function md5_file_b64(*paths: StrPath) -> B64Digest
  • changed: function md5_file_hex(*paths: StrPath) -> HexMD5 → function md5_file_hex(*paths: StrPath) -> HexDigest
  • changed: function md5_string(string: str) -> B64MD5 → function md5_string(string: str) -> B64Digest
  • added: class Hasher(Protocol)
  • added: function xxh128_file_b64(*paths: StrPath) -> B64Digest
  • added: function xxh128_file_hex(*paths: StrPath) -> HexDigest
  • added: function xxh128_string(string: str) -> B64Digest
  • added: method Hasher.digest() -> bytes
  • added: method Hasher.hexdigest() -> str
  • added: method Hasher.update(data: bytes | bytearray | mmap.mmap, /) -> None
  • added: variable B64Digest: TypeAlias
  • added: variable HexDigest: TypeAlias
  • added: function validate_fspath(root: StrPath, relpath: StrPath) -> FilePathStr
  • added: function validate_relpath(path: StrPath) -> LogicalPath
  • removed: property Metric.goal -> str | None
  • changed: constructor Metric(name: str, step_metric: str | None=…, step_sync: bool | None=…, hidden: bool | None=…, summary: Sequence[str] | None=…, goal: str | None=…, overwrite: bool | None=…) -> None → constructor Metric(name: str, step_metric: str | None=…, step_sync: bool | None=…, hidden: bool | None=…, summary: Sequence[str] | None=…, overwrite: bool | None=…) -> None
  • removed: method Run.get_project_url() -> str | None
  • removed: method Run.get_sweep_url() -> str | None
  • removed: method Run.get_url() -> str | None
  • removed: method Run.project_name() -> str
  • changed: function finish(exit_code: int | None=…, quiet: bool | None=…) -> None → function finish(exit_code: int | None=…) -> None
  • changed: method Run.define_metric(name: str, step_metric: str | wandb_metric.Metric | None=…, step_sync: bool | None=…, hidden: bool | None=…, summary: str | None=…, goal: str | None=…, overwrite: bool | None=…) -> wandb_metric.Metric → method Run.define_metric(name: str, step_metric: str | wandb_metric.Metric | None=…, step_sync: bool | None=…, hidden: bool | None=…, summary: str | None=…, overwrite: bool | None=…) -> wandb_metric.Metric
  • changed: method Run.finish(exit_code: int | None=…, quiet: bool | None=…) -> None → method Run.finish(exit_code: int | None=…) -> None
  • removed: field Settings.start_method: str | None
  • removed: static method Settings.validate_start_method(value)