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,673 @@
1
+ import base64
2
+ import json
3
+ import logging
4
+ import random
5
+ import time
6
+ import warnings
7
+ from functools import lru_cache
8
+ from typing import Any, Callable
9
+
10
+ import requests
11
+
12
+ from mlflow.environment_variables import (
13
+ _MLFLOW_HTTP_REQUEST_MAX_BACKOFF_FACTOR_LIMIT,
14
+ _MLFLOW_HTTP_REQUEST_MAX_RETRIES_LIMIT,
15
+ MLFLOW_DATABRICKS_ENDPOINT_HTTP_RETRY_TIMEOUT,
16
+ MLFLOW_ENABLE_DB_SDK,
17
+ MLFLOW_HTTP_REQUEST_BACKOFF_FACTOR,
18
+ MLFLOW_HTTP_REQUEST_BACKOFF_JITTER,
19
+ MLFLOW_HTTP_REQUEST_MAX_RETRIES,
20
+ MLFLOW_HTTP_REQUEST_TIMEOUT,
21
+ MLFLOW_HTTP_RESPECT_RETRY_AFTER_HEADER,
22
+ )
23
+ from mlflow.exceptions import (
24
+ CUSTOMER_UNAUTHORIZED,
25
+ ERROR_CODE_TO_HTTP_STATUS,
26
+ INVALID_PARAMETER_VALUE,
27
+ InvalidUrlException,
28
+ MlflowException,
29
+ RestException,
30
+ get_error_code,
31
+ )
32
+ from mlflow.protos import databricks_pb2
33
+ from mlflow.protos.databricks_pb2 import ENDPOINT_NOT_FOUND, ErrorCode
34
+ from mlflow.utils.proto_json_utils import parse_dict
35
+ from mlflow.utils.request_utils import (
36
+ _TRANSIENT_FAILURE_RESPONSE_CODES,
37
+ _get_http_response_with_retries,
38
+ augmented_raise_for_status, # noqa: F401
39
+ cloud_storage_http_request, # noqa: F401
40
+ )
41
+ from mlflow.utils.string_utils import strip_suffix
42
+
43
+ _logger = logging.getLogger(__name__)
44
+
45
+ RESOURCE_NON_EXISTENT = "RESOURCE_DOES_NOT_EXIST"
46
+ _REST_API_PATH_PREFIX = "/api/2.0"
47
+ _UC_OSS_REST_API_PATH_PREFIX = "/api/2.1"
48
+ _TRACE_REST_API_PATH_PREFIX = f"{_REST_API_PATH_PREFIX}/mlflow/traces"
49
+ _V3_REST_API_PATH_PREFIX = "/api/3.0"
50
+ _V3_TRACE_REST_API_PATH_PREFIX = f"{_V3_REST_API_PATH_PREFIX}/mlflow/traces"
51
+ _ARMERIA_OK = "200 OK"
52
+ _DATABRICKS_SDK_RETRY_AFTER_SECS_DEPRECATION_WARNING = (
53
+ "The 'retry_after_secs' parameter of DatabricksError is deprecated"
54
+ )
55
+
56
+
57
+ def http_request(
58
+ host_creds,
59
+ endpoint,
60
+ method,
61
+ max_retries=None,
62
+ backoff_factor=None,
63
+ backoff_jitter=None,
64
+ extra_headers=None,
65
+ retry_codes=_TRANSIENT_FAILURE_RESPONSE_CODES,
66
+ timeout=None,
67
+ raise_on_status=True,
68
+ respect_retry_after_header=None,
69
+ retry_timeout_seconds=None,
70
+ **kwargs,
71
+ ):
72
+ """Makes an HTTP request with the specified method to the specified hostname/endpoint. Transient
73
+ errors such as Rate-limited (429), service unavailable (503) and internal error (500) are
74
+ retried with an exponential back off with backoff_factor * (1, 2, 4, ... seconds).
75
+ The function parses the API response (assumed to be JSON) into a Python object and returns it.
76
+
77
+ Args:
78
+ host_creds: A :py:class:`mlflow.rest_utils.MlflowHostCreds` object containing
79
+ hostname and optional authentication.
80
+ endpoint: A string for service endpoint, e.g. "/path/to/object".
81
+ method: A string indicating the method to use, e.g. "GET", "POST", "PUT".
82
+ max_retries: Maximum number of retries before throwing an exception.
83
+ backoff_factor: A time factor for exponential backoff. e.g. value 5 means the HTTP
84
+ request will be retried with interval 5, 10, 20... seconds. A value of 0 turns off the
85
+ exponential backoff.
86
+ backoff_jitter: A random jitter to add to the backoff interval.
87
+ extra_headers: A dict of HTTP header name-value pairs to be included in the request.
88
+ retry_codes: A list of HTTP response error codes that qualifies for retry.
89
+ timeout: Wait for timeout seconds for response from remote server for connect and
90
+ read request.
91
+ raise_on_status: Whether to raise an exception, or return a response, if status falls
92
+ in retry_codes range and retries have been exhausted.
93
+ respect_retry_after_header: Whether to respect Retry-After header on status codes defined
94
+ as Retry.RETRY_AFTER_STATUS_CODES or not.
95
+ retry_timeout_seconds: Timeout for retires. Only effective when using Databricks SDK.
96
+ kwargs: Additional keyword arguments to pass to `requests.Session.request()`
97
+
98
+ Returns:
99
+ requests.Response object.
100
+ """
101
+ cleaned_hostname = strip_suffix(host_creds.host, "/")
102
+ url = f"{cleaned_hostname}{endpoint}"
103
+
104
+ # Set defaults for retry parameters from environment variables if not specified
105
+ max_retries = MLFLOW_HTTP_REQUEST_MAX_RETRIES.get() if max_retries is None else max_retries
106
+ backoff_factor = (
107
+ MLFLOW_HTTP_REQUEST_BACKOFF_FACTOR.get() if backoff_factor is None else backoff_factor
108
+ )
109
+ backoff_jitter = (
110
+ MLFLOW_HTTP_REQUEST_BACKOFF_JITTER.get() if backoff_jitter is None else backoff_jitter
111
+ )
112
+
113
+ if host_creds.use_databricks_sdk:
114
+ from databricks.sdk.errors import DatabricksError
115
+
116
+ ws_client = get_workspace_client(
117
+ host_creds.use_secret_scope_token,
118
+ host_creds.host,
119
+ host_creds.token,
120
+ host_creds.databricks_auth_profile,
121
+ retry_timeout_seconds=retry_timeout_seconds,
122
+ )
123
+
124
+ def make_sdk_call():
125
+ # Databricks SDK `APIClient.do` API is for making request using
126
+ # HTTP
127
+ # https://github.com/databricks/databricks-sdk-py/blob/a714146d9c155dd1e3567475be78623f72028ee0/databricks/sdk/core.py#L134
128
+ # suppress the warning due to https://github.com/databricks/databricks-sdk-py/issues/963
129
+ with warnings.catch_warnings():
130
+ warnings.filterwarnings(
131
+ "ignore", message=f".*{_DATABRICKS_SDK_RETRY_AFTER_SECS_DEPRECATION_WARNING}.*"
132
+ )
133
+ raw_response = ws_client.api_client.do(
134
+ method=method,
135
+ path=endpoint,
136
+ headers=extra_headers,
137
+ raw=True,
138
+ query=kwargs.get("params"),
139
+ body=kwargs.get("json"),
140
+ files=kwargs.get("files"),
141
+ data=kwargs.get("data"),
142
+ )
143
+ return raw_response["contents"]._response
144
+
145
+ try:
146
+ # We retry the SDK call with exponential backoff because the Databricks SDK default
147
+ # retry behavior does not handle all transient errors that we want to retry, and it
148
+ # does not support a customizable retry policy based on HTTP response status codes.
149
+ # Note that, in uncommon cases (due to the limited set if HTTP status codes and
150
+ # response strings that Databricks SDK retries on), the SDK may retry internally,
151
+ # and MLflow may retry on top of that, leading to more retries than specified by
152
+ # `max_retries`. This is acceptable, given the enforcement of an overall request
153
+ # timeout via `retry_timeout_seconds`.
154
+ #
155
+ # TODO: Update transient error handling defaults in Databricks SDK to match standard
156
+ # practices (e.g. retrying on 429, 500, 503, etc.), support custom retries in Databricks
157
+ # SDK, and remove this custom retry wrapper from MLflow
158
+ return _retry_databricks_sdk_call_with_exponential_backoff(
159
+ call_func=make_sdk_call,
160
+ retry_codes=retry_codes,
161
+ retry_timeout_seconds=(
162
+ retry_timeout_seconds
163
+ if retry_timeout_seconds is not None
164
+ else MLFLOW_DATABRICKS_ENDPOINT_HTTP_RETRY_TIMEOUT.get()
165
+ ),
166
+ backoff_factor=backoff_factor,
167
+ backoff_jitter=backoff_jitter,
168
+ max_retries=max_retries,
169
+ )
170
+ except DatabricksError as e:
171
+ response = requests.Response()
172
+ response.url = url
173
+ response.status_code = ERROR_CODE_TO_HTTP_STATUS.get(e.error_code, 500)
174
+ response.reason = str(e)
175
+ response.encoding = "UTF-8"
176
+ response._content = json.dumps(
177
+ {
178
+ "error_code": e.error_code,
179
+ "message": str(e),
180
+ }
181
+ ).encode("UTF-8")
182
+ return response
183
+
184
+ _validate_max_retries(max_retries)
185
+ _validate_backoff_factor(backoff_factor)
186
+ respect_retry_after_header = (
187
+ MLFLOW_HTTP_RESPECT_RETRY_AFTER_HEADER.get()
188
+ if respect_retry_after_header is None
189
+ else respect_retry_after_header
190
+ )
191
+
192
+ timeout = MLFLOW_HTTP_REQUEST_TIMEOUT.get() if timeout is None else timeout
193
+ auth_str = None
194
+ if host_creds.username and host_creds.password:
195
+ basic_auth_str = f"{host_creds.username}:{host_creds.password}".encode()
196
+ auth_str = "Basic " + base64.standard_b64encode(basic_auth_str).decode("utf-8")
197
+ elif host_creds.token:
198
+ auth_str = f"Bearer {host_creds.token}"
199
+ elif host_creds.client_secret:
200
+ raise MlflowException(
201
+ "To use OAuth authentication, set environmental variable "
202
+ f"'{MLFLOW_ENABLE_DB_SDK.name}' to true",
203
+ error_code=CUSTOMER_UNAUTHORIZED,
204
+ )
205
+
206
+ from mlflow.tracking.request_header.registry import resolve_request_headers
207
+
208
+ headers = dict(**resolve_request_headers())
209
+ if extra_headers:
210
+ headers = dict(**headers, **extra_headers)
211
+
212
+ if auth_str:
213
+ headers["Authorization"] = auth_str
214
+
215
+ if host_creds.client_cert_path is not None:
216
+ kwargs["cert"] = host_creds.client_cert_path
217
+
218
+ if host_creds.aws_sigv4:
219
+ # will overwrite the Authorization header
220
+ from requests_auth_aws_sigv4 import AWSSigV4
221
+
222
+ kwargs["auth"] = AWSSigV4("execute-api")
223
+ elif host_creds.auth:
224
+ from mlflow.tracking.request_auth.registry import fetch_auth
225
+
226
+ kwargs["auth"] = fetch_auth(host_creds.auth)
227
+
228
+ try:
229
+ return _get_http_response_with_retries(
230
+ method,
231
+ url,
232
+ max_retries,
233
+ backoff_factor,
234
+ backoff_jitter,
235
+ retry_codes,
236
+ raise_on_status,
237
+ headers=headers,
238
+ verify=host_creds.verify,
239
+ timeout=timeout,
240
+ respect_retry_after_header=respect_retry_after_header,
241
+ **kwargs,
242
+ )
243
+ except requests.exceptions.Timeout as to:
244
+ raise MlflowException(
245
+ f"API request to {url} failed with timeout exception {to}."
246
+ " To increase the timeout, set the environment variable "
247
+ f"{MLFLOW_HTTP_REQUEST_TIMEOUT!s} to a larger value."
248
+ ) from to
249
+ except requests.exceptions.InvalidURL as iu:
250
+ raise InvalidUrlException(f"Invalid url: {url}") from iu
251
+ except Exception as e:
252
+ raise MlflowException(f"API request to {url} failed with exception {e}")
253
+
254
+
255
+ @lru_cache(maxsize=5)
256
+ def get_workspace_client(
257
+ use_secret_scope_token,
258
+ host,
259
+ token,
260
+ databricks_auth_profile,
261
+ retry_timeout_seconds=None,
262
+ ):
263
+ from databricks.sdk import WorkspaceClient
264
+ from databricks.sdk.config import Config
265
+
266
+ if use_secret_scope_token:
267
+ kwargs = {"host": host, "token": token}
268
+ else:
269
+ kwargs = {"profile": databricks_auth_profile}
270
+ config = Config(
271
+ **kwargs,
272
+ retry_timeout_seconds=retry_timeout_seconds
273
+ or MLFLOW_DATABRICKS_ENDPOINT_HTTP_RETRY_TIMEOUT.get(),
274
+ )
275
+ # Note: If we use `config` param, all SDK configurations must be set in `config` object.
276
+ return WorkspaceClient(config=config)
277
+
278
+
279
+ def _can_parse_as_json_object(string):
280
+ try:
281
+ return isinstance(json.loads(string), dict)
282
+ except Exception:
283
+ return False
284
+
285
+
286
+ def http_request_safe(host_creds, endpoint, method, **kwargs):
287
+ """
288
+ Wrapper around ``http_request`` that also verifies that the request succeeds with code 200.
289
+ """
290
+ response = http_request(host_creds=host_creds, endpoint=endpoint, method=method, **kwargs)
291
+ return verify_rest_response(response, endpoint)
292
+
293
+
294
+ def verify_rest_response(response, endpoint):
295
+ """Verify the return code and format, raise exception if the request was not successful."""
296
+ # Handle Armeria-specific response case where response text is "200 OK"
297
+ if response.status_code == 200 and response.text.strip() == _ARMERIA_OK:
298
+ response._content = b"{}" # Update response content to be an empty JSON dictionary
299
+ return response
300
+
301
+ # Handle non-200 status codes
302
+ if response.status_code != 200:
303
+ if _can_parse_as_json_object(response.text):
304
+ raise RestException(json.loads(response.text))
305
+ else:
306
+ base_msg = (
307
+ f"API request to endpoint {endpoint} "
308
+ f"failed with error code {response.status_code} != 200"
309
+ )
310
+ raise MlflowException(
311
+ f"{base_msg}. Response body: '{response.text}'",
312
+ error_code=get_error_code(response.status_code),
313
+ )
314
+
315
+ # Skip validation for endpoints (e.g. DBFS file-download API) which may return a non-JSON
316
+ # response
317
+ if endpoint.startswith(_REST_API_PATH_PREFIX) and not _can_parse_as_json_object(response.text):
318
+ base_msg = (
319
+ "API request to endpoint was successful but the response body was not "
320
+ "in a valid JSON format"
321
+ )
322
+ raise MlflowException(f"{base_msg}. Response body: '{response.text}'")
323
+
324
+ return response
325
+
326
+
327
+ def _validate_max_retries(max_retries):
328
+ max_retry_limit = _MLFLOW_HTTP_REQUEST_MAX_RETRIES_LIMIT.get()
329
+
330
+ if max_retry_limit < 0:
331
+ raise MlflowException(
332
+ message=f"The current maximum retry limit is invalid ({max_retry_limit}). "
333
+ "Cannot be negative.",
334
+ error_code=INVALID_PARAMETER_VALUE,
335
+ )
336
+ if max_retries >= max_retry_limit:
337
+ raise MlflowException(
338
+ message=f"The configured max_retries value ({max_retries}) is "
339
+ f"in excess of the maximum allowable retries ({max_retry_limit})",
340
+ error_code=INVALID_PARAMETER_VALUE,
341
+ )
342
+
343
+ if max_retries < 0:
344
+ raise MlflowException(
345
+ message=f"The max_retries value must be either 0 a positive integer. Got {max_retries}",
346
+ error_code=INVALID_PARAMETER_VALUE,
347
+ )
348
+
349
+
350
+ def _validate_backoff_factor(backoff_factor):
351
+ max_backoff_factor_limit = _MLFLOW_HTTP_REQUEST_MAX_BACKOFF_FACTOR_LIMIT.get()
352
+
353
+ if max_backoff_factor_limit < 0:
354
+ raise MlflowException(
355
+ message="The current maximum backoff factor limit is invalid "
356
+ f"({max_backoff_factor_limit}). Cannot be negative.",
357
+ error_code=INVALID_PARAMETER_VALUE,
358
+ )
359
+
360
+ if backoff_factor >= max_backoff_factor_limit:
361
+ raise MlflowException(
362
+ message=f"The configured backoff_factor value ({backoff_factor}) is in excess "
363
+ "of the maximum allowable backoff_factor limit "
364
+ f"({max_backoff_factor_limit})",
365
+ error_code=INVALID_PARAMETER_VALUE,
366
+ )
367
+
368
+ if backoff_factor < 0:
369
+ raise MlflowException(
370
+ message="The backoff_factor value must be either 0 a positive integer. "
371
+ f"Got {backoff_factor}",
372
+ error_code=INVALID_PARAMETER_VALUE,
373
+ )
374
+
375
+
376
+ def _time_sleep(seconds: float) -> None:
377
+ """
378
+ This function is specifically mocked in `test_rest_utils.py` to test the backoff logic in
379
+ isolation. We avoid wrapping `time.sleep` globally to prevent interfering with unrelated sleep
380
+ calls elsewhere in the codebase or in third-party libraries.
381
+ """
382
+ time.sleep(seconds)
383
+
384
+
385
+ def _retry_databricks_sdk_call_with_exponential_backoff(
386
+ *,
387
+ call_func: Callable[..., Any],
388
+ retry_codes: list[int],
389
+ retry_timeout_seconds: int,
390
+ backoff_factor: int,
391
+ backoff_jitter: float,
392
+ max_retries: int,
393
+ ):
394
+ """
395
+ Retry a Databricks SDK call with exponential backoff until timeout or max retries reached.
396
+
397
+ Args:
398
+ call_func: Function to call that may raise DatabricksError
399
+ retry_codes: Set of HTTP status codes that should trigger retries
400
+ retry_timeout_seconds: Maximum time to spend retrying in seconds
401
+ backoff_factor: Factor for exponential backoff
402
+ backoff_jitter: Random jitter to add to backoff
403
+ max_retries: Maximum number of retry attempts
404
+
405
+ Returns:
406
+ The result of call_func() on success
407
+
408
+ Raises:
409
+ DatabricksError: If all retries are exhausted or non-retryable error occurs
410
+ """
411
+ from databricks.sdk.errors import DatabricksError
412
+
413
+ start_time = time.time()
414
+ attempt = 0
415
+
416
+ while attempt <= max_retries:
417
+ try:
418
+ return call_func()
419
+ except DatabricksError as e:
420
+ # Get HTTP status code from the error
421
+ status_code = ERROR_CODE_TO_HTTP_STATUS.get(e.error_code, 500)
422
+
423
+ # Check if this is a retryable error
424
+ if status_code not in retry_codes:
425
+ raise
426
+
427
+ # Check if we've exceeded max retries
428
+ if attempt >= max_retries:
429
+ _logger.warning(f"Max retries ({max_retries}) exceeded: {e}")
430
+ raise
431
+
432
+ # Calculate backoff time with exponential backoff and jitter
433
+ # NB: Ideally, we'd use urllib3.Retry to compute the jitter, check whether we've
434
+ # exceed max retries, etc. However, urllib3.Retry in urllib3 version 1.x, which MLflow
435
+ # maintains compatibility with, doesn't support retries with jitter
436
+ if attempt <= 0:
437
+ backoff_time = 0 # No backoff on first retry attempt
438
+ else:
439
+ backoff_time = backoff_factor * (2**attempt)
440
+ if backoff_jitter > 0:
441
+ backoff_time += random.random() * backoff_jitter
442
+
443
+ # Check if we've exceeded or would exceed timeout
444
+ elapsed_time = time.time() - start_time
445
+ if elapsed_time + backoff_time >= retry_timeout_seconds:
446
+ _logger.warning(f"Retry timeout ({retry_timeout_seconds}s) exceeded: {e}")
447
+ raise
448
+
449
+ _logger.debug(
450
+ f"Databricks SDK call failed with retryable error (status {status_code}): {e}. "
451
+ f"Retrying in {backoff_time:.2f} seconds (attempt {attempt + 1})"
452
+ )
453
+
454
+ _time_sleep(backoff_time)
455
+ attempt += 1
456
+
457
+
458
+ def _get_path(path_prefix, endpoint_path):
459
+ return f"{path_prefix}{endpoint_path}"
460
+
461
+
462
+ def extract_api_info_for_service(service, path_prefix):
463
+ """Return a dictionary mapping each API method to a tuple (path, HTTP method)"""
464
+ service_methods = service.DESCRIPTOR.methods
465
+ res = {}
466
+ for service_method in service_methods:
467
+ endpoints = service_method.GetOptions().Extensions[databricks_pb2.rpc].endpoints
468
+ endpoint = endpoints[0]
469
+ endpoint_path = _get_path(path_prefix, endpoint.path)
470
+ res[service().GetRequestClass(service_method)] = (endpoint_path, endpoint.method)
471
+ return res
472
+
473
+
474
+ def extract_all_api_info_for_service(service, path_prefix):
475
+ """Return a dictionary mapping each API method to a list of tuples [(path, HTTP method)]"""
476
+ service_methods = service.DESCRIPTOR.methods
477
+ res = {}
478
+ for service_method in service_methods:
479
+ endpoints = service_method.GetOptions().Extensions[databricks_pb2.rpc].endpoints
480
+ res[service().GetRequestClass(service_method)] = [
481
+ (_get_path(path_prefix, endpoint.path), endpoint.method) for endpoint in endpoints
482
+ ]
483
+ return res
484
+
485
+
486
+ def get_single_trace_endpoint(request_id, use_v3=True):
487
+ """
488
+ Get the endpoint for a single trace.
489
+ For Databricks tracking URIs, use the V3 API.
490
+ For all other tracking URIs, use the V2 API.
491
+
492
+ Args:
493
+ request_id: The trace ID.
494
+ use_v3: Whether to use the V3 API. If True, use the V3 API. If False, use the V2 API.
495
+ """
496
+ if use_v3:
497
+ return f"{_V3_TRACE_REST_API_PATH_PREFIX}/{request_id}"
498
+ return f"{_TRACE_REST_API_PATH_PREFIX}/{request_id}"
499
+
500
+
501
+ def get_logged_model_endpoint(model_id: str) -> str:
502
+ return f"{_REST_API_PATH_PREFIX}/mlflow/logged-models/{model_id}"
503
+
504
+
505
+ def get_single_assessment_endpoint(trace_id: str, assessment_id: str) -> str:
506
+ """
507
+ Get the endpoint for a single assessment.
508
+
509
+ Args:
510
+ trace_id: The trace ID.
511
+ assessment_id: The assessment ID.
512
+ """
513
+ return f"{_V3_TRACE_REST_API_PATH_PREFIX}/{trace_id}/assessments/{assessment_id}"
514
+
515
+
516
+ def get_trace_tag_endpoint(trace_id):
517
+ """Get the endpoint for trace tags. Always use v2 endpoint."""
518
+ return f"{_REST_API_PATH_PREFIX}/mlflow/traces/{trace_id}/tags"
519
+
520
+
521
+ def call_endpoint(
522
+ host_creds,
523
+ endpoint,
524
+ method,
525
+ json_body,
526
+ response_proto,
527
+ extra_headers=None,
528
+ retry_timeout_seconds=None,
529
+ ):
530
+ # Convert json string to json dictionary, to pass to requests
531
+ if json_body is not None:
532
+ json_body = json.loads(json_body)
533
+ call_kwargs = {
534
+ "host_creds": host_creds,
535
+ "endpoint": endpoint,
536
+ "method": method,
537
+ }
538
+ if extra_headers is not None:
539
+ call_kwargs["extra_headers"] = extra_headers
540
+ if retry_timeout_seconds is not None:
541
+ call_kwargs["retry_timeout_seconds"] = retry_timeout_seconds
542
+ if method == "GET":
543
+ call_kwargs["params"] = json_body
544
+ response = http_request(**call_kwargs)
545
+ else:
546
+ call_kwargs["json"] = json_body
547
+ response = http_request(**call_kwargs)
548
+
549
+ response = verify_rest_response(response, endpoint)
550
+ response_to_parse = response.text
551
+ try:
552
+ js_dict = json.loads(response_to_parse)
553
+ except json.JSONDecodeError:
554
+ if len(response_to_parse) > 50:
555
+ response_to_parse = response_to_parse[:50] + "..."
556
+ _logger.warning(f"Response is not a valid JSON object: {response_to_parse}")
557
+ raise
558
+
559
+ parse_dict(js_dict=js_dict, message=response_proto)
560
+ return response_proto
561
+
562
+
563
+ def call_endpoints(host_creds, endpoints, json_body, response_proto, extra_headers=None):
564
+ # The order that the endpoints are called in is defined by the order
565
+ # specified in ModelRegistryService in model_registry.proto
566
+ for i, (endpoint, method) in enumerate(endpoints):
567
+ try:
568
+ return call_endpoint(
569
+ host_creds, endpoint, method, json_body, response_proto, extra_headers
570
+ )
571
+ except RestException as e:
572
+ if e.error_code != ErrorCode.Name(ENDPOINT_NOT_FOUND) or i == len(endpoints) - 1:
573
+ raise e
574
+
575
+
576
+ class MlflowHostCreds:
577
+ """
578
+ Provides a hostname and optional authentication for talking to an MLflow tracking server.
579
+
580
+ Args:
581
+ host: Hostname (e.g., http://localhost:5000) to MLflow server. Required.
582
+ username: Username to use with Basic authentication when talking to server.
583
+ If this is specified, password must also be specified.
584
+ password: Password to use with Basic authentication when talking to server.
585
+ If this is specified, username must also be specified.
586
+ token: Token to use with Bearer authentication when talking to server.
587
+ If provided, user/password authentication will be ignored.
588
+ aws_sigv4: If true, we will create a signature V4 to be added for any outgoing request.
589
+ Keys for signing the request can be passed via ENV variables,
590
+ or will be fetched via boto3 session.
591
+ auth: If set, the auth will be added for any outgoing request.
592
+ Keys for signing the request can be passed via ENV variables,
593
+ ignore_tls_verification: If true, we will not verify the server's hostname or TLS
594
+ certificate. This is useful for certain testing situations, but should never be
595
+ true in production.
596
+ If this is set to true ``server_cert_path`` must not be set.
597
+ client_cert_path: Path to ssl client cert file (.pem).
598
+ Sets the cert param of the ``requests.request``
599
+ function (see https://requests.readthedocs.io/en/master/api/).
600
+ server_cert_path: Path to a CA bundle to use.
601
+ Sets the verify param of the ``requests.request``
602
+ function (see https://requests.readthedocs.io/en/master/api/).
603
+ If this is set ``ignore_tls_verification`` must be false.
604
+ use_databricks_sdk: A boolean value represent whether using Databricks SDK for
605
+ authentication.
606
+ databricks_auth_profile: The name of the profile used by Databricks SDK for
607
+ authentication.
608
+ client_id: The client ID used by Databricks OAuth
609
+ client_secret: The client secret used by Databricks OAuth
610
+ """
611
+
612
+ def __init__(
613
+ self,
614
+ host,
615
+ username=None,
616
+ password=None,
617
+ token=None,
618
+ aws_sigv4=False,
619
+ auth=None,
620
+ ignore_tls_verification=False,
621
+ client_cert_path=None,
622
+ server_cert_path=None,
623
+ use_databricks_sdk=False,
624
+ databricks_auth_profile=None,
625
+ client_id=None,
626
+ client_secret=None,
627
+ use_secret_scope_token=False,
628
+ ):
629
+ if not host:
630
+ raise MlflowException(
631
+ message="host is a required parameter for MlflowHostCreds",
632
+ error_code=INVALID_PARAMETER_VALUE,
633
+ )
634
+ if ignore_tls_verification and (server_cert_path is not None):
635
+ raise MlflowException(
636
+ message=(
637
+ "When 'ignore_tls_verification' is true then 'server_cert_path' "
638
+ "must not be set! This error may have occurred because the "
639
+ "'MLFLOW_TRACKING_INSECURE_TLS' and 'MLFLOW_TRACKING_SERVER_CERT_PATH' "
640
+ "environment variables are both set - only one of these environment "
641
+ "variables may be set."
642
+ ),
643
+ error_code=INVALID_PARAMETER_VALUE,
644
+ )
645
+ self.host = host
646
+ self.username = username
647
+ self.password = password
648
+ self.token = token
649
+ self.aws_sigv4 = aws_sigv4
650
+ self.auth = auth
651
+ self.ignore_tls_verification = ignore_tls_verification
652
+ self.client_cert_path = client_cert_path
653
+ self.server_cert_path = server_cert_path
654
+ self.use_databricks_sdk = use_databricks_sdk
655
+ self.databricks_auth_profile = databricks_auth_profile
656
+ self.client_id = client_id
657
+ self.client_secret = client_secret
658
+ self.use_secret_scope_token = use_secret_scope_token
659
+
660
+ def __eq__(self, other):
661
+ if isinstance(other, self.__class__):
662
+ return self.__dict__ == other.__dict__
663
+ return NotImplemented
664
+
665
+ @property
666
+ def verify(self):
667
+ if self.use_databricks_sdk:
668
+ # Let databricks-sdk set HTTP request `verify` param.
669
+ return None
670
+ if self.server_cert_path is None:
671
+ return not self.ignore_tls_verification
672
+ else:
673
+ return self.server_cert_path