wandb 0.22.1__py3-none-win32.whl → 0.22.2__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.
Files changed (49) hide show
  1. wandb/__init__.py +1 -1
  2. wandb/__init__.pyi +6 -3
  3. wandb/bin/gpu_stats.exe +0 -0
  4. wandb/bin/wandb-core +0 -0
  5. wandb/cli/beta.py +16 -2
  6. wandb/cli/beta_leet.py +74 -0
  7. wandb/cli/cli.py +34 -7
  8. wandb/proto/v3/wandb_api_pb2.py +86 -0
  9. wandb/proto/v3/wandb_internal_pb2.py +352 -351
  10. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  11. wandb/proto/v4/wandb_api_pb2.py +37 -0
  12. wandb/proto/v4/wandb_internal_pb2.py +352 -351
  13. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  14. wandb/proto/v5/wandb_api_pb2.py +38 -0
  15. wandb/proto/v5/wandb_internal_pb2.py +352 -351
  16. wandb/proto/v5/wandb_settings_pb2.py +2 -2
  17. wandb/proto/v6/wandb_api_pb2.py +48 -0
  18. wandb/proto/v6/wandb_internal_pb2.py +352 -351
  19. wandb/proto/v6/wandb_settings_pb2.py +2 -2
  20. wandb/proto/wandb_api_pb2.py +18 -0
  21. wandb/proto/wandb_generate_proto.py +1 -0
  22. wandb/sdk/artifacts/artifact.py +30 -30
  23. wandb/sdk/artifacts/artifact_manifest_entry.py +6 -12
  24. wandb/sdk/artifacts/storage_handler.py +18 -12
  25. wandb/sdk/artifacts/storage_handlers/azure_handler.py +11 -6
  26. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +9 -6
  27. wandb/sdk/artifacts/storage_handlers/http_handler.py +9 -4
  28. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +10 -6
  29. wandb/sdk/artifacts/storage_handlers/multi_handler.py +5 -4
  30. wandb/sdk/artifacts/storage_handlers/s3_handler.py +10 -8
  31. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +6 -4
  32. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +24 -21
  33. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +4 -2
  34. wandb/sdk/artifacts/storage_policies/_multipart.py +187 -0
  35. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +61 -242
  36. wandb/sdk/artifacts/storage_policy.py +25 -12
  37. wandb/sdk/data_types/object_3d.py +67 -2
  38. wandb/sdk/internal/job_builder.py +27 -10
  39. wandb/sdk/internal/sender.py +4 -1
  40. wandb/sdk/launch/create_job.py +2 -1
  41. wandb/sdk/lib/progress.py +1 -70
  42. wandb/sdk/wandb_init.py +1 -1
  43. wandb/sdk/wandb_run.py +5 -2
  44. wandb/sdk/wandb_settings.py +13 -12
  45. {wandb-0.22.1.dist-info → wandb-0.22.2.dist-info}/METADATA +1 -1
  46. {wandb-0.22.1.dist-info → wandb-0.22.2.dist-info}/RECORD +49 -42
  47. {wandb-0.22.1.dist-info → wandb-0.22.2.dist-info}/WHEEL +0 -0
  48. {wandb-0.22.1.dist-info → wandb-0.22.2.dist-info}/entry_points.txt +0 -0
  49. {wandb-0.22.1.dist-info → wandb-0.22.2.dist-info}/licenses/LICENSE +0 -0
@@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
25
25
  from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
26
26
 
27
27
 
