wandb 0.17.9__py3-none-win32.whl → 0.18.0__py3-none-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ _sym_db = _symbol_database.Default()
15
15
  from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
16
16
 
17
17
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n wandb/proto/wandb_settings.proto\x12\x0ewandb_internal\x1a\x1egoogle/protobuf/wrappers.proto\" \n\x0fListStringValue\x12\r\n\x05value\x18\x01 \x03(\t\"\x8a\x01\n\x17MapStringKeyStringValue\x12\x41\n\x05value\x18\x01 \x03(\x0b\x32\x32.wandb_internal.MapStringKeyStringValue.ValueEntry\x1a,\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xcb\x01\n#MapStringKeyMapStringKeyStringValue\x12M\n\x05value\x18\x01 \x03(\x0b\x32>.wandb_internal.MapStringKeyMapStringKeyStringValue.ValueEntry\x1aU\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue:\x02\x38\x01\"\x9a\x01\n\x12OpenMetricsFilters\x12\x33\n\x08sequence\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValueH\x00\x12\x46\n\x07mapping\x18\x02 \x01(\x0b\x32\x33.wandb_internal.MapStringKeyMapStringKeyStringValueH\x00\x42\x07\n\x05value\"7\n\tRunMoment\x12\x0b\n\x03run\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\x12\x0e\n\x06metric\x18\x03 \x01(\t\"\x8aG\n\x08Settings\x12-\n\x07\x61pi_key\x18\x37 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x08_offline\x18\x1e \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x07_shared\x18\xa2\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06run_id\x18k \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07run_url\x18q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07project\x18\x61 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06\x65ntity\x18\x45 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0b_start_time\x18) \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12-\n\x07log_dir\x18U \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0clog_internal\x18V \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tfiles_dir\x18\x46 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0cignore_globs\x18N \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12:\n\x15_disable_update_check\x18\xa5\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\r_require_core\x18$ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17_require_legacy_service\x18\xad\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x13identity_token_file\x18\xaa\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x10\x63redentials_file\x18\xab\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12<\n\x16_file_stream_max_bytes\x18\xac\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x44\n\x13_extra_http_headers\x18\x0e \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12<\n\x16_file_stream_retry_max\x18\x93\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12J\n#_file_stream_retry_wait_min_seconds\x18\x94\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12J\n#_file_stream_retry_wait_max_seconds\x18\x95\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x42\n\x1c_file_stream_timeout_seconds\x18\x0f \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x18_file_transfer_retry_max\x18\x96\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12L\n%_file_transfer_retry_wait_min_seconds\x18\x97\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12L\n%_file_transfer_retry_wait_max_seconds\x18\x98\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x45\n\x1e_file_transfer_timeout_seconds\x18\x99\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x38\n\x12_graphql_retry_max\x18\x9a\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x46\n\x1f_graphql_retry_wait_min_seconds\x18\x9b\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x46\n\x1f_graphql_retry_wait_max_seconds\x18\x9c\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12?\n\x18_graphql_timeout_seconds\x18\x9d\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12.\n\x05_args\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12/\n\x0b_aws_lambda\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0e_cli_only_mode\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06_colab\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x05_cuda\x18\x06 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\r_disable_meta\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10_disable_service\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x15_disable_setproctitle\x18\t \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0e_disable_stats\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0f_disable_viewer\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\x0b_executable\x18\r \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x14_flow_control_custom\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x16_flow_control_disabled\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12=\n\x17_internal_check_process\x18\x12 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12=\n\x17_internal_queue_timeout\x18\x13 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08_ipython\x18\x14 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08_jupyter\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\r_jupyter_root\x18\x16 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07_kaggle\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17_live_policy_rate_limit\x18\x18 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12;\n\x16_live_policy_wait_time\x18\x19 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\n_log_level\x18\x1a \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0f_network_buffer\x18\x1b \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12)\n\x05_noop\x18\x1c \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\t_notebook\x18\x1d \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x05_sync\x18\x1f \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x03_os\x18 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_platform\x18! \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07_python\x18\" \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x11_runqueue_item_id\x18# \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x12_save_requirements\x18% \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12_service_transport\x18& \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\r_service_wait\x18\' \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x35\n\x0f_start_datetime\x18( \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\n_stats_pid\x18* \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12?\n\x18_stats_sampling_interval\x18\xae\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12@\n\x1a_stats_sample_rate_seconds\x18+ \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x19_stats_samples_to_average\x18, \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x12_stats_join_assets\x18- \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12G\n!_stats_neuron_monitor_config_path\x18. \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12N\n\x1d_stats_open_metrics_endpoints\x18/ \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12G\n\x1b_stats_open_metrics_filters\x18\x30 \x01(\x0b\x32\".wandb_internal.OpenMetricsFilters\x12\x33\n\r_tmp_code_dir\x18\x31 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_tracelog\x18\x32 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\r_unsaved_keys\x18\x33 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12,\n\x08_windows\x18\x34 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10\x61llow_val_change\x18\x35 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\tanonymous\x18\x36 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12P\n\x1f\x61zure_account_url_to_access_key\x18\x38 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12.\n\x08\x62\x61se_url\x18\x39 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08\x63ode_dir\x18: \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0c\x63onfig_paths\x18; \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12-\n\x07\x63onsole\x18< \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ndeployment\x18= \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\x0c\x64isable_code\x18> \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0b\x64isable_git\x18? \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rdisable_hints\x18@ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x14\x64isable_job_creation\x18\x41 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08\x64isabled\x18\x42 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06\x64ocker\x18\x43 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x05\x65mail\x18\x44 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05\x66orce\x18G \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\ngit_commit\x18H \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ngit_remote\x18I \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0egit_remote_url\x18J \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08git_root\x18K \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11heartbeat_seconds\x18L \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12*\n\x04host\x18M \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cinit_timeout\x18O \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08is_local\x18P \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\njob_source\x18Q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\rlabel_disable\x18R \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06launch\x18S \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12launch_config_path\x18T \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x14log_symlink_internal\x18W \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x10log_symlink_user\x18X \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08log_user\x18Y \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rlogin_timeout\x18Z \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12*\n\x04mode\x18\\ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rnotebook_name\x18] \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07program\x18_ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0fprogram_relpath\x18` \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0bproject_url\x18\x62 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05quiet\x18\x63 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06reinit\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07relogin\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06resume\x18\x66 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cresume_fname\x18g \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07resumed\x18h \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tfork_from\x18\xa4\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12/\n\x0bresume_from\x18\xa7\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12.\n\x08root_dir\x18i \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_group\x18j \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0crun_job_type\x18l \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_mode\x18m \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_name\x18n \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_notes\x18o \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x08run_tags\x18p \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12\x35\n\x11sagemaker_disable\x18r \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tsave_code\x18s \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x35\n\x0fsettings_system\x18t \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12settings_workspace\x18u \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0bshow_colors\x18v \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\nshow_emoji\x18w \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0bshow_errors\x18x \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tshow_info\x18y \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rshow_warnings\x18z \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06silent\x18{ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0cstart_method\x18| \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x06strict\x18} \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0esummary_errors\x18~ \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0fsummary_timeout\x18\x7f \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x10summary_warnings\x18\x80\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\x08sweep_id\x18\x81\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x10sweep_param_path\x18\x82\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsweep_url\x18\x83\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x07symlink\x18\x84\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08sync_dir\x18\x85\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsync_file\x18\x86\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x13sync_symlink_latest\x18\x87\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12J\n%table_raise_on_max_row_limit_exceeded\x18\x8a\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08timespec\x18\x8b\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x07tmp_dir\x18\x8c\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08username\x18\x8d\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\twandb_dir\x18\x8e\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_name\x18\x8f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_path\x18\x90\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08job_name\x18\x91\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12;\n\x11_stats_disk_paths\x18\x92\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12:\n\x15_disable_machine_info\x18\x9e\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x36\n\x0fprogram_abspath\x18\x9f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tcolab_url\x18\xa0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12_stats_buffer_size\x18\xa1\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x37\n\x10_code_path_local\x18\xa3\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11\x63onsole_multipart\x18\xa6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\nhttp_proxy\x18\xa8\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0bhttps_proxy\x18\xa9\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x08_proxies\x18\xc8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValueJ\x04\x08\x0c\x10\rJ\x04\x08^\x10_J\x06\x08\x88\x01\x10\x89\x01J\x06\x08\x89\x01\x10\x8a\x01\x62\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n wandb/proto/wandb_settings.proto\x12\x0ewandb_internal\x1a\x1egoogle/protobuf/wrappers.proto\" \n\x0fListStringValue\x12\r\n\x05value\x18\x01 \x03(\t\"\x8a\x01\n\x17MapStringKeyStringValue\x12\x41\n\x05value\x18\x01 \x03(\x0b\x32\x32.wandb_internal.MapStringKeyStringValue.ValueEntry\x1a,\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xcb\x01\n#MapStringKeyMapStringKeyStringValue\x12M\n\x05value\x18\x01 \x03(\x0b\x32>.wandb_internal.MapStringKeyMapStringKeyStringValue.ValueEntry\x1aU\n\nValueEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x36\n\x05value\x18\x02 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue:\x02\x38\x01\"\x9a\x01\n\x12OpenMetricsFilters\x12\x33\n\x08sequence\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValueH\x00\x12\x46\n\x07mapping\x18\x02 \x01(\x0b\x32\x33.wandb_internal.MapStringKeyMapStringKeyStringValueH\x00\x42\x07\n\x05value\"7\n\tRunMoment\x12\x0b\n\x03run\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x01\x12\x0e\n\x06metric\x18\x03 \x01(\t\"\xdd\x46\n\x08Settings\x12-\n\x07\x61pi_key\x18\x37 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x08_offline\x18\x1e \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x07_shared\x18\xa2\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06run_id\x18k \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07run_url\x18q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07project\x18\x61 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06\x65ntity\x18\x45 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0b_start_time\x18) \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12-\n\x07log_dir\x18U \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0clog_internal\x18V \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07\x63onsole\x18< \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\tfiles_dir\x18\x46 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0cignore_globs\x18N \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12:\n\x15_disable_update_check\x18\xa5\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17_require_legacy_service\x18\xad\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x13identity_token_file\x18\xaa\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x10\x63redentials_file\x18\xab\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12<\n\x16_file_stream_max_bytes\x18\xac\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x44\n\x13_extra_http_headers\x18\x0e \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12<\n\x16_file_stream_retry_max\x18\x93\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12J\n#_file_stream_retry_wait_min_seconds\x18\x94\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12J\n#_file_stream_retry_wait_max_seconds\x18\x95\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x42\n\x1c_file_stream_timeout_seconds\x18\x0f \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x18_file_transfer_retry_max\x18\x96\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12L\n%_file_transfer_retry_wait_min_seconds\x18\x97\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12L\n%_file_transfer_retry_wait_max_seconds\x18\x98\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x45\n\x1e_file_transfer_timeout_seconds\x18\x99\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x38\n\x12_graphql_retry_max\x18\x9a\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x46\n\x1f_graphql_retry_wait_min_seconds\x18\x9b\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x46\n\x1f_graphql_retry_wait_max_seconds\x18\x9c\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12?\n\x18_graphql_timeout_seconds\x18\x9d\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12.\n\x05_args\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12/\n\x0b_aws_lambda\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0e_cli_only_mode\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06_colab\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x05_cuda\x18\x06 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\r_disable_meta\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10_disable_service\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x15_disable_setproctitle\x18\t \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0e_disable_stats\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0f_disable_viewer\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\x0b_executable\x18\r \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x14_flow_control_custom\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x16_flow_control_disabled\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12=\n\x17_internal_check_process\x18\x12 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12=\n\x17_internal_queue_timeout\x18\x13 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08_ipython\x18\x14 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08_jupyter\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\r_jupyter_root\x18\x16 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07_kaggle\x18\x17 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17_live_policy_rate_limit\x18\x18 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12;\n\x16_live_policy_wait_time\x18\x19 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\n_log_level\x18\x1a \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0f_network_buffer\x18\x1b \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12)\n\x05_noop\x18\x1c \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\t_notebook\x18\x1d \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x05_sync\x18\x1f \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12)\n\x03_os\x18 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_platform\x18! \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07_python\x18\" \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x11_runqueue_item_id\x18# \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x12_save_requirements\x18% \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12_service_transport\x18& \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\r_service_wait\x18\' \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x35\n\x0f_start_datetime\x18( \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\n_stats_pid\x18* \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12?\n\x18_stats_sampling_interval\x18\xae\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12@\n\x1a_stats_sample_rate_seconds\x18+ \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12>\n\x19_stats_samples_to_average\x18, \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x12_stats_join_assets\x18- \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12G\n!_stats_neuron_monitor_config_path\x18. \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12N\n\x1d_stats_open_metrics_endpoints\x18/ \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12G\n\x1b_stats_open_metrics_filters\x18\x30 \x01(\x0b\x32\".wandb_internal.OpenMetricsFilters\x12\x33\n\r_tmp_code_dir\x18\x31 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\t_tracelog\x18\x32 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\r_unsaved_keys\x18\x33 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12,\n\x08_windows\x18\x34 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x34\n\x10\x61llow_val_change\x18\x35 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\tanonymous\x18\x36 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12P\n\x1f\x61zure_account_url_to_access_key\x18\x38 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12.\n\x08\x62\x61se_url\x18\x39 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08\x63ode_dir\x18: \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0c\x63onfig_paths\x18; \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12\x30\n\ndeployment\x18= \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\x0c\x64isable_code\x18> \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0b\x64isable_git\x18? \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rdisable_hints\x18@ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x14\x64isable_job_creation\x18\x41 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08\x64isabled\x18\x42 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06\x64ocker\x18\x43 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x05\x65mail\x18\x44 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05\x66orce\x18G \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\ngit_commit\x18H \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\ngit_remote\x18I \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0egit_remote_url\x18J \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08git_root\x18K \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11heartbeat_seconds\x18L \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12*\n\x04host\x18M \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cinit_timeout\x18O \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12,\n\x08is_local\x18P \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\njob_source\x18Q \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\rlabel_disable\x18R \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06launch\x18S \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x38\n\x12launch_config_path\x18T \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x14log_symlink_internal\x18W \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x10log_symlink_user\x18X \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08log_user\x18Y \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rlogin_timeout\x18Z \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12*\n\x04mode\x18\\ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x33\n\rnotebook_name\x18] \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07program\x18_ \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0fprogram_relpath\x18` \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x0bproject_url\x18\x62 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12)\n\x05quiet\x18\x63 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06reinit\x18\x64 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07relogin\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x06resume\x18\x66 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cresume_fname\x18g \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x07resumed\x18h \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tfork_from\x18\xa4\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12/\n\x0bresume_from\x18\xa7\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12.\n\x08root_dir\x18i \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_group\x18j \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0crun_job_type\x18l \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_mode\x18m \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x08run_name\x18n \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\trun_notes\x18o \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x31\n\x08run_tags\x18p \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12\x35\n\x11sagemaker_disable\x18r \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tsave_code\x18s \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x35\n\x0fsettings_system\x18t \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12settings_workspace\x18u \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0bshow_colors\x18v \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\nshow_emoji\x18w \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0bshow_errors\x18x \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tshow_info\x18y \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\rshow_warnings\x18z \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06silent\x18{ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0cstart_method\x18| \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x06strict\x18} \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0esummary_errors\x18~ \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x34\n\x0fsummary_timeout\x18\x7f \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x36\n\x10summary_warnings\x18\x80\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12/\n\x08sweep_id\x18\x81\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x10sweep_param_path\x18\x82\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsweep_url\x18\x83\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x07symlink\x18\x84\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08sync_dir\x18\x85\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tsync_file\x18\x86\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x13sync_symlink_latest\x18\x87\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12J\n%table_raise_on_max_row_limit_exceeded\x18\x8a\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x08timespec\x18\x8b\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x07tmp_dir\x18\x8c\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08username\x18\x8d\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\twandb_dir\x18\x8e\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_name\x18\x8f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\r_jupyter_path\x18\x90\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08job_name\x18\x91\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12;\n\x11_stats_disk_paths\x18\x92\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12:\n\x15_disable_machine_info\x18\x9e\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x36\n\x0fprogram_abspath\x18\x9f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tcolab_url\x18\xa0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12_stats_buffer_size\x18\xa1\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x37\n\x10_code_path_local\x18\xa3\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11\x63onsole_multipart\x18\xa6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x31\n\nhttp_proxy\x18\xa8\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0bhttps_proxy\x18\xa9\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12:\n\x08_proxies\x18\xc8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValueJ\x04\x08\x0c\x10\rJ\x04\x08$\x10%J\x04\x08^\x10_J\x06\x08\x88\x01\x10\x89\x01J\x06\x08\x89\x01\x10\x8a\x01\x62\x06proto3')
19
19
 
20
20
  _globals = globals()
21
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -41,5 +41,5 @@ if not _descriptor._USE_C_DESCRIPTORS:
41
41
  _globals['_RUNMOMENT']._serialized_start=622
42
42
  _globals['_RUNMOMENT']._serialized_end=677
43
43
  _globals['_SETTINGS']._serialized_start=680
44
- _globals['_SETTINGS']._serialized_end=9778
44
+ _globals['_SETTINGS']._serialized_end=9733
45
45
  # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,45 @@
1
+ """Internal validation helper functions that are specific to artifacts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from typing import TYPE_CHECKING, Hashable, TypeVar
7
+
8
+ if TYPE_CHECKING:
9
+ from typing import Collection
10
+
11
+
12
+ HashableT = TypeVar("HashableT", bound=Hashable)
13
+
14
+
15
+ def validate_aliases(aliases: Collection[str]) -> list[str]:
16
+ """Validate the artifact aliases and return them as a list.
17
+
18
+ Raises:
19
+ ValueError: If any of the aliases contain invalid characters.
20
+ """
21
+ invalid_chars = ("/", ":")
22
+ if any(char in alias for alias in aliases for char in invalid_chars):
23
+ raise ValueError(
24
+ f"Aliases must not contain any of the following characters: {', '.join(invalid_chars)}"
25
+ )
26
+ return list(aliases)
27
+
28
+
29
+ _VALID_TAG_PATTERN: re.Pattern[str] = re.compile(r"^[-\w]+( +[-\w]+)*$")
30
+
31
+
32
+ def validate_tags(tags: Collection[str]) -> list[str]:
33
+ """Validate the artifact tag names and return them as a deduped list.
34
+
35
+ In the case of duplicates, only keep the first tag, and otherwise maintain the order of appearance.
36
+
37
+ Raises:
38
+ ValueError: If any of the tags contain invalid characters.
39
+ """
40
+ if any(not _VALID_TAG_PATTERN.match(tag) for tag in tags):
41
+ raise ValueError(
42
+ "Invalid tag(s). "
43
+ "Tags must only contain alphanumeric characters separated by hyphens, underscores, and/or spaces."
44
+ )
45
+ return list(dict.fromkeys(tags))
@@ -50,6 +50,7 @@ from wandb.apis.normalize import normalize_exceptions
50
50
  from wandb.apis.public import ArtifactCollection, ArtifactFiles, RetryingClient, Run
51
51
  from wandb.data_types import WBValue
52
52
  from wandb.errors.term import termerror, termlog, termwarn
53
+ from wandb.sdk.artifacts._validators import validate_aliases, validate_tags
53
54
  from wandb.sdk.artifacts.artifact_download_logger import ArtifactDownloadLogger
54
55
  from wandb.sdk.artifacts.artifact_instance_cache import artifact_instance_cache
55
56
  from wandb.sdk.artifacts.artifact_manifest import ArtifactManifest
@@ -183,6 +184,8 @@ class Artifact:
183
184
  self._ttl_changed: bool = False
184
185
  self._aliases: List[str] = []
185
186
  self._saved_aliases: List[str] = []
187
+ self._tags: List[str] = []
188
+ self._saved_tags: List[str] = []
186
189
  self._distributed_id: Optional[str] = None
187
190
  self._incremental: bool = incremental
188
191
  self._use_as: Optional[str] = use_as
@@ -300,6 +303,7 @@ class Artifact:
300
303
  and alias["artifactCollection"]["project"]["name"] == project
301
304
  and alias["artifactCollection"]["name"] == name.split(":")[0]
302
305
  ]
306
+ tags = [tag_obj["name"] for tag_obj in attrs.get("tags", [])]
303
307
  version_aliases = [
304
308
  alias for alias in aliases if util.alias_is_version_index(alias)
305
309
  ]
@@ -330,6 +334,8 @@ class Artifact:
330
334
  alias for alias in aliases if not util.alias_is_version_index(alias)
331
335
  ]
332
336
  artifact._saved_aliases = copy(artifact._aliases)
337
+ artifact._tags = tags
338
+ artifact._saved_tags = copy(artifact._tags)
333
339
  artifact._state = ArtifactState(attrs["state"])
334
340
  if "currentManifest" in attrs:
335
341
  artifact._load_manifest(attrs["currentManifest"]["file"]["directUrl"])
@@ -604,12 +610,19 @@ class Artifact:
604
610
  def aliases(self, aliases: List[str]) -> None:
605
611
  """Set the aliases associated with this artifact."""
606
612
  self._ensure_logged("aliases")
613
+ self._aliases = validate_aliases(aliases)
607
614
 
608
- if any(char in alias for alias in aliases for char in ["/", ":"]):
609
- raise ValueError(
610
- "Aliases must not contain any of the following characters: /, :"
611
- )
612
- self._aliases = aliases
615
+ @property
616
+ def tags(self) -> List[str]:
617
+ """List of one or more tags assigned to this artifact version."""
618
+ self._ensure_logged("tags")
619
+ return self._tags
620
+
621
+ @tags.setter
622
+ def tags(self, tags: List[str]) -> None:
623
+ """Set the tags associated with this artifact."""
624
+ self._ensure_logged("tags")
625
+ self._tags = validate_tags(tags)
613
626
 
614
627
  @property
615
628
  def distributed_id(self) -> Optional[str]:
@@ -823,49 +836,53 @@ class Artifact:
823
836
  return self
824
837
 
825
838
  def _populate_after_save(self, artifact_id: str) -> None:
826
- query_template = """
827
- query ArtifactByIDShort($id: ID!) {
828
- artifact(id: $id) {
829
- artifactSequence {
830
- project {
839
+ fields = InternalApi().server_artifact_introspection()
840
+
841
+ supports_ttl = "ttlIsInherited" in fields
842
+ ttl_duration_seconds = "ttlDurationSeconds" if supports_ttl else ""
843
+ ttl_is_inherited = "ttlIsInherited" if supports_ttl else ""
844
+
845
+ supports_tags = "tags" in fields
846
+ tags = "tags {name}" if supports_tags else ""
847
+
848
+ query_template = f"""
849
+ query ArtifactByIDShort($id: ID!) {{
850
+ artifact(id: $id) {{
851
+ artifactSequence {{
852
+ project {{
831
853
  entityName
832
854
  name
833
- }
855
+ }}
834
856
  name
835
- }
857
+ }}
836
858
  versionIndex
837
- ttlDurationSeconds
838
- ttlIsInherited
839
- aliases {
840
- artifactCollection {
841
- project {
859
+ {ttl_duration_seconds}
860
+ {ttl_is_inherited}
861
+ aliases {{
862
+ artifactCollection {{
863
+ project {{
842
864
  entityName
843
865
  name
844
- }
866
+ }}
845
867
  name
846
- }
868
+ }}
847
869
  alias
848
- }
870
+ }}
871
+ {tags!s}
849
872
  state
850
- currentManifest {
851
- file {
873
+ currentManifest {{
874
+ file {{
852
875
  directUrl
853
- }
854
- }
876
+ }}
877
+ }}
855
878
  commitHash
856
879
  fileCount
857
880
  createdAt
858
881
  updatedAt
859
- }
860
- }
882
+ }}
883
+ }}
861
884
  """
862
885
 
863
- fields = InternalApi().server_artifact_introspection()
864
- if "ttlIsInherited" not in fields:
865
- query_template = query_template.replace("ttlDurationSeconds", "").replace(
866
- "ttlIsInherited",
867
- "",
868
- )
869
886
  query = gql(query_template)
870
887
 
871
888
  assert self._client is not None
@@ -908,6 +925,7 @@ class Artifact:
908
925
  and alias["artifactCollection"]["name"] == self._name.split(":")[0]
909
926
  and not util.alias_is_version_index(alias["alias"])
910
927
  ]
928
+ self._tags = [tag_obj["name"] for tag_obj in attrs.get("tags", [])]
911
929
  self._state = ArtifactState(attrs["state"])
912
930
  self._load_manifest(attrs["currentManifest"]["file"]["directUrl"])
913
931
  self._commit_hash = attrs["commitHash"]
@@ -936,7 +954,7 @@ class Artifact:
936
954
  if response.get("AddAliasesInputInfoType"): # wandb backend version >= 0.13.0
937
955
  aliases_to_add = set(self._aliases) - set(self._saved_aliases)
938
956
  aliases_to_delete = set(self._saved_aliases) - set(self._aliases)
939
- if len(aliases_to_add) > 0:
957
+ if aliases_to_add:
940
958
  add_mutation = gql(
941
959
  """
942
960
  mutation addAliases(
@@ -967,7 +985,7 @@ class Artifact:
967
985
  ],
968
986
  },
969
987
  )
970
- if len(aliases_to_delete) > 0:
988
+ if aliases_to_delete:
971
989
  delete_mutation = gql(
972
990
  """
973
991
  mutation deleteAliases(
@@ -1010,10 +1028,12 @@ class Artifact:
1010
1028
 
1011
1029
  mutation_template = """
1012
1030
  mutation updateArtifact(
1013
- $artifactID: ID!,
1014
- $description: String,
1015
- $metadata: JSONString,
1031
+ $artifactID: ID!
1032
+ $description: String
1033
+ $metadata: JSONString
1016
1034
  _TTL_DURATION_SECONDS_TYPE_
1035
+ _TAGS_TO_ADD_TYPE_
1036
+ _TAGS_TO_DELETE_TYPE_
1017
1037
  $aliases: [ArtifactAliasInput!]
1018
1038
  ) {
1019
1039
  updateArtifact(
@@ -1022,6 +1042,8 @@ class Artifact:
1022
1042
  description: $description,
1023
1043
  metadata: $metadata,
1024
1044
  _TTL_DURATION_SECONDS_VALUE_
1045
+ _TAGS_TO_ADD_VALUE_
1046
+ _TAGS_TO_DELETE_VALUE_
1025
1047
  aliases: $aliases
1026
1048
  }
1027
1049
  ) {
@@ -1036,14 +1058,16 @@ class Artifact:
1036
1058
  if "ttlIsInherited" in fields:
1037
1059
  mutation_template = (
1038
1060
  mutation_template.replace(
1039
- "_TTL_DURATION_SECONDS_TYPE_", "$ttlDurationSeconds: Int64,"
1061
+ "_TTL_DURATION_SECONDS_TYPE_",
1062
+ "$ttlDurationSeconds: Int64",
1040
1063
  )
1041
1064
  .replace(
1042
1065
  "_TTL_DURATION_SECONDS_VALUE_",
1043
- "ttlDurationSeconds: $ttlDurationSeconds,",
1066
+ "ttlDurationSeconds: $ttlDurationSeconds",
1044
1067
  )
1045
1068
  .replace(
1046
- "_TTL_DURATION_SECONDS_FIELDS_", "ttlDurationSeconds ttlIsInherited"
1069
+ "_TTL_DURATION_SECONDS_FIELDS_",
1070
+ "ttlDurationSeconds ttlIsInherited",
1047
1071
  )
1048
1072
  )
1049
1073
  else:
@@ -1053,12 +1077,34 @@ class Artifact:
1053
1077
  )
1054
1078
  mutation_template = (
1055
1079
  mutation_template.replace("_TTL_DURATION_SECONDS_TYPE_", "")
1056
- .replace(
1057
- "_TTL_DURATION_SECONDS_VALUE_",
1058
- "",
1059
- )
1080
+ .replace("_TTL_DURATION_SECONDS_VALUE_", "")
1060
1081
  .replace("_TTL_DURATION_SECONDS_FIELDS_", "")
1061
1082
  )
1083
+
1084
+ tags_to_add = validate_tags(set(self._tags) - set(self._saved_tags))
1085
+ tags_to_delete = validate_tags(set(self._saved_tags) - set(self._tags))
1086
+ if "tags" in fields:
1087
+ mutation_template = (
1088
+ mutation_template.replace(
1089
+ "_TAGS_TO_ADD_TYPE_", "$tagsToAdd: [TagInput!]"
1090
+ )
1091
+ .replace("_TAGS_TO_DELETE_TYPE_", "$tagsToDelete: [TagInput!]")
1092
+ .replace("_TAGS_TO_ADD_VALUE_", "tagsToAdd: $tagsToAdd")
1093
+ .replace("_TAGS_TO_DELETE_VALUE_", "tagsToDelete: $tagsToDelete")
1094
+ )
1095
+ else:
1096
+ if tags_to_add or tags_to_delete:
1097
+ termwarn(
1098
+ "Server not compatible with Artifact tags. "
1099
+ "To use Artifact tags, please upgrade the server to v0.85 or higher."
1100
+ )
1101
+ mutation_template = (
1102
+ mutation_template.replace("_TAGS_TO_ADD_TYPE_", "")
1103
+ .replace("_TAGS_TO_DELETE_TYPE_", "")
1104
+ .replace("_TAGS_TO_ADD_VALUE_", "")
1105
+ .replace("_TAGS_TO_DELETE_VALUE_", "")
1106
+ )
1107
+
1062
1108
  mutation = gql(mutation_template)
1063
1109
  assert self._client is not None
1064
1110
 
@@ -1071,6 +1117,8 @@ class Artifact:
1071
1117
  "metadata": util.json_dumps_safer(self.metadata),
1072
1118
  "ttlDurationSeconds": ttl_duration_input,
1073
1119
  "aliases": aliases,
1120
+ "tagsToAdd": [{"tagName": tag_name} for tag_name in tags_to_add],
1121
+ "tagsToDelete": [{"tagName": tag_name} for tag_name in tags_to_delete],
1074
1122
  },
1075
1123
  )
1076
1124
  attrs = response["updateArtifact"]["artifact"]
@@ -2316,6 +2364,7 @@ class Artifact:
2316
2364
  }
2317
2365
  alias
2318
2366
  }
2367
+ _MAYBE_TAGS_
2319
2368
  state
2320
2369
  commitHash
2321
2370
  fileCount
@@ -2324,9 +2373,15 @@ class Artifact:
2324
2373
  }
2325
2374
  """
2326
2375
  if "ttlIsInherited" not in fields:
2327
- return fragment.replace("ttlDurationSeconds", "").replace(
2376
+ fragment = fragment.replace("ttlDurationSeconds", "").replace(
2328
2377
  "ttlIsInherited", ""
2329
2378
  )
2379
+
2380
+ if "tags" in fields:
2381
+ fragment = fragment.replace("_MAYBE_TAGS_", "tags {name}")
2382
+ else:
2383
+ fragment = fragment.replace("_MAYBE_TAGS_", "")
2384
+
2330
2385
  return fragment
2331
2386
 
2332
2387
  def _ttl_duration_seconds_to_gql(self) -> Optional[int]:
@@ -71,6 +71,7 @@ class ArtifactSaver:
71
71
  ttl_duration_seconds: Optional[int] = None,
72
72
  description: Optional[str] = None,
73
73
  aliases: Optional[Sequence[str]] = None,
74
+ tags: Optional[Sequence[str]] = None,
74
75
  use_after_commit: bool = False,
75
76
  incremental: bool = False,
76
77
  history_step: Optional[int] = None,
@@ -87,6 +88,7 @@ class ArtifactSaver:
87
88
  ttl_duration_seconds,
88
89
  description,
89
90
  aliases,
91
+ tags,
90
92
  use_after_commit,
91
93
  incremental,
92
94
  history_step,
@@ -105,6 +107,7 @@ class ArtifactSaver:
105
107
  ttl_duration_seconds: Optional[int] = None,
106
108
  description: Optional[str] = None,
107
109
  aliases: Optional[Sequence[str]] = None,
110
+ tags: Optional[Sequence[str]] = None,
108
111
  use_after_commit: bool = False,
109
112
  incremental: bool = False,
110
113
  history_step: Optional[int] = None,
@@ -114,6 +117,8 @@ class ArtifactSaver:
114
117
  for alias in aliases or []:
115
118
  alias_specs.append({"artifactCollectionName": name, "alias": alias})
116
119
 
120
+ tag_specs = [{"tagName": tag} for tag in tags or []]
121
+
117
122
  """Returns the server artifact."""
118
123
  self._server_artifact, latest = self._api.create_artifact(
119
124
  type,
@@ -122,6 +127,7 @@ class ArtifactSaver:
122
127
  metadata=metadata,
123
128
  ttl_duration_seconds=ttl_duration_seconds,
124
129
  aliases=alias_specs,
130
+ tags=tag_specs,
125
131
  description=description,
126
132
  is_user_created=self._is_user_created,
127
133
  distributed_id=distributed_id,
@@ -519,6 +519,7 @@ class InterfaceBase:
519
519
  run: "Run",
520
520
  artifact: "Artifact",
521
521
  aliases: Iterable[str],
522
+ tags: Optional[Iterable[str]] = None,
522
523
  history_step: Optional[int] = None,
523
524
  is_user_created: bool = False,
524
525
  use_after_commit: bool = False,
@@ -532,8 +533,9 @@ class InterfaceBase:
532
533
  proto_artifact.user_created = is_user_created
533
534
  proto_artifact.use_after_commit = use_after_commit
534
535
  proto_artifact.finalize = finalize
535
- for alias in aliases:
536
- proto_artifact.aliases.append(alias)
536
+
537
+ proto_artifact.aliases.extend(aliases or [])
538
+ proto_artifact.tags.extend(tags or [])
537
539
 
538
540
  log_artifact = pb.LogArtifactRequest()
539
541
  log_artifact.artifact.CopyFrom(proto_artifact)
@@ -577,6 +579,7 @@ class InterfaceBase:
577
579
  run: "Run",
578
580
  artifact: "Artifact",
579
581
  aliases: Iterable[str],
582
+ tags: Optional[Iterable[str]] = None,
580
583
  is_user_created: bool = False,
581
584
  use_after_commit: bool = False,
582
585
  finalize: bool = True,
@@ -589,8 +592,8 @@ class InterfaceBase:
589
592
  proto_artifact.user_created = is_user_created
590
593
  proto_artifact.use_after_commit = use_after_commit
591
594
  proto_artifact.finalize = finalize
592
- for alias in aliases:
593
- proto_artifact.aliases.append(alias)
595
+ proto_artifact.aliases.extend(aliases or [])
596
+ proto_artifact.tags.extend(tags or [])
594
597
  self._publish_artifact(proto_artifact)
595
598
 
596
599
  @abstractmethod
@@ -3551,7 +3551,7 @@ class Api:
3551
3551
  _id: Optional[str] = response["createArtifactType"]["artifactType"]["id"]
3552
3552
  return _id
3553
3553
 
3554
- def server_artifact_introspection(self) -> List:
3554
+ def server_artifact_introspection(self) -> List[str]:
3555
3555
  query_string = """
3556
3556
  query ProbeServerArtifact {
3557
3557
  ArtifactInfoType: __type(name:"Artifact") {
@@ -3572,7 +3572,7 @@ class Api:
3572
3572
 
3573
3573
  return self.server_artifact_fields_info
3574
3574
 
3575
- def server_create_artifact_introspection(self) -> List:
3575
+ def server_create_artifact_introspection(self) -> List[str]:
3576
3576
  query_string = """
3577
3577
  query ProbeServerCreateArtifactInput {
3578
3578
  CreateArtifactInputInfoType: __type(name:"CreateArtifactInput") {
@@ -3627,6 +3627,10 @@ class Api:
3627
3627
  types += "$ttlDurationSeconds: Int64,"
3628
3628
  values += "ttlDurationSeconds: $ttlDurationSeconds,"
3629
3629
 
3630
+ if "tags" in fields:
3631
+ types += "$tags: [TagInput!],"
3632
+ values += "tags: $tags,"
3633
+
3630
3634
  query_template = """
3631
3635
  mutation CreateArtifact(
3632
3636
  $artifactTypeName: String!,
@@ -3686,18 +3690,25 @@ class Api:
3686
3690
  metadata: Optional[Dict] = None,
3687
3691
  ttl_duration_seconds: Optional[int] = None,
3688
3692
  aliases: Optional[List[Dict[str, str]]] = None,
3693
+ tags: Optional[List[Dict[str, str]]] = None,
3689
3694
  distributed_id: Optional[str] = None,
3690
3695
  is_user_created: Optional[bool] = False,
3691
3696
  history_step: Optional[int] = None,
3692
3697
  ) -> Tuple[Dict, Dict]:
3693
3698
  fields = self.server_create_artifact_introspection()
3694
3699
  artifact_fields = self.server_artifact_introspection()
3695
- if "ttlIsInherited" not in artifact_fields and ttl_duration_seconds:
3700
+ if ("ttlIsInherited" not in artifact_fields) and ttl_duration_seconds:
3696
3701
  wandb.termwarn(
3697
3702
  "Server not compatible with setting Artifact TTLs, please upgrade the server to use Artifact TTL"
3698
3703
  )
3699
3704
  # ttlDurationSeconds is only usable if ttlIsInherited is also present
3700
3705
  ttl_duration_seconds = None
3706
+ if ("tags" not in artifact_fields) and tags:
3707
+ wandb.termwarn(
3708
+ "Server not compatible with Artifact tags. "
3709
+ "To use Artifact tags, please upgrade the server to v0.85 or higher."
3710
+ )
3711
+
3701
3712
  query_template = self._get_create_artifact_mutation(
3702
3713
  fields, history_step, distributed_id
3703
3714
  )
@@ -3706,8 +3717,6 @@ class Api:
3706
3717
  project_name = project_name or self.settings("project")
3707
3718
  if not is_user_created:
3708
3719
  run_name = run_name or self.current_run_id
3709
- if aliases is None:
3710
- aliases = []
3711
3720
 
3712
3721
  mutation = gql(query_template)
3713
3722
  response = self.gql(
@@ -3722,7 +3731,8 @@ class Api:
3722
3731
  "sequenceClientID": sequence_client_id,
3723
3732
  "digest": digest,
3724
3733
  "description": description,
3725
- "aliases": [alias for alias in aliases],
3734
+ "aliases": list(aliases or []),
3735
+ "tags": list(tags or []),
3726
3736
  "metadata": json.dumps(util.make_safe_for_json(metadata))
3727
3737
  if metadata
3728
3738
  else None,
@@ -1589,6 +1589,7 @@ class SendManager:
1589
1589
  ttl_duration_seconds=artifact.ttl_duration_seconds or None,
1590
1590
  description=artifact.description or None,
1591
1591
  aliases=artifact.aliases,
1592
+ tags=artifact.tags,
1592
1593
  use_after_commit=artifact.use_after_commit,
1593
1594
  distributed_id=artifact.distributed_id,
1594
1595
  finalize=artifact.finalize,
@@ -183,8 +183,17 @@ class GPUAMD:
183
183
 
184
184
  can_read_rocm_smi = False
185
185
  try:
186
- if parse_stats(get_rocm_smi_stats()):
187
- can_read_rocm_smi = True
186
+ # try to read stats from rocm-smi and parse them
187
+ raw_stats = get_rocm_smi_stats()
188
+ card_keys = [
189
+ key for key in sorted(raw_stats.keys()) if key.startswith("card")
190
+ ]
191
+
192
+ for card_key in card_keys:
193
+ card_stats = raw_stats[card_key]
194
+ parse_stats(card_stats)
195
+
196
+ can_read_rocm_smi = True
188
197
  except Exception:
189
198
  pass
190
199
 
@@ -141,9 +141,9 @@ def _replace_refs_and_allofs(schema: dict, defs: Optional[dict]) -> dict:
141
141
  ret: Dict[str, Any] = {}
142
142
  if "$ref" in schema and defs:
143
143
  # Reference found, replace it with its definition
144
- def_key = schema["$ref"].split("#/$defs/")[1]
144
+ def_key = schema.pop("$ref").split("#/$defs/")[1]
145
145
  # Also run recursive replacement in case a ref contains more refs
146
- return _replace_refs_and_allofs(defs.pop(def_key), defs)
146
+ ret = _replace_refs_and_allofs(defs.pop(def_key), defs)
147
147
  for key, val in schema.items():
148
148
  if isinstance(val, dict):
149
149
  # Step into dicts recursively
@@ -1,5 +1,4 @@
1
- # DO NOT EDIT -- GENERATED BY: `generate-tool.py --generate`wandb: WARNING The setting `_stats_sample_rate_seconds` is deprecated in favor of _stats_sampling_interval.
2
-
1
+ # DO NOT EDIT -- GENERATED BY: `generate-tool.py --generate`
3
2
  __all__ = ("SETTINGS_TOPOLOGICALLY_SORTED", "_Setting")
4
3
 
5
4
  import sys
@@ -63,7 +62,6 @@ _Setting = Literal[
63
62
  "_proxies",
64
63
  "_python",
65
64
  "_runqueue_item_id",
66
- "_require_core",
67
65
  "_require_legacy_service",
68
66
  "_save_requirements",
69
67
  "_service_transport",
@@ -199,7 +199,6 @@ class SockAcceptThread(threading.Thread):
199
199
  self._clients = ClientDict()
200
200
 
201
201
  def run(self) -> None:
202
- self._sock.listen(5)
203
202
  read_threads = []
204
203
 
205
204
  while not self._stopped.is_set():
@@ -254,6 +253,7 @@ class SocketServer:
254
253
 
255
254
  def start(self) -> None:
256
255
  self._bind()
256
+ self._sock.listen(5)
257
257
  self._thread = SockAcceptThread(sock=self._sock, mux=self._mux)
258
258
  self._thread.start()
259
259
  # Note: Uncomment to figure out what thread is not exiting properly
@@ -18,7 +18,6 @@ from wandb import _sentry, termlog
18
18
  from wandb.env import (
19
19
  core_debug,
20
20
  core_error_reporting_enabled,
21
- is_require_core,
22
21
  is_require_legacy_service,
23
22
  )
24
23
  from wandb.errors import Error, WandbCoreNotAvailableError
@@ -169,7 +168,7 @@ class _Service:
169
168
 
170
169
  service_args = []
171
170
 
172
- if is_require_core() and not is_require_legacy_service():
171
+ if not is_require_legacy_service():
173
172
  try:
174
173
  core_path = get_core_path()
175
174
  except WandbCoreNotAvailableError as e: