wandb 0.21.2__py3-none-macosx_12_0_x86_64.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 (904) hide show
  1. package_readme.md +97 -0
  2. wandb/__init__.py +248 -0
  3. wandb/__init__.pyi +1230 -0
  4. wandb/__main__.py +3 -0
  5. wandb/_iterutils.py +65 -0
  6. wandb/_pydantic/__init__.py +30 -0
  7. wandb/_pydantic/base.py +128 -0
  8. wandb/_pydantic/utils.py +80 -0
  9. wandb/_pydantic/v1_compat.py +284 -0
  10. wandb/agents/__init__.py +0 -0
  11. wandb/agents/pyagent.py +386 -0
  12. wandb/analytics/__init__.py +3 -0
  13. wandb/analytics/sentry.py +267 -0
  14. wandb/apis/__init__.py +48 -0
  15. wandb/apis/attrs.py +50 -0
  16. wandb/apis/importers/__init__.py +1 -0
  17. wandb/apis/importers/internals/internal.py +382 -0
  18. wandb/apis/importers/internals/protocols.py +103 -0
  19. wandb/apis/importers/internals/util.py +78 -0
  20. wandb/apis/importers/mlflow.py +254 -0
  21. wandb/apis/importers/validation.py +108 -0
  22. wandb/apis/importers/wandb.py +1608 -0
  23. wandb/apis/internal.py +239 -0
  24. wandb/apis/normalize.py +81 -0
  25. wandb/apis/paginator.py +138 -0
  26. wandb/apis/public/__init__.py +35 -0
  27. wandb/apis/public/api.py +2449 -0
  28. wandb/apis/public/artifacts.py +1046 -0
  29. wandb/apis/public/automations.py +85 -0
  30. wandb/apis/public/const.py +4 -0
  31. wandb/apis/public/files.py +402 -0
  32. wandb/apis/public/history.py +201 -0
  33. wandb/apis/public/integrations.py +203 -0
  34. wandb/apis/public/jobs.py +742 -0
  35. wandb/apis/public/projects.py +276 -0
  36. wandb/apis/public/query_generator.py +176 -0
  37. wandb/apis/public/registries/__init__.py +0 -0
  38. wandb/apis/public/registries/_freezable_list.py +179 -0
  39. wandb/apis/public/registries/_utils.py +138 -0
  40. wandb/apis/public/registries/registries_search.py +347 -0
  41. wandb/apis/public/registries/registry.py +358 -0
  42. wandb/apis/public/reports.py +595 -0
  43. wandb/apis/public/runs.py +1216 -0
  44. wandb/apis/public/sweeps.py +440 -0
  45. wandb/apis/public/teams.py +235 -0
  46. wandb/apis/public/users.py +177 -0
  47. wandb/apis/public/utils.py +210 -0
  48. wandb/apis/reports/__init__.py +1 -0
  49. wandb/apis/reports/v1/__init__.py +8 -0
  50. wandb/apis/reports/v2/__init__.py +8 -0
  51. wandb/apis/workspaces/__init__.py +8 -0
  52. wandb/automations/__init__.py +73 -0
  53. wandb/automations/_filters/__init__.py +40 -0
  54. wandb/automations/_filters/expressions.py +181 -0
  55. wandb/automations/_filters/operators.py +258 -0
  56. wandb/automations/_filters/run_metrics.py +330 -0
  57. wandb/automations/_generated/__init__.py +177 -0
  58. wandb/automations/_generated/create_automation.py +17 -0
  59. wandb/automations/_generated/create_generic_webhook_integration.py +43 -0
  60. wandb/automations/_generated/delete_automation.py +15 -0
  61. wandb/automations/_generated/enums.py +35 -0
  62. wandb/automations/_generated/fragments.py +358 -0
  63. wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
  64. wandb/automations/_generated/get_automations.py +24 -0
  65. wandb/automations/_generated/get_automations_by_entity.py +26 -0
  66. wandb/automations/_generated/input_types.py +104 -0
  67. wandb/automations/_generated/integrations_by_entity.py +22 -0
  68. wandb/automations/_generated/operations.py +647 -0
  69. wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
  70. wandb/automations/_generated/update_automation.py +17 -0
  71. wandb/automations/_utils.py +235 -0
  72. wandb/automations/_validators.py +165 -0
  73. wandb/automations/actions.py +218 -0
  74. wandb/automations/automations.py +85 -0
  75. wandb/automations/events.py +285 -0
  76. wandb/automations/integrations.py +45 -0
  77. wandb/automations/scopes.py +78 -0
  78. wandb/beta/workflows.py +324 -0
  79. wandb/bin/gpu_stats +0 -0
  80. wandb/bin/wandb-core +0 -0
  81. wandb/cli/__init__.py +0 -0
  82. wandb/cli/beta.py +175 -0
  83. wandb/cli/cli.py +2883 -0
  84. wandb/data_types.py +66 -0
  85. wandb/docker/__init__.py +290 -0
  86. wandb/docker/names.py +40 -0
  87. wandb/docker/wandb-entrypoint.sh +33 -0
  88. wandb/env.py +535 -0
  89. wandb/errors/__init__.py +17 -0
  90. wandb/errors/errors.py +40 -0
  91. wandb/errors/links.py +73 -0
  92. wandb/errors/term.py +415 -0
  93. wandb/errors/util.py +57 -0
  94. wandb/errors/warnings.py +2 -0
  95. wandb/filesync/__init__.py +0 -0
  96. wandb/filesync/dir_watcher.py +404 -0
  97. wandb/filesync/stats.py +100 -0
  98. wandb/filesync/step_checksum.py +142 -0
  99. wandb/filesync/step_prepare.py +179 -0
  100. wandb/filesync/step_upload.py +287 -0
  101. wandb/filesync/upload_job.py +142 -0
  102. wandb/integration/__init__.py +0 -0
  103. wandb/integration/catboost/__init__.py +5 -0
  104. wandb/integration/catboost/catboost.py +182 -0
  105. wandb/integration/cohere/__init__.py +3 -0
  106. wandb/integration/cohere/cohere.py +21 -0
  107. wandb/integration/cohere/resolver.py +347 -0
  108. wandb/integration/diffusers/__init__.py +3 -0
  109. wandb/integration/diffusers/autologger.py +76 -0
  110. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  111. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  112. wandb/integration/diffusers/resolvers/multimodal.py +881 -0
  113. wandb/integration/diffusers/resolvers/utils.py +102 -0
  114. wandb/integration/fastai/__init__.py +243 -0
  115. wandb/integration/gym/__init__.py +98 -0
  116. wandb/integration/huggingface/__init__.py +3 -0
  117. wandb/integration/huggingface/huggingface.py +18 -0
  118. wandb/integration/huggingface/resolver.py +213 -0
  119. wandb/integration/keras/__init__.py +11 -0
  120. wandb/integration/keras/callbacks/__init__.py +5 -0
  121. wandb/integration/keras/callbacks/metrics_logger.py +129 -0
  122. wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
  123. wandb/integration/keras/callbacks/tables_builder.py +228 -0
  124. wandb/integration/keras/keras.py +1086 -0
  125. wandb/integration/kfp/__init__.py +6 -0
  126. wandb/integration/kfp/helpers.py +28 -0
  127. wandb/integration/kfp/kfp_patch.py +335 -0
  128. wandb/integration/kfp/wandb_logging.py +182 -0
  129. wandb/integration/langchain/__init__.py +3 -0
  130. wandb/integration/langchain/wandb_tracer.py +49 -0
  131. wandb/integration/lightgbm/__init__.py +239 -0
  132. wandb/integration/lightning/__init__.py +0 -0
  133. wandb/integration/lightning/fabric/__init__.py +3 -0
  134. wandb/integration/lightning/fabric/logger.py +763 -0
  135. wandb/integration/metaflow/__init__.py +9 -0
  136. wandb/integration/metaflow/data_pandas.py +74 -0
  137. wandb/integration/metaflow/data_pytorch.py +75 -0
  138. wandb/integration/metaflow/data_sklearn.py +76 -0
  139. wandb/integration/metaflow/errors.py +13 -0
  140. wandb/integration/metaflow/metaflow.py +327 -0
  141. wandb/integration/openai/__init__.py +3 -0
  142. wandb/integration/openai/fine_tuning.py +480 -0
  143. wandb/integration/openai/openai.py +22 -0
  144. wandb/integration/openai/resolver.py +240 -0
  145. wandb/integration/prodigy/__init__.py +3 -0
  146. wandb/integration/prodigy/prodigy.py +291 -0
  147. wandb/integration/sacred/__init__.py +117 -0
  148. wandb/integration/sagemaker/__init__.py +14 -0
  149. wandb/integration/sagemaker/auth.py +29 -0
  150. wandb/integration/sagemaker/config.py +58 -0
  151. wandb/integration/sagemaker/files.py +2 -0
  152. wandb/integration/sagemaker/resources.py +63 -0
  153. wandb/integration/sb3/__init__.py +3 -0
  154. wandb/integration/sb3/sb3.py +147 -0
  155. wandb/integration/sklearn/__init__.py +37 -0
  156. wandb/integration/sklearn/calculate/__init__.py +32 -0
  157. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  158. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  159. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  160. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  161. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  162. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  163. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  164. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  165. wandb/integration/sklearn/calculate/residuals.py +86 -0
  166. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  167. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  168. wandb/integration/sklearn/plot/__init__.py +35 -0
  169. wandb/integration/sklearn/plot/classifier.py +329 -0
  170. wandb/integration/sklearn/plot/clusterer.py +146 -0
  171. wandb/integration/sklearn/plot/regressor.py +121 -0
  172. wandb/integration/sklearn/plot/shared.py +91 -0
  173. wandb/integration/sklearn/utils.py +184 -0
  174. wandb/integration/tensorboard/__init__.py +10 -0
  175. wandb/integration/tensorboard/log.py +351 -0
  176. wandb/integration/tensorboard/monkeypatch.py +186 -0
  177. wandb/integration/tensorflow/__init__.py +5 -0
  178. wandb/integration/tensorflow/estimator_hook.py +54 -0
  179. wandb/integration/torch/__init__.py +0 -0
  180. wandb/integration/torch/wandb_torch.py +554 -0
  181. wandb/integration/ultralytics/__init__.py +11 -0
  182. wandb/integration/ultralytics/bbox_utils.py +215 -0
  183. wandb/integration/ultralytics/callback.py +528 -0
  184. wandb/integration/ultralytics/classification_utils.py +83 -0
  185. wandb/integration/ultralytics/mask_utils.py +202 -0
  186. wandb/integration/ultralytics/pose_utils.py +103 -0
  187. wandb/integration/weave/__init__.py +6 -0
  188. wandb/integration/weave/interface.py +49 -0
  189. wandb/integration/weave/weave.py +63 -0
  190. wandb/integration/xgboost/__init__.py +11 -0
  191. wandb/integration/xgboost/xgboost.py +189 -0
  192. wandb/integration/yolov8/__init__.py +0 -0
  193. wandb/integration/yolov8/yolov8.py +284 -0
  194. wandb/jupyter.py +538 -0
  195. wandb/mpmain/__init__.py +0 -0
  196. wandb/mpmain/__main__.py +1 -0
  197. wandb/old/__init__.py +0 -0
  198. wandb/old/core.py +53 -0
  199. wandb/old/settings.py +176 -0
  200. wandb/old/summary.py +438 -0
  201. wandb/plot/__init__.py +30 -0
  202. wandb/plot/bar.py +71 -0
  203. wandb/plot/confusion_matrix.py +185 -0
  204. wandb/plot/custom_chart.py +147 -0
  205. wandb/plot/histogram.py +66 -0
  206. wandb/plot/line.py +75 -0
  207. wandb/plot/line_series.py +173 -0
  208. wandb/plot/pr_curve.py +186 -0
  209. wandb/plot/roc_curve.py +163 -0
  210. wandb/plot/scatter.py +66 -0
  211. wandb/plot/utils.py +184 -0
  212. wandb/plot/viz.py +41 -0
  213. wandb/proto/__init__.py +0 -0
  214. wandb/proto/v3/__init__.py +0 -0
  215. wandb/proto/v3/wandb_base_pb2.py +55 -0
  216. wandb/proto/v3/wandb_internal_pb2.py +1728 -0
  217. wandb/proto/v3/wandb_server_pb2.py +228 -0
  218. wandb/proto/v3/wandb_settings_pb2.py +122 -0
  219. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  220. wandb/proto/v4/__init__.py +0 -0
  221. wandb/proto/v4/wandb_base_pb2.py +30 -0
  222. wandb/proto/v4/wandb_internal_pb2.py +382 -0
  223. wandb/proto/v4/wandb_server_pb2.py +67 -0
  224. wandb/proto/v4/wandb_settings_pb2.py +47 -0
  225. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  226. wandb/proto/v5/wandb_base_pb2.py +31 -0
  227. wandb/proto/v5/wandb_internal_pb2.py +383 -0
  228. wandb/proto/v5/wandb_server_pb2.py +68 -0
  229. wandb/proto/v5/wandb_settings_pb2.py +48 -0
  230. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  231. wandb/proto/v6/wandb_base_pb2.py +41 -0
  232. wandb/proto/v6/wandb_internal_pb2.py +393 -0
  233. wandb/proto/v6/wandb_server_pb2.py +78 -0
  234. wandb/proto/v6/wandb_settings_pb2.py +58 -0
  235. wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
  236. wandb/proto/wandb_base_pb2.py +12 -0
  237. wandb/proto/wandb_deprecated.py +59 -0
  238. wandb/proto/wandb_generate_deprecated.py +30 -0
  239. wandb/proto/wandb_generate_proto.py +49 -0
  240. wandb/proto/wandb_internal_pb2.py +18 -0
  241. wandb/proto/wandb_server_pb2.py +12 -0
  242. wandb/proto/wandb_settings_pb2.py +12 -0
  243. wandb/proto/wandb_telemetry_pb2.py +12 -0
  244. wandb/py.typed +0 -0
  245. wandb/sdk/__init__.py +37 -0
  246. wandb/sdk/artifacts/__init__.py +0 -0
  247. wandb/sdk/artifacts/_factories.py +17 -0
  248. wandb/sdk/artifacts/_generated/__init__.py +508 -0
  249. wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
  250. wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
  251. wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
  252. wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
  253. wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
  254. wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
  255. wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
  256. wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
  257. wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
  258. wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
  259. wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
  260. wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
  261. wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
  262. wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
  263. wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
  264. wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
  265. wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
  266. wandb/sdk/artifacts/_generated/enums.py +22 -0
  267. wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
  268. wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
  269. wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
  270. wandb/sdk/artifacts/_generated/fragments.py +459 -0
  271. wandb/sdk/artifacts/_generated/input_types.py +46 -0
  272. wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
  273. wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
  274. wandb/sdk/artifacts/_generated/operations.py +1223 -0
  275. wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
  276. wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
  277. wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
  278. wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
  279. wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
  280. wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
  281. wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
  282. wandb/sdk/artifacts/_generated/run_input_artifacts.py +51 -0
  283. wandb/sdk/artifacts/_generated/run_output_artifacts.py +51 -0
  284. wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
  285. wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
  286. wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
  287. wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
  288. wandb/sdk/artifacts/_graphql_fragments.py +19 -0
  289. wandb/sdk/artifacts/_internal_artifact.py +54 -0
  290. wandb/sdk/artifacts/_validators.py +309 -0
  291. wandb/sdk/artifacts/artifact.py +2702 -0
  292. wandb/sdk/artifacts/artifact_download_logger.py +45 -0
  293. wandb/sdk/artifacts/artifact_file_cache.py +251 -0
  294. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  295. wandb/sdk/artifacts/artifact_manifest.py +76 -0
  296. wandb/sdk/artifacts/artifact_manifest_entry.py +258 -0
  297. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  298. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
  299. wandb/sdk/artifacts/artifact_saver.py +277 -0
  300. wandb/sdk/artifacts/artifact_state.py +13 -0
  301. wandb/sdk/artifacts/artifact_ttl.py +9 -0
  302. wandb/sdk/artifacts/exceptions.py +71 -0
  303. wandb/sdk/artifacts/staging.py +27 -0
  304. wandb/sdk/artifacts/storage_handler.py +62 -0
  305. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  306. wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
  307. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
  308. wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
  309. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
  310. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  311. wandb/sdk/artifacts/storage_handlers/s3_handler.py +339 -0
  312. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
  313. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
  314. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  315. wandb/sdk/artifacts/storage_layout.py +8 -0
  316. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  317. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  318. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +580 -0
  319. wandb/sdk/artifacts/storage_policy.py +75 -0
  320. wandb/sdk/backend/__init__.py +0 -0
  321. wandb/sdk/backend/backend.py +57 -0
  322. wandb/sdk/data_types/__init__.py +0 -0
  323. wandb/sdk/data_types/_dtypes.py +914 -0
  324. wandb/sdk/data_types/_private.py +10 -0
  325. wandb/sdk/data_types/audio.py +208 -0
  326. wandb/sdk/data_types/base_types/__init__.py +0 -0
  327. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  328. wandb/sdk/data_types/base_types/media.py +339 -0
  329. wandb/sdk/data_types/base_types/wb_value.py +295 -0
  330. wandb/sdk/data_types/bokeh.py +87 -0
  331. wandb/sdk/data_types/graph.py +439 -0
  332. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  333. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
  334. wandb/sdk/data_types/helper_types/classes.py +159 -0
  335. wandb/sdk/data_types/helper_types/image_mask.py +251 -0
  336. wandb/sdk/data_types/histogram.py +107 -0
  337. wandb/sdk/data_types/html.py +165 -0
  338. wandb/sdk/data_types/image.py +974 -0
  339. wandb/sdk/data_types/molecule.py +250 -0
  340. wandb/sdk/data_types/object_3d.py +495 -0
  341. wandb/sdk/data_types/plotly.py +95 -0
  342. wandb/sdk/data_types/saved_model.py +435 -0
  343. wandb/sdk/data_types/table.py +1468 -0
  344. wandb/sdk/data_types/table_decorators.py +108 -0
  345. wandb/sdk/data_types/trace_tree.py +440 -0
  346. wandb/sdk/data_types/utils.py +260 -0
  347. wandb/sdk/data_types/video.py +303 -0
  348. wandb/sdk/integration_utils/__init__.py +0 -0
  349. wandb/sdk/integration_utils/auto_logging.py +232 -0
  350. wandb/sdk/integration_utils/data_logging.py +475 -0
  351. wandb/sdk/interface/__init__.py +0 -0
  352. wandb/sdk/interface/constants.py +4 -0
  353. wandb/sdk/interface/interface.py +1056 -0
  354. wandb/sdk/interface/interface_queue.py +40 -0
  355. wandb/sdk/interface/interface_shared.py +471 -0
  356. wandb/sdk/interface/interface_sock.py +49 -0
  357. wandb/sdk/interface/summary_record.py +67 -0
  358. wandb/sdk/internal/__init__.py +0 -0
  359. wandb/sdk/internal/_generated/__init__.py +15 -0
  360. wandb/sdk/internal/_generated/enums.py +4 -0
  361. wandb/sdk/internal/_generated/input_types.py +4 -0
  362. wandb/sdk/internal/_generated/operations.py +15 -0
  363. wandb/sdk/internal/_generated/server_features_query.py +27 -0
  364. wandb/sdk/internal/context.py +89 -0
  365. wandb/sdk/internal/datastore.py +293 -0
  366. wandb/sdk/internal/file_pusher.py +177 -0
  367. wandb/sdk/internal/file_stream.py +686 -0
  368. wandb/sdk/internal/handler.py +854 -0
  369. wandb/sdk/internal/incremental_table_util.py +53 -0
  370. wandb/sdk/internal/internal_api.py +4723 -0
  371. wandb/sdk/internal/job_builder.py +639 -0
  372. wandb/sdk/internal/profiler.py +79 -0
  373. wandb/sdk/internal/progress.py +77 -0
  374. wandb/sdk/internal/run.py +27 -0
  375. wandb/sdk/internal/sample.py +70 -0
  376. wandb/sdk/internal/sender.py +1692 -0
  377. wandb/sdk/internal/sender_config.py +203 -0
  378. wandb/sdk/internal/settings_static.py +120 -0
  379. wandb/sdk/internal/tb_watcher.py +519 -0
  380. wandb/sdk/internal/thread_local_settings.py +18 -0
  381. wandb/sdk/launch/__init__.py +15 -0
  382. wandb/sdk/launch/_launch.py +331 -0
  383. wandb/sdk/launch/_launch_add.py +255 -0
  384. wandb/sdk/launch/_project_spec.py +565 -0
  385. wandb/sdk/launch/agent/__init__.py +5 -0
  386. wandb/sdk/launch/agent/agent.py +931 -0
  387. wandb/sdk/launch/agent/config.py +296 -0
  388. wandb/sdk/launch/agent/job_status_tracker.py +55 -0
  389. wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
  390. wandb/sdk/launch/builder/__init__.py +0 -0
  391. wandb/sdk/launch/builder/abstract.py +156 -0
  392. wandb/sdk/launch/builder/build.py +296 -0
  393. wandb/sdk/launch/builder/context_manager.py +235 -0
  394. wandb/sdk/launch/builder/docker_builder.py +177 -0
  395. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  396. wandb/sdk/launch/builder/noop.py +58 -0
  397. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  398. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  399. wandb/sdk/launch/create_job.py +541 -0
  400. wandb/sdk/launch/environment/abstract.py +29 -0
  401. wandb/sdk/launch/environment/aws_environment.py +322 -0
  402. wandb/sdk/launch/environment/azure_environment.py +105 -0
  403. wandb/sdk/launch/environment/gcp_environment.py +334 -0
  404. wandb/sdk/launch/environment/local_environment.py +65 -0
  405. wandb/sdk/launch/errors.py +13 -0
  406. wandb/sdk/launch/git_reference.py +109 -0
  407. wandb/sdk/launch/inputs/files.py +148 -0
  408. wandb/sdk/launch/inputs/internal.py +314 -0
  409. wandb/sdk/launch/inputs/manage.py +113 -0
  410. wandb/sdk/launch/inputs/schema.py +40 -0
  411. wandb/sdk/launch/loader.py +249 -0
  412. wandb/sdk/launch/registry/abstract.py +48 -0
  413. wandb/sdk/launch/registry/anon.py +29 -0
  414. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  415. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  416. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  417. wandb/sdk/launch/registry/local_registry.py +65 -0
  418. wandb/sdk/launch/runner/__init__.py +0 -0
  419. wandb/sdk/launch/runner/abstract.py +185 -0
  420. wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
  421. wandb/sdk/launch/runner/kubernetes_runner.py +1285 -0
  422. wandb/sdk/launch/runner/local_container.py +301 -0
  423. wandb/sdk/launch/runner/local_process.py +78 -0
  424. wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
  425. wandb/sdk/launch/runner/vertex_runner.py +225 -0
  426. wandb/sdk/launch/sweeps/__init__.py +37 -0
  427. wandb/sdk/launch/sweeps/scheduler.py +739 -0
  428. wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
  429. wandb/sdk/launch/sweeps/utils.py +324 -0
  430. wandb/sdk/launch/utils.py +746 -0
  431. wandb/sdk/launch/wandb_reference.py +138 -0
  432. wandb/sdk/lib/__init__.py +5 -0
  433. wandb/sdk/lib/apikey.py +334 -0
  434. wandb/sdk/lib/asyncio_compat.py +213 -0
  435. wandb/sdk/lib/asyncio_manager.py +252 -0
  436. wandb/sdk/lib/capped_dict.py +26 -0
  437. wandb/sdk/lib/config_util.py +101 -0
  438. wandb/sdk/lib/console_capture.py +219 -0
  439. wandb/sdk/lib/credentials.py +141 -0
  440. wandb/sdk/lib/deprecate.py +27 -0
  441. wandb/sdk/lib/disabled.py +30 -0
  442. wandb/sdk/lib/exit_hooks.py +54 -0
  443. wandb/sdk/lib/file_stream_utils.py +118 -0
  444. wandb/sdk/lib/filenames.py +64 -0
  445. wandb/sdk/lib/filesystem.py +372 -0
  446. wandb/sdk/lib/fsm.py +165 -0
  447. wandb/sdk/lib/gitlib.py +240 -0
  448. wandb/sdk/lib/gql_request.py +65 -0
  449. wandb/sdk/lib/handler_util.py +21 -0
  450. wandb/sdk/lib/hashutil.py +106 -0
  451. wandb/sdk/lib/import_hooks.py +275 -0
  452. wandb/sdk/lib/interrupt.py +37 -0
  453. wandb/sdk/lib/ipython.py +126 -0
  454. wandb/sdk/lib/json_util.py +75 -0
  455. wandb/sdk/lib/lazyloader.py +63 -0
  456. wandb/sdk/lib/module.py +72 -0
  457. wandb/sdk/lib/paths.py +106 -0
  458. wandb/sdk/lib/preinit.py +42 -0
  459. wandb/sdk/lib/printer.py +571 -0
  460. wandb/sdk/lib/printer_asyncio.py +48 -0
  461. wandb/sdk/lib/progress.py +320 -0
  462. wandb/sdk/lib/proto_util.py +90 -0
  463. wandb/sdk/lib/redirect.py +876 -0
  464. wandb/sdk/lib/retry.py +395 -0
  465. wandb/sdk/lib/run_moment.py +82 -0
  466. wandb/sdk/lib/runid.py +12 -0
  467. wandb/sdk/lib/server.py +58 -0
  468. wandb/sdk/lib/service/ipc_support.py +13 -0
  469. wandb/sdk/lib/service/service_client.py +106 -0
  470. wandb/sdk/lib/service/service_connection.py +192 -0
  471. wandb/sdk/lib/service/service_port_file.py +105 -0
  472. wandb/sdk/lib/service/service_process.py +111 -0
  473. wandb/sdk/lib/service/service_token.py +181 -0
  474. wandb/sdk/lib/sparkline.py +44 -0
  475. wandb/sdk/lib/telemetry.py +100 -0
  476. wandb/sdk/lib/timed_input.py +133 -0
  477. wandb/sdk/lib/timer.py +19 -0
  478. wandb/sdk/lib/wb_logging.py +161 -0
  479. wandb/sdk/mailbox/__init__.py +23 -0
  480. wandb/sdk/mailbox/mailbox.py +143 -0
  481. wandb/sdk/mailbox/mailbox_handle.py +132 -0
  482. wandb/sdk/mailbox/response_handle.py +99 -0
  483. wandb/sdk/mailbox/wait_with_progress.py +100 -0
  484. wandb/sdk/projects/_generated/__init__.py +47 -0
  485. wandb/sdk/projects/_generated/delete_project.py +22 -0
  486. wandb/sdk/projects/_generated/enums.py +4 -0
  487. wandb/sdk/projects/_generated/fetch_registry.py +22 -0
  488. wandb/sdk/projects/_generated/fragments.py +41 -0
  489. wandb/sdk/projects/_generated/input_types.py +13 -0
  490. wandb/sdk/projects/_generated/operations.py +88 -0
  491. wandb/sdk/projects/_generated/rename_project.py +27 -0
  492. wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
  493. wandb/sdk/verify/__init__.py +0 -0
  494. wandb/sdk/verify/verify.py +555 -0
  495. wandb/sdk/wandb_alerts.py +12 -0
  496. wandb/sdk/wandb_config.py +323 -0
  497. wandb/sdk/wandb_helper.py +54 -0
  498. wandb/sdk/wandb_init.py +1581 -0
  499. wandb/sdk/wandb_login.py +332 -0
  500. wandb/sdk/wandb_metric.py +112 -0
  501. wandb/sdk/wandb_require.py +88 -0
  502. wandb/sdk/wandb_require_helpers.py +44 -0
  503. wandb/sdk/wandb_run.py +4088 -0
  504. wandb/sdk/wandb_settings.py +2105 -0
  505. wandb/sdk/wandb_setup.py +560 -0
  506. wandb/sdk/wandb_summary.py +150 -0
  507. wandb/sdk/wandb_sweep.py +120 -0
  508. wandb/sdk/wandb_sync.py +71 -0
  509. wandb/sdk/wandb_watch.py +146 -0
  510. wandb/sklearn.py +35 -0
  511. wandb/sync/__init__.py +3 -0
  512. wandb/sync/sync.py +452 -0
  513. wandb/trigger.py +29 -0
  514. wandb/util.py +2040 -0
  515. wandb/vendor/__init__.py +0 -0
  516. wandb/vendor/gql-0.2.0/setup.py +40 -0
  517. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  518. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  519. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  520. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  521. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  522. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  523. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  524. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  525. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  526. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  527. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  528. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  529. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  530. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  531. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  532. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  533. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  534. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  535. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  536. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  537. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  538. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  539. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  540. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  541. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  542. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  543. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  544. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  545. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  546. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  547. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  548. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  549. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  550. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  555. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  556. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  557. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  558. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  559. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  560. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  561. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  562. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  563. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  564. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  565. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  566. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  567. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  568. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  569. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  570. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  571. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  572. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  573. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  574. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  575. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  576. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  577. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  578. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  579. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  580. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  581. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  582. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  583. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  584. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  585. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  586. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  587. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  588. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  589. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  590. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  591. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  592. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  593. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  594. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  595. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  596. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  597. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  598. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  599. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  600. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  601. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  602. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  603. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  604. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  605. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  606. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  607. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  608. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  609. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  610. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  611. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  612. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  613. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  614. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  615. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  616. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  617. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  618. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  619. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  620. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  621. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  622. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  623. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  624. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  625. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  626. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  627. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  628. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  629. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  630. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  631. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  632. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  633. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  634. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  635. wandb/vendor/promise-2.3.0/setup.py +64 -0
  636. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  637. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  638. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  639. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  640. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  641. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  642. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  643. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  644. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  645. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  646. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  647. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  648. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  649. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  650. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  651. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  652. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  653. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  654. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  655. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  656. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  657. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  658. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  659. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  660. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  661. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  662. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  663. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  664. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  665. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  666. wandb/vendor/pygments/__init__.py +90 -0
  667. wandb/vendor/pygments/cmdline.py +568 -0
  668. wandb/vendor/pygments/console.py +74 -0
  669. wandb/vendor/pygments/filter.py +74 -0
  670. wandb/vendor/pygments/filters/__init__.py +350 -0
  671. wandb/vendor/pygments/formatter.py +95 -0
  672. wandb/vendor/pygments/formatters/__init__.py +153 -0
  673. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  674. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  675. wandb/vendor/pygments/formatters/html.py +851 -0
  676. wandb/vendor/pygments/formatters/img.py +600 -0
  677. wandb/vendor/pygments/formatters/irc.py +182 -0
  678. wandb/vendor/pygments/formatters/latex.py +482 -0
  679. wandb/vendor/pygments/formatters/other.py +160 -0
  680. wandb/vendor/pygments/formatters/rtf.py +147 -0
  681. wandb/vendor/pygments/formatters/svg.py +153 -0
  682. wandb/vendor/pygments/formatters/terminal.py +136 -0
  683. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  684. wandb/vendor/pygments/lexer.py +871 -0
  685. wandb/vendor/pygments/lexers/__init__.py +329 -0
  686. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  687. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  688. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  689. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  690. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  691. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  692. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  693. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  694. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  695. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  696. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  697. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  698. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  699. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  700. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  701. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  702. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  703. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  704. wandb/vendor/pygments/lexers/agile.py +24 -0
  705. wandb/vendor/pygments/lexers/algebra.py +221 -0
  706. wandb/vendor/pygments/lexers/ambient.py +76 -0
  707. wandb/vendor/pygments/lexers/ampl.py +87 -0
  708. wandb/vendor/pygments/lexers/apl.py +101 -0
  709. wandb/vendor/pygments/lexers/archetype.py +318 -0
  710. wandb/vendor/pygments/lexers/asm.py +641 -0
  711. wandb/vendor/pygments/lexers/automation.py +374 -0
  712. wandb/vendor/pygments/lexers/basic.py +500 -0
  713. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  714. wandb/vendor/pygments/lexers/business.py +612 -0
  715. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  716. wandb/vendor/pygments/lexers/c_like.py +541 -0
  717. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  718. wandb/vendor/pygments/lexers/chapel.py +102 -0
  719. wandb/vendor/pygments/lexers/clean.py +288 -0
  720. wandb/vendor/pygments/lexers/compiled.py +34 -0
  721. wandb/vendor/pygments/lexers/configs.py +833 -0
  722. wandb/vendor/pygments/lexers/console.py +114 -0
  723. wandb/vendor/pygments/lexers/crystal.py +393 -0
  724. wandb/vendor/pygments/lexers/csound.py +366 -0
  725. wandb/vendor/pygments/lexers/css.py +689 -0
  726. wandb/vendor/pygments/lexers/d.py +251 -0
  727. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  728. wandb/vendor/pygments/lexers/data.py +555 -0
  729. wandb/vendor/pygments/lexers/diff.py +165 -0
  730. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  731. wandb/vendor/pygments/lexers/dsls.py +878 -0
  732. wandb/vendor/pygments/lexers/dylan.py +289 -0
  733. wandb/vendor/pygments/lexers/ecl.py +125 -0
  734. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  735. wandb/vendor/pygments/lexers/elm.py +121 -0
  736. wandb/vendor/pygments/lexers/erlang.py +533 -0
  737. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  738. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  739. wandb/vendor/pygments/lexers/factor.py +344 -0
  740. wandb/vendor/pygments/lexers/fantom.py +250 -0
  741. wandb/vendor/pygments/lexers/felix.py +273 -0
  742. wandb/vendor/pygments/lexers/forth.py +177 -0
  743. wandb/vendor/pygments/lexers/fortran.py +205 -0
  744. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  745. wandb/vendor/pygments/lexers/functional.py +21 -0
  746. wandb/vendor/pygments/lexers/go.py +101 -0
  747. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  748. wandb/vendor/pygments/lexers/graph.py +80 -0
  749. wandb/vendor/pygments/lexers/graphics.py +553 -0
  750. wandb/vendor/pygments/lexers/haskell.py +843 -0
  751. wandb/vendor/pygments/lexers/haxe.py +936 -0
  752. wandb/vendor/pygments/lexers/hdl.py +382 -0
  753. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  754. wandb/vendor/pygments/lexers/html.py +602 -0
  755. wandb/vendor/pygments/lexers/idl.py +270 -0
  756. wandb/vendor/pygments/lexers/igor.py +288 -0
  757. wandb/vendor/pygments/lexers/inferno.py +96 -0
  758. wandb/vendor/pygments/lexers/installers.py +322 -0
  759. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  760. wandb/vendor/pygments/lexers/iolang.py +63 -0
  761. wandb/vendor/pygments/lexers/j.py +146 -0
  762. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  763. wandb/vendor/pygments/lexers/julia.py +333 -0
  764. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  765. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  766. wandb/vendor/pygments/lexers/make.py +202 -0
  767. wandb/vendor/pygments/lexers/markup.py +595 -0
  768. wandb/vendor/pygments/lexers/math.py +21 -0
  769. wandb/vendor/pygments/lexers/matlab.py +663 -0
  770. wandb/vendor/pygments/lexers/ml.py +769 -0
  771. wandb/vendor/pygments/lexers/modeling.py +358 -0
  772. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  773. wandb/vendor/pygments/lexers/monte.py +204 -0
  774. wandb/vendor/pygments/lexers/ncl.py +894 -0
  775. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  776. wandb/vendor/pygments/lexers/nit.py +64 -0
  777. wandb/vendor/pygments/lexers/nix.py +136 -0
  778. wandb/vendor/pygments/lexers/oberon.py +105 -0
  779. wandb/vendor/pygments/lexers/objective.py +504 -0
  780. wandb/vendor/pygments/lexers/ooc.py +85 -0
  781. wandb/vendor/pygments/lexers/other.py +41 -0
  782. wandb/vendor/pygments/lexers/parasail.py +79 -0
  783. wandb/vendor/pygments/lexers/parsers.py +835 -0
  784. wandb/vendor/pygments/lexers/pascal.py +644 -0
  785. wandb/vendor/pygments/lexers/pawn.py +199 -0
  786. wandb/vendor/pygments/lexers/perl.py +620 -0
  787. wandb/vendor/pygments/lexers/php.py +267 -0
  788. wandb/vendor/pygments/lexers/praat.py +294 -0
  789. wandb/vendor/pygments/lexers/prolog.py +306 -0
  790. wandb/vendor/pygments/lexers/python.py +939 -0
  791. wandb/vendor/pygments/lexers/qvt.py +152 -0
  792. wandb/vendor/pygments/lexers/r.py +453 -0
  793. wandb/vendor/pygments/lexers/rdf.py +270 -0
  794. wandb/vendor/pygments/lexers/rebol.py +431 -0
  795. wandb/vendor/pygments/lexers/resource.py +85 -0
  796. wandb/vendor/pygments/lexers/rnc.py +67 -0
  797. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  798. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  799. wandb/vendor/pygments/lexers/ruby.py +519 -0
  800. wandb/vendor/pygments/lexers/rust.py +220 -0
  801. wandb/vendor/pygments/lexers/sas.py +228 -0
  802. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  803. wandb/vendor/pygments/lexers/shell.py +794 -0
  804. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  805. wandb/vendor/pygments/lexers/smv.py +79 -0
  806. wandb/vendor/pygments/lexers/snobol.py +83 -0
  807. wandb/vendor/pygments/lexers/special.py +103 -0
  808. wandb/vendor/pygments/lexers/sql.py +681 -0
  809. wandb/vendor/pygments/lexers/stata.py +108 -0
  810. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  811. wandb/vendor/pygments/lexers/tcl.py +145 -0
  812. wandb/vendor/pygments/lexers/templates.py +2283 -0
  813. wandb/vendor/pygments/lexers/testing.py +207 -0
  814. wandb/vendor/pygments/lexers/text.py +25 -0
  815. wandb/vendor/pygments/lexers/textedit.py +169 -0
  816. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  817. wandb/vendor/pygments/lexers/theorem.py +458 -0
  818. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  819. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  820. wandb/vendor/pygments/lexers/urbi.py +133 -0
  821. wandb/vendor/pygments/lexers/varnish.py +190 -0
  822. wandb/vendor/pygments/lexers/verification.py +111 -0
  823. wandb/vendor/pygments/lexers/web.py +24 -0
  824. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  825. wandb/vendor/pygments/lexers/whiley.py +116 -0
  826. wandb/vendor/pygments/lexers/x10.py +69 -0
  827. wandb/vendor/pygments/modeline.py +44 -0
  828. wandb/vendor/pygments/plugin.py +68 -0
  829. wandb/vendor/pygments/regexopt.py +92 -0
  830. wandb/vendor/pygments/scanner.py +105 -0
  831. wandb/vendor/pygments/sphinxext.py +158 -0
  832. wandb/vendor/pygments/style.py +155 -0
  833. wandb/vendor/pygments/styles/__init__.py +80 -0
  834. wandb/vendor/pygments/styles/abap.py +29 -0
  835. wandb/vendor/pygments/styles/algol.py +63 -0
  836. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  837. wandb/vendor/pygments/styles/arduino.py +98 -0
  838. wandb/vendor/pygments/styles/autumn.py +65 -0
  839. wandb/vendor/pygments/styles/borland.py +51 -0
  840. wandb/vendor/pygments/styles/bw.py +49 -0
  841. wandb/vendor/pygments/styles/colorful.py +81 -0
  842. wandb/vendor/pygments/styles/default.py +73 -0
  843. wandb/vendor/pygments/styles/emacs.py +72 -0
  844. wandb/vendor/pygments/styles/friendly.py +72 -0
  845. wandb/vendor/pygments/styles/fruity.py +42 -0
  846. wandb/vendor/pygments/styles/igor.py +29 -0
  847. wandb/vendor/pygments/styles/lovelace.py +97 -0
  848. wandb/vendor/pygments/styles/manni.py +75 -0
  849. wandb/vendor/pygments/styles/monokai.py +106 -0
  850. wandb/vendor/pygments/styles/murphy.py +80 -0
  851. wandb/vendor/pygments/styles/native.py +65 -0
  852. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  853. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  854. wandb/vendor/pygments/styles/pastie.py +75 -0
  855. wandb/vendor/pygments/styles/perldoc.py +69 -0
  856. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  857. wandb/vendor/pygments/styles/rrt.py +33 -0
  858. wandb/vendor/pygments/styles/sas.py +44 -0
  859. wandb/vendor/pygments/styles/stata.py +40 -0
  860. wandb/vendor/pygments/styles/tango.py +141 -0
  861. wandb/vendor/pygments/styles/trac.py +63 -0
  862. wandb/vendor/pygments/styles/vim.py +63 -0
  863. wandb/vendor/pygments/styles/vs.py +38 -0
  864. wandb/vendor/pygments/styles/xcode.py +51 -0
  865. wandb/vendor/pygments/token.py +213 -0
  866. wandb/vendor/pygments/unistring.py +217 -0
  867. wandb/vendor/pygments/util.py +388 -0
  868. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  869. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  870. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  871. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  872. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  873. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  874. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  875. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  876. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  877. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  878. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  879. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  880. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  881. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  882. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  883. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  884. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  885. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  886. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  887. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  888. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  889. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  890. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  891. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  892. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  893. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  894. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  895. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  896. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  897. wandb/wandb_agent.py +580 -0
  898. wandb/wandb_controller.py +719 -0
  899. wandb/wandb_run.py +8 -0
  900. wandb-0.21.2.dist-info/METADATA +223 -0
  901. wandb-0.21.2.dist-info/RECORD +904 -0
  902. wandb-0.21.2.dist-info/WHEEL +4 -0
  903. wandb-0.21.2.dist-info/entry_points.txt +3 -0
  904. wandb-0.21.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,2105 @@
1
+ from __future__ import annotations
2
+
3
+ import configparser
4
+ import json
5
+ import logging
6
+ import os
7
+ import pathlib
8
+ import platform
9
+ import re
10
+ import shutil
11
+ import socket
12
+ import sys
13
+ from datetime import datetime
14
+
15
+ # Optional and Union are used for type hinting instead of | because
16
+ # the latter is not supported in pydantic<2.6 and Python<3.10.
17
+ # Dict, List, and Tuple are used for backwards compatibility
18
+ # with pydantic v1 and Python<3.9.
19
+ from typing import Any, Callable, Dict, List, Literal, Optional, Sequence, Tuple, Union
20
+ from urllib.parse import quote, unquote, urlencode
21
+
22
+ from google.protobuf.wrappers_pb2 import BoolValue, DoubleValue, Int32Value, StringValue
23
+ from pydantic import BaseModel, ConfigDict, Field
24
+ from typing_extensions import Self
25
+
26
+ import wandb
27
+ from wandb import env, util
28
+ from wandb._pydantic import (
29
+ IS_PYDANTIC_V2,
30
+ AliasChoices,
31
+ computed_field,
32
+ field_validator,
33
+ model_validator,
34
+ )
35
+ from wandb.errors import UsageError
36
+ from wandb.proto import wandb_settings_pb2
37
+
38
+ from .lib import apikey, credentials, ipython
39
+ from .lib.gitlib import GitRepo
40
+ from .lib.run_moment import RunMoment
41
+
42
+ validate_url: Callable[[str], None]
43
+
44
+ if IS_PYDANTIC_V2:
45
+ from pydantic_core import SchemaValidator, core_schema
46
+
47
+ def validate_url(url: str) -> None:
48
+ """Validate a URL string."""
49
+ url_validator = SchemaValidator(
50
+ core_schema.url_schema(
51
+ allowed_schemes=["http", "https"],
52
+ strict=True,
53
+ )
54
+ )
55
+ url_validator.validate_python(url)
56
+ else:
57
+ from pydantic import root_validator
58
+
59
+ def validate_url(url: str) -> None:
60
+ """Validate the base url of the wandb server.
61
+
62
+ param value: URL to validate
63
+
64
+ Based on the Django URLValidator, but with a few additional checks.
65
+
66
+ Copyright (c) Django Software Foundation and individual contributors.
67
+ All rights reserved.
68
+
69
+ Redistribution and use in source and binary forms, with or without modification,
70
+ are permitted provided that the following conditions are met:
71
+
72
+ 1. Redistributions of source code must retain the above copyright notice,
73
+ this list of conditions and the following disclaimer.
74
+
75
+ 2. Redistributions in binary form must reproduce the above copyright
76
+ notice, this list of conditions and the following disclaimer in the
77
+ documentation and/or other materials provided with the distribution.
78
+
79
+ 3. Neither the name of Django nor the names of its contributors may be used
80
+ to endorse or promote products derived from this software without
81
+ specific prior written permission.
82
+
83
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
84
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
85
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
86
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
87
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
88
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
89
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
90
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
91
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
92
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
93
+ """
94
+ from urllib.parse import urlparse, urlsplit
95
+
96
+ if url is None:
97
+ return
98
+
99
+ ul = "\u00a1-\uffff" # Unicode letters range (must not be a raw string).
100
+
101
+ # IP patterns
102
+ ipv4_re = (
103
+ r"(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)"
104
+ r"(?:\.(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)){3}"
105
+ )
106
+ ipv6_re = r"\[[0-9a-f:.]+\]" # (simple regex, validated later)
107
+
108
+ # Host patterns
109
+ hostname_re = (
110
+ r"[a-z" + ul + r"0-9](?:[a-z" + ul + r"0-9-]{0,61}[a-z" + ul + r"0-9])?"
111
+ )
112
+ # Max length for domain name labels is 63 characters per RFC 1034 sec. 3.1
113
+ domain_re = r"(?:\.(?!-)[a-z" + ul + r"0-9-]{1,63}(?<!-))*"
114
+ tld_re = (
115
+ r"\." # dot
116
+ r"(?!-)" # can't start with a dash
117
+ r"(?:[a-z" + ul + "-]{2,63}" # domain label
118
+ r"|xn--[a-z0-9]{1,59})" # or punycode label
119
+ r"(?<!-)" # can't end with a dash
120
+ r"\.?" # may have a trailing dot
121
+ )
122
+ # host_re = "(" + hostname_re + domain_re + tld_re + "|localhost)"
123
+ # todo?: allow hostname to be just a hostname (no tld)?
124
+ host_re = "(" + hostname_re + domain_re + f"({tld_re})?" + "|localhost)"
125
+
126
+ regex = re.compile(
127
+ r"^(?:[a-z0-9.+-]*)://" # scheme is validated separately
128
+ r"(?:[^\s:@/]+(?::[^\s:@/]*)?@)?" # user:pass authentication
129
+ r"(?:" + ipv4_re + "|" + ipv6_re + "|" + host_re + ")"
130
+ r"(?::[0-9]{1,5})?" # port
131
+ r"(?:[/?#][^\s]*)?" # resource path
132
+ r"\Z",
133
+ re.IGNORECASE,
134
+ )
135
+ schemes = {"http", "https"}
136
+ unsafe_chars = frozenset("\t\r\n")
137
+
138
+ scheme = url.split("://")[0].lower()
139
+ split_url = urlsplit(url)
140
+ parsed_url = urlparse(url)
141
+
142
+ if parsed_url.netloc == "":
143
+ raise ValueError(f"Invalid URL: {url}")
144
+ elif unsafe_chars.intersection(url):
145
+ raise ValueError("URL cannot contain unsafe characters")
146
+ elif scheme not in schemes:
147
+ raise ValueError("URL must start with `http(s)://`")
148
+ elif not regex.search(url):
149
+ raise ValueError(f"{url} is not a valid server address")
150
+ elif split_url.hostname is None or len(split_url.hostname) > 253:
151
+ raise ValueError("hostname is invalid")
152
+
153
+
154
+ def _path_convert(*args: str) -> str:
155
+ """Join path and apply os.path.expanduser to it."""
156
+ return os.path.expanduser(os.path.join(*args))
157
+
158
+
159
+ CLIENT_ONLY_SETTINGS = (
160
+ "reinit",
161
+ "max_end_of_run_history_metrics",
162
+ "max_end_of_run_summary_metrics",
163
+ )
164
+ """Python-only keys that are not fields on the settings proto."""
165
+
166
+
167
+ class Settings(BaseModel, validate_assignment=True):
168
+ """Settings for the W&B SDK.
169
+
170
+ This class manages configuration settings for the W&B SDK,
171
+ ensuring type safety and validation of all settings. Settings are accessible
172
+ as attributes and can be initialized programmatically, through environment
173
+ variables (`WANDB_ prefix`), and with configuration files.
174
+
175
+ The settings are organized into three categories:
176
+ 1. Public settings: Core configuration options that users can safely modify to customize
177
+ W&B's behavior for their specific needs.
178
+ 2. Internal settings: Settings prefixed with 'x_' that handle low-level SDK behavior.
179
+ These settings are primarily for internal use and debugging. While they can be modified,
180
+ they are not considered part of the public API and may change without notice in future
181
+ versions.
182
+ 3. Computed settings: Read-only settings that are automatically derived from other settings or
183
+ the environment.
184
+ """
185
+
186
+ # Pydantic Model configuration.
187
+ model_config = ConfigDict(
188
+ extra="forbid", # throw an error if extra fields are provided
189
+ validate_default=True, # validate default values
190
+ use_attribute_docstrings=True, # for field descriptions
191
+ revalidate_instances="always",
192
+ )
193
+
194
+ # Public settings.
195
+
196
+ allow_offline_artifacts: bool = True
197
+ """Flag to allow table artifacts to be synced in offline mode.
198
+
199
+ To revert to the old behavior, set this to False.
200
+ """
201
+
202
+ allow_val_change: bool = False
203
+ """Flag to allow modification of `Config` values after they've been set."""
204
+
205
+ anonymous: Optional[Literal["allow", "must", "never"]] = None
206
+ """Controls anonymous data logging.
207
+
208
+ Possible values are:
209
+ - "never": requires you to link your W&B account before
210
+ tracking the run, so you don't accidentally create an anonymous
211
+ run.
212
+ - "allow": lets a logged-in user track runs with their account, but
213
+ lets someone who is running the script without a W&B account see
214
+ the charts in the UI.
215
+ - "must": sends the run to an anonymous account instead of to a
216
+ signed-up user account.
217
+ """
218
+
219
+ api_key: Optional[str] = None
220
+ """The W&B API key."""
221
+
222
+ azure_account_url_to_access_key: Optional[Dict[str, str]] = None
223
+ """Mapping of Azure account URLs to their corresponding access keys for Azure integration."""
224
+
225
+ base_url: str = "https://api.wandb.ai"
226
+ """The URL of the W&B backend for data synchronization."""
227
+
228
+ code_dir: Optional[str] = None
229
+ """Directory containing the code to be tracked by W&B."""
230
+
231
+ config_paths: Optional[Sequence[str]] = None
232
+ """Paths to files to load configuration from into the `Config` object."""
233
+
234
+ console: Literal["auto", "off", "wrap", "redirect", "wrap_raw", "wrap_emu"] = Field(
235
+ default="auto",
236
+ validate_default=True,
237
+ )
238
+ """The type of console capture to be applied.
239
+
240
+ Possible values are:
241
+ "auto" - Automatically selects the console capture method based on the
242
+ system environment and settings.
243
+
244
+ "off" - Disables console capture.
245
+
246
+ "redirect" - Redirects low-level file descriptors for capturing output.
247
+
248
+ "wrap" - Overrides the write methods of sys.stdout/sys.stderr. Will be
249
+ mapped to either "wrap_raw" or "wrap_emu" based on the state of the system.
250
+
251
+ "wrap_raw" - Same as "wrap" but captures raw output directly instead of
252
+ through an emulator. Derived from the `wrap` setting and should not be set manually.
253
+
254
+ "wrap_emu" - Same as "wrap" but captures output through an emulator.
255
+ Derived from the `wrap` setting and should not be set manually.
256
+ """
257
+
258
+ console_multipart: bool = False
259
+ """Whether to produce multipart console log files."""
260
+
261
+ credentials_file: str = Field(
262
+ default_factory=lambda: str(credentials.DEFAULT_WANDB_CREDENTIALS_FILE)
263
+ )
264
+ """Path to file for writing temporary access tokens."""
265
+
266
+ disable_code: bool = False
267
+ """Whether to disable capturing the code."""
268
+
269
+ disable_git: bool = False
270
+ """Whether to disable capturing the git state."""
271
+
272
+ disable_job_creation: bool = True
273
+ """Whether to disable the creation of a job artifact for W&B Launch."""
274
+
275
+ docker: Optional[str] = None
276
+ """The Docker image used to execute the script."""
277
+
278
+ email: Optional[str] = None
279
+ """The email address of the user."""
280
+
281
+ entity: Optional[str] = None
282
+ """The W&B entity, such as a user or a team."""
283
+
284
+ organization: Optional[str] = None
285
+ """The W&B organization."""
286
+
287
+ force: bool = False
288
+ """Whether to pass the `force` flag to `wandb.login()`."""
289
+
290
+ fork_from: Optional[RunMoment] = None
291
+ """Specifies a point in a previous execution of a run to fork from.
292
+
293
+ The point is defined by the run ID, a metric, and its value.
294
+ Currently, only the metric '_step' is supported.
295
+ """
296
+
297
+ git_commit: Optional[str] = None
298
+ """The git commit hash to associate with the run."""
299
+
300
+ git_remote: str = "origin"
301
+ """The git remote to associate with the run."""
302
+
303
+ git_remote_url: Optional[str] = None
304
+ """The URL of the git remote repository."""
305
+
306
+ git_root: Optional[str] = None
307
+ """Root directory of the git repository."""
308
+
309
+ heartbeat_seconds: int = 30
310
+ """Interval in seconds between heartbeat signals sent to the W&B servers.
311
+
312
+ <!-- lazydoc-ignore-class-attributes -->
313
+ """
314
+
315
+ host: Optional[str] = None
316
+ """Hostname of the machine running the script."""
317
+
318
+ http_proxy: Optional[str] = None
319
+ """Custom proxy servers for http requests to W&B."""
320
+
321
+ https_proxy: Optional[str] = None
322
+ """Custom proxy servers for https requests to W&B."""
323
+
324
+ identity_token_file: Optional[str] = None
325
+ """Path to file containing an identity token (JWT) for authentication."""
326
+
327
+ ignore_globs: Sequence[str] = ()
328
+ """Unix glob patterns relative to `files_dir` specifying files to exclude from upload."""
329
+
330
+ init_timeout: float = 90.0
331
+ """Time in seconds to wait for the `wandb.init` call to complete before timing out."""
332
+
333
+ insecure_disable_ssl: bool = False
334
+ """Whether to insecurely disable SSL verification."""
335
+
336
+ job_name: Optional[str] = None
337
+ """Name of the Launch job running the script."""
338
+
339
+ job_source: Optional[Literal["repo", "artifact", "image"]] = None
340
+ """Source type for Launch."""
341
+
342
+ label_disable: bool = False
343
+ """Whether to disable automatic labeling features."""
344
+
345
+ launch: bool = False
346
+ """Flag to indicate if the run is being launched through W&B Launch.
347
+
348
+ <!-- lazydoc-ignore-class-attributes -->
349
+ """
350
+
351
+ launch_config_path: Optional[str] = None
352
+ """Path to the launch configuration file."""
353
+
354
+ login_timeout: Optional[float] = None
355
+ """Time in seconds to wait for login operations before timing out."""
356
+
357
+ mode: Literal["online", "offline", "shared", "disabled", "dryrun", "run"] = Field(
358
+ default="online",
359
+ validate_default=True,
360
+ )
361
+ """The operating mode for W&B logging and synchronization."""
362
+
363
+ notebook_name: Optional[str] = None
364
+ """Name of the notebook if running in a Jupyter-like environment."""
365
+
366
+ program: Optional[str] = None
367
+ """Path to the script that created the run, if available."""
368
+
369
+ program_abspath: Optional[str] = None
370
+ """The absolute path from the root repository directory to the script that
371
+ created the run.
372
+
373
+ Root repository directory is defined as the directory containing the
374
+ .git directory, if it exists. Otherwise, it's the current working directory.
375
+ """
376
+
377
+ program_relpath: Optional[str] = None
378
+ """The relative path to the script that created the run."""
379
+
380
+ project: Optional[str] = None
381
+ """The W&B project ID."""
382
+
383
+ quiet: bool = False
384
+ """Flag to suppress non-essential output."""
385
+
386
+ reinit: Union[
387
+ Literal[
388
+ "default",
389
+ "return_previous",
390
+ "finish_previous",
391
+ "create_new",
392
+ ],
393
+ bool,
394
+ ] = "default"
395
+ """What to do when `wandb.init()` is called while a run is active.
396
+
397
+ Options:
398
+ - "default": Use "finish_previous" in notebooks and "return_previous"
399
+ otherwise.
400
+ - "return_previous": Return the most recently created run
401
+ that is not yet finished. This does not update `wandb.run`; see
402
+ the "create_new" option.
403
+ - "finish_previous": Finish all active runs, then return a new run.
404
+ - "create_new": Create a new run without modifying other active runs.
405
+ Does not update `wandb.run` and top-level functions like `wandb.log`.
406
+ Because of this, some older integrations that rely on the global run
407
+ will not work.
408
+
409
+ Can also be a boolean, but this is deprecated. False is the same as
410
+ "return_previous", and True is the same as "finish_previous".
411
+ """
412
+
413
+ relogin: bool = False
414
+ """Flag to force a new login attempt."""
415
+
416
+ resume: Optional[Literal["allow", "must", "never", "auto"]] = None
417
+ """Specifies the resume behavior for the run.
418
+
419
+ Options:
420
+ - "must": Resumes from an existing run with the same ID. If no such run exists,
421
+ it will result in failure.
422
+ - "allow": Attempts to resume from an existing run with the same ID. If none is
423
+ found, a new run will be created.
424
+ - "never": Always starts a new run. If a run with the same ID already exists,
425
+ it will result in failure.
426
+ - "auto": Automatically resumes from the most recent failed run on the same
427
+ machine.
428
+ """
429
+
430
+ resume_from: Optional[RunMoment] = None
431
+ """Specifies a point in a previous execution of a run to resume from.
432
+
433
+ The point is defined by the run ID, a metric, and its value.
434
+ Currently, only the metric '_step' is supported.
435
+ """
436
+
437
+ resumed: bool = False
438
+ """Indication from the server about the state of the run.
439
+
440
+ This is different from resume, a user provided flag.
441
+ <!-- lazydoc-ignore-class-attributes -->
442
+ """
443
+
444
+ root_dir: str = Field(default_factory=lambda: os.path.abspath(os.getcwd()))
445
+ """The root directory to use as the base for all run-related paths.
446
+
447
+ In particular, this is used to derive the wandb directory and the run directory.
448
+ """
449
+
450
+ run_group: Optional[str] = None
451
+ """Group identifier for related runs.
452
+
453
+ Used for grouping runs in the UI.
454
+ """
455
+
456
+ run_id: Optional[str] = None
457
+ """The ID of the run."""
458
+
459
+ run_job_type: Optional[str] = None
460
+ """Type of job being run (e.g., training, evaluation)."""
461
+
462
+ run_name: Optional[str] = None
463
+ """Human-readable name for the run."""
464
+
465
+ run_notes: Optional[str] = None
466
+ """Additional notes or description for the run."""
467
+
468
+ run_tags: Optional[Tuple[str, ...]] = None
469
+ """Tags to associate with the run for organization and filtering."""
470
+
471
+ sagemaker_disable: bool = False
472
+ """Flag to disable SageMaker-specific functionality."""
473
+
474
+ save_code: Optional[bool] = None
475
+ """Whether to save the code associated with the run."""
476
+
477
+ settings_system: Optional[str] = None
478
+ """Path to the system-wide settings file."""
479
+
480
+ max_end_of_run_history_metrics: int = 10
481
+ """Maximum number of history sparklines to display at the end of a run."""
482
+
483
+ max_end_of_run_summary_metrics: int = 10
484
+ """Maximum number of summary metrics to display at the end of a run."""
485
+
486
+ show_colors: Optional[bool] = None
487
+ """Whether to use colored output in the console.
488
+
489
+ <!-- lazydoc-ignore-class-attributes -->
490
+ """
491
+
492
+ show_emoji: Optional[bool] = None
493
+ """Whether to show emoji in the console output.
494
+
495
+ <!-- lazydoc-ignore-class-attributes -->
496
+ """
497
+
498
+ show_errors: bool = True
499
+ """Whether to display error messages."""
500
+
501
+ show_info: bool = True
502
+ """Whether to display informational messages."""
503
+
504
+ show_warnings: bool = True
505
+ """Whether to display warning messages."""
506
+
507
+ silent: bool = False
508
+ """Flag to suppress all output."""
509
+
510
+ start_method: Optional[str] = None
511
+ """Method to use for starting subprocesses.
512
+
513
+ This is deprecated and will be removed in a future release.
514
+ <!-- lazydoc-ignore-class-attributes -->
515
+ """
516
+
517
+ strict: Optional[bool] = None
518
+ """Whether to enable strict mode for validation and error checking."""
519
+
520
+ summary_timeout: int = 60
521
+ """Time in seconds to wait for summary operations before timing out."""
522
+
523
+ summary_warnings: int = 5
524
+ """Maximum number of summary warnings to display.
525
+
526
+ <!-- lazydoc-ignore-class-attributes -->
527
+ """
528
+
529
+ sweep_id: Optional[str] = None
530
+ """Identifier of the sweep this run belongs to."""
531
+
532
+ sweep_param_path: Optional[str] = None
533
+ """Path to the sweep parameters configuration."""
534
+
535
+ symlink: bool = Field(
536
+ default_factory=lambda: False if platform.system() == "Windows" else True
537
+ )
538
+ """Whether to use symlinks (True by default except on Windows)."""
539
+
540
+ sync_tensorboard: Optional[bool] = None
541
+ """Whether to synchronize TensorBoard logs with W&B."""
542
+
543
+ table_raise_on_max_row_limit_exceeded: bool = False
544
+ """Whether to raise an exception when table row limits are exceeded."""
545
+
546
+ username: Optional[str] = None
547
+ """Username."""
548
+
549
+ # Internal settings.
550
+ #
551
+ # These are typically not meant to be set by the user and should not be considered
552
+ # a part of the public API as they may change or be removed in future versions.
553
+
554
+ x_cli_only_mode: bool = False
555
+ """Flag to indicate that the SDK is running in CLI-only mode.
556
+
557
+ <!-- lazydoc-ignore-class-attributes -->
558
+ """
559
+
560
+ x_disable_meta: bool = False
561
+ """Flag to disable the collection of system metadata."""
562
+
563
+ x_disable_stats: bool = False
564
+ """Flag to disable the collection of system metrics."""
565
+
566
+ x_disable_viewer: bool = False
567
+ """Flag to disable the early viewer query.
568
+
569
+ <!-- lazydoc-ignore-class-attributes -->
570
+ """
571
+
572
+ x_disable_machine_info: bool = False
573
+ """Flag to disable automatic machine info collection.
574
+
575
+ <!-- lazydoc-ignore-class-attributes -->
576
+ """
577
+
578
+ x_executable: Optional[str] = None
579
+ """Path to the Python executable.
580
+
581
+ <!-- lazydoc-ignore-class-attributes -->
582
+ """
583
+
584
+ x_extra_http_headers: Optional[Dict[str, str]] = None
585
+ """Additional headers to add to all outgoing HTTP requests."""
586
+
587
+ x_file_stream_max_bytes: Optional[int] = None
588
+ """An approximate maximum request size for the filestream API.
589
+
590
+ Its purpose is to prevent HTTP requests from failing due to
591
+ containing too much data. This number is approximate:
592
+ requests will be slightly larger.
593
+ <!-- lazydoc-ignore-class-attributes -->
594
+ """
595
+
596
+ x_file_stream_max_line_bytes: Optional[int] = None
597
+ """Maximum line length for filestream JSONL files.
598
+
599
+ <!-- lazydoc-ignore-class-attributes -->
600
+ """
601
+
602
+ x_file_stream_transmit_interval: Optional[float] = None
603
+ """Interval in seconds between filestream transmissions.
604
+
605
+ <!-- lazydoc-ignore-class-attributes -->
606
+ """
607
+
608
+ # Filestream retry client configuration.
609
+
610
+ x_file_stream_retry_max: Optional[int] = None
611
+ """Max number of retries for filestream operations.
612
+
613
+ <!-- lazydoc-ignore-class-attributes -->
614
+ """
615
+
616
+ x_file_stream_retry_wait_min_seconds: Optional[float] = None
617
+ """Minimum wait time between retries for filestream operations.
618
+
619
+ <!-- lazydoc-ignore-class-attributes -->
620
+ """
621
+
622
+ x_file_stream_retry_wait_max_seconds: Optional[float] = None
623
+ """Maximum wait time between retries for filestream operations.
624
+
625
+ <!-- lazydoc-ignore-class-attributes -->
626
+ """
627
+
628
+ x_file_stream_timeout_seconds: Optional[float] = None
629
+ """Timeout in seconds for individual filestream HTTP requests.
630
+
631
+ <!-- lazydoc-ignore-class-attributes -->
632
+ """
633
+
634
+ # file transfer retry client configuration
635
+
636
+ x_file_transfer_retry_max: Optional[int] = None
637
+ """Max number of retries for file transfer operations.
638
+
639
+ <!-- lazydoc-ignore-class-attributes -->
640
+ """
641
+
642
+ x_file_transfer_retry_wait_min_seconds: Optional[float] = None
643
+ """Minimum wait time between retries for file transfer operations.
644
+
645
+ <!-- lazydoc-ignore-class-attributes -->
646
+ """
647
+
648
+ x_file_transfer_retry_wait_max_seconds: Optional[float] = None
649
+ """Maximum wait time between retries for file transfer operations.
650
+
651
+ <!-- lazydoc-ignore-class-attributes -->
652
+ """
653
+
654
+ x_file_transfer_timeout_seconds: Optional[float] = None
655
+ """Timeout in seconds for individual file transfer HTTP requests.
656
+
657
+ <!-- lazydoc-ignore-class-attributes -->
658
+ """
659
+
660
+ x_files_dir: Optional[str] = None
661
+ """Override setting for the computed files_dir.
662
+
663
+ <!-- lazydoc-ignore-class-attributes -->
664
+ """
665
+
666
+ x_flow_control_custom: Optional[bool] = None
667
+ """Flag indicating custom flow control for filestream.
668
+
669
+ TODO: Not implemented in wandb-core.
670
+ <!-- lazydoc-ignore-class-attributes -->
671
+ """
672
+
673
+ x_flow_control_disabled: Optional[bool] = None
674
+ """Flag indicating flow control is disabled for filestream.
675
+
676
+ TODO: Not implemented in wandb-core.
677
+ <!-- lazydoc-ignore-class-attributes -->
678
+ """
679
+
680
+ # graphql retry client configuration
681
+
682
+ x_graphql_retry_max: Optional[int] = None
683
+ """Max number of retries for GraphQL operations.
684
+
685
+ <!-- lazydoc-ignore-class-attributes -->
686
+ """
687
+
688
+ x_graphql_retry_wait_min_seconds: Optional[float] = None
689
+ """Minimum wait time between retries for GraphQL operations.
690
+
691
+ <!-- lazydoc-ignore-class-attributes -->
692
+ """
693
+
694
+ x_graphql_retry_wait_max_seconds: Optional[float] = None
695
+ """Maximum wait time between retries for GraphQL operations.
696
+
697
+ <!-- lazydoc-ignore-class-attributes -->
698
+ """
699
+
700
+ x_graphql_timeout_seconds: Optional[float] = None
701
+ """Timeout in seconds for individual GraphQL requests.
702
+
703
+ <!-- lazydoc-ignore-class-attributes -->
704
+ """
705
+
706
+ x_internal_check_process: float = 8.0
707
+ """Interval for internal process health checks in seconds.
708
+
709
+ <!-- lazydoc-ignore-class-attributes -->
710
+ """
711
+
712
+ x_jupyter_name: Optional[str] = None
713
+ """Name of the Jupyter notebook.
714
+
715
+ <!-- lazydoc-ignore-class-attributes -->
716
+ """
717
+
718
+ x_jupyter_path: Optional[str] = None
719
+ """Path to the Jupyter notebook.
720
+
721
+ <!-- lazydoc-ignore-class-attributes -->
722
+ """
723
+
724
+ x_jupyter_root: Optional[str] = None
725
+ """Root directory of the Jupyter notebook.
726
+
727
+ <!-- lazydoc-ignore-class-attributes -->
728
+ """
729
+
730
+ x_label: Optional[str] = None
731
+ """Label to assign to system metrics and console logs collected for the run.
732
+
733
+ This is used to group data by on the frontend and can be used to distinguish data
734
+ from different processes in a distributed training job.
735
+ """
736
+
737
+ x_live_policy_rate_limit: Optional[int] = None
738
+ """Rate limit for live policy updates in seconds.
739
+
740
+ <!-- lazydoc-ignore-class-attributes -->
741
+ """
742
+
743
+ x_live_policy_wait_time: Optional[int] = None
744
+ """Wait time between live policy updates in seconds.
745
+
746
+ <!-- lazydoc-ignore-class-attributes -->
747
+ """
748
+
749
+ x_log_level: int = logging.INFO
750
+ """Logging level for internal operations.
751
+
752
+ <!-- lazydoc-ignore-class-attributes -->
753
+ """
754
+
755
+ x_network_buffer: Optional[int] = None
756
+ """Size of the network buffer used in flow control.
757
+
758
+ TODO: Not implemented in wandb-core.
759
+ <!-- lazydoc-ignore-class-attributes -->
760
+ """
761
+
762
+ x_primary: bool = Field(
763
+ default=True, validation_alias=AliasChoices("x_primary", "x_primary_node")
764
+ )
765
+ """Determines whether to save internal wandb files and metadata.
766
+
767
+ In a distributed setting, this is useful for avoiding file overwrites
768
+ from secondary processes when only system metrics and logs are needed,
769
+ as the primary process handles the main logging.
770
+ """
771
+
772
+ x_proxies: Optional[Dict[str, str]] = None
773
+ """Custom proxy servers for requests to W&B.
774
+
775
+ This is deprecated and will be removed in a future release.
776
+ Please use `http_proxy` and `https_proxy` instead.
777
+ <!-- lazydoc-ignore-class-attributes -->
778
+ """
779
+
780
+ x_runqueue_item_id: Optional[str] = None
781
+ """ID of the Launch run queue item being processed.
782
+
783
+ <!-- lazydoc-ignore-class-attributes -->
784
+ """
785
+
786
+ x_save_requirements: bool = True
787
+ """Flag to save the requirements file."""
788
+
789
+ x_server_side_derived_summary: bool = False
790
+ """Flag to delegate automatic computation of summary from history to the server.
791
+
792
+ This does not disable user-provided summary updates.
793
+ """
794
+
795
+ x_server_side_expand_glob_metrics: bool = True
796
+ """Flag to delegate glob matching of metrics in define_metric to the server.
797
+
798
+ If the server does not support this, the client will perform the glob matching.
799
+ <!-- lazydoc-ignore-class-attributes -->
800
+ """
801
+
802
+ x_service_transport: Optional[str] = None
803
+ """Transport method for communication with the wandb service.
804
+
805
+ <!-- lazydoc-ignore-class-attributes -->
806
+ """
807
+
808
+ x_service_wait: float = 30.0
809
+ """Time in seconds to wait for the wandb-core internal service to start."""
810
+
811
+ x_skip_transaction_log: bool = False
812
+ """Whether to skip saving the run events to the transaction log.
813
+
814
+ This is only relevant for online runs. Can be used to reduce the amount of
815
+ data written to disk.
816
+
817
+ Should be used with caution, as it removes the gurantees about
818
+ recoverability.
819
+ """
820
+
821
+ x_start_time: Optional[float] = None
822
+ """The start time of the run in seconds since the Unix epoch.
823
+
824
+ <!-- lazydoc-ignore-class-attributes -->
825
+ """
826
+
827
+ x_stats_pid: int = os.getpid()
828
+ """PID of the process that started the wandb-core process to collect system stats for.
829
+
830
+ <!-- lazydoc-ignore-class-attributes -->
831
+ """
832
+
833
+ x_stats_sampling_interval: float = Field(default=15.0)
834
+ """Sampling interval for the system monitor in seconds."""
835
+
836
+ x_stats_neuron_monitor_config_path: Optional[str] = None
837
+ """Path to the default config file for the neuron-monitor tool.
838
+
839
+ This is used to monitor AWS Trainium devices.
840
+ <!-- lazydoc-ignore-class-attributes -->
841
+ """
842
+
843
+ x_stats_dcgm_exporter: Optional[str] = None
844
+ """Endpoint to extract Nvidia DCGM metrics from.
845
+
846
+ Options:
847
+ - Extract DCGM-related metrics from a query to the Prometheus `/api/v1/query` endpoint.
848
+ It is a common practice to aggregate metrics reported by the instances of the DCGM Exporter
849
+ running on different nodes in a cluster using Prometheus.
850
+ - TODO: Parse metrics directly from the `/metrics` endpoint of the DCGM Exporter.
851
+
852
+ Examples:
853
+ - `http://localhost:9400/api/v1/query?query=DCGM_FI_DEV_GPU_TEMP{node="l1337", cluster="globular"}`.
854
+ - TODO: `http://192.168.0.1:9400/metrics`.
855
+ <!-- lazydoc-ignore-class-attributes -->
856
+ """
857
+
858
+ x_stats_open_metrics_endpoints: Optional[Dict[str, str]] = None
859
+ """OpenMetrics `/metrics` endpoints to monitor for system metrics."""
860
+
861
+ x_stats_open_metrics_filters: Union[
862
+ Dict[str, Dict[str, str]], Sequence[str], None
863
+ ] = None
864
+ """Filter to apply to metrics collected from OpenMetrics `/metrics` endpoints.
865
+
866
+ Supports two formats:
867
+ - {"metric regex pattern, including endpoint name as prefix": {"label": "label value regex pattern"}}
868
+ - ("metric regex pattern 1", "metric regex pattern 2", ...)
869
+ """
870
+
871
+ x_stats_open_metrics_http_headers: Optional[Dict[str, str]] = None
872
+ """HTTP headers to add to OpenMetrics requests."""
873
+
874
+ x_stats_disk_paths: Optional[Sequence[str]] = ("/",)
875
+ """System paths to monitor for disk usage."""
876
+
877
+ x_stats_cpu_count: Optional[int] = None
878
+ """System CPU count.
879
+
880
+ If set, overrides the auto-detected value in the run metadata.
881
+ """
882
+
883
+ x_stats_cpu_logical_count: Optional[int] = None
884
+ """Logical CPU count.
885
+
886
+ If set, overrides the auto-detected value in the run metadata.
887
+ """
888
+
889
+ x_stats_gpu_count: Optional[int] = None
890
+ """GPU device count.
891
+
892
+ If set, overrides the auto-detected value in the run metadata.
893
+ """
894
+
895
+ x_stats_gpu_type: Optional[str] = None
896
+ """GPU device type.
897
+
898
+ If set, overrides the auto-detected value in the run metadata.
899
+ """
900
+
901
+ x_stats_gpu_device_ids: Optional[Sequence[int]] = None
902
+ """GPU device indices to monitor.
903
+
904
+ If not set, the system monitor captures metrics for all GPUs.
905
+ Assumes 0-based indexing matching CUDA/ROCm device enumeration.
906
+ """
907
+
908
+ x_stats_buffer_size: int = 0
909
+ """Number of system metric samples to buffer in memory in the wandb-core process.
910
+
911
+ Can be accessed via run._system_metrics.
912
+ <!-- lazydoc-ignore-class-attributes -->
913
+ """
914
+
915
+ x_stats_coreweave_metadata_base_url: str = "http://169.254.169.254"
916
+ """The scheme and hostname for contacting the CoreWeave metadata server.
917
+
918
+ Only accessible from within a CoreWeave cluster.
919
+ <!-- lazydoc-ignore-class-attributes -->
920
+ """
921
+
922
+ x_stats_coreweave_metadata_endpoint: str = "/api/v2/cloud-init/meta-data"
923
+ """The relative path on the CoreWeave metadata server to which to make requests.
924
+
925
+ This must not include the schema and hostname prefix.
926
+ Only accessible from within a CoreWeave cluster.
927
+ <!-- lazydoc-ignore-class-attributes -->
928
+ """
929
+
930
+ x_stats_track_process_tree: bool = False
931
+ """Monitor the entire process tree for resource usage, starting from `x_stats_pid`.
932
+
933
+ When `True`, the system monitor aggregates the RSS, CPU%, and thread count
934
+ from the process with PID `x_stats_pid` and all of its descendants.
935
+ This can have a performance overhead and is disabled by default.
936
+ """
937
+
938
+ x_sync: bool = False
939
+ """Flag to indicate whether we are syncing a run from the transaction log.
940
+
941
+ <!-- lazydoc-ignore-class-attributes -->
942
+ """
943
+
944
+ x_update_finish_state: bool = True
945
+ """Flag to indicate whether this process can update the run's final state on the server.
946
+
947
+ Set to False in distributed training when only the main process should determine the final state.
948
+ """
949
+
950
+ # Model validator to catch legacy settings.
951
+ @model_validator(mode="before")
952
+ @classmethod
953
+ def catch_private_settings(cls, values):
954
+ """Check if a private field is provided and assign to the corresponding public one.
955
+
956
+ This is a compatibility layer to handle previous versions of the settings.
957
+ """
958
+ new_values = {}
959
+ for key in values:
960
+ # Internal settings are prefixed with "x_" instead of "_"
961
+ # as Pydantic does not allow "_" in field names.
962
+ if key.startswith("_"):
963
+ new_values["x" + key] = values[key]
964
+ else:
965
+ new_values[key] = values[key]
966
+ return new_values
967
+
968
+ if IS_PYDANTIC_V2:
969
+
970
+ @model_validator(mode="after")
971
+ def validate_mutual_exclusion_of_branching_args(self) -> Self:
972
+ """Check if `fork_from`, `resume`, and `resume_from` are mutually exclusive.
973
+
974
+ <!-- lazydoc-ignore: internal -->
975
+ """
976
+ if (
977
+ sum(
978
+ o is not None
979
+ for o in [self.fork_from, self.resume, self.resume_from]
980
+ )
981
+ > 1
982
+ ):
983
+ raise ValueError(
984
+ "`fork_from`, `resume`, or `resume_from` are mutually exclusive. "
985
+ "Please specify only one of them."
986
+ )
987
+ return self
988
+
989
+ @model_validator(mode="after")
990
+ def validate_skip_transaction_log(self):
991
+ if self._offline and self.x_skip_transaction_log:
992
+ raise ValueError("Cannot skip transaction log in offline mode")
993
+ return self
994
+ else:
995
+
996
+ @root_validator(pre=False) # type: ignore [call-overload]
997
+ @classmethod
998
+ def validate_mutual_exclusion_of_branching_args(cls, values):
999
+ if (
1000
+ sum(
1001
+ values.get(o) is not None
1002
+ for o in ["fork_from", "resume", "resume_from"]
1003
+ )
1004
+ > 1
1005
+ ):
1006
+ raise ValueError(
1007
+ "`fork_from`, `resume`, or `resume_from` are mutually exclusive. "
1008
+ "Please specify only one of them."
1009
+ )
1010
+ return values
1011
+
1012
+ @root_validator(pre=False) # type: ignore [call-overload]
1013
+ @classmethod
1014
+ def validate_skip_transaction_log(cls, values):
1015
+ if values.get("_offline") and values.get("x_skip_transaction_log"):
1016
+ raise ValueError("Cannot skip transaction log in offline mode")
1017
+ return values
1018
+
1019
+ # Field validators.
1020
+ @field_validator("api_key", mode="after")
1021
+ @classmethod
1022
+ def validate_api_key(cls, value):
1023
+ """Validate the API key.
1024
+
1025
+ <!-- lazydoc-ignore-classmethod: internal -->
1026
+ """
1027
+ if value is not None and (len(value) > len(value.strip())):
1028
+ raise UsageError("API key cannot start or end with whitespace")
1029
+ return value
1030
+
1031
+ @field_validator("base_url", mode="after")
1032
+ @classmethod
1033
+ def validate_base_url(cls, value):
1034
+ """Validate the base URL.
1035
+
1036
+ <!-- lazydoc-ignore-classmethod: internal -->
1037
+ """
1038
+ validate_url(value)
1039
+ # wandb.ai-specific checks
1040
+ if re.match(r".*wandb\.ai[^\.]*$", value) and "api." not in value:
1041
+ # user might guess app.wandb.ai or wandb.ai is the default cloud server
1042
+ raise ValueError(
1043
+ f"{value} is not a valid server address, did you mean https://api.wandb.ai?"
1044
+ )
1045
+ elif re.match(r".*wandb\.ai[^\.]*$", value) and not value.startswith("https"):
1046
+ raise ValueError("http is not secure, please use https://api.wandb.ai")
1047
+ return value.rstrip("/")
1048
+
1049
+ @field_validator("code_dir", mode="before")
1050
+ @classmethod
1051
+ def validate_code_dir(cls, value):
1052
+ """Validate the code directory.
1053
+
1054
+ <!-- lazydoc-ignore-classmethod: internal -->
1055
+ """
1056
+ # TODO: add native support for pathlib.Path
1057
+ if isinstance(value, pathlib.Path):
1058
+ return str(value)
1059
+ return value
1060
+
1061
+ @field_validator("console", mode="after")
1062
+ @classmethod
1063
+ def validate_console(cls, value, values):
1064
+ """Validate the console capture method.
1065
+
1066
+ <!-- lazydoc-ignore-classmethod: internal -->
1067
+ """
1068
+ if value != "auto":
1069
+ return value
1070
+
1071
+ return "wrap"
1072
+
1073
+ @field_validator("x_executable", mode="before")
1074
+ @classmethod
1075
+ def validate_x_executable(cls, value):
1076
+ """Validate the Python executable path.
1077
+
1078
+ <!-- lazydoc-ignore-classmethod: internal -->
1079
+ """
1080
+ # TODO: add native support for pathlib.Path
1081
+ if isinstance(value, pathlib.Path):
1082
+ return str(value)
1083
+ return value
1084
+
1085
+ @field_validator("x_extra_http_headers", mode="before")
1086
+ @classmethod
1087
+ def validate_x_extra_http_headers(cls, value):
1088
+ if isinstance(value, str):
1089
+ return json.loads(value)
1090
+ return value
1091
+
1092
+ @field_validator("x_file_stream_max_line_bytes", mode="after")
1093
+ @classmethod
1094
+ def validate_file_stream_max_line_bytes(cls, value):
1095
+ """Validate the maximum line length for filestream JSONL files.
1096
+
1097
+ <!-- lazydoc-ignore-classmethod: internal -->
1098
+ """
1099
+ if value is not None and value < 1:
1100
+ raise ValueError("File stream max line bytes must be greater than 0")
1101
+ return value
1102
+
1103
+ @field_validator("x_files_dir", mode="before")
1104
+ @classmethod
1105
+ def validate_x_files_dir(cls, value):
1106
+ """Validate the files directory.
1107
+
1108
+ <!-- lazydoc-ignore-classmethod: internal -->
1109
+ """
1110
+ # TODO: add native support for pathlib.Path
1111
+ if isinstance(value, pathlib.Path):
1112
+ return str(value)
1113
+ return value
1114
+
1115
+ @field_validator("fork_from", mode="before")
1116
+ @classmethod
1117
+ def validate_fork_from(cls, value, values) -> Optional[RunMoment]:
1118
+ """Validate the fork_from field.
1119
+
1120
+ <!-- lazydoc-ignore-classmethod: internal -->
1121
+ """
1122
+ run_moment = cls._runmoment_preprocessor(value)
1123
+
1124
+ if hasattr(values, "data"):
1125
+ # pydantic v2
1126
+ values = values.data
1127
+ else:
1128
+ # pydantic v1
1129
+ values = values
1130
+
1131
+ if (
1132
+ run_moment
1133
+ and values.get("run_id") is not None
1134
+ and values.get("run_id") == run_moment.run
1135
+ ):
1136
+ raise ValueError(
1137
+ "Provided `run_id` is the same as the run to `fork_from`. "
1138
+ "Please provide a different `run_id` or remove the `run_id` argument. "
1139
+ "If you want to rewind the current run, please use `resume_from` instead."
1140
+ )
1141
+ return run_moment
1142
+
1143
+ @field_validator("http_proxy", mode="after")
1144
+ @classmethod
1145
+ def validate_http_proxy(cls, value):
1146
+ """Validate the HTTP proxy.
1147
+
1148
+ <!-- lazydoc-ignore-classmethod: internal -->
1149
+ """
1150
+ if value is None:
1151
+ return None
1152
+ validate_url(value)
1153
+ return value.rstrip("/")
1154
+
1155
+ @field_validator("https_proxy", mode="after")
1156
+ @classmethod
1157
+ def validate_https_proxy(cls, value):
1158
+ """Validate the HTTPS proxy.
1159
+
1160
+ <!-- lazydoc-ignore-classmethod: internal -->
1161
+ """
1162
+ if value is None:
1163
+ return None
1164
+ validate_url(value)
1165
+ return value.rstrip("/")
1166
+
1167
+ @field_validator("ignore_globs", mode="after")
1168
+ @classmethod
1169
+ def validate_ignore_globs(cls, value):
1170
+ """Validate the ignore globs.
1171
+
1172
+ <!-- lazydoc-ignore-classmethod: internal -->
1173
+ """
1174
+ return tuple(value) if not isinstance(value, tuple) else value
1175
+
1176
+ @field_validator("program", mode="before")
1177
+ @classmethod
1178
+ def validate_program(cls, value):
1179
+ """Validate the program path.
1180
+
1181
+ <!-- lazydoc-ignore-classmethod: internal -->
1182
+ """
1183
+ # TODO: add native support for pathlib.Path
1184
+ if isinstance(value, pathlib.Path):
1185
+ return str(value)
1186
+ return value
1187
+
1188
+ @field_validator("program_abspath", mode="before")
1189
+ @classmethod
1190
+ def validate_program_abspath(cls, value):
1191
+ """Validate the absolute program path.
1192
+
1193
+ <!-- lazydoc-ignore-classmethod: internal -->
1194
+ """
1195
+ # TODO: add native support for pathlib.Path
1196
+ if isinstance(value, pathlib.Path):
1197
+ return str(value)
1198
+ return value
1199
+
1200
+ @field_validator("program_relpath", mode="before")
1201
+ @classmethod
1202
+ def validate_program_relpath(cls, value):
1203
+ """Validate the relative program path.
1204
+
1205
+ <!-- lazydoc-ignore-classmethod: internal -->
1206
+ """
1207
+ # TODO: add native support for pathlib.Path
1208
+ if isinstance(value, pathlib.Path):
1209
+ return str(value)
1210
+ return value
1211
+
1212
+ @field_validator("project", mode="after")
1213
+ @classmethod
1214
+ def validate_project(cls, value, values):
1215
+ """Validate the project name.
1216
+
1217
+ <!-- lazydoc-ignore-classmethod: internal -->
1218
+ """
1219
+ if value is None:
1220
+ return None
1221
+ invalid_chars_list = list("/\\#?%:")
1222
+ if len(value) > 128:
1223
+ raise UsageError(f"Invalid project name {value!r}: exceeded 128 characters")
1224
+ invalid_chars = {char for char in invalid_chars_list if char in value}
1225
+ if invalid_chars:
1226
+ raise UsageError(
1227
+ f"Invalid project name {value!r}: "
1228
+ f"cannot contain characters {','.join(invalid_chars_list)!r}, "
1229
+ f"found {','.join(invalid_chars)!r}"
1230
+ )
1231
+ return value
1232
+
1233
+ @field_validator("resume", mode="before")
1234
+ @classmethod
1235
+ def validate_resume(cls, value):
1236
+ """Validate the resume behavior.
1237
+
1238
+ <!-- lazydoc-ignore-classmethod: internal -->
1239
+ """
1240
+ if value is False:
1241
+ return None
1242
+ if value is True:
1243
+ return "auto"
1244
+ return value
1245
+
1246
+ @field_validator("resume_from", mode="before")
1247
+ @classmethod
1248
+ def validate_resume_from(cls, value, values) -> Optional[RunMoment]:
1249
+ """Validate the resume_from field.
1250
+
1251
+ <!-- lazydoc-ignore-classmethod: internal -->
1252
+ """
1253
+ run_moment = cls._runmoment_preprocessor(value)
1254
+
1255
+ if hasattr(values, "data"):
1256
+ # pydantic v2
1257
+ values = values.data
1258
+ else:
1259
+ # pydantic v1
1260
+ values = values
1261
+
1262
+ if (
1263
+ run_moment
1264
+ and values.get("run_id") is not None
1265
+ and values.get("run_id") != run_moment.run
1266
+ ):
1267
+ raise ValueError(
1268
+ "Both `run_id` and `resume_from` have been specified with different ids."
1269
+ )
1270
+ return run_moment
1271
+
1272
+ @field_validator("root_dir", mode="before")
1273
+ @classmethod
1274
+ def validate_root_dir(cls, value):
1275
+ """Validate the root directory.
1276
+
1277
+ <!-- lazydoc-ignore-classmethod: internal -->
1278
+ """
1279
+ # TODO: add native support for pathlib.Path
1280
+ if isinstance(value, pathlib.Path):
1281
+ return str(value)
1282
+ return value
1283
+
1284
+ @field_validator("run_id", mode="after")
1285
+ @classmethod
1286
+ def validate_run_id(cls, value, values):
1287
+ """Validate the run ID.
1288
+
1289
+ <!-- lazydoc-ignore-classmethod: internal -->
1290
+ """
1291
+ if value is None:
1292
+ return None
1293
+
1294
+ if len(value) == 0:
1295
+ raise UsageError("Run ID cannot be empty")
1296
+ if len(value) > len(value.strip()):
1297
+ raise UsageError("Run ID cannot start or end with whitespace")
1298
+ if not bool(value.strip()):
1299
+ raise UsageError("Run ID cannot contain only whitespace")
1300
+
1301
+ # check if the run id contains any reserved characters
1302
+ reserved_chars = ":;,#?/'"
1303
+ if any(char in reserved_chars for char in value):
1304
+ raise UsageError(f"Run ID cannot contain the characters: {reserved_chars}")
1305
+ return value
1306
+
1307
+ @field_validator("settings_system", mode="after")
1308
+ @classmethod
1309
+ def validate_settings_system(cls, value):
1310
+ """Validate the system settings file path.
1311
+
1312
+ <!-- lazydoc-ignore-classmethod: internal -->
1313
+ """
1314
+ if value is None:
1315
+ return None
1316
+ elif isinstance(value, pathlib.Path):
1317
+ return str(_path_convert(value))
1318
+ else:
1319
+ return _path_convert(value)
1320
+
1321
+ @field_validator("x_service_wait", mode="after")
1322
+ @classmethod
1323
+ def validate_service_wait(cls, value):
1324
+ """Validate the service wait time.
1325
+
1326
+ <!-- lazydoc-ignore-classmethod: internal -->
1327
+ """
1328
+ if value < 0:
1329
+ raise UsageError("Service wait time cannot be negative")
1330
+ return value
1331
+
1332
+ @field_validator("start_method", mode="after")
1333
+ @classmethod
1334
+ def validate_start_method(cls, value):
1335
+ """Validate the start method for subprocesses.
1336
+
1337
+ <!-- lazydoc-ignore-classmethod: internal -->
1338
+ """
1339
+ if value is None:
1340
+ return value
1341
+ wandb.termwarn(
1342
+ "`start_method` is deprecated and will be removed in a future version "
1343
+ "of wandb. This setting is currently non-functional and safely ignored.",
1344
+ repeat=False,
1345
+ )
1346
+ return value
1347
+
1348
+ @field_validator("x_stats_coreweave_metadata_base_url", mode="after")
1349
+ @classmethod
1350
+ def validate_x_stats_coreweave_metadata_base_url(cls, value):
1351
+ validate_url(value)
1352
+ return value.rstrip("/")
1353
+
1354
+ @field_validator("x_stats_gpu_device_ids", mode="before")
1355
+ @classmethod
1356
+ def validate_x_stats_gpu_device_ids(cls, value):
1357
+ """Validate the GPU device IDs.
1358
+
1359
+ <!-- lazydoc-ignore-classmethod: internal -->
1360
+ """
1361
+ if isinstance(value, str):
1362
+ return json.loads(value)
1363
+ return value
1364
+
1365
+ @field_validator("x_stats_neuron_monitor_config_path", mode="before")
1366
+ @classmethod
1367
+ def validate_x_stats_neuron_monitor_config_path(cls, value):
1368
+ """Validate the path to the neuron-monitor config file.
1369
+
1370
+ <!-- lazydoc-ignore-classmethod: internal -->
1371
+ """
1372
+ # TODO: add native support for pathlib.Path
1373
+ if isinstance(value, pathlib.Path):
1374
+ return str(value)
1375
+ return value
1376
+
1377
+ @field_validator("x_stats_open_metrics_endpoints", mode="before")
1378
+ @classmethod
1379
+ def validate_stats_open_metrics_endpoints(cls, value):
1380
+ """Validate the OpenMetrics endpoints.
1381
+
1382
+ <!-- lazydoc-ignore-classmethod: internal -->
1383
+ """
1384
+ if isinstance(value, str):
1385
+ return json.loads(value)
1386
+ return value
1387
+
1388
+ @field_validator("x_stats_open_metrics_filters", mode="before")
1389
+ @classmethod
1390
+ def validate_stats_open_metrics_filters(cls, value):
1391
+ """Validate the OpenMetrics filters.
1392
+
1393
+ <!-- lazydoc-ignore-classmethod: internal -->
1394
+ """
1395
+ if isinstance(value, str):
1396
+ return json.loads(value)
1397
+ return value
1398
+
1399
+ @field_validator("x_stats_open_metrics_http_headers", mode="before")
1400
+ @classmethod
1401
+ def validate_stats_open_metrics_http_headers(cls, value):
1402
+ """Validate the OpenMetrics HTTP headers.
1403
+
1404
+ <!-- lazydoc-ignore-classmethod: internal -->
1405
+ """
1406
+ if isinstance(value, str):
1407
+ return json.loads(value)
1408
+ return value
1409
+
1410
+ @field_validator("x_stats_sampling_interval", mode="after")
1411
+ @classmethod
1412
+ def validate_stats_sampling_interval(cls, value):
1413
+ """Validate the stats sampling interval.
1414
+
1415
+ <!-- lazydoc-ignore-classmethod: internal -->
1416
+ """
1417
+ if value < 0.1:
1418
+ raise UsageError("Stats sampling interval cannot be less than 0.1 seconds")
1419
+ return value
1420
+
1421
+ @field_validator("sweep_id", mode="after")
1422
+ @classmethod
1423
+ def validate_sweep_id(cls, value):
1424
+ """Validate the sweep ID.
1425
+
1426
+ <!-- lazydoc-ignore-classmethod: internal -->
1427
+ """
1428
+ if value is None:
1429
+ return None
1430
+ if len(value) == 0:
1431
+ raise UsageError("Sweep ID cannot be empty")
1432
+ if len(value) > len(value.strip()):
1433
+ raise UsageError("Sweep ID cannot start or end with whitespace")
1434
+ if not bool(value.strip()):
1435
+ raise UsageError("Sweep ID cannot contain only whitespace")
1436
+ return value
1437
+
1438
+ @field_validator("sweep_param_path", mode="before")
1439
+ @classmethod
1440
+ def validate_sweep_param_path(cls, value):
1441
+ """Validate the sweep parameter path.
1442
+
1443
+ <!-- lazydoc-ignore-classmethod: internal -->
1444
+ """
1445
+ # TODO: add native support for pathlib.Path
1446
+ if isinstance(value, pathlib.Path):
1447
+ return str(value)
1448
+ return value
1449
+
1450
+ # Computed fields.
1451
+
1452
+ @computed_field # type: ignore[prop-decorator]
1453
+ @property
1454
+ def _args(self) -> List[str]:
1455
+ if not self._jupyter:
1456
+ return sys.argv[1:]
1457
+ return []
1458
+
1459
+ @computed_field # type: ignore[prop-decorator]
1460
+ @property
1461
+ def _aws_lambda(self) -> bool:
1462
+ """Check if we are running in a lambda environment."""
1463
+ from sentry_sdk.integrations.aws_lambda import ( # type: ignore[import-not-found]
1464
+ get_lambda_bootstrap,
1465
+ )
1466
+
1467
+ lambda_bootstrap = get_lambda_bootstrap()
1468
+ if not lambda_bootstrap or not hasattr(
1469
+ lambda_bootstrap, "handle_event_request"
1470
+ ):
1471
+ return False
1472
+ return True
1473
+
1474
+ @computed_field # type: ignore[prop-decorator]
1475
+ @property
1476
+ def _code_path_local(self) -> Optional[str]:
1477
+ """The relative path from the current working directory to the code path.
1478
+
1479
+ For example, if the code path is /home/user/project/example.py, and the
1480
+ current working directory is /home/user/project, then the code path local
1481
+ is example.py.
1482
+
1483
+ If couldn't find the relative path, this will be an empty string.
1484
+ """
1485
+ return self._get_program_relpath(self.program) if self.program else None
1486
+
1487
+ @computed_field # type: ignore[prop-decorator]
1488
+ @property
1489
+ def _colab(self) -> bool:
1490
+ return "google.colab" in sys.modules
1491
+
1492
+ @computed_field # type: ignore[prop-decorator]
1493
+ @property
1494
+ def _ipython(self) -> bool:
1495
+ return ipython.in_ipython()
1496
+
1497
+ @computed_field # type: ignore[prop-decorator]
1498
+ @property
1499
+ def _jupyter(self) -> bool:
1500
+ return ipython.in_jupyter()
1501
+
1502
+ @computed_field # type: ignore[prop-decorator]
1503
+ @property
1504
+ def _kaggle(self) -> bool:
1505
+ return util._is_likely_kaggle()
1506
+
1507
+ @computed_field # type: ignore[prop-decorator]
1508
+ @property
1509
+ def _noop(self) -> bool:
1510
+ return self.mode == "disabled"
1511
+
1512
+ @computed_field # type: ignore[prop-decorator]
1513
+ @property
1514
+ def _notebook(self) -> bool:
1515
+ return self._ipython or self._jupyter or self._colab or self._kaggle
1516
+
1517
+ @computed_field # type: ignore[prop-decorator]
1518
+ @property
1519
+ def _offline(self) -> bool:
1520
+ return self.mode in ("offline", "dryrun")
1521
+
1522
+ @computed_field # type: ignore[prop-decorator]
1523
+ @property
1524
+ def _os(self) -> str:
1525
+ """The operating system of the machine running the script."""
1526
+ return platform.platform(aliased=True)
1527
+
1528
+ @computed_field # type: ignore[prop-decorator]
1529
+ @property
1530
+ def _platform(self) -> str:
1531
+ return f"{platform.system()}-{platform.machine()}".lower()
1532
+
1533
+ @computed_field # type: ignore[prop-decorator]
1534
+ @property
1535
+ def _python(self) -> str:
1536
+ return f"{platform.python_implementation()} {platform.python_version()}"
1537
+
1538
+ @computed_field # type: ignore[prop-decorator]
1539
+ @property
1540
+ def _shared(self) -> bool:
1541
+ """Whether we are in shared mode.
1542
+
1543
+ In "shared" mode, multiple processes can write to the same run,
1544
+ for example from different machines.
1545
+ """
1546
+ return self.mode == "shared"
1547
+
1548
+ @computed_field # type: ignore[prop-decorator]
1549
+ @property
1550
+ def _start_datetime(self) -> str:
1551
+ if self.x_start_time is None:
1552
+ return ""
1553
+ datetime_now = datetime.fromtimestamp(self.x_start_time)
1554
+ return datetime_now.strftime("%Y%m%d_%H%M%S")
1555
+
1556
+ @computed_field # type: ignore[prop-decorator]
1557
+ @property
1558
+ def _tmp_code_dir(self) -> str:
1559
+ return _path_convert(self.sync_dir, "tmp", "code")
1560
+
1561
+ @computed_field # type: ignore[prop-decorator]
1562
+ @property
1563
+ def _windows(self) -> bool:
1564
+ return platform.system() == "Windows"
1565
+
1566
+ @computed_field # type: ignore[prop-decorator]
1567
+ @property
1568
+ def colab_url(self) -> Optional[str]:
1569
+ """The URL to the Colab notebook, if running in Colab."""
1570
+ if not self._colab:
1571
+ return None
1572
+ if self.x_jupyter_path and self.x_jupyter_path.startswith("fileId="):
1573
+ unescaped = unquote(self.x_jupyter_path)
1574
+ return "https://colab.research.google.com/notebook#" + unescaped
1575
+ return None
1576
+
1577
+ @computed_field # type: ignore[prop-decorator]
1578
+ @property
1579
+ def deployment(self) -> Literal["local", "cloud"]:
1580
+ return "local" if self.is_local else "cloud"
1581
+
1582
+ @computed_field # type: ignore[prop-decorator]
1583
+ @property
1584
+ def files_dir(self) -> str:
1585
+ """Absolute path to the local directory where the run's files are stored."""
1586
+ return self.x_files_dir or _path_convert(self.sync_dir, "files")
1587
+
1588
+ @computed_field # type: ignore[prop-decorator]
1589
+ @property
1590
+ def is_local(self) -> bool:
1591
+ return str(self.base_url) != "https://api.wandb.ai"
1592
+
1593
+ @computed_field # type: ignore[prop-decorator]
1594
+ @property
1595
+ def log_dir(self) -> str:
1596
+ """The directory for storing log files."""
1597
+ return _path_convert(self.sync_dir, "logs")
1598
+
1599
+ @computed_field # type: ignore[prop-decorator]
1600
+ @property
1601
+ def log_internal(self) -> str:
1602
+ """The path to the file to use for internal logs."""
1603
+ return _path_convert(self.log_dir, "debug-internal.log")
1604
+
1605
+ @computed_field # type: ignore[prop-decorator]
1606
+ @property
1607
+ def log_symlink_internal(self) -> str:
1608
+ """The path to the symlink to the internal log file of the most recent run."""
1609
+ return _path_convert(self.wandb_dir, "debug-internal.log")
1610
+
1611
+ @computed_field # type: ignore[prop-decorator]
1612
+ @property
1613
+ def log_symlink_user(self) -> str:
1614
+ """The path to the symlink to the user-process log file of the most recent run."""
1615
+ return _path_convert(self.wandb_dir, "debug.log")
1616
+
1617
+ @computed_field # type: ignore[prop-decorator]
1618
+ @property
1619
+ def log_user(self) -> str:
1620
+ """The path to the file to use for user-process logs."""
1621
+ return _path_convert(self.log_dir, "debug.log")
1622
+
1623
+ @computed_field # type: ignore[prop-decorator]
1624
+ @property
1625
+ def project_url(self) -> str:
1626
+ """The W&B URL where the project can be viewed."""
1627
+ project_url = self._project_url_base()
1628
+ if not project_url:
1629
+ return ""
1630
+
1631
+ query = self._get_url_query_string()
1632
+
1633
+ return f"{project_url}{query}"
1634
+
1635
+ @computed_field # type: ignore[prop-decorator]
1636
+ @property
1637
+ def resume_fname(self) -> str:
1638
+ """The path to the resume file."""
1639
+ return _path_convert(self.wandb_dir, "wandb-resume.json")
1640
+
1641
+ @computed_field # type: ignore[prop-decorator]
1642
+ @property
1643
+ def run_mode(self) -> Literal["run", "offline-run"]:
1644
+ """The mode of the run. Can be either "run" or "offline-run"."""
1645
+ return "run" if not self._offline else "offline-run"
1646
+
1647
+ @computed_field # type: ignore[prop-decorator]
1648
+ @property
1649
+ def run_url(self) -> str:
1650
+ """The W&B URL where the run can be viewed."""
1651
+ project_url = self._project_url_base()
1652
+ if not all([project_url, self.run_id]):
1653
+ return ""
1654
+
1655
+ query = self._get_url_query_string()
1656
+ # Exclude specific safe characters from URL encoding to prevent 404 errors
1657
+ safe_chars = "=+&$@"
1658
+ return f"{project_url}/runs/{quote(self.run_id or '', safe=safe_chars)}{query}"
1659
+
1660
+ @computed_field # type: ignore[prop-decorator]
1661
+ @property
1662
+ def settings_workspace(self) -> str:
1663
+ """The path to the workspace settings file."""
1664
+ return _path_convert(self.wandb_dir, "settings")
1665
+
1666
+ @computed_field # type: ignore[prop-decorator]
1667
+ @property
1668
+ def sweep_url(self) -> str:
1669
+ """The W&B URL where the sweep can be viewed."""
1670
+ project_url = self._project_url_base()
1671
+ if not all([project_url, self.sweep_id]):
1672
+ return ""
1673
+
1674
+ query = self._get_url_query_string()
1675
+ return f"{project_url}/sweeps/{quote(self.sweep_id or '')}{query}"
1676
+
1677
+ @computed_field # type: ignore[prop-decorator]
1678
+ @property
1679
+ def sync_dir(self) -> str:
1680
+ """The directory for storing the run's files."""
1681
+ return _path_convert(
1682
+ self.wandb_dir,
1683
+ f"{self.run_mode}-{self.timespec}-{self.run_id}",
1684
+ )
1685
+
1686
+ @computed_field # type: ignore[prop-decorator]
1687
+ @property
1688
+ def sync_file(self) -> str:
1689
+ """Path to the append-only binary transaction log file."""
1690
+ return _path_convert(self.sync_dir, f"run-{self.run_id}.wandb")
1691
+
1692
+ @computed_field # type: ignore[prop-decorator]
1693
+ @property
1694
+ def sync_symlink_latest(self) -> str:
1695
+ """Path to the symlink to the most recent run's transaction log file."""
1696
+ return _path_convert(self.wandb_dir, "latest-run")
1697
+
1698
+ @computed_field # type: ignore[prop-decorator]
1699
+ @property
1700
+ def timespec(self) -> str:
1701
+ """The time specification for the run."""
1702
+ return self._start_datetime
1703
+
1704
+ @computed_field # type: ignore[prop-decorator]
1705
+ @property
1706
+ def wandb_dir(self) -> str:
1707
+ """Full path to the wandb directory."""
1708
+ stage_dir = (
1709
+ ".wandb" + os.sep
1710
+ if os.path.exists(os.path.join(self.root_dir, ".wandb"))
1711
+ else "wandb" + os.sep
1712
+ )
1713
+ path = os.path.join(self.root_dir, stage_dir)
1714
+ return os.path.expanduser(path)
1715
+
1716
+ # Methods to collect and update settings from different sources.
1717
+ #
1718
+ # The Settings class does not track the source of the settings,
1719
+ # so it is up to the developer to ensure that the settings are applied
1720
+ # in the correct order. Most of the updates are done in
1721
+ # wandb/sdk/wandb_setup.py::_WandbSetup._settings_setup.
1722
+
1723
+ def update_from_system_config_file(self):
1724
+ """Update settings from the system config file."""
1725
+ if not self.settings_system or not os.path.exists(self.settings_system):
1726
+ return
1727
+ for key, value in self._load_config_file(self.settings_system).items():
1728
+ if value is not None:
1729
+ setattr(self, key, value)
1730
+
1731
+ def update_from_workspace_config_file(self):
1732
+ """Update settings from the workspace config file."""
1733
+ if not self.settings_workspace or not os.path.exists(self.settings_workspace):
1734
+ return
1735
+ for key, value in self._load_config_file(self.settings_workspace).items():
1736
+ if value is not None:
1737
+ setattr(self, key, value)
1738
+
1739
+ def update_from_env_vars(self, environ: Dict[str, Any]):
1740
+ """Update settings from environment variables."""
1741
+ env_prefix: str = "WANDB_"
1742
+ private_env_prefix: str = env_prefix + "_"
1743
+ special_env_var_names = {
1744
+ "WANDB_SERVICE_TRANSPORT": "x_service_transport",
1745
+ "WANDB_DIR": "root_dir",
1746
+ "WANDB_NAME": "run_name",
1747
+ "WANDB_NOTES": "run_notes",
1748
+ "WANDB_TAGS": "run_tags",
1749
+ "WANDB_JOB_TYPE": "run_job_type",
1750
+ "WANDB_HTTP_TIMEOUT": "x_graphql_timeout_seconds",
1751
+ "WANDB_FILE_PUSHER_TIMEOUT": "x_file_transfer_timeout_seconds",
1752
+ "WANDB_USER_EMAIL": "email",
1753
+ }
1754
+ env = dict()
1755
+ for setting, value in environ.items():
1756
+ if not setting.startswith(env_prefix):
1757
+ continue
1758
+
1759
+ if setting in special_env_var_names:
1760
+ key = special_env_var_names[setting]
1761
+ elif setting.startswith(private_env_prefix):
1762
+ key = "x_" + setting[len(private_env_prefix) :].lower()
1763
+ else:
1764
+ # otherwise, strip the prefix and convert to lowercase
1765
+ key = setting[len(env_prefix) :].lower()
1766
+
1767
+ if key in self.__dict__:
1768
+ if key in ("ignore_globs", "run_tags"):
1769
+ value = value.split(",")
1770
+ env[key] = value
1771
+
1772
+ for key, value in env.items():
1773
+ if value is not None:
1774
+ setattr(self, key, value)
1775
+
1776
+ def update_from_system_environment(self):
1777
+ """Update settings from the system environment."""
1778
+ # For code saving, only allow env var override if value from server is true, or
1779
+ # if no preference was specified.
1780
+ if (self.save_code is True or self.save_code is None) and (
1781
+ os.getenv(env.SAVE_CODE) is not None
1782
+ or os.getenv(env.DISABLE_CODE) is not None
1783
+ ):
1784
+ self.save_code = env.should_save_code()
1785
+
1786
+ if os.getenv(env.DISABLE_GIT) is not None:
1787
+ self.disable_git = env.disable_git()
1788
+
1789
+ # Attempt to get notebook information if not already set by the user
1790
+ if self._jupyter and (self.notebook_name is None or self.notebook_name == ""):
1791
+ meta = wandb.jupyter.notebook_metadata(self.silent) # type: ignore
1792
+ self.x_jupyter_path = meta.get("path")
1793
+ self.x_jupyter_name = meta.get("name")
1794
+ self.x_jupyter_root = meta.get("root")
1795
+ elif (
1796
+ self._jupyter
1797
+ and self.notebook_name is not None
1798
+ and os.path.exists(self.notebook_name)
1799
+ ):
1800
+ self.x_jupyter_path = self.notebook_name
1801
+ self.x_jupyter_name = self.notebook_name
1802
+ self.x_jupyter_root = os.getcwd()
1803
+ elif self._jupyter:
1804
+ wandb.termwarn(
1805
+ "WANDB_NOTEBOOK_NAME should be a path to a notebook file, "
1806
+ f"couldn't find {self.notebook_name}.",
1807
+ )
1808
+
1809
+ # host is populated by update_from_env_vars if the corresponding env
1810
+ # vars exist -- but if they don't, we'll fill them in here.
1811
+ if self.host is None:
1812
+ self.host = socket.gethostname() # type: ignore
1813
+
1814
+ _executable = (
1815
+ self.x_executable
1816
+ or os.environ.get(env._EXECUTABLE)
1817
+ or sys.executable
1818
+ or shutil.which("python3")
1819
+ or "python3"
1820
+ )
1821
+ self.x_executable = _executable
1822
+
1823
+ if self.docker is None:
1824
+ self.docker = env.get_docker(util.image_id_from_k8s())
1825
+
1826
+ # proceed if not in CLI mode
1827
+ if self.x_cli_only_mode:
1828
+ return
1829
+
1830
+ program = self.program or self._get_program()
1831
+
1832
+ if program is not None:
1833
+ try:
1834
+ root = (
1835
+ GitRepo().root or os.getcwd()
1836
+ if not self.disable_git
1837
+ else os.getcwd()
1838
+ )
1839
+ except Exception:
1840
+ # if the git command fails, fall back to the current working directory
1841
+ root = os.getcwd()
1842
+
1843
+ self.program_relpath = self.program_relpath or self._get_program_relpath(
1844
+ program, root
1845
+ )
1846
+ program_abspath = os.path.abspath(
1847
+ os.path.join(root, os.path.relpath(os.getcwd(), root), program)
1848
+ )
1849
+ if os.path.exists(program_abspath):
1850
+ self.program_abspath = program_abspath
1851
+ else:
1852
+ program = "<python with no main file>"
1853
+
1854
+ self.program = program
1855
+
1856
+ def update_from_dict(self, settings: Dict[str, Any]) -> None:
1857
+ """Update settings from a dictionary."""
1858
+ for key, value in dict(settings).items():
1859
+ if value is not None:
1860
+ setattr(self, key, value)
1861
+
1862
+ def update_from_settings(self, settings: Settings) -> None:
1863
+ """Update settings from another instance of `Settings`."""
1864
+ d = {field: getattr(settings, field) for field in settings.model_fields_set}
1865
+ if d:
1866
+ self.update_from_dict(d)
1867
+
1868
+ # Helper methods.
1869
+
1870
+ def to_proto(self) -> wandb_settings_pb2.Settings:
1871
+ """Generate a protobuf representation of the settings."""
1872
+ settings_proto = wandb_settings_pb2.Settings()
1873
+ for k, v in self.model_dump(exclude_none=True).items():
1874
+ if k in CLIENT_ONLY_SETTINGS:
1875
+ continue
1876
+
1877
+ # Special case for x_stats_open_metrics_filters.
1878
+ if k == "x_stats_open_metrics_filters":
1879
+ if isinstance(v, (list, set, tuple)):
1880
+ setting = getattr(settings_proto, k)
1881
+ setting.sequence.value.extend(v)
1882
+ elif isinstance(v, dict):
1883
+ setting = getattr(settings_proto, k)
1884
+ for key, value in v.items():
1885
+ for kk, vv in value.items():
1886
+ setting.mapping.value[key].value[kk] = vv
1887
+ else:
1888
+ raise TypeError(f"Unsupported type {type(v)} for setting {k}")
1889
+ continue
1890
+
1891
+ # Special case for RunMoment fields.
1892
+ if k in ("fork_from", "resume_from"):
1893
+ run_moment = (
1894
+ v
1895
+ if isinstance(v, RunMoment)
1896
+ else RunMoment(
1897
+ run=v.get("run"),
1898
+ value=v.get("value"),
1899
+ metric=v.get("metric"),
1900
+ )
1901
+ )
1902
+ getattr(settings_proto, k).CopyFrom(
1903
+ wandb_settings_pb2.RunMoment(
1904
+ run=run_moment.run,
1905
+ value=run_moment.value,
1906
+ metric=run_moment.metric,
1907
+ )
1908
+ )
1909
+ continue
1910
+
1911
+ if isinstance(v, bool):
1912
+ getattr(settings_proto, k).CopyFrom(BoolValue(value=v))
1913
+ elif isinstance(v, int):
1914
+ getattr(settings_proto, k).CopyFrom(Int32Value(value=v))
1915
+ elif isinstance(v, float):
1916
+ getattr(settings_proto, k).CopyFrom(DoubleValue(value=v))
1917
+ elif isinstance(v, str):
1918
+ getattr(settings_proto, k).CopyFrom(StringValue(value=v))
1919
+ elif isinstance(v, (list, set, tuple)):
1920
+ # we only support sequences of strings for now
1921
+ sequence = getattr(settings_proto, k)
1922
+ sequence.value.extend(v)
1923
+ elif isinstance(v, dict):
1924
+ mapping = getattr(settings_proto, k)
1925
+ for key, value in v.items():
1926
+ # we only support dicts with string values for now
1927
+ mapping.value[key] = value
1928
+ elif v is None:
1929
+ # None means that the setting value was not set.
1930
+ pass
1931
+ else:
1932
+ raise TypeError(f"Unsupported type {type(v)} for setting {k}")
1933
+
1934
+ return settings_proto
1935
+
1936
+ def _get_program(self) -> Optional[str]:
1937
+ """Get the program that started the current process."""
1938
+ if self._jupyter:
1939
+ # If in a notebook, try to get the program from the notebook metadata.
1940
+ if self.notebook_name:
1941
+ return self.notebook_name
1942
+
1943
+ if not self.x_jupyter_path:
1944
+ return self.program
1945
+
1946
+ if self.x_jupyter_path.startswith("fileId="):
1947
+ return self.x_jupyter_name
1948
+
1949
+ return self.x_jupyter_path
1950
+
1951
+ # If not in a notebook, try to get the program from the environment
1952
+ # or the __main__ module for scripts run as `python -m ...`.
1953
+ program = os.getenv(env.PROGRAM)
1954
+ if program is not None:
1955
+ return program
1956
+
1957
+ try:
1958
+ import __main__
1959
+ except ImportError:
1960
+ return None
1961
+
1962
+ try:
1963
+ if __main__.__spec__ is None:
1964
+ python_args = __main__.__file__
1965
+ else:
1966
+ python_args = f"-m {__main__.__spec__.name}"
1967
+ except AttributeError:
1968
+ return None
1969
+
1970
+ return python_args
1971
+
1972
+ @staticmethod
1973
+ def _get_program_relpath(program: str, root: Optional[str] = None) -> Optional[str]:
1974
+ """Get the relative path to the program from the root directory."""
1975
+ if not program:
1976
+ return None
1977
+
1978
+ root = root or os.getcwd()
1979
+ if not root:
1980
+ return None
1981
+
1982
+ # For windows if the root and program are on different drives,
1983
+ # os.path.relpath will raise a ValueError.
1984
+ if not util.are_paths_on_same_drive(root, program):
1985
+ return None
1986
+
1987
+ full_path_to_program = os.path.join(
1988
+ root, os.path.relpath(os.getcwd(), root), program
1989
+ )
1990
+ if os.path.exists(full_path_to_program):
1991
+ relative_path = os.path.relpath(full_path_to_program, start=root)
1992
+ if "../" in relative_path:
1993
+ return None
1994
+ return relative_path
1995
+
1996
+ return None
1997
+
1998
+ @staticmethod
1999
+ def _load_config_file(file_name: str, section: str = "default") -> dict:
2000
+ """Load a config file and return the settings for a given section."""
2001
+ parser = configparser.ConfigParser()
2002
+ parser.add_section(section)
2003
+ parser.read(file_name)
2004
+ config: Dict[str, Any] = dict()
2005
+ for k in parser[section]:
2006
+ config[k] = parser[section][k]
2007
+ if k == "ignore_globs":
2008
+ config[k] = config[k].split(",")
2009
+ return config
2010
+
2011
+ def _project_url_base(self) -> str:
2012
+ """Construct the base URL for the project."""
2013
+ if not all([self.entity, self.project]):
2014
+ return ""
2015
+
2016
+ app_url = util.app_url(self.base_url)
2017
+ return f"{app_url}/{quote(self.entity or '')}/{quote(self.project or '')}"
2018
+
2019
+ def _get_url_query_string(self) -> str:
2020
+ """Construct the query string for project, run, and sweep URLs."""
2021
+ # TODO: remove dependency on Api()
2022
+ if self.anonymous not in ["allow", "must"]:
2023
+ return ""
2024
+
2025
+ api_key = apikey.api_key(settings=self)
2026
+
2027
+ return f"?{urlencode({'apiKey': api_key})}"
2028
+
2029
+ @staticmethod
2030
+ def _runmoment_preprocessor(
2031
+ val: Union[RunMoment, str, None],
2032
+ ) -> Optional[RunMoment]:
2033
+ """Preprocess the setting for forking or resuming a run."""
2034
+ if isinstance(val, RunMoment) or val is None:
2035
+ return val
2036
+ elif isinstance(val, str):
2037
+ return RunMoment.from_uri(val)
2038
+
2039
+ if not IS_PYDANTIC_V2:
2040
+
2041
+ def model_copy(self, *args, **kwargs):
2042
+ return self.copy(*args, **kwargs)
2043
+
2044
+ def model_dump(self, **kwargs):
2045
+ """Compatibility method for Pydantic v1 to mimic v2's model_dump.
2046
+
2047
+ In v1, this is equivalent to dict() but also includes computed properties.
2048
+
2049
+ Args:
2050
+ **kwargs: Options passed to the dict method
2051
+ - exclude_none: Whether to exclude fields with None values
2052
+
2053
+ Returns:
2054
+ A dictionary of the model's fields and computed properties
2055
+ """
2056
+ # Handle exclude_none separately since it's named differently in v1
2057
+ exclude_none = kwargs.pop("exclude_none", False)
2058
+
2059
+ # Start with regular fields from dict()
2060
+ result = self.dict(**kwargs)
2061
+
2062
+ # Get all computed properties
2063
+ for name in dir(self.__class__):
2064
+ attr = getattr(self.__class__, name, None)
2065
+ if isinstance(attr, property):
2066
+ try:
2067
+ # Only include properties that don't raise errors
2068
+ value = getattr(self, name)
2069
+ result[name] = value
2070
+ except (AttributeError, NotImplementedError, TypeError, ValueError):
2071
+ # Skip properties that can't be accessed or raise errors
2072
+ pass
2073
+ elif isinstance(attr, RunMoment):
2074
+ value = getattr(self, name)
2075
+ result[name] = value
2076
+
2077
+ # Special Pydantic attributes that should always be excluded
2078
+ exclude_fields = {
2079
+ "model_config",
2080
+ "model_fields",
2081
+ "model_fields_set",
2082
+ "__fields__",
2083
+ "__model_fields_set",
2084
+ "__pydantic_self__",
2085
+ "__pydantic_initialised__",
2086
+ }
2087
+
2088
+ # Remove special Pydantic attributes
2089
+ for field in exclude_fields:
2090
+ if field in result:
2091
+ del result[field]
2092
+
2093
+ if exclude_none:
2094
+ # Remove None values from the result
2095
+ return {k: v for k, v in result.items() if v is not None}
2096
+
2097
+ return result
2098
+
2099
+ @property
2100
+ def model_fields_set(self) -> set:
2101
+ """Return a set of fields that have been explicitly set.
2102
+
2103
+ This is a compatibility property for Pydantic v1 to mimic v2's model_fields_set.
2104
+ """
2105
+ return getattr(self, "__fields_set__", set())