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,531 @@
1
+ import json
2
+ import logging
3
+ from concurrent.futures import ThreadPoolExecutor
4
+ from contextlib import nullcontext
5
+ from typing import Optional, Sequence
6
+
7
+ import mlflow
8
+ from mlflow.entities.assessment import Assessment
9
+ from mlflow.entities.model_registry import PromptVersion
10
+ from mlflow.entities.span import NO_OP_SPAN_TRACE_ID
11
+ from mlflow.entities.trace import Trace
12
+ from mlflow.entities.trace_data import TraceData
13
+ from mlflow.entities.trace_info import TraceInfo
14
+ from mlflow.environment_variables import MLFLOW_SEARCH_TRACES_MAX_THREADS
15
+ from mlflow.exceptions import (
16
+ MlflowException,
17
+ MlflowTraceDataCorrupted,
18
+ MlflowTraceDataException,
19
+ MlflowTraceDataNotFound,
20
+ )
21
+ from mlflow.protos.databricks_pb2 import (
22
+ BAD_REQUEST,
23
+ INVALID_PARAMETER_VALUE,
24
+ RESOURCE_DOES_NOT_EXIST,
25
+ )
26
+ from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
27
+ from mlflow.store.entities.paged_list import PagedList
28
+ from mlflow.store.tracking import SEARCH_TRACES_DEFAULT_MAX_RESULTS
29
+ from mlflow.tracing.constant import TraceMetadataKey
30
+ from mlflow.tracing.trace_manager import InMemoryTraceManager
31
+ from mlflow.tracing.utils import TraceJSONEncoder, exclude_immutable_tags
32
+ from mlflow.tracing.utils.artifact_utils import get_artifact_uri_for_trace
33
+ from mlflow.tracking._tracking_service.utils import _get_store, _resolve_tracking_uri
34
+ from mlflow.utils import is_uuid
35
+ from mlflow.utils.mlflow_tags import IMMUTABLE_TAGS
36
+ from mlflow.utils.uri import add_databricks_profile_info_to_artifact_uri, is_databricks_uri
37
+
38
+ _logger = logging.getLogger(__name__)
39
+
40
+
41
+ class TracingClient:
42
+ """
43
+ Client of an MLflow Tracking Server that creates and manages experiments and runs.
44
+ """
45
+
46
+ def __init__(self, tracking_uri: Optional[str] = None):
47
+ """
48
+ Args:
49
+ tracking_uri: Address of local or remote tracking server.
50
+ """
51
+ self.tracking_uri = _resolve_tracking_uri(tracking_uri)
52
+ # NB: Fetch the tracking store (`self.store`) upon client initialization to ensure that
53
+ # the tracking URI is valid and the store can be properly resolved. We define `store` as a
54
+ # property method to ensure that the client is serializable, even if the store is not
55
+ # self.store
56
+ self.store
57
+
58
+ @property
59
+ def store(self):
60
+ return _get_store(self.tracking_uri)
61
+
62
+ def start_trace(self, trace_info: TraceInfo) -> TraceInfo:
63
+ """
64
+ Create a new trace in the backend.
65
+
66
+ Args:
67
+ trace_info: The TraceInfo object to record in the backend.
68
+
69
+ Returns:
70
+ The returned TraceInfoV3 object from the backend.
71
+ """
72
+ return self.store.start_trace(trace_info=trace_info)
73
+
74
+ def delete_traces(
75
+ self,
76
+ experiment_id: str,
77
+ max_timestamp_millis: Optional[int] = None,
78
+ max_traces: Optional[int] = None,
79
+ trace_ids: Optional[list[str]] = None,
80
+ ) -> int:
81
+ return self.store.delete_traces(
82
+ experiment_id=experiment_id,
83
+ max_timestamp_millis=max_timestamp_millis,
84
+ max_traces=max_traces,
85
+ trace_ids=trace_ids,
86
+ )
87
+
88
+ def get_trace_info(self, trace_id: str) -> TraceInfo:
89
+ """
90
+ Get the trace info matching the ``trace_id``.
91
+
92
+ Args:
93
+ trace_id: String id of the trace to fetch.
94
+
95
+ Returns:
96
+ TraceInfo object, of type ``mlflow.entities.trace_info.TraceInfo``.
97
+ """
98
+ with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
99
+ if trace is not None:
100
+ return trace.info
101
+
102
+ return self.store.get_trace_info(trace_id)
103
+
104
+ def get_trace(self, trace_id: str) -> Trace:
105
+ """
106
+ Get the trace matching the ``trace_id``.
107
+
108
+ Args:
109
+ trace_id: String id of the trace to fetch.
110
+
111
+ Returns:
112
+ The fetched Trace object, of type ``mlflow.entities.Trace``.
113
+ """
114
+ trace_info = self.get_trace_info(trace_id)
115
+ try:
116
+ trace_data = self._download_trace_data(trace_info)
117
+ except MlflowTraceDataNotFound:
118
+ raise MlflowException(
119
+ message=(
120
+ f"Trace with ID {trace_id} cannot be loaded because it is missing span data."
121
+ " Please try creating or loading another trace."
122
+ ),
123
+ error_code=BAD_REQUEST,
124
+ ) from None # Ensure the original spammy exception is not included in the traceback
125
+ except MlflowTraceDataCorrupted:
126
+ raise MlflowException(
127
+ message=(
128
+ f"Trace with ID {trace_id} cannot be loaded because its span data"
129
+ " is corrupted. Please try creating or loading another trace."
130
+ ),
131
+ error_code=BAD_REQUEST,
132
+ ) from None # Ensure the original spammy exception is not included in the traceback
133
+ return Trace(trace_info, trace_data)
134
+
135
+ def get_online_trace_details(
136
+ self,
137
+ trace_id: str,
138
+ sql_warehouse_id: str,
139
+ source_inference_table: str,
140
+ source_databricks_request_id: str,
141
+ ) -> str:
142
+ return self.store.get_online_trace_details(
143
+ trace_id=trace_id,
144
+ sql_warehouse_id=sql_warehouse_id,
145
+ source_inference_table=source_inference_table,
146
+ source_databricks_request_id=source_databricks_request_id,
147
+ )
148
+
149
+ def _search_traces(
150
+ self,
151
+ experiment_ids: list[str],
152
+ filter_string: Optional[str] = None,
153
+ max_results: int = SEARCH_TRACES_DEFAULT_MAX_RESULTS,
154
+ order_by: Optional[list[str]] = None,
155
+ page_token: Optional[str] = None,
156
+ model_id: Optional[str] = None,
157
+ sql_warehouse_id: Optional[str] = None,
158
+ ):
159
+ return self.store.search_traces(
160
+ experiment_ids=experiment_ids,
161
+ filter_string=filter_string,
162
+ max_results=max_results,
163
+ order_by=order_by,
164
+ page_token=page_token,
165
+ model_id=model_id,
166
+ sql_warehouse_id=sql_warehouse_id,
167
+ )
168
+
169
+ def search_traces(
170
+ self,
171
+ experiment_ids: list[str],
172
+ filter_string: Optional[str] = None,
173
+ max_results: int = SEARCH_TRACES_DEFAULT_MAX_RESULTS,
174
+ order_by: Optional[list[str]] = None,
175
+ page_token: Optional[str] = None,
176
+ run_id: Optional[str] = None,
177
+ include_spans: bool = True,
178
+ model_id: Optional[str] = None,
179
+ sql_warehouse_id: Optional[str] = None,
180
+ ) -> PagedList[Trace]:
181
+ """
182
+ Return traces that match the given list of search expressions within the experiments.
183
+
184
+ Args:
185
+ experiment_ids: List of experiment ids to scope the search.
186
+ filter_string: A search filter string.
187
+ max_results: Maximum number of traces desired.
188
+ order_by: List of order_by clauses.
189
+ page_token: Token specifying the next page of results. It should be obtained from
190
+ a ``search_traces`` call.
191
+ run_id: A run id to scope the search. When a trace is created under an active run,
192
+ it will be associated with the run and you can filter on the run id to retrieve
193
+ the trace.
194
+ include_spans: If ``True``, include spans in the returned traces. Otherwise, only
195
+ the trace metadata is returned, e.g., trace ID, start time, end time, etc,
196
+ without any spans.
197
+ model_id: If specified, return traces associated with the model ID.
198
+ sql_warehouse_id: Only used in Databricks. The ID of the SQL warehouse to use for
199
+ searching traces in inference tables.
200
+
201
+
202
+ Returns:
203
+ A :py:class:`PagedList <mlflow.store.entities.PagedList>` of
204
+ :py:class:`Trace <mlflow.entities.Trace>` objects that satisfy the search
205
+ expressions. If the underlying tracking store supports pagination, the token for the
206
+ next page may be obtained via the ``token`` attribute of the returned object; however,
207
+ some store implementations may not support pagination and thus the returned token would
208
+ not be meaningful in such cases.
209
+ """
210
+ if model_id is not None:
211
+ if filter_string:
212
+ raise MlflowException(
213
+ message=(
214
+ "Cannot specify both `model_id` or `filter_string` in the search_traces "
215
+ "call."
216
+ ),
217
+ error_code=INVALID_PARAMETER_VALUE,
218
+ )
219
+
220
+ filter_string = (
221
+ f"request_metadata.`mlflow.modelId` = '{model_id}'"
222
+ if sql_warehouse_id is None
223
+ else None
224
+ )
225
+
226
+ is_databricks = is_databricks_uri(self.tracking_uri)
227
+
228
+ if run_id:
229
+ run = self.store.get_run(run_id)
230
+ if run.info.experiment_id not in experiment_ids:
231
+ raise MlflowException(
232
+ f"Run {run_id} belongs to experiment {run.info.experiment_id}, which is not "
233
+ f"in the list of experiment IDs provided: {experiment_ids}. Please include "
234
+ f"experiment {run.info.experiment_id} in the `experiment_ids` parameter to "
235
+ "search for traces from this run.",
236
+ error_code=INVALID_PARAMETER_VALUE,
237
+ )
238
+
239
+ additional_filter = (
240
+ f"attribute.run_id = '{run_id}'"
241
+ if is_databricks
242
+ else f"metadata.{TraceMetadataKey.SOURCE_RUN} = '{run_id}'"
243
+ )
244
+ if filter_string:
245
+ if TraceMetadataKey.SOURCE_RUN in filter_string:
246
+ raise MlflowException(
247
+ "You cannot filter by run_id when it is already part of the filter string."
248
+ f"Please remove the {TraceMetadataKey.SOURCE_RUN} filter from the filter "
249
+ "string and try again.",
250
+ error_code=INVALID_PARAMETER_VALUE,
251
+ )
252
+ filter_string += f" AND {additional_filter}"
253
+ else:
254
+ filter_string = additional_filter
255
+
256
+ is_databricks = is_databricks_uri(self.tracking_uri)
257
+
258
+ def download_trace_extra_fields(trace_info: TraceInfo) -> Optional[Trace]:
259
+ """
260
+ Download trace data and assessments for the given trace_info and returns a Trace object.
261
+ If the download fails (e.g., the trace data is missing or corrupted), returns None.
262
+
263
+ The trace_info parameter can be either TraceInfo or TraceInfoV3 object.
264
+ """
265
+ is_online_trace = is_uuid(trace_info.trace_id)
266
+
267
+ # For online traces in Databricks, we need to get trace data from a different endpoint
268
+ try:
269
+ if is_databricks and is_online_trace:
270
+ # For online traces, get data from the online API
271
+ trace_data = self.get_online_trace_details(
272
+ trace_id=trace_info.trace_id,
273
+ sql_warehouse_id=sql_warehouse_id,
274
+ source_inference_table=trace_info.request_metadata.get(
275
+ "mlflow.sourceTable"
276
+ ),
277
+ source_databricks_request_id=trace_info.request_metadata.get(
278
+ "mlflow.databricksRequestId"
279
+ ),
280
+ )
281
+ trace_data = TraceData.from_dict(json.loads(trace_data))
282
+ else:
283
+ # For offline traces, download data from artifact storage
284
+ trace_data = self._download_trace_data(trace_info)
285
+ except MlflowTraceDataException as e:
286
+ _logger.warning(
287
+ (
288
+ f"Failed to download trace data for trace {trace_info.trace_id!r} "
289
+ f"with {e.ctx}. For full traceback, set logging level to DEBUG."
290
+ ),
291
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
292
+ )
293
+ return None
294
+ else:
295
+ return Trace(trace_info, trace_data)
296
+
297
+ traces = []
298
+ next_max_results = max_results
299
+ next_token = page_token
300
+
301
+ max_workers = MLFLOW_SEARCH_TRACES_MAX_THREADS.get()
302
+ executor = (
303
+ ThreadPoolExecutor(max_workers=max_workers, thread_name_prefix="MlflowTracingSearch")
304
+ if include_spans
305
+ else nullcontext()
306
+ )
307
+ with executor:
308
+ while len(traces) < max_results:
309
+ trace_infos, next_token = self._search_traces(
310
+ experiment_ids=experiment_ids,
311
+ filter_string=filter_string,
312
+ max_results=next_max_results,
313
+ order_by=order_by,
314
+ page_token=next_token,
315
+ model_id=model_id,
316
+ sql_warehouse_id=sql_warehouse_id,
317
+ )
318
+
319
+ if include_spans:
320
+ traces.extend(
321
+ t for t in executor.map(download_trace_extra_fields, trace_infos) if t
322
+ )
323
+ else:
324
+ traces.extend(
325
+ Trace(trace_info, TraceData(spans=[])) for trace_info in trace_infos
326
+ )
327
+
328
+ if not next_token:
329
+ break
330
+
331
+ next_max_results = max_results - len(traces)
332
+
333
+ return PagedList(traces, next_token)
334
+
335
+ def set_trace_tags(self, trace_id: str, tags: dict[str, str]):
336
+ """
337
+ Set tags on the trace with the given trace_id.
338
+
339
+ Args:
340
+ trace_id: The ID of the trace.
341
+ tags: A dictionary of key-value pairs.
342
+ """
343
+ tags = exclude_immutable_tags(tags)
344
+ for k, v in tags.items():
345
+ self.set_trace_tag(trace_id, k, v)
346
+
347
+ def set_trace_tag(self, trace_id: str, key: str, value: str):
348
+ """
349
+ Set a tag on the trace with the given trace ID.
350
+
351
+ Args:
352
+ trace_id: The ID of the trace to set the tag on.
353
+ key: The string key of the tag. Must be at most 250 characters long, otherwise
354
+ it will be truncated when stored.
355
+ value: The string value of the tag. Must be at most 250 characters long, otherwise
356
+ it will be truncated when stored.
357
+ """
358
+ if not isinstance(value, str):
359
+ _logger.warning(
360
+ "Received non-string value for trace tag. Please note that non-string tag values"
361
+ "will automatically be stringified when the trace is logged."
362
+ )
363
+
364
+ # Trying to set the tag on the active trace first
365
+ with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
366
+ if trace:
367
+ trace.info.tags[key] = str(value)
368
+ return
369
+
370
+ if key in IMMUTABLE_TAGS:
371
+ _logger.warning(f"Tag '{key}' is immutable and cannot be set on a trace.")
372
+ else:
373
+ self.store.set_trace_tag(trace_id, key, str(value))
374
+
375
+ def delete_trace_tag(self, trace_id: str, key: str):
376
+ """
377
+ Delete a tag on the trace with the given trace ID.
378
+
379
+ Args:
380
+ trace_id: The ID of the trace to delete the tag from.
381
+ key: The string key of the tag. Must be at most 250 characters long, otherwise
382
+ it will be truncated when stored.
383
+ """
384
+ # Trying to delete the tag on the active trace first
385
+ with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
386
+ if trace:
387
+ if key in trace.info.tags:
388
+ trace.info.tags.pop(key)
389
+ return
390
+ else:
391
+ raise MlflowException(
392
+ f"Tag with key {key} not found in trace with ID {trace_id}.",
393
+ error_code=RESOURCE_DOES_NOT_EXIST,
394
+ )
395
+
396
+ if key in IMMUTABLE_TAGS:
397
+ _logger.warning(f"Tag '{key}' is immutable and cannot be deleted on a trace.")
398
+ else:
399
+ self.store.delete_trace_tag(trace_id, key)
400
+
401
+ def get_assessment(self, trace_id: str, assessment_id: str) -> Assessment:
402
+ """
403
+ Get an assessment entity from the backend store.
404
+
405
+ Args:
406
+ trace_id: The ID of the trace.
407
+ assessment_id: The ID of the assessment to get.
408
+
409
+ Returns:
410
+ The Assessment object.
411
+ """
412
+ if not is_databricks_uri(self.tracking_uri):
413
+ raise MlflowException(
414
+ "This API is currently only available for Databricks Managed MLflow. This "
415
+ "will be available in the open-source version of MLflow in a future release."
416
+ )
417
+
418
+ return self.store.get_assessment(trace_id, assessment_id)
419
+
420
+ def log_assessment(self, trace_id: str, assessment: Assessment) -> Assessment:
421
+ if not is_databricks_uri(self.tracking_uri):
422
+ raise MlflowException(
423
+ "This API is currently only available for Databricks Managed MLflow. This "
424
+ "will be available in the open-source version of MLflow in a future release."
425
+ )
426
+
427
+ assessment.trace_id = trace_id
428
+
429
+ if trace_id is None or trace_id == NO_OP_SPAN_TRACE_ID:
430
+ _logger.debug(
431
+ "Skipping assessment logging for NO_OP_SPAN_TRACE_ID. This is expected when "
432
+ "tracing is disabled."
433
+ )
434
+ return assessment
435
+
436
+ # If the trace is the active trace, add the assessment to it in-memory
437
+ if trace_id == mlflow.get_active_trace_id():
438
+ with InMemoryTraceManager.get_instance().get_trace(trace_id) as trace:
439
+ if trace is None:
440
+ _logger.debug(
441
+ f"Trace {trace_id} is active but not found in the in-memory buffer. "
442
+ "Something is wrong with trace handling. Skipping assessment logging."
443
+ )
444
+ trace.info.assessments.append(assessment)
445
+ return assessment
446
+
447
+ return self.store.create_assessment(assessment)
448
+
449
+ def update_assessment(
450
+ self,
451
+ trace_id: str,
452
+ assessment_id: str,
453
+ assessment: Assessment,
454
+ ):
455
+ """
456
+ Update an existing assessment entity in the backend store.
457
+
458
+ Args:
459
+ trace_id: The ID of the trace.
460
+ assessment_id: The ID of the feedback assessment to update.
461
+ assessment: The updated assessment.
462
+ """
463
+ if not is_databricks_uri(self.tracking_uri):
464
+ raise MlflowException(
465
+ "This API is currently only available for Databricks Managed MLflow. This "
466
+ "will be available in the open-source version of MLflow in a future release."
467
+ )
468
+
469
+ return self.store.update_assessment(
470
+ trace_id=trace_id,
471
+ assessment_id=assessment_id,
472
+ name=assessment.name,
473
+ expectation=assessment.expectation,
474
+ feedback=assessment.feedback,
475
+ rationale=assessment.rationale,
476
+ metadata=assessment.metadata,
477
+ )
478
+
479
+ def delete_assessment(self, trace_id: str, assessment_id: str):
480
+ """
481
+ Delete an assessment associated with a trace.
482
+
483
+ Args:
484
+ trace_id: The ID of the trace.
485
+ assessment_id: The ID of the assessment to delete.
486
+ """
487
+ if not is_databricks_uri(self.tracking_uri):
488
+ raise MlflowException(
489
+ "This API is currently only available for Databricks Managed MLflow. This "
490
+ "will be available in the open-source version of MLflow in a future release."
491
+ )
492
+
493
+ self.store.delete_assessment(trace_id=trace_id, assessment_id=assessment_id)
494
+
495
+ def _get_artifact_repo_for_trace(self, trace_info: TraceInfo):
496
+ artifact_uri = get_artifact_uri_for_trace(trace_info)
497
+ artifact_uri = add_databricks_profile_info_to_artifact_uri(artifact_uri, self.tracking_uri)
498
+ return get_artifact_repository(artifact_uri)
499
+
500
+ def _download_trace_data(self, trace_info: TraceInfo) -> TraceData:
501
+ """
502
+ Download trace data from artifact repository.
503
+
504
+ Args:
505
+ trace_info: Either a TraceInfo or TraceInfoV3 object containing trace metadata.
506
+
507
+ Returns:
508
+ TraceData object representing the downloaded trace data.
509
+ """
510
+ artifact_repo = self._get_artifact_repo_for_trace(trace_info)
511
+ return TraceData.from_dict(artifact_repo.download_trace_data())
512
+
513
+ def _upload_trace_data(self, trace_info: TraceInfo, trace_data: TraceData) -> None:
514
+ artifact_repo = self._get_artifact_repo_for_trace(trace_info)
515
+ trace_data_json = json.dumps(trace_data.to_dict(), cls=TraceJSONEncoder, ensure_ascii=False)
516
+ return artifact_repo.upload_trace_data(trace_data_json)
517
+
518
+ def link_prompt_versions_to_trace(
519
+ self, trace_id: str, prompts: Sequence[PromptVersion]
520
+ ) -> None:
521
+ """
522
+ Link multiple prompt versions to a trace.
523
+
524
+ Args:
525
+ trace_id: The ID of the trace to link prompts to.
526
+ prompts: List of PromptVersion objects to link to the trace.
527
+ """
528
+ from mlflow.tracking._model_registry.utils import _get_store as _get_model_registry_store
529
+
530
+ registry_store = _get_model_registry_store()
531
+ registry_store.link_prompts_to_trace(prompt_versions=prompts, trace_id=trace_id)
@@ -0,0 +1,125 @@
1
+ from dataclasses import dataclass, field, replace
2
+ from typing import TYPE_CHECKING, Any, Callable, Optional
3
+
4
+ from mlflow.tracing.utils.processor import validate_span_processors
5
+ from mlflow.utils.annotations import experimental
6
+
7
+ if TYPE_CHECKING:
8
+ from mlflow.entities.span import LiveSpan
9
+
10
+
11
+ @dataclass
12
+ class TracingConfig:
13
+ """Configuration for MLflow tracing behavior."""
14
+
15
+ # TODO: Move more configuration options here, such as async logging, display, etc.
16
+ # A list of functions to process spans before export.
17
+ span_processors: list[Callable[["LiveSpan"], None]] = field(default_factory=list)
18
+
19
+ def __post_init__(self):
20
+ self.span_processors = validate_span_processors(self.span_processors)
21
+
22
+
23
+ # Global configuration instance for tracing
24
+ _MLFLOW_TRACING_CONFIG = TracingConfig()
25
+
26
+
27
+ class TracingConfigContext:
28
+ """Context manager for temporary tracing configuration changes."""
29
+
30
+ def __init__(self, config_updates: dict[str, Any]):
31
+ self.config_updates = config_updates
32
+ # Create a shallow copy of the current config
33
+ self.previous_config = replace(_MLFLOW_TRACING_CONFIG)
34
+
35
+ for key, value in self.config_updates.items():
36
+ setattr(_MLFLOW_TRACING_CONFIG, key, value)
37
+
38
+ def __enter__(self):
39
+ return self
40
+
41
+ def __exit__(self, exc_type, exc_val, exc_tb):
42
+ global _MLFLOW_TRACING_CONFIG
43
+ _MLFLOW_TRACING_CONFIG = self.previous_config
44
+
45
+
46
+ def get_config() -> TracingConfig:
47
+ """
48
+ Get the current tracing configuration.
49
+
50
+ Returns:
51
+ The current TracingConfig instance.
52
+ """
53
+ return _MLFLOW_TRACING_CONFIG
54
+
55
+
56
+ def reset_config():
57
+ """
58
+ Reset the tracing configuration to defaults.
59
+ """
60
+ global _MLFLOW_TRACING_CONFIG
61
+ _MLFLOW_TRACING_CONFIG = TracingConfig()
62
+
63
+
64
+ @experimental(version="3.2.0")
65
+ def configure(
66
+ span_processors: Optional[list[Callable[["LiveSpan"], None]]] = None,
67
+ ) -> TracingConfigContext:
68
+ """
69
+ Configure MLflow tracing. Can be used as function or context manager.
70
+
71
+ Only updates explicitly provided arguments, leaving others unchanged.
72
+
73
+ Args:
74
+ span_processors: List of functions to process spans before export.
75
+ This is helpful for filtering/masking particular attributes from the span to
76
+ prevent sensitive data from being logged or for reducing the size of the span.
77
+ Each function must accept a single argument of type LiveSpan and should not
78
+ return any value. When multiple functions are provided, they are applied
79
+ sequentially in the order they are provided.
80
+
81
+ Returns:
82
+ TracingConfigContext: Context manager for temporary configuration changes.
83
+ When used as a function, the configuration changes persist.
84
+ When used as a context manager, changes are reverted on exit.
85
+
86
+ Examples:
87
+
88
+ .. code-block:: python
89
+
90
+ def pii_filter(span):
91
+ \"\"\"Example PII filter that masks sensitive data in span attributes.\"\"\"
92
+ # Mask sensitive inputs
93
+ if inputs := span.inputs:
94
+ for key, value in inputs.items():
95
+ if "password" in key.lower() or "token" in key.lower():
96
+ span.set_inputs({**inputs, key: "[REDACTED]"})
97
+
98
+ # Mask sensitive outputs
99
+ if outputs := span.outputs:
100
+ if isinstance(outputs, dict):
101
+ for key in outputs:
102
+ if "secret" in key.lower():
103
+ outputs[key] = "[REDACTED]"
104
+ span.set_outputs(outputs)
105
+
106
+ # Mask sensitive attributes
107
+ for attr_key in list(span.attributes.keys()):
108
+ if "api_key" in attr_key.lower():
109
+ span.set_attribute(attr_key, "[REDACTED]")
110
+
111
+ # Permanent configuration change
112
+ mlflow.tracing.configure(span_processors=[pii_filter])
113
+
114
+ # Temporary configuration change
115
+ with mlflow.tracing.configure(span_processors=[pii_filter]):
116
+ # PII filtering enabled only in this block
117
+ pass
118
+ """
119
+ # Collect only the arguments that were explicitly provided
120
+ config_updates = {}
121
+ if span_processors is not None:
122
+ config_updates["span_processors"] = span_processors
123
+
124
+ # Return TracingConfigContext which handles both function and context manager usage
125
+ return TracingConfigContext(config_updates)