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,363 @@
1
+ """
2
+ NOTE: The contents of this file have been inlined from the wrapt package's source code
3
+ https://github.com/GrahamDumpleton/wrapt/blob/1.12.1/src/wrapt/importer.py.
4
+ Some modifications, have been made in order to:
5
+ - avoid duplicate registration of import hooks
6
+ - inline functions from dependent wrapt submodules rather than importing them.
7
+
8
+ This module implements a post import hook mechanism styled after what is described in PEP-369.
9
+ Note that it doesn't cope with modules being reloaded.
10
+ It also extends the functionality to support custom hooks for import errors
11
+ (as opposed to only successful imports).
12
+ """
13
+
14
+ import importlib # noqa: F401
15
+ import sys
16
+ import threading
17
+
18
+ string_types = (str,)
19
+
20
+
21
+ # from .decorators import synchronized
22
+ # NOTE: Instead of using this import (from wrapt's decorator module, see
23
+ # https://github.com/GrahamDumpleton/wrapt/blob/68316bea668fd905a4acb21f37f12596d8c30d80/src/wrapt/decorators.py#L430-L456),
24
+ # we define a decorator with similar behavior that acquires a lock while calling the decorated
25
+ # function
26
+ def synchronized(lock):
27
+ def decorator(f):
28
+ # See e.g. https://www.python.org/dev/peps/pep-0318/#examples
29
+ def new_fn(*args, **kwargs):
30
+ with lock:
31
+ return f(*args, **kwargs)
32
+
33
+ return new_fn
34
+
35
+ return decorator
36
+
37
+
38
+ # The dictionary registering any post import hooks to be triggered once
39
+ # the target module has been imported. Once a module has been imported
40
+ # and the hooks fired, the list of hooks recorded against the target
41
+ # module will be truncated but the list left in the dictionary. This
42
+ # acts as a flag to indicate that the module had already been imported.
43
+
44
+ _post_import_hooks = {}
45
+ _post_import_hooks_lock = threading.RLock()
46
+
47
+ # A dictionary for any import hook error handlers to be triggered when the
48
+ # target module import fails.
49
+
50
+ _import_error_hooks = {}
51
+ _import_error_hooks_lock = threading.RLock()
52
+
53
+ _import_hook_finder_init = False
54
+
55
+ # Register a new post import hook for the target module name. This
56
+ # differs from the PEP-369 implementation in that it also allows the
57
+ # hook function to be specified as a string consisting of the name of
58
+ # the callback in the form 'module:function'. This will result in a
59
+ # proxy callback being registered which will defer loading of the
60
+ # specified module containing the callback function until required.
61
+
62
+
63
+ def _create_import_hook_from_string(name):
64
+ def import_hook(module):
65
+ module_name, function = name.split(":")
66
+ attrs = function.split(".")
67
+ __import__(module_name)
68
+ callback = sys.modules[module_name]
69
+ for attr in attrs:
70
+ callback = getattr(callback, attr)
71
+ return callback(module)
72
+
73
+ return import_hook
74
+
75
+
76
+ def register_generic_import_hook(hook, name, hook_dict, overwrite):
77
+ # Create a deferred import hook if hook is a string name rather than
78
+ # a callable function.
79
+
80
+ if isinstance(hook, string_types):
81
+ hook = _create_import_hook_from_string(hook)
82
+
83
+ # Automatically install the import hook finder if it has not already
84
+ # been installed.
85
+
86
+ global _import_hook_finder_init
87
+ if not _import_hook_finder_init:
88
+ _import_hook_finder_init = True
89
+ sys.meta_path.insert(0, ImportHookFinder())
90
+
91
+ # Determine if any prior registration of an import hook for
92
+ # the target modules has occurred and act appropriately.
93
+
94
+ hooks = hook_dict.get(name, None)
95
+
96
+ if hooks is None:
97
+ # No prior registration of import hooks for the target
98
+ # module. We need to check whether the module has already been
99
+ # imported. If it has we fire the hook immediately and add an
100
+ # empty list to the registry to indicate that the module has
101
+ # already been imported and hooks have fired. Otherwise add
102
+ # the post import hook to the registry.
103
+
104
+ module = sys.modules.get(name, None)
105
+
106
+ if module is not None:
107
+ hook_dict[name] = []
108
+ hook(module)
109
+
110
+ else:
111
+ hook_dict[name] = [hook]
112
+
113
+ elif hooks == []:
114
+ # A prior registration of import hooks for the target
115
+ # module was done and the hooks already fired. Fire the hook
116
+ # immediately.
117
+
118
+ module = sys.modules[name]
119
+ hook(module)
120
+
121
+ else:
122
+ # A prior registration of import hooks for the target
123
+ # module was done but the module has not yet been imported.
124
+
125
+ def hooks_equal(existing_hook, hook):
126
+ if hasattr(existing_hook, "__name__") and hasattr(hook, "__name__"):
127
+ return existing_hook.__name__ == hook.__name__
128
+ else:
129
+ return False
130
+
131
+ if overwrite:
132
+ hook_dict[name] = [
133
+ existing_hook
134
+ for existing_hook in hook_dict[name]
135
+ if not hooks_equal(existing_hook, hook)
136
+ ]
137
+
138
+ hook_dict[name].append(hook)
139
+
140
+
141
+ @synchronized(_import_error_hooks_lock)
142
+ def register_import_error_hook(hook, name, overwrite=True):
143
+ """
144
+ Args:
145
+ hook: A function or string entrypoint to invoke when the specified module is imported
146
+ and an error occurs.
147
+ name: The name of the module for which to fire the hook at import error detection time.
148
+ overwrite: Specifies the desired behavior when a preexisting hook for the same
149
+ function / entrypoint already exists for the specified module. If `True`,
150
+ all preexisting hooks matching the specified function / entrypoint will be
151
+ removed and replaced with a single instance of the specified `hook`.
152
+ """
153
+ register_generic_import_hook(hook, name, _import_error_hooks, overwrite)
154
+
155
+
156
+ @synchronized(_post_import_hooks_lock)
157
+ def register_post_import_hook(hook, name, overwrite=True):
158
+ """
159
+ Args:
160
+ hook: A function or string entrypoint to invoke when the specified module is imported.
161
+ name: The name of the module for which to fire the hook at import time.
162
+ overwrite: Specifies the desired behavior when a preexisting hook for the same
163
+ function / entrypoint already exists for the specified module. If `True`,
164
+ all preexisting hooks matching the specified function / entrypoint will be
165
+ removed and replaced with a single instance of the specified `hook`.
166
+ """
167
+ register_generic_import_hook(hook, name, _post_import_hooks, overwrite)
168
+
169
+
170
+ @synchronized(_post_import_hooks_lock)
171
+ def get_post_import_hooks(name):
172
+ return _post_import_hooks.get(name)
173
+
174
+
175
+ # Register post import hooks defined as package entry points.
176
+
177
+
178
+ def _create_import_hook_from_entrypoint(entrypoint):
179
+ def import_hook(module):
180
+ __import__(entrypoint.module_name)
181
+ callback = sys.modules[entrypoint.module_name]
182
+ for attr in entrypoint.attrs:
183
+ callback = getattr(callback, attr)
184
+ return callback(module)
185
+
186
+ return import_hook
187
+
188
+
189
+ def discover_post_import_hooks(group):
190
+ # New in 3.9: https://docs.python.org/3/library/importlib.resources.html#importlib.resources.files
191
+ if sys.version_info.major > 2 and sys.version_info.minor > 8:
192
+ from importlib.resources import files # clint: disable=lazy-builtin-import
193
+
194
+ for entrypoint in (
195
+ resource.name for resource in files(group).iterdir() if resource.is_file()
196
+ ):
197
+ callback = _create_import_hook_from_entrypoint(entrypoint)
198
+ register_post_import_hook(callback, entrypoint.name)
199
+ else:
200
+ from importlib.resources import contents # clint: disable=lazy-builtin-import
201
+
202
+ for entrypoint in contents(group):
203
+ callback = _create_import_hook_from_entrypoint(entrypoint)
204
+ register_post_import_hook(callback, entrypoint.name)
205
+
206
+
207
+ # Indicate that a module has been loaded. Any post import hooks which
208
+ # were registered against the target module will be invoked. If an
209
+ # exception is raised in any of the post import hooks, that will cause
210
+ # the import of the target module to fail.
211
+
212
+
213
+ @synchronized(_post_import_hooks_lock)
214
+ def notify_module_loaded(module):
215
+ name = getattr(module, "__name__", None)
216
+ hooks = _post_import_hooks.get(name)
217
+
218
+ if hooks:
219
+ _post_import_hooks[name] = []
220
+
221
+ for hook in hooks:
222
+ hook(module)
223
+
224
+
225
+ @synchronized(_import_error_hooks_lock)
226
+ def notify_module_import_error(module_name):
227
+ hooks = _import_error_hooks.get(module_name)
228
+
229
+ if hooks:
230
+ # Error hooks differ from post import hooks, in that we don't clear the
231
+ # hook as soon as it fires.
232
+ for hook in hooks:
233
+ hook(module_name)
234
+
235
+
236
+ # A custom module import finder. This intercepts attempts to import
237
+ # modules and watches out for attempts to import target modules of
238
+ # interest. When a module of interest is imported, then any post import
239
+ # hooks which are registered will be invoked.
240
+
241
+
242
+ class _ImportHookChainedLoader:
243
+ def __init__(self, loader):
244
+ self.loader = loader
245
+
246
+ def load_module(self, fullname):
247
+ try:
248
+ module = self.loader.load_module(fullname)
249
+ notify_module_loaded(module)
250
+ except (ImportError, AttributeError):
251
+ notify_module_import_error(fullname)
252
+ raise
253
+
254
+ return module
255
+
256
+
257
+ class ImportHookFinder:
258
+ def __init__(self):
259
+ self.in_progress = {}
260
+
261
+ @synchronized(_post_import_hooks_lock)
262
+ @synchronized(_import_error_hooks_lock)
263
+ def find_module(self, fullname, path=None):
264
+ # If the module being imported is not one we have registered
265
+ # import hooks for, we can return immediately. We will
266
+ # take no further part in the importing of this module.
267
+
268
+ if fullname not in _post_import_hooks and fullname not in _import_error_hooks:
269
+ return None
270
+
271
+ # When we are interested in a specific module, we will call back
272
+ # into the import system a second time to defer to the import
273
+ # finder that is supposed to handle the importing of the module.
274
+ # We set an in progress flag for the target module so that on
275
+ # the second time through we don't trigger another call back
276
+ # into the import system and cause a infinite loop.
277
+
278
+ if fullname in self.in_progress:
279
+ return None
280
+
281
+ self.in_progress[fullname] = True
282
+
283
+ # Now call back into the import system again.
284
+
285
+ try:
286
+ # For Python 3 we need to use find_spec().loader
287
+ # from the importlib.util module. It doesn't actually
288
+ # import the target module and only finds the
289
+ # loader. If a loader is found, we need to return
290
+ # our own loader which will then in turn call the
291
+ # real loader to import the module and invoke the
292
+ # post import hooks.
293
+ try:
294
+ import importlib.util # clint: disable=lazy-builtin-import
295
+
296
+ loader = importlib.util.find_spec(fullname).loader
297
+ # If an ImportError (or AttributeError) is encountered while finding the module,
298
+ # notify the hooks for import errors
299
+ except (ImportError, AttributeError):
300
+ notify_module_import_error(fullname)
301
+ loader = importlib.find_loader(fullname, path)
302
+ if loader:
303
+ return _ImportHookChainedLoader(loader)
304
+ finally:
305
+ del self.in_progress[fullname]
306
+
307
+ @synchronized(_post_import_hooks_lock)
308
+ @synchronized(_import_error_hooks_lock)
309
+ def find_spec(self, fullname, path, target=None):
310
+ # If the module being imported is not one we have registered
311
+ # import hooks for, we can return immediately. We will
312
+ # take no further part in the importing of this module.
313
+
314
+ if fullname not in _post_import_hooks and fullname not in _import_error_hooks:
315
+ return None
316
+
317
+ # When we are interested in a specific module, we will call back
318
+ # into the import system a second time to defer to the import
319
+ # finder that is supposed to handle the importing of the module.
320
+ # We set an in progress flag for the target module so that on
321
+ # the second time through we don't trigger another call back
322
+ # into the import system and cause a infinite loop.
323
+
324
+ if fullname in self.in_progress:
325
+ return None
326
+
327
+ self.in_progress[fullname] = True
328
+
329
+ # Now call back into the import system again.
330
+
331
+ try:
332
+ import importlib.util # clint: disable=lazy-builtin-import
333
+
334
+ spec = importlib.util.find_spec(fullname)
335
+ # Replace the module spec's loader with a wrapped version that executes import
336
+ # hooks when the module is loaded
337
+ spec.loader = _ImportHookChainedLoader(spec.loader)
338
+ return spec
339
+ except (ImportError, AttributeError):
340
+ notify_module_import_error(fullname)
341
+ finally:
342
+ del self.in_progress[fullname]
343
+
344
+
345
+ # Decorator for marking that a function should be called as a post
346
+ # import hook when the target module is imported.
347
+ # If error_handler is True, then apply the marked function as an import hook
348
+ # for import errors (instead of successful imports).
349
+ # It is assumed that all error hooks are added during driver start-up,
350
+ # and thus added prior to any import calls. If an error hook is added
351
+ # after a module has already failed the import, there's no guarantee
352
+ # that the hook will fire.
353
+
354
+
355
+ def when_imported(name, error_handler=False):
356
+ def register(hook):
357
+ if error_handler:
358
+ register_import_error_hook(hook, name)
359
+ else:
360
+ register_post_import_hook(hook, name)
361
+ return hook
362
+
363
+ return register
@@ -0,0 +1,51 @@
1
+ """Utility to lazy load modules."""
2
+
3
+ import importlib
4
+ import sys
5
+ import types
6
+
7
+
8
+ class LazyLoader(types.ModuleType):
9
+ """Class for module lazy loading.
10
+
11
+ This class helps lazily load modules at package level, which avoids pulling in large
12
+ dependencies like `tensorflow` or `torch`. This class is mirrored from wandb's LazyLoader:
13
+ https://github.com/wandb/wandb/blob/79b2d4b73e3a9e4488e503c3131ff74d151df689/wandb/sdk/lib/lazyloader.py#L9
14
+ """
15
+
16
+ def __init__(self, local_name, parent_module_globals, name):
17
+ self._local_name = local_name
18
+ self._parent_module_globals = parent_module_globals
19
+
20
+ self._module = None
21
+ super().__init__(str(name))
22
+
23
+ def _load(self):
24
+ """Load the module and insert it into the parent's globals."""
25
+ if self._module:
26
+ # If already loaded, return the loaded module.
27
+ return self._module
28
+
29
+ # Import the target module and insert it into the parent's namespace
30
+ module = importlib.import_module(self.__name__)
31
+ self._parent_module_globals[self._local_name] = module
32
+ sys.modules[self._local_name] = module
33
+
34
+ # Update this object's dict so that if someone keeps a reference to the `LazyLoader`,
35
+ # lookups are efficient (`__getattr__` is only called on lookups that fail).
36
+ self.__dict__.update(module.__dict__)
37
+
38
+ return module
39
+
40
+ def __getattr__(self, item):
41
+ module = self._load()
42
+ return getattr(module, item)
43
+
44
+ def __dir__(self):
45
+ module = self._load()
46
+ return dir(module)
47
+
48
+ def __repr__(self):
49
+ if not self._module:
50
+ return f"<module '{self.__name__} (Not loaded yet)'>"
51
+ return repr(self._module)
@@ -0,0 +1,168 @@
1
+ import contextlib
2
+ import logging
3
+ import logging.config
4
+ import re
5
+ import sys
6
+
7
+ from mlflow.environment_variables import MLFLOW_LOGGING_LEVEL
8
+
9
+ # Logging format example:
10
+ # 2018/11/20 12:36:37 INFO mlflow.sagemaker: Creating new SageMaker endpoint
11
+ LOGGING_LINE_FORMAT = "%(asctime)s %(levelname)s %(name)s: %(message)s"
12
+ LOGGING_DATETIME_FORMAT = "%Y/%m/%d %H:%M:%S"
13
+
14
+
15
+ class MlflowLoggingStream:
16
+ """
17
+ A Python stream for use with event logging APIs throughout MLflow (`eprint()`,
18
+ `logger.info()`, etc.). This stream wraps `sys.stderr`, forwarding `write()` and
19
+ `flush()` calls to the stream referred to by `sys.stderr` at the time of the call.
20
+ It also provides capabilities for disabling the stream to silence event logs.
21
+ """
22
+
23
+ def __init__(self):
24
+ self._enabled = True
25
+
26
+ def write(self, text):
27
+ if self._enabled:
28
+ sys.stderr.write(text)
29
+
30
+ def flush(self):
31
+ if self._enabled:
32
+ sys.stderr.flush()
33
+
34
+ @property
35
+ def enabled(self):
36
+ return self._enabled
37
+
38
+ @enabled.setter
39
+ def enabled(self, value):
40
+ self._enabled = value
41
+
42
+
43
+ MLFLOW_LOGGING_STREAM = MlflowLoggingStream()
44
+
45
+
46
+ def disable_logging():
47
+ """
48
+ Disables the `MlflowLoggingStream` used by event logging APIs throughout MLflow
49
+ (`eprint()`, `logger.info()`, etc), silencing all subsequent event logs.
50
+ """
51
+ MLFLOW_LOGGING_STREAM.enabled = False
52
+
53
+
54
+ def enable_logging():
55
+ """
56
+ Enables the `MlflowLoggingStream` used by event logging APIs throughout MLflow
57
+ (`eprint()`, `logger.info()`, etc), emitting all subsequent event logs. This
58
+ reverses the effects of `disable_logging()`.
59
+ """
60
+ MLFLOW_LOGGING_STREAM.enabled = True
61
+
62
+
63
+ class MlflowFormatter(logging.Formatter):
64
+ """
65
+ Custom Formatter Class to support colored log
66
+ ANSI characters might not work natively on older Windows, so disabling the feature for win32.
67
+ See https://github.com/borntyping/python-colorlog/blob/dfa10f59186d3d716aec4165ee79e58f2265c0eb/colorlog/escape_codes.py#L16C8-L16C31
68
+ """
69
+
70
+ # Copied from color log package https://github.com/borntyping/python-colorlog/blob/dfa10f59186d3d716aec4165ee79e58f2265c0eb/colorlog/escape_codes.py#L33-L50
71
+ COLORS = {
72
+ "black": 30,
73
+ "red": 31,
74
+ "green": 32,
75
+ "yellow": 33,
76
+ "blue": 34,
77
+ "purple": 35,
78
+ "cyan": 36,
79
+ "white": 37,
80
+ "light_black": 90,
81
+ "light_red": 91,
82
+ "light_green": 92,
83
+ "light_yellow": 93,
84
+ "light_blue": 94,
85
+ "light_purple": 95,
86
+ "light_cyan": 96,
87
+ "light_white": 97,
88
+ }
89
+ RESET = "\033[0m"
90
+
91
+ def format(self, record):
92
+ if color := getattr(record, "color", None):
93
+ if color in self.COLORS and sys.platform != "win32":
94
+ color_code = self._escape(self.COLORS[color])
95
+ return f"{color_code}{super().format(record)}{self.RESET}"
96
+ return super().format(record)
97
+
98
+ def _escape(self, code: int) -> str:
99
+ return f"\033[{code}m"
100
+
101
+
102
+ def _configure_mlflow_loggers(root_module_name):
103
+ logging.config.dictConfig(
104
+ {
105
+ "version": 1,
106
+ "disable_existing_loggers": False,
107
+ "formatters": {
108
+ "mlflow_formatter": {
109
+ "()": MlflowFormatter,
110
+ "format": LOGGING_LINE_FORMAT,
111
+ "datefmt": LOGGING_DATETIME_FORMAT,
112
+ },
113
+ },
114
+ "handlers": {
115
+ "mlflow_handler": {
116
+ "formatter": "mlflow_formatter",
117
+ "class": "logging.StreamHandler",
118
+ "stream": MLFLOW_LOGGING_STREAM,
119
+ },
120
+ },
121
+ "loggers": {
122
+ root_module_name: {
123
+ "handlers": ["mlflow_handler"],
124
+ "level": (MLFLOW_LOGGING_LEVEL.get() or "INFO").upper(),
125
+ "propagate": False,
126
+ },
127
+ },
128
+ }
129
+ )
130
+
131
+
132
+ def eprint(*args, **kwargs):
133
+ print(*args, file=MLFLOW_LOGGING_STREAM, **kwargs)
134
+
135
+
136
+ class LoggerMessageFilter(logging.Filter):
137
+ def __init__(self, module: str, filter_regex: re.Pattern):
138
+ super().__init__()
139
+ self._pattern = filter_regex
140
+ self._module = module
141
+
142
+ def filter(self, record):
143
+ if record.name == self._module and self._pattern.search(record.msg):
144
+ return False
145
+ return True
146
+
147
+
148
+ @contextlib.contextmanager
149
+ def suppress_logs(module: str, filter_regex: re.Pattern):
150
+ """
151
+ Context manager that suppresses log messages from the specified module that match the specified
152
+ regular expression. This is useful for suppressing expected log messages from third-party
153
+ libraries that are not relevant to the current test.
154
+ """
155
+ logger = logging.getLogger(module)
156
+ filter = LoggerMessageFilter(module=module, filter_regex=filter_regex)
157
+ logger.addFilter(filter)
158
+ try:
159
+ yield
160
+ finally:
161
+ logger.removeFilter(filter)
162
+
163
+
164
+ def _debug(s: str) -> None:
165
+ """
166
+ Debug function to test logging level.
167
+ """
168
+ logging.getLogger(__name__).debug(s)
@@ -0,0 +1,58 @@
1
+ import os
2
+ import pathlib
3
+ from mimetypes import guess_type
4
+
5
+ from mlflow.version import IS_TRACING_SDK_ONLY
6
+
7
+
8
+ # TODO: Create a module to define constants to avoid circular imports
9
+ # and move MLMODEL_FILE_NAME and MLPROJECT_FILE_NAME in the module.
10
+ def get_text_extensions():
11
+ exts = [
12
+ "txt",
13
+ "log",
14
+ "err",
15
+ "cfg",
16
+ "conf",
17
+ "cnf",
18
+ "cf",
19
+ "ini",
20
+ "properties",
21
+ "prop",
22
+ "hocon",
23
+ "toml",
24
+ "yaml",
25
+ "yml",
26
+ "xml",
27
+ "json",
28
+ "js",
29
+ "py",
30
+ "py3",
31
+ "csv",
32
+ "tsv",
33
+ "md",
34
+ "rst",
35
+ ]
36
+
37
+ if not IS_TRACING_SDK_ONLY:
38
+ from mlflow.models.model import MLMODEL_FILE_NAME
39
+ from mlflow.projects._project_spec import MLPROJECT_FILE_NAME
40
+
41
+ exts.extend([MLMODEL_FILE_NAME, MLPROJECT_FILE_NAME])
42
+
43
+ return exts
44
+
45
+
46
+ def _guess_mime_type(file_path):
47
+ filename = pathlib.Path(file_path).name
48
+ extension = os.path.splitext(filename)[-1].replace(".", "")
49
+ # for MLmodel/mlproject with no extensions
50
+ if extension == "":
51
+ extension = filename
52
+ if extension in get_text_extensions():
53
+ return "text/plain"
54
+ mime_type, _ = guess_type(filename)
55
+ if not mime_type:
56
+ # As a fallback, if mime type is not detected, treat it as a binary file
57
+ return "application/octet-stream"
58
+ return mime_type