genesis-flow 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. genesis_flow-1.0.0.dist-info/METADATA +822 -0
  2. genesis_flow-1.0.0.dist-info/RECORD +645 -0
  3. genesis_flow-1.0.0.dist-info/WHEEL +5 -0
  4. genesis_flow-1.0.0.dist-info/entry_points.txt +19 -0
  5. genesis_flow-1.0.0.dist-info/licenses/LICENSE.txt +202 -0
  6. genesis_flow-1.0.0.dist-info/top_level.txt +1 -0
  7. mlflow/__init__.py +367 -0
  8. mlflow/__main__.py +3 -0
  9. mlflow/ag2/__init__.py +56 -0
  10. mlflow/ag2/ag2_logger.py +294 -0
  11. mlflow/anthropic/__init__.py +40 -0
  12. mlflow/anthropic/autolog.py +129 -0
  13. mlflow/anthropic/chat.py +144 -0
  14. mlflow/artifacts/__init__.py +268 -0
  15. mlflow/autogen/__init__.py +144 -0
  16. mlflow/autogen/chat.py +142 -0
  17. mlflow/azure/__init__.py +26 -0
  18. mlflow/azure/auth_handler.py +257 -0
  19. mlflow/azure/client.py +319 -0
  20. mlflow/azure/config.py +120 -0
  21. mlflow/azure/connection_factory.py +340 -0
  22. mlflow/azure/exceptions.py +27 -0
  23. mlflow/azure/stores.py +327 -0
  24. mlflow/azure/utils.py +183 -0
  25. mlflow/bedrock/__init__.py +45 -0
  26. mlflow/bedrock/_autolog.py +202 -0
  27. mlflow/bedrock/chat.py +122 -0
  28. mlflow/bedrock/stream.py +160 -0
  29. mlflow/bedrock/utils.py +43 -0
  30. mlflow/cli.py +707 -0
  31. mlflow/client.py +12 -0
  32. mlflow/config/__init__.py +56 -0
  33. mlflow/crewai/__init__.py +79 -0
  34. mlflow/crewai/autolog.py +253 -0
  35. mlflow/crewai/chat.py +29 -0
  36. mlflow/data/__init__.py +75 -0
  37. mlflow/data/artifact_dataset_sources.py +170 -0
  38. mlflow/data/code_dataset_source.py +40 -0
  39. mlflow/data/dataset.py +123 -0
  40. mlflow/data/dataset_registry.py +168 -0
  41. mlflow/data/dataset_source.py +110 -0
  42. mlflow/data/dataset_source_registry.py +219 -0
  43. mlflow/data/delta_dataset_source.py +167 -0
  44. mlflow/data/digest_utils.py +108 -0
  45. mlflow/data/evaluation_dataset.py +562 -0
  46. mlflow/data/filesystem_dataset_source.py +81 -0
  47. mlflow/data/http_dataset_source.py +145 -0
  48. mlflow/data/huggingface_dataset.py +258 -0
  49. mlflow/data/huggingface_dataset_source.py +118 -0
  50. mlflow/data/meta_dataset.py +104 -0
  51. mlflow/data/numpy_dataset.py +223 -0
  52. mlflow/data/pandas_dataset.py +231 -0
  53. mlflow/data/polars_dataset.py +352 -0
  54. mlflow/data/pyfunc_dataset_mixin.py +31 -0
  55. mlflow/data/schema.py +76 -0
  56. mlflow/data/sources.py +1 -0
  57. mlflow/data/spark_dataset.py +406 -0
  58. mlflow/data/spark_dataset_source.py +74 -0
  59. mlflow/data/spark_delta_utils.py +118 -0
  60. mlflow/data/tensorflow_dataset.py +350 -0
  61. mlflow/data/uc_volume_dataset_source.py +81 -0
  62. mlflow/db.py +27 -0
  63. mlflow/dspy/__init__.py +17 -0
  64. mlflow/dspy/autolog.py +197 -0
  65. mlflow/dspy/callback.py +398 -0
  66. mlflow/dspy/constant.py +1 -0
  67. mlflow/dspy/load.py +93 -0
  68. mlflow/dspy/save.py +393 -0
  69. mlflow/dspy/util.py +109 -0
  70. mlflow/dspy/wrapper.py +226 -0
  71. mlflow/entities/__init__.py +104 -0
  72. mlflow/entities/_mlflow_object.py +52 -0
  73. mlflow/entities/assessment.py +545 -0
  74. mlflow/entities/assessment_error.py +80 -0
  75. mlflow/entities/assessment_source.py +141 -0
  76. mlflow/entities/dataset.py +92 -0
  77. mlflow/entities/dataset_input.py +51 -0
  78. mlflow/entities/dataset_summary.py +62 -0
  79. mlflow/entities/document.py +48 -0
  80. mlflow/entities/experiment.py +109 -0
  81. mlflow/entities/experiment_tag.py +35 -0
  82. mlflow/entities/file_info.py +45 -0
  83. mlflow/entities/input_tag.py +35 -0
  84. mlflow/entities/lifecycle_stage.py +35 -0
  85. mlflow/entities/logged_model.py +228 -0
  86. mlflow/entities/logged_model_input.py +26 -0
  87. mlflow/entities/logged_model_output.py +32 -0
  88. mlflow/entities/logged_model_parameter.py +46 -0
  89. mlflow/entities/logged_model_status.py +74 -0
  90. mlflow/entities/logged_model_tag.py +33 -0
  91. mlflow/entities/metric.py +200 -0
  92. mlflow/entities/model_registry/__init__.py +29 -0
  93. mlflow/entities/model_registry/_model_registry_entity.py +13 -0
  94. mlflow/entities/model_registry/model_version.py +243 -0
  95. mlflow/entities/model_registry/model_version_deployment_job_run_state.py +44 -0
  96. mlflow/entities/model_registry/model_version_deployment_job_state.py +70 -0
  97. mlflow/entities/model_registry/model_version_search.py +25 -0
  98. mlflow/entities/model_registry/model_version_stages.py +25 -0
  99. mlflow/entities/model_registry/model_version_status.py +35 -0
  100. mlflow/entities/model_registry/model_version_tag.py +35 -0
  101. mlflow/entities/model_registry/prompt.py +73 -0
  102. mlflow/entities/model_registry/prompt_version.py +244 -0
  103. mlflow/entities/model_registry/registered_model.py +175 -0
  104. mlflow/entities/model_registry/registered_model_alias.py +35 -0
  105. mlflow/entities/model_registry/registered_model_deployment_job_state.py +39 -0
  106. mlflow/entities/model_registry/registered_model_search.py +25 -0
  107. mlflow/entities/model_registry/registered_model_tag.py +35 -0
  108. mlflow/entities/multipart_upload.py +74 -0
  109. mlflow/entities/param.py +49 -0
  110. mlflow/entities/run.py +97 -0
  111. mlflow/entities/run_data.py +84 -0
  112. mlflow/entities/run_info.py +188 -0
  113. mlflow/entities/run_inputs.py +59 -0
  114. mlflow/entities/run_outputs.py +43 -0
  115. mlflow/entities/run_status.py +41 -0
  116. mlflow/entities/run_tag.py +36 -0
  117. mlflow/entities/source_type.py +31 -0
  118. mlflow/entities/span.py +774 -0
  119. mlflow/entities/span_event.py +96 -0
  120. mlflow/entities/span_status.py +102 -0
  121. mlflow/entities/trace.py +317 -0
  122. mlflow/entities/trace_data.py +71 -0
  123. mlflow/entities/trace_info.py +220 -0
  124. mlflow/entities/trace_info_v2.py +162 -0
  125. mlflow/entities/trace_location.py +173 -0
  126. mlflow/entities/trace_state.py +39 -0
  127. mlflow/entities/trace_status.py +68 -0
  128. mlflow/entities/view_type.py +51 -0
  129. mlflow/environment_variables.py +866 -0
  130. mlflow/evaluation/__init__.py +16 -0
  131. mlflow/evaluation/assessment.py +369 -0
  132. mlflow/evaluation/evaluation.py +411 -0
  133. mlflow/evaluation/evaluation_tag.py +61 -0
  134. mlflow/evaluation/fluent.py +48 -0
  135. mlflow/evaluation/utils.py +201 -0
  136. mlflow/exceptions.py +213 -0
  137. mlflow/experiments.py +140 -0
  138. mlflow/gemini/__init__.py +81 -0
  139. mlflow/gemini/autolog.py +186 -0
  140. mlflow/gemini/chat.py +261 -0
  141. mlflow/genai/__init__.py +71 -0
  142. mlflow/genai/datasets/__init__.py +67 -0
  143. mlflow/genai/datasets/evaluation_dataset.py +131 -0
  144. mlflow/genai/evaluation/__init__.py +3 -0
  145. mlflow/genai/evaluation/base.py +411 -0
  146. mlflow/genai/evaluation/constant.py +23 -0
  147. mlflow/genai/evaluation/utils.py +244 -0
  148. mlflow/genai/judges/__init__.py +21 -0
  149. mlflow/genai/judges/databricks.py +404 -0
  150. mlflow/genai/label_schemas/__init__.py +153 -0
  151. mlflow/genai/label_schemas/label_schemas.py +209 -0
  152. mlflow/genai/labeling/__init__.py +159 -0
  153. mlflow/genai/labeling/labeling.py +250 -0
  154. mlflow/genai/optimize/__init__.py +13 -0
  155. mlflow/genai/optimize/base.py +198 -0
  156. mlflow/genai/optimize/optimizers/__init__.py +4 -0
  157. mlflow/genai/optimize/optimizers/base_optimizer.py +38 -0
  158. mlflow/genai/optimize/optimizers/dspy_mipro_optimizer.py +221 -0
  159. mlflow/genai/optimize/optimizers/dspy_optimizer.py +91 -0
  160. mlflow/genai/optimize/optimizers/utils/dspy_mipro_callback.py +76 -0
  161. mlflow/genai/optimize/optimizers/utils/dspy_mipro_utils.py +18 -0
  162. mlflow/genai/optimize/types.py +75 -0
  163. mlflow/genai/optimize/util.py +30 -0
  164. mlflow/genai/prompts/__init__.py +206 -0
  165. mlflow/genai/scheduled_scorers.py +431 -0
  166. mlflow/genai/scorers/__init__.py +26 -0
  167. mlflow/genai/scorers/base.py +492 -0
  168. mlflow/genai/scorers/builtin_scorers.py +765 -0
  169. mlflow/genai/scorers/scorer_utils.py +138 -0
  170. mlflow/genai/scorers/validation.py +165 -0
  171. mlflow/genai/utils/data_validation.py +146 -0
  172. mlflow/genai/utils/enum_utils.py +23 -0
  173. mlflow/genai/utils/trace_utils.py +211 -0
  174. mlflow/groq/__init__.py +42 -0
  175. mlflow/groq/_groq_autolog.py +74 -0
  176. mlflow/johnsnowlabs/__init__.py +888 -0
  177. mlflow/langchain/__init__.py +24 -0
  178. mlflow/langchain/api_request_parallel_processor.py +330 -0
  179. mlflow/langchain/autolog.py +147 -0
  180. mlflow/langchain/chat_agent_langgraph.py +340 -0
  181. mlflow/langchain/constant.py +1 -0
  182. mlflow/langchain/constants.py +1 -0
  183. mlflow/langchain/databricks_dependencies.py +444 -0
  184. mlflow/langchain/langchain_tracer.py +597 -0
  185. mlflow/langchain/model.py +919 -0
  186. mlflow/langchain/output_parsers.py +142 -0
  187. mlflow/langchain/retriever_chain.py +153 -0
  188. mlflow/langchain/runnables.py +527 -0
  189. mlflow/langchain/utils/chat.py +402 -0
  190. mlflow/langchain/utils/logging.py +671 -0
  191. mlflow/langchain/utils/serialization.py +36 -0
  192. mlflow/legacy_databricks_cli/__init__.py +0 -0
  193. mlflow/legacy_databricks_cli/configure/__init__.py +0 -0
  194. mlflow/legacy_databricks_cli/configure/provider.py +482 -0
  195. mlflow/litellm/__init__.py +175 -0
  196. mlflow/llama_index/__init__.py +22 -0
  197. mlflow/llama_index/autolog.py +55 -0
  198. mlflow/llama_index/chat.py +43 -0
  199. mlflow/llama_index/constant.py +1 -0
  200. mlflow/llama_index/model.py +577 -0
  201. mlflow/llama_index/pyfunc_wrapper.py +332 -0
  202. mlflow/llama_index/serialize_objects.py +188 -0
  203. mlflow/llama_index/tracer.py +561 -0
  204. mlflow/metrics/__init__.py +479 -0
  205. mlflow/metrics/base.py +39 -0
  206. mlflow/metrics/genai/__init__.py +25 -0
  207. mlflow/metrics/genai/base.py +101 -0
  208. mlflow/metrics/genai/genai_metric.py +771 -0
  209. mlflow/metrics/genai/metric_definitions.py +450 -0
  210. mlflow/metrics/genai/model_utils.py +371 -0
  211. mlflow/metrics/genai/prompt_template.py +68 -0
  212. mlflow/metrics/genai/prompts/__init__.py +0 -0
  213. mlflow/metrics/genai/prompts/v1.py +422 -0
  214. mlflow/metrics/genai/utils.py +6 -0
  215. mlflow/metrics/metric_definitions.py +619 -0
  216. mlflow/mismatch.py +34 -0
  217. mlflow/mistral/__init__.py +34 -0
  218. mlflow/mistral/autolog.py +71 -0
  219. mlflow/mistral/chat.py +135 -0
  220. mlflow/ml_package_versions.py +452 -0
  221. mlflow/models/__init__.py +97 -0
  222. mlflow/models/auth_policy.py +83 -0
  223. mlflow/models/cli.py +354 -0
  224. mlflow/models/container/__init__.py +294 -0
  225. mlflow/models/container/scoring_server/__init__.py +0 -0
  226. mlflow/models/container/scoring_server/nginx.conf +39 -0
  227. mlflow/models/dependencies_schemas.py +287 -0
  228. mlflow/models/display_utils.py +158 -0
  229. mlflow/models/docker_utils.py +211 -0
  230. mlflow/models/evaluation/__init__.py +23 -0
  231. mlflow/models/evaluation/_shap_patch.py +64 -0
  232. mlflow/models/evaluation/artifacts.py +194 -0
  233. mlflow/models/evaluation/base.py +1811 -0
  234. mlflow/models/evaluation/calibration_curve.py +109 -0
  235. mlflow/models/evaluation/default_evaluator.py +996 -0
  236. mlflow/models/evaluation/deprecated.py +23 -0
  237. mlflow/models/evaluation/evaluator_registry.py +80 -0
  238. mlflow/models/evaluation/evaluators/classifier.py +704 -0
  239. mlflow/models/evaluation/evaluators/default.py +233 -0
  240. mlflow/models/evaluation/evaluators/regressor.py +96 -0
  241. mlflow/models/evaluation/evaluators/shap.py +296 -0
  242. mlflow/models/evaluation/lift_curve.py +178 -0
  243. mlflow/models/evaluation/utils/metric.py +123 -0
  244. mlflow/models/evaluation/utils/trace.py +179 -0
  245. mlflow/models/evaluation/validation.py +434 -0
  246. mlflow/models/flavor_backend.py +93 -0
  247. mlflow/models/flavor_backend_registry.py +53 -0
  248. mlflow/models/model.py +1639 -0
  249. mlflow/models/model_config.py +150 -0
  250. mlflow/models/notebook_resources/agent_evaluation_template.html +235 -0
  251. mlflow/models/notebook_resources/eval_with_dataset_example.py +22 -0
  252. mlflow/models/notebook_resources/eval_with_synthetic_example.py +22 -0
  253. mlflow/models/python_api.py +369 -0
  254. mlflow/models/rag_signatures.py +128 -0
  255. mlflow/models/resources.py +321 -0
  256. mlflow/models/signature.py +662 -0
  257. mlflow/models/utils.py +2054 -0
  258. mlflow/models/wheeled_model.py +280 -0
  259. mlflow/openai/__init__.py +57 -0
  260. mlflow/openai/_agent_tracer.py +364 -0
  261. mlflow/openai/api_request_parallel_processor.py +131 -0
  262. mlflow/openai/autolog.py +509 -0
  263. mlflow/openai/constant.py +1 -0
  264. mlflow/openai/model.py +824 -0
  265. mlflow/openai/utils/chat_schema.py +367 -0
  266. mlflow/optuna/__init__.py +3 -0
  267. mlflow/optuna/storage.py +646 -0
  268. mlflow/plugins/__init__.py +72 -0
  269. mlflow/plugins/base.py +358 -0
  270. mlflow/plugins/builtin/__init__.py +24 -0
  271. mlflow/plugins/builtin/pytorch_plugin.py +150 -0
  272. mlflow/plugins/builtin/sklearn_plugin.py +158 -0
  273. mlflow/plugins/builtin/transformers_plugin.py +187 -0
  274. mlflow/plugins/cli.py +321 -0
  275. mlflow/plugins/discovery.py +340 -0
  276. mlflow/plugins/manager.py +465 -0
  277. mlflow/plugins/registry.py +316 -0
  278. mlflow/plugins/templates/framework_plugin_template.py +329 -0
  279. mlflow/prompt/constants.py +20 -0
  280. mlflow/prompt/promptlab_model.py +197 -0
  281. mlflow/prompt/registry_utils.py +248 -0
  282. mlflow/promptflow/__init__.py +495 -0
  283. mlflow/protos/__init__.py +0 -0
  284. mlflow/protos/assessments_pb2.py +174 -0
  285. mlflow/protos/databricks_artifacts_pb2.py +489 -0
  286. mlflow/protos/databricks_filesystem_service_pb2.py +196 -0
  287. mlflow/protos/databricks_managed_catalog_messages_pb2.py +95 -0
  288. mlflow/protos/databricks_managed_catalog_service_pb2.py +86 -0
  289. mlflow/protos/databricks_pb2.py +267 -0
  290. mlflow/protos/databricks_trace_server_pb2.py +374 -0
  291. mlflow/protos/databricks_uc_registry_messages_pb2.py +1249 -0
  292. mlflow/protos/databricks_uc_registry_service_pb2.py +170 -0
  293. mlflow/protos/facet_feature_statistics_pb2.py +296 -0
  294. mlflow/protos/internal_pb2.py +77 -0
  295. mlflow/protos/mlflow_artifacts_pb2.py +336 -0
  296. mlflow/protos/model_registry_pb2.py +1073 -0
  297. mlflow/protos/scalapb/__init__.py +0 -0
  298. mlflow/protos/scalapb/scalapb_pb2.py +104 -0
  299. mlflow/protos/service_pb2.py +2600 -0
  300. mlflow/protos/unity_catalog_oss_messages_pb2.py +457 -0
  301. mlflow/protos/unity_catalog_oss_service_pb2.py +130 -0
  302. mlflow/protos/unity_catalog_prompt_messages_pb2.py +447 -0
  303. mlflow/protos/unity_catalog_prompt_messages_pb2_grpc.py +24 -0
  304. mlflow/protos/unity_catalog_prompt_service_pb2.py +164 -0
  305. mlflow/protos/unity_catalog_prompt_service_pb2_grpc.py +785 -0
  306. mlflow/py.typed +0 -0
  307. mlflow/pydantic_ai/__init__.py +57 -0
  308. mlflow/pydantic_ai/autolog.py +173 -0
  309. mlflow/pyfunc/__init__.py +3844 -0
  310. mlflow/pyfunc/_mlflow_pyfunc_backend_predict.py +61 -0
  311. mlflow/pyfunc/backend.py +523 -0
  312. mlflow/pyfunc/context.py +78 -0
  313. mlflow/pyfunc/dbconnect_artifact_cache.py +144 -0
  314. mlflow/pyfunc/loaders/__init__.py +7 -0
  315. mlflow/pyfunc/loaders/chat_agent.py +117 -0
  316. mlflow/pyfunc/loaders/chat_model.py +125 -0
  317. mlflow/pyfunc/loaders/code_model.py +31 -0
  318. mlflow/pyfunc/loaders/responses_agent.py +112 -0
  319. mlflow/pyfunc/mlserver.py +46 -0
  320. mlflow/pyfunc/model.py +1473 -0
  321. mlflow/pyfunc/scoring_server/__init__.py +604 -0
  322. mlflow/pyfunc/scoring_server/app.py +7 -0
  323. mlflow/pyfunc/scoring_server/client.py +146 -0
  324. mlflow/pyfunc/spark_model_cache.py +48 -0
  325. mlflow/pyfunc/stdin_server.py +44 -0
  326. mlflow/pyfunc/utils/__init__.py +3 -0
  327. mlflow/pyfunc/utils/data_validation.py +224 -0
  328. mlflow/pyfunc/utils/environment.py +22 -0
  329. mlflow/pyfunc/utils/input_converter.py +47 -0
  330. mlflow/pyfunc/utils/serving_data_parser.py +11 -0
  331. mlflow/pytorch/__init__.py +1171 -0
  332. mlflow/pytorch/_lightning_autolog.py +580 -0
  333. mlflow/pytorch/_pytorch_autolog.py +50 -0
  334. mlflow/pytorch/pickle_module.py +35 -0
  335. mlflow/rfunc/__init__.py +42 -0
  336. mlflow/rfunc/backend.py +134 -0
  337. mlflow/runs.py +89 -0
  338. mlflow/server/__init__.py +302 -0
  339. mlflow/server/auth/__init__.py +1224 -0
  340. mlflow/server/auth/__main__.py +4 -0
  341. mlflow/server/auth/basic_auth.ini +6 -0
  342. mlflow/server/auth/cli.py +11 -0
  343. mlflow/server/auth/client.py +537 -0
  344. mlflow/server/auth/config.py +34 -0
  345. mlflow/server/auth/db/__init__.py +0 -0
  346. mlflow/server/auth/db/cli.py +18 -0
  347. mlflow/server/auth/db/migrations/__init__.py +0 -0
  348. mlflow/server/auth/db/migrations/alembic.ini +110 -0
  349. mlflow/server/auth/db/migrations/env.py +76 -0
  350. mlflow/server/auth/db/migrations/versions/8606fa83a998_initial_migration.py +51 -0
  351. mlflow/server/auth/db/migrations/versions/__init__.py +0 -0
  352. mlflow/server/auth/db/models.py +67 -0
  353. mlflow/server/auth/db/utils.py +37 -0
  354. mlflow/server/auth/entities.py +165 -0
  355. mlflow/server/auth/logo.py +14 -0
  356. mlflow/server/auth/permissions.py +65 -0
  357. mlflow/server/auth/routes.py +18 -0
  358. mlflow/server/auth/sqlalchemy_store.py +263 -0
  359. mlflow/server/graphql/__init__.py +0 -0
  360. mlflow/server/graphql/autogenerated_graphql_schema.py +353 -0
  361. mlflow/server/graphql/graphql_custom_scalars.py +24 -0
  362. mlflow/server/graphql/graphql_errors.py +15 -0
  363. mlflow/server/graphql/graphql_no_batching.py +89 -0
  364. mlflow/server/graphql/graphql_schema_extensions.py +74 -0
  365. mlflow/server/handlers.py +3217 -0
  366. mlflow/server/prometheus_exporter.py +17 -0
  367. mlflow/server/validation.py +30 -0
  368. mlflow/shap/__init__.py +691 -0
  369. mlflow/sklearn/__init__.py +1994 -0
  370. mlflow/sklearn/utils.py +1041 -0
  371. mlflow/smolagents/__init__.py +66 -0
  372. mlflow/smolagents/autolog.py +139 -0
  373. mlflow/smolagents/chat.py +29 -0
  374. mlflow/store/__init__.py +10 -0
  375. mlflow/store/_unity_catalog/__init__.py +1 -0
  376. mlflow/store/_unity_catalog/lineage/__init__.py +1 -0
  377. mlflow/store/_unity_catalog/lineage/constants.py +2 -0
  378. mlflow/store/_unity_catalog/registry/__init__.py +6 -0
  379. mlflow/store/_unity_catalog/registry/prompt_info.py +75 -0
  380. mlflow/store/_unity_catalog/registry/rest_store.py +1740 -0
  381. mlflow/store/_unity_catalog/registry/uc_oss_rest_store.py +507 -0
  382. mlflow/store/_unity_catalog/registry/utils.py +121 -0
  383. mlflow/store/artifact/__init__.py +0 -0
  384. mlflow/store/artifact/artifact_repo.py +472 -0
  385. mlflow/store/artifact/artifact_repository_registry.py +154 -0
  386. mlflow/store/artifact/azure_blob_artifact_repo.py +275 -0
  387. mlflow/store/artifact/azure_data_lake_artifact_repo.py +295 -0
  388. mlflow/store/artifact/cli.py +141 -0
  389. mlflow/store/artifact/cloud_artifact_repo.py +332 -0
  390. mlflow/store/artifact/databricks_artifact_repo.py +729 -0
  391. mlflow/store/artifact/databricks_artifact_repo_resources.py +301 -0
  392. mlflow/store/artifact/databricks_logged_model_artifact_repo.py +93 -0
  393. mlflow/store/artifact/databricks_models_artifact_repo.py +216 -0
  394. mlflow/store/artifact/databricks_sdk_artifact_repo.py +134 -0
  395. mlflow/store/artifact/databricks_sdk_models_artifact_repo.py +97 -0
  396. mlflow/store/artifact/dbfs_artifact_repo.py +240 -0
  397. mlflow/store/artifact/ftp_artifact_repo.py +132 -0
  398. mlflow/store/artifact/gcs_artifact_repo.py +296 -0
  399. mlflow/store/artifact/hdfs_artifact_repo.py +209 -0
  400. mlflow/store/artifact/http_artifact_repo.py +218 -0
  401. mlflow/store/artifact/local_artifact_repo.py +142 -0
  402. mlflow/store/artifact/mlflow_artifacts_repo.py +94 -0
  403. mlflow/store/artifact/models_artifact_repo.py +259 -0
  404. mlflow/store/artifact/optimized_s3_artifact_repo.py +356 -0
  405. mlflow/store/artifact/presigned_url_artifact_repo.py +173 -0
  406. mlflow/store/artifact/r2_artifact_repo.py +70 -0
  407. mlflow/store/artifact/runs_artifact_repo.py +265 -0
  408. mlflow/store/artifact/s3_artifact_repo.py +330 -0
  409. mlflow/store/artifact/sftp_artifact_repo.py +141 -0
  410. mlflow/store/artifact/uc_volume_artifact_repo.py +76 -0
  411. mlflow/store/artifact/unity_catalog_models_artifact_repo.py +168 -0
  412. mlflow/store/artifact/unity_catalog_oss_models_artifact_repo.py +168 -0
  413. mlflow/store/artifact/utils/__init__.py +0 -0
  414. mlflow/store/artifact/utils/models.py +148 -0
  415. mlflow/store/db/__init__.py +0 -0
  416. mlflow/store/db/base_sql_model.py +3 -0
  417. mlflow/store/db/db_types.py +10 -0
  418. mlflow/store/db/utils.py +314 -0
  419. mlflow/store/db_migrations/__init__.py +0 -0
  420. mlflow/store/db_migrations/alembic.ini +74 -0
  421. mlflow/store/db_migrations/env.py +84 -0
  422. mlflow/store/db_migrations/versions/0584bdc529eb_add_cascading_deletion_to_datasets_from_experiments.py +88 -0
  423. mlflow/store/db_migrations/versions/0a8213491aaa_drop_duplicate_killed_constraint.py +49 -0
  424. mlflow/store/db_migrations/versions/0c779009ac13_add_deleted_time_field_to_runs_table.py +24 -0
  425. mlflow/store/db_migrations/versions/181f10493468_allow_nulls_for_metric_values.py +35 -0
  426. mlflow/store/db_migrations/versions/27a6a02d2cf1_add_model_version_tags_table.py +38 -0
  427. mlflow/store/db_migrations/versions/2b4d017a5e9b_add_model_registry_tables_to_db.py +77 -0
  428. mlflow/store/db_migrations/versions/2d6e25af4d3e_increase_max_param_val_length.py +33 -0
  429. mlflow/store/db_migrations/versions/3500859a5d39_add_model_aliases_table.py +50 -0
  430. mlflow/store/db_migrations/versions/39d1c3be5f05_add_is_nan_constraint_for_metrics_tables_if_necessary.py +41 -0
  431. mlflow/store/db_migrations/versions/400f98739977_add_logged_model_tables.py +123 -0
  432. mlflow/store/db_migrations/versions/4465047574b1_increase_max_dataset_schema_size.py +38 -0
  433. mlflow/store/db_migrations/versions/451aebb31d03_add_metric_step.py +35 -0
  434. mlflow/store/db_migrations/versions/5b0e9adcef9c_add_cascade_deletion_to_trace_tables_fk.py +40 -0
  435. mlflow/store/db_migrations/versions/6953534de441_add_step_to_inputs_table.py +25 -0
  436. mlflow/store/db_migrations/versions/728d730b5ebd_add_registered_model_tags_table.py +38 -0
  437. mlflow/store/db_migrations/versions/7ac759974ad8_update_run_tags_with_larger_limit.py +36 -0
  438. mlflow/store/db_migrations/versions/7f2a7d5fae7d_add_datasets_inputs_input_tags_tables.py +82 -0
  439. mlflow/store/db_migrations/versions/84291f40a231_add_run_link_to_model_version.py +26 -0
  440. mlflow/store/db_migrations/versions/867495a8f9d4_add_trace_tables.py +90 -0
  441. mlflow/store/db_migrations/versions/89d4b8295536_create_latest_metrics_table.py +169 -0
  442. mlflow/store/db_migrations/versions/90e64c465722_migrate_user_column_to_tags.py +64 -0
  443. mlflow/store/db_migrations/versions/97727af70f4d_creation_time_last_update_time_experiments.py +25 -0
  444. mlflow/store/db_migrations/versions/__init__.py +0 -0
  445. mlflow/store/db_migrations/versions/a8c4a736bde6_allow_nulls_for_run_id.py +27 -0
  446. mlflow/store/db_migrations/versions/acf3f17fdcc7_add_storage_location_field_to_model_.py +29 -0
  447. mlflow/store/db_migrations/versions/bd07f7e963c5_create_index_on_run_uuid.py +26 -0
  448. mlflow/store/db_migrations/versions/bda7b8c39065_increase_model_version_tag_value_limit.py +38 -0
  449. mlflow/store/db_migrations/versions/c48cb773bb87_reset_default_value_for_is_nan_in_metrics_table_for_mysql.py +41 -0
  450. mlflow/store/db_migrations/versions/cbc13b556ace_add_v3_trace_schema_columns.py +31 -0
  451. mlflow/store/db_migrations/versions/cc1f77228345_change_param_value_length_to_500.py +34 -0
  452. mlflow/store/db_migrations/versions/cfd24bdc0731_update_run_status_constraint_with_killed.py +78 -0
  453. mlflow/store/db_migrations/versions/df50e92ffc5e_add_experiment_tags_table.py +38 -0
  454. mlflow/store/db_migrations/versions/f5a4f2784254_increase_run_tag_value_limit.py +36 -0
  455. mlflow/store/entities/__init__.py +3 -0
  456. mlflow/store/entities/paged_list.py +18 -0
  457. mlflow/store/model_registry/__init__.py +10 -0
  458. mlflow/store/model_registry/abstract_store.py +1081 -0
  459. mlflow/store/model_registry/base_rest_store.py +44 -0
  460. mlflow/store/model_registry/databricks_workspace_model_registry_rest_store.py +37 -0
  461. mlflow/store/model_registry/dbmodels/__init__.py +0 -0
  462. mlflow/store/model_registry/dbmodels/models.py +206 -0
  463. mlflow/store/model_registry/file_store.py +1091 -0
  464. mlflow/store/model_registry/rest_store.py +481 -0
  465. mlflow/store/model_registry/sqlalchemy_store.py +1286 -0
  466. mlflow/store/tracking/__init__.py +23 -0
  467. mlflow/store/tracking/abstract_store.py +816 -0
  468. mlflow/store/tracking/dbmodels/__init__.py +0 -0
  469. mlflow/store/tracking/dbmodels/initial_models.py +243 -0
  470. mlflow/store/tracking/dbmodels/models.py +1073 -0
  471. mlflow/store/tracking/file_store.py +2438 -0
  472. mlflow/store/tracking/postgres_managed_identity.py +146 -0
  473. mlflow/store/tracking/rest_store.py +1131 -0
  474. mlflow/store/tracking/sqlalchemy_store.py +2785 -0
  475. mlflow/system_metrics/__init__.py +61 -0
  476. mlflow/system_metrics/metrics/__init__.py +0 -0
  477. mlflow/system_metrics/metrics/base_metrics_monitor.py +32 -0
  478. mlflow/system_metrics/metrics/cpu_monitor.py +23 -0
  479. mlflow/system_metrics/metrics/disk_monitor.py +21 -0
  480. mlflow/system_metrics/metrics/gpu_monitor.py +71 -0
  481. mlflow/system_metrics/metrics/network_monitor.py +34 -0
  482. mlflow/system_metrics/metrics/rocm_monitor.py +123 -0
  483. mlflow/system_metrics/system_metrics_monitor.py +198 -0
  484. mlflow/tracing/__init__.py +16 -0
  485. mlflow/tracing/assessment.py +356 -0
  486. mlflow/tracing/client.py +531 -0
  487. mlflow/tracing/config.py +125 -0
  488. mlflow/tracing/constant.py +105 -0
  489. mlflow/tracing/destination.py +81 -0
  490. mlflow/tracing/display/__init__.py +40 -0
  491. mlflow/tracing/display/display_handler.py +196 -0
  492. mlflow/tracing/export/async_export_queue.py +186 -0
  493. mlflow/tracing/export/inference_table.py +138 -0
  494. mlflow/tracing/export/mlflow_v3.py +137 -0
  495. mlflow/tracing/export/utils.py +70 -0
  496. mlflow/tracing/fluent.py +1417 -0
  497. mlflow/tracing/processor/base_mlflow.py +199 -0
  498. mlflow/tracing/processor/inference_table.py +175 -0
  499. mlflow/tracing/processor/mlflow_v3.py +47 -0
  500. mlflow/tracing/processor/otel.py +73 -0
  501. mlflow/tracing/provider.py +487 -0
  502. mlflow/tracing/trace_manager.py +200 -0
  503. mlflow/tracing/utils/__init__.py +616 -0
  504. mlflow/tracing/utils/artifact_utils.py +28 -0
  505. mlflow/tracing/utils/copy.py +55 -0
  506. mlflow/tracing/utils/environment.py +55 -0
  507. mlflow/tracing/utils/exception.py +21 -0
  508. mlflow/tracing/utils/once.py +35 -0
  509. mlflow/tracing/utils/otlp.py +63 -0
  510. mlflow/tracing/utils/processor.py +54 -0
  511. mlflow/tracing/utils/search.py +292 -0
  512. mlflow/tracing/utils/timeout.py +250 -0
  513. mlflow/tracing/utils/token.py +19 -0
  514. mlflow/tracing/utils/truncation.py +124 -0
  515. mlflow/tracing/utils/warning.py +76 -0
  516. mlflow/tracking/__init__.py +39 -0
  517. mlflow/tracking/_model_registry/__init__.py +1 -0
  518. mlflow/tracking/_model_registry/client.py +764 -0
  519. mlflow/tracking/_model_registry/fluent.py +853 -0
  520. mlflow/tracking/_model_registry/registry.py +67 -0
  521. mlflow/tracking/_model_registry/utils.py +251 -0
  522. mlflow/tracking/_tracking_service/__init__.py +0 -0
  523. mlflow/tracking/_tracking_service/client.py +883 -0
  524. mlflow/tracking/_tracking_service/registry.py +56 -0
  525. mlflow/tracking/_tracking_service/utils.py +275 -0
  526. mlflow/tracking/artifact_utils.py +179 -0
  527. mlflow/tracking/client.py +5900 -0
  528. mlflow/tracking/context/__init__.py +0 -0
  529. mlflow/tracking/context/abstract_context.py +35 -0
  530. mlflow/tracking/context/databricks_cluster_context.py +15 -0
  531. mlflow/tracking/context/databricks_command_context.py +15 -0
  532. mlflow/tracking/context/databricks_job_context.py +49 -0
  533. mlflow/tracking/context/databricks_notebook_context.py +41 -0
  534. mlflow/tracking/context/databricks_repo_context.py +43 -0
  535. mlflow/tracking/context/default_context.py +51 -0
  536. mlflow/tracking/context/git_context.py +32 -0
  537. mlflow/tracking/context/registry.py +98 -0
  538. mlflow/tracking/context/system_environment_context.py +15 -0
  539. mlflow/tracking/default_experiment/__init__.py +1 -0
  540. mlflow/tracking/default_experiment/abstract_context.py +43 -0
  541. mlflow/tracking/default_experiment/databricks_notebook_experiment_provider.py +44 -0
  542. mlflow/tracking/default_experiment/registry.py +75 -0
  543. mlflow/tracking/fluent.py +3595 -0
  544. mlflow/tracking/metric_value_conversion_utils.py +93 -0
  545. mlflow/tracking/multimedia.py +206 -0
  546. mlflow/tracking/registry.py +86 -0
  547. mlflow/tracking/request_auth/__init__.py +0 -0
  548. mlflow/tracking/request_auth/abstract_request_auth_provider.py +34 -0
  549. mlflow/tracking/request_auth/registry.py +60 -0
  550. mlflow/tracking/request_header/__init__.py +0 -0
  551. mlflow/tracking/request_header/abstract_request_header_provider.py +36 -0
  552. mlflow/tracking/request_header/databricks_request_header_provider.py +38 -0
  553. mlflow/tracking/request_header/default_request_header_provider.py +17 -0
  554. mlflow/tracking/request_header/registry.py +79 -0
  555. mlflow/transformers/__init__.py +2982 -0
  556. mlflow/transformers/flavor_config.py +258 -0
  557. mlflow/transformers/hub_utils.py +83 -0
  558. mlflow/transformers/llm_inference_utils.py +468 -0
  559. mlflow/transformers/model_io.py +301 -0
  560. mlflow/transformers/peft.py +51 -0
  561. mlflow/transformers/signature.py +183 -0
  562. mlflow/transformers/torch_utils.py +55 -0
  563. mlflow/types/__init__.py +21 -0
  564. mlflow/types/agent.py +270 -0
  565. mlflow/types/chat.py +240 -0
  566. mlflow/types/llm.py +935 -0
  567. mlflow/types/responses.py +139 -0
  568. mlflow/types/responses_helpers.py +416 -0
  569. mlflow/types/schema.py +1505 -0
  570. mlflow/types/type_hints.py +647 -0
  571. mlflow/types/utils.py +753 -0
  572. mlflow/utils/__init__.py +283 -0
  573. mlflow/utils/_capture_modules.py +256 -0
  574. mlflow/utils/_capture_transformers_modules.py +75 -0
  575. mlflow/utils/_spark_utils.py +201 -0
  576. mlflow/utils/_unity_catalog_oss_utils.py +97 -0
  577. mlflow/utils/_unity_catalog_utils.py +479 -0
  578. mlflow/utils/annotations.py +218 -0
  579. mlflow/utils/arguments_utils.py +16 -0
  580. mlflow/utils/async_logging/__init__.py +1 -0
  581. mlflow/utils/async_logging/async_artifacts_logging_queue.py +258 -0
  582. mlflow/utils/async_logging/async_logging_queue.py +366 -0
  583. mlflow/utils/async_logging/run_artifact.py +38 -0
  584. mlflow/utils/async_logging/run_batch.py +58 -0
  585. mlflow/utils/async_logging/run_operations.py +49 -0
  586. mlflow/utils/autologging_utils/__init__.py +737 -0
  587. mlflow/utils/autologging_utils/client.py +432 -0
  588. mlflow/utils/autologging_utils/config.py +33 -0
  589. mlflow/utils/autologging_utils/events.py +294 -0
  590. mlflow/utils/autologging_utils/logging_and_warnings.py +328 -0
  591. mlflow/utils/autologging_utils/metrics_queue.py +71 -0
  592. mlflow/utils/autologging_utils/safety.py +1104 -0
  593. mlflow/utils/autologging_utils/versioning.py +95 -0
  594. mlflow/utils/checkpoint_utils.py +206 -0
  595. mlflow/utils/class_utils.py +6 -0
  596. mlflow/utils/cli_args.py +257 -0
  597. mlflow/utils/conda.py +354 -0
  598. mlflow/utils/credentials.py +231 -0
  599. mlflow/utils/data_utils.py +17 -0
  600. mlflow/utils/databricks_utils.py +1436 -0
  601. mlflow/utils/docstring_utils.py +477 -0
  602. mlflow/utils/doctor.py +133 -0
  603. mlflow/utils/download_cloud_file_chunk.py +43 -0
  604. mlflow/utils/env_manager.py +16 -0
  605. mlflow/utils/env_pack.py +131 -0
  606. mlflow/utils/environment.py +1009 -0
  607. mlflow/utils/exception_utils.py +14 -0
  608. mlflow/utils/file_utils.py +978 -0
  609. mlflow/utils/git_utils.py +77 -0
  610. mlflow/utils/gorilla.py +797 -0
  611. mlflow/utils/import_hooks/__init__.py +363 -0
  612. mlflow/utils/lazy_load.py +51 -0
  613. mlflow/utils/logging_utils.py +168 -0
  614. mlflow/utils/mime_type_utils.py +58 -0
  615. mlflow/utils/mlflow_tags.py +103 -0
  616. mlflow/utils/model_utils.py +486 -0
  617. mlflow/utils/name_utils.py +346 -0
  618. mlflow/utils/nfs_on_spark.py +62 -0
  619. mlflow/utils/openai_utils.py +164 -0
  620. mlflow/utils/os.py +12 -0
  621. mlflow/utils/oss_registry_utils.py +29 -0
  622. mlflow/utils/plugins.py +17 -0
  623. mlflow/utils/process.py +182 -0
  624. mlflow/utils/promptlab_utils.py +146 -0
  625. mlflow/utils/proto_json_utils.py +743 -0
  626. mlflow/utils/pydantic_utils.py +54 -0
  627. mlflow/utils/request_utils.py +279 -0
  628. mlflow/utils/requirements_utils.py +704 -0
  629. mlflow/utils/rest_utils.py +673 -0
  630. mlflow/utils/search_logged_model_utils.py +127 -0
  631. mlflow/utils/search_utils.py +2111 -0
  632. mlflow/utils/secure_loading.py +221 -0
  633. mlflow/utils/security_validation.py +384 -0
  634. mlflow/utils/server_cli_utils.py +61 -0
  635. mlflow/utils/spark_utils.py +15 -0
  636. mlflow/utils/string_utils.py +138 -0
  637. mlflow/utils/thread_utils.py +63 -0
  638. mlflow/utils/time.py +54 -0
  639. mlflow/utils/timeout.py +42 -0
  640. mlflow/utils/uri.py +572 -0
  641. mlflow/utils/validation.py +662 -0
  642. mlflow/utils/virtualenv.py +458 -0
  643. mlflow/utils/warnings_utils.py +25 -0
  644. mlflow/utils/yaml_utils.py +179 -0
  645. mlflow/version.py +24 -0
