Upgrading wandb 0.30 to 0.31
Breaking0.30.0 → 0.31.0Breaking1Security1Platform1New18Changed11Fixed30
SecurityThe wandb/launch-agent Docker image is built on an updated base image that fixes the CVEs reported against the 0.30.0 image.#12771 ↗
BreakingUpgrade verdict
1 breaking change and a platform requirement change and a security fix.
In plain terms
- 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.
Must act 3 items need code or config changes
Adds cwevals ==0.0.1b1.
Installs 32 packages in all (was 25).
What you must change
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-agentPlatform1
Adds support for Python 3.15.
API 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=…, 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