28
- 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\"\x1d\n\x0cListIntValue\x12\r\n\x05value\x18\x01 \x03(\x05\"\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\"\x99N\n\x08Settings\x12-\n\x07\x61pi_key\x18\x37 \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\x39\n\x14insecure_disable_ssl\x18\xb9\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08_offline\x18\x1e \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06x_sync\x18\x1f \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\tsync_file\x18\x86\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\x33\n\x0corganization\x18\xbc\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cx_start_time\x18) \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12.\n\x08root_dir\x18i \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\x32\n\x0bx_files_dir\x18\xb4\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0cignore_globs\x18N \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12.\n\x08\x62\x61se_url\x18\x39 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17x_file_stream_max_bytes\x18\xac\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x46\n\x1fx_file_stream_transmit_interval\x18\xaf\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x45\n\x14x_extra_http_headers\x18\x0e \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12=\n\x17x_file_stream_retry_max\x18\x93\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12K\n$x_file_stream_retry_wait_min_seconds\x18\x94\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12K\n$x_file_stream_retry_wait_max_seconds\x18\x95\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x43\n\x1dx_file_stream_timeout_seconds\x18\x0f \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x42\n\x1cx_file_stream_max_line_bytes\x18\xb2\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12?\n\x19x_file_transfer_retry_max\x18\x96\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12M\n&x_file_transfer_retry_wait_min_seconds\x18\x97\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12M\n&x_file_transfer_retry_wait_max_seconds\x18\x98\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x46\n\x1fx_file_transfer_timeout_seconds\x18\x99\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x39\n\x13x_graphql_retry_max\x18\x9a\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12G\n x_graphql_retry_wait_min_seconds\x18\x9b\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12G\n x_graphql_retry_wait_max_seconds\x18\x9c\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12@\n\x19x_graphql_timeout_seconds\x18\x9d\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\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\tx_proxies\x18\xc8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\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\x37\n\x10_code_path_local\x18\xa3\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x0fprogram_abspath\x18\x9f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x05_args\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12)\n\x03_os\x18 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06\x64ocker\x18\x43 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cx_executable\x18\r \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07_python\x18\" \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tcolab_url\x18\xa0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04host\x18M \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08username\x18\x8d\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x05\x65mail\x18\x44 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06resume\x18\x66 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0bresume_from\x18\xa7\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12-\n\tfork_from\x18\xa4\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12\x38\n\x14\x64isable_job_creation\x18\x41 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\tsweep_url\x18\x83\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12;\n\x16x_disable_update_check\x18\xa5\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0ex_disable_meta\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tsave_code\x18s \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0b\x64isable_git\x18? \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12;\n\x16x_disable_machine_info\x18\x9e\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0fx_disable_stats\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x13x_stats_buffer_size\x18\xa1\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12@\n\x19x_stats_sampling_interval\x18\xae\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x30\n\x0bx_stats_pid\x18* \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12<\n\x12x_stats_disk_paths\x18\x92\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12H\n\"x_stats_neuron_monitor_config_path\x18. \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12<\n\x15x_stats_dcgm_exporter\x18\xbb\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12O\n\x1ex_stats_open_metrics_endpoints\x18/ \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12H\n\x1cx_stats_open_metrics_filters\x18\x30 \x01(\x0b\x32\".wandb_internal.OpenMetricsFilters\x12S\n!x_stats_open_metrics_http_headers\x18\xb8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12=\n\x16x_stats_gpu_device_ids\x18\xba\x01 \x01(\x0b\x32\x1c.wandb_internal.ListIntValue\x12\x37\n\x11x_stats_cpu_count\x18\xc2\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12?\n\x19x_stats_cpu_logical_count\x18\xc3\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x37\n\x11x_stats_gpu_count\x18\xc4\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x37\n\x10x_stats_gpu_type\x18\xc5\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12?\n\x1ax_stats_track_process_tree\x18\xc6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\x07x_label\x18\xb5\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\tx_primary\x18\xb6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x15x_update_finish_state\x18\xb7\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17\x61llow_offline_artifacts\x18\xb1\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\x07\x63onsole\x18< \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11\x63onsole_multipart\x18\xa6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x35\n\x10sync_tensorboard\x18\xb3\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x42\n\x1dx_server_side_derived_summary\x18\xbd\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x46\n!x_server_side_expand_glob_metrics\x18\xbe\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12;\n\x16x_skip_transaction_log\x18\xbf\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12J\n#x_stats_coreweave_metadata_base_url\x18\xc0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12J\n#x_stats_coreweave_metadata_endpoint\x18\xc1\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0b_aws_lambda\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0fx_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\x34\n\x10x_disable_viewer\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x15x_flow_control_custom\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12;\n\x17x_flow_control_disabled\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12>\n\x18x_internal_check_process\x18\x12 \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\x34\n\x0ex_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\x18x_live_policy_rate_limit\x18\x18 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12<\n\x17x_live_policy_wait_time\x18\x19 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x30\n\x0bx_log_level\x18\x1a \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x35\n\x10x_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\t_platform\x18! \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12x_runqueue_item_id\x18# \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x13x_save_requirements\x18% \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x13x_service_transport\x18& \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0ex_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\x33\n\r_tmp_code_dir\x18\x31 \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\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\x31\n\rdisable_hints\x18@ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08\x64isabled\x18\x42 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\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\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\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\x07relogin\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\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\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\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,\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:\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\x30\n\twandb_dir\x18\x8e\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0ex_jupyter_name\x18\x8f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0ex_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.StringValueJ\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\x0c\x10\rJ\x04\x08\x13\x10\x14J\x04\x08$\x10%J\x04\x08+\x10,J\x04\x08,\x10-J\x04\x08-\x10.J\x04\x08\x32\x10\x33J\x04\x08\x33\x10\x34J\x04\x08[\x10\\J\x04\x08^\x10_J\x04\x08\x64\x10\x65J\x06\x08\x88\x01\x10\x89\x01J\x06\x08\x89\x01\x10\x8a\x01J\x06\x08\xad\x01\x10\xae\x01J\x06\x08\xb0\x01\x10\xb1\x01\x42\x1bZ\x19\x63ore/pkg/service_go_protob\x06proto3')
28
+ 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\"\x1d\n\x0cListIntValue\x12\r\n\x05value\x18\x01 \x03(\x05\"\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\"\xc2M\n\x08Settings\x12-\n\x07\x61pi_key\x18\x37 \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\x39\n\x14insecure_disable_ssl\x18\xb9\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08_offline\x18\x1e \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06x_sync\x18\x1f \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\tsync_file\x18\x86\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\x33\n\x0corganization\x18\xbc\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cx_start_time\x18) \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12.\n\x08root_dir\x18i \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\x35\n\x0cignore_globs\x18N \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12.\n\x08\x62\x61se_url\x18\x39 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12=\n\x17x_file_stream_max_bytes\x18\xac\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x46\n\x1fx_file_stream_transmit_interval\x18\xaf\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x45\n\x14x_extra_http_headers\x18\x0e \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12=\n\x17x_file_stream_retry_max\x18\x93\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12K\n$x_file_stream_retry_wait_min_seconds\x18\x94\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12K\n$x_file_stream_retry_wait_max_seconds\x18\x95\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x43\n\x1dx_file_stream_timeout_seconds\x18\x0f \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x42\n\x1cx_file_stream_max_line_bytes\x18\xb2\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12?\n\x19x_file_transfer_retry_max\x18\x96\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12M\n&x_file_transfer_retry_wait_min_seconds\x18\x97\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12M\n&x_file_transfer_retry_wait_max_seconds\x18\x98\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x46\n\x1fx_file_transfer_timeout_seconds\x18\x99\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x39\n\x13x_graphql_retry_max\x18\x9a\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12G\n x_graphql_retry_wait_min_seconds\x18\x9b\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12G\n x_graphql_retry_wait_max_seconds\x18\x9c\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12@\n\x19x_graphql_timeout_seconds\x18\x9d\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\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\tx_proxies\x18\xc8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\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\x37\n\x10_code_path_local\x18\xa3\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x0fprogram_abspath\x18\x9f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\x05_args\x18\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12)\n\x03_os\x18 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06\x64ocker\x18\x43 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x32\n\x0cx_executable\x18\r \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12-\n\x07_python\x18\" \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x30\n\tcolab_url\x18\xa0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12*\n\x04host\x18M \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x08username\x18\x8d\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12+\n\x05\x65mail\x18\x44 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12,\n\x06resume\x18\x66 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0bresume_from\x18\xa7\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12-\n\tfork_from\x18\xa4\x01 \x01(\x0b\x32\x19.wandb_internal.RunMoment\x12\x38\n\x14\x64isable_job_creation\x18\x41 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x30\n\tsweep_url\x18\x83\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12;\n\x16x_disable_update_check\x18\xa5\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x32\n\x0ex_disable_meta\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\tsave_code\x18s \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12/\n\x0b\x64isable_git\x18? \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12;\n\x16x_disable_machine_info\x18\x9e\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0fx_disable_stats\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x13x_stats_buffer_size\x18\xa1\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12@\n\x19x_stats_sampling_interval\x18\xae\x01 \x01(\x0b\x32\x1c.google.protobuf.DoubleValue\x12\x30\n\x0bx_stats_pid\x18* \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12<\n\x12x_stats_disk_paths\x18\x92\x01 \x01(\x0b\x32\x1f.wandb_internal.ListStringValue\x12H\n\"x_stats_neuron_monitor_config_path\x18. \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12<\n\x15x_stats_dcgm_exporter\x18\xbb\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12O\n\x1ex_stats_open_metrics_endpoints\x18/ \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12H\n\x1cx_stats_open_metrics_filters\x18\x30 \x01(\x0b\x32\".wandb_internal.OpenMetricsFilters\x12S\n!x_stats_open_metrics_http_headers\x18\xb8\x01 \x01(\x0b\x32\'.wandb_internal.MapStringKeyStringValue\x12=\n\x16x_stats_gpu_device_ids\x18\xba\x01 \x01(\x0b\x32\x1c.wandb_internal.ListIntValue\x12\x37\n\x11x_stats_cpu_count\x18\xc2\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12?\n\x19x_stats_cpu_logical_count\x18\xc3\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x37\n\x11x_stats_gpu_count\x18\xc4\x01 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x37\n\x10x_stats_gpu_type\x18\xc5\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12?\n\x1ax_stats_track_process_tree\x18\xc6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12.\n\x07x_label\x18\xb5\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12.\n\tx_primary\x18\xb6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12:\n\x15x_update_finish_state\x18\xb7\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12<\n\x17\x61llow_offline_artifacts\x18\xb1\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12-\n\x07\x63onsole\x18< \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x36\n\x11\x63onsole_multipart\x18\xa6\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x35\n\x10sync_tensorboard\x18\xb3\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x42\n\x1dx_server_side_derived_summary\x18\xbd\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x46\n!x_server_side_expand_glob_metrics\x18\xbe\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12;\n\x16x_skip_transaction_log\x18\xbf\x01 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12J\n#x_stats_coreweave_metadata_base_url\x18\xc0\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12J\n#x_stats_coreweave_metadata_endpoint\x18\xc1\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12/\n\x0b_aws_lambda\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x33\n\x0fx_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\x34\n\x10x_disable_viewer\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x15x_flow_control_custom\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12;\n\x17x_flow_control_disabled\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12>\n\x18x_internal_check_process\x18\x12 \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\x34\n\x0ex_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\x18x_live_policy_rate_limit\x18\x18 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12<\n\x17x_live_policy_wait_time\x18\x19 \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x30\n\x0bx_log_level\x18\x1a \x01(\x0b\x32\x1b.google.protobuf.Int32Value\x12\x35\n\x10x_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\t_platform\x18! \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x38\n\x12x_runqueue_item_id\x18# \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x37\n\x13x_save_requirements\x18% \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x39\n\x13x_service_transport\x18& \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x34\n\x0ex_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\x33\n\r_tmp_code_dir\x18\x31 \x01(\x0b\x32\x1c.google.protobuf.StringValue\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\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\x31\n\rdisable_hints\x18@ \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12,\n\x08\x64isabled\x18\x42 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\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\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\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\x07relogin\x18\x65 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\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\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\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,\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:\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\x30\n\twandb_dir\x18\x8e\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0ex_jupyter_name\x18\x8f\x01 \x01(\x0b\x32\x1c.google.protobuf.StringValue\x12\x35\n\x0ex_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.StringValueJ\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\x0c\x10\rJ\x04\x08\x13\x10\x14J\x04\x08$\x10%J\x04\x08+\x10,J\x04\x08,\x10-J\x04\x08-\x10.J\x04\x08\x32\x10\x33J\x04\x08\x33\x10\x34J\x04\x08\x46\x10GJ\x04\x08[\x10\\J\x04\x08^\x10_J\x04\x08\x64\x10\x65J\x06\x08\x88\x01\x10\x89\x01J\x06\x08\x89\x01\x10\x8a\x01J\x06\x08\xad\x01\x10\xae\x01J\x06\x08\xb0\x01\x10\xb1\x01J\x06\x08\xb4\x01\x10\xb5\x01\x42\x1bZ\x19\x63ore/pkg/service_go_protob\x06proto3')
29
29
 