@@ -0,0 +1,314 @@
1
+ import logging
2
+ import os
3
+ import time
4
+ from contextlib import contextmanager
5
+
6
+ import sqlalchemy
7
+ from alembic.migration import MigrationContext
8
+ from alembic.script import ScriptDirectory
9
+ from sqlalchemy import sql
10
+
11
+ # We need to import sqlalchemy.pool to convert poolclass string to class object
12
+ from sqlalchemy.pool import (
13
+ AssertionPool,
14
+ AsyncAdaptedQueuePool,
15
+ FallbackAsyncAdaptedQueuePool,
16
+ NullPool,
17
+ QueuePool,
18
+ SingletonThreadPool,
19
+ StaticPool,
20
+ )
21
+
22
+ from mlflow.environment_variables import (
23
+ MLFLOW_MYSQL_SSL_CA,
24
+ MLFLOW_MYSQL_SSL_CERT,
25
+ MLFLOW_MYSQL_SSL_KEY,
26
+ MLFLOW_SQLALCHEMYSTORE_ECHO,
27
+ MLFLOW_SQLALCHEMYSTORE_MAX_OVERFLOW,
28
+ MLFLOW_SQLALCHEMYSTORE_POOL_RECYCLE,
29
+ MLFLOW_SQLALCHEMYSTORE_POOL_SIZE,
30
+ MLFLOW_SQLALCHEMYSTORE_POOLCLASS,
31
+ )
32
+ from mlflow.exceptions import MlflowException
33
+ from mlflow.protos.databricks_pb2 import (
34
+ BAD_REQUEST,
35
+ INTERNAL_ERROR,
36
+ TEMPORARILY_UNAVAILABLE,
37
+ )
38
+ from mlflow.store.db.db_types import SQLITE
39
+ from mlflow.store.model_registry.dbmodels.models import (
40
+ SqlModelVersion,
41
+ SqlModelVersionTag,
42
+ SqlRegisteredModel,
43
+ SqlRegisteredModelAlias,
44
+ SqlRegisteredModelTag,
45
+ )
46
+ from mlflow.store.tracking.dbmodels.initial_models import Base as InitialBase
47
+ from mlflow.store.tracking.dbmodels.models import (
48
+ SqlDataset,
49
+ SqlExperiment,
50
+ SqlExperimentTag,
51
+ SqlInput,
52
+ SqlInputTag,
53
+ SqlLatestMetric,
54
+ SqlMetric,
55
+ SqlParam,
56
+ SqlRun,
57
+ SqlTag,
58
+ SqlTraceInfo,
59
+ SqlTraceMetadata,
60
+ SqlTraceTag,
61
+ )
62
+
63
+ _logger = logging.getLogger(__name__)
64
+
65
+ MAX_RETRY_COUNT = 10
66
+
67
+
68
+ def _get_package_dir():
69
+ """Returns directory containing MLflow python package."""
70
+ current_dir = os.path.dirname(os.path.abspath(__file__))
71
+ return os.path.normpath(os.path.join(current_dir, os.pardir, os.pardir))
72
+
73
+
74
+ def _all_tables_exist(engine):
75
+ return {
76
+ t
77
+ for t in sqlalchemy.inspect(engine).get_table_names()
78
+ # Filter out alembic tables
79
+ if not t.startswith("alembic_")
80
+ } == {
81
+ SqlExperiment.__tablename__,
82
+ SqlRun.__tablename__,
83
+ SqlMetric.__tablename__,
84
+ SqlParam.__tablename__,
85
+ SqlTag.__tablename__,
86
+ SqlExperimentTag.__tablename__,
87
+ SqlLatestMetric.__tablename__,
88
+ SqlRegisteredModel.__tablename__,
89
+ SqlModelVersion.__tablename__,
90
+ SqlRegisteredModelTag.__tablename__,
91
+ SqlModelVersionTag.__tablename__,
92
+ SqlRegisteredModelAlias.__tablename__,
93
+ SqlDataset.__tablename__,
94
+ SqlInput.__tablename__,
95
+ SqlInputTag.__tablename__,
96
+ SqlTraceInfo.__tablename__,
97
+ SqlTraceTag.__tablename__,
98
+ SqlTraceMetadata.__tablename__,
99
+ }
100
+
101
+
102
+ def _initialize_tables(engine):
103
+ _logger.info("Creating initial MLflow database tables...")
104
+ InitialBase.metadata.create_all(engine)
105
+ _upgrade_db(engine)
106
+
107
+
108
+ def _get_latest_schema_revision():
109
+ """Get latest schema revision as a string."""
110
+ # We aren't executing any commands against a DB, so we leave the DB URL unspecified
111
+ config = _get_alembic_config(db_url="")
112
+ script = ScriptDirectory.from_config(config)
113
+ heads = script.get_heads()
114
+ if len(heads) != 1:
115
+ raise MlflowException(
116
+ f"Migration script directory was in unexpected state. Got {len(heads)} head "
117
+ f"database versions but expected only 1. Found versions: {heads}"
118
+ )
119
+ return heads[0]
120
+
121
+
122
+ def _verify_schema(engine):
123
+ head_revision = _get_latest_schema_revision()
124
+ current_rev = _get_schema_version(engine)
125
+ if current_rev != head_revision:
126
+ raise MlflowException(
127
+ f"Detected out-of-date database schema (found version {current_rev}, "
128
+ f"but expected {head_revision}). Take a backup of your database, then run "
129
+ "'mlflow db upgrade <database_uri>' "
130
+ "to migrate your database to the latest schema. NOTE: schema migration may "
131
+ "result in database downtime - please consult your database's documentation for "
132
+ "more detail."
133
+ )
134
+
135
+
136
+ def _get_managed_session_maker(SessionMaker, db_type):
137
+ """
138
+ Creates a factory for producing exception-safe SQLAlchemy sessions that are made available
139
+ using a context manager. Any session produced by this factory is automatically committed
140
+ if no exceptions are encountered within its associated context. If an exception is
141
+ encountered, the session is rolled back. Finally, any session produced by this factory is
142
+ automatically closed when the session's associated context is exited.
143
+ """
144
+
145
+ @contextmanager
146
+ def make_managed_session():
147
+ """Provide a transactional scope around a series of operations."""
148
+ with SessionMaker() as session:
149
+ try:
150
+ if db_type == SQLITE:
151
+ session.execute(sql.text("PRAGMA foreign_keys = ON;"))
152
+ session.execute(sql.text("PRAGMA busy_timeout = 20000;"))
153
+ session.execute(sql.text("PRAGMA case_sensitive_like = true;"))
154
+ yield session
155
+ session.commit()
156
+ except MlflowException:
157
+ session.rollback()
158
+ raise
159
+ except sqlalchemy.exc.OperationalError as e:
160
+ session.rollback()
161
+ _logger.exception(
162
+ "SQLAlchemy database error. The following exception is caught.\n%s",
163
+ e,
164
+ )
165
+ raise MlflowException(message=e, error_code=TEMPORARILY_UNAVAILABLE) from e
166
+ except sqlalchemy.exc.SQLAlchemyError as e:
167
+ session.rollback()
168
+ raise MlflowException(message=e, error_code=BAD_REQUEST) from e
169
+ except Exception as e:
170
+ session.rollback()
171
+ raise MlflowException(message=e, error_code=INTERNAL_ERROR) from e
172
+
173
+ return make_managed_session
174
+
175
+
176
+ def _get_alembic_config(db_url, alembic_dir=None):
177
+ """
178
+ Constructs an alembic Config object referencing the specified database and migration script
179
+ directory.
180
+
181
+ Args:
182
+ db_url: Database URL, like sqlite:///<absolute-path-to-local-db-file>. See
183
+ https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls for a full list of
184
+ valid database URLs.
185
+ alembic_dir: Path to migration script directory. Uses canonical migration script
186
+ directory under mlflow/alembic if unspecified. TODO: remove this argument in MLflow 1.1,
187
+ as it's only used to run special migrations for pre-1.0 users to remove duplicate
188
+ constraint names.
189
+ """
190
+ from alembic.config import Config
191
+
192
+ final_alembic_dir = (
193
+ os.path.join(_get_package_dir(), "store", "db_migrations")
194
+ if alembic_dir is None
195
+ else alembic_dir
196
+ )
197
+ # Escape any '%' that appears in a db_url. This could be in a password,
198
+ # url, or anything that is part of a potentially complex database url
199
+ db_url = db_url.replace("%", "%%")
200
+ config = Config(os.path.join(final_alembic_dir, "alembic.ini"))
201
+ config.set_main_option("script_location", final_alembic_dir)
202
+ config.set_main_option("sqlalchemy.url", db_url)
203
+ return config
204
+
205
+
206
+ def _upgrade_db(engine): # noqa: D417
207
+ """
208
+ Upgrade the schema of an MLflow tracking database to the latest supported version.
209
+ Note that schema migrations can be slow and are not guaranteed to be transactional -
210
+ we recommend taking a backup of your database before running migrations.
211
+
212
+ Args:
213
+ url: Database URL, like sqlite:///<absolute-path-to-local-db-file>. See
214
+ https://docs.sqlalchemy.org/en/13/core/engines.html#database-urls for a full list of
215
+ valid database URLs.
216
+ """
217
+ # alembic adds significant import time, so we import it lazily
218
+ from alembic import command
219
+
220
+ db_url = str(engine.url)
221
+ _logger.info("Updating database tables")
222
+ config = _get_alembic_config(db_url)
223
+ # Initialize a shared connection to be used for the database upgrade, ensuring that
224
+ # any connection-dependent state (e.g., the state of an in-memory database) is preserved
225
+ # for reference by the upgrade routine. For more information, see
226
+ # https://alembic.sqlalchemy.org/en/latest/cookbook.html#sharing-a-
227
+ # connection-with-a-series-of-migration-commands-and-environments
228
+ with engine.begin() as connection:
229
+ config.attributes["connection"] = connection
230
+ command.upgrade(config, "heads")
231
+
232
+
233
+ def _get_schema_version(engine):
234
+ with engine.connect() as connection:
235
+ mc = MigrationContext.configure(connection)
236
+ return mc.get_current_revision()
237
+
238
+
239
+ def create_sqlalchemy_engine_with_retry(db_uri):
240
+ attempts = 0
241
+ while True:
242
+ attempts += 1
243
+ engine = create_sqlalchemy_engine(db_uri)
244
+ try:
245
+ sqlalchemy.inspect(engine)
246
+ return engine
247
+ except Exception as e:
248
+ if attempts < MAX_RETRY_COUNT:
249
+ sleep_duration = 0.1 * ((2**attempts) - 1)
250
+ _logger.warning(
251
+ "SQLAlchemy engine could not be created. The following exception is caught.\n"
252
+ "%s\nOperation will be retried in %.1f seconds",
253
+ e,
254
+ sleep_duration,
255
+ )
256
+ time.sleep(sleep_duration)
257
+ continue
258
+ raise
259
+
260
+
261
+ def create_sqlalchemy_engine(db_uri):
262
+ pool_size = MLFLOW_SQLALCHEMYSTORE_POOL_SIZE.get()
263
+ pool_max_overflow = MLFLOW_SQLALCHEMYSTORE_MAX_OVERFLOW.get()
264
+ pool_recycle = MLFLOW_SQLALCHEMYSTORE_POOL_RECYCLE.get()
265
+ echo = MLFLOW_SQLALCHEMYSTORE_ECHO.get()
266
+ poolclass = MLFLOW_SQLALCHEMYSTORE_POOLCLASS.get()
267
+ kwargs = {}
268
+ # Send argument only if they have been injected.
269
+ # Some engine does not support them (for example sqllite)
270
+ if pool_size:
271
+ kwargs["pool_size"] = pool_size
272
+ if pool_max_overflow:
273
+ kwargs["max_overflow"] = pool_max_overflow
274
+ if pool_recycle:
275
+ kwargs["pool_recycle"] = pool_recycle
276
+ if echo:
277
+ kwargs["echo"] = echo
278
+ if poolclass:
279
+ pool_class_map = {
280
+ "AssertionPool": AssertionPool,
281
+ "AsyncAdaptedQueuePool": AsyncAdaptedQueuePool,
282
+ "FallbackAsyncAdaptedQueuePool": FallbackAsyncAdaptedQueuePool,
283
+ "NullPool": NullPool,
284
+ "QueuePool": QueuePool,
285
+ "SingletonThreadPool": SingletonThreadPool,
286
+ "StaticPool": StaticPool,
287
+ }
288
+ if poolclass not in pool_class_map:
289
+ list_str = " ".join(pool_class_map.keys())
290
+ err_str = (
291
+ f"Invalid poolclass parameter: {poolclass}. Set environment variable "
292
+ f"poolclass to empty or one of the following values: {list_str}"
293
+ )
294
+ _logger.warning(err_str)
295
+ raise ValueError(err_str)
296
+ kwargs["poolclass"] = pool_class_map[poolclass]
297
+ if kwargs:
298
+ _logger.info("Create SQLAlchemy engine with pool options %s", kwargs)
299
+
300
+ # Handle MySQL SSL certificates via connect_args
301
+ if db_uri.startswith("mysql"):
302
+ connect_args = {
303
+ k: v
304
+ for k, v in {
305
+ "ssl_ca": MLFLOW_MYSQL_SSL_CA.get(),
306
+ "ssl_cert": MLFLOW_MYSQL_SSL_CERT.get(),
307
+ "ssl_key": MLFLOW_MYSQL_SSL_KEY.get(),
308
+ }.items()
309
+ if v
310
+ }
311
+ if connect_args:
312
+ kwargs["connect_args"] = connect_args
313
+
314
+ return sqlalchemy.create_engine(db_uri, pool_pre_ping=True, **kwargs)
File without changes
@@ -0,0 +1,74 @@
1
+ # A generic, single database configuration.
2
+
3
+ [alembic]
4
+ # path to migration scripts
5
+ script_location = mlflow/store/db_migrations
6
+
7
+ # template used to generate migration files
8
+ # file_template = %%(rev)s_%%(slug)s
9
+
10
+ # timezone to use when rendering the date
11
+ # within the migration file as well as the filename.
12
+ # string value is passed to dateutil.tz.gettz()
13
+ # leave blank for localtime
14
+ # timezone =
15
+
16
+ # max length of characters to apply to the
17
+ # "slug" field
18
+ # truncate_slug_length = 40
19
+
20
+ # set to 'true' to run the environment during
21
+ # the 'revision' command, regardless of autogenerate
22
+ # revision_environment = false
23
+
24
+ # set to 'true' to allow .pyc and .pyo files without
25
+ # a source .py file to be detected as revisions in the
26
+ # versions/ directory
27
+ # sourceless = false
28
+
29
+ # version location specification; this defaults
30
+ # to alembic/versions. When using multiple version
31
+ # directories, initial revisions must be specified with --version-path
32
+ # version_locations = %(here)s/bar %(here)s/bat alembic/versions
33
+
34
+ # the output encoding used when revision files
35
+ # are written from script.py.mako
36
+ # output_encoding = utf-8
37
+
38
+ sqlalchemy.url = ""
39
+
40
+
41
+ # Logging configuration
42
+ [loggers]
43
+ keys = root,sqlalchemy,alembic
44
+
45
+ [handlers]
46
+ keys = console
47
+
48
+ [formatters]
49
+ keys = generic
50
+
51
+ [logger_root]
52
+ level = WARN
53
+ handlers = console
54
+ qualname =
55
+
56
+ [logger_sqlalchemy]
57
+ level = WARN
58
+ handlers =
59
+ qualname = sqlalchemy.engine
60
+
61
+ [logger_alembic]
62
+ level = INFO
63
+ handlers =
64
+ qualname = alembic
65
+
66
+ [handler_console]
67
+ class = StreamHandler
68
+ args = (sys.stderr,)
69
+ level = NOTSET
70
+ formatter = generic
71
+
72
+ [formatter_generic]
73
+ format = %(levelname)-5.5s [%(name)s] %(message)s
74
+ datefmt = %H:%M:%S
@@ -0,0 +1,84 @@
1
+ from logging.config import fileConfig
2
+
3
+ from alembic import context
4
+ from sqlalchemy import engine_from_config, pool
5
+
6
+ # this is the Alembic Config object, which provides
7
+ # access to the values within the .ini file in use.
8
+ config = context.config
9
+
10
+ # Interpret the config file for Python logging.
11
+ # This line sets up loggers basically.
12
+ fileConfig(config.config_file_name, disable_existing_loggers=False)
13
+
14
+ # add your model's MetaData object here
15
+ # for 'autogenerate' support
16
+ # from myapp import mymodel
17
+ # target_metadata = mymodel.Base.metadata
18
+ from mlflow.store.db.base_sql_model import Base
19
+
20
+ target_metadata = Base.metadata
21
+
22
+ # other values from the config, defined by the needs of env.py,
23
+ # can be acquired:
24
+ # my_important_option = config.get_main_option("my_important_option")
25
+ # ... etc.
26
+
27
+
28
+ def run_migrations_offline():
29
+ """Run migrations in 'offline' mode.
30
+
31
+ This configures the context with just a URL
32
+ and not an Engine, though an Engine is acceptable
33
+ here as well. By skipping the Engine creation
34
+ we don't even need a DBAPI to be available.
35
+
36
+ Calls to context.execute() here emit the given string to the
37
+ script output.
38
+
39
+ """
40
+ url = config.get_main_option("sqlalchemy.url")
41
+ # Try https://stackoverflow.com/questions/30378233/sqlite-lack-of-alter-support-alembic-migration-failing-because-of-this-solutio
42
+ context.configure(
43
+ url=url, target_metadata=target_metadata, literal_binds=True, render_as_batch=True
44
+ )
45
+
46
+ with context.begin_transaction():
47
+ context.run_migrations()
48
+
49
+
50
+ def run_migrations_online():
51
+ """Run migrations in 'online' mode.
52
+
53
+ In this scenario we need to create an Engine
54
+ and associate a connection with the context.
55
+
56
+ """
57
+ # If available, use a shared connection for the database upgrade, ensuring that any
58
+ # connection-dependent state (e.g., the state of an in-memory database) is preserved
59
+ # for reference by the upgrade routine. For more information, see
60
+ # https://alembic.sqlalchemy.org/en/latest/cookbook.html#sharing-a-
61
+ # connection-with-a-series-of-migration-commands-and-environments
62
+ connection = config.attributes.get("connection")
63
+ if connection is None:
64
+ engine = engine_from_config(
65
+ config.get_section(config.config_ini_section),
66
+ prefix="sqlalchemy.",
67
+ poolclass=pool.NullPool,
68
+ )
69
+ else:
70
+ engine = connection.engine
71
+
72
+ with engine.connect() as connection:
73
+ context.configure(
74
+ connection=connection, target_metadata=target_metadata, render_as_batch=True
75
+ )
76
+
77
+ with context.begin_transaction():
78
+ context.run_migrations()
79
+
80
+
81
+ if context.is_offline_mode():
82
+ run_migrations_offline()
83
+ else:
84
+ run_migrations_online()
@@ -0,0 +1,88 @@
1
+ """add cascading deletion to datasets from experiments
2
+
3
+ Revision ID: 0584bdc529eb
4
+ Revises: f5a4f2784254
5
+ Create Date: 2024-11-11 15:27:53.189685
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ from mlflow.exceptions import MlflowException
13
+ from mlflow.store.tracking.dbmodels.models import SqlDataset, SqlExperiment
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "0584bdc529eb"
17
+ down_revision = "f5a4f2784254"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+
22
+ def get_datasets_experiment_fk_name():
23
+ conn = op.get_bind()
24
+ metadata = sa.MetaData()
25
+ metadata.bind = conn
26
+ datasets_table = sa.Table(
27
+ SqlDataset.__tablename__,
28
+ metadata,
29
+ autoload_with=conn,
30
+ )
31
+
32
+ for constraint in datasets_table.foreign_key_constraints:
33
+ if (
34
+ constraint.referred_table.name == SqlExperiment.__tablename__
35
+ and constraint.column_keys[0] == "experiment_id"
36
+ ):
37
+ return constraint.name
38
+
39
+ raise MlflowException(
40
+ "Unable to find the foreign key constraint name from datasets to experiments. "
41
+ "All foreign key constraints in datasets table: \n"
42
+ f"{datasets_table.foreign_key_constraints}"
43
+ )
44
+
45
+
46
+ def upgrade():
47
+ dialect_name = op.get_context().dialect.name
48
+
49
+ # standardize the constraint to sqlite naming convention
50
+ new_fk_constraint_name = (
51
+ f"fk_{SqlDataset.__tablename__}_experiment_id_{SqlExperiment.__tablename__}"
52
+ )
53
+
54
+ if dialect_name == "sqlite":
55
+ # Only way to drop unnamed fk constraint in sqllite
56
+ # See https://alembic.sqlalchemy.org/en/latest/batch.html#dropping-unnamed-or-named-foreign-key-constraints
57
+ with op.batch_alter_table(
58
+ SqlDataset.__tablename__,
59
+ schema=None,
60
+ naming_convention={
61
+ "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
62
+ },
63
+ ) as batch_op:
64
+ # in SQLite, constraint.name is None, so we have to hardcode it
65
+ batch_op.drop_constraint(new_fk_constraint_name, type_="foreignkey")
66
+ # Need to explicitly name the fk constraint with batch alter table
67
+ batch_op.create_foreign_key(
68
+ new_fk_constraint_name,
69
+ SqlExperiment.__tablename__,
70
+ ["experiment_id"],
71
+ ["experiment_id"],
72
+ ondelete="CASCADE",
73
+ )
74
+ else:
75
+ old_fk_constraint_name = get_datasets_experiment_fk_name()
76
+ op.drop_constraint(old_fk_constraint_name, SqlDataset.__tablename__, type_="foreignkey")
77
+ op.create_foreign_key(
78
+ new_fk_constraint_name,
79
+ SqlDataset.__tablename__,
80
+ SqlExperiment.__tablename__,
81
+ ["experiment_id"],
82
+ ["experiment_id"],
83
+ ondelete="CASCADE",
84
+ )
85
+
86
+
87
+ def downgrade():
88
+ pass
@@ -0,0 +1,49 @@
1
+ """drop_duplicate_killed_constraint
2
+
3
+ Revision ID: 0a8213491aaa
4
+ Revises: cfd24bdc0731
5
+ Create Date: 2020-01-28 15:26:14.757445
6
+
7
+ This migration drops a duplicate constraint on the `runs.status` column that was left as a byproduct
8
+ of an erroneous implementation of the `cfd24bdc0731_update_run_status_constraint_with_killed`
9
+ migration in MLflow 1.5. The implementation of this migration has since been fixed.
10
+ """
11
+
12
+ import logging
13
+
14
+ from alembic import op
15
+
16
+ _logger = logging.getLogger(__name__)
17
+
18
+ # revision identifiers, used by Alembic.
19
+ revision = "0a8213491aaa"
20
+ down_revision = "cfd24bdc0731"
21
+ branch_labels = None
22
+ depends_on = None
23
+
24
+
25
+ def upgrade():
26
+ # Attempt to drop any existing `status` constraints on the `runs` table. This operation
27
+ # may fail against certain backends with different classes of Exception. For example,
28
+ # in MySQL <= 8.0.15, dropping constraints produces an invalid `ALTER TABLE` expression.
29
+ # Further, in certain versions of sqlite, `ALTER` (which is invoked by `drop_constraint`)
30
+ # is unsupported on `CHECK` constraints. Accordingly, we catch the generic `Exception`
31
+ # object because the failure modes are not well-enumerated or consistent across database
32
+ # backends. Because failures automatically stop batch operations and the `drop_constraint()`
33
+ # operation is expected to fail under certain circumstances, we execute `drop_constraint()`
34
+ # outside of the batch operation context.
35
+ try:
36
+ # For other database backends, the status check constraint is dropped by
37
+ # cfd24bdc0731_update_run_status_constraint_with_killed.py
38
+ if op.get_bind().engine.name == "mysql":
39
+ op.drop_constraint(constraint_name="status", table_name="runs", type_="check")
40
+ except Exception as e:
41
+ _logger.warning(
42
+ "Failed to drop check constraint. Dropping check constraints may not be supported"
43
+ " by your SQL database. Exception content: %s",
44
+ e,
45
+ )
46
+
47
+
48
+ def downgrade():
49
+ pass
@@ -0,0 +1,24 @@
1
+ """add deleted_time field to runs table
2
+
3
+ Revision ID: 0c779009ac13
4
+ Revises: bd07f7e963c5
5
+ Create Date: 2022-07-27 14:13:36.162861
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "0c779009ac13"
14
+ down_revision = "bd07f7e963c5"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ op.add_column("runs", sa.Column("deleted_time", sa.BigInteger, nullable=True, default=None))
21
+
22
+
23
+ def downgrade():
24
+ pass
@@ -0,0 +1,35 @@
1
+ """allow nulls for metric values
2
+
3
+ Revision ID: 181f10493468
4
+ Revises: 90e64c465722
5
+ Create Date: 2019-07-10 22:40:18.787993
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "181f10493468"
14
+ down_revision = "90e64c465722"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade():
20
+ with op.batch_alter_table("metrics") as batch_op:
21
+ batch_op.alter_column("value", type_=sa.types.Float(precision=53), nullable=False)
22
+ batch_op.add_column(
23
+ sa.Column(
24
+ "is_nan", sa.Boolean(create_constraint=False), nullable=False, server_default="0"
25
+ )
26
+ )
27
+ batch_op.drop_constraint(constraint_name="metric_pk", type_="primary")
28
+ batch_op.create_primary_key(
29
+ constraint_name="metric_pk",
30
+ columns=["key", "timestamp", "step", "run_uuid", "value", "is_nan"],
31
+ )
32
+
33
+
34
+ def downgrade():
35
+ pass