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,250 @@
1
+ import atexit
2
+ import logging
3
+ import threading
4
+ import time
5
+ from collections import OrderedDict
6
+
7
+ from cachetools import Cache, TTLCache
8
+
9
+ from mlflow.entities.span_event import SpanEvent
10
+ from mlflow.entities.span_status import SpanStatusCode
11
+ from mlflow.environment_variables import (
12
+ MLFLOW_TRACE_BUFFER_MAX_SIZE,
13
+ MLFLOW_TRACE_BUFFER_TTL_SECONDS,
14
+ MLFLOW_TRACE_TIMEOUT_CHECK_INTERVAL_SECONDS,
15
+ MLFLOW_TRACE_TIMEOUT_SECONDS,
16
+ )
17
+ from mlflow.exceptions import MlflowTracingException
18
+
19
+ _logger = logging.getLogger(__name__)
20
+
21
+ _TRACE_EXPIRATION_MSG = (
22
+ "Trace {request_id} is timed out after {ttl} seconds. The operation may be stuck or "
23
+ "taking too long to complete. To increase the timeout, set the environment variable "
24
+ "MLFLOW_TRACE_TIMEOUT_SECONDS to a larger value."
25
+ )
26
+
27
+
28
+ def get_trace_cache_with_timeout() -> Cache:
29
+ """
30
+ Return a cache object that stores traces in-memory while they are in-progress.
31
+
32
+ If the timeout is specified, this returns a customized cache that logs the
33
+ expired traces to the backend. Otherwise, this returns a regular cache.
34
+ """
35
+
36
+ if timeout := MLFLOW_TRACE_TIMEOUT_SECONDS.get():
37
+ return MlflowTraceTimeoutCache(
38
+ timeout=timeout,
39
+ maxsize=MLFLOW_TRACE_BUFFER_MAX_SIZE.get(),
40
+ )
41
+
42
+ # NB: Ideally we should return the vanilla Cache object only with maxsize.
43
+ # But we used TTLCache before introducing the timeout feature (that does not
44
+ # monitor timeout periodically nor log the expired traces). To keep the
45
+ # backward compatibility, we return TTLCache.
46
+ return TTLCache(
47
+ ttl=MLFLOW_TRACE_BUFFER_TTL_SECONDS.get(),
48
+ maxsize=MLFLOW_TRACE_BUFFER_MAX_SIZE.get(),
49
+ )
50
+
51
+
52
+ class _TimedCache(Cache):
53
+ """
54
+ This code is ported from cachetools library to avoid depending on the private class.
55
+ https://github.com/tkem/cachetools/blob/d44c98407030d2e91cbe82c3997be042d9c2f0de/src/cachetools/__init__.py#L376
56
+ """
57
+
58
+ class _Timer:
59
+ def __init__(self, timer):
60
+ self.__timer = timer
61
+ self.__nesting = 0
62
+
63
+ def __call__(self):
64
+ if self.__nesting == 0:
65
+ return self.__timer()
66
+ else:
67
+ return self.__time
68
+
69
+ def __enter__(self):
70
+ if self.__nesting == 0:
71
+ self.__time = time = self.__timer()
72
+ else:
73
+ time = self.__time
74
+ self.__nesting += 1
75
+ return time
76
+
77
+ def __exit__(self, *exc):
78
+ self.__nesting -= 1
79
+
80
+ def __reduce__(self):
81
+ return _TimedCache._Timer, (self.__timer,)
82
+
83
+ def __getattr__(self, name):
84
+ return getattr(self.__timer, name)
85
+
86
+ def __init__(self, maxsize, timer=time.monotonic, getsizeof=None):
87
+ Cache.__init__(self, maxsize, getsizeof)
88
+ self.__timer = _TimedCache._Timer(timer)
89
+
90
+ def __repr__(self, cache_repr=Cache.__repr__):
91
+ with self.__timer as time:
92
+ self.expire(time)
93
+ return cache_repr(self)
94
+
95
+ def __len__(self, cache_len=Cache.__len__):
96
+ with self.__timer as time:
97
+ self.expire(time)
98
+ return cache_len(self)
99
+
100
+ @property
101
+ def currsize(self):
102
+ with self.__timer as time:
103
+ self.expire(time)
104
+ return super().currsize
105
+
106
+ @property
107
+ def timer(self):
108
+ """The timer function used by the cache."""
109
+ return self.__timer
110
+
111
+ def clear(self):
112
+ with self.__timer as time:
113
+ self.expire(time)
114
+ Cache.clear(self)
115
+
116
+ def get(self, *args, **kwargs):
117
+ with self.__timer:
118
+ return Cache.get(self, *args, **kwargs)
119
+
120
+ def pop(self, *args, **kwargs):
121
+ with self.__timer:
122
+ return Cache.pop(self, *args, **kwargs)
123
+
124
+ def setdefault(self, *args, **kwargs):
125
+ with self.__timer:
126
+ return Cache.setdefault(self, *args, **kwargs)
127
+
128
+
129
+ class MlflowTraceTimeoutCache(_TimedCache):
130
+ """
131
+ A different implementation of cachetools.TTLCache that logs the expired traces to the backend.
132
+
133
+ NB: Do not use this class outside a singleton context. This class is not thread-safe.
134
+ """
135
+
136
+ def __init__(self, timeout: int, maxsize: int):
137
+ super().__init__(maxsize=maxsize)
138
+ self._timeout = timeout
139
+
140
+ # Set up the linked list ordered by expiration time
141
+ self._root = TTLCache._Link()
142
+ self._root.prev = self._root
143
+ self._root.next = self._root
144
+ self._links = OrderedDict()
145
+
146
+ self._start_expire_check_loop()
147
+
148
+ @property
149
+ def timeout(self) -> int:
150
+ # Timeout should not be changed after the cache is created
151
+ # because the linked list will not be updated accordingly.
152
+ return self._timeout
153
+
154
+ def __setitem__(self, key, value, cache_setitem=Cache.__setitem__):
155
+ """Set the item in the cache, and also in the linked list if it is a new key"""
156
+ with self.timer as time:
157
+ cache_setitem(self, key, value)
158
+
159
+ if key not in self._links:
160
+ # Add the new item to the tail of the linked list
161
+ # Inspired by https://github.com/tkem/cachetools/blob/d44c98407030d2e91cbe82c3997be042d9c2f0de/src/cachetools/__init__.py#L432
162
+ tail = self._root.prev
163
+ link = TTLCache._Link(key)
164
+ link.expires = time + self._timeout
165
+ link.next = self._root
166
+ link.prev = tail
167
+ tail.next = link
168
+ self._root.prev = link
169
+ self._links[key] = link
170
+
171
+ def __delitem__(self, key, cache_delitem=Cache.__delitem__):
172
+ """Delete the item from the cache and the linked list."""
173
+ cache_delitem(self, key)
174
+ link = self._links.pop(key)
175
+ link.unlink()
176
+
177
+ def _start_expire_check_loop(self):
178
+ # Close the daemon thread when the main thread exits
179
+ atexit.register(self.clear)
180
+
181
+ self._expire_checker_thread = threading.Thread(
182
+ target=self._expire_check_loop, daemon=True, name="TTLCacheExpireLoop"
183
+ )
184
+ self._expire_checker_stop_event = threading.Event()
185
+ self._expire_checker_thread.start()
186
+
187
+ def _expire_check_loop(self):
188
+ while not self._expire_checker_stop_event.is_set():
189
+ try:
190
+ self.expire()
191
+ except Exception as e:
192
+ _logger.debug(f"Failed to expire traces: {e}")
193
+ # If an error is raised from the expiration method, stop running the loop.
194
+ # Otherwise, the expire task might get heavier and heavier due to the
195
+ # increasing number of expired items.
196
+ break
197
+
198
+ time.sleep(MLFLOW_TRACE_TIMEOUT_CHECK_INTERVAL_SECONDS.get())
199
+
200
+ def expire(self, time=None):
201
+ """
202
+ Trigger the expiration of traces that have exceeded the timeout.
203
+
204
+ Args:
205
+ time: Unused. Only for compatibility with the parent class.
206
+ """
207
+ expired = self._get_expired_traces()
208
+
209
+ # End the expired traces and set the status to ERROR in background thread
210
+ for request_id in expired:
211
+ trace = self[request_id]
212
+ if root_span := trace.get_root_span():
213
+ try:
214
+ root_span.set_status(SpanStatusCode.ERROR)
215
+ msg = _TRACE_EXPIRATION_MSG.format(request_id=request_id, ttl=self._timeout)
216
+ exception_event = SpanEvent.from_exception(MlflowTracingException(msg))
217
+ root_span.add_event(exception_event)
218
+ root_span.end() # Calling end() triggers span export
219
+ _logger.info(msg + " You can find the aborted trace in the MLflow UI.")
220
+ except Exception as e:
221
+ _logger.debug(f"Failed to export an expired trace {request_id}: {e}")
222
+
223
+ # NB: root_span.end() should pop the trace from the cache. But we need to
224
+ # double-check it because it may not happens due to some errors.
225
+ if request_id in self:
226
+ del self[request_id]
227
+
228
+ def _get_expired_traces(self) -> list[str]:
229
+ """
230
+ Find all expired traces and return their request IDs.
231
+
232
+ The linked list is ordered by expiration time, so we can traverse the list from the head
233
+ and return early whenever we find a trace that has not expired yet.
234
+ """
235
+ time = self.timer()
236
+ curr = self._root.next
237
+
238
+ if curr.expires and time < curr.expires:
239
+ return []
240
+
241
+ expired = []
242
+ while curr is not self._root and not (time < curr.expires):
243
+ expired.append(curr.key)
244
+ curr = curr.next
245
+ return expired
246
+
247
+ def clear(self):
248
+ super().clear()
249
+ self._expire_checker_stop_event.set()
250
+ self._expire_checker_thread.join()
@@ -0,0 +1,19 @@
1
+ import contextvars
2
+ from dataclasses import dataclass
3
+ from typing import Optional
4
+
5
+ from mlflow.entities import LiveSpan
6
+
7
+
8
+ @dataclass
9
+ class SpanWithToken:
10
+ """
11
+ A utility container to hold an MLflow span and its corresponding OpenTelemetry token.
12
+
13
+ The token is a special object that is generated when setting a span as active within
14
+ the Open Telemetry span context. This token is required when inactivate the span i.e.
15
+ detaching the span from the context.
16
+ """
17
+
18
+ span: LiveSpan
19
+ token: Optional[contextvars.Token] = None
@@ -0,0 +1,124 @@
1
+ import json
2
+ from functools import lru_cache
3
+ from typing import Any, Optional
4
+
5
+ from mlflow.entities.trace_data import TraceData
6
+ from mlflow.entities.trace_info import TraceInfo
7
+ from mlflow.tracing.constant import (
8
+ TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_DBX,
9
+ TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_OSS,
10
+ )
11
+ from mlflow.tracking._tracking_service.utils import get_tracking_uri
12
+ from mlflow.utils.uri import is_databricks_uri
13
+
14
+
15
+ def set_request_response_preview(trace_info: TraceInfo, trace_data: TraceData) -> None:
16
+ """
17
+ Set the request and response previews for the trace info.
18
+ """
19
+ # If request/response preview is already set by users via `mlflow.update_current_trace`,
20
+ # we don't override it with the truncated version.
21
+ if trace_info.request_preview is None:
22
+ trace_info.request_preview = _get_truncated_preview(trace_data.request, role="user")
23
+ if trace_info.response_preview is None:
24
+ trace_info.response_preview = _get_truncated_preview(trace_data.response, role="assistant")
25
+
26
+
27
+ def _get_truncated_preview(request_or_response: Optional[str], role: str) -> str:
28
+ """
29
+ Truncate the request preview to fit the max length.
30
+ """
31
+ if request_or_response is None:
32
+ return ""
33
+
34
+ max_length = _get_max_length()
35
+
36
+ if len(request_or_response) <= max_length:
37
+ return request_or_response
38
+
39
+ content = None
40
+
41
+ # Parse JSON serialized request/response
42
+ try:
43
+ obj = json.loads(request_or_response)
44
+ except json.JSONDecodeError:
45
+ obj = None
46
+
47
+ if messages := _try_extract_messages(obj):
48
+ msg = _get_last_message(messages, role=role)
49
+ content = _get_text_content_from_message(msg)
50
+
51
+ content = content or request_or_response
52
+
53
+ if len(content) <= max_length:
54
+ return content
55
+
56
+ return content[: max_length - 3] + "..."
57
+
58
+
59
+ @lru_cache(maxsize=1)
60
+ def _get_max_length() -> int:
61
+ tracking_uri = get_tracking_uri()
62
+ return (
63
+ TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_DBX
64
+ if is_databricks_uri(tracking_uri)
65
+ else TRACE_REQUEST_RESPONSE_PREVIEW_MAX_LENGTH_OSS
66
+ )
67
+
68
+
69
+ def _try_extract_messages(obj: dict[str, Any]) -> Optional[list[dict[str, Any]]]:
70
+ if not isinstance(obj, dict):
71
+ return None
72
+
73
+ # Check if the object contains messages with OpenAI ChatCompletion format
74
+ if messages := obj.get("messages"):
75
+ return [item for item in messages if _is_message(item)]
76
+
77
+ # Check if the object contains a message in OpenAI ChatCompletion response format (choices)
78
+ if (choices := obj.get("choices")) and len(choices) > 0:
79
+ return [choices[0].get("message")]
80
+
81
+ # Check if the object contains a message in OpenAI Responses API request format
82
+ if (input := obj.get("input")) and isinstance(input, list):
83
+ return [item for item in input if _is_message(item)]
84
+
85
+ # Check if the object contains a message in OpenAI Responses API response format
86
+ if (output := obj.get("output")) and isinstance(output, list):
87
+ return [item for item in output if _is_message(item)]
88
+
89
+ # Handle ResponsesAgent input, which contains OpenAI Responses request in 'request' key
90
+ if "request" in obj:
91
+ return _try_extract_messages(obj["request"])
92
+
93
+ return None
94
+
95
+
96
+ def _is_message(item: Any) -> bool:
97
+ if not isinstance(item, dict):
98
+ return False
99
+ return "role" in item and "content" in item
100
+
101
+
102
+ def _get_last_message(messages: list[dict[str, Any]], role: str) -> Optional[dict[str, Any]]:
103
+ """
104
+ Return last message with the given role.
105
+ If the messages don't include a message with the given role, return the last one.
106
+ """
107
+ for message in reversed(messages):
108
+ if message.get("role") == role:
109
+ return message
110
+ return messages[-1]
111
+
112
+
113
+ def _get_text_content_from_message(message: dict[str, Any]) -> str:
114
+ content = message.get("content")
115
+ if isinstance(content, list):
116
+ # content is a list of content parts
117
+ for part in content:
118
+ if isinstance(part, str):
119
+ return part
120
+ elif isinstance(part, dict) and part.get("type") in ["text", "output_text"]:
121
+ return part.get("text")
122
+ elif isinstance(content, str):
123
+ return content
124
+ return ""
@@ -0,0 +1,76 @@
1
+ import functools
2
+ import importlib
3
+ import logging
4
+ import warnings
5
+ from typing import Optional
6
+
7
+ _logger = logging.getLogger(__name__)
8
+
9
+
10
+ class LogDemotionFilter(logging.Filter):
11
+ def __init__(self, module: str, message: str):
12
+ super().__init__()
13
+ self.module = module
14
+ self.message = message
15
+
16
+ def filter(self, record: logging.LogRecord) -> bool:
17
+ if record.name == self.module and self.message in record.getMessage():
18
+ record.levelno = logging.DEBUG # Change the log level to DEBUG
19
+ record.levelname = "DEBUG"
20
+
21
+ # Check the log level for the logger is debug or not
22
+ logger = logging.getLogger(self.module)
23
+ return logger.isEnabledFor(logging.DEBUG)
24
+ return True
25
+
26
+ def __eq__(self, other):
27
+ if isinstance(other, LogDemotionFilter):
28
+ return self.module == other.module and self.message == other.message
29
+ return False
30
+
31
+
32
+ def suppress_warning(module: str, message: str):
33
+ """
34
+ Convert the "Failed to detach context" log raised by the OpenTelemetry logger to DEBUG
35
+ level so that it does not show up in the user's console.
36
+
37
+ Args:
38
+ module: The module name of the logger that raises the warning.
39
+ message: The (part of) message in the log that needs to be demoted to DEBUG level
40
+ """
41
+ try:
42
+ logger = getattr(importlib.import_module(module), "logger", None)
43
+ log_filter = LogDemotionFilter(module, message)
44
+ if logger and not any(f == log_filter for f in logger.filters):
45
+ logger.addFilter(log_filter)
46
+ except Exception as e:
47
+ _logger.debug(f"Failed to suppress the warning for {module}", exc_info=e)
48
+ raise
49
+
50
+
51
+ def request_id_backward_compatible(func):
52
+ """
53
+ A decorator to support backward compatibility for the `request_id` parameter,
54
+ which is deprecated and replaced by the `trace_id` parameter in tracing APIs.
55
+
56
+ This decorator will adds `request_id` to the function signature and issue
57
+ a deprecation warning if `request_id` is used with non-null value.
58
+ """
59
+
60
+ @functools.wraps(func)
61
+ def wrapper(*args, request_id: Optional[str] = None, **kwargs):
62
+ if request_id is not None:
63
+ warnings.warn(
64
+ f"The request_id parameter is deprecated from the {func.__name__} API "
65
+ "and will be removed in a future version. Please use the `trace_id` "
66
+ "parameter instead.",
67
+ category=DeprecationWarning,
68
+ stacklevel=2,
69
+ )
70
+
71
+ if kwargs.get("trace_id") is None:
72
+ kwargs["trace_id"] = request_id
73
+
74
+ return func(*args, **kwargs)
75
+
76
+ return wrapper
@@ -0,0 +1,39 @@
1
+ """
2
+ The ``mlflow.tracking`` module provides a Python CRUD interface to MLflow experiments
3
+ and runs. This is a lower level API that directly translates to MLflow
4
+ `REST API <../rest-api.html>`_ calls.
5
+ For a higher level API for managing an "active run", use the :py:mod:`mlflow` module.
6
+ """
7
+
8
+ # Minimum APIs required for core tracing functionality of mlflow-tracing package.
9
+ from mlflow.tracking._tracking_service.utils import (
10
+ _get_artifact_repo,
11
+ _get_store,
12
+ get_tracking_uri,
13
+ is_tracking_uri_set,
14
+ set_tracking_uri,
15
+ )
16
+ from mlflow.version import IS_TRACING_SDK_ONLY
17
+
18
+ __all__ = [
19
+ "get_tracking_uri",
20
+ "set_tracking_uri",
21
+ "is_tracking_uri_set",
22
+ "_get_artifact_repo",
23
+ "_get_store",
24
+ ]
25
+
26
+ # Importing the following APIs only if mlflow or mlflow-skinny is installed.
27
+ if not IS_TRACING_SDK_ONLY:
28
+ from mlflow.tracking._model_registry.utils import (
29
+ get_registry_uri,
30
+ set_registry_uri,
31
+ )
32
+ from mlflow.tracking._tracking_service.utils import _get_artifact_repo
33
+ from mlflow.tracking.client import MlflowClient
34
+
35
+ __all__ += [
36
+ "get_registry_uri",
37
+ "set_registry_uri",
38
+ "MlflowClient",
39
+ ]
@@ -0,0 +1 @@
1
+ DEFAULT_AWAIT_MAX_SLEEP_SECONDS = 5 * 60