30
30
  _globals = globals()
31
31
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -54,5 +54,5 @@ if not _descriptor._USE_C_DESCRIPTORS:
54
54
  _globals['_RUNMOMENT']._serialized_start=653
55
55
  _globals['_RUNMOMENT']._serialized_end=708
56
56
  _globals['_SETTINGS']._serialized_start=711
57
- _globals['_SETTINGS']._serialized_end=10720
57
+ _globals['_SETTINGS']._serialized_end=10633
58
58
  # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,18 @@
1
+ import google.protobuf
2
+
3
+ protobuf_version = google.protobuf.__version__[0]
4
+
5
+ if protobuf_version == "3":
6
+ from wandb.proto.v3.wandb_api_pb2 import *
7
+ elif protobuf_version == "4":
8
+ from wandb.proto.v4.wandb_api_pb2 import *
9
+ elif protobuf_version == "5":
10
+ from wandb.proto.v5.wandb_api_pb2 import *
11
+ elif protobuf_version == "6":
12
+ from wandb.proto.v6.wandb_api_pb2 import *
13
+ else:
14
+ raise ImportError(
15
+ "Failed to import protobufs for protobuf version"
16
+ f" {google.protobuf.__version__}. `wandb` only works with major"
17
+ " versions 3, 4, 5, and 6 of the protobuf package.",
18
+ )
@@ -28,6 +28,7 @@ for proto_file in [
28
28
  "wandb_telemetry.proto",
29
29
  "wandb_server.proto",
30
30
  "wandb_sync.proto",
31
+ "wandb_api.proto",
31
32
  ]:
