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,220 @@
1
+ import json
2
+ from dataclasses import dataclass, field
3
+ from typing import Any, Optional
4
+
5
+ from google.protobuf.duration_pb2 import Duration
6
+ from google.protobuf.json_format import MessageToDict
7
+ from google.protobuf.timestamp_pb2 import Timestamp
8
+
9
+ from mlflow.entities._mlflow_object import _MlflowObject
10
+ from mlflow.entities.assessment import Assessment
11
+ from mlflow.entities.trace_location import TraceLocation
12
+ from mlflow.entities.trace_state import TraceState
13
+ from mlflow.entities.trace_status import TraceStatus
14
+ from mlflow.protos.service_pb2 import TraceInfoV3 as ProtoTraceInfoV3
15
+ from mlflow.tracing.constant import TRACE_SCHEMA_VERSION, TRACE_SCHEMA_VERSION_KEY, TraceMetadataKey
16
+
17
+
18
+ @dataclass
19
+ class TraceInfo(_MlflowObject):
20
+ """Metadata about a trace, such as its ID, location, timestamp, etc.
21
+
22
+ Args:
23
+ trace_id: The primary identifier for the trace.
24
+ trace_location: The location where the trace is stored, represented as
25
+ a :py:class:`~mlflow.entities.TraceLocation` object. MLflow currently
26
+ support MLflow Experiment or Databricks Inference Table as a trace location.
27
+ request_time: Start time of the trace, in milliseconds.
28
+ state: State of the trace, represented as a :py:class:`~mlflow.entities.TraceState`
29
+ enum. Can be one of [`OK`, `ERROR`, `IN_PROGRESS`, `STATE_UNSPECIFIED`].
30
+ request_preview: Request to the model/agent, equivalent to the input of the root,
31
+ span but JSON-encoded and can be truncated.
32
+ response_preview: Response from the model/agent, equivalent to the output of the
33
+ root span but JSON-encoded and can be truncated.
34
+ client_request_id: Client supplied request ID associated with the trace. This
35
+ could be used to identify the trace/request from an external system that
36
+ produced the trace, e.g., a session ID in a web application.
37
+ execution_duration: Duration of the trace, in milliseconds.
38
+ trace_metadata: Key-value pairs associated with the trace. They are designed
39
+ for immutable values like run ID associated with the trace.
40
+ tags: Tags associated with the trace. They are designed for mutable values,
41
+ that can be updated after the trace is created via MLflow UI or API.
42
+ assessments: List of assessments associated with the trace.
43
+ """
44
+
45
+ trace_id: str
46
+ trace_location: TraceLocation
47
+ request_time: int
48
+ state: TraceState
49
+ request_preview: Optional[str] = None
50
+ response_preview: Optional[str] = None
51
+ client_request_id: Optional[str] = None
52
+ execution_duration: Optional[int] = None
53
+ trace_metadata: dict[str, str] = field(default_factory=dict)
54
+ tags: dict[str, str] = field(default_factory=dict)
55
+ assessments: list[Assessment] = field(default_factory=list)
56
+
57
+ def __post_init__(self):
58
+ # NB: MLflow automatically converts trace metadata and spans to V3 format, even if the
59
+ # trace was originally created in V2 format with an earlier version of MLflow. Accordingly,
60
+ # we also update the `TRACE_SCHEMA_VERSION_KEY` in the trace metadata to V3 for consistency
61
+ self.trace_metadata[TRACE_SCHEMA_VERSION_KEY] = str(TRACE_SCHEMA_VERSION)
62
+
63
+ def to_dict(self) -> dict[str, Any]:
64
+ """Convert the TraceInfoV3 object to a dictionary."""
65
+ res = MessageToDict(self.to_proto(), preserving_proto_field_name=True)
66
+ if self.execution_duration is not None:
67
+ res.pop("execution_duration", None)
68
+ res["execution_duration_ms"] = self.execution_duration
69
+ return res
70
+
71
+ @classmethod
72
+ def from_dict(cls, d: dict[str, Any]) -> "TraceInfo":
73
+ """Create a TraceInfoV3 object from a dictionary."""
74
+ if "request_id" in d:
75
+ from mlflow.entities.trace_info_v2 import TraceInfoV2
76
+
77
+ return TraceInfoV2.from_dict(d).to_v3()
78
+
79
+ d = d.copy()
80
+ if assessments := d.get("assessments"):
81
+ d["assessments"] = [Assessment.from_dictionary(a) for a in assessments]
82
+
83
+ if trace_location := d.get("trace_location"):
84
+ d["trace_location"] = TraceLocation.from_dict(trace_location)
85
+
86
+ if state := d.get("state"):
87
+ d["state"] = TraceState(state)
88
+
89
+ if request_time := d.get("request_time"):
90
+ timestamp = Timestamp()
91
+ timestamp.FromJsonString(request_time)
92
+ d["request_time"] = timestamp.ToMilliseconds()
93
+
94
+ if (execution_duration := d.pop("execution_duration_ms", None)) is not None:
95
+ d["execution_duration"] = execution_duration
96
+
97
+ return cls(**d)
98
+
99
+ def to_proto(self):
100
+ from mlflow.entities.trace_info_v2 import _truncate_request_metadata, _truncate_tags
101
+
102
+ request_time = Timestamp()
103
+ request_time.FromMilliseconds(self.request_time)
104
+ execution_duration = None
105
+ if self.execution_duration is not None:
106
+ execution_duration = Duration()
107
+ execution_duration.FromMilliseconds(self.execution_duration)
108
+
109
+ return ProtoTraceInfoV3(
110
+ trace_id=self.trace_id,
111
+ client_request_id=self.client_request_id,
112
+ trace_location=self.trace_location.to_proto(),
113
+ request_preview=self.request_preview,
114
+ response_preview=self.response_preview,
115
+ request_time=request_time,
116
+ execution_duration=execution_duration,
117
+ state=self.state.to_proto(),
118
+ trace_metadata=_truncate_request_metadata(self.trace_metadata),
119
+ tags=_truncate_tags(self.tags),
120
+ assessments=[a.to_proto() for a in self.assessments],
121
+ )
122
+
123
+ @classmethod
124
+ def from_proto(cls, proto) -> "TraceInfo":
125
+ if "request_id" in proto.DESCRIPTOR.fields_by_name:
126
+ from mlflow.entities.trace_info_v2 import TraceInfoV2
127
+
128
+ return TraceInfoV2.from_proto(proto).to_v3()
129
+
130
+ return cls(
131
+ trace_id=proto.trace_id,
132
+ client_request_id=(
133
+ proto.client_request_id if proto.HasField("client_request_id") else None
134
+ ),
135
+ trace_location=TraceLocation.from_proto(proto.trace_location),
136
+ request_preview=proto.request_preview,
137
+ response_preview=proto.response_preview,
138
+ request_time=proto.request_time.ToMilliseconds(),
139
+ execution_duration=(
140
+ proto.execution_duration.ToMilliseconds()
141
+ if proto.HasField("execution_duration")
142
+ else None
143
+ ),
144
+ state=TraceState.from_proto(proto.state),
145
+ trace_metadata=dict(proto.trace_metadata),
146
+ tags=dict(proto.tags),
147
+ assessments=[Assessment.from_proto(a) for a in proto.assessments],
148
+ )
149
+
150
+ # Aliases for backward compatibility with V2 format
151
+ @property
152
+ def request_id(self) -> str:
153
+ """Deprecated. Use `trace_id` instead."""
154
+ return self.trace_id
155
+
156
+ @property
157
+ def experiment_id(self) -> Optional[str]:
158
+ """
159
+ An MLflow experiment ID associated with the trace, if the trace is stored
160
+ in MLflow tracking server. Otherwise, None.
161
+ """
162
+ return (
163
+ self.trace_location.mlflow_experiment
164
+ and self.trace_location.mlflow_experiment.experiment_id
165
+ )
166
+
167
+ @experiment_id.setter
168
+ def experiment_id(self, value: Optional[str]) -> None:
169
+ self.trace_location.mlflow_experiment.experiment_id = value
170
+
171
+ @property
172
+ def request_metadata(self) -> dict[str, str]:
173
+ """Deprecated. Use `trace_metadata` instead."""
174
+ return self.trace_metadata
175
+
176
+ @property
177
+ def timestamp_ms(self) -> int:
178
+ return self.request_time
179
+
180
+ @timestamp_ms.setter
181
+ def timestamp_ms(self, value: int) -> None:
182
+ self.request_time = value
183
+
184
+ @property
185
+ def execution_time_ms(self) -> Optional[int]:
186
+ return self.execution_duration
187
+
188
+ @execution_time_ms.setter
189
+ def execution_time_ms(self, value: Optional[int]) -> None:
190
+ self.execution_duration = value
191
+
192
+ @property
193
+ def status(self) -> TraceStatus:
194
+ """Deprecated. Use `state` instead."""
195
+ return TraceStatus.from_state(self.state)
196
+
197
+ @status.setter
198
+ def status(self, value: TraceStatus) -> None:
199
+ self.state = value.to_state()
200
+
201
+ @property
202
+ def token_usage(self) -> Optional[dict[str, int]]:
203
+ """
204
+ Returns the aggregated token usage for the trace.
205
+
206
+ Returns:
207
+ A dictionary containing the aggregated LLM token usage for the trace.
208
+ - "input_tokens": The total number of input tokens.
209
+ - "output_tokens": The total number of output tokens.
210
+ - "total_tokens": Sum of input and output tokens.
211
+
212
+ .. note::
213
+
214
+ The token usage tracking is not supported for all LLM providers.
215
+ Refer to the MLflow Tracing documentation for which providers
216
+ support token usage tracking.
217
+ """
218
+ if usage_json := self.trace_metadata.get(TraceMetadataKey.TOKEN_USAGE):
219
+ return json.loads(usage_json)
220
+ return None
@@ -0,0 +1,162 @@
1
+ from dataclasses import asdict, dataclass, field
2
+ from typing import Any, Optional
3
+
4
+ from mlflow.entities._mlflow_object import _MlflowObject
5
+ from mlflow.entities.assessment import Assessment
6
+ from mlflow.entities.trace_info import TraceInfo
7
+ from mlflow.entities.trace_location import TraceLocation
8
+ from mlflow.entities.trace_status import TraceStatus
9
+ from mlflow.protos.service_pb2 import TraceInfo as ProtoTraceInfo
10
+ from mlflow.protos.service_pb2 import TraceRequestMetadata as ProtoTraceRequestMetadata
11
+ from mlflow.protos.service_pb2 import TraceTag as ProtoTraceTag
12
+ from mlflow.tracing.constant import TRACE_SCHEMA_VERSION_KEY
13
+
14
+
15
+ def _truncate_request_metadata(d: dict[str, Any]) -> dict[str, str]:
16
+ from mlflow.tracing.constant import MAX_CHARS_IN_TRACE_INFO_METADATA
17
+
18
+ return {
19
+ k[:MAX_CHARS_IN_TRACE_INFO_METADATA]: str(v)[:MAX_CHARS_IN_TRACE_INFO_METADATA]
20
+ for k, v in d.items()
21
+ }
22
+
23
+
24
+ def _truncate_tags(d: dict[str, Any]) -> dict[str, str]:
25
+ from mlflow.tracing.constant import (
26
+ MAX_CHARS_IN_TRACE_INFO_TAGS_KEY,
27
+ MAX_CHARS_IN_TRACE_INFO_TAGS_VALUE,
28
+ )
29
+
30
+ return {
31
+ k[:MAX_CHARS_IN_TRACE_INFO_TAGS_KEY]: str(v)[:MAX_CHARS_IN_TRACE_INFO_TAGS_VALUE]
32
+ for k, v in d.items()
33
+ }
34
+
35
+
36
+ @dataclass
37
+ class TraceInfoV2(_MlflowObject):
38
+ """Metadata about a trace.
39
+
40
+ Args:
41
+ request_id: id of the trace.
42
+ experiment_id: id of the experiment.
43
+ timestamp_ms: start time of the trace, in milliseconds.
44
+ execution_time_ms: duration of the trace, in milliseconds.
45
+ status: status of the trace.
46
+ request_metadata: Key-value pairs associated with the trace. Request metadata are designed
47
+ for immutable values like run ID associated with the trace.
48
+ tags: Tags associated with the trace. Tags are designed for mutable values like trace name,
49
+ that can be updated by the users after the trace is created, unlike request_metadata.
50
+ """
51
+
52
+ request_id: str
53
+ experiment_id: str
54
+ timestamp_ms: int
55
+ execution_time_ms: Optional[int]
56
+ status: TraceStatus
57
+ request_metadata: dict[str, str] = field(default_factory=dict)
58
+ tags: dict[str, str] = field(default_factory=dict)
59
+ assessments: list[Assessment] = field(default_factory=list)
60
+
61
+ def __post_init__(self):
62
+ self.request_metadata[TRACE_SCHEMA_VERSION_KEY] = "2"
63
+
64
+ def __eq__(self, other):
65
+ if type(other) is type(self):
66
+ return self.__dict__ == other.__dict__
67
+ return False
68
+
69
+ @property
70
+ def trace_id(self) -> str:
71
+ """Returns the trace ID of the trace info."""
72
+ return self.request_id
73
+
74
+ def to_proto(self):
75
+ proto = ProtoTraceInfo()
76
+ proto.request_id = self.request_id
77
+ proto.experiment_id = self.experiment_id
78
+ proto.timestamp_ms = self.timestamp_ms
79
+ # NB: Proto setter does not support nullable fields (even with 'optional' keyword),
80
+ # so we substitute None with 0 for execution_time_ms. This should be not too confusing
81
+ # as we only put None when starting a trace i.e. the execution time is actually 0.
82
+ proto.execution_time_ms = self.execution_time_ms or 0
83
+ proto.status = self.status.to_proto()
84
+
85
+ request_metadata = []
86
+ for key, value in _truncate_request_metadata(self.request_metadata).items():
87
+ attr = ProtoTraceRequestMetadata()
88
+ attr.key = key
89
+ attr.value = value
90
+ request_metadata.append(attr)
91
+ proto.request_metadata.extend(request_metadata)
92
+
93
+ tags = []
94
+ for key, value in _truncate_tags(self.tags).items():
95
+ tag = ProtoTraceTag()
96
+ tag.key = key
97
+ tag.value = str(value)
98
+ tags.append(tag)
99
+
100
+ proto.tags.extend(tags)
101
+ return proto
102
+
103
+ @classmethod
104
+ def from_proto(cls, proto, assessments=None):
105
+ return cls(
106
+ request_id=proto.request_id,
107
+ experiment_id=proto.experiment_id,
108
+ timestamp_ms=proto.timestamp_ms,
109
+ execution_time_ms=proto.execution_time_ms,
110
+ status=TraceStatus.from_proto(proto.status),
111
+ request_metadata={attr.key: attr.value for attr in proto.request_metadata},
112
+ tags={tag.key: tag.value for tag in proto.tags},
113
+ assessments=assessments or [],
114
+ )
115
+
116
+ def to_dict(self):
117
+ """
118
+ Convert trace info to a dictionary for persistence.
119
+ Update status field to the string value for serialization.
120
+ """
121
+ trace_info_dict = asdict(self)
122
+ trace_info_dict["status"] = self.status.value
123
+ # Client request ID field is only added for internal use, and should not be
124
+ # serialized for V2 TraceInfo.
125
+ trace_info_dict.pop("client_request_id", None)
126
+ return trace_info_dict
127
+
128
+ @classmethod
129
+ def from_dict(cls, trace_info_dict):
130
+ """
131
+ Convert trace info dictionary to TraceInfo object.
132
+ """
133
+ if "status" not in trace_info_dict:
134
+ raise ValueError("status is required in trace info dictionary.")
135
+ trace_info_dict["status"] = TraceStatus(trace_info_dict["status"])
136
+ return cls(**trace_info_dict)
137
+
138
+ def to_v3(self, request: Optional[str] = None, response: Optional[str] = None) -> TraceInfo:
139
+ return TraceInfo(
140
+ trace_id=self.request_id,
141
+ trace_location=TraceLocation.from_experiment_id(self.experiment_id),
142
+ request_preview=request,
143
+ response_preview=response,
144
+ request_time=self.timestamp_ms,
145
+ execution_duration=self.execution_time_ms,
146
+ state=self.status.to_state(),
147
+ trace_metadata=self.request_metadata.copy(),
148
+ tags=self.tags,
149
+ assessments=self.assessments,
150
+ )
151
+
152
+ @classmethod
153
+ def from_v3(cls, trace_info: TraceInfo) -> "TraceInfoV2":
154
+ return cls(
155
+ request_id=trace_info.trace_id,
156
+ experiment_id=trace_info.experiment_id,
157
+ timestamp_ms=trace_info.request_time,
158
+ execution_time_ms=trace_info.execution_duration,
159
+ status=TraceStatus.from_state(trace_info.state),
160
+ request_metadata=trace_info.trace_metadata.copy(),
161
+ tags=trace_info.tags,
162
+ )
@@ -0,0 +1,173 @@
1
+ from dataclasses import dataclass
2
+ from enum import Enum
3
+ from typing import Any, Optional
4
+
5
+ from mlflow.entities._mlflow_object import _MlflowObject
6
+ from mlflow.exceptions import MlflowException
7
+ from mlflow.protos import service_pb2 as pb
8
+
9
+
10
+ @dataclass
11
+ class MlflowExperimentLocation(_MlflowObject):
12
+ """
13
+ Represents the location of an MLflow experiment.
14
+
15
+ Args:
16
+ experiment_id: The ID of the MLflow experiment where the trace is stored.
17
+ """
18
+
19
+ experiment_id: str
20
+
21
+ def to_proto(self):
22
+ return pb.TraceLocation.MlflowExperimentLocation(experiment_id=self.experiment_id)
23
+
24
+ @classmethod
25
+ def from_proto(cls, proto) -> "MlflowExperimentLocation":
26
+ return cls(experiment_id=proto.experiment_id)
27
+
28
+ def to_dict(self) -> dict[str, Any]:
29
+ return {"experiment_id": self.experiment_id}
30
+
31
+ @classmethod
32
+ def from_dict(cls, d: dict[str, Any]) -> "MlflowExperimentLocation":
33
+ return cls(experiment_id=d["experiment_id"])
34
+
35
+
36
+ @dataclass
37
+ class InferenceTableLocation(_MlflowObject):
38
+ """
39
+ Represents the location of a Databricks inference table.
40
+
41
+ Args:
42
+ full_table_name: The fully qualified name of the inference table where
43
+ the trace is stored, in the format of `<catalog>.<schema>.<table>`.
44
+ """
45
+
46
+ full_table_name: str
47
+
48
+ def to_proto(self):
49
+ return pb.TraceLocation.InferenceTableLocation(full_table_name=self.full_table_name)
50
+
51
+ @classmethod
52
+ def from_proto(cls, proto) -> "InferenceTableLocation":
53
+ return cls(full_table_name=proto.full_table_name)
54
+
55
+ def to_dict(self) -> dict[str, Any]:
56
+ return {"full_table_name": self.full_table_name}
57
+
58
+ @classmethod
59
+ def from_dict(cls, d: dict[str, Any]) -> "InferenceTableLocation":
60
+ return cls(full_table_name=d["full_table_name"])
61
+
62
+
63
+ class TraceLocationType(str, Enum):
64
+ TRACE_LOCATION_TYPE_UNSPECIFIED = "TRACE_LOCATION_TYPE_UNSPECIFIED"
65
+ MLFLOW_EXPERIMENT = "MLFLOW_EXPERIMENT"
66
+ INFERENCE_TABLE = "INFERENCE_TABLE"
67
+
68
+ def to_proto(self):
69
+ return pb.TraceLocation.TraceLocationType.Value(self)
70
+
71
+ @classmethod
72
+ def from_proto(cls, proto: int) -> "TraceLocationType":
73
+ return TraceLocationType(pb.TraceLocation.TraceLocationType.Name(proto))
74
+
75
+ @classmethod
76
+ def from_dict(cls, d: dict[str, Any]) -> "TraceLocationType":
77
+ return cls(d["type"])
78
+
79
+
80
+ @dataclass
81
+ class TraceLocation(_MlflowObject):
82
+ """
83
+ Represents the location where the trace is stored.
84
+
85
+ Currently, MLflow supports two types of trace locations:
86
+
87
+ - MLflow experiment: The trace is stored in an MLflow experiment.
88
+ - Inference table: The trace is stored in a Databricks inference table.
89
+
90
+ Args:
91
+ type: The type of the trace location, should be one of the
92
+ :py:class:`TraceLocationType` enum values.
93
+ mlflow_experiment: The MLflow experiment location. Set this when the
94
+ location type is MLflow experiment.
95
+ inference_table: The inference table location. Set this when the
96
+ location type is Databricks Inference table.
97
+ """
98
+
99
+ type: TraceLocationType
100
+ mlflow_experiment: Optional[MlflowExperimentLocation] = None
101
+ inference_table: Optional[InferenceTableLocation] = None
102
+
103
+ def __post_init__(self) -> None:
104
+ if self.mlflow_experiment is not None and self.inference_table is not None:
105
+ raise MlflowException.invalid_parameter_value(
106
+ "Only one of mlflow_experiment or inference_table can be provided."
107
+ )
108
+
109
+ if (self.mlflow_experiment and self.type != TraceLocationType.MLFLOW_EXPERIMENT) or (
110
+ self.inference_table and self.type != TraceLocationType.INFERENCE_TABLE
111
+ ):
112
+ raise MlflowException.invalid_parameter_value(
113
+ f"Trace location type {type} does not match the provided location "
114
+ f"{self.mlflow_experiment or self.inference_table}."
115
+ )
116
+
117
+ def to_dict(self) -> dict[str, Any]:
118
+ d = {"type": self.type.value}
119
+ if self.mlflow_experiment:
120
+ d["mlflow_experiment"] = self.mlflow_experiment.to_dict()
121
+ elif self.inference_table:
122
+ d["inference_table"] = self.inference_table.to_dict()
123
+ return d
124
+
125
+ @classmethod
126
+ def from_dict(cls, d: dict[str, Any]) -> "TraceLocation":
127
+ return cls(
128
+ type=TraceLocationType(d["type"]),
129
+ mlflow_experiment=(
130
+ MlflowExperimentLocation.from_dict(v) if (v := d.get("mlflow_experiment")) else None
131
+ ),
132
+ inference_table=(
133
+ InferenceTableLocation.from_dict(v) if (v := d.get("inference_table")) else None
134
+ ),
135
+ )
136
+
137
+ def to_proto(self):
138
+ if self.mlflow_experiment:
139
+ return pb.TraceLocation(
140
+ type=self.type.to_proto(),
141
+ mlflow_experiment=self.mlflow_experiment.to_proto(),
142
+ )
143
+ elif self.inference_table:
144
+ return pb.TraceLocation(
145
+ type=self.type.to_proto(),
146
+ inference_table=self.inference_table.to_proto(),
147
+ )
148
+
149
+ else:
150
+ return pb.TraceLocation(type=self.type.to_proto())
151
+
152
+ @classmethod
153
+ def from_proto(cls, proto) -> "TraceLocation":
154
+ type_ = TraceLocationType.from_proto(proto.type)
155
+ if proto.WhichOneof("identifier") == "mlflow_experiment":
156
+ return cls(
157
+ type=type_,
158
+ mlflow_experiment=MlflowExperimentLocation.from_proto(proto.mlflow_experiment),
159
+ )
160
+ elif proto.WhichOneof("identifier") == "inference_table":
161
+ return cls(
162
+ type=type_,
163
+ inference_table=InferenceTableLocation.from_proto(proto.inference_table),
164
+ )
165
+ else:
166
+ return cls(type=type_)
167
+
168
+ @classmethod
169
+ def from_experiment_id(cls, experiment_id: str) -> "TraceLocation":
170
+ return cls(
171
+ type=TraceLocationType.MLFLOW_EXPERIMENT,
172
+ mlflow_experiment=MlflowExperimentLocation(experiment_id=experiment_id),
173
+ )
@@ -0,0 +1,39 @@
1
+ from enum import Enum
2
+
3
+ from opentelemetry import trace as trace_api
4
+
5
+ from mlflow.protos import service_pb2 as pb
6
+
7
+
8
+ class TraceState(str, Enum):
9
+ """Enum representing the state of a trace.
10
+
11
+ - ``STATE_UNSPECIFIED``: Unspecified trace state.
12
+ - ``OK``: Trace successfully completed.
13
+ - ``ERROR``: Trace encountered an error.
14
+ - ``IN_PROGRESS``: Trace is currently in progress.
15
+ """
16
+
17
+ STATE_UNSPECIFIED = "STATE_UNSPECIFIED"
18
+ OK = "OK"
19
+ ERROR = "ERROR"
20
+ IN_PROGRESS = "IN_PROGRESS"
21
+
22
+ def to_proto(self):
23
+ return pb.TraceInfoV3.State.Value(self)
24
+
25
+ @classmethod
26
+ def from_proto(cls, proto: int) -> "TraceState":
27
+ return TraceState(pb.TraceInfoV3.State.Name(proto))
28
+
29
+ @staticmethod
30
+ def from_otel_status(otel_status: trace_api.Status):
31
+ """Convert OpenTelemetry status code to MLflow TraceState."""
32
+ return _OTEL_STATUS_CODE_TO_MLFLOW[otel_status.status_code]
33
+
34
+
35
+ _OTEL_STATUS_CODE_TO_MLFLOW = {
36
+ trace_api.StatusCode.OK: TraceState.OK,
37
+ trace_api.StatusCode.ERROR: TraceState.ERROR,
38
+ trace_api.StatusCode.UNSET: TraceState.STATE_UNSPECIFIED,
39
+ }
@@ -0,0 +1,68 @@
1
+ from enum import Enum
2
+
3
+ from opentelemetry import trace as trace_api
4
+
5
+ from mlflow.entities.trace_state import TraceState
6
+ from mlflow.protos.service_pb2 import TraceStatus as ProtoTraceStatus
7
+ from mlflow.utils.annotations import deprecated
8
+
9
+
10
+ @deprecated(alternative="mlflow.entities.trace_state.TraceState")
11
+ class TraceStatus(str, Enum):
12
+ """Enum for status of an :py:class:`mlflow.entities.TraceInfo`."""
13
+
14
+ UNSPECIFIED = "TRACE_STATUS_UNSPECIFIED"
15
+ OK = "OK"
16
+ ERROR = "ERROR"
17
+ IN_PROGRESS = "IN_PROGRESS"
18
+
19
+ def to_state(self) -> TraceState:
20
+ if self == TraceStatus.UNSPECIFIED:
21
+ return TraceState.STATE_UNSPECIFIED
22
+ elif self == TraceStatus.OK:
23
+ return TraceState.OK
24
+ elif self == TraceStatus.ERROR:
25
+ return TraceState.ERROR
26
+ elif self == TraceStatus.IN_PROGRESS:
27
+ return TraceState.IN_PROGRESS
28
+ raise ValueError(f"Unknown TraceStatus: {self}")
29
+
30
+ @classmethod
31
+ def from_state(cls, state: TraceState) -> "TraceStatus":
32
+ if state == TraceState.STATE_UNSPECIFIED:
33
+ return cls.UNSPECIFIED
34
+ elif state == TraceState.OK:
35
+ return cls.OK
36
+ elif state == TraceState.ERROR:
37
+ return cls.ERROR
38
+ elif state == TraceState.IN_PROGRESS:
39
+ return cls.IN_PROGRESS
40
+ raise ValueError(f"Unknown TraceState: {state}")
41
+
42
+ def to_proto(self):
43
+ return ProtoTraceStatus.Value(self)
44
+
45
+ @staticmethod
46
+ def from_proto(proto_status):
47
+ return TraceStatus(ProtoTraceStatus.Name(proto_status))
48
+
49
+ @staticmethod
50
+ def from_otel_status(otel_status: trace_api.Status):
51
+ return _OTEL_STATUS_CODE_TO_MLFLOW[otel_status.status_code]
52
+
53
+ @classmethod
54
+ def pending_statuses(cls):
55
+ """Traces in pending statuses can be updated to any statuses."""
56
+ return {cls.IN_PROGRESS}
57
+
58
+ @classmethod
59
+ def end_statuses(cls):
60
+ """Traces in end statuses cannot be updated to any statuses."""
61
+ return {cls.UNSPECIFIED, cls.OK, cls.ERROR}
62
+
63
+
64
+ _OTEL_STATUS_CODE_TO_MLFLOW = {
65
+ trace_api.StatusCode.OK: TraceStatus.OK,
66
+ trace_api.StatusCode.ERROR: TraceStatus.ERROR,
67
+ trace_api.StatusCode.UNSET: TraceStatus.UNSPECIFIED,
68
+ }