wandb 0.20.2rc20250616__py3-none-any.whl → 0.21.0__py3-none-any.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 (71) hide show
  1. wandb/__init__.py +1 -1
  2. wandb/__init__.pyi +24 -23
  3. wandb/apis/internal.py +3 -0
  4. wandb/apis/paginator.py +17 -4
  5. wandb/apis/public/api.py +83 -2
  6. wandb/apis/public/artifacts.py +10 -8
  7. wandb/apis/public/files.py +5 -5
  8. wandb/apis/public/projects.py +44 -3
  9. wandb/apis/public/reports.py +64 -8
  10. wandb/apis/public/runs.py +16 -23
  11. wandb/automations/__init__.py +10 -10
  12. wandb/automations/_filters/run_metrics.py +0 -2
  13. wandb/automations/_utils.py +0 -2
  14. wandb/automations/actions.py +0 -2
  15. wandb/automations/automations.py +0 -2
  16. wandb/automations/events.py +0 -2
  17. wandb/bin/gpu_stats +0 -0
  18. wandb/integration/catboost/catboost.py +6 -2
  19. wandb/integration/kfp/kfp_patch.py +3 -1
  20. wandb/integration/sb3/sb3.py +3 -3
  21. wandb/integration/ultralytics/callback.py +6 -2
  22. wandb/plot/__init__.py +2 -0
  23. wandb/plot/bar.py +30 -29
  24. wandb/plot/confusion_matrix.py +75 -71
  25. wandb/plot/histogram.py +26 -25
  26. wandb/plot/line.py +33 -32
  27. wandb/plot/line_series.py +100 -103
  28. wandb/plot/pr_curve.py +33 -32
  29. wandb/plot/roc_curve.py +38 -38
  30. wandb/plot/scatter.py +27 -27
  31. wandb/proto/v3/wandb_internal_pb2.py +366 -385
  32. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  33. wandb/proto/v4/wandb_internal_pb2.py +352 -356
  34. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  35. wandb/proto/v5/wandb_internal_pb2.py +352 -356
  36. wandb/proto/v5/wandb_settings_pb2.py +2 -2
  37. wandb/proto/v6/wandb_internal_pb2.py +352 -356
  38. wandb/proto/v6/wandb_settings_pb2.py +2 -2
  39. wandb/sdk/artifacts/_generated/__init__.py +12 -1
  40. wandb/sdk/artifacts/_generated/input_types.py +20 -2
  41. wandb/sdk/artifacts/_generated/link_artifact.py +21 -0
  42. wandb/sdk/artifacts/_generated/operations.py +9 -0
  43. wandb/sdk/artifacts/_validators.py +40 -2
  44. wandb/sdk/artifacts/artifact.py +163 -21
  45. wandb/sdk/data_types/base_types/media.py +9 -7
  46. wandb/sdk/data_types/base_types/wb_value.py +6 -6
  47. wandb/sdk/data_types/saved_model.py +3 -3
  48. wandb/sdk/data_types/table.py +41 -41
  49. wandb/sdk/data_types/trace_tree.py +12 -12
  50. wandb/sdk/interface/interface.py +8 -19
  51. wandb/sdk/interface/interface_shared.py +7 -16
  52. wandb/sdk/internal/datastore.py +18 -18
  53. wandb/sdk/internal/handler.py +3 -5
  54. wandb/sdk/internal/internal_api.py +54 -0
  55. wandb/sdk/internal/sender.py +23 -3
  56. wandb/sdk/internal/sender_config.py +9 -0
  57. wandb/sdk/launch/_project_spec.py +3 -3
  58. wandb/sdk/launch/agent/agent.py +3 -3
  59. wandb/sdk/launch/agent/job_status_tracker.py +3 -1
  60. wandb/sdk/launch/utils.py +3 -3
  61. wandb/sdk/lib/console_capture.py +66 -19
  62. wandb/sdk/wandb_init.py +1 -2
  63. wandb/sdk/wandb_require.py +0 -1
  64. wandb/sdk/wandb_run.py +23 -113
  65. wandb/sdk/wandb_settings.py +234 -72
  66. {wandb-0.20.2rc20250616.dist-info → wandb-0.21.0.dist-info}/METADATA +1 -1
  67. {wandb-0.20.2rc20250616.dist-info → wandb-0.21.0.dist-info}/RECORD +70 -70
  68. wandb/sdk/wandb_metadata.py +0 -623
  69. {wandb-0.20.2rc20250616.dist-info → wandb-0.21.0.dist-info}/WHEEL +0 -0
  70. {wandb-0.20.2rc20250616.dist-info → wandb-0.21.0.dist-info}/entry_points.txt +0 -0
  71. {wandb-0.20.2rc20250616.dist-info → wandb-0.21.0.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\"\xecK\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.\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\"\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')
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=10419
57
+ _globals['_SETTINGS']._serialized_end=10720
58
58
  # @@protoc_insertion_point(module_scope)
@@ -73,7 +73,13 @@ from .fragments import (
73
73
  FilesFragmentEdgesNode,
74
74
  FilesFragmentPageInfo,
75
75
  )
76
- from .input_types import ArtifactAliasInput, ArtifactCollectionAliasInput, TagInput
76
+ from .input_types import (
77
+ ArtifactAliasInput,
78
+ ArtifactCollectionAliasInput,
79
+ LinkArtifactInput,
80
+ TagInput,
81
+ )
82
+ from .link_artifact import LinkArtifact, LinkArtifactLinkArtifact
77
83
  from .move_artifact_collection import (
78
84
  MoveArtifactCollection,
79
85
  MoveArtifactCollectionMoveArtifactSequence,
@@ -89,6 +95,7 @@ from .operations import (
89
95
  DELETE_ARTIFACT_PORTFOLIO_GQL,
90
96
  DELETE_ARTIFACT_SEQUENCE_GQL,
91
97
  FETCH_LINKED_ARTIFACTS_GQL,
98
+ LINK_ARTIFACT_GQL,
92
99
  MOVE_ARTIFACT_COLLECTION_GQL,
93
100
  PROJECT_ARTIFACT_COLLECTION_GQL,
94
101
  PROJECT_ARTIFACT_COLLECTIONS_GQL,
@@ -166,6 +173,7 @@ __all__ = [
166
173
  "DELETE_ARTIFACT_PORTFOLIO_GQL",
167
174
  "DELETE_ARTIFACT_SEQUENCE_GQL",
168
175
  "FETCH_LINKED_ARTIFACTS_GQL",
176
+ "LINK_ARTIFACT_GQL",
169
177
  "MOVE_ARTIFACT_COLLECTION_GQL",
170
178
  "PROJECT_ARTIFACTS_GQL",
171
179
  "PROJECT_ARTIFACT_COLLECTIONS_GQL",
@@ -254,8 +262,11 @@ __all__ = [
254
262
  "DeleteAliasesDeleteAliases",
255
263
  "UpdateArtifact",
256
264
  "UpdateArtifactUpdateArtifact",
265
+ "LinkArtifact",
266
+ "LinkArtifactLinkArtifact",
257
267
  "ArtifactAliasInput",
258
268
  "ArtifactCollectionAliasInput",
269
+ "LinkArtifactInput",
259
270
  "TagInput",
260
271
  "ArtifactCollectionsFragment",
261
272
  "ArtifactCollectionsFragmentEdges",
@@ -3,11 +3,11 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from typing import Any, Optional
6
+ from typing import Any, List, Optional
7
7
 
8
8
  from pydantic import Field
9
9
 
10
- from wandb._pydantic import GQLBase
10
+ from wandb._pydantic import GQLBase, GQLId
11
11
 
12
12
 
13
13
  class ArtifactAliasInput(GQLBase):
@@ -15,6 +15,21 @@ class ArtifactAliasInput(GQLBase):
15
15
  alias: str
16
16
 
17
17
 
18
+ class LinkArtifactInput(GQLBase):
19
+ artifact_id: Optional[GQLId] = Field(alias="artifactID", default=None)
20
+ artifact_portfolio_id: Optional[GQLId] = Field(
21
+ alias="artifactPortfolioID", default=None
22
+ )
23
+ artifact_portfolio_name: Optional[str] = Field(
24
+ alias="artifactPortfolioName", default=None
25
+ )
26
+ entity_name: Optional[str] = Field(alias="entityName", default=None)
27
+ project_name: Optional[str] = Field(alias="projectName", default=None)
28
+ aliases: Optional[List[ArtifactAliasInput]] = None
29
+ client_id: Optional[GQLId] = Field(alias="clientID", default=None)
30
+ client_mutation_id: Optional[str] = Field(alias="clientMutationId", default=None)
31
+
32
+
18
33
  class ArtifactCollectionAliasInput(GQLBase):
19
34
  alias: str
20
35
  entity_name: str = Field(alias="entityName")
@@ -26,3 +41,6 @@ class TagInput(GQLBase):
26
41
  tag_category_name: Optional[str] = Field(alias="tagCategoryName", default=None)
27
42
  tag_name: str = Field(alias="tagName")
28
43
  attributes: Optional[Any] = None
44
+
45
+
46
+ LinkArtifactInput.model_rebuild()
@@ -0,0 +1,21 @@
1
+ # Generated by ariadne-codegen
2
+ # Source: tools/graphql_codegen/artifacts/
3
+
4
+ from __future__ import annotations
5
+
6
+ from typing import Optional
7
+
8
+ from pydantic import Field
9
+
10
+ from wandb._pydantic import GQLBase
11
+
12
+
13
+ class LinkArtifact(GQLBase):
14
+ link_artifact: Optional[LinkArtifactLinkArtifact] = Field(alias="linkArtifact")
15
+
16
+
17
+ class LinkArtifactLinkArtifact(GQLBase):
18
+ version_index: Optional[int] = Field(alias="versionIndex")
19
+
20
+
21
+ LinkArtifact.model_rebuild()
@@ -11,6 +11,7 @@ __all__ = [
11
11
  "DELETE_ARTIFACT_PORTFOLIO_GQL",
12
12
  "DELETE_ARTIFACT_SEQUENCE_GQL",
13
13
  "FETCH_LINKED_ARTIFACTS_GQL",
14
+ "LINK_ARTIFACT_GQL",
14
15
  "MOVE_ARTIFACT_COLLECTION_GQL",
15
16
  "PROJECT_ARTIFACTS_GQL",
16
17
  "PROJECT_ARTIFACT_COLLECTIONS_GQL",
@@ -609,3 +610,11 @@ fragment ArtifactFragment on Artifact {
609
610
  updatedAt
610
611
  }
611
612
  """
613
+
614
+ LINK_ARTIFACT_GQL = """
615
+ mutation LinkArtifact($input: LinkArtifactInput!) {
616
+ linkArtifact(input: $input) {
617
+ versionIndex
618
+ }
619
+ }
620
+ """
@@ -4,9 +4,12 @@ from __future__ import annotations
4
4
 
5
5
  import json
6
6
  import re
7
- from dataclasses import dataclass, field
7
+ from dataclasses import astuple, dataclass, field, replace
8
8
  from functools import wraps
9
- from typing import TYPE_CHECKING, Any, Callable, Dict, Literal, TypeVar, cast
9
+ from typing import TYPE_CHECKING, Any, Callable, Dict, Literal, Optional, TypeVar, cast
10
+
11
+ from pydantic.dataclasses import dataclass as pydantic_dataclass
12
+ from typing_extensions import Self
10
13
 
11
14
  from wandb._iterutils import always_list
12
15
  from wandb._pydantic import gql_typename
@@ -259,3 +262,38 @@ def ensure_not_finalized(method: DecoratedF) -> DecoratedF:
259
262
 
260
263
  def is_artifact_registry_project(project: str) -> bool:
261
264
  return project.startswith(REGISTRY_PREFIX)
265
+
266
+
267
+ @pydantic_dataclass
268
+ class ArtifactPath:
269
+ #: The collection name.
270
+ name: str
271
+ #: The project name, which can also be a registry name.
272
+ project: Optional[str] = None # noqa: UP045
273
+ #: Prefix is often an org or entity name.
274
+ prefix: Optional[str] = None # noqa: UP045
275
+
276
+ @classmethod
277
+ def from_str(cls, path: str) -> Self:
278
+ """Instantiate by parsing an artifact path."""
279
+ if len(parts := path.split("/")) <= 3:
280
+ return cls(*reversed(parts))
281
+ raise ValueError(
282
+ f"Expected a valid path like `name`, `project/name`, or `prefix/project/name`. Got: {path!r}"
283
+ )
284
+
285
+ def to_str(self) -> str:
286
+ """Returns the slash-separated string representation of the path."""
287
+ return "/".join(filter(bool, reversed(astuple(self))))
288
+
289
+ def with_defaults(
290
+ self,
291
+ prefix: str | None = None,
292
+ project: str | None = None,
293
+ ) -> Self:
294
+ """Returns this path with missing values set to the given defaults."""
295
+ return replace(
296
+ self,
297
+ prefix=self.prefix or prefix,
298
+ project=self.project or project,
299
+ )
@@ -34,6 +34,7 @@ from wandb.apis.public import ArtifactCollection, ArtifactFiles, Run
34
34
  from wandb.apis.public.utils import gql_compat
35
35
  from wandb.data_types import WBValue
36
36
  from wandb.errors import CommError
37
+ from wandb.errors.errors import UnsupportedError
37
38
  from wandb.errors.term import termerror, termlog, termwarn
38
39
  from wandb.proto import wandb_internal_pb2 as pb
39
40
  from wandb.proto.wandb_deprecated import Deprecated
@@ -61,16 +62,20 @@ from ._generated import (
61
62
  ADD_ALIASES_GQL,
62
63
  DELETE_ALIASES_GQL,
63
64
  FETCH_LINKED_ARTIFACTS_GQL,
65
+ LINK_ARTIFACT_GQL,
64
66
  UPDATE_ARTIFACT_GQL,
65
67
  ArtifactAliasInput,
66
68
  ArtifactCollectionAliasInput,
67
69
  FetchLinkedArtifacts,
70
+ LinkArtifact,
71
+ LinkArtifactInput,
68
72
  TagInput,
69
73
  UpdateArtifact,
70
74
  )
71
75
  from ._graphql_fragments import _gql_artifact_fragment, omit_artifact_fields
72
76
  from ._validators import (
73
77
  LINKED_ARTIFACT_COLLECTION_TYPE,
78
+ ArtifactPath,
74
79
  _LinkArtifactFields,
75
80
  ensure_logged,
76
81
  ensure_not_finalized,
@@ -277,6 +282,87 @@ class Artifact:
277
282
  name = "{}:v{}".format(src_collection["name"], attrs["versionIndex"])
278
283
  return cls._from_attrs(entity_name, project_name, name, attrs, client)
279
284
 
285
+ @classmethod
286
+ def _membership_from_name(
287
+ cls,
288
+ *,
289
+ entity: str,
290
+ project: str,
291
+ name: str,
292
+ client: RetryingClient,
293
+ ) -> Artifact:
294
+ if not InternalApi()._server_supports(
295
+ pb.ServerFeature.PROJECT_ARTIFACT_COLLECTION_MEMBERSHIP
296
+ ):
297
+ raise UnsupportedError(
298
+ "querying for the artifact collection membership is not supported "
299
+ "by this version of wandb server. Consider updating to the latest version."
300
+ )
301
+
302
+ query = gql(
303
+ f"""
304
+ query ArtifactByName($entityName: String!, $projectName: String!, $name: String!) {{
305
+ project(name: $projectName, entityName: $entityName) {{
306
+ artifactCollectionMembership(name: $name) {{
307
+ id
308
+ artifactCollection {{
309
+ id
310
+ name
311
+ project {{
312
+ id
313
+ entityName
314
+ name
315
+ }}
316
+ }}
317
+ artifact {{
318
+ ...ArtifactFragment
319
+ }}
320
+ }}
321
+ }}
322
+ }}
323
+ {_gql_artifact_fragment()}
324
+ """
325
+ )
326
+
327
+ query_variable_values: dict[str, Any] = {
328
+ "entityName": entity,
329
+ "projectName": project,
330
+ "name": name,
331
+ }
332
+ response = client.execute(
333
+ query,
334
+ variable_values=query_variable_values,
335
+ )
336
+ if not (project_attrs := response.get("project")):
337
+ raise ValueError(f"project {project!r} not found under entity {entity!r}")
338
+ if not (acm_attrs := project_attrs.get("artifactCollectionMembership")):
339
+ entity_project = f"{entity}/{project}"
340
+ raise ValueError(
341
+ f"artifact membership {name!r} not found in {entity_project!r}"
342
+ )
343
+ if not (ac_attrs := acm_attrs.get("artifactCollection")):
344
+ raise ValueError("artifact collection not found")
345
+ if not (
346
+ (ac_name := ac_attrs.get("name"))
347
+ and (ac_project_attrs := ac_attrs.get("project"))
348
+ ):
349
+ raise ValueError("artifact collection project not found")
350
+ ac_project = ac_project_attrs.get("name")
351
+ ac_entity = ac_project_attrs.get("entityName")
352
+ if is_artifact_registry_project(ac_project) and project == "model-registry":
353
+ wandb.termwarn(
354
+ "This model registry has been migrated and will be discontinued. "
355
+ f"Your request was redirected to the corresponding artifact `{ac_name}` in the new registry. "
356
+ f"Please update your paths to point to the migrated registry directly, `{ac_project}/{ac_name}`."
357
+ )
358
+ entity = ac_entity
359
+ project = ac_project
360
+ if not (attrs := acm_attrs.get("artifact")):
361
+ entity_project = f"{entity}/{project}"
362
+ raise ValueError(f"artifact {name!r} not found in {entity_project!r}")
363
+
364
+ return cls._from_attrs(entity, project, name, attrs, client)
365
+
280
366
  @classmethod
281
367
  def _from_name(
282
368
  cls,
@@ -287,14 +373,31 @@ class Artifact:
287
373
  client: RetryingClient,
288
374
  enable_tracking: bool = False,
289
375
  ) -> Artifact:
376
+ if InternalApi()._server_supports(
377
+ pb.ServerFeature.PROJECT_ARTIFACT_COLLECTION_MEMBERSHIP
378
+ ):
379
+ return cls._membership_from_name(
380
+ entity=entity,
381
+ project=project,
382
+ name=name,
383
+ client=client,
384
+ )
385
+
386
+ query_variable_values: dict[str, Any] = {
387
+ "entityName": entity,
388
+ "projectName": project,
389
+ "name": name,
390
+ }
391
+ query_vars = ["$entityName: String!", "$projectName: String!", "$name: String!"]
392
+ query_args = ["name: $name"]
393
+
290
394
  server_supports_enabling_artifact_usage_tracking = (
291
395
  InternalApi().server_project_type_introspection()
292
396
  )
293
- query_vars = ["$entityName: String!", "$projectName: String!", "$name: String!"]
294
- query_args = ["name: $name"]
295
397
  if server_supports_enabling_artifact_usage_tracking:
296
398
  query_vars.append("$enableTracking: Boolean")
297
399
  query_args.append("enableTracking: $enableTracking")
400
+ query_variable_values["enableTracking"] = enable_tracking
298
401
 
299
402
  vars_str = ", ".join(query_vars)
300
403
  args_str = ", ".join(query_args)
@@ -311,14 +414,6 @@ class Artifact:
311
414
  {_gql_artifact_fragment()}
312
415
  """
313
416
  )
314
- query_variable_values: dict[str, Any] = {
315
- "entityName": entity,
316
- "projectName": project,
317
- "name": name,
318
- }
319
- if server_supports_enabling_artifact_usage_tracking:
320
- query_variable_values["enableTracking"] = enable_tracking
321
-
322
417
  response = client.execute(
323
418
  query,
324
419
  variable_values=query_variable_values,
@@ -329,6 +424,7 @@ class Artifact:
329
424
  attrs = project_attrs.get("artifact")
330
425
  if not attrs:
331
426
  raise ValueError(f"artifact '{name}' not found in '{entity}/{project}'")
427
+
332
428
  return cls._from_attrs(entity, project, name, attrs, client)
333
429
 
334
430
  @classmethod
@@ -2361,25 +2457,71 @@ class Artifact:
2361
2457
  Returns:
2362
2458
  The linked artifact if linking was successful, otherwise None.
2363
2459
  """
2460
+ from wandb import Api
2461
+
2364
2462
  if self.is_link:
2365
2463
  wandb.termwarn(
2366
2464
  "Linking to a link artifact will result in directly linking to the source artifact of that link artifact."
2367
2465
  )
2368
2466
 
2369
- if run := wandb_setup.singleton().most_recent_active_run:
2370
- # TODO: Deprecate and encourage explicit link_artifact().
2371
- return run.link_artifact(self, target_path, aliases)
2467
+ if self._client is None:
2468
+ raise ValueError("Client not initialized for artifact mutations")
2469
+
2470
+ # Save the artifact first if necessary
2471
+ if self.is_draft():
2472
+ if not self._is_draft_save_started():
2473
+ self.save(project=self.source_project)
2474
+
2475
+ # Wait until the artifact is committed before trying to link it.
2476
+ self.wait()
2372
2477
 
2478
+ api = Api(overrides={"entity": self.source_entity})
2479
+
2480
+ target = ArtifactPath.from_str(target_path).with_defaults(
2481
+ project=api.settings.get("project") or "uncategorized",
2482
+ )
2483
+
2484
+ # Parse the entity (first part of the path) appropriately,
2485
+ # depending on whether we're linking to a registry
2486
+ if target.project and is_artifact_registry_project(target.project):
2487
+ # In a Registry linking, the entity is used to fetch the organization of the artifact
2488
+ # therefore the source artifact's entity is passed to the backend
2489
+ organization = target.prefix or api.settings.get("organization") or ""
2490
+
2491
+ target.prefix = InternalApi()._resolve_org_entity_name(
2492
+ self.source_entity, organization
2493
+ )
2373
2494
  else:
2374
- with wandb.init(
2375
- entity=self._source_entity,
2376
- project=self._source_project,
2377
- job_type="auto",
2378
- settings=wandb.Settings(silent="true"),
2379
- ) as run:
2380
- return run.link_artifact(self, target_path, aliases)
2495
+ target = target.with_defaults(prefix=self.source_entity)
2381
2496
 
2382
- return None
2497
+ # Prepare the validated GQL input, send it
2498
+ alias_inputs = [
2499
+ ArtifactAliasInput(artifact_collection_name=target.name, alias=a)
2500
+ for a in (aliases or [])
2501
+ ]
2502
+ gql_input = LinkArtifactInput(
2503
+ artifact_id=self.id,
2504
+ artifact_portfolio_name=target.name,
2505
+ entity_name=target.prefix,
2506
+ project_name=target.project,
2507
+ aliases=alias_inputs,
2508
+ )
2509
+ gql_vars = {"input": gql_input.model_dump(exclude_none=True)}
2510
+ gql_op = gql(LINK_ARTIFACT_GQL)
2511
+ data = self._client.execute(gql_op, variable_values=gql_vars)
2512
+
2513
+ result = LinkArtifact.model_validate(data).link_artifact
2514
+ if not (result and (version_idx := result.version_index) is not None):
2515
+ raise ValueError("Unable to parse linked artifact version from response")
2516
+
2517
+ # Fetch the linked artifact to return it
2518
+ linked_path = f"{target.to_str()}:v{version_idx}"
2519
+
2520
+ try:
2521
+ return api._artifact(linked_path)
2522
+ except Exception as e:
2523
+ wandb.termerror(f"Error fetching link artifact after linking: {e}")
2524
+ return None
2383
2525
 
2384
2526
  @ensure_logged
2385
2527
  def unlink(self) -> None:
@@ -127,9 +127,9 @@ class Media(WBValue):
127
127
  self._path = path
128
128
  self._is_tmp = is_tmp
129
129
  self._extension = extension
130
- assert extension is None or path.endswith(
131
- extension
132
- ), f'Media file extension "{extension}" must occur at the end of path "{path}".'
130
+ assert extension is None or path.endswith(extension), (
131
+ f'Media file extension "{extension}" must occur at the end of path "{path}".'
132
+ )
133
133
 
134
134
  with open(self._path, "rb") as f:
135
135
  self._sha256 = hashlib.sha256(f.read()).hexdigest()
@@ -247,11 +247,13 @@ class Media(WBValue):
247
247
  json_obj["_latest_artifact_path"] = artifact_entry_latest_url
248
248
 
249
249
  if artifact_entry_url is None or self.is_bound():
250
- assert self.is_bound(), f"Value of type {type(self).__name__} must be bound to a run with bind_to_run() before being serialized to JSON."
250
+ assert self.is_bound(), (
251
+ f"Value of type {type(self).__name__} must be bound to a run with bind_to_run() before being serialized to JSON."
252
+ )
251
253
 
252
- assert (
253
- self._run is run
254
- ), "We don't support referring to media files across runs."
254
+ assert self._run is run, (
255
+ "We don't support referring to media files across runs."
256
+ )
255
257
 
256
258
  # The following two assertions are guaranteed to pass
257
259
  # by definition is_bound, but are needed for
@@ -218,17 +218,17 @@ class WBValue:
218
218
  def _set_artifact_source(
219
219
  self, artifact: "Artifact", name: Optional[str] = None
220
220
  ) -> None:
221
- assert (
222
- self._artifact_source is None
223
- ), f"Cannot update artifact_source. Existing source: {self._artifact_source.artifact}/{self._artifact_source.name}"
221
+ assert self._artifact_source is None, (
222
+ f"Cannot update artifact_source. Existing source: {self._artifact_source.artifact}/{self._artifact_source.name}"
223
+ )
224
224
  self._artifact_source = _WBValueArtifactSource(artifact, name)
225
225
 
226
226
  def _set_artifact_target(
227
227
  self, artifact: "Artifact", name: Optional[str] = None
228
228
  ) -> None:
229
- assert (
230
- self._artifact_target is None
231
- ), f"Cannot update artifact_target. Existing target: {self._artifact_target.artifact}/{self._artifact_target.name}"
229
+ assert self._artifact_target is None, (
230
+ f"Cannot update artifact_target. Existing target: {self._artifact_target.artifact}/{self._artifact_target.name}"
231
+ )
232
232
  self._artifact_target = _WBValueArtifactTarget(artifact, name)
233
233
 
234
234
  def _get_artifact_entry_ref_url(self) -> Optional[str]:
@@ -257,9 +257,9 @@ class _SavedModel(WBValue, Generic[SavedModelObjType]):
257
257
  self._model_obj = None
258
258
 
259
259
  def _set_obj(self, model_obj: Any) -> None:
260
- assert model_obj is not None and self._validate_obj(
261
- model_obj
262
- ), f"Invalid model object {model_obj}"
260
+ assert model_obj is not None and self._validate_obj(model_obj), (
261
+ f"Invalid model object {model_obj}"
262
+ )
263
263
  self._model_obj = model_obj
264
264
 
265
265
  def _dump(self, target_path: str) -> None: