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

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: