genesis-flow 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. genesis_flow-1.0.0.dist-info/METADATA +822 -0
  2. genesis_flow-1.0.0.dist-info/RECORD +645 -0
  3. genesis_flow-1.0.0.dist-info/WHEEL +5 -0
  4. genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
  5. genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
  6. genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
  7. mlflow/__init__.py +367 -0
  8. mlflow/__main__.py +3 -0
  9. mlflow/ag2/__init__.py +56 -0
  10. mlflow/ag2/ag2_logger.py +294 -0
  11. mlflow/anthropic/__init__.py +40 -0
  12. mlflow/anthropic/autolog.py +129 -0
  13. mlflow/anthropic/chat.py +144 -0
  14. mlflow/artifacts/__init__.py +268 -0
  15. mlflow/autogen/__init__.py +144 -0
  16. mlflow/autogen/chat.py +142 -0
  17. mlflow/azure/__init__.py +26 -0
  18. mlflow/azure/auth_handler.py +257 -0
  19. mlflow/azure/client.py +319 -0
  20. mlflow/azure/config.py +120 -0
  21. mlflow/azure/connection_factory.py +340 -0
  22. mlflow/azure/exceptions.py +27 -0
  23. mlflow/azure/stores.py +327 -0
  24. mlflow/azure/utils.py +183 -0
  25. mlflow/bedrock/__init__.py +45 -0
  26. mlflow/bedrock/_autolog.py +202 -0
  27. mlflow/bedrock/chat.py +122 -0
  28. mlflow/bedrock/stream.py +160 -0
  29. mlflow/bedrock/utils.py +43 -0
  30. mlflow/cli.py +707 -0
  31. mlflow/client.py +12 -0
  32. mlflow/config/__init__.py +56 -0
  33. mlflow/crewai/__init__.py +79 -0
  34. mlflow/crewai/autolog.py +253 -0
  35. mlflow/crewai/chat.py +29 -0
  36. mlflow/data/__init__.py +75 -0
  37. mlflow/data/artifact_dataset_sources.py +170 -0
  38. mlflow/data/code_dataset_source.py +40 -0
  39. mlflow/data/dataset.py +123 -0
  40. mlflow/data/dataset_registry.py +168 -0
  41. mlflow/data/dataset_source.py +110 -0
  42. mlflow/data/dataset_source_registry.py +219 -0
  43. mlflow/data/delta_dataset_source.py +167 -0
  44. mlflow/data/digest_utils.py +108 -0
  45. mlflow/data/evaluation_dataset.py +562 -0
  46. mlflow/data/filesystem_dataset_source.py +81 -0
  47. mlflow/data/http_dataset_source.py +145 -0
  48. mlflow/data/huggingface_dataset.py +258 -0
  49. mlflow/data/huggingface_dataset_source.py +118 -0
  50. mlflow/data/meta_dataset.py +104 -0
  51. mlflow/data/numpy_dataset.py +223 -0
  52. mlflow/data/pandas_dataset.py +231 -0
  53. mlflow/data/polars_dataset.py +352 -0
  54. mlflow/data/pyfunc_dataset_mixin.py +31 -0
  55. mlflow/data/schema.py +76 -0
  56. mlflow/data/sources.py +1 -0
  57. mlflow/data/spark_dataset.py +406 -0
  58. mlflow/data/spark_dataset_source.py +74 -0
  59. mlflow/data/spark_delta_utils.py +118 -0
  60. mlflow/data/tensorflow_dataset.py +350 -0
  61. mlflow/data/uc_volume_dataset_source.py +81 -0
  62. mlflow/db.py +27 -0
  63. mlflow/dspy/__init__.py +17 -0
  64. mlflow/dspy/autolog.py +197 -0
  65. mlflow/dspy/callback.py +398 -0
  66. mlflow/dspy/constant.py +1 -0
  67. mlflow/dspy/load.py +93 -0
  68. mlflow/dspy/save.py +393 -0
  69. mlflow/dspy/util.py +109 -0
  70. mlflow/dspy/wrapper.py +226 -0
  71. mlflow/entities/__init__.py +104 -0
  72. mlflow/entities/_mlflow_object.py +52 -0
  73. mlflow/entities/assessment.py +545 -0
  74. mlflow/entities/assessment_error.py +80 -0
  75. mlflow/entities/assessment_source.py +141 -0
  76. mlflow/entities/dataset.py +92 -0
  77. mlflow/entities/dataset_input.py +51 -0
  78. mlflow/entities/dataset_summary.py +62 -0
  79. mlflow/entities/document.py +48 -0
  80. mlflow/entities/experiment.py +109 -0
  81. mlflow/entities/experiment_tag.py +35 -0
  82. mlflow/entities/file_info.py +45 -0
  83. mlflow/entities/input_tag.py +35 -0
  84. mlflow/entities/lifecycle_stage.py +35 -0
  85. mlflow/entities/logged_model.py +228 -0
  86. mlflow/entities/logged_model_input.py +26 -0
  87. mlflow/entities/logged_model_output.py +32 -0
  88. mlflow/entities/logged_model_parameter.py +46 -0
  89. mlflow/entities/logged_model_status.py +74 -0
  90. mlflow/entities/logged_model_tag.py +33 -0
  91. mlflow/entities/metric.py +200 -0
  92. mlflow/entities/model_registry/__init__.py +29 -0
  93. mlflow/entities/model_registry/_model_registry_entity.py +13 -0
  94. mlflow/entities/model_registry/model_version.py +243 -0
  95. mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
  96. mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
  97. mlflow/entities/model_registry/model_version_search.py +25 -0
  98. mlflow/entities/model_registry/model_version_stages.py +25 -0
  99. mlflow/entities/model_registry/model_version_status.py +35 -0
  100. mlflow/entities/model_registry/model_version_tag.py +35 -0
  101. mlflow/entities/model_registry/prompt.py +73 -0
  102. mlflow/entities/model_registry/prompt_version.py +244 -0
  103. mlflow/entities/model_registry/registered_model.py +175 -0
  104. mlflow/entities/model_registry/registered_model_alias.py +35 -0
  105. mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
  106. mlflow/entities/model_registry/registered_model_search.py +25 -0
  107. mlflow/entities/model_registry/registered_model_tag.py +35 -0
  108. mlflow/entities/multipart_upload.py +74 -0
  109. mlflow/entities/param.py +49 -0
  110. mlflow/entities/run.py +97 -0
  111. mlflow/entities/run_data.py +84 -0
  112. mlflow/entities/run_info.py +188 -0
  113. mlflow/entities/run_inputs.py +59 -0
  114. mlflow/entities/run_outputs.py +43 -0
  115. mlflow/entities/run_status.py +41 -0
  116. mlflow/entities/run_tag.py +36 -0
  117. mlflow/entities/source_type.py +31 -0
  118. mlflow/entities/span.py +774 -0
  119. mlflow/entities/span_event.py +96 -0
  120. mlflow/entities/span_status.py +102 -0
  121. mlflow/entities/trace.py +317 -0
  122. mlflow/entities/trace_data.py +71 -0
  123. mlflow/entities/trace_info.py +220 -0
  124. mlflow/entities/trace_info_v2.py +162 -0
  125. mlflow/entities/trace_location.py +173 -0
  126. mlflow/entities/trace_state.py +39 -0
  127. mlflow/entities/trace_status.py +68 -0
  128. mlflow/entities/view_type.py +51 -0
  129. mlflow/environment_variables.py +866 -0
  130. mlflow/evaluation/__init__.py +16 -0
  131. mlflow/evaluation/assessment.py +369 -0
  132. mlflow/evaluation/evaluation.py +411 -0
  133. mlflow/evaluation/evaluation_tag.py +61 -0
  134. mlflow/evaluation/fluent.py +48 -0
  135. mlflow/evaluation/utils.py +201 -0
  136. mlflow/exceptions.py +213 -0
  137. mlflow/experiments.py +140 -0
  138. mlflow/gemini/__init__.py +81 -0
  139. mlflow/gemini/autolog.py +186 -0
  140. mlflow/gemini/chat.py +261 -0
  141. mlflow/genai/__init__.py +71 -0
  142. mlflow/genai/datasets/__init__.py +67 -0
  143. mlflow/genai/datasets/evaluation_dataset.py +131 -0
  144. mlflow/genai/evaluation/__init__.py +3 -0
  145. mlflow/genai/evaluation/base.py +411 -0
  146. mlflow/genai/evaluation/constant.py +23 -0
  147. mlflow/genai/evaluation/utils.py +244 -0
  148. mlflow/genai/judges/__init__.py +21 -0
  149. mlflow/genai/judges/databricks.py +404 -0
  150. mlflow/genai/label_schemas/__init__.py +153 -0
  151. mlflow/genai/label_schemas/label_schemas.py +209 -0
  152. mlflow/genai/labeling/__init__.py +159 -0
  153. mlflow/genai/labeling/labeling.py +250 -0
  154. mlflow/genai/optimize/__init__.py +13 -0
  155. mlflow/genai/optimize/base.py +198 -0
  156. mlflow/genai/optimize/optimizers/__init__.py +4 -0
  157. mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
  158. mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
  159. mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
  160. mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
  161. mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
  162. mlflow/genai/optimize/types.py +75 -0
  163. mlflow/genai/optimize/util.py +30 -0
  164. mlflow/genai/prompts/__init__.py +206 -0
  165. mlflow/genai/scheduled_scorers.py +431 -0
  166. mlflow/genai/scorers/__init__.py +26 -0
  167. mlflow/genai/scorers/base.py +492 -0
  168. mlflow/genai/scorers/builtin_scorers.py +765 -0
  169. mlflow/genai/scorers/scorer_utils.py +138 -0
  170. mlflow/genai/scorers/validation.py +165 -0
  171. mlflow/genai/utils/data_validation.py +146 -0
  172. mlflow/genai/utils/enum_utils.py +23 -0
  173. mlflow/genai/utils/trace_utils.py +211 -0
  174. mlflow/groq/__init__.py +42 -0
  175. mlflow/groq/_groq_autolog.py +74 -0
  176. mlflow/johnsnowlabs/__init__.py +888 -0
  177. mlflow/langchain/__init__.py +24 -0
  178. mlflow/langchain/api_request_parallel_processor.py +330 -0
  179. mlflow/langchain/autolog.py +147 -0
  180. mlflow/langchain/chat_agent_langgraph.py +340 -0
  181. mlflow/langchain/constant.py +1 -0
  182. mlflow/langchain/constants.py +1 -0
  183. mlflow/langchain/databricks_dependencies.py +444 -0
  184. mlflow/langchain/langchain_tracer.py +597 -0
  185. mlflow/langchain/model.py +919 -0
  186. mlflow/langchain/output_parsers.py +142 -0
  187. mlflow/langchain/retriever_chain.py +153 -0
  188. mlflow/langchain/runnables.py +527 -0
  189. mlflow/langchain/utils/chat.py +402 -0
  190. mlflow/langchain/utils/logging.py +671 -0
  191. mlflow/langchain/utils/serialization.py +36 -0
  192. mlflow/legacy_databricks_cli/__init__.py +0 -0
  193. mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
  194. mlflow/legacy_databricks_cli/configure/provider.py +482 -0
  195. mlflow/litellm/__init__.py +175 -0
  196. mlflow/llama_index/__init__.py +22 -0
  197. mlflow/llama_index/autolog.py +55 -0
  198. mlflow/llama_index/chat.py +43 -0
  199. mlflow/llama_index/constant.py +1 -0
  200. mlflow/llama_index/model.py +577 -0
  201. mlflow/llama_index/pyfunc_wrapper.py +332 -0
  202. mlflow/llama_index/serialize_objects.py +188 -0
  203. mlflow/llama_index/tracer.py +561 -0
  204. mlflow/metrics/__init__.py +479 -0
  205. mlflow/metrics/base.py +39 -0
  206. mlflow/metrics/genai/__init__.py +25 -0
  207. mlflow/metrics/genai/base.py +101 -0
  208. mlflow/metrics/genai/genai_metric.py +771 -0
  209. mlflow/metrics/genai/metric_definitions.py +450 -0
  210. mlflow/metrics/genai/model_utils.py +371 -0
  211. mlflow/metrics/genai/prompt_template.py +68 -0
  212. mlflow/metrics/genai/prompts/__init__.py +0 -0
  213. mlflow/metrics/genai/prompts/v1.py +422 -0
  214. mlflow/metrics/genai/utils.py +6 -0
  215. mlflow/metrics/metric_definitions.py +619 -0
  216. mlflow/mismatch.py +34 -0
  217. mlflow/mistral/__init__.py +34 -0
  218. mlflow/mistral/autolog.py +71 -0
  219. mlflow/mistral/chat.py +135 -0
  220. mlflow/ml_package_versions.py +452 -0
  221. mlflow/models/__init__.py +97 -0
  222. mlflow/models/auth_policy.py +83 -0
  223. mlflow/models/cli.py +354 -0
  224. mlflow/models/container/__init__.py +294 -0
  225. mlflow/models/container/scoring_server/__init__.py +0 -0
  226. mlflow/models/container/scoring_server/nginx.conf +39 -0
  227. mlflow/models/dependencies_schemas.py +287 -0
  228. mlflow/models/display_utils.py +158 -0
  229. mlflow/models/docker_utils.py +211 -0
  230. mlflow/models/evaluation/__init__.py +23 -0
  231. mlflow/models/evaluation/_shap_patch.py +64 -0
  232. mlflow/models/evaluation/artifacts.py +194 -0
  233. mlflow/models/evaluation/base.py +1811 -0
  234. mlflow/models/evaluation/calibration_curve.py +109 -0
  235. mlflow/models/evaluation/default_evaluator.py +996 -0
  236. mlflow/models/evaluation/deprecated.py +23 -0
  237. mlflow/models/evaluation/evaluator_registry.py +80 -0
  238. mlflow/models/evaluation/evaluators/classifier.py +704 -0
  239. mlflow/models/evaluation/evaluators/default.py +233 -0
  240. mlflow/models/evaluation/evaluators/regressor.py +96 -0
  241. mlflow/models/evaluation/evaluators/shap.py +296 -0
  242. mlflow/models/evaluation/lift_curve.py +178 -0
  243. mlflow/models/evaluation/utils/metric.py +123 -0
  244. mlflow/models/evaluation/utils/trace.py +179 -0
  245. mlflow/models/evaluation/validation.py +434 -0
  246. mlflow/models/flavor_backend.py +93 -0
  247. mlflow/models/flavor_backend_registry.py +53 -0
  248. mlflow/models/model.py +1639 -0
  249. mlflow/models/model_config.py +150 -0
  250. mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
  251. mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
  252. mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
  253. mlflow/models/python_api.py +369 -0
  254. mlflow/models/rag_signatures.py +128 -0
  255. mlflow/models/resources.py +321 -0
  256. mlflow/models/signature.py +662 -0
  257. mlflow/models/utils.py +2054 -0
  258. mlflow/models/wheeled_model.py +280 -0
  259. mlflow/openai/__init__.py +57 -0
  260. mlflow/openai/_agent_tracer.py +364 -0
  261. mlflow/openai/api_request_parallel_processor.py +131 -0
  262. mlflow/openai/autolog.py +509 -0
  263. mlflow/openai/constant.py +1 -0
  264. mlflow/openai/model.py +824 -0
  265. mlflow/openai/utils/chat_schema.py +367 -0
  266. mlflow/optuna/__init__.py +3 -0
  267. mlflow/optuna/storage.py +646 -0
  268. mlflow/plugins/__init__.py +72 -0
  269. mlflow/plugins/base.py +358 -0
  270. mlflow/plugins/builtin/__init__.py +24 -0
  271. mlflow/plugins/builtin/pytorch_plugin.py +150 -0
  272. mlflow/plugins/builtin/sklearn_plugin.py +158 -0
  273. mlflow/plugins/builtin/transformers_plugin.py +187 -0
  274. mlflow/plugins/cli.py +321 -0
  275. mlflow/plugins/discovery.py +340 -0
  276. mlflow/plugins/manager.py +465 -0
  277. mlflow/plugins/registry.py +316 -0
  278. mlflow/plugins/templates/framework_plugin_template.py +329 -0
  279. mlflow/prompt/constants.py +20 -0
  280. mlflow/prompt/promptlab_model.py +197 -0
  281. mlflow/prompt/registry_utils.py +248 -0
  282. mlflow/promptflow/__init__.py +495 -0
  283. mlflow/protos/__init__.py +0 -0
  284. mlflow/protos/assessments_pb2.py +174 -0
  285. mlflow/protos/databricks_artifacts_pb2.py +489 -0
  286. mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
  287. mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
  288. mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
  289. mlflow/protos/databricks_pb2.py +267 -0
  290. mlflow/protos/databricks_trace_server_pb2.py +374 -0
  291. mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
  292. mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
  293. mlflow/protos/facet_feature_statistics_pb2.py +296 -0
  294. mlflow/protos/internal_pb2.py +77 -0
  295. mlflow/protos/mlflow_artifacts_pb2.py +336 -0
  296. mlflow/protos/model_registry_pb2.py +1073 -0
  297. mlflow/protos/scalapb/__init__.py +0 -0
  298. mlflow/protos/scalapb/scalapb_pb2.py +104 -0
  299. mlflow/protos/service_pb2.py +2600 -0
  300. mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
  301. mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
  302. mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
  303. mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
  304. mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
  305. mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
  306. mlflow/py.typed +0 -0
  307. mlflow/pydantic_ai/__init__.py +57 -0
  308. mlflow/pydantic_ai/autolog.py +173 -0
  309. mlflow/pyfunc/__init__.py +3844 -0
  310. mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
  311. mlflow/pyfunc/backend.py +523 -0
  312. mlflow/pyfunc/context.py +78 -0
  313. mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
  314. mlflow/pyfunc/loaders/__init__.py +7 -0
  315. mlflow/pyfunc/loaders/chat_agent.py +117 -0
  316. mlflow/pyfunc/loaders/chat_model.py +125 -0
  317. mlflow/pyfunc/loaders/code_model.py +31 -0
  318. mlflow/pyfunc/loaders/responses_agent.py +112 -0
  319. mlflow/pyfunc/mlserver.py +46 -0
  320. mlflow/pyfunc/model.py +1473 -0
  321. mlflow/pyfunc/scoring_server/__init__.py +604 -0
  322. mlflow/pyfunc/scoring_server/app.py +7 -0
  323. mlflow/pyfunc/scoring_server/client.py +146 -0
  324. mlflow/pyfunc/spark_model_cache.py +48 -0
  325. mlflow/pyfunc/stdin_server.py +44 -0
  326. mlflow/pyfunc/utils/__init__.py +3 -0
  327. mlflow/pyfunc/utils/data_validation.py +224 -0
  328. mlflow/pyfunc/utils/environment.py +22 -0
  329. mlflow/pyfunc/utils/input_converter.py +47 -0
  330. mlflow/pyfunc/utils/serving_data_parser.py +11 -0
  331. mlflow/pytorch/__init__.py +1171 -0
  332. mlflow/pytorch/_lightning_autolog.py +580 -0
  333. mlflow/pytorch/_pytorch_autolog.py +50 -0
  334. mlflow/pytorch/pickle_module.py +35 -0
  335. mlflow/rfunc/__init__.py +42 -0
  336. mlflow/rfunc/backend.py +134 -0
  337. mlflow/runs.py +89 -0
  338. mlflow/server/__init__.py +302 -0
  339. mlflow/server/auth/__init__.py +1224 -0
  340. mlflow/server/auth/__main__.py +4 -0
  341. mlflow/server/auth/basic_auth.ini +6 -0
  342. mlflow/server/auth/cli.py +11 -0
  343. mlflow/server/auth/client.py +537 -0
  344. mlflow/server/auth/config.py +34 -0
  345. mlflow/server/auth/db/__init__.py +0 -0
  346. mlflow/server/auth/db/cli.py +18 -0
  347. mlflow/server/auth/db/migrations/__init__.py +0 -0
  348. mlflow/server/auth/db/migrations/alembic.ini +110 -0
  349. mlflow/server/auth/db/migrations/env.py +76 -0
  350. mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
  351. mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
  352. mlflow/server/auth/db/models.py +67 -0
  353. mlflow/server/auth/db/utils.py +37 -0
  354. mlflow/server/auth/entities.py +165 -0
  355. mlflow/server/auth/logo.py +14 -0
  356. mlflow/server/auth/permissions.py +65 -0
  357. mlflow/server/auth/routes.py +18 -0
  358. mlflow/server/auth/sqlalchemy_store.py +263 -0
  359. mlflow/server/graphql/__init__.py +0 -0
  360. mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
  361. mlflow/server/graphql/graphql_custom_scalars.py +24 -0
  362. mlflow/server/graphql/graphql_errors.py +15 -0
  363. mlflow/server/graphql/graphql_no_batching.py +89 -0
  364. mlflow/server/graphql/graphql_schema_extensions.py +74 -0
  365. mlflow/server/handlers.py +3217 -0
  366. mlflow/server/prometheus_exporter.py +17 -0
  367. mlflow/server/validation.py +30 -0
  368. mlflow/shap/__init__.py +691 -0
  369. mlflow/sklearn/__init__.py +1994 -0
  370. mlflow/sklearn/utils.py +1041 -0
  371. mlflow/smolagents/__init__.py +66 -0
  372. mlflow/smolagents/autolog.py +139 -0
  373. mlflow/smolagents/chat.py +29 -0
  374. mlflow/store/__init__.py +10 -0
  375. mlflow/store/_unity_catalog/__init__.py +1 -0
  376. mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
  377. mlflow/store/_unity_catalog/lineage/constants.py +2 -0
  378. mlflow/store/_unity_catalog/registry/__init__.py +6 -0
  379. mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
  380. mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
  381. mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
  382. mlflow/store/_unity_catalog/registry/utils.py +121 -0
  383. mlflow/store/artifact/__init__.py +0 -0
  384. mlflow/store/artifact/artifact_repo.py +472 -0
  385. mlflow/store/artifact/artifact_repository_registry.py +154 -0
  386. mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
  387. mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
  388. mlflow/store/artifact/cli.py +141 -0
  389. mlflow/store/artifact/cloud_artifact_repo.py +332 -0
  390. mlflow/store/artifact/databricks_artifact_repo.py +729 -0
  391. mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
  392. mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
  393. mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
  394. mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
  395. mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
  396. mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
  397. mlflow/store/artifact/ftp_artifact_repo.py +132 -0
  398. mlflow/store/artifact/gcs_artifact_repo.py +296 -0
  399. mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
  400. mlflow/store/artifact/http_artifact_repo.py +218 -0
  401. mlflow/store/artifact/local_artifact_repo.py +142 -0
  402. mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
  403. mlflow/store/artifact/models_artifact_repo.py +259 -0
  404. mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
  405. mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
  406. mlflow/store/artifact/r2_artifact_repo.py +70 -0
  407. mlflow/store/artifact/runs_artifact_repo.py +265 -0
  408. mlflow/store/artifact/s3_artifact_repo.py +330 -0
  409. mlflow/store/artifact/sftp_artifact_repo.py +141 -0
  410. mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
  411. mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
  412. mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
  413. mlflow/store/artifact/utils/__init__.py +0 -0
  414. mlflow/store/artifact/utils/models.py +148 -0
  415. mlflow/store/db/__init__.py +0 -0
  416. mlflow/store/db/base_sql_model.py +3 -0
  417. mlflow/store/db/db_types.py +10 -0
  418. mlflow/store/db/utils.py +314 -0
  419. mlflow/store/db_migrations/__init__.py +0 -0
  420. mlflow/store/db_migrations/alembic.ini +74 -0
  421. mlflow/store/db_migrations/env.py +84 -0
  422. mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
  423. mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
  424. mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
  425. mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
  426. mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
  427. mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
  428. mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
  429. mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
  430. mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
  431. mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
  432. mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
  433. mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
  434. mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
  435. mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
  436. mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
  437. mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
  438. mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
  439. mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
  440. mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
  441. mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
  442. mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
  443. mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
  444. mlflow/store/db_migrations/versions/__init__.py +0 -0
  445. mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
  446. mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
  447. mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
  448. mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
  449. mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
  450. mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
  451. mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
  452. mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
  453. mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
  454. mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
  455. mlflow/store/entities/__init__.py +3 -0
  456. mlflow/store/entities/paged_list.py +18 -0
  457. mlflow/store/model_registry/__init__.py +10 -0
  458. mlflow/store/model_registry/abstract_store.py +1081 -0
  459. mlflow/store/model_registry/base_rest_store.py +44 -0
  460. mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
  461. mlflow/store/model_registry/dbmodels/__init__.py +0 -0
  462. mlflow/store/model_registry/dbmodels/models.py +206 -0
  463. mlflow/store/model_registry/file_store.py +1091 -0
  464. mlflow/store/model_registry/rest_store.py +481 -0
  465. mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
  466. mlflow/store/tracking/__init__.py +23 -0
  467. mlflow/store/tracking/abstract_store.py +816 -0
  468. mlflow/store/tracking/dbmodels/__init__.py +0 -0
  469. mlflow/store/tracking/dbmodels/initial_models.py +243 -0
  470. mlflow/store/tracking/dbmodels/models.py +1073 -0
  471. mlflow/store/tracking/file_store.py +2438 -0
  472. mlflow/store/tracking/postgres_managed_identity.py +146 -0
  473. mlflow/store/tracking/rest_store.py +1131 -0
  474. mlflow/store/tracking/sqlalchemy_store.py +2785 -0
  475. mlflow/system_metrics/__init__.py +61 -0
  476. mlflow/system_metrics/metrics/__init__.py +0 -0
  477. mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
  478. mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
  479. mlflow/system_metrics/metrics/disk_monitor.py +21 -0
  480. mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
  481. mlflow/system_metrics/metrics/network_monitor.py +34 -0
  482. mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
  483. mlflow/system_metrics/system_metrics_monitor.py +198 -0
  484. mlflow/tracing/__init__.py +16 -0
  485. mlflow/tracing/assessment.py +356 -0
  486. mlflow/tracing/client.py +531 -0
  487. mlflow/tracing/config.py +125 -0
  488. mlflow/tracing/constant.py +105 -0
  489. mlflow/tracing/destination.py +81 -0
  490. mlflow/tracing/display/__init__.py +40 -0
  491. mlflow/tracing/display/display_handler.py +196 -0
  492. mlflow/tracing/export/async_export_queue.py +186 -0
  493. mlflow/tracing/export/inference_table.py +138 -0
  494. mlflow/tracing/export/mlflow_v3.py +137 -0
  495. mlflow/tracing/export/utils.py +70 -0
  496. mlflow/tracing/fluent.py +1417 -0
  497. mlflow/tracing/processor/base_mlflow.py +199 -0
  498. mlflow/tracing/processor/inference_table.py +175 -0
  499. mlflow/tracing/processor/mlflow_v3.py +47 -0
  500. mlflow/tracing/processor/otel.py +73 -0
  501. mlflow/tracing/provider.py +487 -0
  502. mlflow/tracing/trace_manager.py +200 -0
  503. mlflow/tracing/utils/__init__.py +616 -0
  504. mlflow/tracing/utils/artifact_utils.py +28 -0
  505. mlflow/tracing/utils/copy.py +55 -0
  506. mlflow/tracing/utils/environment.py +55 -0
  507. mlflow/tracing/utils/exception.py +21 -0
  508. mlflow/tracing/utils/once.py +35 -0
  509. mlflow/tracing/utils/otlp.py +63 -0
  510. mlflow/tracing/utils/processor.py +54 -0
  511. mlflow/tracing/utils/search.py +292 -0
  512. mlflow/tracing/utils/timeout.py +250 -0
  513. mlflow/tracing/utils/token.py +19 -0
  514. mlflow/tracing/utils/truncation.py +124 -0
  515. mlflow/tracing/utils/warning.py +76 -0
  516. mlflow/tracking/__init__.py +39 -0
  517. mlflow/tracking/_model_registry/__init__.py +1 -0
  518. mlflow/tracking/_model_registry/client.py +764 -0
  519. mlflow/tracking/_model_registry/fluent.py +853 -0
  520. mlflow/tracking/_model_registry/registry.py +67 -0
  521. mlflow/tracking/_model_registry/utils.py +251 -0
  522. mlflow/tracking/_tracking_service/__init__.py +0 -0
  523. mlflow/tracking/_tracking_service/client.py +883 -0
  524. mlflow/tracking/_tracking_service/registry.py +56 -0
  525. mlflow/tracking/_tracking_service/utils.py +275 -0
  526. mlflow/tracking/artifact_utils.py +179 -0
  527. mlflow/tracking/client.py +5900 -0
  528. mlflow/tracking/context/__init__.py +0 -0
  529. mlflow/tracking/context/abstract_context.py +35 -0
  530. mlflow/tracking/context/databricks_cluster_context.py +15 -0
  531. mlflow/tracking/context/databricks_command_context.py +15 -0
  532. mlflow/tracking/context/databricks_job_context.py +49 -0
  533. mlflow/tracking/context/databricks_notebook_context.py +41 -0
  534. mlflow/tracking/context/databricks_repo_context.py +43 -0
  535. mlflow/tracking/context/default_context.py +51 -0
  536. mlflow/tracking/context/git_context.py +32 -0
  537. mlflow/tracking/context/registry.py +98 -0
  538. mlflow/tracking/context/system_environment_context.py +15 -0
  539. mlflow/tracking/default_experiment/__init__.py +1 -0
  540. mlflow/tracking/default_experiment/abstract_context.py +43 -0
  541. mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
  542. mlflow/tracking/default_experiment/registry.py +75 -0
  543. mlflow/tracking/fluent.py +3595 -0
  544. mlflow/tracking/metric_value_conversion_utils.py +93 -0
  545. mlflow/tracking/multimedia.py +206 -0
  546. mlflow/tracking/registry.py +86 -0
  547. mlflow/tracking/request_auth/__init__.py +0 -0
  548. mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
  549. mlflow/tracking/request_auth/registry.py +60 -0
  550. mlflow/tracking/request_header/__init__.py +0 -0
  551. mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
  552. mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
  553. mlflow/tracking/request_header/default_request_header_provider.py +17 -0
  554. mlflow/tracking/request_header/registry.py +79 -0
  555. mlflow/transformers/__init__.py +2982 -0
  556. mlflow/transformers/flavor_config.py +258 -0
  557. mlflow/transformers/hub_utils.py +83 -0
  558. mlflow/transformers/llm_inference_utils.py +468 -0
  559. mlflow/transformers/model_io.py +301 -0
  560. mlflow/transformers/peft.py +51 -0
  561. mlflow/transformers/signature.py +183 -0
  562. mlflow/transformers/torch_utils.py +55 -0
  563. mlflow/types/__init__.py +21 -0
  564. mlflow/types/agent.py +270 -0
  565. mlflow/types/chat.py +240 -0
  566. mlflow/types/llm.py +935 -0
  567. mlflow/types/responses.py +139 -0
  568. mlflow/types/responses_helpers.py +416 -0
  569. mlflow/types/schema.py +1505 -0
  570. mlflow/types/type_hints.py +647 -0
  571. mlflow/types/utils.py +753 -0
  572. mlflow/utils/__init__.py +283 -0
  573. mlflow/utils/_capture_modules.py +256 -0
  574. mlflow/utils/_capture_transformers_modules.py +75 -0
  575. mlflow/utils/_spark_utils.py +201 -0
  576. mlflow/utils/_unity_catalog_oss_utils.py +97 -0
  577. mlflow/utils/_unity_catalog_utils.py +479 -0
  578. mlflow/utils/annotations.py +218 -0
  579. mlflow/utils/arguments_utils.py +16 -0
  580. mlflow/utils/async_logging/__init__.py +1 -0
  581. mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
  582. mlflow/utils/async_logging/async_logging_queue.py +366 -0
  583. mlflow/utils/async_logging/run_artifact.py +38 -0
  584. mlflow/utils/async_logging/run_batch.py +58 -0
  585. mlflow/utils/async_logging/run_operations.py +49 -0
  586. mlflow/utils/autologging_utils/__init__.py +737 -0
  587. mlflow/utils/autologging_utils/client.py +432 -0
  588. mlflow/utils/autologging_utils/config.py +33 -0
  589. mlflow/utils/autologging_utils/events.py +294 -0
  590. mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
  591. mlflow/utils/autologging_utils/metrics_queue.py +71 -0
  592. mlflow/utils/autologging_utils/safety.py +1104 -0
  593. mlflow/utils/autologging_utils/versioning.py +95 -0
  594. mlflow/utils/checkpoint_utils.py +206 -0
  595. mlflow/utils/class_utils.py +6 -0
  596. mlflow/utils/cli_args.py +257 -0
  597. mlflow/utils/conda.py +354 -0
  598. mlflow/utils/credentials.py +231 -0
  599. mlflow/utils/data_utils.py +17 -0
  600. mlflow/utils/databricks_utils.py +1436 -0
  601. mlflow/utils/docstring_utils.py +477 -0
  602. mlflow/utils/doctor.py +133 -0
  603. mlflow/utils/download_cloud_file_chunk.py +43 -0
  604. mlflow/utils/env_manager.py +16 -0
  605. mlflow/utils/env_pack.py +131 -0
  606. mlflow/utils/environment.py +1009 -0
  607. mlflow/utils/exception_utils.py +14 -0
  608. mlflow/utils/file_utils.py +978 -0
  609. mlflow/utils/git_utils.py +77 -0
  610. mlflow/utils/gorilla.py +797 -0
  611. mlflow/utils/import_hooks/__init__.py +363 -0
  612. mlflow/utils/lazy_load.py +51 -0
  613. mlflow/utils/logging_utils.py +168 -0
  614. mlflow/utils/mime_type_utils.py +58 -0
  615. mlflow/utils/mlflow_tags.py +103 -0
  616. mlflow/utils/model_utils.py +486 -0
  617. mlflow/utils/name_utils.py +346 -0
  618. mlflow/utils/nfs_on_spark.py +62 -0
  619. mlflow/utils/openai_utils.py +164 -0
  620. mlflow/utils/os.py +12 -0
  621. mlflow/utils/oss_registry_utils.py +29 -0
  622. mlflow/utils/plugins.py +17 -0
  623. mlflow/utils/process.py +182 -0
  624. mlflow/utils/promptlab_utils.py +146 -0
  625. mlflow/utils/proto_json_utils.py +743 -0
  626. mlflow/utils/pydantic_utils.py +54 -0
  627. mlflow/utils/request_utils.py +279 -0
  628. mlflow/utils/requirements_utils.py +704 -0
  629. mlflow/utils/rest_utils.py +673 -0
  630. mlflow/utils/search_logged_model_utils.py +127 -0
  631. mlflow/utils/search_utils.py +2111 -0
  632. mlflow/utils/secure_loading.py +221 -0
  633. mlflow/utils/security_validation.py +384 -0
  634. mlflow/utils/server_cli_utils.py +61 -0
  635. mlflow/utils/spark_utils.py +15 -0
  636. mlflow/utils/string_utils.py +138 -0
  637. mlflow/utils/thread_utils.py +63 -0
  638. mlflow/utils/time.py +54 -0
  639. mlflow/utils/timeout.py +42 -0
  640. mlflow/utils/uri.py +572 -0
  641. mlflow/utils/validation.py +662 -0
  642. mlflow/utils/virtualenv.py +458 -0
  643. mlflow/utils/warnings_utils.py +25 -0
  644. mlflow/utils/yaml_utils.py +179 -0
  645. mlflow/version.py +24 -0
