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/utils/conda.py ADDED
@@ -0,0 +1,354 @@
1
+ import hashlib
2
+ import json
3
+ import logging
4
+ import os
5
+
6
+ import yaml
7
+
8
+ from mlflow.environment_variables import MLFLOW_CONDA_CREATE_ENV_CMD, MLFLOW_CONDA_HOME
9
+ from mlflow.exceptions import ExecutionException
10
+ from mlflow.utils import process
11
+ from mlflow.utils.environment import Environment
12
+ from mlflow.utils.os import is_windows
13
+
14
+ _logger = logging.getLogger(__name__)
15
+
16
+ CONDA_EXE = "CONDA_EXE"
17
+
18
+
19
+ def get_conda_command(conda_env_name):
20
+ # Checking for newer conda versions
21
+ if not is_windows() and (CONDA_EXE in os.environ or MLFLOW_CONDA_HOME.defined):
22
+ conda_path = get_conda_bin_executable("conda")
23
+ activate_conda_env = [f"source {os.path.dirname(conda_path)}/../etc/profile.d/conda.sh"]
24
+ activate_conda_env += [f"conda activate {conda_env_name} 1>&2"]
25
+ else:
26
+ activate_path = get_conda_bin_executable("activate")
27
+ # in case os name is not 'nt', we are not running on windows. It introduces
28
+ # bash command otherwise.
29
+ if not is_windows():
30
+ return [f"source {activate_path} {conda_env_name} 1>&2"]
31
+ else:
32
+ return [f"conda activate {conda_env_name}"]
33
+ return activate_conda_env
34
+
35
+
36
+ def get_conda_bin_executable(executable_name):
37
+ """
38
+ Return path to the specified executable, assumed to be discoverable within the 'bin'
39
+ subdirectory of a conda installation.
40
+
41
+ The conda home directory (expected to contain a 'bin' subdirectory) is configurable via the
42
+ ``mlflow.projects.MLFLOW_CONDA_HOME`` environment variable. If
43
+ ``mlflow.projects.MLFLOW_CONDA_HOME`` is unspecified, this method simply returns the passed-in
44
+ executable name.
45
+ """
46
+ if conda_home := MLFLOW_CONDA_HOME.get():
47
+ return os.path.join(conda_home, f"bin/{executable_name}")
48
+ # Use CONDA_EXE as per https://github.com/conda/conda/issues/7126
49
+ if conda_exe := os.getenv(CONDA_EXE):
50
+ conda_bin_dir = os.path.dirname(conda_exe)
51
+ return os.path.join(conda_bin_dir, executable_name)
52
+ return executable_name
53
+
54
+
55
+ def _get_conda_env_name(conda_env_path, env_id=None, env_root_dir=None):
56
+ if conda_env_path:
57
+ with open(conda_env_path) as f:
58
+ conda_env_contents = f.read()
59
+ else:
60
+ conda_env_contents = ""
61
+
62
+ if env_id:
63
+ conda_env_contents += env_id
64
+
65
+ env_name = "mlflow-{}".format(
66
+ hashlib.sha1(conda_env_contents.encode("utf-8"), usedforsecurity=False).hexdigest()
67
+ )
68
+ if env_root_dir:
69
+ env_root_dir = os.path.normpath(env_root_dir)
70
+ # Generate env name with format "mlflow-{conda_env_contents_hash}-{env_root_dir_hash}"
71
+ # hashing `conda_env_contents` and `env_root_dir` separately helps debugging
72
+ env_name += "-{}".format(
73
+ hashlib.sha1(env_root_dir.encode("utf-8"), usedforsecurity=False).hexdigest()
74
+ )
75
+
76
+ return env_name
77
+
78
+
79
+ def _get_conda_executable_for_create_env():
80
+ """
81
+ Returns the executable that should be used to create environments. This is "conda"
82
+ by default, but it can be set to something else by setting the environment variable
83
+
84
+ """
85
+
86
+ return get_conda_bin_executable(MLFLOW_CONDA_CREATE_ENV_CMD.get())
87
+
88
+
89
+ def _list_conda_environments(extra_env=None):
90
+ """Return a list of names of conda environments.
91
+
92
+ Args:
93
+ extra_env: Extra environment variables for running "conda env list" command.
94
+
95
+ """
96
+ prc = process._exec_cmd(
97
+ [get_conda_bin_executable("conda"), "env", "list", "--json"], extra_env=extra_env
98
+ )
99
+ return list(map(os.path.basename, json.loads(prc.stdout).get("envs", [])))
100
+
101
+
102
+ _CONDA_ENVS_DIR = "conda_envs"
103
+ _CONDA_CACHE_PKGS_DIR = "conda_cache_pkgs"
104
+ _PIP_CACHE_DIR = "pip_cache_pkgs"
105
+
106
+
107
+ def _create_conda_env(
108
+ conda_env_path,
109
+ conda_env_create_path,
110
+ project_env_name,
111
+ conda_extra_env_vars,
112
+ capture_output,
113
+ ):
114
+ if conda_env_path:
115
+ process._exec_cmd(
116
+ [
117
+ conda_env_create_path,
118
+ "env",
119
+ "create",
120
+ "-n",
121
+ project_env_name,
122
+ "--file",
123
+ conda_env_path,
124
+ ],
125
+ extra_env=conda_extra_env_vars,
126
+ capture_output=capture_output,
127
+ )
128
+ else:
129
+ process._exec_cmd(
130
+ [
131
+ conda_env_create_path,
132
+ "create",
133
+ "--channel",
134
+ "conda-forge",
135
+ "--yes",
136
+ "--override-channels",
137
+ "-n",
138
+ project_env_name,
139
+ "python",
140
+ ],
141
+ extra_env=conda_extra_env_vars,
142
+ capture_output=capture_output,
143
+ )
144
+
145
+ return Environment(get_conda_command(project_env_name), conda_extra_env_vars)
146
+
147
+
148
+ def _create_conda_env_retry(
149
+ conda_env_path, conda_env_create_path, project_env_name, conda_extra_env_vars, _capture_output
150
+ ):
151
+ """
152
+ `conda env create` command can fail due to network issues such as `ConnectionResetError`
153
+ while collecting package metadata. This function retries the command up to 3 times.
154
+ """
155
+ num_attempts = 3
156
+ for attempt in range(num_attempts):
157
+ try:
158
+ return _create_conda_env(
159
+ conda_env_path,
160
+ conda_env_create_path,
161
+ project_env_name,
162
+ conda_extra_env_vars,
163
+ capture_output=True,
164
+ )
165
+ except process.ShellCommandException as e:
166
+ error_str = str(e)
167
+ if (num_attempts - attempt - 1) > 0 and (
168
+ "ConnectionResetError" in error_str or "ChunkedEncodingError" in error_str
169
+ ):
170
+ _logger.warning("Conda env creation failed due to network issue. Retrying...")
171
+ continue
172
+ raise
173
+
174
+
175
+ def _get_conda_extra_env_vars(env_root_dir=None):
176
+ """
177
+ Given the `env_root_dir` (See doc of PyFuncBackend constructor argument `env_root_dir`),
178
+ return a dict of environment variables which are used to config conda to generate envs
179
+ under the expected `env_root_dir`.
180
+ """
181
+ if env_root_dir is None:
182
+ return None
183
+
184
+ # Create isolated conda package cache dir "conda_pkgs" under the env_root_dir
185
+ # for each python process.
186
+ # Note: shared conda package cache dir causes race condition issues:
187
+ # See https://github.com/conda/conda/issues/8870
188
+ # See https://docs.conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#specify-environment-directories-envs-dirs
189
+ # and https://docs.conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#specify-package-directories-pkgs-dirs
190
+
191
+ conda_envs_path = os.path.join(env_root_dir, _CONDA_ENVS_DIR)
192
+ conda_pkgs_path = os.path.join(env_root_dir, _CONDA_CACHE_PKGS_DIR)
193
+ pip_cache_dir = os.path.join(env_root_dir, _PIP_CACHE_DIR)
194
+
195
+ os.makedirs(conda_envs_path, exist_ok=True)
196
+ os.makedirs(conda_pkgs_path, exist_ok=True)
197
+ os.makedirs(pip_cache_dir, exist_ok=True)
198
+
199
+ return {
200
+ "CONDA_ENVS_PATH": conda_envs_path,
201
+ "CONDA_PKGS_DIRS": conda_pkgs_path,
202
+ "PIP_CACHE_DIR": pip_cache_dir,
203
+ # PIP_NO_INPUT=1 makes pip run in non-interactive mode,
204
+ # otherwise pip might prompt "yes or no" and ask stdin input
205
+ "PIP_NO_INPUT": "1",
206
+ }
207
+
208
+
209
+ def get_or_create_conda_env(
210
+ conda_env_path,
211
+ env_id=None,
212
+ capture_output=False,
213
+ env_root_dir=None,
214
+ pip_requirements_override=None,
215
+ extra_envs=None,
216
+ ):
217
+ """Given a `Project`, creates a conda environment containing the project's dependencies if such
218
+ a conda environment doesn't already exist. Returns the name of the conda environment.
219
+
220
+ Args:
221
+ conda_env_path: Path to a conda yaml file.
222
+ env_id: Optional string that is added to the contents of the yaml file before
223
+ calculating the hash. It can be used to distinguish environments that have the
224
+ same conda dependencies but are supposed to be different based on the context.
225
+ For example, when serving the model we may install additional dependencies to the
226
+ environment after the environment has been activated.
227
+ capture_output: Specify the capture_output argument while executing the
228
+ "conda env create" command.
229
+ env_root_dir: See doc of PyFuncBackend constructor argument `env_root_dir`.
230
+ pip_requirements_override: If specified, install the specified python dependencies to
231
+ the environment (upgrade if already installed).
232
+ extra_envs: If specified, a dictionary of extra environment variables will be passed to the
233
+ model inference environment.
234
+
235
+ Returns:
236
+ The name of the conda environment.
237
+
238
+ """
239
+
240
+ conda_path = get_conda_bin_executable("conda")
241
+ conda_env_create_path = _get_conda_executable_for_create_env()
242
+
243
+ try:
244
+ # Checks if Conda executable exists
245
+ process._exec_cmd([conda_path, "--help"], throw_on_error=False, extra_env=extra_envs)
246
+ except OSError:
247
+ raise ExecutionException(
248
+ f"Could not find Conda executable at {conda_path}. "
249
+ "Ensure Conda is installed as per the instructions at "
250
+ "https://conda.io/projects/conda/en/latest/"
251
+ "user-guide/install/index.html. "
252
+ "You can also configure MLflow to look for a specific "
253
+ f"Conda executable by setting the {MLFLOW_CONDA_HOME} environment variable "
254
+ "to the path of the Conda executable"
255
+ )
256
+
257
+ try:
258
+ # Checks if executable for environment creation exists
259
+ process._exec_cmd(
260
+ [conda_env_create_path, "--help"], throw_on_error=False, extra_env=extra_envs
261
+ )
262
+ except OSError:
263
+ raise ExecutionException(
264
+ f"You have set the env variable {MLFLOW_CONDA_CREATE_ENV_CMD}, but "
265
+ f"{conda_env_create_path} does not exist or it is not working properly. "
266
+ f"Note that {conda_env_create_path} and the conda executable need to be "
267
+ "in the same conda environment. You can change the search path by"
268
+ f"modifying the env variable {MLFLOW_CONDA_HOME}"
269
+ )
270
+
271
+ conda_extra_env_vars = _get_conda_extra_env_vars(env_root_dir)
272
+ if extra_envs:
273
+ conda_extra_env_vars.update(extra_envs)
274
+
275
+ # Include the env_root_dir hash in the project_env_name,
276
+ # this is for avoid conda env name conflicts between different CONDA_ENVS_PATH.
277
+ project_env_name = _get_conda_env_name(conda_env_path, env_id=env_id, env_root_dir=env_root_dir)
278
+ if env_root_dir is not None:
279
+ project_env_path = os.path.join(env_root_dir, _CONDA_ENVS_DIR, project_env_name)
280
+ else:
281
+ project_env_path = project_env_name
282
+
283
+ if project_env_name in _list_conda_environments(conda_extra_env_vars):
284
+ _logger.info("Conda environment %s already exists.", project_env_path)
285
+ return Environment(get_conda_command(project_env_name), conda_extra_env_vars)
286
+
287
+ _logger.info("=== Creating conda environment %s ===", project_env_path)
288
+ try:
289
+ _create_conda_env_func = (
290
+ # Retry conda env creation in a pytest session to avoid flaky test failures
291
+ _create_conda_env_retry if "PYTEST_CURRENT_TEST" in os.environ else _create_conda_env
292
+ )
293
+ conda_env = _create_conda_env_func(
294
+ conda_env_path,
295
+ conda_env_create_path,
296
+ project_env_name,
297
+ conda_extra_env_vars,
298
+ capture_output,
299
+ )
300
+
301
+ if pip_requirements_override:
302
+ _logger.info(
303
+ "Installing additional dependencies specified"
304
+ f"by pip_requirements_override: {pip_requirements_override}"
305
+ )
306
+ cmd = [
307
+ conda_path,
308
+ "install",
309
+ "-n",
310
+ project_env_name,
311
+ "--yes",
312
+ *pip_requirements_override,
313
+ ]
314
+ process._exec_cmd(cmd, extra_env=conda_extra_env_vars, capture_output=capture_output)
315
+
316
+ return conda_env
317
+
318
+ except Exception:
319
+ try:
320
+ if project_env_name in _list_conda_environments(conda_extra_env_vars):
321
+ _logger.warning(
322
+ "Encountered unexpected error while creating conda environment. Removing %s.",
323
+ project_env_path,
324
+ )
325
+ process._exec_cmd(
326
+ [
327
+ conda_path,
328
+ "remove",
329
+ "--yes",
330
+ "--name",
331
+ project_env_name,
332
+ "--all",
333
+ ],
334
+ extra_env=conda_extra_env_vars,
335
+ capture_output=False,
336
+ )
337
+ except Exception as e:
338
+ _logger.warning(
339
+ "Removing conda environment %s failed (error: %s)",
340
+ project_env_path,
341
+ repr(e),
342
+ )
343
+ raise
344
+
345
+
346
+ def _get_conda_dependencies(conda_yaml_path):
347
+ """Extracts conda dependencies from a conda yaml file.
348
+
349
+ Args:
350
+ conda_yaml_path: Conda yaml file path.
351
+ """
352
+ with open(conda_yaml_path) as f:
353
+ conda_yaml = yaml.safe_load(f)
354
+ return [d for d in conda_yaml.get("dependencies", []) if isinstance(d, str)]
@@ -0,0 +1,231 @@
1
+ import configparser
2
+ import getpass
3
+ import logging
4
+ import os
5
+ from typing import NamedTuple, Optional
6
+
7
+ from mlflow.environment_variables import (
8
+ MLFLOW_TRACKING_AUTH,
9
+ MLFLOW_TRACKING_AWS_SIGV4,
10
+ MLFLOW_TRACKING_CLIENT_CERT_PATH,
11
+ MLFLOW_TRACKING_INSECURE_TLS,
12
+ MLFLOW_TRACKING_PASSWORD,
13
+ MLFLOW_TRACKING_SERVER_CERT_PATH,
14
+ MLFLOW_TRACKING_TOKEN,
15
+ MLFLOW_TRACKING_USERNAME,
16
+ )
17
+ from mlflow.exceptions import MlflowException
18
+ from mlflow.utils.rest_utils import MlflowHostCreds
19
+
20
+ _logger = logging.getLogger(__name__)
21
+
22
+
23
+ class MlflowCreds(NamedTuple):
24
+ username: Optional[str]
25
+ password: Optional[str]
26
+
27
+
28
+ def _get_credentials_path() -> str:
29
+ return os.path.expanduser("~/.mlflow/credentials")
30
+
31
+
32
+ def _read_mlflow_creds_from_file() -> tuple[Optional[str], Optional[str]]:
33
+ path = _get_credentials_path()
34
+ if not os.path.exists(path):
35
+ return None, None
36
+
37
+ config = configparser.ConfigParser()
38
+ config.read(path)
39
+ if "mlflow" not in config:
40
+ return None, None
41
+
42
+ mlflow_cfg = config["mlflow"]
43
+ username_key = MLFLOW_TRACKING_USERNAME.name.lower()
44
+ password_key = MLFLOW_TRACKING_PASSWORD.name.lower()
45
+ return mlflow_cfg.get(username_key), mlflow_cfg.get(password_key)
46
+
47
+
48
+ def _read_mlflow_creds_from_env() -> tuple[Optional[str], Optional[str]]:
49
+ return MLFLOW_TRACKING_USERNAME.get(), MLFLOW_TRACKING_PASSWORD.get()
50
+
51
+
52
+ def read_mlflow_creds() -> MlflowCreds:
53
+ username_file, password_file = _read_mlflow_creds_from_file()
54
+ username_env, password_env = _read_mlflow_creds_from_env()
55
+ return MlflowCreds(
56
+ username=username_env or username_file,
57
+ password=password_env or password_file,
58
+ )
59
+
60
+
61
+ def get_default_host_creds(store_uri):
62
+ creds = read_mlflow_creds()
63
+ return MlflowHostCreds(
64
+ host=store_uri,
65
+ username=creds.username,
66
+ password=creds.password,
67
+ token=MLFLOW_TRACKING_TOKEN.get(),
68
+ aws_sigv4=MLFLOW_TRACKING_AWS_SIGV4.get(),
69
+ auth=MLFLOW_TRACKING_AUTH.get(),
70
+ ignore_tls_verification=MLFLOW_TRACKING_INSECURE_TLS.get(),
71
+ client_cert_path=MLFLOW_TRACKING_CLIENT_CERT_PATH.get(),
72
+ server_cert_path=MLFLOW_TRACKING_SERVER_CERT_PATH.get(),
73
+ )
74
+
75
+
76
+ def login(backend: str = "databricks", interactive: bool = True) -> None:
77
+ """Configure MLflow server authentication and connect MLflow to tracking server.
78
+
79
+ This method provides a simple way to connect MLflow to its tracking server. Currently only
80
+ Databricks tracking server is supported. Users will be prompted to enter the credentials if no
81
+ existing Databricks profile is found, and the credentials will be saved to `~/.databrickscfg`.
82
+
83
+ Args:
84
+ backend: string, the backend of the tracking server. Currently only "databricks" is
85
+ supported.
86
+
87
+ interactive: bool, controls request for user input on missing credentials. If true, user
88
+ input will be requested if no credentials are found, otherwise an exception will be
89
+ raised if no credentials are found.
90
+
91
+ .. code-block:: python
92
+ :caption: Example
93
+
94
+ import mlflow
95
+
96
+ mlflow.login()
97
+ with mlflow.start_run():
98
+ mlflow.log_param("p", 0)
99
+ """
100
+ from mlflow.tracking import set_tracking_uri
101
+
102
+ if backend == "databricks":
103
+ _databricks_login(interactive)
104
+ set_tracking_uri("databricks")
105
+ else:
106
+ raise MlflowException(
107
+ f"Currently only 'databricks' backend is supported, received `backend={backend}`."
108
+ )
109
+
110
+
111
+ def _validate_databricks_auth():
112
+ # Check if databricks credentials are valid.
113
+ try:
114
+ from databricks.sdk import WorkspaceClient
115
+ except ImportError:
116
+ raise ImportError(
117
+ "Databricks SDK is not installed. To use `mlflow.login()`, please install "
118
+ "databricks-sdk by `pip install databricks-sdk`."
119
+ )
120
+
121
+ try:
122
+ w = WorkspaceClient()
123
+ if "community" in w.config.host:
124
+ # Databricks community edition cannot use `w.current_user.me()` for auth validation.
125
+ w.clusters.list_zones()
126
+ else:
127
+ # If credentials are invalid, `w.current_user.me()` will throw an error.
128
+ w.current_user.me()
129
+ _logger.info(
130
+ f"Successfully connected to MLflow hosted tracking server! Host: {w.config.host}."
131
+ )
132
+ except Exception as e:
133
+ raise MlflowException(f"Failed to validate databricks credentials: {e}")
134
+
135
+
136
+ def _overwrite_or_create_databricks_profile(
137
+ file_name,
138
+ profile,
139
+ profile_name="DEFAULT",
140
+ ):
141
+ """Overwrite or create a profile in the databricks config file.
142
+
143
+ Args:
144
+ file_name: string, the file name of the databricks config file, usually `~/.databrickscfg`.
145
+ profile: dict, contains the authentiacation profile information.
146
+ profile_name: string, the name of the profile to be overwritten or created.
147
+ """
148
+ profile_name = f"[{profile_name}]"
149
+ lines = []
150
+ # Read `file_name` if the file exists, otherwise `lines=[]`.
151
+ if os.path.exists(file_name):
152
+ with open(file_name) as file:
153
+ lines = file.readlines()
154
+ start_index = -1
155
+ end_index = -1
156
+ # Find the start and end indices of the profile to overwrite.
157
+ for i in range(len(lines)):
158
+ if lines[i].strip() == profile_name:
159
+ start_index = i
160
+ break
161
+
162
+ if start_index != -1:
163
+ for i in range(start_index + 1, len(lines)):
164
+ # Reach an empty line or a new profile.
165
+ if lines[i].strip() == "" or lines[i].startswith("["):
166
+ end_index = i
167
+ break
168
+ end_index = end_index if end_index != -1 else len(lines)
169
+ del lines[start_index : end_index + 1]
170
+
171
+ # Write the new profile to the top of the file.
172
+ new_profile = []
173
+ new_profile.append(profile_name + "\n")
174
+ new_profile.append(f"host = {profile['host']}\n")
175
+ if "token" in profile:
176
+ new_profile.append(f"token = {profile['token']}\n")
177
+ else:
178
+ new_profile.append(f"username = {profile['username']}\n")
179
+ new_profile.append(f"password = {profile['password']}\n")
180
+ new_profile.append("\n")
181
+ lines = new_profile + lines
182
+
183
+ # Write back the modified lines to the file.
184
+ with open(file_name, "w") as file:
185
+ file.writelines(lines)
186
+
187
+
188
+ def _databricks_login(interactive):
189
+ """Set up databricks authentication."""
190
+ try:
191
+ # Failed validation will throw an error.
192
+ _validate_databricks_auth()
193
+ return
194
+ except Exception:
195
+ if interactive:
196
+ _logger.info("No valid Databricks credentials found, please enter your credentials...")
197
+ else:
198
+ raise MlflowException(
199
+ "No valid Databricks credentials found while running in non-interactive mode."
200
+ )
201
+
202
+ while True:
203
+ host = input("Databricks Host (should begin with https://): ")
204
+ if not host.startswith("https://"):
205
+ _logger.error("Invalid host: {host}, host must begin with https://, please retry.")
206
+ break
207
+
208
+ profile = {"host": host}
209
+ if "community" in host:
210
+ # Databricks community edition requires username and password for authentication.
211
+ username = input("Username: ")
212
+ password = getpass.getpass("Password: ")
213
+ profile["username"] = username
214
+ profile["password"] = password
215
+ else:
216
+ # Production or staging Databricks requires personal token for authentication.
217
+ token = getpass.getpass("Token: ")
218
+ profile["token"] = token
219
+
220
+ file_name = os.environ.get(
221
+ "DATABRICKS_CONFIG_FILE", f"{os.path.expanduser('~')}/.databrickscfg"
222
+ )
223
+ profile_name = os.environ.get("DATABRICKS_CONFIG_PROFILE", "DEFAULT")
224
+ _overwrite_or_create_databricks_profile(file_name, profile, profile_name)
225
+
226
+ try:
227
+ # Failed validation will throw an error.
228
+ _validate_databricks_auth()
229
+ except Exception as e:
230
+ # If user entered invalid auth, we will raise an error and ask users to retry.
231
+ raise MlflowException(f"`mlflow.login()` failed with error: {e}")
@@ -0,0 +1,17 @@
1
+ import urllib.parse
2
+
3
+
4
+ def parse_s3_uri(uri):
5
+ """Parse an S3 URI, returning (bucket, path)"""
6
+ parsed = urllib.parse.urlparse(uri)
7
+ if parsed.scheme != "s3":
8
+ raise Exception(f"Not an S3 URI: {uri}")
9
+ path = parsed.path
10
+ if path.startswith("/"):
11
+ path = path[1:]
12
+ return parsed.netloc, path
13
+
14
+
15
+ def is_uri(string):
16
+ parsed_uri = urllib.parse.urlparse(string)
17
+ return len(parsed_uri.scheme) > 0