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,105 @@
1
+ # NB: These keys are placeholders and subject to change
2
+ class TraceMetadataKey:
3
+ INPUTS = "mlflow.traceInputs"
4
+ OUTPUTS = "mlflow.traceOutputs"
5
+ SOURCE_RUN = "mlflow.sourceRun"
6
+ MODEL_ID = "mlflow.modelId"
7
+ # Trace size statistics including total size, number of spans, and max span size
8
+ SIZE_STATS = "mlflow.trace.sizeStats"
9
+ # Aggregated token usage information in a single trace, stored as a dumped JSON string.
10
+ TOKEN_USAGE = "mlflow.trace.tokenUsage"
11
+ # Store the user ID/name of the application request. Do not confuse this with mlflow.user
12
+ # tag, which stores "who created the trace" i.e. developer or system name.
13
+ TRACE_USER = "mlflow.trace.user"
14
+ # Store the session ID of the application request.
15
+ TRACE_SESSION = "mlflow.trace.session"
16
+
17
+ # Total size of the trace in bytes. Deprecated, use SIZE_STATS instead.
18
+ SIZE_BYTES = "mlflow.trace.sizeBytes"
19
+
20
+
21
+ class TraceTagKey:
22
+ TRACE_NAME = "mlflow.traceName"
23
+ EVAL_REQUEST_ID = "eval.requestId"
24
+
25
+
26
+ class TokenUsageKey:
27
+ """Key for the token usage information in the `mlflow.chat.tokenUsage` span attribute."""
28
+
29
+ INPUT_TOKENS = "input_tokens"
30
+ OUTPUT_TOKENS = "output_tokens"
31
+ TOTAL_TOKENS = "total_tokens"
32
+
33
+ @classmethod
34
+ def all_keys(cls):
35
+ return [cls.INPUT_TOKENS, cls.OUTPUT_TOKENS, cls.TOTAL_TOKENS]
36
+
37
+
38
+ class TraceSizeStatsKey:
39
+ TOTAL_SIZE_BYTES = "total_size_bytes"
40
+ NUM_SPANS = "num_spans"
41
+ MAX_SPAN_SIZE_BYTES = "max"
42
+ P25_SPAN_SIZE_BYTES = "p25"
43
+ P50_SPAN_SIZE_BYTES = "p50"
44
+ P75_SPAN_SIZE_BYTES = "p75"
45
+
46
+
47
+ # A set of reserved attribute keys
48
+ class SpanAttributeKey:
49
+ EXPERIMENT_ID = "mlflow.experimentId"
50
+ REQUEST_ID = "mlflow.traceRequestId"
51
+ INPUTS = "mlflow.spanInputs"
52
+ OUTPUTS = "mlflow.spanOutputs"
53
+ SPAN_TYPE = "mlflow.spanType"
54
+ FUNCTION_NAME = "mlflow.spanFunctionName"
55
+ START_TIME_NS = "mlflow.spanStartTimeNs"
56
+ # these attributes are for standardized chat messages and tool definitions
57
+ # in CHAT_MODEL and LLM spans. they are used for rendering the rich chat
58
+ # display in the trace UI, as well as downstream consumers of trace data
59
+ # such as evaluation
60
+ CHAT_MESSAGES = "mlflow.chat.messages"
61
+ CHAT_TOOLS = "mlflow.chat.tools"
62
+ # This attribute is used to store token usage information from LLM responses.
63
+ # Stored in {"input_tokens": int, "output_tokens": int, "total_tokens": int} format.
64
+ CHAT_USAGE = "mlflow.chat.tokenUsage"
65
+ # This attribute is used to populate `intermediate_outputs` property of a trace data
66
+ # representing intermediate outputs of the trace. This attribute is not empty only on
67
+ # the root span of a trace created by the `mlflow.log_trace` API. The `intermediate_outputs`
68
+ # property of the normal trace is generated by the outputs of non-root spans.
69
+ INTERMEDIATE_OUTPUTS = "mlflow.trace.intermediate_outputs"
70
+
71
+
72
+ class AssessmentMetadataKey:
73
+ SOURCE_RUN_ID = "mlflow.assessment.sourceRunId"
74
+
75
+
76
+ # All storage backends are guaranteed to support request_metadata key/value up to 250 characters
77
+ MAX_CHARS_IN_TRACE_INFO_METADATA = 250
78
+ # All storage backends are guaranteed to support tag keys up to 250 characters,
79
+ # values up to 4096 characters
80
+ MAX_CHARS_IN_TRACE_INFO_TAGS_KEY = 250
81
+ MAX_CHARS_IN_TRACE_INFO_TAGS_VALUE = 4096
82
+ TRUNCATION_SUFFIX = "..."
83
+
84
+ TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_DBX = 10000
85
+ TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_OSS = 1000
86
+
87
+ # Trace request ID must have the prefix "tr-" appended to the OpenTelemetry trace ID
88
+ TRACE_REQUEST_ID_PREFIX = "tr-"
89
+
90
+ # Schema version of traces and spans.
91
+ TRACE_SCHEMA_VERSION = 3
92
+
93
+ # Key for the trace schema version in the trace. This key is also used in
94
+ # Databricks model serving to be careful when modifying it.
95
+ TRACE_SCHEMA_VERSION_KEY = "mlflow.trace_schema.version"
96
+
97
+
98
+ STREAM_CHUNK_EVENT_NAME_FORMAT = "mlflow.chunk.item.{index}"
99
+ STREAM_CHUNK_EVENT_VALUE_KEY = "mlflow.chunk.value"
100
+
101
+
102
+ # Key for Databricks model serving options to return the trace in the response
103
+ DATABRICKS_OPTIONS_KEY = "databricks_options"
104
+ RETURN_TRACE_OPTION_KEY = "return_trace"
105
+ DATABRICKS_OUTPUT_KEY = "databricks_output"
@@ -0,0 +1,81 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ from mlflow.exceptions import MlflowException
5
+ from mlflow.utils.annotations import experimental
6
+
7
+
8
+ @experimental(version="2.21.0")
9
+ @dataclass
10
+ class TraceDestination:
11
+ """A configuration object for specifying the destination of trace data."""
12
+
13
+ @property
14
+ def type(self) -> str:
15
+ """Type of the destination."""
16
+ raise NotImplementedError
17
+
18
+
19
+ @experimental(version="2.21.0")
20
+ @dataclass
21
+ class MlflowExperiment(TraceDestination):
22
+ """
23
+ A destination representing an MLflow experiment.
24
+
25
+ By setting this destination in the :py:func:`mlflow.tracing.set_destination` function,
26
+ MLflow will log traces to the specified experiment.
27
+
28
+ Attributes:
29
+ experiment_id: The ID of the experiment to log traces to. If not specified,
30
+ the current active experiment will be used.
31
+ tracking_uri: The tracking URI of the MLflow server to log traces to.
32
+ If not specified, the current tracking URI will be used.
33
+ """
34
+
35
+ experiment_id: Optional[str] = None
36
+ tracking_uri: Optional[str] = None
37
+
38
+ @property
39
+ def type(self) -> str:
40
+ return "experiment"
41
+
42
+
43
+ @experimental(version="2.22.0")
44
+ @dataclass
45
+ class Databricks(TraceDestination):
46
+ """
47
+ A destination representing a Databricks tracing server.
48
+
49
+ By setting this destination in the :py:func:`mlflow.tracing.set_destination` function,
50
+ MLflow will log traces to the specified experiment.
51
+
52
+ If neither experiment_id nor experiment_name is specified, an active experiment
53
+ when traces are created will be used as the destination.
54
+ If both are specified, they must refer to the same experiment.
55
+
56
+ Attributes:
57
+ experiment_id: The ID of the experiment to log traces to.
58
+ experiment_name: The name of the experiment to log traces to.
59
+ """
60
+
61
+ experiment_id: Optional[str] = None
62
+ experiment_name: Optional[str] = None
63
+
64
+ def __post_init__(self):
65
+ if self.experiment_id is not None:
66
+ self.experiment_id = str(self.experiment_id)
67
+
68
+ if self.experiment_name is not None:
69
+ from mlflow.tracking._tracking_service.utils import _get_store
70
+
71
+ # NB: Use store directly rather than fluent API to avoid dependency on MLflowClient
72
+ experiment_id = _get_store().get_experiment_by_name(self.experiment_name).experiment_id
73
+ if self.experiment_id is not None and self.experiment_id != experiment_id:
74
+ raise MlflowException.invalid_parameter_value(
75
+ "experiment_id and experiment_name must refer to the same experiment"
76
+ )
77
+ self.experiment_id = experiment_id
78
+
79
+ @property
80
+ def type(self) -> str:
81
+ return "databricks"
@@ -0,0 +1,40 @@
1
+ from mlflow.tracing.display.display_handler import (
2
+ IPythonTraceDisplayHandler,
3
+ get_notebook_iframe_html,
4
+ is_using_tracking_server,
5
+ )
6
+
7
+ __all__ = [
8
+ "IPythonTraceDisplayHandler",
9
+ "get_display_handler",
10
+ "is_using_tracking_server",
11
+ "get_notebook_iframe_html",
12
+ ]
13
+
14
+
15
+ def get_display_handler() -> IPythonTraceDisplayHandler:
16
+ return IPythonTraceDisplayHandler.get_instance()
17
+
18
+
19
+ def disable_notebook_display():
20
+ """
21
+ Disables displaying the MLflow Trace UI in notebook output cells.
22
+ Call :py:func:`mlflow.tracing.enable_notebook_display()` to re-enable display.
23
+ """
24
+ IPythonTraceDisplayHandler.disable()
25
+
26
+
27
+ def enable_notebook_display():
28
+ """
29
+ Enables the MLflow Trace UI in notebook output cells. The display is on
30
+ by default, and the Trace UI will show up when any of the following operations
31
+ are executed:
32
+
33
+ * On trace completion (i.e. whenever a trace is exported)
34
+ * When calling the :py:func:`mlflow.search_traces` fluent API
35
+ * When calling the :py:meth:`mlflow.client.MlflowClient.get_trace`
36
+ or :py:meth:`mlflow.client.MlflowClient.search_traces` client APIs
37
+
38
+ To disable, please call :py:func:`mlflow.tracing.disable_notebook_display()`.
39
+ """
40
+ IPythonTraceDisplayHandler.enable()
@@ -0,0 +1,196 @@
1
+ import html
2
+ import json
3
+ import logging
4
+ from typing import TYPE_CHECKING
5
+ from urllib.parse import urlencode, urljoin
6
+
7
+ import mlflow
8
+ from mlflow.environment_variables import MLFLOW_MAX_TRACES_TO_DISPLAY_IN_NOTEBOOK
9
+ from mlflow.utils.databricks_utils import is_in_databricks_runtime
10
+ from mlflow.utils.uri import is_http_uri
11
+
12
+ _logger = logging.getLogger(__name__)
13
+
14
+ if TYPE_CHECKING:
15
+ from mlflow.entities import Trace
16
+
17
+
18
+ TRACE_RENDERER_ASSET_PATH = "/static-files/lib/notebook-trace-renderer/index.html"
19
+
20
+ IFRAME_HTML = """
21
+ <div>
22
+ <style scoped>
23
+ button {{
24
+ border: none;
25
+ border-radius: 4px;
26
+ background-color: rgb(34, 114, 180);
27
+ font-family: -apple-system, "system-ui", "Segoe UI", Roboto, "Helvetica Neue", Arial;
28
+ font-size: 13px;
29
+ color: white;
30
+ margin-top: 8px;
31
+ margin-bottom: 8px;
32
+ padding: 8px 16px;
33
+ cursor: pointer;
34
+ }}
35
+ button:hover {{
36
+ background-color: rgb(66, 153, 224);
37
+ }}
38
+ </style>
39
+ <button
40
+ onclick="
41
+ const display = this.nextElementSibling.style.display;
42
+ const isCollapsed = display === 'none';
43
+ this.nextElementSibling.style.display = isCollapsed ? null : 'none';
44
+
45
+ const verb = isCollapsed ? 'Collapse' : 'Expand';
46
+ this.innerText = `${{verb}} MLflow Trace`;
47
+ "
48
+ >Collapse MLflow Trace</button>
49
+ <iframe
50
+ id="trace-renderer"
51
+ style="width: 100%; height: 500px; border: none; resize: vertical;"
52
+ src="{src}"
53
+ />
54
+ </div>
55
+ """
56
+
57
+
58
+ def get_notebook_iframe_html(traces: list["Trace"]):
59
+ # fetch assets from tracking server
60
+ uri = urljoin(mlflow.get_tracking_uri(), TRACE_RENDERER_ASSET_PATH)
61
+ query_string = _get_query_string_for_traces(traces)
62
+
63
+ # include mlflow version to invalidate browser cache when mlflow updates
64
+ src = html.escape(f"{uri}?{query_string}&version={mlflow.__version__}")
65
+ return IFRAME_HTML.format(src=src)
66
+
67
+
68
+ def _serialize_trace_list(traces: list["Trace"]):
69
+ return json.dumps(
70
+ # we can't just call trace.to_json() because this
71
+ # will cause the trace to be serialized twice (once
72
+ # by to_json and once by json.dumps)
73
+ [json.loads(trace._serialize_for_mimebundle()) for trace in traces],
74
+ ensure_ascii=False,
75
+ )
76
+
77
+
78
+ def _get_query_string_for_traces(traces: list["Trace"]):
79
+ query_params = []
80
+
81
+ for trace in traces:
82
+ query_params.append(("trace_id", trace.info.request_id))
83
+ query_params.append(("experiment_id", trace.info.experiment_id))
84
+
85
+ return urlencode(query_params)
86
+
87
+
88
+ def _is_jupyter():
89
+ try:
90
+ from IPython import get_ipython
91
+
92
+ return get_ipython() is not None
93
+ except ImportError:
94
+ return False
95
+
96
+
97
+ def is_using_tracking_server():
98
+ return is_http_uri(mlflow.get_tracking_uri())
99
+
100
+
101
+ def is_trace_ui_available():
102
+ # the notebook display feature only works in
103
+ # Databricks notebooks, or in Jupyter notebooks
104
+ # with a tracking server
105
+ return _is_jupyter() and (is_in_databricks_runtime() or is_using_tracking_server())
106
+
107
+
108
+ class IPythonTraceDisplayHandler:
109
+ _instance = None
110
+ disabled = False
111
+
112
+ @classmethod
113
+ def get_instance(cls):
114
+ if cls._instance is None:
115
+ cls._instance = IPythonTraceDisplayHandler()
116
+ return cls._instance
117
+
118
+ @classmethod
119
+ def disable(cls):
120
+ cls.disabled = True
121
+
122
+ @classmethod
123
+ def enable(cls):
124
+ cls.disabled = False
125
+ if cls._instance is None:
126
+ cls._instance = IPythonTraceDisplayHandler()
127
+
128
+ def __init__(self):
129
+ self.traces_to_display = {}
130
+ if not _is_jupyter():
131
+ return
132
+
133
+ try:
134
+ from IPython import get_ipython
135
+
136
+ # Register a post-run cell display hook to display traces
137
+ # after the cell has executed. We don't validate that the
138
+ # user is using a tracking server at this step, because
139
+ # the user might set it later using mlflow.set_tracking_uri()
140
+ get_ipython().events.register("post_run_cell", self._display_traces_post_run)
141
+ except Exception:
142
+ # swallow exceptions. this function is called as
143
+ # a side-effect in a few other functions (e.g. log_trace,
144
+ # get_traces, search_traces), and we don't want to block
145
+ # the core functionality if the display fails.
146
+ _logger.debug("Failed to register post-run cell display hook", exc_info=True)
147
+
148
+ def _display_traces_post_run(self, result):
149
+ if self.disabled or not is_trace_ui_available():
150
+ self.traces_to_display = {}
151
+ return
152
+
153
+ try:
154
+ from IPython.display import display
155
+
156
+ MAX_TRACES_TO_DISPLAY = MLFLOW_MAX_TRACES_TO_DISPLAY_IN_NOTEBOOK.get()
157
+ traces_to_display = list(self.traces_to_display.values())[:MAX_TRACES_TO_DISPLAY]
158
+ if len(traces_to_display) == 0:
159
+ self.traces_to_display = {}
160
+ return
161
+
162
+ display(self.get_mimebundle(traces_to_display), raw=True)
163
+
164
+ # reset state
165
+ self.traces_to_display = {}
166
+ except Exception:
167
+ # swallow exceptions. this function is called as
168
+ # a side-effect in a few other functions (e.g. log_trace,
169
+ # get_traces, search_traces), and we don't want to block
170
+ # the core functionality if the display fails.
171
+ _logger.error("Failed to display traces", exc_info=True)
172
+ self.traces_to_display = {}
173
+
174
+ def get_mimebundle(self, traces: list["Trace"]):
175
+ if len(traces) == 1:
176
+ return traces[0]._repr_mimebundle_()
177
+ else:
178
+ bundle = {"text/plain": repr(traces)}
179
+ if is_in_databricks_runtime():
180
+ bundle["application/databricks.mlflow.trace"] = _serialize_trace_list(traces)
181
+ else:
182
+ bundle["text/html"] = get_notebook_iframe_html(traces)
183
+ return bundle
184
+
185
+ def display_traces(self, traces: list["Trace"]):
186
+ if self.disabled or not is_trace_ui_available():
187
+ return
188
+
189
+ try:
190
+ if len(traces) == 0:
191
+ return
192
+
193
+ traces_dict = {trace.info.request_id: trace for trace in traces}
194
+ self.traces_to_display.update(traces_dict)
195
+ except Exception:
196
+ _logger.debug("Failed to update traces", exc_info=True)
@@ -0,0 +1,186 @@
1
+ import atexit
2
+ import logging
3
+ import threading
4
+ import time
5
+ from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait
6
+ from dataclasses import dataclass
7
+ from queue import Empty, Queue
8
+ from queue import Full as queue_Full
9
+ from typing import Any, Callable, Sequence
10
+
11
+ from mlflow.environment_variables import (
12
+ MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE,
13
+ MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS,
14
+ )
15
+
16
+ _logger = logging.getLogger(__name__)
17
+
18
+
19
+ @dataclass
20
+ class Task:
21
+ """A dataclass to represent a simple task."""
22
+
23
+ handler: Callable[..., Any]
24
+ args: Sequence[Any]
25
+ error_msg: str = ""
26
+
27
+ def handle(self) -> None:
28
+ """Handle the task execution. This method must not raise any exception."""
29
+ try:
30
+ self.handler(*self.args)
31
+ except Exception as e:
32
+ _logger.warning(
33
+ f"{self.error_msg} Error: {e}.",
34
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
35
+ )
36
+
37
+
38
+ class AsyncTraceExportQueue:
39
+ """A queue-based asynchronous tracing export processor."""
40
+
41
+ def __init__(self):
42
+ self._queue: Queue[Task] = Queue(maxsize=MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE.get())
43
+ self._lock = threading.RLock()
44
+ self._max_workers = MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS.get()
45
+
46
+ # Thread event that indicates the queue should stop processing tasks
47
+ self._stop_event = threading.Event()
48
+ self._is_active = False
49
+ self._atexit_callback_registered = False
50
+
51
+ self._active_tasks = set()
52
+
53
+ self._last_full_queue_warning_time = None
54
+
55
+ def put(self, task: Task):
56
+ """Put a new task to the queue for processing."""
57
+ if not self.is_active():
58
+ self.activate()
59
+
60
+ # If stop event is set, wait for the queue to be drained before putting the task
61
+ if self._stop_event.is_set():
62
+ self._stop_event.wait()
63
+
64
+ try:
65
+ # Do not block if the queue is full, it will block the main application
66
+ self._queue.put(task, block=False)
67
+ except queue_Full:
68
+ if self._last_full_queue_warning_time is None or (
69
+ time.time() - self._last_full_queue_warning_time > 30
70
+ ):
71
+ _logger.warning(
72
+ "Trace export queue is full, trace will be discarded. "
73
+ "Consider increasing the queue size through "
74
+ "`MLFLOW_ASYNC_TRACE_LOGGING_MAX_QUEUE_SIZE` environment variable or "
75
+ "number of workers through `MLFLOW_ASYNC_TRACE_LOGGING_MAX_WORKERS`"
76
+ " environment variable."
77
+ )
78
+ self._last_full_queue_warning_time = time.time()
79
+
80
+ def _consumer_loop(self) -> None:
81
+ while not self._stop_event.is_set():
82
+ self._dispatch_task()
83
+
84
+ # Drain remaining tasks when stopping
85
+ while not self._queue.empty():
86
+ self._dispatch_task()
87
+
88
+ def _dispatch_task(self) -> None:
89
+ """Dispatch a task from the queue to the worker thread pool."""
90
+ # NB: Monitor number of active tasks being processed by the workers. If the all
91
+ # workers are busy, wait for one of them to finish before draining a new task
92
+ # from the queue. This is because ThreadPoolExecutor does not have a built-in
93
+ # mechanism to limit the number of pending tasks in the internal queue.
94
+ # This ruins the purpose of having a size bound for self._queue, because the
95
+ # TPE's internal queue can grow indefinitely and potentially run out of memory.
96
+ # Therefore, we should only dispatch a new task when there is a worker available,
97
+ # and pend the new tasks in the self._queue which has a size bound.
98
+ if len(self._active_tasks) >= self._max_workers:
99
+ _, self._active_tasks = wait(self._active_tasks, return_when=FIRST_COMPLETED)
100
+
101
+ try:
102
+ task = self._queue.get(timeout=1)
103
+ except Empty:
104
+ return
105
+
106
+ def _handle(task):
107
+ task.handle()
108
+ self._queue.task_done()
109
+
110
+ try:
111
+ future = self._worker_threadpool.submit(_handle, task)
112
+ self._active_tasks.add(future)
113
+ except Exception as e:
114
+ # In case it fails to submit the task to the worker thread pool
115
+ # such as interpreter shutdown, handle the task in this thread
116
+ _logger.debug(
117
+ f"Failed to submit task to worker thread pool. Error: {e}",
118
+ exc_info=True,
119
+ )
120
+ _handle(task)
121
+
122
+ def activate(self) -> None:
123
+ """Activate the async queue to accept and handle incoming tasks."""
124
+ with self._lock:
125
+ if self._is_active:
126
+ return
127
+
128
+ self._set_up_threads()
129
+
130
+ # Callback to ensure remaining tasks are processed before program exit
131
+ if not self._atexit_callback_registered:
132
+ atexit.register(self._at_exit_callback)
133
+ self._atexit_callback_registered = True
134
+
135
+ self._is_active = True
136
+
137
+ def is_active(self) -> bool:
138
+ return self._is_active
139
+
140
+ def _set_up_threads(self) -> None:
141
+ """Set up the consumer and worker threads."""
142
+ with self._lock:
143
+ self._worker_threadpool = ThreadPoolExecutor(
144
+ max_workers=self._max_workers,
145
+ thread_name_prefix="MlflowTraceLoggingWorker",
146
+ )
147
+ self._consumer_thread = threading.Thread(
148
+ target=self._consumer_loop,
149
+ name="MLflowTraceLoggingConsumer",
150
+ daemon=True,
151
+ )
152
+ self._consumer_thread.start()
153
+
154
+ def _at_exit_callback(self) -> None:
155
+ """Callback function executed when the program is exiting."""
156
+ try:
157
+ _logger.info(
158
+ "Flushing the async trace logging queue before program exit. "
159
+ "This may take a while..."
160
+ )
161
+ self.flush(terminate=True)
162
+ except Exception as e:
163
+ _logger.error(f"Error while finishing trace export requests: {e}")
164
+
165
+ def flush(self, terminate=False) -> None:
166
+ """
167
+ Flush the async logging queue.
168
+
169
+ Args:
170
+ terminate: If True, shut down the logging threads after flushing.
171
+ """
172
+ if not self.is_active():
173
+ return
174
+
175
+ self._stop_event.set()
176
+ self._consumer_thread.join()
177
+
178
+ # Wait for all tasks to be processed
179
+ self._queue.join()
180
+
181
+ self._worker_threadpool.shutdown(wait=True)
182
+ self._is_active = False
183
+ # Restart threads to listen to incoming requests after flushing, if not terminating
184
+ if not terminate:
185
+ self._stop_event.clear()
186
+ self.activate()