@@ -0,0 +1,472 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ import posixpath
5
+ import tempfile
6
+ import traceback
7
+ from abc import ABC, ABCMeta, abstractmethod
8
+ from concurrent.futures import ThreadPoolExecutor, as_completed
9
+ from contextlib import contextmanager
10
+ from pathlib import Path
11
+ from typing import Any, Optional
12
+
13
+ from mlflow.entities.file_info import FileInfo
14
+ from mlflow.entities.multipart_upload import (
15
+ CreateMultipartUploadResponse,
16
+ MultipartUploadPart,
17
+ )
18
+ from mlflow.exceptions import (
19
+ MlflowException,
20
+ MlflowTraceDataCorrupted,
21
+ MlflowTraceDataNotFound,
22
+ )
23
+ from mlflow.protos.databricks_pb2 import (
24
+ INVALID_PARAMETER_VALUE,
25
+ RESOURCE_DOES_NOT_EXIST,
26
+ )
27
+ from mlflow.tracing.utils.artifact_utils import TRACE_DATA_FILE_NAME
28
+ from mlflow.utils.annotations import developer_stable
29
+ from mlflow.utils.async_logging.async_artifacts_logging_queue import (
30
+ AsyncArtifactsLoggingQueue,
31
+ )
32
+ from mlflow.utils.file_utils import ArtifactProgressBar, create_tmp_dir
33
+ from mlflow.utils.validation import bad_path_message, path_not_unique
34
+
35
+ # Constants used to determine max level of parallelism to use while uploading/downloading artifacts.
36
+ # Max threads to use for parallelism.
37
+ _NUM_MAX_THREADS = 20
38
+ # Max threads per CPU
39
+ _NUM_MAX_THREADS_PER_CPU = 2
40
+ assert _NUM_MAX_THREADS >= _NUM_MAX_THREADS_PER_CPU
41
+ assert _NUM_MAX_THREADS_PER_CPU > 0
42
+ # Default number of CPUs to assume on the machine if unavailable to fetch it using os.cpu_count()
43
+ _NUM_DEFAULT_CPUS = _NUM_MAX_THREADS // _NUM_MAX_THREADS_PER_CPU
44
+ _logger = logging.getLogger(__name__)
45
+
46
+
47
+ def _truncate_error(err: str, max_length: int = 10_000) -> str:
48
+ if len(err) <= max_length:
49
+ return err
50
+ half = max_length // 2
51
+ return err[:half] + "\n\n*** Error message is too long, truncated ***\n\n" + err[-half:]
52
+
53
+
54
+ def _retry_with_new_creds(try_func, creds_func, orig_creds=None):
55
+ """
56
+ Attempt the try_func with the original credentials (og_creds) if provided, or by generating the
57
+ credentials using creds_func. If the try_func throws, then try again with new credentials
58
+ provided by creds_func.
59
+ """
60
+ try:
61
+ first_creds = creds_func() if orig_creds is None else orig_creds
62
+ return try_func(first_creds)
63
+ except Exception as e:
64
+ _logger.info(
65
+ f"Failed to complete request, possibly due to credential expiration (Error: {e})."
66
+ " Refreshing credentials and trying again..."
67
+ )
68
+ new_creds = creds_func()
69
+ return try_func(new_creds)
70
+
71
+
72
+ @developer_stable
73
+ class ArtifactRepository:
74
+ """
75
+ Abstract artifact repo that defines how to upload (log) and download potentially large
76
+ artifacts from different storage backends.
77
+ """
78
+
79
+ __metaclass__ = ABCMeta
80
+
81
+ def __init__(self, artifact_uri: str, tracking_uri: Optional[str] = None) -> None:
82
+ self.artifact_uri = artifact_uri
83
+ self.tracking_uri = tracking_uri
84
+ # Limit the number of threads used for artifact uploads/downloads. Use at most
85
+ # constants._NUM_MAX_THREADS threads or 2 * the number of CPU cores available on the
86
+ # system (whichever is smaller)
87
+ self.thread_pool = self._create_thread_pool()
88
+
89
+ def log_artifact_handler(filename, artifact_path=None, artifact=None):
90
+ with tempfile.TemporaryDirectory() as tmp_dir:
91
+ tmp_path = os.path.join(tmp_dir, filename)
92
+ if artifact is not None:
93
+ # User should already have installed PIL to log a PIL image
94
+ from PIL import Image
95
+
96
+ if isinstance(artifact, Image.Image):
97
+ artifact.save(tmp_path)
98
+ self.log_artifact(tmp_path, artifact_path)
99
+
100
+ self._async_logging_queue = AsyncArtifactsLoggingQueue(log_artifact_handler)
101
+
102
+ def __repr__(self) -> str:
103
+ return (
104
+ f"{self.__class__.__name__}("
105
+ f"artifact_uri={self.artifact_uri!r}, "
106
+ f"tracking_uri={self.tracking_uri!r}"
107
+ f")"
108
+ )
109
+
110
+ def _create_thread_pool(self):
111
+ return ThreadPoolExecutor(
112
+ max_workers=self.max_workers, thread_name_prefix=f"Mlflow{self.__class__.__name__}"
113
+ )
114
+
115
+ def flush_async_logging(self):
116
+ """
117
+ Flushes the async logging queue, ensuring that all pending logging operations have
118
+ completed.
119
+ """
120
+ if self._async_logging_queue._is_activated:
121
+ self._async_logging_queue.flush()
122
+
123
+ @abstractmethod
124
+ def log_artifact(self, local_file, artifact_path=None):
125
+ """
126
+ Log a local file as an artifact, optionally taking an ``artifact_path`` to place it in
127
+ within the run's artifacts. Run artifacts can be organized into directories, so you can
128
+ place the artifact in a directory this way.
129
+
130
+ Args:
131
+ local_file: Path to artifact to log.
132
+ artifact_path: Directory within the run's artifact directory in which to log the
133
+ artifact.
134
+ """
135
+
136
+ def _log_artifact_async(self, filename, artifact_path=None, artifact=None):
137
+ """
138
+ Asynchronously log a local file as an artifact, optionally taking an ``artifact_path`` to
139
+ place it within the run's artifacts. Run artifacts can be organized into directory, so you
140
+ can place the artifact in the directory this way. Cleanup tells the function whether to
141
+ cleanup the local_file after running log_artifact, since it could be a Temporary
142
+ Directory.
143
+
144
+ Args:
145
+ filename: Filename of the artifact to be logged.
146
+ artifact_path: Directory within the run's artifact directory in which to log the
147
+ artifact.
148
+ artifact: The artifact to be logged.
149
+
150
+ Returns:
151
+ An :py:class:`mlflow.utils.async_logging.run_operations.RunOperations` instance
152
+ that represents future for logging operation.
153
+ """
154
+
155
+ if not self._async_logging_queue.is_active():
156
+ self._async_logging_queue.activate()
157
+
158
+ return self._async_logging_queue.log_artifacts_async(
159
+ filename=filename, artifact_path=artifact_path, artifact=artifact
160
+ )
161
+
162
+ @abstractmethod
163
+ def log_artifacts(self, local_dir, artifact_path=None):
164
+ """
165
+ Log the files in the specified local directory as artifacts, optionally taking
166
+ an ``artifact_path`` to place them in within the run's artifacts.
167
+
168
+ Args:
169
+ local_dir: Directory of local artifacts to log.
170
+ artifact_path: Directory within the run's artifact directory in which to log the
171
+ artifacts.
172
+ """
173
+
174
+ @abstractmethod
175
+ def list_artifacts(self, path: Optional[str] = None) -> list[FileInfo]:
176
+ """
177
+ Return all the artifacts for this run_id directly under path. If path is a file, returns
178
+ an empty list. Will error if path is neither a file nor directory.
179
+
180
+ Args:
181
+ path: Relative source path that contains desired artifacts.
182
+
183
+ Returns:
184
+ List of artifacts as FileInfo listed directly under path.
185
+ """
186
+
187
+ def _is_directory(self, artifact_path):
188
+ listing = self.list_artifacts(artifact_path)
189
+ return len(listing) > 0
190
+
191
+ def _create_download_destination(self, src_artifact_path, dst_local_dir_path=None):
192
+ """
193
+ Creates a local filesystem location to be used as a destination for downloading the artifact
194
+ specified by `src_artifact_path`. The destination location is a subdirectory of the
195
+ specified `dst_local_dir_path`, which is determined according to the structure of
196
+ `src_artifact_path`. For example, if `src_artifact_path` is `dir1/file1.txt`, then the
197
+ resulting destination path is `<dst_local_dir_path>/dir1/file1.txt`. Local directories are
198
+ created for the resulting destination location if they do not exist.
199
+
200
+ Args:
201
+ src_artifact_path: A relative, POSIX-style path referring to an artifact stored
202
+ within the repository's artifact root location. `src_artifact_path` should be
203
+ specified relative to the repository's artifact root location.
204
+ dst_local_dir_path: The absolute path to a local filesystem directory in which the
205
+ local destination path will be contained. The local destination path may be
206
+ contained in a subdirectory of `dst_root_dir` if `src_artifact_path` contains
207
+ subdirectories.
208
+
209
+ Returns:
210
+ The absolute path to a local filesystem location to be used as a destination
211
+ for downloading the artifact specified by `src_artifact_path`.
212
+ """
213
+ src_artifact_path = src_artifact_path.rstrip("/") # Ensure correct dirname for trailing '/'
214
+ dirpath = posixpath.dirname(src_artifact_path)
215
+ local_dir_path = os.path.join(dst_local_dir_path, dirpath)
216
+ local_file_path = os.path.join(dst_local_dir_path, src_artifact_path)
217
+ if not os.path.exists(local_dir_path):
218
+ os.makedirs(local_dir_path, exist_ok=True)
219
+ return local_file_path
220
+
221
+ def _iter_artifacts_recursive(self, path):
222
+ dir_content = [
223
+ file_info
224
+ for file_info in self.list_artifacts(path)
225
+ # prevent infinite loop, sometimes the dir is recursively included
226
+ if file_info.path not in [".", path]
227
+ ]
228
+ # Empty directory
229
+ if not dir_content:
230
+ yield FileInfo(path=path, is_dir=True, file_size=None)
231
+ return
232
+
233
+ for file_info in dir_content:
234
+ if file_info.is_dir:
235
+ yield from self._iter_artifacts_recursive(file_info.path)
236
+ else:
237
+ yield file_info
238
+
239
+ def download_artifacts(self, artifact_path, dst_path=None):
240
+ """
241
+ Download an artifact file or directory to a local directory if applicable, and return a
242
+ local path for it.
243
+ The caller is responsible for managing the lifecycle of the downloaded artifacts.
244
+
245
+ Args:
246
+ artifact_path: Relative source path to the desired artifacts.
247
+ dst_path: Absolute path of the local filesystem destination directory to which to
248
+ download the specified artifacts. This directory must already exist.
249
+ If unspecified, the artifacts will either be downloaded to a new
250
+ uniquely-named directory on the local filesystem or will be returned
251
+ directly in the case of the LocalArtifactRepository.
252
+
253
+ Returns:
254
+ Absolute path of the local filesystem location containing the desired artifacts.
255
+ """
256
+ if dst_path:
257
+ dst_path = os.path.abspath(dst_path)
258
+ if not os.path.exists(dst_path):
259
+ raise MlflowException(
260
+ message=(
261
+ "The destination path for downloaded artifacts does not"
262
+ f" exist! Destination path: {dst_path}"
263
+ ),
264
+ error_code=RESOURCE_DOES_NOT_EXIST,
265
+ )
266
+ elif not os.path.isdir(dst_path):
267
+ raise MlflowException(
268
+ message=(
269
+ "The destination path for downloaded artifacts must be a directory!"
270
+ f" Destination path: {dst_path}"
271
+ ),
272
+ error_code=INVALID_PARAMETER_VALUE,
273
+ )
274
+ else:
275
+ dst_path = create_tmp_dir()
276
+
277
+ def _download_file(src_artifact_path, dst_local_dir_path):
278
+ dst_local_file_path = self._create_download_destination(
279
+ src_artifact_path=src_artifact_path, dst_local_dir_path=dst_local_dir_path
280
+ )
281
+ return self.thread_pool.submit(
282
+ self._download_file,
283
+ remote_file_path=src_artifact_path,
284
+ local_path=dst_local_file_path,
285
+ )
286
+
287
+ # Submit download tasks
288
+ futures = {}
289
+ if self._is_directory(artifact_path):
290
+ for file_info in self._iter_artifacts_recursive(artifact_path):
291
+ if file_info.is_dir: # Empty directory
292
+ os.makedirs(os.path.join(dst_path, file_info.path), exist_ok=True)
293
+ else:
294
+ fut = _download_file(file_info.path, dst_path)
295
+ futures[fut] = file_info.path
296
+ else:
297
+ fut = _download_file(artifact_path, dst_path)
298
+ futures[fut] = artifact_path
299
+
300
+ # Wait for downloads to complete and collect failures
301
+ failed_downloads = {}
302
+ tracebacks = {}
303
+ with ArtifactProgressBar.files(desc="Downloading artifacts", total=len(futures)) as pbar:
304
+ for f in as_completed(futures):
305
+ try:
306
+ f.result()
307
+ pbar.update()
308
+ except Exception as e:
309
+ path = futures[f]
310
+ failed_downloads[path] = e
311
+ tracebacks[path] = traceback.format_exc()
312
+
313
+ if failed_downloads:
314
+ if _logger.isEnabledFor(logging.DEBUG):
315
+ template = "##### File {path} #####\n{error}\nTraceback:\n{traceback}\n"
316
+ else:
317
+ template = "##### File {path} #####\n{error}"
318
+
319
+ failures = "\n".join(
320
+ template.format(path=path, error=error, traceback=tracebacks[path])
321
+ for path, error in failed_downloads.items()
322
+ )
323
+ raise MlflowException(
324
+ message=(
325
+ "The following failures occurred while downloading one or more"
326
+ f" artifacts from {self.artifact_uri}:\n{_truncate_error(failures)}"
327
+ )
328
+ )
329
+
330
+ return os.path.join(dst_path, artifact_path)
331
+
332
+ @abstractmethod
333
+ def _download_file(self, remote_file_path, local_path):
334
+ """
335
+ Download the file at the specified relative remote path and saves
336
+ it at the specified local path.
337
+
338
+ Args:
339
+ remote_file_path: Source path to the remote file, relative to the root
340
+ directory of the artifact repository.
341
+ local_path: The path to which to save the downloaded file.
342
+ """
343
+
344
+ def delete_artifacts(self, artifact_path=None):
345
+ """
346
+ Delete the artifacts at the specified location.
347
+ Supports the deletion of a single file or of a directory. Deletion of a directory
348
+ is recursive.
349
+
350
+ Args:
351
+ artifact_path: Path of the artifact to delete.
352
+ """
353
+
354
+ @property
355
+ def max_workers(self) -> int:
356
+ """Compute the number of workers to use for multi-threading."""
357
+ num_cpus = os.cpu_count() or _NUM_DEFAULT_CPUS
358
+ return min(num_cpus * _NUM_MAX_THREADS_PER_CPU, _NUM_MAX_THREADS)
359
+
360
+ def download_trace_data(self) -> dict[str, Any]:
361
+ """
362
+ Download the trace data.
363
+
364
+ Returns:
365
+ The trace data as a dictionary.
366
+
367
+ Raises:
368
+ - `MlflowTraceDataNotFound`: The trace data is not found.
369
+ - `MlflowTraceDataCorrupted`: The trace data is corrupted.
370
+ """
371
+ with tempfile.TemporaryDirectory() as temp_dir:
372
+ temp_file = Path(temp_dir, TRACE_DATA_FILE_NAME)
373
+ try:
374
+ self._download_file(TRACE_DATA_FILE_NAME, temp_file)
375
+ except Exception as e:
376
+ # `MlflowTraceDataNotFound` is caught in `TrackingServiceClient.search_traces` and
377
+ # is used to filter out traces with failed trace data download.
378
+ raise MlflowTraceDataNotFound(artifact_path=TRACE_DATA_FILE_NAME) from e
379
+ return try_read_trace_data(temp_file)
380
+
381
+ def upload_trace_data(self, trace_data: str) -> None:
382
+ """
383
+ Upload the trace data.
384
+
385
+ Args:
386
+ trace_data: The json-serialized trace data to upload.
387
+ """
388
+ with write_local_temp_trace_data_file(trace_data) as temp_file:
389
+ self.log_artifact(temp_file)
390
+
391
+
392
+ @contextmanager
393
+ def write_local_temp_trace_data_file(trace_data: str):
394
+ with tempfile.TemporaryDirectory() as temp_dir:
395
+ temp_file = Path(temp_dir, TRACE_DATA_FILE_NAME)
396
+ temp_file.write_text(trace_data, encoding="utf-8")
397
+ yield temp_file
398
+
399
+
400
+ def try_read_trace_data(trace_data_path):
401
+ if not os.path.exists(trace_data_path):
402
+ raise MlflowTraceDataNotFound(artifact_path=trace_data_path)
403
+ with open(trace_data_path, encoding="utf-8") as f:
404
+ data = f.read()
405
+ if not data:
406
+ raise MlflowTraceDataNotFound(artifact_path=trace_data_path)
407
+ try:
408
+ return json.loads(data)
409
+ except json.decoder.JSONDecodeError as e:
410
+ raise MlflowTraceDataCorrupted(artifact_path=trace_data_path) from e
411
+
412
+
413
+ class MultipartUploadMixin(ABC):
414
+ @abstractmethod
415
+ def create_multipart_upload(
416
+ self, local_file: str, num_parts: int, artifact_path: Optional[str] = None
417
+ ) -> CreateMultipartUploadResponse:
418
+ """
419
+ Initiate a multipart upload and retrieve the pre-signed upload URLS and upload id.
420
+
421
+ Args:
422
+ local_file: Path of artifact to upload.
423
+ num_parts: Number of parts to upload. Only required by S3 and GCS.
424
+ artifact_path: Directory within the run's artifact directory in which to upload the
425
+ artifact.
426
+
427
+ """
428
+
429
+ @abstractmethod
430
+ def complete_multipart_upload(
431
+ self,
432
+ local_file: str,
433
+ upload_id: str,
434
+ parts: list[MultipartUploadPart],
435
+ artifact_path: Optional[str] = None,
436
+ ) -> None:
437
+ """
438
+ Complete a multipart upload.
439
+
440
+ Args:
441
+ local_file: Path of artifact to upload.
442
+ upload_id: The upload ID. Only required by S3 and GCS.
443
+ parts: A list containing the metadata of each part that has been uploaded.
444
+ artifact_path: Directory within the run's artifact directory in which to upload the
445
+ artifact.
446
+
447
+ """
448
+
449
+ @abstractmethod
450
+ def abort_multipart_upload(
451
+ self,
452
+ local_file: str,
453
+ upload_id: str,
454
+ artifact_path: Optional[str] = None,
455
+ ) -> None:
456
+ """
457
+ Abort a multipart upload.
458
+
459
+ Args:
460
+ local_file: Path of artifact to upload.
461
+ upload_id: The upload ID. Only required by S3 and GCS.
462
+ artifact_path: Directory within the run's artifact directory in which to upload the
463
+ artifact.
464
+
465
+ """
466
+
467
+
468
+ def verify_artifact_path(artifact_path):
469
+ if artifact_path and path_not_unique(artifact_path):
470
+ raise MlflowException(
471
+ f"Invalid artifact path: '{artifact_path}'. {bad_path_message(artifact_path)}"
472
+ )
@@ -0,0 +1,154 @@
1
+ import warnings
2
+ from typing import Optional
3
+
4
+ from mlflow.exceptions import MlflowException
5
+ from mlflow.store.artifact.artifact_repo import ArtifactRepository
6
+ from mlflow.store.artifact.azure_blob_artifact_repo import AzureBlobArtifactRepository
7
+ from mlflow.store.artifact.azure_data_lake_artifact_repo import AzureDataLakeArtifactRepository
8
+ from mlflow.store.artifact.dbfs_artifact_repo import dbfs_artifact_repo_factory
9
+ from mlflow.store.artifact.ftp_artifact_repo import FTPArtifactRepository
10
+ from mlflow.store.artifact.gcs_artifact_repo import GCSArtifactRepository
11
+ from mlflow.store.artifact.hdfs_artifact_repo import HdfsArtifactRepository
12
+ from mlflow.store.artifact.http_artifact_repo import HttpArtifactRepository
13
+ from mlflow.store.artifact.local_artifact_repo import LocalArtifactRepository
14
+ from mlflow.store.artifact.mlflow_artifacts_repo import MlflowArtifactsRepository
15
+ from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository
16
+ from mlflow.store.artifact.r2_artifact_repo import R2ArtifactRepository
17
+ from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
18
+ from mlflow.store.artifact.s3_artifact_repo import S3ArtifactRepository
19
+ from mlflow.store.artifact.sftp_artifact_repo import SFTPArtifactRepository
20
+ from mlflow.store.artifact.uc_volume_artifact_repo import uc_volume_artifact_repo_factory
21
+ from mlflow.utils.plugins import get_entry_points
22
+ from mlflow.utils.uri import get_uri_scheme, is_uc_volumes_uri
23
+
24
+
25
+ class ArtifactRepositoryRegistry:
26
+ """Scheme-based registry for artifact repository implementations
27
+
28
+ This class allows the registration of a function or class to provide an implementation for a
29
+ given scheme of `artifact_uri` through the `register` method. Implementations declared though
30
+ the entrypoints `mlflow.artifact_repository` group can be automatically registered through the
31
+ `register_entrypoints` method.
32
+
33
+ When instantiating an artifact repository through the `get_artifact_repository` method, the
34
+ scheme of the artifact URI provided will be used to select which implementation to instantiate,
35
+ which will be called with same arguments passed to the `get_artifact_repository` method.
36
+ """
37
+
38
+ def __init__(self):
39
+ self._registry = {}
40
+
41
+ def register(self, scheme, repository):
42
+ """Register artifact repositories provided by other packages"""
43
+ self._registry[scheme] = repository
44
+
45
+ def register_entrypoints(self):
46
+ # Register artifact repositories provided by other packages
47
+ for entrypoint in get_entry_points("mlflow.artifact_repository"):
48
+ try:
49
+ self.register(entrypoint.name, entrypoint.load())
50
+ except (AttributeError, ImportError) as exc:
51
+ warnings.warn(
52
+ 'Failure attempting to register artifact repository for scheme "{}": {}'.format(
53
+ entrypoint.name, str(exc)
54
+ ),
55
+ stacklevel=2,
56
+ )
57
+
58
+ def get_artifact_repository(
59
+ self, artifact_uri: str, tracking_uri: Optional[str] = None
60
+ ) -> ArtifactRepository:
61
+ """
62
+ Get an artifact repository from the registry based on the scheme of artifact_uri
63
+
64
+ Args:
65
+ artifact_uri: The artifact store URI. This URI is used to select which artifact
66
+ repository implementation to instantiate and is passed to the constructor of the
67
+ implementation.
68
+ tracking_uri: The tracking URI. This URI is passed to the constructor of the
69
+ implementation.
70
+
71
+ Returns:
72
+ An instance of `mlflow.store.ArtifactRepository` that fulfills the artifact URI
73
+ requirements.
74
+ """
75
+ scheme = get_uri_scheme(artifact_uri)
76
+ repository = self._registry.get(scheme)
77
+ if repository is None:
78
+ raise MlflowException(
79
+ f"Could not find a registered artifact repository for: {artifact_uri}. "
80
+ f"Currently registered schemes are: {list(self._registry.keys())}"
81
+ )
82
+ return repository(artifact_uri, tracking_uri)
83
+
84
+ def get_registered_artifact_repositories(self):
85
+ """
86
+ Get all registered artifact repositories.
87
+
88
+ Returns:
89
+ A dictionary mapping string artifact URI schemes to artifact repositories.
90
+ """
91
+ return self._registry
92
+
93
+
94
+ def _dbfs_artifact_repo_factory(
95
+ artifact_uri: str, tracking_uri: Optional[str] = None
96
+ ) -> ArtifactRepository:
97
+ return (
98
+ uc_volume_artifact_repo_factory(artifact_uri, tracking_uri)
99
+ if is_uc_volumes_uri(artifact_uri)
100
+ else dbfs_artifact_repo_factory(artifact_uri, tracking_uri)
101
+ )
102
+
103
+
104
+ _artifact_repository_registry = ArtifactRepositoryRegistry()
105
+
106
+ _artifact_repository_registry.register("", LocalArtifactRepository)
107
+ _artifact_repository_registry.register("file", LocalArtifactRepository)
108
+ _artifact_repository_registry.register("s3", S3ArtifactRepository)
109
+ _artifact_repository_registry.register("r2", R2ArtifactRepository)
110
+ _artifact_repository_registry.register("gs", GCSArtifactRepository)
111
+ _artifact_repository_registry.register("wasbs", AzureBlobArtifactRepository)
112
+ _artifact_repository_registry.register("ftp", FTPArtifactRepository)
113
+ _artifact_repository_registry.register("sftp", SFTPArtifactRepository)
114
+ _artifact_repository_registry.register("dbfs", _dbfs_artifact_repo_factory)
115
+ _artifact_repository_registry.register("hdfs", HdfsArtifactRepository)
116
+ _artifact_repository_registry.register("viewfs", HdfsArtifactRepository)
117
+ _artifact_repository_registry.register("runs", RunsArtifactRepository)
118
+ _artifact_repository_registry.register("models", ModelsArtifactRepository)
119
+ for scheme in ["http", "https"]:
120
+ _artifact_repository_registry.register(scheme, HttpArtifactRepository)
121
+ _artifact_repository_registry.register("mlflow-artifacts", MlflowArtifactsRepository)
122
+ _artifact_repository_registry.register("abfss", AzureDataLakeArtifactRepository)
123
+
124
+ _artifact_repository_registry.register_entrypoints()
125
+
126
+
127
+ def get_artifact_repository(
128
+ artifact_uri: str, tracking_uri: Optional[str] = None
129
+ ) -> ArtifactRepository:
130
+ """
131
+ Get an artifact repository from the registry based on the scheme of artifact_uri
132
+
133
+ Args:
134
+ artifact_uri: The artifact store URI. This URI is used to select which artifact
135
+ repository implementation to instantiate and is passed to the constructor of the
136
+ implementation.
137
+ tracking_uri: The tracking URI. This URI is passed to the constructor of the
138
+ implementation.
139
+
140
+ Returns:
141
+ An instance of `mlflow.store.ArtifactRepository` that fulfills the artifact URI
142
+ requirements.
143
+ """
144
+ return _artifact_repository_registry.get_artifact_repository(artifact_uri, tracking_uri)
145
+
146
+
147
+ def get_registered_artifact_repositories() -> dict[str, ArtifactRepository]:
148
+ """
149
+ Get all registered artifact repositories.
150
+
151
+ Returns:
152
+ A dictionary mapping string artifact URI schemes to artifact repositories.
153
+ """
154
+ return _artifact_repository_registry.get_registered_artifact_repositories()