wandb 0.21.0__py3-none-win32.whl → 0.21.1__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 (97) hide show
  1. wandb/__init__.py +16 -14
  2. wandb/__init__.pyi +427 -450
  3. wandb/agents/pyagent.py +41 -12
  4. wandb/analytics/sentry.py +7 -2
  5. wandb/apis/importers/mlflow.py +1 -1
  6. wandb/apis/public/__init__.py +1 -1
  7. wandb/apis/public/api.py +526 -360
  8. wandb/apis/public/artifacts.py +204 -8
  9. wandb/apis/public/automations.py +19 -3
  10. wandb/apis/public/files.py +172 -33
  11. wandb/apis/public/history.py +67 -15
  12. wandb/apis/public/integrations.py +25 -2
  13. wandb/apis/public/jobs.py +90 -2
  14. wandb/apis/public/projects.py +130 -79
  15. wandb/apis/public/query_generator.py +11 -1
  16. wandb/apis/public/registries/registries_search.py +7 -15
  17. wandb/apis/public/reports.py +83 -5
  18. wandb/apis/public/runs.py +299 -105
  19. wandb/apis/public/sweeps.py +222 -22
  20. wandb/apis/public/teams.py +41 -4
  21. wandb/apis/public/users.py +45 -4
  22. wandb/beta/workflows.py +66 -30
  23. wandb/bin/gpu_stats.exe +0 -0
  24. wandb/bin/wandb-core +0 -0
  25. wandb/cli/cli.py +80 -1
  26. wandb/env.py +8 -0
  27. wandb/errors/errors.py +4 -1
  28. wandb/integration/lightning/fabric/logger.py +3 -4
  29. wandb/integration/metaflow/__init__.py +6 -0
  30. wandb/integration/metaflow/data_pandas.py +74 -0
  31. wandb/integration/metaflow/errors.py +13 -0
  32. wandb/integration/metaflow/metaflow.py +205 -190
  33. wandb/integration/openai/fine_tuning.py +1 -2
  34. wandb/jupyter.py +5 -5
  35. wandb/plot/custom_chart.py +30 -7
  36. wandb/proto/v3/wandb_internal_pb2.py +280 -280
  37. wandb/proto/v3/wandb_telemetry_pb2.py +4 -4
  38. wandb/proto/v4/wandb_internal_pb2.py +280 -280
  39. wandb/proto/v4/wandb_telemetry_pb2.py +4 -4
  40. wandb/proto/v5/wandb_internal_pb2.py +280 -280
  41. wandb/proto/v5/wandb_telemetry_pb2.py +4 -4
  42. wandb/proto/v6/wandb_internal_pb2.py +280 -280
  43. wandb/proto/v6/wandb_telemetry_pb2.py +4 -4
  44. wandb/proto/wandb_deprecated.py +6 -0
  45. wandb/sdk/artifacts/_internal_artifact.py +19 -8
  46. wandb/sdk/artifacts/_validators.py +8 -0
  47. wandb/sdk/artifacts/artifact.py +106 -75
  48. wandb/sdk/data_types/audio.py +38 -10
  49. wandb/sdk/data_types/base_types/media.py +6 -56
  50. wandb/sdk/data_types/graph.py +48 -14
  51. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +1 -3
  52. wandb/sdk/data_types/helper_types/image_mask.py +1 -3
  53. wandb/sdk/data_types/histogram.py +34 -21
  54. wandb/sdk/data_types/html.py +35 -12
  55. wandb/sdk/data_types/image.py +104 -68
  56. wandb/sdk/data_types/molecule.py +32 -19
  57. wandb/sdk/data_types/object_3d.py +36 -17
  58. wandb/sdk/data_types/plotly.py +18 -5
  59. wandb/sdk/data_types/saved_model.py +4 -6
  60. wandb/sdk/data_types/table.py +59 -30
  61. wandb/sdk/data_types/video.py +53 -26
  62. wandb/sdk/integration_utils/auto_logging.py +2 -2
  63. wandb/sdk/internal/internal_api.py +6 -0
  64. wandb/sdk/internal/job_builder.py +6 -0
  65. wandb/sdk/launch/agent/agent.py +8 -1
  66. wandb/sdk/launch/agent/run_queue_item_file_saver.py +2 -2
  67. wandb/sdk/launch/create_job.py +3 -1
  68. wandb/sdk/launch/inputs/internal.py +3 -4
  69. wandb/sdk/launch/inputs/schema.py +1 -0
  70. wandb/sdk/launch/runner/kubernetes_monitor.py +1 -0
  71. wandb/sdk/launch/runner/kubernetes_runner.py +328 -1
  72. wandb/sdk/launch/sweeps/scheduler.py +2 -3
  73. wandb/sdk/lib/asyncio_compat.py +3 -0
  74. wandb/sdk/lib/deprecate.py +1 -7
  75. wandb/sdk/lib/disabled.py +1 -1
  76. wandb/sdk/lib/hashutil.py +14 -1
  77. wandb/sdk/lib/module.py +7 -13
  78. wandb/sdk/lib/progress.py +0 -19
  79. wandb/sdk/lib/sock_client.py +0 -4
  80. wandb/sdk/wandb_init.py +66 -91
  81. wandb/sdk/wandb_login.py +18 -14
  82. wandb/sdk/wandb_metric.py +2 -0
  83. wandb/sdk/wandb_run.py +406 -414
  84. wandb/sdk/wandb_settings.py +130 -2
  85. wandb/sdk/wandb_setup.py +28 -28
  86. wandb/sdk/wandb_sweep.py +14 -13
  87. wandb/sdk/wandb_watch.py +4 -6
  88. wandb/sync/sync.py +10 -0
  89. wandb/util.py +57 -0
  90. wandb/wandb_run.py +1 -2
  91. {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/METADATA +1 -1
  92. {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/RECORD +95 -95
  93. wandb/vendor/pynvml/__init__.py +0 -0
  94. wandb/vendor/pynvml/pynvml.py +0 -4779
  95. {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/WHEEL +0 -0
  96. {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/entry_points.txt +0 -0
  97. {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/licenses/LICENSE +0 -0
@@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
25
25
  from wandb.proto import wandb_base_pb2 as wandb_dot_proto_dot_wandb__base__pb2
26
26
 
27
27
 
28
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!wandb/proto/wandb_telemetry.proto\x12\x0ewandb_internal\x1a\x1cwandb/proto/wandb_base.proto\"\xdb\x03\n\x0fTelemetryRecord\x12-\n\x0cimports_init\x18\x01 \x01(\x0b\x32\x17.wandb_internal.Imports\x12/\n\x0eimports_finish\x18\x02 \x01(\x0b\x32\x17.wandb_internal.Imports\x12(\n\x07\x66\x65\x61ture\x18\x03 \x01(\x0b\x32\x17.wandb_internal.Feature\x12\x16\n\x0epython_version\x18\x04 \x01(\t\x12\x13\n\x0b\x63li_version\x18\x05 \x01(\t\x12\x1b\n\x13huggingface_version\x18\x06 \x01(\t\x12 \n\x03\x65nv\x18\x08 \x01(\x0b\x32\x13.wandb_internal.Env\x12%\n\x05label\x18\t \x01(\x0b\x32\x16.wandb_internal.Labels\x12.\n\ndeprecated\x18\n \x01(\x0b\x32\x1a.wandb_internal.Deprecated\x12&\n\x06issues\x18\x0b \x01(\x0b\x32\x16.wandb_internal.Issues\x12\x14\n\x0c\x63ore_version\x18\x0c \x01(\t\x12\x10\n\x08platform\x18\r \x01(\t\x12+\n\x05_info\x18\xc8\x01 \x01(\x0b\x32\x1b.wandb_internal._RecordInfo\"\x11\n\x0fTelemetryResult\"\x9a\x0e\n\x07Imports\x12\r\n\x05torch\x18\x01 \x01(\x08\x12\r\n\x05keras\x18\x02 \x01(\x08\x12\x12\n\ntensorflow\x18\x03 \x01(\x08\x12\x0e\n\x06\x66\x61stai\x18\x04 \x01(\x08\x12\x0f\n\x07sklearn\x18\x05 \x01(\x08\x12\x0f\n\x07xgboost\x18\x06 \x01(\x08\x12\x10\n\x08\x63\x61tboost\x18\x07 \x01(\x08\x12\x10\n\x08lightgbm\x18\x08 \x01(\x08\x12\x19\n\x11pytorch_lightning\x18\t \x01(\x08\x12\x0e\n\x06ignite\x18\n \x01(\x08\x12\x14\n\x0ctransformers\x18\x0b \x01(\x08\x12\x0b\n\x03jax\x18\x0c \x01(\x08\x12\x10\n\x08metaflow\x18\r \x01(\x08\x12\x10\n\x08\x61llennlp\x18\x0e \x01(\x08\x12\x11\n\tautogluon\x18\x0f \x01(\x08\x12\x11\n\tautokeras\x18\x10 \x01(\x08\x12\x10\n\x08\x63\x61talyst\x18\x12 \x01(\x08\x12\x10\n\x08\x64\x65\x65pchem\x18\x15 \x01(\x08\x12\x0f\n\x07\x64\x65\x65pctr\x18\x16 \x01(\x08\x12\x0f\n\x07pycaret\x18\x1c \x01(\x08\x12\x14\n\x0cpytorchvideo\x18\x1d \x01(\x08\x12\x0b\n\x03ray\x18\x1e \x01(\x08\x12\x1a\n\x12simpletransformers\x18\x1f \x01(\x08\x12\x0e\n\x06skorch\x18 \x01(\x08\x12\r\n\x05spacy\x18! \x01(\x08\x12\r\n\x05\x66lash\x18\" \x01(\x08\x12\x0e\n\x06optuna\x18# \x01(\x08\x12\x0f\n\x07recbole\x18$ \x01(\x08\x12\x0c\n\x04mmcv\x18% \x01(\x08\x12\r\n\x05mmdet\x18& \x01(\x08\x12\x11\n\ttorchdrug\x18\' \x01(\x08\x12\x11\n\ttorchtext\x18( \x01(\x08\x12\x13\n\x0btorchvision\x18) \x01(\x08\x12\r\n\x05\x65legy\x18* \x01(\x08\x12\x12\n\ndetectron2\x18+ \x01(\x08\x12\r\n\x05\x66lair\x18, \x01(\x08\x12\x0c\n\x04\x66lax\x18- \x01(\x08\x12\x0c\n\x04syft\x18. \x01(\x08\x12\x0b\n\x03TTS\x18/ \x01(\x08\x12\r\n\x05monai\x18\x30 \x01(\x08\x12\x17\n\x0fhuggingface_hub\x18\x31 \x01(\x08\x12\r\n\x05hydra\x18\x32 \x01(\x08\x12\x10\n\x08\x64\x61tasets\x18\x33 \x01(\x08\x12\x0e\n\x06sacred\x18\x34 \x01(\x08\x12\x0e\n\x06joblib\x18\x35 \x01(\x08\x12\x0c\n\x04\x64\x61sk\x18\x36 \x01(\x08\x12\x11\n\tpaddleocr\x18\x38 \x01(\x08\x12\r\n\x05ppdet\x18\x39 \x01(\x08\x12\x11\n\tpaddleseg\x18: \x01(\x08\x12\x11\n\tpaddlenlp\x18; \x01(\x08\x12\r\n\x05mmseg\x18< \x01(\x08\x12\r\n\x05mmocr\x18= \x01(\x08\x12\r\n\x05mmcls\x18> \x01(\x08\x12\x0c\n\x04timm\x18? \x01(\x08\x12\x0f\n\x07\x66\x61irseq\x18@ \x01(\x08\x12\x12\n\ndeepchecks\x18\x41 \x01(\x08\x12\x10\n\x08\x63omposer\x18\x42 \x01(\x08\x12\x10\n\x08sparseml\x18\x43 \x01(\x08\x12\x10\n\x08\x61nomalib\x18\x44 \x01(\x08\x12\r\n\x05zenml\x18\x45 \x01(\x08\x12\x12\n\ncolossalai\x18\x46 \x01(\x08\x12\x12\n\naccelerate\x18G \x01(\x08\x12\x0e\n\x06merlin\x18H \x01(\x08\x12\x0f\n\x07nanodet\x18I \x01(\x08\x12#\n\x1bsegmentation_models_pytorch\x18J \x01(\x08\x12\x1d\n\x15sentence_transformers\x18K \x01(\x08\x12\x0b\n\x03\x64gl\x18L \x01(\x08\x12\x17\n\x0ftorch_geometric\x18M \x01(\x08\x12\x0c\n\x04jina\x18N \x01(\x08\x12\x0e\n\x06kornia\x18O \x01(\x08\x12\x16\n\x0e\x61lbumentations\x18P \x01(\x08\x12\x10\n\x08keras_cv\x18Q \x01(\x08\x12\x10\n\x08mmengine\x18R \x01(\x08\x12\x11\n\tdiffusers\x18S \x01(\x08\x12\x0b\n\x03trl\x18T \x01(\x08\x12\x0c\n\x04trlx\x18U \x01(\x08\x12\x11\n\tlangchain\x18V \x01(\x08\x12\x13\n\x0bllama_index\x18W \x01(\x08\x12\x15\n\rstability_sdk\x18X \x01(\x08\x12\x0f\n\x07prefect\x18Y \x01(\x08\x12\x13\n\x0bprefect_ray\x18Z \x01(\x08\x12\x10\n\x08pinecone\x18[ \x01(\x08\x12\x10\n\x08\x63hromadb\x18\\ \x01(\x08\x12\x10\n\x08weaviate\x18] \x01(\x08\x12\x13\n\x0bpromptlayer\x18^ \x01(\x08\x12\x0e\n\x06openai\x18_ \x01(\x08\x12\x0e\n\x06\x63ohere\x18` \x01(\x08\x12\x11\n\tanthropic\x18\x61 \x01(\x08\x12\x0c\n\x04peft\x18\x62 \x01(\x08\x12\x0f\n\x07optimum\x18\x63 \x01(\x08\x12\x10\n\x08\x65valuate\x18\x64 \x01(\x08\x12\x10\n\x08langflow\x18\x65 \x01(\x08\x12\x12\n\nkeras_core\x18\x66 \x01(\x08\x12\x18\n\x10lightning_fabric\x18g \x01(\x08\x12\x1c\n\x14\x63urated_transformers\x18h \x01(\x08\x12\x0e\n\x06orjson\x18i \x01(\x08\x12\x11\n\tlightning\x18j \x01(\x08J\x04\x08\x11\x10\x12J\x04\x08\x13\x10\x14J\x04\x08\x14\x10\x15J\x04\x08\x17\x10\x18J\x04\x08\x18\x10\x19J\x04\x08\x19\x10\x1aJ\x04\x08\x1a\x10\x1bJ\x04\x08\x1b\x10\x1cJ\x04\x08\x37\x10\x38\"\x95\r\n\x07\x46\x65\x61ture\x12\r\n\x05watch\x18\x01 \x01(\x08\x12\x0e\n\x06\x66inish\x18\x02 \x01(\x08\x12\x0c\n\x04save\x18\x03 \x01(\x08\x12\x0f\n\x07offline\x18\x04 \x01(\x08\x12\x0f\n\x07resumed\x18\x05 \x01(\x08\x12\x0c\n\x04grpc\x18\x06 \x01(\x08\x12\x0e\n\x06metric\x18\x07 \x01(\x08\x12\r\n\x05keras\x18\x08 \x01(\x08\x12\x11\n\tsagemaker\x18\t \x01(\x08\x12\x1c\n\x14\x61rtifact_incremental\x18\n \x01(\x08\x12\x10\n\x08metaflow\x18\x0b \x01(\x08\x12\x0f\n\x07prodigy\x18\x0c \x01(\x08\x12\x15\n\rset_init_name\x18\r \x01(\x08\x12\x13\n\x0bset_init_id\x18\x0e \x01(\x08\x12\x15\n\rset_init_tags\x18\x0f \x01(\x08\x12\x17\n\x0fset_init_config\x18\x10 \x01(\x08\x12\x14\n\x0cset_run_name\x18\x11 \x01(\x08\x12\x14\n\x0cset_run_tags\x18\x12 \x01(\x08\x12\x17\n\x0fset_config_item\x18\x13 \x01(\x08\x12\x0e\n\x06launch\x18\x14 \x01(\x08\x12\x1c\n\x14torch_profiler_trace\x18\x15 \x01(\x08\x12\x0b\n\x03sb3\x18\x16 \x01(\x08\x12\x17\n\x0finit_return_run\x18\x18 \x01(\x08\x12\x1f\n\x17lightgbm_wandb_callback\x18\x19 \x01(\x08\x12\x1c\n\x14lightgbm_log_summary\x18\x1a \x01(\x08\x12\x1f\n\x17\x63\x61tboost_wandb_callback\x18\x1b \x01(\x08\x12\x1c\n\x14\x63\x61tboost_log_summary\x18\x1c \x01(\x08\x12\x17\n\x0ftensorboard_log\x18\x1d \x01(\x08\x12\x16\n\x0e\x65stimator_hook\x18\x1e \x01(\x08\x12\x1e\n\x16xgboost_wandb_callback\x18\x1f \x01(\x08\x12\"\n\x1axgboost_old_wandb_callback\x18 \x01(\x08\x12\x0e\n\x06\x61ttach\x18! \x01(\x08\x12\x19\n\x11tensorboard_patch\x18\" \x01(\x08\x12\x18\n\x10tensorboard_sync\x18# \x01(\x08\x12\x15\n\rkfp_wandb_log\x18$ \x01(\x08\x12\x1b\n\x13maybe_run_overwrite\x18% \x01(\x08\x12\x1c\n\x14keras_metrics_logger\x18& \x01(\x08\x12\x1e\n\x16keras_model_checkpoint\x18\' \x01(\x08\x12!\n\x19keras_wandb_eval_callback\x18( \x01(\x08\x12\x1d\n\x15\x66low_control_overflow\x18) \x01(\x08\x12\x0c\n\x04sync\x18* \x01(\x08\x12\x1d\n\x15\x66low_control_disabled\x18+ \x01(\x08\x12\x1b\n\x13\x66low_control_custom\x18, \x01(\x08\x12\x14\n\x0copen_metrics\x18. \x01(\x08\x12\x1a\n\x12ultralytics_yolov8\x18/ \x01(\x08\x12\x17\n\x0fimporter_mlflow\x18\x30 \x01(\x08\x12\x15\n\rsync_tfevents\x18\x31 \x01(\x08\x12\x15\n\rasync_uploads\x18\x32 \x01(\x08\x12\x16\n\x0eopenai_autolog\x18\x33 \x01(\x08\x12\x18\n\x10langchain_tracer\x18\x34 \x01(\x08\x12\x16\n\x0e\x63ohere_autolog\x18\x35 \x01(\x08\x12\x1b\n\x13hf_pipeline_autolog\x18\x36 \x01(\x08\x12\r\n\x05lib_c\x18\x38 \x01(\x08\x12\x0f\n\x07lib_cpp\x18\x39 \x01(\x08\x12\x19\n\x11openai_finetuning\x18: \x01(\x08\x12\x19\n\x11\x64iffusers_autolog\x18; \x01(\x08\x12\x1f\n\x17lightning_fabric_logger\x18< \x01(\x08\x12\x14\n\x0cset_step_log\x18= \x01(\x08\x12\x13\n\x0bset_summary\x18> \x01(\x08\x12\x16\n\x0emetric_summary\x18? \x01(\x08\x12\x13\n\x0bmetric_goal\x18@ \x01(\x08\x12\x15\n\rmetric_hidden\x18\x41 \x01(\x08\x12\x18\n\x10metric_step_sync\x18\x42 \x01(\x08\x12\x13\n\x0bshared_mode\x18\x43 \x01(\x08\x12#\n\x1bserver_side_derived_summary\x18\x44 \x01(\x08\x12\x1b\n\x13user_provided_label\x18\x45 \x01(\x08\x12\x1e\n\x16\x64\x63gm_profiling_enabled\x18\x46 \x01(\x08\x12\x11\n\tfork_mode\x18G \x01(\x08\x12\x13\n\x0brewind_mode\x18H \x01(\x08J\x04\x08\x17\x10\x18J\x04\x08-\x10.J\x04\x08\x37\x10\x38\"\xc9\x01\n\x03\x45nv\x12\x0f\n\x07jupyter\x18\x01 \x01(\x08\x12\x0e\n\x06kaggle\x18\x02 \x01(\x08\x12\x0f\n\x07windows\x18\x03 \x01(\x08\x12\x0e\n\x06m1_gpu\x18\x04 \x01(\x08\x12\x10\n\x08trainium\x18\n \x01(\x08\x12\x0b\n\x03pex\x18\x0b \x01(\x08\x12\r\n\x05\x63olab\x18\x0c \x01(\x08\x12\x0f\n\x07ipython\x18\r \x01(\x08\x12\x12\n\naws_lambda\x18\x0e \x01(\x08\x12\x0f\n\x07\x61md_gpu\x18\x0f \x01(\x08J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"H\n\x06Labels\x12\x13\n\x0b\x63ode_string\x18\x01 \x01(\t\x12\x13\n\x0brepo_string\x18\x02 \x01(\t\x12\x14\n\x0c\x63ode_version\x18\x03 \x01(\t\"\xd5\x05\n\nDeprecated\x12!\n\x19keras_callback__data_type\x18\x01 \x01(\x08\x12\r\n\x05plots\x18\x05 \x01(\x08\x12!\n\x19init__config_include_keys\x18\x07 \x01(\x08\x12!\n\x19init__config_exclude_keys\x18\x08 \x01(\x08\x12\"\n\x1akeras_callback__save_model\x18\t \x01(\x08\x12\x18\n\x10langchain_tracer\x18\n \x01(\x08\x12\x1a\n\x12\x61rtifact__get_path\x18\x0b \x01(\x08\x12#\n\x1b\x61rtifactmanifestentry__name\x18\x0c \x01(\x08\x12\x1e\n\x16\x61pi__artifact_versions\x18\r \x01(\x08\x12(\n artifact_collection__change_type\x18\x0e \x01(\x08\x12\x1f\n\x17run__define_metric_copy\x18\x0f \x01(\x08\x12\x14\n\x0crun_disabled\x18\x10 \x01(\x08\x12\x16\n\x0ekeras_callback\x18\x11 \x01(\x08\x12$\n\x1crun__define_metric_best_goal\x18\x12 \x01(\x08\x12\x19\n\x11run__finish_quiet\x18\x13 \x01(\x08\x12\x18\n\x10run__reinit_bool\x18\x14 \x01(\x08\x12\x14\n\x0crun__get_url\x18\x15 \x01(\x08\x12\x19\n\x11run__project_name\x18\x16 \x01(\x08\x12\x1c\n\x14run__get_project_url\x18\x17 \x01(\x08\x12\x1a\n\x12run__get_sweep_url\x18\x18 \x01(\x08\x12 \n\x18run__use_artifact_use_as\x18\x19 \x01(\x08\x12\x18\n\x10\x61rtifact__use_as\x18\x1a \x01(\x08\x12\x1d\n\x15\x61rtifact__init_use_as\x18\x1b \x01(\x08J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05J\x04\x08\x06\x10\x07\"|\n\x06Issues\x12%\n\x1dsettings__validation_warnings\x18\x01 \x01(\x08\x12!\n\x19settings__unexpected_args\x18\x02 \x01(\x08\x12(\n settings__preprocessing_warnings\x18\x03 \x01(\x08\x42\x1bZ\x19\x63ore/pkg/service_go_protob\x06proto3')
28
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!wandb/proto/wandb_telemetry.proto\x12\x0ewandb_internal\x1a\x1cwandb/proto/wandb_base.proto\"\xdb\x03\n\x0fTelemetryRecord\x12-\n\x0cimports_init\x18\x01 \x01(\x0b\x32\x17.wandb_internal.Imports\x12/\n\x0eimports_finish\x18\x02 \x01(\x0b\x32\x17.wandb_internal.Imports\x12(\n\x07\x66\x65\x61ture\x18\x03 \x01(\x0b\x32\x17.wandb_internal.Feature\x12\x16\n\x0epython_version\x18\x04 \x01(\t\x12\x13\n\x0b\x63li_version\x18\x05 \x01(\t\x12\x1b\n\x13huggingface_version\x18\x06 \x01(\t\x12 \n\x03\x65nv\x18\x08 \x01(\x0b\x32\x13.wandb_internal.Env\x12%\n\x05label\x18\t \x01(\x0b\x32\x16.wandb_internal.Labels\x12.\n\ndeprecated\x18\n \x01(\x0b\x32\x1a.wandb_internal.Deprecated\x12&\n\x06issues\x18\x0b \x01(\x0b\x32\x16.wandb_internal.Issues\x12\x14\n\x0c\x63ore_version\x18\x0c \x01(\t\x12\x10\n\x08platform\x18\r \x01(\t\x12+\n\x05_info\x18\xc8\x01 \x01(\x0b\x32\x1b.wandb_internal._RecordInfo\"\x11\n\x0fTelemetryResult\"\x9a\x0e\n\x07Imports\x12\r\n\x05torch\x18\x01 \x01(\x08\x12\r\n\x05keras\x18\x02 \x01(\x08\x12\x12\n\ntensorflow\x18\x03 \x01(\x08\x12\x0e\n\x06\x66\x61stai\x18\x04 \x01(\x08\x12\x0f\n\x07sklearn\x18\x05 \x01(\x08\x12\x0f\n\x07xgboost\x18\x06 \x01(\x08\x12\x10\n\x08\x63\x61tboost\x18\x07 \x01(\x08\x12\x10\n\x08lightgbm\x18\x08 \x01(\x08\x12\x19\n\x11pytorch_lightning\x18\t \x01(\x08\x12\x0e\n\x06ignite\x18\n \x01(\x08\x12\x14\n\x0ctransformers\x18\x0b \x01(\x08\x12\x0b\n\x03jax\x18\x0c \x01(\x08\x12\x10\n\x08metaflow\x18\r \x01(\x08\x12\x10\n\x08\x61llennlp\x18\x0e \x01(\x08\x12\x11\n\tautogluon\x18\x0f \x01(\x08\x12\x11\n\tautokeras\x18\x10 \x01(\x08\x12\x10\n\x08\x63\x61talyst\x18\x12 \x01(\x08\x12\x10\n\x08\x64\x65\x65pchem\x18\x15 \x01(\x08\x12\x0f\n\x07\x64\x65\x65pctr\x18\x16 \x01(\x08\x12\x0f\n\x07pycaret\x18\x1c \x01(\x08\x12\x14\n\x0cpytorchvideo\x18\x1d \x01(\x08\x12\x0b\n\x03ray\x18\x1e \x01(\x08\x12\x1a\n\x12simpletransformers\x18\x1f \x01(\x08\x12\x0e\n\x06skorch\x18 \x01(\x08\x12\r\n\x05spacy\x18! \x01(\x08\x12\r\n\x05\x66lash\x18\" \x01(\x08\x12\x0e\n\x06optuna\x18# \x01(\x08\x12\x0f\n\x07recbole\x18$ \x01(\x08\x12\x0c\n\x04mmcv\x18% \x01(\x08\x12\r\n\x05mmdet\x18& \x01(\x08\x12\x11\n\ttorchdrug\x18\' \x01(\x08\x12\x11\n\ttorchtext\x18( \x01(\x08\x12\x13\n\x0btorchvision\x18) \x01(\x08\x12\r\n\x05\x65legy\x18* \x01(\x08\x12\x12\n\ndetectron2\x18+ \x01(\x08\x12\r\n\x05\x66lair\x18, \x01(\x08\x12\x0c\n\x04\x66lax\x18- \x01(\x08\x12\x0c\n\x04syft\x18. \x01(\x08\x12\x0b\n\x03TTS\x18/ \x01(\x08\x12\r\n\x05monai\x18\x30 \x01(\x08\x12\x17\n\x0fhuggingface_hub\x18\x31 \x01(\x08\x12\r\n\x05hydra\x18\x32 \x01(\x08\x12\x10\n\x08\x64\x61tasets\x18\x33 \x01(\x08\x12\x0e\n\x06sacred\x18\x34 \x01(\x08\x12\x0e\n\x06joblib\x18\x35 \x01(\x08\x12\x0c\n\x04\x64\x61sk\x18\x36 \x01(\x08\x12\x11\n\tpaddleocr\x18\x38 \x01(\x08\x12\r\n\x05ppdet\x18\x39 \x01(\x08\x12\x11\n\tpaddleseg\x18: \x01(\x08\x12\x11\n\tpaddlenlp\x18; \x01(\x08\x12\r\n\x05mmseg\x18< \x01(\x08\x12\r\n\x05mmocr\x18= \x01(\x08\x12\r\n\x05mmcls\x18> \x01(\x08\x12\x0c\n\x04timm\x18? \x01(\x08\x12\x0f\n\x07\x66\x61irseq\x18@ \x01(\x08\x12\x12\n\ndeepchecks\x18\x41 \x01(\x08\x12\x10\n\x08\x63omposer\x18\x42 \x01(\x08\x12\x10\n\x08sparseml\x18\x43 \x01(\x08\x12\x10\n\x08\x61nomalib\x18\x44 \x01(\x08\x12\r\n\x05zenml\x18\x45 \x01(\x08\x12\x12\n\ncolossalai\x18\x46 \x01(\x08\x12\x12\n\naccelerate\x18G \x01(\x08\x12\x0e\n\x06merlin\x18H \x01(\x08\x12\x0f\n\x07nanodet\x18I \x01(\x08\x12#\n\x1bsegmentation_models_pytorch\x18J \x01(\x08\x12\x1d\n\x15sentence_transformers\x18K \x01(\x08\x12\x0b\n\x03\x64gl\x18L \x01(\x08\x12\x17\n\x0ftorch_geometric\x18M \x01(\x08\x12\x0c\n\x04jina\x18N \x01(\x08\x12\x0e\n\x06kornia\x18O \x01(\x08\x12\x16\n\x0e\x61lbumentations\x18P \x01(\x08\x12\x10\n\x08keras_cv\x18Q \x01(\x08\x12\x10\n\x08mmengine\x18R \x01(\x08\x12\x11\n\tdiffusers\x18S \x01(\x08\x12\x0b\n\x03trl\x18T \x01(\x08\x12\x0c\n\x04trlx\x18U \x01(\x08\x12\x11\n\tlangchain\x18V \x01(\x08\x12\x13\n\x0bllama_index\x18W \x01(\x08\x12\x15\n\rstability_sdk\x18X \x01(\x08\x12\x0f\n\x07prefect\x18Y \x01(\x08\x12\x13\n\x0bprefect_ray\x18Z \x01(\x08\x12\x10\n\x08pinecone\x18[ \x01(\x08\x12\x10\n\x08\x63hromadb\x18\\ \x01(\x08\x12\x10\n\x08weaviate\x18] \x01(\x08\x12\x13\n\x0bpromptlayer\x18^ \x01(\x08\x12\x0e\n\x06openai\x18_ \x01(\x08\x12\x0e\n\x06\x63ohere\x18` \x01(\x08\x12\x11\n\tanthropic\x18\x61 \x01(\x08\x12\x0c\n\x04peft\x18\x62 \x01(\x08\x12\x0f\n\x07optimum\x18\x63 \x01(\x08\x12\x10\n\x08\x65valuate\x18\x64 \x01(\x08\x12\x10\n\x08langflow\x18\x65 \x01(\x08\x12\x12\n\nkeras_core\x18\x66 \x01(\x08\x12\x18\n\x10lightning_fabric\x18g \x01(\x08\x12\x1c\n\x14\x63urated_transformers\x18h \x01(\x08\x12\x0e\n\x06orjson\x18i \x01(\x08\x12\x11\n\tlightning\x18j \x01(\x08J\x04\x08\x11\x10\x12J\x04\x08\x13\x10\x14J\x04\x08\x14\x10\x15J\x04\x08\x17\x10\x18J\x04\x08\x18\x10\x19J\x04\x08\x19\x10\x1aJ\x04\x08\x1a\x10\x1bJ\x04\x08\x1b\x10\x1cJ\x04\x08\x37\x10\x38\"\x95\r\n\x07\x46\x65\x61ture\x12\r\n\x05watch\x18\x01 \x01(\x08\x12\x0e\n\x06\x66inish\x18\x02 \x01(\x08\x12\x0c\n\x04save\x18\x03 \x01(\x08\x12\x0f\n\x07offline\x18\x04 \x01(\x08\x12\x0f\n\x07resumed\x18\x05 \x01(\x08\x12\x0c\n\x04grpc\x18\x06 \x01(\x08\x12\x0e\n\x06metric\x18\x07 \x01(\x08\x12\r\n\x05keras\x18\x08 \x01(\x08\x12\x11\n\tsagemaker\x18\t \x01(\x08\x12\x1c\n\x14\x61rtifact_incremental\x18\n \x01(\x08\x12\x10\n\x08metaflow\x18\x0b \x01(\x08\x12\x0f\n\x07prodigy\x18\x0c \x01(\x08\x12\x15\n\rset_init_name\x18\r \x01(\x08\x12\x13\n\x0bset_init_id\x18\x0e \x01(\x08\x12\x15\n\rset_init_tags\x18\x0f \x01(\x08\x12\x17\n\x0fset_init_config\x18\x10 \x01(\x08\x12\x14\n\x0cset_run_name\x18\x11 \x01(\x08\x12\x14\n\x0cset_run_tags\x18\x12 \x01(\x08\x12\x17\n\x0fset_config_item\x18\x13 \x01(\x08\x12\x0e\n\x06launch\x18\x14 \x01(\x08\x12\x1c\n\x14torch_profiler_trace\x18\x15 \x01(\x08\x12\x0b\n\x03sb3\x18\x16 \x01(\x08\x12\x17\n\x0finit_return_run\x18\x18 \x01(\x08\x12\x1f\n\x17lightgbm_wandb_callback\x18\x19 \x01(\x08\x12\x1c\n\x14lightgbm_log_summary\x18\x1a \x01(\x08\x12\x1f\n\x17\x63\x61tboost_wandb_callback\x18\x1b \x01(\x08\x12\x1c\n\x14\x63\x61tboost_log_summary\x18\x1c \x01(\x08\x12\x17\n\x0ftensorboard_log\x18\x1d \x01(\x08\x12\x16\n\x0e\x65stimator_hook\x18\x1e \x01(\x08\x12\x1e\n\x16xgboost_wandb_callback\x18\x1f \x01(\x08\x12\"\n\x1axgboost_old_wandb_callback\x18 \x01(\x08\x12\x0e\n\x06\x61ttach\x18! \x01(\x08\x12\x19\n\x11tensorboard_patch\x18\" \x01(\x08\x12\x18\n\x10tensorboard_sync\x18# \x01(\x08\x12\x15\n\rkfp_wandb_log\x18$ \x01(\x08\x12\x1b\n\x13maybe_run_overwrite\x18% \x01(\x08\x12\x1c\n\x14keras_metrics_logger\x18& \x01(\x08\x12\x1e\n\x16keras_model_checkpoint\x18\' \x01(\x08\x12!\n\x19keras_wandb_eval_callback\x18( \x01(\x08\x12\x1d\n\x15\x66low_control_overflow\x18) \x01(\x08\x12\x0c\n\x04sync\x18* \x01(\x08\x12\x1d\n\x15\x66low_control_disabled\x18+ \x01(\x08\x12\x1b\n\x13\x66low_control_custom\x18, \x01(\x08\x12\x14\n\x0copen_metrics\x18. \x01(\x08\x12\x1a\n\x12ultralytics_yolov8\x18/ \x01(\x08\x12\x17\n\x0fimporter_mlflow\x18\x30 \x01(\x08\x12\x15\n\rsync_tfevents\x18\x31 \x01(\x08\x12\x15\n\rasync_uploads\x18\x32 \x01(\x08\x12\x16\n\x0eopenai_autolog\x18\x33 \x01(\x08\x12\x18\n\x10langchain_tracer\x18\x34 \x01(\x08\x12\x16\n\x0e\x63ohere_autolog\x18\x35 \x01(\x08\x12\x1b\n\x13hf_pipeline_autolog\x18\x36 \x01(\x08\x12\r\n\x05lib_c\x18\x38 \x01(\x08\x12\x0f\n\x07lib_cpp\x18\x39 \x01(\x08\x12\x19\n\x11openai_finetuning\x18: \x01(\x08\x12\x19\n\x11\x64iffusers_autolog\x18; \x01(\x08\x12\x1f\n\x17lightning_fabric_logger\x18< \x01(\x08\x12\x14\n\x0cset_step_log\x18= \x01(\x08\x12\x13\n\x0bset_summary\x18> \x01(\x08\x12\x16\n\x0emetric_summary\x18? \x01(\x08\x12\x13\n\x0bmetric_goal\x18@ \x01(\x08\x12\x15\n\rmetric_hidden\x18\x41 \x01(\x08\x12\x18\n\x10metric_step_sync\x18\x42 \x01(\x08\x12\x13\n\x0bshared_mode\x18\x43 \x01(\x08\x12#\n\x1bserver_side_derived_summary\x18\x44 \x01(\x08\x12\x1b\n\x13user_provided_label\x18\x45 \x01(\x08\x12\x1e\n\x16\x64\x63gm_profiling_enabled\x18\x46 \x01(\x08\x12\x11\n\tfork_mode\x18G \x01(\x08\x12\x13\n\x0brewind_mode\x18H \x01(\x08J\x04\x08\x17\x10\x18J\x04\x08-\x10.J\x04\x08\x37\x10\x38\"\xc9\x01\n\x03\x45nv\x12\x0f\n\x07jupyter\x18\x01 \x01(\x08\x12\x0e\n\x06kaggle\x18\x02 \x01(\x08\x12\x0f\n\x07windows\x18\x03 \x01(\x08\x12\x0e\n\x06m1_gpu\x18\x04 \x01(\x08\x12\x10\n\x08trainium\x18\n \x01(\x08\x12\x0b\n\x03pex\x18\x0b \x01(\x08\x12\r\n\x05\x63olab\x18\x0c \x01(\x08\x12\x0f\n\x07ipython\x18\r \x01(\x08\x12\x12\n\naws_lambda\x18\x0e \x01(\x08\x12\x0f\n\x07\x61md_gpu\x18\x0f \x01(\x08J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x07\x10\x08J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"H\n\x06Labels\x12\x13\n\x0b\x63ode_string\x18\x01 \x01(\t\x12\x13\n\x0brepo_string\x18\x02 \x01(\t\x12\x14\n\x0c\x63ode_version\x18\x03 \x01(\t\"\xc2\x06\n\nDeprecated\x12!\n\x19keras_callback__data_type\x18\x01 \x01(\x08\x12\r\n\x05plots\x18\x05 \x01(\x08\x12!\n\x19init__config_include_keys\x18\x07 \x01(\x08\x12!\n\x19init__config_exclude_keys\x18\x08 \x01(\x08\x12\"\n\x1akeras_callback__save_model\x18\t \x01(\x08\x12\x18\n\x10langchain_tracer\x18\n \x01(\x08\x12\x1a\n\x12\x61rtifact__get_path\x18\x0b \x01(\x08\x12#\n\x1b\x61rtifactmanifestentry__name\x18\x0c \x01(\x08\x12\x1e\n\x16\x61pi__artifact_versions\x18\r \x01(\x08\x12(\n artifact_collection__change_type\x18\x0e \x01(\x08\x12\x1f\n\x17run__define_metric_copy\x18\x0f \x01(\x08\x12\x14\n\x0crun_disabled\x18\x10 \x01(\x08\x12\x16\n\x0ekeras_callback\x18\x11 \x01(\x08\x12$\n\x1crun__define_metric_best_goal\x18\x12 \x01(\x08\x12\x19\n\x11run__finish_quiet\x18\x13 \x01(\x08\x12\x18\n\x10run__reinit_bool\x18\x14 \x01(\x08\x12\x14\n\x0crun__get_url\x18\x15 \x01(\x08\x12\x19\n\x11run__project_name\x18\x16 \x01(\x08\x12\x1c\n\x14run__get_project_url\x18\x17 \x01(\x08\x12\x1a\n\x12run__get_sweep_url\x18\x18 \x01(\x08\x12 \n\x18run__use_artifact_use_as\x18\x19 \x01(\x08\x12\x18\n\x10\x61rtifact__use_as\x18\x1a \x01(\x08\x12\x1d\n\x15\x61rtifact__init_use_as\x18\x1b \x01(\x08\x12\"\n\x1a\x62\x65ta__workflows__log_model\x18\x1c \x01(\x08\x12\"\n\x1a\x62\x65ta__workflows__use_model\x18\x1d \x01(\x08\x12#\n\x1b\x62\x65ta__workflows__link_model\x18\x1e \x01(\x08J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x04\x10\x05J\x04\x08\x06\x10\x07\"|\n\x06Issues\x12%\n\x1dsettings__validation_warnings\x18\x01 \x01(\x08\x12!\n\x19settings__unexpected_args\x18\x02 \x01(\x08\x12(\n settings__preprocessing_warnings\x18\x03 \x01(\x08\x42\x1bZ\x19\x63ore/pkg/service_go_protob\x06proto3')
29
29
 
30
30
  _globals = globals()
31
31
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -46,7 +46,7 @@ if not _descriptor._USE_C_DESCRIPTORS:
46
46
  _globals['_LABELS']._serialized_start=4293
47
47
  _globals['_LABELS']._serialized_end=4365
48
48
  _globals['_DEPRECATED']._serialized_start=4368
49
- _globals['_DEPRECATED']._serialized_end=5093
50
- _globals['_ISSUES']._serialized_start=5095
51
- _globals['_ISSUES']._serialized_end=5219
49
+ _globals['_DEPRECATED']._serialized_end=5202
50
+ _globals['_ISSUES']._serialized_start=5204
51
+ _globals['_ISSUES']._serialized_end=5328
52
52
  # @@protoc_insertion_point(module_scope)
@@ -25,6 +25,9 @@ DEPRECATED_FEATURES = Literal[
25
25
  "run__use_artifact_use_as",
26
26
  "artifact__use_as",
27
27
  "artifact__init_use_as",
28
+ "beta__workflows__log_model",
29
+ "beta__workflows__use_model",
30
+ "beta__workflows__link_model",
28
31
  ]
29
32
 
30
33
  class Deprecated:
@@ -51,3 +54,6 @@ class Deprecated:
51
54
  run__use_artifact_use_as: DEPRECATED_FEATURES = "run__use_artifact_use_as"
52
55
  artifact__use_as: DEPRECATED_FEATURES = "artifact__use_as"
53
56
  artifact__init_use_as: DEPRECATED_FEATURES = "artifact__init_use_as"
57
+ beta__workflows__log_model: DEPRECATED_FEATURES = "beta__workflows__log_model"
58
+ beta__workflows__use_model: DEPRECATED_FEATURES = "beta__workflows__use_model"
59
+ beta__workflows__link_model: DEPRECATED_FEATURES = "beta__workflows__link_model"
@@ -1,5 +1,9 @@
1
+ from __future__ import annotations
2
+
1
3
  import re
2
- from typing import Any, Dict, Final, Optional
4
+ from base64 import urlsafe_b64encode
5
+ from typing import Any, Final
6
+ from zlib import crc32
3
7
 
4
8
  from wandb.sdk.artifacts.artifact import Artifact
5
9
 
@@ -8,14 +12,21 @@ PLACEHOLDER: Final[str] = "PLACEHOLDER"
8
12
 
9
13
  def sanitize_artifact_name(name: str) -> str:
10
14
  """Sanitize the string to satisfy constraints on artifact names."""
11
- from wandb.sdk.lib.hashutil import _md5
12
-
13
15
  # If the name is already sanitized, don't change it.
14
16
  if (sanitized := re.sub(r"[^a-zA-Z0-9_\-.]+", "", name)) == name:
15
17
  return name
16
18
 
17
- # Append an alphanumeric suffix to maintain uniqueness of the name.
18
- suffix = _md5(name.encode("utf-8")).hexdigest()
19
+ # Append a short alphanumeric suffix to maintain uniqueness.
20
+ # Yes, CRC is meant for checksums and not as a general hash function, but
21
+ # a 32-bit CRC hash, encoded as (url-safe) base64, is fairly short while
22
+ # providing 4B+ possible values, which should be good enough for the corner
23
+ # case names this function is meant to address.
24
+ #
25
+ # As implemented, the final suffix should be 6 characters.
26
+ crc: int = crc32(name.encode("utf-8")) & 0xFFFFFFFF # Ensure it's unsigned
27
+ crc_bytes = crc.to_bytes(4, byteorder="big")
28
+ suffix = urlsafe_b64encode(crc_bytes).rstrip(b"=").decode("ascii")
29
+
19
30
  return f"{sanitized}-{suffix}"
20
31
 
21
32
 
@@ -31,10 +42,10 @@ class InternalArtifact(Artifact):
31
42
  self,
32
43
  name: str,
33
44
  type: str,
34
- description: Optional[str] = None,
35
- metadata: Optional[Dict[str, Any]] = None,
45
+ description: str | None = None,
46
+ metadata: dict[str, Any] | None = None,
36
47
  incremental: bool = False,
37
- use_as: Optional[str] = None,
48
+ use_as: str | None = None,
38
49
  ) -> None:
39
50
  sanitized_name = sanitize_artifact_name(name)
40
51
  super().__init__(
@@ -264,6 +264,14 @@ def is_artifact_registry_project(project: str) -> bool:
264
264
  return project.startswith(REGISTRY_PREFIX)
265
265
 
266
266
 
267
+ def remove_registry_prefix(project: str) -> str:
268
+ if is_artifact_registry_project(project):
269
+ return project[len(REGISTRY_PREFIX) :]
270
+ raise ValueError(
271
+ f"Project {project!r} does not have the prefix {REGISTRY_PREFIX}. It is not a registry project"
272
+ )
273
+
274
+
267
275
  @pydantic_dataclass
268
276
  class ArtifactPath:
269
277
  #: The collection name.
@@ -80,6 +80,7 @@ from ._validators import (
80
80
  ensure_logged,
81
81
  ensure_not_finalized,
82
82
  is_artifact_registry_project,
83
+ remove_registry_prefix,
83
84
  validate_aliases,
84
85
  validate_artifact_name,
85
86
  validate_artifact_type,
@@ -131,25 +132,26 @@ class Artifact:
131
132
 
132
133
  Construct an empty W&B Artifact. Populate an artifacts contents with methods that
133
134
  begin with `add`. Once the artifact has all the desired files, you can call
134
- `wandb.log_artifact()` to log it.
135
+ `run.log_artifact()` to log it.
135
136
 
136
137
  Args:
137
- name: A human-readable name for the artifact. Use the name to identify
138
+ name (str): A human-readable name for the artifact. Use the name to identify
138
139
  a specific artifact in the W&B App UI or programmatically. You can
139
140
  interactively reference an artifact with the `use_artifact` Public API.
140
141
  A name can contain letters, numbers, underscores, hyphens, and dots.
141
142
  The name must be unique across a project.
142
- type: The artifact's type. Use the type of an artifact to both organize
143
+ type (str): The artifact's type. Use the type of an artifact to both organize
143
144
  and differentiate artifacts. You can use any string that contains letters,
144
145
  numbers, underscores, hyphens, and dots. Common types include `dataset` or `model`.
145
- Note: Some types are reserved for internal use and cannot be set by users.
146
- Such types include `job` and types that start with `wandb-`.
147
- description: A description of the artifact. For Model or Dataset Artifacts,
146
+ Include `model` within your type string if you want to link the artifact
147
+ to the W&B Model Registry. Note that some types reserved for internal use
148
+ and cannot be set by users. Such types include `job` and types that start with `wandb-`.
149
+ description (str | None) = None: A description of the artifact. For Model or Dataset Artifacts,
148
150
  add documentation for your standardized team model or dataset card. View
149
151
  an artifact's description programmatically with the `Artifact.description`
150
152
  attribute or programmatically with the W&B App UI. W&B renders the
151
153
  description as markdown in the W&B App.
152
- metadata: Additional information about an artifact. Specify metadata as a
154
+ metadata (dict[str, Any] | None) = None: Additional information about an artifact. Specify metadata as a
153
155
  dictionary of key-value pairs. You can specify no more than 100 total keys.
154
156
  incremental: Use `Artifact.new_draft()` method instead to modify an
155
157
  existing artifact.
@@ -839,7 +841,7 @@ class Artifact:
839
841
  )
840
842
  return urljoin(
841
843
  base_url,
842
- f"orgs/{org.display_name}/registry/{self._type}?selectionPath={selection_path}&view=membership&version={self._version}",
844
+ f"orgs/{org.display_name}/registry/{remove_registry_prefix(self.project)}?selectionPath={selection_path}&view=membership&version={self.version}",
843
845
  )
844
846
 
845
847
  def _construct_model_registry_url(self, base_url: str) -> str:
@@ -924,7 +926,8 @@ class Artifact:
924
926
  TTL and there is no custom policy set on an artifact.
925
927
 
926
928
  Raises:
927
- ArtifactNotLoggedError: Unable to fetch inherited TTL if the artifact has not been logged or saved
929
+ ArtifactNotLoggedError: Unable to fetch inherited TTL if the
930
+ artifact has not been logged or saved.
928
931
  """
929
932
  if self._ttl_is_inherited and (self.is_draft() or self._ttl_changed):
930
933
  raise ArtifactNotLoggedError(f"{type(self).__name__}.ttl", self)
@@ -976,7 +979,9 @@ class Artifact:
976
979
  @property
977
980
  @ensure_logged
978
981
  def aliases(self) -> list[str]:
979
- """List of one or more semantically-friendly references or identifying "nicknames" assigned to an artifact version.
982
+ """List of one or more semantically-friendly references or
983
+
984
+ identifying "nicknames" assigned to an artifact version.
980
985
 
981
986
  Aliases are mutable references that you can programmatically reference.
982
987
  Change an artifact's alias with the W&B App UI or programmatically.
@@ -1012,6 +1017,10 @@ class Artifact:
1012
1017
 
1013
1018
  @property
1014
1019
  def distributed_id(self) -> str | None:
1020
+ """The distributed ID of the artifact.
1021
+
1022
+ <!-- lazydoc-ignore: internal -->
1023
+ """
1015
1024
  return self._distributed_id
1016
1025
 
1017
1026
  @distributed_id.setter
@@ -1020,6 +1029,10 @@ class Artifact:
1020
1029
 
1021
1030
  @property
1022
1031
  def incremental(self) -> bool:
1032
+ """Boolean flag indicating if the artifact is an incremental artifact.
1033
+
1034
+ <!-- lazydoc-ignore: internal -->
1035
+ """
1023
1036
  return self._incremental
1024
1037
 
1025
1038
  @property
@@ -1139,15 +1152,15 @@ class Artifact:
1139
1152
  """The nearest step at which history metrics were logged for the source run of the artifact.
1140
1153
 
1141
1154
  Examples:
1142
- ```python
1143
- run = artifact.logged_by()
1144
- if run and (artifact.history_step is not None):
1145
- history = run.sample_history(
1146
- min_step=artifact.history_step,
1147
- max_step=artifact.history_step + 1,
1148
- keys=["my_metric"],
1149
- )
1150
- ```
1155
+ ```python
1156
+ run = artifact.logged_by()
1157
+ if run and (artifact.history_step is not None):
1158
+ history = run.sample_history(
1159
+ min_step=artifact.history_step,
1160
+ max_step=artifact.history_step + 1,
1161
+ keys=["my_metric"],
1162
+ )
1163
+ ```
1151
1164
  """
1152
1165
  if self._history_step is None:
1153
1166
  return None
@@ -1168,7 +1181,8 @@ class Artifact:
1168
1181
  def is_draft(self) -> bool:
1169
1182
  """Check if artifact is not saved.
1170
1183
 
1171
- Returns: Boolean. `False` if artifact is saved. `True` if artifact is not saved.
1184
+ Returns:
1185
+ Boolean. `False` if artifact is saved. `True` if artifact is not saved.
1172
1186
  """
1173
1187
  return self._state == ArtifactState.PENDING
1174
1188
 
@@ -1416,7 +1430,7 @@ class Artifact:
1416
1430
  name: The artifact relative name to get.
1417
1431
 
1418
1432
  Returns:
1419
- W&B object that can be logged with `wandb.log()` and visualized in the W&B UI.
1433
+ W&B object that can be logged with `run.log()` and visualized in the W&B UI.
1420
1434
 
1421
1435
  Raises:
1422
1436
  ArtifactNotLoggedError: If the artifact isn't logged or the run is offline.
@@ -1434,8 +1448,9 @@ class Artifact:
1434
1448
  The added manifest entry
1435
1449
 
1436
1450
  Raises:
1437
- ArtifactFinalizedError: You cannot make changes to the current artifact
1438
- version because it is finalized. Log a new artifact version instead.
1451
+ ArtifactFinalizedError: You cannot make changes to the current
1452
+ artifact version because it is finalized. Log a new artifact
1453
+ version instead.
1439
1454
  """
1440
1455
  return self.add(item, name)
1441
1456
 
@@ -1452,12 +1467,13 @@ class Artifact:
1452
1467
  encoding: The encoding used to open the new file.
1453
1468
 
1454
1469
  Returns:
1455
- A new file object that can be written to. Upon closing, the file will be
1456
- automatically added to the artifact.
1470
+ A new file object that can be written to. Upon closing, the file
1471
+ is automatically added to the artifact.
1457
1472
 
1458
1473
  Raises:
1459
- ArtifactFinalizedError: You cannot make changes to the current artifact
1460
- version because it is finalized. Log a new artifact version instead.
1474
+ ArtifactFinalizedError: You cannot make changes to the current
1475
+ artifact version because it is finalized. Log a new artifact
1476
+ version instead.
1461
1477
  """
1462
1478
  overwrite: bool = "x" not in mode
1463
1479
 
@@ -1496,22 +1512,26 @@ class Artifact:
1496
1512
 
1497
1513
  Args:
1498
1514
  local_path: The path to the file being added.
1499
- name: The path within the artifact to use for the file being added. Defaults
1500
- to the basename of the file.
1515
+ name: The path within the artifact to use for the file being added.
1516
+ Defaults to the basename of the file.
1501
1517
  is_tmp: If true, then the file is renamed deterministically to avoid
1502
1518
  collisions.
1503
- skip_cache: If `True`, W&B will not copy files to the cache after uploading.
1504
- policy: By default, set to "mutable". If set to "mutable", create a temporary copy of the
1505
- file to prevent corruption during upload. If set to "immutable", disable
1506
- protection and rely on the user not to delete or change the file.
1519
+ skip_cache: If `True`, do not copy files to the cache
1520
+ after uploading.
1521
+ policy: By default, set to "mutable". If set to "mutable",
1522
+ create a temporary copy of the file to prevent corruption
1523
+ during upload. If set to "immutable", disable
1524
+ protection and rely on the user not to delete or change the
1525
+ file.
1507
1526
  overwrite: If `True`, overwrite the file if it already exists.
1508
1527
 
1509
1528
  Returns:
1510
1529
  The added manifest entry.
1511
1530
 
1512
1531
  Raises:
1513
- ArtifactFinalizedError: You cannot make changes to the current artifact
1514
- version because it is finalized. Log a new artifact version instead.
1532
+ ArtifactFinalizedError: You cannot make changes to the current
1533
+ artifact version because it is finalized. Log a new artifact
1534
+ version instead.
1515
1535
  ValueError: Policy must be "mutable" or "immutable"
1516
1536
  """
1517
1537
  if not os.path.isfile(local_path):
@@ -1548,21 +1568,23 @@ class Artifact:
1548
1568
 
1549
1569
  Args:
1550
1570
  local_path: The path of the local directory.
1551
- name: The subdirectory name within an artifact. The name you specify appears
1552
- in the W&B App UI nested by artifact's `type`.
1571
+ name: The subdirectory name within an artifact. The name you
1572
+ specify appears in the W&B App UI nested by artifact's `type`.
1553
1573
  Defaults to the root of the artifact.
1554
- skip_cache: If set to `True`, W&B will not copy/move files to the cache while uploading
1555
- policy: "mutable" | "immutable". By default, "mutable"
1556
- "mutable": Create a temporary copy of the file to prevent corruption during upload.
1557
- "immutable": Disable protection, rely on the user not to delete or change the file.
1574
+ skip_cache: If set to `True`, W&B will not copy/move files to
1575
+ the cache while uploading
1576
+ policy: By default, "mutable".
1577
+ - mutable: Create a temporary copy of the file to prevent corruption during upload.
1578
+ - immutable: Disable protection, rely on the user not to delete or change the file.
1558
1579
  merge: If `False` (default), throws ValueError if a file was already added in a previous add_dir call
1559
1580
  and its content has changed. If `True`, overwrites existing files with changed content.
1560
1581
  Always adds new files and never removes files. To replace an entire directory, pass a name when adding the directory
1561
1582
  using `add_dir(local_path, name=my_prefix)` and call `remove(my_prefix)` to remove the directory, then add it again.
1562
1583
 
1563
1584
  Raises:
1564
- ArtifactFinalizedError: You cannot make changes to the current artifact
1565
- version because it is finalized. Log a new artifact version instead.
1585
+ ArtifactFinalizedError: You cannot make changes to the current
1586
+ artifact version because it is finalized. Log a new artifact
1587
+ version instead.
1566
1588
  ValueError: Policy must be "mutable" or "immutable"
1567
1589
  """
1568
1590
  if not os.path.isdir(local_path):
@@ -1621,13 +1643,14 @@ class Artifact:
1621
1643
 
1622
1644
  - http(s): The size and digest of the file will be inferred by the
1623
1645
  `Content-Length` and the `ETag` response headers returned by the server.
1624
- - s3: The checksum and size are pulled from the object metadata. If bucket
1625
- versioning is enabled, then the version ID is also tracked.
1646
+ - s3: The checksum and size are pulled from the object metadata.
1647
+ If bucket versioning is enabled, then the version ID is also tracked.
1626
1648
  - gs: The checksum and size are pulled from the object metadata. If bucket
1627
1649
  versioning is enabled, then the version ID is also tracked.
1628
- - https, domain matching `*.blob.core.windows.net` (Azure): The checksum and size
1629
- are be pulled from the blob metadata. If storage account versioning is
1630
- enabled, then the version ID is also tracked.
1650
+ - https, domain matching `*.blob.core.windows.net`
1651
+ - Azure: The checksum and size are be pulled from the blob metadata.
1652
+ If storage account versioning is enabled, then the version ID is
1653
+ also tracked.
1631
1654
  - file: The checksum and size are pulled from the file system. This scheme
1632
1655
  is useful if you have an NFS share or other externally mounted volume
1633
1656
  containing files you wish to track but not necessarily upload.
@@ -1648,16 +1671,18 @@ class Artifact:
1648
1671
  setting `checksum=False` when adding reference objects, in which case
1649
1672
  a new version will only be created if the reference URI changes.
1650
1673
  max_objects: The maximum number of objects to consider when adding a
1651
- reference that points to directory or bucket store prefix. By default,
1652
- the maximum number of objects allowed for Amazon S3,
1653
- GCS, Azure, and local files is 10,000,000. Other URI schemas do not have a maximum.
1674
+ reference that points to directory or bucket store prefix.
1675
+ By default, the maximum number of objects allowed for Amazon S3,
1676
+ GCS, Azure, and local files is 10,000,000. Other URI schemas
1677
+ do not have a maximum.
1654
1678
 
1655
1679
  Returns:
1656
1680
  The added manifest entries.
1657
1681
 
1658
1682
  Raises:
1659
- ArtifactFinalizedError: You cannot make changes to the current artifact
1660
- version because it is finalized. Log a new artifact version instead.
1683
+ ArtifactFinalizedError: You cannot make changes to the current
1684
+ artifact version because it is finalized. Log a new artifact
1685
+ version instead.
1661
1686
  """
1662
1687
  if name is not None:
1663
1688
  name = LogicalPath(name)
@@ -1694,17 +1719,19 @@ class Artifact:
1694
1719
 
1695
1720
  Args:
1696
1721
  obj: The object to add. Currently support one of Bokeh, JoinedTable,
1697
- PartitionedTable, Table, Classes, ImageMask, BoundingBoxes2D, Audio,
1698
- Image, Video, Html, Object3D
1722
+ PartitionedTable, Table, Classes, ImageMask, BoundingBoxes2D,
1723
+ Audio, Image, Video, Html, Object3D
1699
1724
  name: The path within the artifact to add the object.
1700
- overwrite: If True, overwrite existing objects with the same file path (if applicable).
1725
+ overwrite: If True, overwrite existing objects with the same file
1726
+ path if applicable.
1701
1727
 
1702
1728
  Returns:
1703
1729
  The added manifest entry
1704
1730
 
1705
1731
  Raises:
1706
- ArtifactFinalizedError: You cannot make changes to the current artifact
1707
- version because it is finalized. Log a new artifact version instead.
1732
+ ArtifactFinalizedError: You cannot make changes to the current
1733
+ artifact version because it is finalized. Log a new artifact
1734
+ version instead.
1708
1735
  """
1709
1736
  name = LogicalPath(name)
1710
1737
 
@@ -1819,13 +1846,14 @@ class Artifact:
1819
1846
  """Remove an item from the artifact.
1820
1847
 
1821
1848
  Args:
1822
- item: The item to remove. Can be a specific manifest entry or the name of an
1823
- artifact-relative path. If the item matches a directory all items in
1824
- that directory will be removed.
1849
+ item: The item to remove. Can be a specific manifest entry
1850
+ or the name of an artifact-relative path. If the item
1851
+ matches a directory all items in that directory will be removed.
1825
1852
 
1826
1853
  Raises:
1827
- ArtifactFinalizedError: You cannot make changes to the current artifact
1828
- version because it is finalized. Log a new artifact version instead.
1854
+ ArtifactFinalizedError: You cannot make changes to the current
1855
+ artifact version because it is finalized. Log a new artifact
1856
+ version instead.
1829
1857
  FileNotFoundError: If the item isn't found in the artifact.
1830
1858
  """
1831
1859
  if isinstance(item, ArtifactManifestEntry):
@@ -1881,10 +1909,12 @@ class Artifact:
1881
1909
  name: The artifact relative name to retrieve.
1882
1910
 
1883
1911
  Returns:
1884
- W&B object that can be logged with `wandb.log()` and visualized in the W&B UI.
1912
+ W&B object that can be logged with `run.log()` and
1913
+ visualized in the W&B UI.
1885
1914
 
1886
1915
  Raises:
1887
- ArtifactNotLoggedError: if the artifact isn't logged or the run is offline
1916
+ ArtifactNotLoggedError: if the artifact isn't logged or the
1917
+ run is offline.
1888
1918
  """
1889
1919
  entry, wb_class = self._get_obj_entry(name)
1890
1920
  if entry is None or wb_class is None:
@@ -2320,7 +2350,7 @@ class Artifact:
2320
2350
 
2321
2351
  Args:
2322
2352
  root: The root directory to store the file. Defaults to
2323
- './artifacts/self.name/'.
2353
+ `./artifacts/self.name/`.
2324
2354
 
2325
2355
  Returns:
2326
2356
  The full path of the downloaded file.
@@ -2386,16 +2416,16 @@ class Artifact:
2386
2416
  def delete(self, delete_aliases: bool = False) -> None:
2387
2417
  """Delete an artifact and its files.
2388
2418
 
2389
- If called on a linked artifact (i.e. a member of a portfolio collection): only the link is deleted, and the
2419
+ If called on a linked artifact, only the link is deleted, and the
2390
2420
  source artifact is unaffected.
2391
2421
 
2392
2422
  Use `artifact.unlink()` instead of `artifact.delete()` to remove a link between a source artifact and a linked artifact.
2393
2423
 
2394
2424
  Args:
2395
- delete_aliases: If set to `True`, deletes all aliases associated with the artifact.
2396
- Otherwise, this raises an exception if the artifact has existing
2397
- aliases.
2398
- This parameter is ignored if the artifact is linked (i.e. a member of a portfolio collection).
2425
+ delete_aliases: If set to `True`, deletes all aliases associated
2426
+ with the artifact. Otherwise, this raises an exception if
2427
+ the artifact has existing aliases. This parameter is ignored
2428
+ if the artifact is linked (a member of a portfolio collection).
2399
2429
 
2400
2430
  Raises:
2401
2431
  ArtifactNotLoggedError: If the artifact is not logged.
@@ -2448,8 +2478,8 @@ class Artifact:
2448
2478
  portfolio inside a project, set `target_path` to the following
2449
2479
  schema `{"model-registry"}/{Registered Model Name}` or
2450
2480
  `{entity}/{"model-registry"}/{Registered Model Name}`.
2451
- aliases: A list of strings that uniquely identifies the artifact inside the
2452
- specified portfolio.
2481
+ aliases: A list of strings that uniquely identifies the artifact
2482
+ inside the specified portfolio.
2453
2483
 
2454
2484
  Raises:
2455
2485
  ArtifactNotLoggedError: If the artifact is not logged.
@@ -2525,11 +2555,12 @@ class Artifact:
2525
2555
 
2526
2556
  @ensure_logged
2527
2557
  def unlink(self) -> None:
2528
- """Unlink this artifact if it is currently a member of a portfolio (a promoted collection of artifacts).
2558
+ """Unlink this artifact if it is currently a member of a promoted collection of artifacts.
2529
2559
 
2530
2560
  Raises:
2531
2561
  ArtifactNotLoggedError: If the artifact is not logged.
2532
- ValueError: If the artifact is not linked, i.e. it is not a member of a portfolio collection.
2562
+ ValueError: If the artifact is not linked, in other words,
2563
+ it is not a member of a portfolio collection.
2533
2564
  """
2534
2565
  # Fail early if this isn't a linked artifact to begin with
2535
2566
  if not self.is_link:
@@ -15,15 +15,7 @@ if TYPE_CHECKING:
15
15
 
16
16
 
17
17
  class Audio(BatchableMedia):
18
- """Wandb class for audio clips.
19
-
20
- Args:
21
- data_or_path: (string or numpy array) A path to an audio file
22
- or a numpy array of audio data.
23
- sample_rate: (int) Sample rate, required when passing in raw
24
- numpy array of audio data.
25
- caption: (string) Caption to display with audio.
26
- """
18
+ """W&B class for audio clips."""
27
19
 
28
20
  _log_type = "audio-file"
29
21
 
@@ -38,7 +30,13 @@ class Audio(BatchableMedia):
38
30
  sample_rate: Optional[int] = None,
39
31
  caption: Optional[str] = None,
40
32
  ):
41
- """Accept a path to an audio file or a numpy array of audio data."""
33
+ """Accept a path to an audio file or a numpy array of audio data.
34
+
35
+ Args:
36
+ data_or_path: A path to an audio file or a NumPy array of audio data.
37
+ sample_rate: Sample rate, required when passing in raw NumPy array of audio data.
38
+ caption: Caption to display with audio.
39
+ """
42
40
  super().__init__(caption=caption)
43
41
  self._duration = None
44
42
  self._sample_rate = sample_rate
@@ -72,10 +70,18 @@ class Audio(BatchableMedia):
72
70
 
73
71
  @classmethod
74
72
  def get_media_subdir(cls):
73
+ """Get media subdirectory.
74
+
75
+ <!-- lazydoc-ignore-classmethod: internal -->
76
+ """
75
77
  return os.path.join("media", "audio")
76
78
 
77
79
  @classmethod
78
80
  def from_json(cls, json_obj, source_artifact):
81
+ """Deserialize JSON object into it's class representation.
82
+
83
+ <!-- lazydoc-ignore-classmethod: internal -->
84
+ """
79
85
  return cls(
80
86
  source_artifact.get_entry(json_obj["path"]).download(),
81
87
  caption=json_obj["caption"],
@@ -84,6 +90,10 @@ class Audio(BatchableMedia):
84
90
  def bind_to_run(
85
91
  self, run, key, step, id_=None, ignore_copy_err: Optional[bool] = None
86
92
  ):
93
+ """Bind this object to a run.
94
+
95
+ <!-- lazydoc-ignore: internal -->
96
+ """
87
97
  if self.path_is_reference(self._path):
88
98
  raise ValueError(
89
99
  "Audio media created by a reference to external storage cannot currently be added to a run"
@@ -92,6 +102,10 @@ class Audio(BatchableMedia):
92
102
  return super().bind_to_run(run, key, step, id_, ignore_copy_err)
93
103
 
94
104
  def to_json(self, run):
105
+ """Returns the JSON representation expected by the backend.
106
+
107
+ <!-- lazydoc-ignore: internal -->
108
+ """
95
109
  json_dict = super().to_json(run)
96
110
  json_dict.update(
97
111
  {
@@ -102,6 +116,10 @@ class Audio(BatchableMedia):
102
116
 
103
117
  @classmethod
104
118
  def seq_to_json(cls, seq, run, key, step):
119
+ """Convert a sequence of Audio objects to a JSON representation.
120
+
121
+ <!-- lazydoc-ignore-classmethod: internal -->
122
+ """
105
123
  audio_list = list(seq)
106
124
 
107
125
  util.get_module(
@@ -129,14 +147,20 @@ class Audio(BatchableMedia):
129
147
 
130
148
  @classmethod
131
149
  def durations(cls, audio_list):
150
+ """Calculate the duration of the audio files."""
132
151
  return [a._duration for a in audio_list]
133
152
 
134
153
  @classmethod
135
154
  def sample_rates(cls, audio_list):
155
+ """Get sample rates of the audio files."""
136
156
  return [a._sample_rate for a in audio_list]
137
157
 
138
158
  @classmethod
139
159
  def captions(cls, audio_list):
160
+ """Get the captions of the audio files.
161
+
162
+ <!-- lazydoc-ignore-classmethod: internal -->
163
+ """
140
164
  captions = [a._caption for a in audio_list]
141
165
  if all(c is None for c in captions):
142
166
  return False
@@ -144,6 +168,10 @@ class Audio(BatchableMedia):
144
168
  return ["" if c is None else c for c in captions]
145
169
 
146
170
  def resolve_ref(self):
171
+ """Resolve the reference to the actual file path.
172
+
173
+ <!-- lazydoc-ignore: internal -->
174
+ """
147
175
  if self.path_is_reference(self._path):
148
176
  # this object was already created using a ref:
149
177
  return self._path