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.
- wandb/__init__.py +16 -14
- wandb/__init__.pyi +427 -450
- wandb/agents/pyagent.py +41 -12
- wandb/analytics/sentry.py +7 -2
- wandb/apis/importers/mlflow.py +1 -1
- wandb/apis/public/__init__.py +1 -1
- wandb/apis/public/api.py +526 -360
- wandb/apis/public/artifacts.py +204 -8
- wandb/apis/public/automations.py +19 -3
- wandb/apis/public/files.py +172 -33
- wandb/apis/public/history.py +67 -15
- wandb/apis/public/integrations.py +25 -2
- wandb/apis/public/jobs.py +90 -2
- wandb/apis/public/projects.py +130 -79
- wandb/apis/public/query_generator.py +11 -1
- wandb/apis/public/registries/registries_search.py +7 -15
- wandb/apis/public/reports.py +83 -5
- wandb/apis/public/runs.py +299 -105
- wandb/apis/public/sweeps.py +222 -22
- wandb/apis/public/teams.py +41 -4
- wandb/apis/public/users.py +45 -4
- wandb/beta/workflows.py +66 -30
- wandb/bin/gpu_stats.exe +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/cli.py +80 -1
- wandb/env.py +8 -0
- wandb/errors/errors.py +4 -1
- wandb/integration/lightning/fabric/logger.py +3 -4
- wandb/integration/metaflow/__init__.py +6 -0
- wandb/integration/metaflow/data_pandas.py +74 -0
- wandb/integration/metaflow/errors.py +13 -0
- wandb/integration/metaflow/metaflow.py +205 -190
- wandb/integration/openai/fine_tuning.py +1 -2
- wandb/jupyter.py +5 -5
- wandb/plot/custom_chart.py +30 -7
- wandb/proto/v3/wandb_internal_pb2.py +280 -280
- wandb/proto/v3/wandb_telemetry_pb2.py +4 -4
- wandb/proto/v4/wandb_internal_pb2.py +280 -280
- wandb/proto/v4/wandb_telemetry_pb2.py +4 -4
- wandb/proto/v5/wandb_internal_pb2.py +280 -280
- wandb/proto/v5/wandb_telemetry_pb2.py +4 -4
- wandb/proto/v6/wandb_internal_pb2.py +280 -280
- wandb/proto/v6/wandb_telemetry_pb2.py +4 -4
- wandb/proto/wandb_deprecated.py +6 -0
- wandb/sdk/artifacts/_internal_artifact.py +19 -8
- wandb/sdk/artifacts/_validators.py +8 -0
- wandb/sdk/artifacts/artifact.py +106 -75
- wandb/sdk/data_types/audio.py +38 -10
- wandb/sdk/data_types/base_types/media.py +6 -56
- wandb/sdk/data_types/graph.py +48 -14
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +1 -3
- wandb/sdk/data_types/helper_types/image_mask.py +1 -3
- wandb/sdk/data_types/histogram.py +34 -21
- wandb/sdk/data_types/html.py +35 -12
- wandb/sdk/data_types/image.py +104 -68
- wandb/sdk/data_types/molecule.py +32 -19
- wandb/sdk/data_types/object_3d.py +36 -17
- wandb/sdk/data_types/plotly.py +18 -5
- wandb/sdk/data_types/saved_model.py +4 -6
- wandb/sdk/data_types/table.py +59 -30
- wandb/sdk/data_types/video.py +53 -26
- wandb/sdk/integration_utils/auto_logging.py +2 -2
- wandb/sdk/internal/internal_api.py +6 -0
- wandb/sdk/internal/job_builder.py +6 -0
- wandb/sdk/launch/agent/agent.py +8 -1
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +2 -2
- wandb/sdk/launch/create_job.py +3 -1
- wandb/sdk/launch/inputs/internal.py +3 -4
- wandb/sdk/launch/inputs/schema.py +1 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +1 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +328 -1
- wandb/sdk/launch/sweeps/scheduler.py +2 -3
- wandb/sdk/lib/asyncio_compat.py +3 -0
- wandb/sdk/lib/deprecate.py +1 -7
- wandb/sdk/lib/disabled.py +1 -1
- wandb/sdk/lib/hashutil.py +14 -1
- wandb/sdk/lib/module.py +7 -13
- wandb/sdk/lib/progress.py +0 -19
- wandb/sdk/lib/sock_client.py +0 -4
- wandb/sdk/wandb_init.py +66 -91
- wandb/sdk/wandb_login.py +18 -14
- wandb/sdk/wandb_metric.py +2 -0
- wandb/sdk/wandb_run.py +406 -414
- wandb/sdk/wandb_settings.py +130 -2
- wandb/sdk/wandb_setup.py +28 -28
- wandb/sdk/wandb_sweep.py +14 -13
- wandb/sdk/wandb_watch.py +4 -6
- wandb/sync/sync.py +10 -0
- wandb/util.py +57 -0
- wandb/wandb_run.py +1 -2
- {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/METADATA +1 -1
- {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/RECORD +95 -95
- wandb/vendor/pynvml/__init__.py +0 -0
- wandb/vendor/pynvml/pynvml.py +0 -4779
- {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/WHEEL +0 -0
- {wandb-0.21.0.dist-info → wandb-0.21.1.dist-info}/entry_points.txt +0 -0
- {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=
|
50
|
-
_globals['_ISSUES']._serialized_start=
|
51
|
-
_globals['_ISSUES']._serialized_end=
|
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)
|
wandb/proto/wandb_deprecated.py
CHANGED
@@ -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
|
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
|
18
|
-
|
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:
|
35
|
-
metadata:
|
45
|
+
description: str | None = None,
|
46
|
+
metadata: dict[str, Any] | None = None,
|
36
47
|
incremental: bool = False,
|
37
|
-
use_as:
|
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.
|
wandb/sdk/artifacts/artifact.py
CHANGED
@@ -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
|
-
`
|
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
|
-
|
146
|
-
|
147
|
-
|
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.
|
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
|
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
|
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
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
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:
|
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 `
|
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
|
1438
|
-
version because it is finalized. Log a new artifact
|
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
|
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
|
1460
|
-
version because it is finalized. Log a new artifact
|
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.
|
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`,
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
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
|
1514
|
-
|
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
|
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
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
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
|
1565
|
-
|
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.
|
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`
|
1629
|
-
|
1630
|
-
enabled, then the version ID is
|
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.
|
1652
|
-
the maximum number of objects allowed for Amazon S3,
|
1653
|
-
GCS, Azure, and local files is 10,000,000. Other URI schemas
|
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
|
1660
|
-
version because it is finalized. Log a new artifact
|
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,
|
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
|
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
|
1707
|
-
version because it is finalized. Log a new artifact
|
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
|
1823
|
-
artifact-relative path. If the item
|
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
|
1828
|
-
|
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 `
|
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
|
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
|
-
|
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
|
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
|
2396
|
-
Otherwise, this raises an exception if
|
2397
|
-
aliases.
|
2398
|
-
|
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
|
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
|
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,
|
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:
|
wandb/sdk/data_types/audio.py
CHANGED
@@ -15,15 +15,7 @@ if TYPE_CHECKING:
|
|
15
15
|
|
16
16
|
|
17
17
|
class Audio(BatchableMedia):
|
18
|
-
"""
|
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
|