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
mlflow/cli.py ADDED
@@ -0,0 +1,707 @@
1
+ import contextlib
2
+ import json
3
+ import logging
4
+ import os
5
+ import re
6
+ import sys
7
+ import warnings
8
+ from datetime import timedelta
9
+
10
+ import click
11
+ from click import UsageError
12
+
13
+ import mlflow.db
14
+ import mlflow.deployments.cli
15
+ import mlflow.experiments
16
+ import mlflow.runs
17
+ import mlflow.store.artifact.cli
18
+ from mlflow import projects, version
19
+ from mlflow.entities import ViewType
20
+ from mlflow.entities.lifecycle_stage import LifecycleStage
21
+ from mlflow.environment_variables import MLFLOW_EXPERIMENT_ID, MLFLOW_EXPERIMENT_NAME
22
+ from mlflow.exceptions import InvalidUrlException, MlflowException
23
+ from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
24
+ from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
25
+ from mlflow.store.tracking import DEFAULT_ARTIFACTS_URI, DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH
26
+ from mlflow.tracking import _get_store
27
+ from mlflow.tracking._tracking_service.utils import is_tracking_uri_set, set_tracking_uri
28
+ from mlflow.utils import cli_args
29
+ from mlflow.utils.logging_utils import eprint
30
+ from mlflow.utils.os import is_windows
31
+ from mlflow.utils.plugins import get_entry_points
32
+ from mlflow.utils.process import ShellCommandException
33
+ from mlflow.utils.server_cli_utils import (
34
+ artifacts_only_config_validation,
35
+ resolve_default_artifact_root,
36
+ )
37
+
38
+ _logger = logging.getLogger(__name__)
39
+
40
+
41
+ class AliasedGroup(click.Group):
42
+ def get_command(self, ctx, cmd_name):
43
+ # `mlflow ui` is an alias for `mlflow server`
44
+ cmd_name = "server" if cmd_name == "ui" else cmd_name
45
+ return super().get_command(ctx, cmd_name)
46
+
47
+
48
+ @click.group(cls=AliasedGroup)
49
+ @click.version_option(version=version.VERSION)
50
+ def cli():
51
+ pass
52
+
53
+
54
+ @cli.command()
55
+ @click.argument("uri")
56
+ @click.option(
57
+ "--entry-point",
58
+ "-e",
59
+ metavar="NAME",
60
+ default="main",
61
+ help="Entry point within project. [default: main]. If the entry point is not found, "
62
+ "attempts to run the project file with the specified name as a script, "
63
+ "using 'python' to run .py files and the default shell (specified by "
64
+ "environment variable $SHELL) to run .sh files",
65
+ )
66
+ @click.option(
67
+ "--version",
68
+ "-v",
69
+ metavar="VERSION",
70
+ help="Version of the project to run, as a Git commit reference for Git projects.",
71
+ )
72
+ @click.option(
73
+ "--param-list",
74
+ "-P",
75
+ metavar="NAME=VALUE",
76
+ multiple=True,
77
+ help="A parameter for the run, of the form -P name=value. Provided parameters that "
78
+ "are not in the list of parameters for an entry point will be passed to the "
79
+ "corresponding entry point as command-line arguments in the form `--name value`",
80
+ )
81
+ @click.option(
82
+ "--docker-args",
83
+ "-A",
84
+ metavar="NAME=VALUE",
85
+ multiple=True,
86
+ help="A `docker run` argument or flag, of the form -A name=value (e.g. -A gpus=all) "
87
+ "or -A name (e.g. -A t). The argument will then be passed as "
88
+ "`docker run --name value` or `docker run --name` respectively. ",
89
+ )
90
+ @click.option(
91
+ "--experiment-name",
92
+ envvar=MLFLOW_EXPERIMENT_NAME.name,
93
+ help="Name of the experiment under which to launch the run. If not "
94
+ "specified, 'experiment-id' option will be used to launch run.",
95
+ )
96
+ @click.option(
97
+ "--experiment-id",
98
+ envvar=MLFLOW_EXPERIMENT_ID.name,
99
+ type=click.STRING,
100
+ help="ID of the experiment under which to launch the run.",
101
+ )
102
+ # TODO: Add tracking server argument once we have it working.
103
+ @click.option(
104
+ "--backend",
105
+ "-b",
106
+ metavar="BACKEND",
107
+ default="local",
108
+ help="Execution backend to use for run. Supported values: 'local', 'databricks', "
109
+ "kubernetes (experimental). Defaults to 'local'. If running against "
110
+ "Databricks, will run against a Databricks workspace determined as follows: "
111
+ "if a Databricks tracking URI of the form 'databricks://profile' has been set "
112
+ "(e.g. by setting the MLFLOW_TRACKING_URI environment variable), will run "
113
+ "against the workspace specified by <profile>. Otherwise, runs against the "
114
+ "workspace specified by the default Databricks CLI profile. See "
115
+ "https://github.com/databricks/databricks-cli for more info on configuring a "
116
+ "Databricks CLI profile.",
117
+ )
118
+ @click.option(
119
+ "--backend-config",
120
+ "-c",
121
+ metavar="FILE",
122
+ help="Path to JSON file (must end in '.json') or JSON string which will be passed "
123
+ "as config to the backend. The exact content which should be "
124
+ "provided is different for each execution backend and is documented "
125
+ "at https://www.mlflow.org/docs/latest/projects.html.",
126
+ )
127
+ @cli_args.ENV_MANAGER_PROJECTS
128
+ @click.option(
129
+ "--storage-dir",
130
+ envvar="MLFLOW_TMP_DIR",
131
+ help="Only valid when ``backend`` is local. "
132
+ "MLflow downloads artifacts from distributed URIs passed to parameters of "
133
+ "type 'path' to subdirectories of storage_dir.",
134
+ )
135
+ @click.option(
136
+ "--run-id",
137
+ metavar="RUN_ID",
138
+ help="If specified, the given run ID will be used instead of creating a new run. "
139
+ "Note: this argument is used internally by the MLflow project APIs "
140
+ "and should not be specified.",
141
+ )
142
+ @click.option(
143
+ "--run-name",
144
+ metavar="RUN_NAME",
145
+ help="The name to give the MLflow Run associated with the project execution. If not specified, "
146
+ "the MLflow Run name is left unset.",
147
+ )
148
+ @click.option(
149
+ "--build-image",
150
+ is_flag=True,
151
+ default=False,
152
+ show_default=True,
153
+ help=(
154
+ "Only valid for Docker projects. If specified, build a new Docker image that's based on "
155
+ "the image specified by the `image` field in the MLproject file, and contains files in the "
156
+ "project directory."
157
+ ),
158
+ )
159
+ def run(
160
+ uri,
161
+ entry_point,
162
+ version,
163
+ param_list,
164
+ docker_args,
165
+ experiment_name,
166
+ experiment_id,
167
+ backend,
168
+ backend_config,
169
+ env_manager,
170
+ storage_dir,
171
+ run_id,
172
+ run_name,
173
+ build_image,
174
+ ):
175
+ """
176
+ Run an MLflow project from the given URI.
177
+
178
+ For local runs, the run will block until it completes.
179
+ Otherwise, the project will run asynchronously.
180
+
181
+ If running locally (the default), the URI can be either a Git repository URI or a local path.
182
+ If running on Databricks, the URI must be a Git repository.
183
+
184
+ By default, Git projects run in a new working directory with the given parameters, while
185
+ local projects run from the project's root directory.
186
+ """
187
+ if experiment_id is not None and experiment_name is not None:
188
+ raise click.UsageError("Specify only one of 'experiment-name' or 'experiment-id' options.")
189
+
190
+ param_dict = _user_args_to_dict(param_list)
191
+ args_dict = _user_args_to_dict(docker_args, argument_type="A")
192
+
193
+ if backend_config is not None and os.path.splitext(backend_config)[-1] != ".json":
194
+ try:
195
+ backend_config = json.loads(backend_config)
196
+ except ValueError as e:
197
+ raise click.UsageError(f"Invalid backend config JSON. Parse error: {e}") from e
198
+ if backend == "kubernetes":
199
+ if backend_config is None:
200
+ raise click.UsageError("Specify 'backend_config' when using kubernetes mode.")
201
+ try:
202
+ projects.run(
203
+ uri,
204
+ entry_point,
205
+ version,
206
+ experiment_name=experiment_name,
207
+ experiment_id=experiment_id,
208
+ parameters=param_dict,
209
+ docker_args=args_dict,
210
+ backend=backend,
211
+ backend_config=backend_config,
212
+ env_manager=env_manager,
213
+ storage_dir=storage_dir,
214
+ synchronous=backend in ("local", "kubernetes") or backend is None,
215
+ run_id=run_id,
216
+ run_name=run_name,
217
+ build_image=build_image,
218
+ )
219
+ except projects.ExecutionException as e:
220
+ _logger.error("=== %s ===", e)
221
+ sys.exit(1)
222
+
223
+
224
+ def _user_args_to_dict(arguments, argument_type="P"):
225
+ user_dict = {}
226
+ for arg in arguments:
227
+ split = arg.split("=", maxsplit=1)
228
+ # Docker arguments such as `t` don't require a value -> set to True if specified
229
+ if len(split) == 1 and argument_type == "A":
230
+ name = split[0]
231
+ value = True
232
+ elif len(split) == 2:
233
+ name = split[0]
234
+ value = split[1]
235
+ else:
236
+ raise click.UsageError(
237
+ f"Invalid format for -{argument_type} parameter: '{arg}'. "
238
+ f"Use -{argument_type} name=value."
239
+ )
240
+ if name in user_dict:
241
+ raise click.UsageError(f"Repeated parameter: '{name}'")
242
+ user_dict[name] = value
243
+ return user_dict
244
+
245
+
246
+ def _validate_server_args(gunicorn_opts=None, workers=None, waitress_opts=None):
247
+ if sys.platform == "win32":
248
+ if gunicorn_opts is not None or workers is not None:
249
+ raise NotImplementedError(
250
+ "waitress replaces gunicorn on Windows, cannot specify --gunicorn-opts or --workers"
251
+ )
252
+ else:
253
+ if waitress_opts is not None:
254
+ raise NotImplementedError(
255
+ "gunicorn replaces waitress on non-Windows platforms, "
256
+ "cannot specify --waitress-opts"
257
+ )
258
+
259
+
260
+ def _validate_static_prefix(ctx, param, value):
261
+ """
262
+ Validate that the static_prefix option starts with a "/" and does not end in a "/".
263
+ Conforms to the callback interface of click documented at
264
+ http://click.pocoo.org/5/options/#callbacks-for-validation.
265
+ """
266
+ if value is not None:
267
+ if not value.startswith("/"):
268
+ raise UsageError("--static-prefix must begin with a '/'.")
269
+ if value.endswith("/"):
270
+ raise UsageError("--static-prefix should not end with a '/'.")
271
+ return value
272
+
273
+
274
+ @cli.command()
275
+ @click.option(
276
+ "--backend-store-uri",
277
+ envvar="MLFLOW_BACKEND_STORE_URI",
278
+ metavar="PATH",
279
+ default=DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH,
280
+ help="URI to which to persist experiment and run data. Acceptable URIs are "
281
+ "SQLAlchemy-compatible database connection strings "
282
+ "(e.g. 'sqlite:///path/to/file.db') or local filesystem URIs "
283
+ "(e.g. 'file:///absolute/path/to/directory'). By default, data will be logged "
284
+ "to the ./mlruns directory.",
285
+ )
286
+ @click.option(
287
+ "--registry-store-uri",
288
+ envvar="MLFLOW_REGISTRY_STORE_URI",
289
+ metavar="URI",
290
+ default=None,
291
+ help="URI to which to persist registered models. Acceptable URIs are "
292
+ "SQLAlchemy-compatible database connection strings (e.g. 'sqlite:///path/to/file.db'). "
293
+ "If not specified, `backend-store-uri` is used.",
294
+ )
295
+ @click.option(
296
+ "--default-artifact-root",
297
+ envvar="MLFLOW_DEFAULT_ARTIFACT_ROOT",
298
+ metavar="URI",
299
+ default=None,
300
+ help="Directory in which to store artifacts for any new experiments created. For tracking "
301
+ "server backends that rely on SQL, this option is required in order to store artifacts. "
302
+ "Note that this flag does not impact already-created experiments with any previous "
303
+ "configuration of an MLflow server instance. "
304
+ f"By default, data will be logged to the {DEFAULT_ARTIFACTS_URI} uri proxy if "
305
+ "the --serve-artifacts option is enabled. Otherwise, the default location will "
306
+ f"be {DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH}.",
307
+ )
308
+ @cli_args.SERVE_ARTIFACTS
309
+ @click.option(
310
+ "--artifacts-only",
311
+ envvar="MLFLOW_ARTIFACTS_ONLY",
312
+ is_flag=True,
313
+ default=False,
314
+ help="If specified, configures the mlflow server to be used only for proxied artifact serving. "
315
+ "With this mode enabled, functionality of the mlflow tracking service (e.g. run creation, "
316
+ "metric logging, and parameter logging) is disabled. The server will only expose "
317
+ "endpoints for uploading, downloading, and listing artifacts. "
318
+ "Default: False",
319
+ )
320
+ @cli_args.ARTIFACTS_DESTINATION
321
+ @cli_args.HOST
322
+ @cli_args.PORT
323
+ @cli_args.WORKERS
324
+ @click.option(
325
+ "--static-prefix",
326
+ envvar="MLFLOW_STATIC_PREFIX",
327
+ default=None,
328
+ callback=_validate_static_prefix,
329
+ help="A prefix which will be prepended to the path of all static paths.",
330
+ )
331
+ @click.option(
332
+ "--gunicorn-opts",
333
+ envvar="MLFLOW_GUNICORN_OPTS",
334
+ default=None,
335
+ help="Additional command line options forwarded to gunicorn processes.",
336
+ )
337
+ @click.option(
338
+ "--waitress-opts", default=None, help="Additional command line options for waitress-serve."
339
+ )
340
+ @click.option(
341
+ "--expose-prometheus",
342
+ envvar="MLFLOW_EXPOSE_PROMETHEUS",
343
+ default=None,
344
+ help="Path to the directory where metrics will be stored. If the directory "
345
+ "doesn't exist, it will be created. "
346
+ "Activate prometheus exporter to expose metrics on /metrics endpoint.",
347
+ )
348
+ @click.option(
349
+ "--app-name",
350
+ default=None,
351
+ type=click.Choice([e.name for e in get_entry_points("mlflow.app")]),
352
+ show_default=True,
353
+ help=(
354
+ "Application name to be used for the tracking server. "
355
+ "If not specified, 'mlflow.server:app' will be used."
356
+ ),
357
+ )
358
+ @click.option(
359
+ "--dev",
360
+ is_flag=True,
361
+ default=False,
362
+ show_default=True,
363
+ help=(
364
+ "If enabled, run the server with debug logging and auto-reload. "
365
+ "Should only be used for development purposes. "
366
+ "Cannot be used with '--gunicorn-opts'. "
367
+ "Unsupported on Windows."
368
+ ),
369
+ )
370
+ def server(
371
+ backend_store_uri,
372
+ registry_store_uri,
373
+ default_artifact_root,
374
+ serve_artifacts,
375
+ artifacts_only,
376
+ artifacts_destination,
377
+ host,
378
+ port,
379
+ workers,
380
+ static_prefix,
381
+ gunicorn_opts,
382
+ waitress_opts,
383
+ expose_prometheus,
384
+ app_name,
385
+ dev,
386
+ ):
387
+ """
388
+ Run the MLflow tracking server.
389
+
390
+ The server listens on http://localhost:5000 by default and only accepts connections
391
+ from the local machine. To let the server accept connections from other machines, you will need
392
+ to pass ``--host 0.0.0.0`` to listen on all network interfaces
393
+ (or a specific interface address).
394
+ """
395
+ from mlflow.server import _run_server
396
+ from mlflow.server.handlers import initialize_backend_stores
397
+
398
+ if dev and is_windows():
399
+ raise click.UsageError("'--dev' is not supported on Windows.")
400
+
401
+ if dev and gunicorn_opts:
402
+ raise click.UsageError("'--dev' and '--gunicorn-opts' cannot be specified together.")
403
+
404
+ gunicorn_opts = "--log-level debug --reload" if dev else gunicorn_opts
405
+ _validate_server_args(gunicorn_opts=gunicorn_opts, workers=workers, waitress_opts=waitress_opts)
406
+
407
+ # Ensure that both backend_store_uri and default_artifact_uri are set correctly.
408
+ if not backend_store_uri:
409
+ backend_store_uri = DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH
410
+
411
+ # the default setting of registry_store_uri is same as backend_store_uri
412
+ if not registry_store_uri:
413
+ registry_store_uri = backend_store_uri
414
+
415
+ default_artifact_root = resolve_default_artifact_root(
416
+ serve_artifacts, default_artifact_root, backend_store_uri
417
+ )
418
+ artifacts_only_config_validation(artifacts_only, backend_store_uri)
419
+
420
+ try:
421
+ initialize_backend_stores(backend_store_uri, registry_store_uri, default_artifact_root)
422
+ except Exception as e:
423
+ _logger.error("Error initializing backend store")
424
+ _logger.exception(e)
425
+ sys.exit(1)
426
+
427
+ try:
428
+ _run_server(
429
+ backend_store_uri,
430
+ registry_store_uri,
431
+ default_artifact_root,
432
+ serve_artifacts,
433
+ artifacts_only,
434
+ artifacts_destination,
435
+ host,
436
+ port,
437
+ static_prefix,
438
+ workers,
439
+ gunicorn_opts,
440
+ waitress_opts,
441
+ expose_prometheus,
442
+ app_name,
443
+ )
444
+ except ShellCommandException:
445
+ eprint("Running the mlflow server failed. Please see the logs above for details.")
446
+ sys.exit(1)
447
+
448
+
449
+ @cli.command(short_help="Permanently delete runs in the `deleted` lifecycle stage.")
450
+ @click.option(
451
+ "--older-than",
452
+ default=None,
453
+ help="Optional. Remove run(s) older than the specified time limit. "
454
+ "Specify a string in #d#h#m#s format. Float values are also supported. "
455
+ "For example: --older-than 1d2h3m4s, --older-than 1.2d3h4m5s",
456
+ )
457
+ @click.option(
458
+ "--backend-store-uri",
459
+ metavar="PATH",
460
+ default=DEFAULT_LOCAL_FILE_AND_ARTIFACT_PATH,
461
+ help="URI of the backend store from which to delete runs. Acceptable URIs are "
462
+ "SQLAlchemy-compatible database connection strings "
463
+ "(e.g. 'sqlite:///path/to/file.db') or local filesystem URIs "
464
+ "(e.g. 'file:///absolute/path/to/directory'). By default, data will be deleted "
465
+ "from the ./mlruns directory.",
466
+ )
467
+ @click.option(
468
+ "--artifacts-destination",
469
+ envvar="MLFLOW_ARTIFACTS_DESTINATION",
470
+ metavar="URI",
471
+ default=None,
472
+ help=(
473
+ "The base artifact location from which to resolve artifact upload/download/list requests "
474
+ "(e.g. 's3://my-bucket'). This option only applies when the tracking server is configured "
475
+ "to stream artifacts and the experiment's artifact root location is http or "
476
+ "mlflow-artifacts URI. Otherwise, the default artifact location will be used."
477
+ ),
478
+ )
479
+ @click.option(
480
+ "--run-ids",
481
+ default=None,
482
+ help="Optional comma separated list of runs to be permanently deleted. If run ids"
483
+ " are not specified, data is removed for all runs in the `deleted`"
484
+ " lifecycle stage.",
485
+ )
486
+ @click.option(
487
+ "--experiment-ids",
488
+ default=None,
489
+ help="Optional comma separated list of experiments to be permanently deleted including "
490
+ "all of their associated runs. If experiment ids are not specified, data is removed for all "
491
+ "experiments in the `deleted` lifecycle stage.",
492
+ )
493
+ @click.option(
494
+ "--tracking-uri",
495
+ default=os.environ.get("MLFLOW_TRACKING_URI"),
496
+ help="Tracking URI to use for deleting 'deleted' runs e.g. http://127.0.0.1:8080",
497
+ )
498
+ def gc(older_than, backend_store_uri, artifacts_destination, run_ids, experiment_ids, tracking_uri):
499
+ """
500
+ Permanently delete runs in the `deleted` lifecycle stage from the specified backend store.
501
+ This command deletes all artifacts and metadata associated with the specified runs.
502
+ If the provided artifact URL is invalid, the artifact deletion will be bypassed,
503
+ and the gc process will continue.
504
+
505
+ .. attention::
506
+
507
+ If you are running an MLflow tracking server with artifact proxying enabled,
508
+ you **must** set the ``MLFLOW_TRACKING_URI`` environment variable before running
509
+ this command. Otherwise, the ``gc`` command will not be able to resolve
510
+ artifact URIs and will not be able to delete the associated artifacts.
511
+
512
+ """
513
+ from mlflow.utils.time import get_current_time_millis
514
+
515
+ backend_store = _get_store(backend_store_uri, artifacts_destination)
516
+ skip_experiments = False
517
+ if not hasattr(backend_store, "_hard_delete_run"):
518
+ raise MlflowException(
519
+ "This cli can only be used with a backend that allows hard-deleting runs"
520
+ )
521
+
522
+ if not hasattr(backend_store, "_hard_delete_experiment"):
523
+ warnings.warn(
524
+ "The specified backend does not allow hard-deleting experiments. Experiments"
525
+ " will be skipped.",
526
+ FutureWarning,
527
+ stacklevel=2,
528
+ )
529
+ skip_experiments = True
530
+
531
+ time_delta = 0
532
+
533
+ if older_than is not None:
534
+ regex = re.compile(
535
+ r"^((?P<days>[\.\d]+?)d)?((?P<hours>[\.\d]+?)h)?((?P<minutes>[\.\d]+?)m)"
536
+ r"?((?P<seconds>[\.\d]+?)s)?$"
537
+ )
538
+ parts = regex.match(older_than)
539
+ if parts is None:
540
+ raise MlflowException(
541
+ f"Could not parse any time information from '{older_than}'. "
542
+ "Examples of valid strings: '8h', '2d8h5m20s', '2m4s'",
543
+ error_code=INVALID_PARAMETER_VALUE,
544
+ )
545
+ time_params = {name: float(param) for name, param in parts.groupdict().items() if param}
546
+ time_delta = int(timedelta(**time_params).total_seconds() * 1000)
547
+
548
+ if tracking_uri:
549
+ set_tracking_uri(tracking_uri)
550
+
551
+ if not is_tracking_uri_set():
552
+ raise MlflowException(
553
+ "Tracking URL is not set. Please set MLFLOW_TRACKING_URI environment variable "
554
+ "or provide --tracking-uri cli option."
555
+ )
556
+
557
+ deleted_run_ids_older_than = backend_store._get_deleted_runs(older_than=time_delta)
558
+ run_ids = run_ids.split(",") if run_ids else deleted_run_ids_older_than
559
+
560
+ time_threshold = get_current_time_millis() - time_delta
561
+ if not skip_experiments:
562
+ if experiment_ids:
563
+ experiment_ids = experiment_ids.split(",")
564
+ experiments = [backend_store.get_experiment(id) for id in experiment_ids]
565
+
566
+ # Ensure that the specified experiments are soft-deleted
567
+ active_experiment_ids = [
568
+ e.experiment_id for e in experiments if e.lifecycle_stage != LifecycleStage.DELETED
569
+ ]
570
+ if active_experiment_ids:
571
+ raise MlflowException(
572
+ f"Experiments {active_experiment_ids} are not in the deleted lifecycle stage. "
573
+ "Only experiments in the deleted lifecycle stage can be hard-deleted.",
574
+ error_code=INVALID_PARAMETER_VALUE,
575
+ )
576
+
577
+ # Ensure that the specified experiments are old enough
578
+ if older_than:
579
+ non_old_experiment_ids = [
580
+ e.experiment_id
581
+ for e in experiments
582
+ if e.last_update_time is None or e.last_update_time >= time_threshold
583
+ ]
584
+ if non_old_experiment_ids:
585
+ raise MlflowException(
586
+ f"Experiments {non_old_experiment_ids} are not older than the required"
587
+ f"age. Only experiments older than {older_than} can be deleted.",
588
+ error_code=INVALID_PARAMETER_VALUE,
589
+ )
590
+ else:
591
+ filter_string = f"last_update_time < {time_threshold}" if older_than else None
592
+
593
+ def fetch_experiments(token=None):
594
+ page = backend_store.search_experiments(
595
+ view_type=ViewType.DELETED_ONLY,
596
+ filter_string=filter_string,
597
+ page_token=token,
598
+ )
599
+ return (page + fetch_experiments(page.token)) if page.token else page
600
+
601
+ experiment_ids = [exp.experiment_id for exp in fetch_experiments()]
602
+
603
+ def fetch_runs(token=None):
604
+ page = backend_store.search_runs(
605
+ experiment_ids=experiment_ids,
606
+ filter_string="",
607
+ run_view_type=ViewType.DELETED_ONLY,
608
+ page_token=token,
609
+ )
610
+ return (page + fetch_runs(page.token)) if page.token else page
611
+
612
+ run_ids.extend([run.info.run_id for run in fetch_runs()])
613
+
614
+ for run_id in set(run_ids):
615
+ run = backend_store.get_run(run_id)
616
+ if run.info.lifecycle_stage != LifecycleStage.DELETED:
617
+ raise MlflowException(
618
+ f"Run {run_id} is not in `deleted` lifecycle stage. Only runs in"
619
+ " `deleted` lifecycle stage can be deleted."
620
+ )
621
+ # raise MlflowException if run_id is newer than older_than parameter
622
+ if older_than and run_id not in deleted_run_ids_older_than:
623
+ raise MlflowException(
624
+ f"Run {run_id} is not older than the required age. "
625
+ f"Only runs older than {older_than} can be deleted.",
626
+ error_code=INVALID_PARAMETER_VALUE,
627
+ )
628
+ # raise MlflowException if run_id is newer than older_than parameter
629
+ if older_than and run_id not in deleted_run_ids_older_than:
630
+ raise MlflowException(
631
+ f"Run {run_id} is not older than the required age. "
632
+ f"Only runs older than {older_than} can be deleted.",
633
+ error_code=INVALID_PARAMETER_VALUE,
634
+ )
635
+ artifact_repo = get_artifact_repository(run.info.artifact_uri)
636
+ try:
637
+ artifact_repo.delete_artifacts()
638
+ except InvalidUrlException as iue:
639
+ click.echo(
640
+ click.style(
641
+ f"An exception {iue!r} was raised during the deletion of a model artifact",
642
+ fg="yellow",
643
+ )
644
+ )
645
+ click.echo(
646
+ click.style(
647
+ f"Unable to resolve the provided artifact URL: '{artifact_repo}'. "
648
+ "The gc process will continue and bypass artifact deletion. "
649
+ "Please ensure that the artifact exists "
650
+ "and consider manually deleting any unused artifacts. ",
651
+ fg="yellow",
652
+ ),
653
+ )
654
+ backend_store._hard_delete_run(run_id)
655
+ click.echo(f"Run with ID {run_id} has been permanently deleted.")
656
+
657
+ if not skip_experiments:
658
+ for experiment_id in experiment_ids:
659
+ backend_store._hard_delete_experiment(experiment_id)
660
+ click.echo(f"Experiment with ID {experiment_id} has been permanently deleted.")
661
+
662
+
663
+ @cli.command(short_help="Prints out useful information for debugging issues with MLflow.")
664
+ @click.option(
665
+ "--mask-envs",
666
+ is_flag=True,
667
+ help=(
668
+ "If set (the default behavior without setting this flag is not to obfuscate information), "
669
+ 'mask the MLflow environment variable values (e.g. `"MLFLOW_ENV_VAR": "***"`) '
670
+ "in the output to prevent leaking sensitive information."
671
+ ),
672
+ )
673
+ def doctor(mask_envs):
674
+ mlflow.doctor(mask_envs)
675
+
676
+
677
+ cli.add_command(mlflow.deployments.cli.commands)
678
+ cli.add_command(mlflow.experiments.commands)
679
+ cli.add_command(mlflow.store.artifact.cli.commands)
680
+ cli.add_command(mlflow.runs.commands)
681
+ cli.add_command(mlflow.db.commands)
682
+
683
+ # We are conditional loading these commands since the skinny client does
684
+ # not support them due to the pandas and numpy dependencies of MLflow Models
685
+ try:
686
+ import mlflow.models.cli
687
+
688
+ cli.add_command(mlflow.models.cli.commands)
689
+ except ImportError:
690
+ pass
691
+
692
+ try:
693
+ import mlflow.sagemaker.cli
694
+
695
+ cli.add_command(mlflow.sagemaker.cli.commands)
696
+ except ImportError:
697
+ pass
698
+
699
+
700
+ with contextlib.suppress(ImportError):
701
+ import mlflow.gateway.cli
702
+
703
+ cli.add_command(mlflow.gateway.cli.commands)
704
+
705
+
706
+ if __name__ == "__main__":
707
+ cli()