32
33
  ret = protoc.main(
33
34
  (
@@ -3,7 +3,6 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import atexit
6
- import concurrent.futures
7
6
  import contextlib
8
7
  import json
9
8
  import logging
@@ -15,10 +14,10 @@ import stat
15
14
  import tempfile
16
15
  import time
17
16
  from collections import deque
17
+ from concurrent.futures import Executor, ThreadPoolExecutor, as_completed
18
18
  from copy import copy
19
19
  from dataclasses import asdict, dataclass, replace
20
20
  from datetime import timedelta
21
- from functools import partial
22
21
  from itertools import filterfalse
23
22
  from pathlib import Path, PurePosixPath
24
23
  from typing import (
@@ -50,6 +49,7 @@ from wandb.errors.term import termerror, termlog, termwarn
50
49
  from wandb.proto import wandb_internal_pb2 as pb
51
50
  from wandb.proto.wandb_deprecated import Deprecated
52
51
  from wandb.sdk import wandb_setup
52
+ from wandb.sdk.artifacts.storage_policies._multipart import should_multipart_download
53
53
  from wandb.sdk.data_types._dtypes import Type as WBType
54
54
  from wandb.sdk.data_types._dtypes import TypeRegistry
55
55
  from wandb.sdk.internal.internal_api import Api as InternalApi
@@ -2046,24 +2046,14 @@ class Artifact:
2046
2046
 
2047
2047
  download_logger = ArtifactDownloadLogger(nfiles=nfiles)
2048
2048
 
2049
- def _download_entry(
2050
- entry: ArtifactManifestEntry,
2051
- executor: concurrent.futures.Executor,
2052
- api_key: str | None,
2053
- cookies: dict | None,
2054
- headers: dict | None,
2055
- ) -> None:
2056
- _thread_local_api_settings.api_key = api_key
2057
- _thread_local_api_settings.cookies = cookies
2058
- _thread_local_api_settings.headers = headers
2059
-
2049
+ def _download_entry(entry: ArtifactManifestEntry, executor: Executor) -> None:
2050
+ multipart_executor = (
2051
+ executor
2052
+ if should_multipart_download(entry.size, override=multipart)
2053
+ else None
2054
+ )
2060
2055
  try:
2061
- entry.download(
2062
- root,
2063
- skip_cache=skip_cache,
2064
- executor=executor,
2065
- multipart=multipart,
2066
- )
2056
+ entry.download(root, skip_cache=skip_cache, executor=multipart_executor)
2067
2057
  except FileNotFoundError as e:
2068
2058
  if allow_missing_references:
2069
2059
  wandb.termwarn(str(e))
@@ -2074,15 +2064,23 @@ class Artifact:
2074
2064
  return
2075
2065
  download_logger.notify_downloaded()
2076
2066
 
2077
- with concurrent.futures.ThreadPoolExecutor(64) as executor:
2078
- download_entry = partial(
2079
- _download_entry,
2080
- executor=executor,
2081
- api_key=_thread_local_api_settings.api_key,
2082
- cookies=_thread_local_api_settings.cookies,
2083
- headers=_thread_local_api_settings.headers,
2084
- )
2067
+ def _init_thread(
2068
+ api_key: str | None, cookies: dict | None, headers: dict | None
2069
+ ) -> None:
2070
+ """Initialize the thread-local API settings in the CURRENT thread."""
2071
+ _thread_local_api_settings.api_key = api_key
2072
+ _thread_local_api_settings.cookies = cookies
2073
+ _thread_local_api_settings.headers = headers
2085
2074
 
2075
+ with ThreadPoolExecutor(
2076
+ max_workers=64,
2077
+ initializer=_init_thread,
2078
+ initargs=(
2079
+ _thread_local_api_settings.api_key,
2080
+ _thread_local_api_settings.cookies,
2081
+ _thread_local_api_settings.headers,
2082
+ ),
2083
+ ) as executor:
2086
2084
  batch_size = env.get_artifact_fetch_file_url_batch_size()
2087
2085
 
2088
2086
  active_futures = set()
@@ -2103,7 +2101,9 @@ class Artifact:
2103
2101
  # continue
2104
2102
  entry._download_url = node.direct_url
2105
2103
  if (not path_prefix) or entry.path.startswith(str(path_prefix)):
2106
- active_futures.add(executor.submit(download_entry, entry))
2104
+ active_futures.add(
2105
+ executor.submit(_download_entry, entry, executor=executor)
2106
+ )
2107
2107
 
2108
2108
  # Wait for download threads to catch up.
2109
2109
  #
@@ -2118,14 +2118,14 @@ class Artifact:
2118
2118
  # Consider this for a future change, or (depending on risk and risk tolerance)
2119
2119
  # managing this logic via asyncio instead, if viable.
2120
2120
  if len(active_futures) > batch_size:
2121
- for future in concurrent.futures.as_completed(active_futures):
2121
+ for future in as_completed(active_futures):
2122
2122
  future.result() # check for errors
2123
2123
  active_futures.remove(future)
2124
2124
  if len(active_futures) <= batch_size:
2125
2125
  break
2126
2126
 
2127
2127
  # Check for errors.
2128
- for future in concurrent.futures.as_completed(active_futures):
2128
+ for future in as_completed(active_futures):
2129
2129
  future.result()
2130
2130
 
2131
2131
  if log:
@@ -182,7 +182,6 @@ class ArtifactManifestEntry:
182
182
  root: str | None = None,
183
183
  skip_cache: bool | None = None,
184
184
  executor: concurrent.futures.Executor | None = None,
185
- multipart: bool | None = None,
186
185
  ) -> FilePathStr:
187
186
  """Download this artifact entry to the specified root path.
188
187
 
@@ -193,11 +192,10 @@ class ArtifactManifestEntry:
193
192
  Returns:
194
193
  (str): The path of the downloaded artifact entry.
195
194
  """
196
- if self._parent_artifact is None:
197
- raise NotImplementedError
195
+ artifact = self.parent_artifact()
198
196
 
199
- root = root or self._parent_artifact._default_root()
200
- self._parent_artifact._add_download_root(root)
197
+ root = root or artifact._default_root()
198
+ artifact._add_download_root(root)
201
199
  path = str(Path(self.path))
202
200
  dest_path = os.path.join(root, path)
203
201
 
@@ -225,16 +223,12 @@ class ArtifactManifestEntry:
225
223
  return FilePathStr(dest_path)
226
224
 
227
225
  if self.ref is not None:
228
- cache_path = self._parent_artifact.manifest.storage_policy.load_reference(
226
+ cache_path = artifact.manifest.storage_policy.load_reference(
229
227
  self, local=True, dest_path=override_cache_path
230
228
  )
231
229
  else:
232
- cache_path = self._parent_artifact.manifest.storage_policy.load_file(
233
- self._parent_artifact,
234
- self,
235
- dest_path=override_cache_path,
236
- executor=executor,
237
- multipart=multipart,
230
+ cache_path = artifact.manifest.storage_policy.load_file(
231
+ artifact, self, dest_path=override_cache_path, executor=executor
238
232
  )
239
233
 
240
234
  # Determine the final path
@@ -2,7 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Sequence
5
+ from abc import ABC, abstractmethod
6
+ from typing import TYPE_CHECKING, Final
6
7
 
7
8
  from wandb.sdk.lib.paths import FilePathStr, URIStr
8
9
 
@@ -12,18 +13,11 @@ if TYPE_CHECKING:
12
13
  from wandb.sdk.artifacts.artifact import Artifact
13
14
  from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
14
15
 
15
- DEFAULT_MAX_OBJECTS = 10**7
16
+ DEFAULT_MAX_OBJECTS: Final[int] = 10_000_000 # 10**7
16
17
 
17
18
 
18
- class StorageHandler:
19
- def can_handle(self, parsed_url: ParseResult) -> bool:
20
- """Checks whether this handler can handle the given url.
21
-
22
- Returns:
23
- Whether this handler can handle the given url.
24
- """
25
- raise NotImplementedError
26
-
19
+ class _BaseStorageHandler(ABC):
20
+ @abstractmethod
27
21
  def load_path(
28
22
  self,
29
23
  manifest_entry: ArtifactManifestEntry,
@@ -40,6 +34,7 @@ class StorageHandler:
40
34
  """
41
35
  raise NotImplementedError
42
36
 
37
+ @abstractmethod
43
38
  def store_path(
44
39
  self,
45
40
  artifact: Artifact,
@@ -47,7 +42,7 @@ class StorageHandler:
47
42
  name: str | None = None,
48
43
  checksum: bool = True,
49
44
  max_objects: int | None = None,
50
- ) -> Sequence[ArtifactManifestEntry]:
45
+ ) -> list[ArtifactManifestEntry]:
51
46
  """Store the file or directory at the given path to the specified artifact.
52
47
 
53
48
  Args:
@@ -60,3 +55,14 @@ class StorageHandler:
60
55
  A list of manifest entries to store within the artifact
61
56
  """
62
57
  raise NotImplementedError
58
+
59
+
60
+ class StorageHandler(_BaseStorageHandler, ABC): # Handles a single storage protocol
61
+ @abstractmethod
62
+ def can_handle(self, parsed_url: ParseResult) -> bool:
63
+ """Checks whether this handler can handle the given url.
64
+
65
+ Returns:
66
+ Whether this handler can handle the given url.
67
+ """
68
+ raise NotImplementedError
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from pathlib import PurePosixPath
6
6
  from types import ModuleType
7
- from typing import TYPE_CHECKING, Sequence
7
+ from typing import TYPE_CHECKING
8
8
  from urllib.parse import ParseResult, parse_qsl, urlparse
9
9
 
10
10
  import wandb
@@ -20,17 +20,22 @@ if TYPE_CHECKING:
20
20
  import azure.storage.blob # type: ignore
21
21
 
22
22
  from wandb.sdk.artifacts.artifact import Artifact
23
+ from wandb.sdk.artifacts.artifact_file_cache import ArtifactFileCache
23
24
 
24
25
 
25
26
  class AzureHandler(StorageHandler):
27
+ _scheme: str
28
+ _cache: ArtifactFileCache
29
+
30
+ def __init__(self, scheme: str = "https") -> None:
31
+ self._scheme = scheme
32
+ self._cache = get_artifact_file_cache()
33
+
26
34
  def can_handle(self, parsed_url: ParseResult) -> bool:
27
- return parsed_url.scheme == "https" and parsed_url.netloc.endswith(
35
+ return parsed_url.scheme == self._scheme and parsed_url.netloc.endswith(
28
36
  ".blob.core.windows.net"
29
37
  )
30
38
 
31
- def __init__(self, scheme: str | None = None) -> None:
32
- self._cache = get_artifact_file_cache()
33
-
34
39
  def load_path(
35
40
  self,
36
41
  manifest_entry: ArtifactManifestEntry,
@@ -101,7 +106,7 @@ class AzureHandler(StorageHandler):
101
106
  name: StrPath | None = None,
102
107
  checksum: bool = True,
103
108
  max_objects: int | None = None,
104
- ) -> Sequence[ArtifactManifestEntry]:
109
+ ) -> list[ArtifactManifestEntry]:
105
110
  account_url, container_name, blob_name, query = self._parse_uri(path)
106
111
  path = URIStr(f"{account_url}/{container_name}/{blob_name}")
107
112
 
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import time
6
6
  from pathlib import PurePosixPath
7
- from typing import TYPE_CHECKING, Sequence
7
+ from typing import TYPE_CHECKING
8
8
  from urllib.parse import ParseResult, urlparse
9
9
 
10
10
  from wandb import util
@@ -19,6 +19,7 @@ if TYPE_CHECKING:
19
19
  import google.cloud.storage as gcs_module # type: ignore
20
20
 
21
21
  from wandb.sdk.artifacts.artifact import Artifact
22
+ from wandb.sdk.artifacts.artifact_file_cache import ArtifactFileCache
22
23
 
23
24
 
24
25
  class _GCSIsADirectoryError(Exception):
@@ -26,10 +27,12 @@ class _GCSIsADirectoryError(Exception):
26
27
 
27
28
 
28
29
  class GCSHandler(StorageHandler):
30
+ _scheme: str
29
31
  _client: gcs_module.client.Client | None
32
+ _cache: ArtifactFileCache
30
33
 
31
- def __init__(self, scheme: str | None = None) -> None:
32
- self._scheme = scheme or "gs"
34
+ def __init__(self, scheme: str = "gs") -> None:
35
+ self._scheme = scheme
33
36
  self._client = None
34
37
  self._cache = get_artifact_file_cache()
35
38
 
@@ -111,7 +114,7 @@ class GCSHandler(StorageHandler):
111
114
  name: StrPath | None = None,
112
115
  checksum: bool = True,
113
116
  max_objects: int | None = None,
114
- ) -> Sequence[ArtifactManifestEntry]:
117
+ ) -> list[ArtifactManifestEntry]:
115
118
  self.init_gcs()
116
119
  assert self._client is not None # mypy: unwraps optionality
117
120
 
@@ -131,7 +134,7 @@ class GCSHandler(StorageHandler):
131
134
  raise ValueError(f"Object does not exist: {path}#{version}")
132
135
  multi = obj is None
133
136
  if multi:
134
- start_time = time.time()
137
+ start_time = time.monotonic()
135
138
  termlog(
136
139
  f'Generating checksum for up to {max_objects} objects with prefix "{key}"... ',
137
140
  newline=False,
@@ -148,7 +151,7 @@ class GCSHandler(StorageHandler):
148
151
  if not obj.name.endswith("/")
149
152
  ]
150
153
  if start_time is not None:
151
- termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
154
+ termlog("Done. %.1fs" % (time.monotonic() - start_time), prefix=False)
152
155
  if len(entries) > max_objects:
153
156
  raise ValueError(
154
157
  f"Exceeded {max_objects} objects tracked, pass max_objects to add_reference"
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
- from typing import TYPE_CHECKING, Sequence
6
+ from typing import TYPE_CHECKING
7
7
  from urllib.parse import ParseResult
8
8
 
9
9
  from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
@@ -18,11 +18,16 @@ if TYPE_CHECKING:
18
18
  from requests.structures import CaseInsensitiveDict
19
19
 
20
20
  from wandb.sdk.artifacts.artifact import Artifact
21
+ from wandb.sdk.artifacts.artifact_file_cache import ArtifactFileCache
21
22
 
22
23
 
23
24
  class HTTPHandler(StorageHandler):
24
- def __init__(self, session: requests.Session, scheme: str | None = None) -> None:
25
- self._scheme = scheme or "http"
25
+ _scheme: str
26
+ _cache: ArtifactFileCache
27
+ _session: requests.Session
28
+
29
+ def __init__(self, session: requests.Session, scheme: str = "http") -> None:
30
+ self._scheme = scheme
26
31
  self._cache = get_artifact_file_cache()
27
32
  self._session = session
28
33
 
@@ -75,7 +80,7 @@ class HTTPHandler(StorageHandler):
75
80
  name: StrPath | None = None,
76
81
  checksum: bool = True,
77
82
  max_objects: int | None = None,
78
- ) -> Sequence[ArtifactManifestEntry]:
83
+ ) -> list[ArtifactManifestEntry]:
79
84
  name = name or os.path.basename(path)
80
85
  if not checksum:
81
86
  return [ArtifactManifestEntry(path=name, ref=path, digest=path)]
@@ -6,7 +6,7 @@ import os
6
6
  import shutil
7
7
  import time
8
8
  from pathlib import Path
9
- from typing import TYPE_CHECKING, Sequence
9
+ from typing import TYPE_CHECKING
10
10
  from urllib.parse import ParseResult
11
11
 
12
12
  from wandb import util
@@ -20,17 +20,21 @@ from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
20
20
 
21
21
  if TYPE_CHECKING:
22
22
  from wandb.sdk.artifacts.artifact import Artifact
23
+ from wandb.sdk.artifacts.artifact_file_cache import ArtifactFileCache
23
24
 
24
25
 
25
26
  class LocalFileHandler(StorageHandler):
26
27
  """Handles file:// references."""
27
28
 
28
- def __init__(self, scheme: str | None = None) -> None:
29
+ _scheme: str
30
+ _cache: ArtifactFileCache
31
+
32
+ def __init__(self, scheme: str = "file") -> None:
29
33
  """Track files or directories on a local filesystem.
30
34
 
31
35
  Expand directories to create an entry for each file contained.
32
36
  """
33
- self._scheme = scheme or "file"
37
+ self._scheme = scheme
34
38
  self._cache = get_artifact_file_cache()
35
39
 
36
40
  def can_handle(self, parsed_url: ParseResult) -> bool:
@@ -75,7 +79,7 @@ class LocalFileHandler(StorageHandler):
75
79
  name: StrPath | None = None,
76
80
  checksum: bool = True,
77
81
  max_objects: int | None = None,
78
- ) -> Sequence[ArtifactManifestEntry]:
82
+ ) -> list[ArtifactManifestEntry]:
79
83
  local_path = util.local_file_uri_to_path(path)
80
84
  max_objects = max_objects or DEFAULT_MAX_OBJECTS
81
85
  # We have a single file or directory
@@ -95,7 +99,7 @@ class LocalFileHandler(StorageHandler):
95
99
 
96
100
  if os.path.isdir(local_path):
97
101
  i = 0
98
- start_time = time.time()
102
+ start_time = time.monotonic()
99
103
  if checksum:
100
104
  termlog(
101
105
  f'Generating checksum for up to {max_objects} files in "{local_path}"... ',
@@ -126,7 +130,7 @@ class LocalFileHandler(StorageHandler):
126
130
  )
127
131
  entries.append(entry)
128
132
  if checksum:
129
- termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
133
+ termlog("Done. %.1fs" % (time.monotonic() - start_time), prefix=False)
130
134
  elif os.path.isfile(local_path):
131
135
  name = name or os.path.basename(local_path)
132
136
  entry = ArtifactManifestEntry(
@@ -2,10 +2,10 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Sequence
5
+ from typing import TYPE_CHECKING
6
6
  from urllib.parse import urlparse
7
7
 
8
- from wandb.sdk.artifacts.storage_handler import StorageHandler
8
+ from wandb.sdk.artifacts.storage_handler import StorageHandler, _BaseStorageHandler
9
9
  from wandb.sdk.lib.paths import FilePathStr, URIStr
10
10
 
11
11
  if TYPE_CHECKING:
@@ -13,8 +13,9 @@ if TYPE_CHECKING:
13
13
  from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
14
14
 
15
15
 
16
- class MultiHandler(StorageHandler):
16
+ class MultiHandler(_BaseStorageHandler):
17
17
  _handlers: list[StorageHandler]
18
+ _default_handler: StorageHandler | None
18
19
 
19
20
  def __init__(
20
21
  self,
@@ -49,7 +50,7 @@ class MultiHandler(StorageHandler):
49
50
  name: str | None = None,
50
51
  checksum: bool = True,
51
52
  max_objects: int | None = None,
52
- ) -> Sequence[ArtifactManifestEntry]:
53
+ ) -> list[ArtifactManifestEntry]:
53
54
  handler = self._get_handler(path)
54
55
  return handler.store_path(
55
56
  artifact, path, name=name, checksum=checksum, max_objects=max_objects
@@ -6,7 +6,7 @@ import os
6
6
  import re
7
7
  import time
8
8
  from pathlib import PurePosixPath
9
- from typing import TYPE_CHECKING, Sequence
9
+ from typing import TYPE_CHECKING
10
10
  from urllib.parse import parse_qsl, urlparse
11
11
 
12
12
  from wandb import util
@@ -32,16 +32,18 @@ if TYPE_CHECKING:
32
32
  import boto3.session # type: ignore
33
33
 
34
34
  from wandb.sdk.artifacts.artifact import Artifact
35
+ from wandb.sdk.artifacts.artifact_file_cache import ArtifactFileCache
35
36
 
36
37
 
37
38
  class S3Handler(StorageHandler):
38
- _s3: boto3.resources.base.ServiceResource | None
39
39
  _scheme: str
40
+ _cache: ArtifactFileCache
41
+ _s3: boto3.resources.base.ServiceResource | None
40
42
 
41
- def __init__(self, scheme: str | None = None) -> None:
42
- self._scheme = scheme or "s3"
43
- self._s3 = None
43
+ def __init__(self, scheme: str = "s3") -> None:
44
+ self._scheme = scheme
44
45
  self._cache = get_artifact_file_cache()
46
+ self._s3 = None
45
47
 
46
48
  def can_handle(self, parsed_url: ParseResult) -> bool:
47
49
  return parsed_url.scheme == self._scheme
@@ -160,7 +162,7 @@ class S3Handler(StorageHandler):
160
162
  name: StrPath | None = None,
161
163
  checksum: bool = True,
162
164
  max_objects: int | None = None,
163
- ) -> Sequence[ArtifactManifestEntry]:
165
+ ) -> list[ArtifactManifestEntry]:
164
166
  self.init_boto()
165
167
  assert self._s3 is not None # mypy: unwraps optionality
166
168
 
@@ -206,7 +208,7 @@ class S3Handler(StorageHandler):
206
208
  multi = True
207
209
 
208
210
  if multi:
209
- start_time = time.time()
211
+ start_time = time.monotonic()
210
212
  termlog(
211
213
  f'Generating checksum for up to {max_objects} objects in "{bucket}/{key}"... ',
212
214
  newline=False,
@@ -227,7 +229,7 @@ class S3Handler(StorageHandler):
227
229
  if size(obj) > 0
228
230
  ]
229
231
  if start_time is not None:
230
- termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
232
+ termlog("Done. %.1fs" % (time.monotonic() - start_time), prefix=False)
231
233
  if len(entries) > max_objects:
232
234
  raise ValueError(
233
235
  f"Exceeded {max_objects} objects tracked, pass max_objects to add_reference"