Skip to content

Upgrading wandb 0.30 to 0.31

Breaking0.30.0 → 0.31.0Breaking1Security1Platform1New18Changed11Fixed30

BreakingUpgrade verdict

1 breaking change and a platform requirement change and a security fix.

  • A hidden debugging helper is gone; use Python's normal breakpoint() function.
  • You can now run wandb on Python 3.15.
  • The launch-agent container image now uses a patched base image, resolving known vulnerabilities in the previous image.
3 items need code or config changes

Adds cwevals ==0.0.1b1.

Installs 32 packages in all (was 25).

Breaking1
Removes the undocumented wandb.set_trace(); use Python's built-in breakpoint() instead.
wandb.set_trace()breakpoint()
Security1
The wandb/launch-agent Docker image is built on an updated base image that fixes the CVEs reported against the 0.30.0 image.
wandb/launch-agent
Platform1
Adds support for Python 3.15.

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=…, term_timeout: int | None=…) -> 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=…, max_consecutive_failed_runs: int | None=…) -> None
  • changed: constructor Agent(sweep_id=…, project=…, entity=…, function=…, count=…) → constructor Agent(sweep_id=…, project=…, entity=…, function=…, count=…, max_consecutive_failed_runs=…)
  • changed: function pyagent(sweep_id, function, entity=…, project=…, count=…) → function pyagent(sweep_id, function, entity=…, project=…, count=…, max_consecutive_failed_runs=…)
  • added: export LowCardinalityAttributes
  • added: export LowCardinalityAttributes
  • added: field LowCardinalityAttributes.segment: str | None
  • added: field LowCardinalityAttributes.stream: str | None
  • added: field LowCardinalityAttributes.value_encoding: str | None
  • added: method OpenTelemetryProxy.add_to_counter(name: str, delta: int, attributes: dict[str, str] | None=…) -> None
  • added: method OpenTelemetryProxy.define_histogram(name: str, unit: str, description: str, boundaries: Sequence[float]) -> None
  • added: method OpenTelemetryProxy.record_histogram(name: str, value: float, attributes: dict[str, str] | None=…) -> None
  • added: method TelemetryRecorder.add_to_counter(name: str, delta: int, low_cardinality_attributes: LowCardinalityAttributes) -> None
  • added: method TelemetryRecorder.add_to_counter_and_log_event(name: str, delta: int, attributes: dict[str, str] | None=…) -> None
  • added: method TelemetryRecorder.define_histogram(name: str, unit: str, description: str, boundaries: Sequence[float]) -> None
  • added: method TelemetryRecorder.record_histogram(name: str, value: float, low_cardinality_attributes: LowCardinalityAttributes) -> None
  • changed: function agent(ctx, project, entity, count, forward_signals, term_timeout, sweep_id) → function agent(ctx, project, entity, count, forward_signals, term_timeout, max_consecutive_failed_runs, sweep_id)
  • added: function sweep_scheduler(entity: str | None, project: str | None, batch_size: int, poll_interval: float, sweep_id: str) -> None
  • changed: function inspect(path: str | None=…) -> None → function inspect(path: str | None=…, summary: bool=…, json_output: bool=…, follow: bool=…, idle_timeout: str=…) -> None
  • changed: function launch_inspect(path: str | None) -> Never → function launch_inspect(path: str | None, summary: bool=…, json_output: bool=…, follow: bool=…, idle_timeout: str=…) -> Never
  • removed: variable SessionRunArgs
  • removed: variable SessionRunHook
  • removed: variable get_global_step
  • removed: variable merge_all_summaries
  • changed: class WandbHook(SessionRunHook) → class WandbHook(tf.compat.v1.train.SessionRunHook)
  • removed: function validate_unsupported_media_mode(mode: str) -> None
  • removed: variable UnsupportedMediaMode
  • changed: function handle_nested_wandb_values(val: Any, column: str | int, unsupported_media_mode: UnsupportedMediaMode, *, nested: bool=…, inside_sequence: bool=…) -> Any → function handle_nested_wandb_values(val: Any, column: str | int, unsupported_media_mode: str, *, nested: bool=…, inside_sequence: bool=…) -> Any
  • changed: function unwrap_value(val: Any, column: str | int, unsupported_media_mode: UnsupportedMediaMode) -> Any → function unwrap_value(val: Any, column: str | int, unsupported_media_mode: str) -> Any
  • changed: function validate_supported_value(val: Any, column: str | int, unsupported_media_mode: UnsupportedMediaMode) -> None → function validate_supported_value(val: Any, column: str | int, unsupported_media_mode: str) -> None
  • removed: class EvalTable(Table)
  • removed: 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…
  • removed: method EvalTable.add_column(name: str, data: list[Any] | np.ndarray, optional: bool=…) -> None
  • removed: method EvalTable.add_data(*data: Any) -> None
  • removed: method EvalTable.bind_to_run(run: LocalRun, key: int | str, step: int | str, id_: int | str | None=…, ignore_copy_err: bool | None=…) -> None
  • removed: method EvalTable.has_been_logged() -> bool
  • removed: method EvalTable.to_json(run_or_artifact: Any) -> dict[str, Any]
  • removed: variable EVAL_TABLE_MARKER
  • removed: variable EVAL_TABLE_ROW_INDEX_KEY
  • added: export EvalTable
  • added: export UnsupportedMediaMode
  • 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=…, backend: Backend…
  • added: function validate_unsupported_media_mode(mode: str) -> None
  • 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_ROW_INDEX_KEY
  • added: variable UnsupportedMediaMode
  • added: function set_history_value(item: pb.HistoryItem, value: Any, *, json_form: bool, typed_form: bool) -> None
  • added: async method ServiceConnection.init_sweep_scheduler(settings: wandb_settings.Settings, *, entity: str, project: str, sweep_id: str, batch_size: int, poll_interval_seconds: float) -> MailboxHandle[wandb_sweep_scheduler_pb2.SweepSchedulerServerInitResponse]
  • added: async method ServiceConnection.stop_sweep_scheduler(session_id: str) -> None
  • added: async method ServiceConnection.sweep_scheduler_next_task(session_id: str, result: wandb_sweep_scheduler_pb2.SweepSchedulerClientTaskResult | None) -> MailboxHandle[wandb_sweep_scheduler_pb2.SweepSchedulerServerNextTaskResponse]
  • added: function forge_host(url: str) -> str | None
  • added: function forge_upstream_url(url: str) -> str
  • added: function is_forge_host(url: str) -> bool
  • added: function normalize_forge_base_url(url: str) -> str
  • added: variable DEFAULT_BASE_URL
  • added: variable FORGE_API_PATH
  • added: variable FORGE_APP_PATH
  • added: variable FORGE_HOSTS
  • changed: function authenticate_session(*, host: str | HostUrl, source: str, no_offline: bool=…, no_create: bool=…, input_timeout: float | None=…, referrer: str=…, relogin: bool=…, verify: bool=…, prompt: 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=…, prompt: bool=…, update_session: bool=…) -> Auth | None
  • added: function format_caught_error(headline: str) -> str
  • added: class AxOptimizer(Optimizer)
  • added: constructor AxOptimizer(client: ax.Client, sweep: SweepInfo, terminator: TerminatorCallback | None=…)
  • added: function build_ax_optimizer(sweep: SweepInfo) -> AxOptimizer
  • added: function configure_sweep_objective(client: ax.Client, config: dict[str, Any]) -> None
  • added: function create_default_client(config: dict[str, Any]) -> ax.Client
  • added: function sweep_config_to_metrics(config: dict[str, Any]) -> list[Any]
  • added: function sweep_config_to_search_space(config: dict[str, Any]) -> list[Any]
  • added: function sweep_objective_to_metric(objective: dict[str, Any]) -> Any
  • added: function sweep_parameter_to_parameter(name: str, parameter: dict[str, Any]) -> Any
  • added: function sweep_parameters_to_search_space(parameters: dict[str, Any]) -> list[Any]
  • added: method AxOptimizer.ask_n_runs(n: int) -> Sequence[RunSuggestion] | None
  • added: method AxOptimizer.forget_run(run_id: Any) -> None
  • added: method AxOptimizer.has_terminator() -> bool
  • added: method AxOptimizer.prune_run(run_id: Any, data: RunWithMetrics) -> bool
  • added: method AxOptimizer.route_library_logs(handler: logging.Handler) -> Callable[[], None]
  • added: method AxOptimizer.should_terminate_sweep() -> bool
  • added: method AxOptimizer.tell_existing_active_run(data: Run) -> Any
  • added: method AxOptimizer.tell_existing_finished_run(data: RunWithMetrics) -> None
  • added: method AxOptimizer.tell_run(run_id: Any, data: RunWithMetrics) -> None
  • added: method AxOptimizer.validate_sweep_objective() -> None
  • added: variable TerminatorCallback: TypeAlias
  • added: variable ax
  • added: function load_optimizer_config(source: str, name: str, optimizer_class: type, sweep: SweepInfo) -> tuple[Any, Callable[[Any], bool] | None]
  • added: function load_source_object(source: str, name: str) -> Any
  • added: function run_scheduler(*, entity: str, project: str, sweep_id: str, make_optimizer: OptimizerFactory, batch_size: int, poll_interval: float) -> sspb.SweepSchedulerServerDoneTask
  • added: variable OptimizerFactory
  • added: async method SchedulerTaskExchange.run() -> sspb.SweepSchedulerServerDoneTask
  • added: class SchedulerServiceExitedError(Exception)
  • added: class SchedulerTaskExchange
  • added: constructor SchedulerTaskExchange(service: ServiceConnection, scheduler_id: str, optimizer: Optimizer, handler: logging.Handler, telemetry: TelemetryRecorder) -> None
  • added: function describe_done(done: sspb.SweepSchedulerServerDoneTask) -> tuple[str, bool]
  • added: function make_optimizer(sweep: SweepInfo) -> Optimizer
  • added: method Optimizer.has_terminator() -> bool
  • added: method Optimizer.metric_goals() -> list[str]
  • added: method Optimizer.metric_names() -> list[str]
  • added: method Optimizer.objective_values(metrics: dict[str, Any]) -> list[Any] | None
  • added: method Optimizer.route_library_logs(handler: logging.Handler) -> Callable[[], None]
  • added: property Optimizer.engine -> str
  • added: class OptunaDeclarativeOptimizer(OptunaOptimizer)
  • added: class OptunaImperativeOptimizer(OptunaOptimizer)
  • added: class OptunaOptimizer(Optimizer)
  • added: class OptunaOptions
  • added: constructor OptunaDeclarativeOptimizer(study: optuna.Study, distributions: dict[str, optuna.distributions.BaseDistribution], sweep: SweepInfo, terminator: TerminatorCallback | None=…)
  • added: constructor OptunaImperativeOptimizer(study: optuna.Study, trial_constructor: TrialConstructor, sweep: SweepInfo, terminator: TerminatorCallback | None=…)
  • added: constructor OptunaOptimizer(study: optuna.Study, sweep: SweepInfo, terminator: TerminatorCallback | None=…)
  • added: field OptunaOptions.distributions: dict[str, optuna.distributions.BaseDistribution] | None
  • added: field OptunaOptions.search_space: TrialConstructor | None
  • added: field OptunaOptions.study: optuna.Study
  • added: field OptunaOptions.terminator: TerminatorCallback | None
  • added: function build_optuna_optimizer(sweep: SweepInfo) -> OptunaOptimizer
  • added: function create_study_from_sweep_config(config: dict[str, Any]) -> optuna.Study
  • added: function load_trial_constructor(source: str, name: str) -> TrialConstructor
  • added: function make_optimizer(sweep: SweepInfo, options: OptunaOptions) -> OptunaOptimizer
  • added: function search_space_from_sweep_config(parameters: dict[str, Any]) -> dict[str, optuna.distributions.BaseDistribution]
  • added: function sweep_directions(config: dict[str, Any]) -> list[str]
  • added: function sweep_parameter_to_distribution(parameter: dict[str, Any]) -> optuna.distributions.BaseDistribution
  • added: method OptunaDeclarativeOptimizer.tell_existing_finished_run(data: RunWithMetrics) -> None
  • added: method OptunaImperativeOptimizer.tell_existing_finished_run(data: RunWithMetrics) -> None
  • added: method OptunaOptimizer.ask_n_runs(n: int) -> Sequence[RunSuggestion]
  • added: method OptunaOptimizer.forget_run(run_id: Any) -> None
  • added: method OptunaOptimizer.has_terminator() -> bool
  • added: method OptunaOptimizer.prune_run(run_id: Any, data: RunWithMetrics) -> bool
  • added: method OptunaOptimizer.route_library_logs(handler: logging.Handler) -> Callable[[], None]
  • added: method OptunaOptimizer.should_terminate_sweep() -> bool
  • added: method OptunaOptimizer.tell_existing_active_run(data: Run) -> Any
  • added: method OptunaOptimizer.tell_run(run_id: Any, data: RunWithMetrics) -> None
  • added: method OptunaOptimizer.trial_state(state: RunState) -> optuna.trial.TrialState
  • added: method OptunaOptimizer.validate_sweep_objective() -> None
  • added: variable TerminatorCallback: TypeAlias
  • added: variable TrialConstructor: TypeAlias
  • added: variable optuna
  • added: function build_wandb_optimizer(sweep: SweepInfo) -> WandbOptimizer
  • added: method WandbOptimizer.has_terminator() -> bool
  • added: field SweepInfo.controller_run_name: str
  • changed: constructor RunStatusChecker(run_id: str, asyncer: asyncio_manager.AsyncioManager, interface: InterfaceBase, settings: Settings, retry_polling_interval: int=…, internal_messages_polling_interval: int=…) -> None → constructor RunStatusChecker(run_id: str, asyncer: asyncio_manager.AsyncioManager, interface: InterfaceBase, settings: Settings, retry_polling_interval: int=…) -> None
  • removed: field Settings.x_server_side_expand_glob_metrics: bool
  • added: field Settings.x_history_value_encoding: str
  • added: field Settings.x_stats_self_usage: bool
  • added: field Settings.x_transaction_log_flush_interval: float
  • added: static method Settings.validate_x_history_value_encoding(value: str) -> str
  • added: variable HISTORY_VALUE_ENCODINGS
  • added: variable HISTORY_VALUE_ENCODING_DEFAULT
  • added: variable HISTORY_VALUE_ENCODING_JSON
  • added: variable HISTORY_VALUE_ENCODING_TYPED
  • changed: constructor Agent(api, queue, sweep_id=…, function=…, in_jupyter=…, count=…, forward_signals=…, term_timeout: int | None=…) → constructor Agent(api, queue, sweep_id=…, function=…, in_jupyter=…, count=…, forward_signals=…, term_timeout: int | None=…, max_consecutive_failed_runs: int | None=…)
  • changed: 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 → function agent(sweep_id: str, function: Callable | None=…, entity: str | None=…, project: str | None=…, count: int | None=…, forward_signals: bool=…, term_timeout: int | None=…, max_consecutive_failed_runs: int | None=…) -> None
  • changed: function run_agent(sweep_id, function=…, in_jupyter=…, entity=…, project=…, count=…, forward_signals=…, term_timeout: int | None=…) → function run_agent(sweep_id, function=…, in_jupyter=…, entity=…, project=…, count=…, forward_signals=…, term_timeout: int | None=…, max_consecutive_failed_runs: int | None=…)
  • changed: method AgentProcess.poll() → method AgentProcess.poll() -> int | None