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,487 @@
1
+ """
2
+ This module provides a set of functions to manage the global tracer provider for MLflow tracing.
3
+
4
+ Every tracing operation in MLflow *MUST* be managed through this module, instead of directly
5
+ using the OpenTelemetry APIs. This is because MLflow needs to control the initialization of the
6
+ tracer provider and ensure that it won't interfere with the other external libraries that might
7
+ use OpenTelemetry e.g. PromptFlow, Snowpark.
8
+ """
9
+
10
+ import contextvars
11
+ import functools
12
+ import json
13
+ import logging
14
+ from contextlib import contextmanager
15
+ from typing import TYPE_CHECKING, Optional
16
+
17
+ from opentelemetry import context as context_api
18
+ from opentelemetry import trace
19
+ from opentelemetry.sdk.trace import TracerProvider
20
+
21
+ import mlflow
22
+ from mlflow.exceptions import MlflowException, MlflowTracingException
23
+ from mlflow.tracing.config import reset_config
24
+ from mlflow.tracing.constant import SpanAttributeKey
25
+ from mlflow.tracing.destination import Databricks, MlflowExperiment, TraceDestination
26
+ from mlflow.tracing.utils.exception import raise_as_trace_exception
27
+ from mlflow.tracing.utils.once import Once
28
+ from mlflow.tracing.utils.otlp import get_otlp_exporter, should_use_otlp_exporter
29
+ from mlflow.utils.annotations import experimental
30
+ from mlflow.utils.databricks_utils import (
31
+ is_in_databricks_model_serving_environment,
32
+ is_mlflow_tracing_enabled_in_model_serving,
33
+ )
34
+
35
+ if TYPE_CHECKING:
36
+ from mlflow.entities import Span
37
+
38
+ # Global tracer provider instance. We manage the tracer provider by ourselves instead of using
39
+ # the global tracer provider provided by OpenTelemetry.
40
+ _MLFLOW_TRACER_PROVIDER = None
41
+
42
+ # Once() object ensures a function is executed only once in a process.
43
+ # Note that it doesn't work as expected in a distributed environment.
44
+ _MLFLOW_TRACER_PROVIDER_INITIALIZED = Once()
45
+
46
+ # A trace destination specified by the user via the `set_destination` function.
47
+ # This destination, when set, will take precedence over other configurations.
48
+ _MLFLOW_TRACE_USER_DESTINATION = None
49
+
50
+ _logger = logging.getLogger(__name__)
51
+
52
+
53
+ def start_span_in_context(name: str) -> trace.Span:
54
+ """
55
+ Start a new OpenTelemetry span in the current context.
56
+
57
+ Note that this function doesn't set the started span as the active span in the context. To do
58
+ that, the upstream also need to call `use_span()` function in the OpenTelemetry trace APIs.
59
+
60
+ Args:
61
+ name: The name of the span.
62
+
63
+ Returns:
64
+ The newly created OpenTelemetry span.
65
+ """
66
+ return _get_tracer(__name__).start_span(name)
67
+
68
+
69
+ def start_detached_span(
70
+ name: str,
71
+ parent: Optional[trace.Span] = None,
72
+ experiment_id: Optional[str] = None,
73
+ start_time_ns: Optional[int] = None,
74
+ ) -> Optional[tuple[str, trace.Span]]:
75
+ """
76
+ Start a new OpenTelemetry span that is not part of the current trace context, but with the
77
+ explicit parent span ID if provided.
78
+
79
+ Args:
80
+ name: The name of the span.
81
+ parent: The parent OpenTelemetry span. If not provided, the span will be created as a root
82
+ span.
83
+ experiment_id: The ID of the experiment. This is used to associate the span with a specific
84
+ experiment in MLflow.
85
+ start_time_ns: The start time of the span in nanoseconds.
86
+ If not provided, the current timestamp is used.
87
+
88
+ Returns:
89
+ The newly created OpenTelemetry span.
90
+ """
91
+ tracer = _get_tracer(__name__)
92
+ context = trace.set_span_in_context(parent) if parent else None
93
+ attributes = {}
94
+
95
+ # Set start time and experiment to attribute so we can pass it to the span processor
96
+ if start_time_ns:
97
+ attributes[SpanAttributeKey.START_TIME_NS] = json.dumps(start_time_ns)
98
+ if experiment_id:
99
+ attributes[SpanAttributeKey.EXPERIMENT_ID] = json.dumps(experiment_id)
100
+ return tracer.start_span(name, context=context, attributes=attributes, start_time=start_time_ns)
101
+
102
+
103
+ @contextmanager
104
+ def safe_set_span_in_context(span: "Span"):
105
+ """
106
+ A context manager that sets the given OpenTelemetry span as the active span in the current
107
+ context.
108
+
109
+ Args:
110
+ span: An MLflow span object to set as the active span.
111
+
112
+ Example:
113
+
114
+ .. code-block:: python
115
+
116
+ import mlflow
117
+
118
+
119
+ with mlflow.start_span("my_span") as span:
120
+ span.set_attribute("my_key", "my_value")
121
+
122
+ # The span is automatically detached from the context when the context manager exits.
123
+ """
124
+ token = set_span_in_context(span)
125
+ try:
126
+ yield
127
+ finally:
128
+ detach_span_from_context(token)
129
+
130
+
131
+ def set_span_in_context(span: "Span") -> contextvars.Token:
132
+ """
133
+ Set the given OpenTelemetry span as the active span in the current context.
134
+
135
+ Args:
136
+ span: An MLflow span object to set as the active span.
137
+
138
+ Returns:
139
+ A token object that will be required when detaching the span from the context.
140
+ """
141
+ context = trace.set_span_in_context(span._span)
142
+ token = context_api.attach(context)
143
+ return token # noqa: RET504
144
+
145
+
146
+ def detach_span_from_context(token: contextvars.Token):
147
+ """
148
+ Remove the active span from the current context.
149
+
150
+ Args:
151
+ token: The token returned by `_set_span_to_active` function.
152
+ """
153
+ context_api.detach(token)
154
+
155
+
156
+ @experimental(version="2.21.0")
157
+ def set_destination(destination: TraceDestination):
158
+ """
159
+ Set a custom span destination to which MLflow will export the traces.
160
+
161
+ A destination specified by this function will take precedence over
162
+ other configurations, such as tracking URI, OTLP environment variables.
163
+
164
+ To reset the destination, call the :py:func:`mlflow.tracing.reset()` function.
165
+
166
+ Args:
167
+ destination: A ``TraceDestination`` object that specifies the destination of the trace data.
168
+
169
+ Example:
170
+
171
+ .. code-block:: python
172
+
173
+ import mlflow
174
+ from mlflow.tracing.destination import MlflowExperiment
175
+
176
+ # Setting the destination to an MLflow experiment with ID "123"
177
+ mlflow.tracing.set_destination(MlflowExperiment(experiment_id="123"))
178
+
179
+ # Reset the destination (to an active experiment as default)
180
+ mlflow.tracing.reset()
181
+ """
182
+ if not isinstance(destination, TraceDestination):
183
+ raise MlflowException.invalid_parameter_value(
184
+ f"Invalid destination type: {type(destination)}. "
185
+ "The destination must be an instance of TraceDestination."
186
+ )
187
+
188
+ if isinstance(destination, Databricks) and (
189
+ mlflow.get_tracking_uri() is None or not mlflow.get_tracking_uri().startswith("databricks")
190
+ ):
191
+ mlflow.set_tracking_uri("databricks")
192
+ _logger.info(
193
+ "Automatically setting the tracking URI to `databricks` "
194
+ "because the tracing destination is set to Databricks."
195
+ )
196
+
197
+ # The destination needs to be persisted because the tracer setup can be re-initialized
198
+ # e.g. when the tracing is disabled and re-enabled, or tracking URI is changed, etc.
199
+ global _MLFLOW_TRACE_USER_DESTINATION
200
+ _MLFLOW_TRACE_USER_DESTINATION = destination
201
+
202
+ _setup_tracer_provider()
203
+
204
+
205
+ def _get_tracer(module_name: str):
206
+ """
207
+ Get a tracer instance for the given module name.
208
+
209
+ If the tracer provider is not initialized, this function will initialize the tracer provider.
210
+ Other simultaneous calls to this function will block until the initialization is done.
211
+ """
212
+ # Initiate tracer provider only once in the application lifecycle
213
+ _MLFLOW_TRACER_PROVIDER_INITIALIZED.do_once(_setup_tracer_provider)
214
+ return _MLFLOW_TRACER_PROVIDER.get_tracer(module_name)
215
+
216
+
217
+ def _get_trace_exporter():
218
+ """
219
+ Get the exporter instance that is used by the current tracer provider.
220
+ """
221
+ if _MLFLOW_TRACER_PROVIDER:
222
+ processors = _MLFLOW_TRACER_PROVIDER._active_span_processor._span_processors
223
+ # There should be only one processor used for MLflow tracing
224
+ processor = processors[0]
225
+ return processor.span_exporter
226
+
227
+
228
+ def _setup_tracer_provider(disabled=False):
229
+ """
230
+ Instantiate a tracer provider and set it as the global tracer provider.
231
+
232
+ Note that this function ALWAYS updates the global tracer provider, regardless of the current
233
+ state. It is the caller's responsibility to ensure that the tracer provider is initialized
234
+ only once, and update the _MLFLOW_TRACER_PROVIDER_INITIALIZED flag accordingly.
235
+ """
236
+ global _MLFLOW_TRACER_PROVIDER
237
+
238
+ if disabled:
239
+ _MLFLOW_TRACER_PROVIDER = trace.NoOpTracerProvider()
240
+ return
241
+
242
+ # TODO: Update this logic to pluggable registry where
243
+ # 1. Partners can implement span processor/exporter and destination class.
244
+ # 2. They can register their implementation to the registry via entry points.
245
+ # 3. MLflow will pick the implementation based on given destination id.
246
+ if _MLFLOW_TRACE_USER_DESTINATION is not None:
247
+ experiment_id = _MLFLOW_TRACE_USER_DESTINATION.experiment_id
248
+
249
+ tracking_uri = None
250
+ if isinstance(_MLFLOW_TRACE_USER_DESTINATION, MlflowExperiment):
251
+ tracking_uri = _MLFLOW_TRACE_USER_DESTINATION.tracking_uri
252
+
253
+ processor = _get_mlflow_span_processor(
254
+ tracking_uri=tracking_uri or mlflow.get_tracking_uri(), experiment_id=experiment_id
255
+ )
256
+
257
+ elif should_use_otlp_exporter():
258
+ # Export to OpenTelemetry Collector when configured
259
+ from mlflow.tracing.processor.otel import OtelSpanProcessor
260
+
261
+ exporter = get_otlp_exporter()
262
+ processor = OtelSpanProcessor(exporter)
263
+
264
+ elif is_in_databricks_model_serving_environment():
265
+ # Export to Inference Table when running in Databricks Model Serving
266
+ if not is_mlflow_tracing_enabled_in_model_serving():
267
+ _MLFLOW_TRACER_PROVIDER = trace.NoOpTracerProvider()
268
+ return
269
+
270
+ from mlflow.tracing.export.inference_table import InferenceTableSpanExporter
271
+ from mlflow.tracing.processor.inference_table import InferenceTableSpanProcessor
272
+
273
+ exporter = InferenceTableSpanExporter()
274
+ processor = InferenceTableSpanProcessor(exporter)
275
+
276
+ else:
277
+ # Default to MLflow Tracking Server
278
+ processor = _get_mlflow_span_processor(tracking_uri=mlflow.get_tracking_uri())
279
+
280
+ tracer_provider = TracerProvider()
281
+ tracer_provider.add_span_processor(processor)
282
+ _MLFLOW_TRACER_PROVIDER = tracer_provider
283
+
284
+ from mlflow.tracing.utils.warning import suppress_warning
285
+
286
+ # Demote the "Failed to detach context" log raised by the OpenTelemetry logger to DEBUG
287
+ # level so that it does not show up in the user's console. This warning may indicate
288
+ # some incorrect context handling, but in many cases just false positive that does not
289
+ # cause any issue in the generated trace.
290
+ # Note that we need to apply it permanently rather than just the scope of prediction call,
291
+ # because the exception can happen for streaming case, where the error log might be
292
+ # generated when the iterator is consumed and we don't know when it will happen.
293
+ suppress_warning("opentelemetry.context", "Failed to detach context")
294
+
295
+ # These Otel warnings are occasionally raised in a valid case, e.g. we timeout a trace
296
+ # but some spans are still active. We suppress them because they are not actionable.
297
+ suppress_warning("opentelemetry.sdk.trace", "Setting attribute on ended span")
298
+ suppress_warning("opentelemetry.sdk.trace", "Calling end() on an ended span")
299
+
300
+
301
+ def _get_mlflow_span_processor(tracking_uri: str, experiment_id: Optional[str] = None):
302
+ """
303
+ Get the MLflow span processor instance that is used by the current tracer provider.
304
+ """
305
+ # Databricks and SQL backends support V3 traces
306
+ from mlflow.tracing.export.mlflow_v3 import MlflowV3SpanExporter
307
+ from mlflow.tracing.processor.mlflow_v3 import MlflowV3SpanProcessor
308
+
309
+ exporter = MlflowV3SpanExporter(tracking_uri=tracking_uri)
310
+ return MlflowV3SpanProcessor(exporter, experiment_id=experiment_id)
311
+
312
+
313
+ @raise_as_trace_exception
314
+ def disable():
315
+ """
316
+ Disable tracing.
317
+
318
+ .. note::
319
+
320
+ This function sets up `OpenTelemetry` to use
321
+ `NoOpTracerProvider <https://github.com/open-telemetry/opentelemetry-python/blob/4febd337b019ea013ccaab74893bd9883eb59000/opentelemetry-api/src/opentelemetry/trace/__init__.py#L222>`_
322
+ and effectively disables all tracing operations.
323
+
324
+ Example:
325
+
326
+ .. code-block:: python
327
+ :test:
328
+
329
+ import mlflow
330
+
331
+
332
+ @mlflow.trace
333
+ def f():
334
+ return 0
335
+
336
+
337
+ # Tracing is enabled by default
338
+ f()
339
+ assert len(mlflow.search_traces()) == 1
340
+
341
+ # Disable tracing
342
+ mlflow.tracing.disable()
343
+ f()
344
+ assert len(mlflow.search_traces()) == 1
345
+
346
+ """
347
+ if not is_tracing_enabled():
348
+ return
349
+
350
+ _setup_tracer_provider(disabled=True)
351
+ _MLFLOW_TRACER_PROVIDER_INITIALIZED.done = True
352
+
353
+
354
+ @raise_as_trace_exception
355
+ def enable():
356
+ """
357
+ Enable tracing.
358
+
359
+ Example:
360
+
361
+ .. code-block:: python
362
+ :test:
363
+
364
+ import mlflow
365
+
366
+
367
+ @mlflow.trace
368
+ def f():
369
+ return 0
370
+
371
+
372
+ # Tracing is enabled by default
373
+ f()
374
+ assert len(mlflow.search_traces()) == 1
375
+
376
+ # Disable tracing
377
+ mlflow.tracing.disable()
378
+ f()
379
+ assert len(mlflow.search_traces()) == 1
380
+
381
+ # Re-enable tracing
382
+ mlflow.tracing.enable()
383
+ f()
384
+ assert len(mlflow.search_traces()) == 2
385
+
386
+ """
387
+ if is_tracing_enabled() and _MLFLOW_TRACER_PROVIDER_INITIALIZED.done:
388
+ _logger.info("Tracing is already enabled")
389
+ return
390
+
391
+ _setup_tracer_provider()
392
+ _MLFLOW_TRACER_PROVIDER_INITIALIZED.done = True
393
+
394
+
395
+ def trace_disabled(f):
396
+ """
397
+ A decorator that temporarily disables tracing for the duration of the decorated function.
398
+
399
+ .. code-block:: python
400
+
401
+ @trace_disabled
402
+ def f():
403
+ with mlflow.start_span("my_span") as span:
404
+ span.set_attribute("my_key", "my_value")
405
+
406
+ return
407
+
408
+
409
+ # This function will not generate any trace
410
+ f()
411
+
412
+ :meta private:
413
+ """
414
+
415
+ @functools.wraps(f)
416
+ def wrapper(*args, **kwargs):
417
+ is_func_called = False
418
+ result = None
419
+ try:
420
+ if is_tracing_enabled():
421
+ disable()
422
+ try:
423
+ is_func_called = True
424
+ result = f(*args, **kwargs)
425
+ finally:
426
+ enable()
427
+ else:
428
+ is_func_called = True
429
+ result = f(*args, **kwargs)
430
+ # We should only catch the exception from disable() and enable()
431
+ # and let other exceptions propagate.
432
+ except MlflowTracingException as e:
433
+ _logger.warning(
434
+ f"An error occurred while disabling or re-enabling tracing: {e} "
435
+ "The original function will still be executed, but the tracing "
436
+ "state may not be as expected. For full traceback, set "
437
+ "logging level to debug.",
438
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
439
+ )
440
+ # If the exception is raised before the original function
441
+ # is called, we should call the original function
442
+ if not is_func_called:
443
+ result = f(*args, **kwargs)
444
+
445
+ return result
446
+
447
+ return wrapper
448
+
449
+
450
+ def reset():
451
+ """
452
+ Reset the flags that indicates whether the MLflow tracer provider has been initialized.
453
+ This ensures that the tracer provider is re-initialized when next tracing
454
+ operation is performed.
455
+ """
456
+ # Set NoOp tracer provider to reset the global tracer to the initial state.
457
+ _setup_tracer_provider(disabled=True)
458
+ # Flip _MLFLOW_TRACE_PROVIDER_INITIALIZED flag to False so that
459
+ # the next tracing operation will re-initialize the provider.
460
+ _MLFLOW_TRACER_PROVIDER_INITIALIZED.done = False
461
+
462
+ # Reset the custom destination set by the user
463
+ global _MLFLOW_TRACE_USER_DESTINATION
464
+ _MLFLOW_TRACE_USER_DESTINATION = None
465
+
466
+ # Reset the tracing configuration to defaults
467
+ reset_config()
468
+
469
+
470
+ @raise_as_trace_exception
471
+ def is_tracing_enabled() -> bool:
472
+ """
473
+ Check if tracing is enabled based on whether the global tracer
474
+ is instantiated or not.
475
+
476
+ Trace is considered as "enabled" if the followings
477
+ 1. The default state (before any tracing operation)
478
+ 2. The tracer is not either ProxyTracer or NoOpTracer
479
+ """
480
+ if not _MLFLOW_TRACER_PROVIDER_INITIALIZED.done:
481
+ return True
482
+
483
+ tracer = _get_tracer(__name__)
484
+ # Occasionally ProxyTracer instance wraps the actual tracer
485
+ if isinstance(tracer, trace.ProxyTracer):
486
+ tracer = tracer._tracer
487
+ return not isinstance(tracer, trace.NoOpTracer)
@@ -0,0 +1,200 @@
1
+ import contextlib
2
+ import logging
3
+ import threading
4
+ from dataclasses import dataclass, field
5
+ from typing import Generator, Optional, Sequence
6
+
7
+ from mlflow.entities import LiveSpan, Trace, TraceData, TraceInfo
8
+ from mlflow.entities.model_registry import PromptVersion
9
+ from mlflow.environment_variables import MLFLOW_TRACE_TIMEOUT_SECONDS
10
+ from mlflow.tracing.utils.timeout import get_trace_cache_with_timeout
11
+ from mlflow.tracing.utils.truncation import set_request_response_preview
12
+
13
+ _logger = logging.getLogger(__name__)
14
+
15
+
16
+ # Internal representation to keep the state of a trace.
17
+ # Dict[str, Span] is used instead of TraceData to allow access by span_id.
18
+ @dataclass
19
+ class _Trace:
20
+ info: TraceInfo
21
+ span_dict: dict[str, LiveSpan] = field(default_factory=dict)
22
+ prompts: list[PromptVersion] = field(default_factory=list)
23
+
24
+ def to_mlflow_trace(self) -> Trace:
25
+ trace_data = TraceData()
26
+ for span in self.span_dict.values():
27
+ # Convert LiveSpan, mutable objects, into immutable Span objects before persisting.
28
+ trace_data.spans.append(span.to_immutable_span())
29
+
30
+ set_request_response_preview(self.info, trace_data)
31
+ return Trace(self.info, trace_data)
32
+
33
+ def get_root_span(self) -> Optional[LiveSpan]:
34
+ for span in self.span_dict.values():
35
+ if span.parent_id is None:
36
+ return span
37
+ return None
38
+
39
+
40
+ @dataclass
41
+ class ManagerTrace:
42
+ """
43
+ Wrapper around a trace and its associated prompts.
44
+ """
45
+
46
+ trace: Trace
47
+ prompts: Sequence[PromptVersion]
48
+
49
+
50
+ class InMemoryTraceManager:
51
+ """
52
+ Manage spans and traces created by the tracing system in memory.
53
+ """
54
+
55
+ _instance_lock = threading.Lock()
56
+ _instance = None
57
+
58
+ @classmethod
59
+ def get_instance(cls):
60
+ if cls._instance is None:
61
+ with cls._instance_lock:
62
+ if cls._instance is None:
63
+ cls._instance = InMemoryTraceManager()
64
+ return cls._instance
65
+
66
+ def __init__(self):
67
+ # In-memory cache to store trace_od -> _Trace mapping.
68
+ self._traces = get_trace_cache_with_timeout()
69
+
70
+ # Store mapping between OpenTelemetry trace ID and MLflow trace ID
71
+ self._otel_id_to_mlflow_trace_id: dict[int, str] = {}
72
+ self._lock = threading.Lock() # Lock for _traces
73
+
74
+ def register_trace(self, otel_trace_id: int, trace_info: TraceInfo):
75
+ """
76
+ Register a new trace info object to the in-memory trace registry.
77
+
78
+ Args:
79
+ otel_trace_id: The OpenTelemetry trace ID for the new trace.
80
+ trace_info: The trace info object to be stored.
81
+ """
82
+ # Check for a new timeout setting whenever a new trace is created.
83
+ self._check_timeout_update()
84
+ with self._lock:
85
+ self._traces[trace_info.trace_id] = _Trace(trace_info)
86
+ self._otel_id_to_mlflow_trace_id[otel_trace_id] = trace_info.trace_id
87
+
88
+ def register_span(self, span: LiveSpan):
89
+ """
90
+ Store the given span in the in-memory trace data.
91
+
92
+ Args:
93
+ span: The span to be stored.
94
+ """
95
+ if not isinstance(span, LiveSpan):
96
+ _logger.debug(f"Invalid span object {type(span)} is passed. Skipping.")
97
+ return
98
+
99
+ with self._lock:
100
+ trace_data_dict = self._traces[span.request_id].span_dict
101
+ trace_data_dict[span.span_id] = span
102
+
103
+ def register_prompt(self, trace_id: str, prompt: PromptVersion):
104
+ """
105
+ Register a prompt to link to the trace with the given trace ID.
106
+
107
+ Args:
108
+ trace_id: The ID of the trace to which the prompt belongs.
109
+ prompt: The prompt version to be registered.
110
+ """
111
+ with self._lock:
112
+ self._traces[trace_id].prompts.append(prompt)
113
+
114
+ @contextlib.contextmanager
115
+ def get_trace(self, trace_id: str) -> Generator[Optional[_Trace], None, None]:
116
+ """
117
+ Yield the trace info for the given trace ID..
118
+ This is designed to be used as a context manager to ensure the trace info is accessed
119
+ with the lock held.
120
+ """
121
+ with self._lock:
122
+ yield self._traces.get(trace_id)
123
+
124
+ def get_span_from_id(self, trace_id: str, span_id: str) -> Optional[LiveSpan]:
125
+ """
126
+ Get a span object for the given trace_id and span_id.
127
+ """
128
+ with self._lock:
129
+ trace = self._traces.get(trace_id)
130
+
131
+ return trace.span_dict.get(span_id) if trace else None
132
+
133
+ def get_root_span_id(self, trace_id) -> Optional[str]:
134
+ """
135
+ Get the root span ID for the given trace ID.
136
+ """
137
+ with self._lock:
138
+ trace = self._traces.get(trace_id)
139
+
140
+ if trace:
141
+ for span in trace.span_dict.values():
142
+ if span.parent_id is None:
143
+ return span.span_id
144
+
145
+ return None
146
+
147
+ def get_mlflow_trace_id_from_otel_id(self, otel_trace_id: int) -> Optional[str]:
148
+ """
149
+ Get the MLflow trace ID for the given OpenTelemetry trace ID.
150
+ """
151
+ return self._otel_id_to_mlflow_trace_id.get(otel_trace_id)
152
+
153
+ def set_trace_metadata(self, trace_id: str, key: str, value: str):
154
+ """
155
+ Set the trace metadata for the given request ID.
156
+ """
157
+ with self.get_trace(trace_id) as trace:
158
+ if trace:
159
+ trace.info.trace_metadata[key] = value
160
+
161
+ def pop_trace(self, otel_trace_id: int) -> Optional[ManagerTrace]:
162
+ """
163
+ Pop trace data for the given OpenTelemetry trace ID and
164
+ return it as a ManagerTrace wrapper containing the trace and prompts.
165
+ """
166
+ with self._lock:
167
+ mlflow_trace_id = self._otel_id_to_mlflow_trace_id.pop(otel_trace_id, None)
168
+ internal_trace = self._traces.pop(mlflow_trace_id, None) if mlflow_trace_id else None
169
+ if internal_trace is None:
170
+ return None
171
+ return ManagerTrace(
172
+ trace=internal_trace.to_mlflow_trace(), prompts=internal_trace.prompts
173
+ )
174
+
175
+ def _check_timeout_update(self):
176
+ """
177
+ TTL/Timeout may be updated by users after initial cache creation. This method checks
178
+ for the update and create a new cache instance with the updated timeout.
179
+ """
180
+ new_timeout = MLFLOW_TRACE_TIMEOUT_SECONDS.get()
181
+ if new_timeout != getattr(self._traces, "timeout", None):
182
+ if len(self._traces) > 0:
183
+ _logger.warning(
184
+ f"The timeout of the trace buffer has been updated to {new_timeout} seconds. "
185
+ "This operation discards all in-progress traces at the moment. Please make "
186
+ "sure to update the timeout when there are no in-progress traces."
187
+ )
188
+
189
+ with self._lock:
190
+ # We need to check here again in case this method runs in parallel
191
+ if new_timeout != getattr(self._traces, "timeout", None):
192
+ self._traces = get_trace_cache_with_timeout()
193
+
194
+ @classmethod
195
+ def reset(cls):
196
+ """Clear all the aggregated trace data. This should only be used for testing."""
197
+ if cls._instance:
198
+ with cls._instance._lock:
199
+ cls._instance._traces.clear()
200
+ cls._instance = None