Upgrading wandb 0.27 to 0.28
Breaking0.27.2 → 0.28.2Breaking2Security4Deprecated1New10Changed23Fixed31
SecurityHardens argument handling in `wandb launch` for the local-process resource so job-supplied values are always shell-quoted.#12220 ↗
BreakingUpgrade verdict
2 breaking changes and 4 security fixes.
In plain terms
- Downloading artifact files no longer works on old, unsupported W&B Server versions; upgrade the server to 0.70.0 or newer.
- Fetching artifacts by path no longer works on old, unsupported W&B Server versions; upgrade the server to 0.70.0 or newer.
- Makes launching jobs safer by properly quoting values that come from the job.
- Makes fetching job code from git safer by limiting which remote URLs and protocols are allowed.
Must act Top 5 of 7 that need code or config changes
Adds opentelemetry-api >=1.43.0.
Drops gitpython.
Installs 17 packages in all (was 19).
What you must change
Breaking2
Removes legacy fallback implementations for downloading artifact files on older EOL W&B Server releases.
Artifact.files()Artifact.download()Artifact.get_entry()Artifact.get_path()Removes legacy fallback implementations for fetching an artifact by name on older EOL W&B Server releases.
wandb.Api().artifact()Security4
Hardens argument handling in
wandb launch for the local-process resource so job-supplied values are always shell-quoted.wandb launchThe launch agent restricts a job's git source URL to https/ssh remotes and pins git's protocol allowlist when fetching it and updating submodules.
Debug logs no longer contain CoreWeave cluster credentials.
wandb docker and wandb docker-run no longer pass your API key on the command line, where other users of the same machine could read it.wandb dockerwandb docker-runDeprecations to plan for
Deprecated1
wandb sync --sync-tensorboard is deprecated and will be removed in a later release.wandb sync --sync-tensorboardAPI changes
Generated by DepDelta from published Python source. Not mixed with prose notes.
- changed:
function agent(sweep_id: str, function: Callable | None=…, entity: str | None=…, project: str | None=…, count: int | None=…, forward_signals: bool=…) -> None → function agent(sweep_id: str, function: Callable | None=…, entity: str | None=…, project: str | None=…, count: int | None=…, forward_signals: bool=…, term_timeout: int | None=…) -> None - changed:
function save(glob_str: str | os.PathLike, base_path: str | os.PathLike | None=…, policy: PolicyName=…) -> bool | list[str] → function save(glob_str: str | os.PathLike, base_path: str | os.PathLike | None=…, policy: PolicyName=…, glob: bool=…) -> bool | list[str] - added:
export EvalTable
- added:
field Agent.HEARTBEAT_SLEEP_SECONDS
- added:
export TelemetryContext - added:
export TelemetryRecorder
- added:
export TelemetryContext - added:
export TelemetryRecorder
- added:
class LowCardinalityAttributes - added:
class TelemetryContext - added:
class TelemetryRecorder - added:
constructor TelemetryContext(low_cardinality_attributes: LowCardinalityAttributes | None=…, high_cardinality_attributes: dict[str, str] | None=…) -> None - added:
constructor TelemetryRecorder(service_api: ServiceApi | None=…, context: TelemetryContext | None=…) -> None - added:
field LowCardinalityAttributes.exception_type: str | None - added:
field LowCardinalityAttributes.python_runtime: str | None - added:
field LowCardinalityAttributes.python_version: str | None - added:
field LowCardinalityAttributes.wandb_version: str | None - added:
function guard(method: Callable[Concatenate[TelemetryRecorder, _P], None]) -> Callable[Concatenate[TelemetryRecorder, _P], None] - added:
method LowCardinalityAttributes.as_dict() -> dict[str, str] - added:
method LowCardinalityAttributes.merge(other: LowCardinalityAttributes) -> LowCardinalityAttributes - added:
method TelemetryContext.with_attributes(low_cardinality_attributes: LowCardinalityAttributes, high_cardinality_attributes: dict[str, str]) -> TelemetryContext - added:
method TelemetryRecorder.exception(exc: Exception, message: str | None=…) -> None - added:
method TelemetryRecorder.increment_counter(name: str, low_cardinality_attributes: LowCardinalityAttributes) -> None - added:
method TelemetryRecorder.increment_counter_and_log_event(name: str, attributes: dict[str, str] | None=…) -> None - added:
method TelemetryRecorder.log(message: str, attributes: dict[str, str] | None=…, severity: SeverityNumber=…) -> None - added:
method TelemetryRecorder.reraise(exc: Exception) -> Never - added:
method TelemetryRecorder.with_context(low_cardinality_attributes: LowCardinalityAttributes | None=…, high_cardinality_attributes: dict[str, str] | None=…) -> TelemetryRecorder
- removed:
method Api.create_default_resource_config(*args, **kwargs) - removed:
method Api.create_run_queue(*args, **kwargs) - removed:
method Api.validate_api_key() -> bool
- added:
export Integrations - added:
export Organization
- changed:
method Api.artifact_collections(project_name: str, type_name: str, per_page: int=…, start: str | None=…) -> ArtifactCollections → method Api.artifact_collections(project_name: str, type_name: str, order: str | None=…, per_page: int=…, start: str | None=…) -> ArtifactCollections - changed:
method Api.artifacts(type_name: str, name: str, per_page: int=…, tags: list[str] | None=…, start: str | None=…) -> Artifacts → method Api.artifacts(type_name: str, name: str, order: str | None=…, per_page: int=…, tags: list[str] | None=…, start: str | None=…) -> Artifacts - changed:
method Api.registries(organization: str | None=…, filter: dict[str, Any] | None=…, per_page: int=…, start: str | None=…) -> Registries → method Api.registries(organization: str | None=…, filter: dict[str, Any] | None=…, order: str | None=…, per_page: int=…, start: str | None=…) -> Registries - added:
method Api.organization(name: str | None=…) -> Organization
- changed:
constructor ArtifactCollections(service_api: ServiceApi, entity: str, project: str, type_name: str, filters: Mapping[str, Any] | None=…, order: str | None=…, per_page: int=…, start: str | None=…) → constructor ArtifactCollections(service_api: ServiceApi, entity: str, project: str, type_name: str, filters: Mapping[str, Any] | None=…, order: str | None=…, per_page: PositiveInt=…, start: str | None=…) - changed:
constructor ArtifactTypes(service_api: ServiceApi, entity: str, project: str, per_page: int=…, start: str | None=…) → constructor ArtifactTypes(service_api: ServiceApi, entity: str, project: str, per_page: PositiveInt=…, start: str | None=…) - changed:
constructor ProjectArtifactCollections(service_api: ServiceApi, entity: str, project: str, filters: Mapping[str, Any] | None=…, order: str | None=…, per_page: int=…, start: str | None=…) → constructor ProjectArtifactCollections(service_api: ServiceApi, entity: str, project: str, filters: Mapping[str, Any] | None=…, order: str | None=…, per_page: PositiveInt=…, start: str | None=…) - changed:
field ArtifactFiles.QUERY: str → field ArtifactFiles.QUERY: ClassVar[str | None] - changed:
field Artifacts.QUERY: str → field Artifacts.QUERY: ClassVar[str | None] - changed:
field ProjectArtifactCollections.QUERY: str | None → field ProjectArtifactCollections.QUERY: ClassVar[str | None] - added:
property ArtifactCollection.project_id -> str - added:
property ArtifactCollection.project_internal_id -> str | None
- removed:
field Automations.last_response: Connection[ProjectTriggersFields] | None - removed:
method Automations.convert_objects() -> Iterator[Automation] - changed:
class Automations(RelayPaginator['ProjectTriggersFields', 'Automation']) → class Automations(_LegacyAutomationsPaginator) - added:
class LegacyAutomations(_LegacyAutomationsPaginator) - added:
class LegacyEntityAutomations(_LegacyAutomationsPaginator) - added:
constructor LegacyAutomations(service_api: ServiceApi, *, name: str | None=…, per_page: int=…, start: str | None=…, omit_fragments: Iterable[str] | None=…) - added:
constructor LegacyEntityAutomations(service_api: ServiceApi, entity: str, *, name: str | None=…, per_page: int=…, start: str | None=…, omit_fragments: Iterable[str] | None=…)
- removed:
static method HistoryScan.cleanup(service_api: ServiceApi, request_id: int) -> None
- removed:
constructor Integrations(service_api: ServiceApi, variables: dict[str, Any], per_page: int=…, start: str | None=…) - removed:
field Integrations.QUERY: ClassVar[str | None] - removed:
field Integrations.last_response: Connection[IntegrationFields] | None - changed:
class Integrations(RelayPaginator['IntegrationFields', 'Integration']) → class Integrations(_IntegrationsPaginator['Integration']) - changed:
class SlackIntegrations(Integrations) → class SlackIntegrations(_IntegrationsPaginator['SlackIntegration']) - changed:
class WebhookIntegrations(Integrations) → class WebhookIntegrations(_IntegrationsPaginator['WebhookIntegration'])
- added:
class Organization - added:
field Organization.id: GQLId - added:
field Organization.name: str - added:
field Organization.org_entity: _OrgEntity - added:
field Organization.service_api: InitVar[ServiceApi]
- changed:
constructor Project(service_api: ServiceApi, entity: str, project: str, attrs: Mapping[str, Any]) -> Project → constructor Project(service_api: ServiceApi, entity: str, project: str, attrs: Mapping[str, Any]) -> None - changed:
constructor Projects(service_api: ServiceApi, entity: str, per_page: int=…) -> Projects → constructor Projects(service_api: ServiceApi, entity: str, per_page: int=…) -> None - changed:
method Project.sweeps(per_page: int=…) -> Sweeps → method Project.sweeps(per_page: int=…, filters: dict[str, Any] | None=…, order: str | None=…) -> Sweeps
- changed:
constructor Collections(service_api: ServiceApi, organization: str, registry_filter: dict[str, Any] | None=…, collection_filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) → constructor Collections(service_api: ServiceApi, organization: str, registry_filter: _RegistryFilter | None=…, collection_filter: _CollectionFilter | None=…, order: _CollectionOrder | None=…, per_page: PositiveInt=…, start: str | None=…) - changed:
constructor Registries(service_api: ServiceApi, organization: str, filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) → constructor Registries(service_api: ServiceApi, organization: str, filter: _RegistryFilter | None=…, order: _RegistryOrder | None=…, per_page: PositiveInt=…, start: str | None=…) - changed:
constructor Versions(service_api: ServiceApi, organization: str, registry_filter: dict[str, Any] | None=…, collection_filter: dict[str, Any] | None=…, artifact_filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) → 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=…) - changed:
field Versions.QUERY: str → field Versions.QUERY: ClassVar[str | None] - changed:
method Collections.versions(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> Versions → method Collections.versions(filter: _VersionFilter | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator - changed:
method Registries.collections(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> Collections → method Registries.collections(filter: _CollectionFilter | None=…, order: _CollectionOrder | None=…, per_page: PositiveInt=…, start: str | None=…) -> CollectionsIterator - changed:
method Registries.versions(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> Versions → method Registries.versions(filter: _VersionFilter | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator - added:
class CollectionsIterator(Protocol) - added:
class VersionsIterator(Protocol) - added:
method CollectionsIterator.versions(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> VersionsIterator
- removed:
property Registry.updated_at -> str - changed:
method Registry.collections(filter: dict[str, Any] | None=…, per_page: PositiveInt=…, start: str | None=…) -> Collections → method Registry.collections(filter: dict[str, Any] | None=…, order: str | None=…, per_page: PositiveInt=…, start: str | None=…) -> Collections - added:
property Registry.internal_id -> str | None - added:
property Registry.updated_at -> str | None
- changed:
method Run.update_state(state: Literal['pending']) -> bool → method Run.update_state(state: str) -> bool - changed:
static method Run.create(api: public.Api, run_id: str | None=…, project: str | None=…, entity: str | None=…, state: Literal['running', 'pending']=…) -> Self → static method Run.create(api: public.Api, run_id: str | None=…, project: str | None=…, entity: str | None=…, state: Literal['running', 'pending']=…) -> Run - added:
class RunNotFoundError(ValueError) - added:
method Run.stop() -> None - added:
property Run.sweep -> public.Sweep | None
- changed:
method ServiceApi.execute_graphql(query: str, variables: Mapping[str, Any] | None=…, timeout: float | None=…, *, omit_variables: Iterable[str] | None=…, omit_fragments: Iterable[str] | None=…, omit_fields: Iterable[str] | None=…, rename_fields: Mapping[str, str] | None=…) -> Any → method ServiceApi.execute_graphql(query: str, variables: Mapping[str, Any] | None=…, timeout: float | None=…, *, parse: Callable[[str], _T]=…, omit_variables: Iterable[str] | None=…, omit_fragments: Iterable[str] | None=…, omit_fields: Iterable[str] | None=…, rename_fields: Mapping[str, str] | None=…) -> _T - added:
method ServiceApi.access_token(timeout: float | None=…) -> str | None - added:
method ServiceApi.api_publish(request: ApiRequest) -> None - added:
method ServiceApi.authenticate(timeout: float | None=…) -> AuthenticateResponse - added:
method ServiceApi.finalize(obj: object, cleanup: ApiRequest) -> Callable[[], None] - added:
property ServiceApi.base_url -> str - added:
property ServiceApi.initialized -> bool
- changed:
constructor Sweeps(service_api: ServiceApi, entity: str, project: str, per_page: int=…) -> Sweeps → constructor Sweeps(service_api: ServiceApi, entity: str, project: str, per_page: int=…, filters: dict[str, Any] | None=…) -> None - added:
method Sweep.enqueue_run(config: dict, display_name: str | None=…) -> str
- added:
export EntityScope - added:
export OrgScope - added:
export TeamScope
- added:
class OrgScope(_BaseScope, EntityScopeFields) - added:
class TeamScope(_BaseScope, EntityScopeFields) - added:
field OrgScope.entity_type: Literal['organization'] - added:
field OrgScope.scope_type: Literal[ScopeType.ENTITY] - added:
field ScopeType.ENTITY - added:
field TeamScope.entity_type: Literal['team'] - added:
field TeamScope.scope_type: Literal[ScopeType.ENTITY] - added:
variable EntityScope
- removed:
class DefaultCommandGroup(click.Group) - removed:
constructor DefaultCommandGroup(*args: Any, default_cmd: str=…, **kwargs: Any) -> None - removed:
function config() -> None - removed:
function leet(ctx: click.Context) -> None - removed:
function run(path: str | None=…, pprof: str=…) -> None - removed:
function symon(pprof: str=…, interval: str=…) -> None - removed:
method DefaultCommandGroup.format_usage(ctx: click.Context, formatter: click.HelpFormatter) -> None - removed:
method DefaultCommandGroup.parse_args(ctx: click.Context, args: list[str]) -> list[str] - changed:
function beta() -> None → function beta(ctx: click.Context) -> None - changed:
function sync(paths: tuple[str, ...], live: bool, entity: str, project: str, run_id: str, job_type: str, replace_tags: str, skip_synced: bool, dry_run: bool, verbose: bool, n: int) -> None → function sync(paths: tuple[str, ...], live: bool, entity: str, project: str, run_id: str, job_type: str, replace_tags: str, skip_synced: bool, skip_online: bool, dry_run: bool, skip_confirmation: bool, verbose: bool, n: int) -> None
- removed:
class LaunchConfig - removed:
field LaunchConfig.run_file: str | None - removed:
field LaunchConfig.wandb_dir: str - removed:
function launch(path: str | None, pprof: str) -> Never - removed:
function launch_config() -> Never - removed:
function launch_symon(pprof: str=…, interval: str=…) -> Never
- changed:
function sync(paths: list[pathlib.Path], *, live: bool, entity: str, project: str, run_id: str, job_type: str, replace_tags: str, dry_run: bool, skip_synced: bool, verbose: bool, parallelism: int) -> None → function sync(paths: list[pathlib.Path], *, live: bool, entity: str, project: str, run_id: str, job_type: str, replace_tags: str, dry_run: bool, skip_confirmation: bool, skip_synced: bool, skip_online: bool, verbose: bool, parallelism: int) -> None
- added:
function clean(ctx: click.Context, min_hours: int, include_unsynced: bool, force: bool) -> None
- removed:
function cli_unsupported(argument) - changed:
function agent(ctx, project, entity, count, forward_signals, sweep_id) → function agent(ctx, project, entity, count, forward_signals, term_timeout, sweep_id) - changed:
function sync(ctx, path=…, view=…, verbose=…, run_id=…, project=…, entity=…, job_type=…, sync_tensorboard=…, include_globs=…, exclude_globs=…, include_online=…, include_offline=…, include_synced=…, mark_synced=…, sync_all=…, ignore=…, show=…, clean=…, clean_old_hours=…, clean_force=…, append=…, skip_console=…, replace_tags=…) → function sync(ctx: click.Context, path: tuple[str, ...], view: bool, verbose: bool, skip_confirmation: bool, run_id: str | None, project: str | None, entity: str | None, job_type: str | None, sync_tensorboard: bool | None, include_globs: str | None, exclude_globs: str | None, include_online: bool | None, include_offline: bool | None, include_synced: bool | None, mark_synced: bool, sync_all: bool,…
- added:
class DefaultCommandGroup(click.Group) - added:
class LaunchConfig - added:
class LocalLaunchConfig(LaunchConfig) - added:
class RemoteLaunchConfig(LaunchConfig) - added:
constructor DefaultCommandGroup(*args: Any, default_cmd: str=…, **kwargs: Any) -> None - added:
field LocalLaunchConfig.run_file: str | None - added:
field LocalLaunchConfig.wandb_dir: str - added:
field RemoteLaunchConfig.api_key: str - added:
field RemoteLaunchConfig.remote_url: str - added:
function config() -> None - added:
function launch(path: str | None, pprof: str) -> Never - added:
function launch_config() -> Never - added:
function launch_symon(pprof: str=…, interval: str=…) -> Never - added:
function leet() -> None - added:
function run(path: str | None=…, pprof: str=…) -> None - added:
function symon(pprof: str=…, interval: str=…) -> None - added:
method DefaultCommandGroup.format_usage(ctx: click.Context, formatter: click.HelpFormatter) -> None - added:
method DefaultCommandGroup.parse_args(ctx: click.Context, args: list[str]) -> list[str]
- added:
export EvalTable
- removed:
variable LOG_STRING_NOCOLOR
- changed:
function get_ground_truth_bbox_annotations(img_idx: int, image_path: str, batch: dict, class_name_map: dict=…) -> list[dict[str, Any]] → function get_ground_truth_bbox_annotations(img_idx: int, image_path: str, batch: dict, class_name_map: dict | None=…) -> list[dict[str, Any]]
- removed:
export setup - added:
export build_project_path - added:
export ensure_version - added:
export init_weave - added:
export init_weave_if_imported
- added:
function handle_nested_wandb_values(val: Any, column: str | int, unsupported_media_mode: UnsupportedMediaMode, *, nested: bool=…, inside_sequence: bool=…) -> Any - added:
function unwrap_value(val: Any, column: str | int, unsupported_media_mode: UnsupportedMediaMode) -> Any - added:
function validate_supported_value(val: Any, column: str | int, unsupported_media_mode: UnsupportedMediaMode) -> None - added:
function validate_unsupported_media_mode(mode: str) -> None - added:
variable UnsupportedMediaMode
- removed:
function setup(entity: str | None, project: str | None) -> None - added:
function build_project_path(entity: str | None, project: str | None) -> str | None - added:
function ensure_version(min_version: str, error_msg: str | None=…) -> None - added:
function init_weave(entity: str | None, project: str | None) -> None - added:
function init_weave_if_imported(entity: str | None, project: str | None) -> None
- changed:
function pr_curve(y_true: Iterable[T] | None=…, y_probas: Iterable[numbers.Number] | None=…, labels: list[str] | None=…, classes_to_plot: list[T] | None=…, interp_size: int=…, title: str=…, split_table: bool=…) -> CustomChart → function pr_curve(y_true: Iterable[T] | None=…, y_probas: Iterable[numbers.Number] | None=…, labels: list[str] | None=…, classes_to_plot: list[T] | None=…, interp_size: int=…, title: str=…, split_table: bool=…) -> CustomChart | None
- changed:
function roc_curve(y_true: Sequence[numbers.Number], y_probas: Sequence[Sequence[float]] | None=…, labels: list[str] | None=…, classes_to_plot: list[numbers.Number] | None=…, title: str=…, split_table: bool=…) -> CustomChart → function roc_curve(y_true: Sequence[numbers.Number], y_probas: Sequence[Sequence[float]] | None=…, labels: list[str] | None=…, classes_to_plot: list[numbers.Number] | None=…, title: str=…, split_table: bool=…) -> CustomChart | None
- removed:
variable DESCRIPTOR
- removed:
variable DESCRIPTOR
- removed:
variable DESCRIPTOR
- removed:
variable DESCRIPTOR
- removed:
variable DESCRIPTOR
- removed:
variable DESCRIPTOR
- added:
variable DESCRIPTOR
- added:
variable DESCRIPTOR
- added:
variable DESCRIPTOR
- added:
variable protobuf_version
- added:
class EvalTable(Table) - added:
constructor EvalTable(columns: list[ColumnKey] | None=…, data: list[InputRow] | np.ndarray | pd.DataFrame | None=…, rows: list[InputRow] | None=…, dataframe: pd.DataFrame | None=…, dtype: Any=…, optional: bool | list[bool]=…, allow_mixed_types: bool=…, log_mode: LogMode=…, *, input_columns: list[str] | None=…, output_columns: list[str] | None=…, score_columns: list[str] | None=…, unsupported_medi… - added:
method EvalTable.add_column(name: str, data: list[Any] | np.ndarray, optional: bool=…) -> None - added:
method EvalTable.add_data(*data: Any) -> None - added:
method EvalTable.bind_to_run(run: LocalRun, key: int | str, step: int | str, id_: int | str | None=…, ignore_copy_err: bool | None=…) -> None - added:
method EvalTable.has_been_logged() -> bool - added:
method EvalTable.to_json(run_or_artifact: Any) -> dict[str, Any] - added:
variable EVAL_TABLE_MARKER - added:
variable EVAL_TABLE_ROW_INDEX_KEY
- changed:
constructor Table(columns=…, data=…, rows=…, dataframe=…, dtype=…, optional=…, allow_mixed_types=…, log_mode: Literal['IMMUTABLE', 'MUTABLE', 'INCREMENTAL'] | None=…) → constructor Table(columns: list[ColumnKey] | None=…, data: list[InputRow] | np.ndarray | pd.DataFrame | None=…, rows: list[InputRow] | None=…, dataframe: pd.DataFrame | None=…, dtype: Any=…, optional: bool | list[bool]=…, allow_mixed_types: bool=…, log_mode: LogMode | None=…) -> None - changed:
method Table.add_column(name, data, optional=…) → method Table.add_column(name: str, data: list[Any] | np.ndarray, optional: bool=…) -> None - changed:
method Table.add_computed_columns(fn) → method Table.add_computed_columns(fn: Callable[[int, dict[ColumnKey, Any]], dict[str, Any]]) -> None - changed:
method Table.add_data(*data) → method Table.add_data(*data: Any) -> None - changed:
method Table.add_row(*row) → method Table.add_row(*row: Any) -> None - changed:
method Table.cast(col_name, dtype, optional=…) → method Table.cast(col_name: ColumnKey, dtype: Any, optional: bool=…) -> _dtypes.Type - changed:
method Table.get_column(name, convert_to=…) → method Table.get_column(name: ColumnKey, convert_to: None=…) -> list[Any] | (name: ColumnKey, convert_to: Literal['numpy']) -> np.ndarray - changed:
method Table.get_dataframe() → method Table.get_dataframe() -> pd.DataFrame - changed:
method Table.index_ref(index) → method Table.index_ref(index: int) -> _TableIndex - changed:
method Table.iterrows() → method Table.iterrows() -> Iterator[tuple[_TableIndex, list[Any]]] - changed:
method Table.set_fk(col_name, table, table_col) → method Table.set_fk(col_name: ColumnKey, table: Table, table_col: str) -> None - changed:
method Table.set_pk(col_name) → method Table.set_pk(col_name: ColumnKey) -> None - changed:
method Table.to_json(run_or_artifact) → method Table.to_json(run_or_artifact: Any) -> dict[str, Any] - changed:
static method Table.from_json(json_obj, source_artifact: artifact.Artifact) → static method Table.from_json(json_obj: dict[str, Any], source_artifact: artifact.Artifact) -> Table - added:
method Table.has_been_logged() -> bool - added:
variable ColumnKey - added:
variable InputRow - added:
variable LogMode
- changed:
function val_to_json(run: LocalRun | None, key: str, val: ValToJsonType, namespace: str | int | None=…, ignore_copy_err: bool | None=…) -> Sequence | dict → function val_to_json(run: LocalRun | None, key: str, val: ValToJsonType, namespace: str | int | None=…, ignore_copy_err: bool | None=…) -> Any
- removed:
class ValidationDataLogger - removed:
constructor ValidationDataLogger(inputs: Sequence | dict[str, Sequence], targets: Sequence | dict[str, Sequence] | None=…, indexes: list[_TableIndex] | None=…, validation_row_processor: Callable | None=…, prediction_row_processor: Callable | None=…, input_col_name: str=…, target_col_name: str=…, table_name: str=…, artifact_type: str=…, class_labels: list[str] | None=…, infer_missing_processors: b… - removed:
field ValidationDataLogger.class_labels_table: wandb.Table | None - removed:
field ValidationDataLogger.infer_missing_processors: bool - removed:
field ValidationDataLogger.prediction_row_processor: Callable | None - removed:
field ValidationDataLogger.validation_indexes: list[_TableIndex] - removed:
field ValidationDataLogger.validation_inputs: Sequence | dict[str, Sequence] - removed:
field ValidationDataLogger.validation_targets: Sequence | dict[str, Sequence] | None - removed:
method ValidationDataLogger.log_predictions(predictions: Sequence | dict[str, Sequence], prediction_col_name: str=…, val_ndx_col_name: str=…, table_name: str=…, commit: bool=…) -> wandb.data_types.Table - removed:
method ValidationDataLogger.make_predictions(predict_fn: Callable) -> Sequence | dict[str, Sequence] - removed:
variable CAN_INFER_IMAGE_AND_VIDEO
- removed:
variable NOTIFY_PROCESS - removed:
variable NOTIFY_REQUEST - removed:
variable NOTIFY_SHUTDOWN
- removed:
class Context - removed:
class ContextKeeper - removed:
constructor Context() -> None - removed:
constructor ContextKeeper() -> None - removed:
function context_id_from_record(record: Record) -> str - removed:
function context_id_from_result(result: Result) -> str - removed:
method Context.cancel() -> None - removed:
method ContextKeeper.add(context_id: str) -> Context - removed:
method ContextKeeper.add_from_record(record: Record) -> Context | None - removed:
method ContextKeeper.cancel(context_id: str) -> bool - removed:
method ContextKeeper.get(context_id: str) -> Context | None - removed:
method ContextKeeper.release(context_id: str) -> None - removed:
property Context.cancel_event -> threading.Event - removed:
variable logger
- changed:
constructor HandleManager(settings: SettingsStatic, record_q: Queue[Record], result_q: Queue[Result], stopped: Event, writer_q: Queue[Record], interface: InterfaceQueue, context_keeper: context.ContextKeeper) -> None → constructor HandleManager(settings: SettingsStatic, record_q: Queue[Record], result_q: Queue[Result], stopped: Event, writer_q: Queue[Record], interface: InterfaceQueue) -> None
- removed:
method Api.clear_local_context() -> None - removed:
method Api.create_default_resource_config(entity: str, resource: str, config: str, template_variables: dict[str, float | int | str] | None) -> dict[str, Any] | None - removed:
method Api.create_run_queue(entity: str, project: str, queue_name: str, access: str, prioritization_mode: str | None=…, config_id: str | None=…) -> dict[str, Any] | None - removed:
method Api.pull(project: str, run: str | None=…, entity: str | None=…) -> list[requests.Response] - removed:
method Api.set_local_context(api_context: context.Context | None) -> None - removed:
method Api.validate_api_key() -> bool - removed:
property Api.access_token -> str | None - removed:
property Api.context -> context.Context - changed:
constructor Api(default_settings: wandb.Settings | settings_static.SettingsStatic | DefaultSettings | None=…, load_settings: bool=…, retry_timedelta: datetime.timedelta | None=…, environ: MutableMapping[str, str]=…, retry_callback: Callable[[int, str], Any] | None=…, api_key: str | None=…) -> None → constructor Api(default_settings: wandb.Settings | settings_static.SettingsStatic | DefaultSettings | None=…, load_settings: bool=…, retry_timedelta: datetime.timedelta | None=…, environ: MutableMapping[str, str]=…, retry_callback: Callable[[int, str], Any] | None=…, api_key: str | None=…, telemetry_recorder: TelemetryRecorder | None=…) -> None - changed:
method Api.download_file(url: str) -> tuple[int, requests.Response] → method Api.download_file(url: str, path: str) -> None - changed:
method Api.download_write_file(metadata: dict[str, str], out_dir: str | None=…) -> tuple[str, requests.Response | None] → method Api.download_write_file(metadata: dict[str, str], out_dir: str | None=…) -> tuple[str, bool]
- removed:
class UniformSampleAccumulator - removed:
constructor UniformSampleAccumulator(min_samples=…) - removed:
method UniformSampleAccumulator.add(val) - removed:
method UniformSampleAccumulator.get()
- changed:
constructor SendManager(settings: SettingsStatic, record_q: Queue[Record], result_q: Queue[Result], interface: InterfaceQueue, context_keeper: context.ContextKeeper) -> None → constructor SendManager(settings: SettingsStatic, record_q: Queue[Record], result_q: Queue[Result], interface: InterfaceQueue) -> None
- changed:
constructor LaunchAgent(api: Api, config: dict[str, Any]) → constructor LaunchAgent(api: Api, config: dict[str, Any], telemetry_recorder: TelemetryRecorder) -> None
- removed:
variable PREFIX_SSH - removed:
variable SUFFIX_GIT
- added:
function inject_restricted_security_context(manifest: Any) -> None - added:
function validate_kubernetes_resource_args(resource_args: dict[str, Any]) -> None - added:
function validate_launch_resource_args(resource_args: dict[str, Any]) -> None - added:
function validate_local_container_resource_args(docker_args: dict[str, Any]) -> None - added:
function yield_kubernetes_pod_specs(manifest: Any) -> Iterator[dict[str, Any]] - added:
variable K8S_RESTRICTED_SECURITY_CONTEXT: dict[str, Any]
- added:
class ForkedError(Exception)
- removed:
function access_token(base_url: str, token_file: Path, credentials_file: Path) -> str - removed:
variable DEFAULT_WANDB_CREDENTIALS_FILE
- removed:
variable JOBSPEC_FNAME
- removed:
class FsmEntry(Generic[T_FsmInputs, T_FsmContext]) - removed:
class FsmStateCheck(Protocol[T_FsmInputs]) - removed:
class FsmStateEnter(Protocol[T_FsmInputs]) - removed:
class FsmStateEnterWithContext(Protocol[T_FsmInputs, T_FsmContext_contra]) - removed:
class FsmStateExit(Protocol[T_FsmInputs, T_FsmContext_cov]) - removed:
class FsmStateOutput(Protocol[T_FsmInputs]) - removed:
class FsmStateStay(Protocol[T_FsmInputs]) - removed:
class FsmWithContext(Generic[T_FsmInputs, T_FsmContext]) - removed:
constructor FsmWithContext(states: Sequence[FsmState], table: FsmTableWithContext[T_FsmInputs, T_FsmContext]) -> None - removed:
field FsmEntry.action: Callable[[T_FsmInputs], None] | None - removed:
field FsmEntry.condition: Callable[[T_FsmInputs], bool] - removed:
field FsmEntry.target_state: type[FsmState[T_FsmInputs, T_FsmContext]] - removed:
method FsmStateCheck.on_check(inputs: T_FsmInputs) -> None - removed:
method FsmStateEnter.on_enter(inputs: T_FsmInputs) -> None - removed:
method FsmStateEnterWithContext.on_enter(inputs: T_FsmInputs, context: T_FsmContext_contra) -> None - removed:
method FsmStateExit.on_exit(inputs: T_FsmInputs) -> T_FsmContext_cov - removed:
method FsmStateOutput.on_state(inputs: T_FsmInputs) -> None - removed:
method FsmStateStay.on_stay(inputs: T_FsmInputs) -> None - removed:
method FsmWithContext.input(inputs: T_FsmInputs) -> None - removed:
variable Fsm: TypeAlias - removed:
variable FsmState: TypeAlias - removed:
variable FsmTable: TypeAlias - removed:
variable FsmTableWithContext: TypeAlias - removed:
variable T_FsmContext - removed:
variable T_FsmContext_contra - removed:
variable T_FsmContext_cov - removed:
variable T_FsmInputs
- removed:
property GitRepo.branch -> Any - removed:
property GitRepo.dirty -> Any - removed:
property GitRepo.last_commit -> Any - removed:
property GitRepo.remote -> Any - removed:
property GitRepo.remote_url -> Any - removed:
property GitRepo.repo -> Repo | None - removed:
property GitRepo.root -> Any - removed:
property GitRepo.root_dir -> Any - changed:
constructor GitRepo(root: str | None=…, remote: str=…, lazy: bool=…, remote_url: str | None=…, commit: str | None=…) -> None → constructor GitRepo(root: str | None=…, remote: str | None=…, lazy: bool=…, remote_url: str | None=…, commit: str | None=…, _git_executable: str | None=…) -> None - changed:
method GitRepo.get_upstream_fork_point() -> Any → method GitRepo.get_upstream_fork_point() -> str | None - changed:
method GitRepo.push(name: str) -> Any → method GitRepo.push(name: str) -> str | None - changed:
method GitRepo.tag(name: str, message: str | None) -> Any → method GitRepo.tag(name: str, message: str | None) -> str | None - added:
class GitCommandError(Exception) - added:
class GitVersion - added:
field GitVersion.major: int - added:
field GitVersion.minor: int - added:
field GitVersion.patch: int - added:
function remote_url_without_password(url: str) -> str - added:
function run_git(*args: str, cwd: str | None=…, executable: str | None=…) -> str - added:
method GitRepo.checkout(ref: str) -> None - added:
method GitRepo.checkout_new_branch(branch_name: str, start_point: str) -> None - added:
method GitRepo.commit_for_ref(ref: str) -> str - added:
method GitRepo.config_value(name: str) -> str | None - added:
method GitRepo.create_tag(tag_name: str, message: str | None) -> None - added:
method GitRepo.current_branch() -> str - added:
method GitRepo.current_tracking_branch() -> str - added:
method GitRepo.fetch_all() -> None - added:
method GitRepo.git_version() -> GitVersion | None - added:
method GitRepo.has_branch(branch_name: str) -> bool - added:
method GitRepo.has_commit(commit: str) -> bool - added:
method GitRepo.has_tracked_changes() -> bool - added:
method GitRepo.is_ancestor(older: str, newer: str) -> bool - added:
method GitRepo.is_detached_head() -> bool - added:
method GitRepo.merge_base(*refs: str) -> str - added:
method GitRepo.remote_exists(remote_name: str) -> bool - added:
method GitRepo.remote_url_for(remote_name: str) -> str - added:
method GitRepo.repo_root_for(cwd: str) -> str - added:
method GitRepo.run_git(*args: str, cwd: str | None=…) -> str - added:
method GitRepo.tracking_branches() -> list[str] - added:
method GitRepo.untracked_files(pathspec: str) -> list[str] - added:
property GitRepo.branch -> str | None - added:
property GitRepo.dirty -> bool - added:
property GitRepo.last_commit -> str | None - added:
property GitRepo.remote -> str | None - added:
property GitRepo.remote_url -> str | None - added:
property GitRepo.root_dir -> str | None - added:
variable GIT_EXECUTABLE_ENV
- added:
class Identity - added:
class SessionIdentity - added:
constructor SessionIdentity(settings: Settings) -> None - added:
field Identity.default_entity: str - added:
field Identity.email: str - added:
field Identity.flags: dict[str, Any] - added:
field Identity.teams: tuple[str, ...] - added:
field Identity.username: str - added:
property SessionIdentity.identity -> Identity | None
- removed:
variable CSI
- removed:
class FilteredBackoff(Backoff) - removed:
constructor FilteredBackoff(filter: Callable[[Exception], bool], wrapped: Backoff) -> None - removed:
method FilteredBackoff.next_sleep_or_reraise(exc: Exception) -> datetime.timedelta
- removed:
class Server - removed:
constructor Server(settings: Settings) -> None - removed:
method Server.query_with_timeout(timeout: int | float=…) -> None - removed:
property Server.viewer -> dict[str, Any]
- removed:
method ServiceConnection.api_cleanup_request(api_id: str) -> None - added:
method ServiceConnection.finalize(obj: object, cleanup: spb.ServerRequest) -> Callable[[], None]
- added:
class ServiceFinalizer - added:
constructor ServiceFinalizer(asyncer: asyncio_manager.AsyncioManager, client: ServiceClient) -> None - added:
method ServiceFinalizer.close() -> None - added:
method ServiceFinalizer.finalize(obj: object, cleanup: spb.ServerRequest) -> Callable[[], None]
- removed:
method Auth.as_requests_auth() -> requests.auth.AuthBase - removed:
method AuthApiKey.as_requests_auth() -> requests.auth.AuthBase - removed:
method AuthIdentityTokenFile.as_requests_auth() -> requests.auth.AuthBase - removed:
method AuthIdentityTokenFile.fetch_access_token() -> str - added:
method Auth.verify() -> None - added:
method AuthApiKey.verify() -> None - added:
method AuthIdentityTokenFile.verify() -> None
- changed:
function authenticate_session(*, host: str | HostUrl, source: str, no_offline: bool=…, no_create: bool=…, input_timeout: float | None=…, referrer: str=…, relogin: bool=…) -> Auth | None → function authenticate_session(*, host: str | HostUrl, source: str, no_offline: bool=…, no_create: bool=…, input_timeout: float | None=…, referrer: str=…, relogin: bool=…, verify: bool=…) -> Auth | None
- changed:
function prompt_and_save_api_key(*, host: str | HostUrl, no_offline: bool=…, no_create: bool=…, referrer: str=…, input_timeout: float | None=…) -> str | None → function prompt_and_save_api_key(*, host: str | HostUrl, no_offline: bool=…, no_create: bool=…, referrer: str=…, input_timeout: float | None=…, verify: bool=…) -> str | None
- added:
function set_auth_settings_for_api_key(settings: Settings, api_key: str, base_url: str) -> None - added:
function set_auth_settings_for_identity_token_file(settings: Settings, identity_token_file: str, credentials_file: str, base_url: str) -> None
- added:
function check_api_key_validity(*, host: HostUrl, api_key: str) -> str | None - added:
function check_identity_token_validity(*, host: HostUrl, identity_token_file: pathlib.Path, credentials_file: pathlib.Path) -> str | None - added:
function check_service_api_auth_validity(service_api: ServiceApi) -> str | None
- removed:
class RequiresMixin - removed:
constructor RequiresMixin() -> None - removed:
field RequiresMixin.requirement - removed:
function requires(requirement: str) -> FuncT - removed:
variable FuncT - removed:
variable requirement_env_var_mapping: dict[str, str]
- removed:
variable EXIT_TIMEOUT - changed:
method Run.save(glob_str: str | os.PathLike, base_path: str | os.PathLike | None=…, policy: PolicyName=…) -> bool | list[str] → method Run.save(glob_str: str | os.PathLike, base_path: str | os.PathLike | None=…, policy: PolicyName=…, glob: bool=…) -> bool | list[str] - added:
property Run.sync_dir -> str
- added:
field Settings.x_file_stream_no_gzip: bool - added:
method Settings.infer_git_root() -> None
- added:
export TFEVENT_SUBSTRING
- removed:
function batched(n: int, iterable: Iterable[T]) -> Generator[list[T], None, None] - removed:
function check_retry_conflict(e: Any) -> bool | None - removed:
function check_retry_conflict_or_gone(e: Any) -> bool | None - removed:
function coalesce(*arg: Any) -> Any - removed:
function download_file_from_url(dest_path: str, source_url: str, api_key: str | None=…) -> None - removed:
function download_file_into_memory(source_url: str, api_key: str | None=…) -> bytes - removed:
function ensure_text(string: str | bytes, encoding: str=…, errors: str=…) -> str - removed:
function generate_id(length: int=…) -> str - removed:
function launch_browser(attempt_launch_browser: bool=…) -> bool - removed:
function make_check_retry_fn(fallback_retry_fn: CheckRetryFnType, check_fn: Callable[[Exception], bool | None], check_timedelta: timedelta | None=…) -> CheckRetryFnType - removed:
function merge_dicts(source: dict[str, Any], destination: dict[str, Any]) -> dict[str, Any] - removed:
function no_retry_4xx(e: Exception) -> bool - removed:
function no_retry_auth(e: Any) -> bool - removed:
function recursive_cast_dictlike_to_dict(d: dict[str, Any]) -> dict[str, Any] - removed:
function remove_keys_with_none_values(d: dict[str, Any] | Any) -> dict[str, Any] | Any - removed:
function stopwatch_now() -> float - removed:
variable IS_GIT - changed:
function class_colors(class_count: int) -> list[list[int]] → function class_colors(class_count: int) -> list[list[int] | tuple[float, float, float]] - changed:
function json_friendly(obj: Any) -> tuple[Any, bool] | tuple[None | str | float, bool] → function json_friendly(obj: Any, *, preserve_numpy_nan: bool=…) -> tuple[Any, bool] | tuple[None | str | float, bool]
- removed:
class AgentApi - removed:
constructor AgentApi(queue) - removed:
method AgentApi.command(command) - changed:
constructor Agent(api, queue, sweep_id=…, function=…, in_jupyter=…, count=…, forward_signals=…) → constructor Agent(api, queue, sweep_id=…, function=…, in_jupyter=…, count=…, forward_signals=…, term_timeout: int | None=…) - changed:
function agent(sweep_id: str, function: Callable | None=…, entity: str | None=…, project: str | None=…, count: int | None=…, forward_signals: bool=…) -> None → function agent(sweep_id: str, function: Callable | None=…, entity: str | None=…, project: str | None=…, count: int | None=…, forward_signals: bool=…, term_timeout: int | None=…) -> None - changed:
function run_agent(sweep_id, function=…, in_jupyter=…, entity=…, project=…, count=…, forward_signals=…) → function run_agent(sweep_id, function=…, in_jupyter=…, entity=…, project=…, count=…, forward_signals=…, term_timeout: int | None=…) - changed:
method AgentProcess.wait() → method AgentProcess.wait(timeout: float | None=…) - added:
class ShutdownSignal(BaseException) - added:
class TerminationTier(enum.IntEnum) - added:
constructor ShutdownSignal(signum: int) -> None - added:
field TerminationTier.KILL_CHILDREN - added:
field TerminationTier.NORMAL_EXECUTION - added:
field TerminationTier.TERMINATE_AND_WAIT_FOR_CHILDREN - added:
field TerminationTier.WAIT_FOR_CHILDREN - added:
method TerminationTier.succ() - added:
property ShutdownSignal.label -> str