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,96 @@
1
+ import json
2
+ import sys
3
+ import time
4
+ import traceback
5
+ from dataclasses import dataclass, field
6
+ from datetime import datetime
7
+
8
+ from google.protobuf.json_format import ParseDict
9
+ from google.protobuf.struct_pb2 import Value
10
+ from opentelemetry.util.types import AttributeValue
11
+
12
+ from mlflow.entities._mlflow_object import _MlflowObject
13
+ from mlflow.protos.databricks_trace_server_pb2 import Span as ProtoSpan
14
+
15
+
16
+ @dataclass
17
+ class SpanEvent(_MlflowObject):
18
+ """
19
+ An event that records a specific occurrences or moments in time
20
+ during a span, such as an exception being thrown. Compatible with OpenTelemetry.
21
+
22
+ Args:
23
+ name: Name of the event.
24
+ timestamp: The exact time the event occurred, measured in nanoseconds.
25
+ If not provided, the current time will be used.
26
+ attributes: A collection of key-value pairs representing detailed
27
+ attributes of the event, such as the exception stack trace.
28
+ Attributes value must be one of ``[str, int, float, bool, bytes]``
29
+ or a sequence of these types.
30
+ """
31
+
32
+ name: str
33
+ # Use current time if not provided. We need to use default factory otherwise
34
+ # the default value will be fixed to the build time of the class.
35
+ timestamp: int = field(default_factory=lambda: int(time.time() * 1e6))
36
+ attributes: dict[str, AttributeValue] = field(default_factory=dict)
37
+
38
+ @classmethod
39
+ def from_exception(cls, exception: Exception):
40
+ "Create a span event from an exception."
41
+
42
+ stack_trace = cls._get_stacktrace(exception)
43
+ return cls(
44
+ name="exception",
45
+ attributes={
46
+ "exception.message": str(exception),
47
+ "exception.type": exception.__class__.__name__,
48
+ "exception.stacktrace": stack_trace,
49
+ },
50
+ )
51
+
52
+ @staticmethod
53
+ def _get_stacktrace(error: BaseException) -> str:
54
+ """Get the stacktrace of the parent error."""
55
+ msg = repr(error)
56
+ try:
57
+ if sys.version_info < (3, 10):
58
+ tb = traceback.format_exception(error.__class__, error, error.__traceback__)
59
+ else:
60
+ tb = traceback.format_exception(error)
61
+ return "".join(tb).strip()
62
+ except Exception:
63
+ return msg
64
+
65
+ def json(self):
66
+ return {
67
+ "name": self.name,
68
+ "timestamp": self.timestamp,
69
+ "attributes": json.dumps(self.attributes, cls=CustomEncoder)
70
+ if self.attributes
71
+ else None,
72
+ }
73
+
74
+ def to_proto(self):
75
+ """Convert into OTLP compatible proto object to sent to the Databricks Trace Server."""
76
+ return ProtoSpan.Event(
77
+ name=self.name,
78
+ time_unix_nano=self.timestamp,
79
+ attributes={k: ParseDict(v, Value()) for k, v in self.attributes.items()},
80
+ )
81
+
82
+
83
+ class CustomEncoder(json.JSONEncoder):
84
+ """
85
+ Custom encoder to handle json serialization.
86
+ """
87
+
88
+ def default(self, o):
89
+ try:
90
+ return super().default(o)
91
+ except TypeError:
92
+ # convert datetime to string format by default
93
+ if isinstance(o, datetime):
94
+ return o.isoformat()
95
+ # convert object direct to string to avoid error in serialization
96
+ return str(o)
@@ -0,0 +1,102 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from enum import Enum
5
+
6
+ from opentelemetry import trace as trace_api
7
+
8
+ from mlflow.exceptions import MlflowException
9
+ from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
10
+
11
+
12
+ class SpanStatusCode(str, Enum):
13
+ """Enum for status code of a span"""
14
+
15
+ # Uses the same set of status codes as OpenTelemetry
16
+ UNSET = "UNSET"
17
+ OK = "OK"
18
+ ERROR = "ERROR"
19
+
20
+ @staticmethod
21
+ def from_proto_status_code(status_code: str) -> SpanStatusCode:
22
+ """
23
+ Convert a string status code to the corresponding SpanStatusCode enum value.
24
+ """
25
+ from mlflow.protos.databricks_trace_server_pb2 import Span as ProtoSpan
26
+
27
+ proto_code = ProtoSpan.Status.StatusCode
28
+ status_code_mapping = {
29
+ proto_code.Name(proto_code.STATUS_CODE_UNSET): SpanStatusCode.UNSET,
30
+ proto_code.Name(proto_code.STATUS_CODE_OK): SpanStatusCode.OK,
31
+ proto_code.Name(proto_code.STATUS_CODE_ERROR): SpanStatusCode.ERROR,
32
+ }
33
+ try:
34
+ return status_code_mapping[status_code]
35
+ except KeyError:
36
+ raise MlflowException(
37
+ f"Invalid status code: {status_code}. "
38
+ f"Valid values are: {', '.join(status_code_mapping.keys())}",
39
+ error_code=INVALID_PARAMETER_VALUE,
40
+ )
41
+
42
+
43
+ @dataclass
44
+ class SpanStatus:
45
+ """
46
+ Status of the span or the trace.
47
+
48
+ Args:
49
+ status_code: The status code of the span or the trace. This must be one of the
50
+ values of the :py:class:`mlflow.entities.SpanStatusCode` enum or a string
51
+ representation of it like "OK", "ERROR".
52
+ description: Description of the status. This should be only set when the status
53
+ is ERROR, otherwise it will be ignored.
54
+ """
55
+
56
+ status_code: SpanStatusCode
57
+ description: str = ""
58
+
59
+ def __post_init__(self):
60
+ """
61
+ If user provides a string status code, validate it and convert to
62
+ the corresponding enum value.
63
+ """
64
+ if isinstance(self.status_code, str):
65
+ try:
66
+ self.status_code = SpanStatusCode(self.status_code)
67
+ except ValueError:
68
+ raise MlflowException(
69
+ f"{self.status_code} is not a valid SpanStatusCode value. "
70
+ f"Please use one of {[status_code.value for status_code in SpanStatusCode]}",
71
+ error_code=INVALID_PARAMETER_VALUE,
72
+ )
73
+
74
+ def to_otel_status(self) -> trace_api.Status:
75
+ """
76
+ Convert :py:class:`mlflow.entities.SpanStatus` object to OpenTelemetry status object.
77
+
78
+ :meta private:
79
+ """
80
+ try:
81
+ status_code = getattr(trace_api.StatusCode, self.status_code.name)
82
+ except AttributeError:
83
+ raise MlflowException(
84
+ f"Invalid status code: {self.status_code}", error_code=INVALID_PARAMETER_VALUE
85
+ )
86
+ return trace_api.Status(status_code, self.description)
87
+
88
+ @classmethod
89
+ def from_otel_status(cls, otel_status: trace_api.Status) -> SpanStatus:
90
+ """
91
+ Convert OpenTelemetry status object to our status object.
92
+
93
+ :meta private:
94
+ """
95
+ try:
96
+ status_code = SpanStatusCode(otel_status.status_code.name)
97
+ except ValueError:
98
+ raise MlflowException(
99
+ f"Got invalid status code from OpenTelemetry: {otel_status.status_code}",
100
+ error_code=INVALID_PARAMETER_VALUE,
101
+ )
102
+ return cls(status_code, otel_status.description or "")
@@ -0,0 +1,317 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import logging
5
+ import re
6
+ from dataclasses import dataclass
7
+ from typing import TYPE_CHECKING, Any, Literal, Optional, Union
8
+
9
+ from mlflow.entities._mlflow_object import _MlflowObject
10
+ from mlflow.entities.span import Span, SpanType
11
+ from mlflow.entities.trace_data import TraceData
12
+ from mlflow.entities.trace_info import TraceInfo
13
+ from mlflow.entities.trace_info_v2 import TraceInfoV2
14
+ from mlflow.exceptions import MlflowException
15
+ from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE
16
+ from mlflow.protos.service_pb2 import Trace as ProtoTrace
17
+
18
+ if TYPE_CHECKING:
19
+ from mlflow.entities.assessment import Assessment
20
+
21
+ _logger = logging.getLogger(__name__)
22
+
23
+
24
+ @dataclass
25
+ class Trace(_MlflowObject):
26
+ """A trace object.
27
+
28
+ Args:
29
+ info: A lightweight object that contains the metadata of a trace.
30
+ data: A container object that holds the spans data of a trace.
31
+ """
32
+
33
+ info: TraceInfo
34
+ data: TraceData
35
+
36
+ def __post_init__(self):
37
+ if isinstance(self.info, TraceInfoV2):
38
+ self.info = self.info.to_v3(request=self.data.request, response=self.data.response)
39
+
40
+ def __repr__(self) -> str:
41
+ return f"Trace(trace_id={self.info.trace_id})"
42
+
43
+ def to_dict(self) -> dict[str, Any]:
44
+ return {"info": self.info.to_dict(), "data": self.data.to_dict()}
45
+
46
+ def to_json(self, pretty=False) -> str:
47
+ from mlflow.tracing.utils import TraceJSONEncoder
48
+
49
+ return json.dumps(self.to_dict(), cls=TraceJSONEncoder, indent=2 if pretty else None)
50
+
51
+ @classmethod
52
+ def from_dict(cls, trace_dict: dict[str, Any]) -> Trace:
53
+ info = trace_dict.get("info")
54
+ data = trace_dict.get("data")
55
+ if info is None or data is None:
56
+ raise MlflowException(
57
+ "Unable to parse Trace from dictionary. Expected keys: 'info' and 'data'. "
58
+ f"Received keys: {list(trace_dict.keys())}",
59
+ error_code=INVALID_PARAMETER_VALUE,
60
+ )
61
+
62
+ return cls(
63
+ info=TraceInfo.from_dict(info),
64
+ data=TraceData.from_dict(data),
65
+ )
66
+
67
+ @classmethod
68
+ def from_json(cls, trace_json: str) -> Trace:
69
+ try:
70
+ trace_dict = json.loads(trace_json)
71
+ except json.JSONDecodeError as e:
72
+ raise MlflowException(
73
+ f"Unable to parse trace JSON: {trace_json}. Error: {e}",
74
+ error_code=INVALID_PARAMETER_VALUE,
75
+ )
76
+ return cls.from_dict(trace_dict)
77
+
78
+ def _serialize_for_mimebundle(self):
79
+ # databricks notebooks will use the request ID to
80
+ # fetch the trace from the backend. including the
81
+ # full JSON can cause notebooks to exceed size limits
82
+ return json.dumps(self.info.request_id)
83
+
84
+ def _repr_mimebundle_(self, include=None, exclude=None):
85
+ """
86
+ This method is used to trigger custom display logic in IPython notebooks.
87
+ See https://ipython.readthedocs.io/en/stable/config/integrating.html#MyObject
88
+ for more details.
89
+
90
+ At the moment, the only supported MIME type is "application/databricks.mlflow.trace",
91
+ which contains a JSON representation of the Trace object. This object is deserialized
92
+ in Databricks notebooks to display the Trace object in a nicer UI.
93
+ """
94
+ from mlflow.tracing.display import (
95
+ get_display_handler,
96
+ get_notebook_iframe_html,
97
+ is_using_tracking_server,
98
+ )
99
+ from mlflow.utils.databricks_utils import is_in_databricks_runtime
100
+
101
+ bundle = {"text/plain": repr(self)}
102
+
103
+ if not get_display_handler().disabled:
104
+ if is_in_databricks_runtime():
105
+ bundle["application/databricks.mlflow.trace"] = self._serialize_for_mimebundle()
106
+ elif is_using_tracking_server():
107
+ bundle["text/html"] = get_notebook_iframe_html([self])
108
+
109
+ return bundle
110
+
111
+ def to_pandas_dataframe_row(self) -> dict[str, Any]:
112
+ return {
113
+ "trace_id": self.info.trace_id,
114
+ "trace": self.to_json(), # json string to be compatible with Spark DataFrame
115
+ "client_request_id": self.info.client_request_id,
116
+ "state": self.info.state,
117
+ "request_time": self.info.request_time,
118
+ "execution_duration": self.info.execution_duration,
119
+ "request": self._deserialize_json_attr(self.data.request),
120
+ "response": self._deserialize_json_attr(self.data.response),
121
+ "trace_metadata": self.info.trace_metadata,
122
+ "tags": self.info.tags,
123
+ "spans": [span.to_dict() for span in self.data.spans],
124
+ "assessments": [assessment.to_dictionary() for assessment in self.info.assessments],
125
+ }
126
+
127
+ def _deserialize_json_attr(self, value: str):
128
+ try:
129
+ return json.loads(value)
130
+ except Exception:
131
+ _logger.debug(f"Failed to deserialize JSON attribute: {value}", exc_info=True)
132
+ return value
133
+
134
+ def search_spans(
135
+ self,
136
+ span_type: Optional[SpanType] = None,
137
+ name: Optional[Union[str, re.Pattern]] = None,
138
+ span_id: Optional[str] = None,
139
+ ) -> list[Span]:
140
+ """
141
+ Search for spans that match the given criteria within the trace.
142
+
143
+ Args:
144
+ span_type: The type of the span to search for.
145
+ name: The name of the span to search for. This can be a string or a regular expression.
146
+ span_id: The ID of the span to search for.
147
+
148
+ Returns:
149
+ A list of spans that match the given criteria.
150
+ If there is no match, an empty list is returned.
151
+
152
+ .. code-block:: python
153
+
154
+ import mlflow
155
+ import re
156
+ from mlflow.entities import SpanType
157
+
158
+
159
+ @mlflow.trace(span_type=SpanType.CHAIN)
160
+ def run(x: int) -> int:
161
+ x = add_one(x)
162
+ x = add_two(x)
163
+ x = multiply_by_two(x)
164
+ return x
165
+
166
+
167
+ @mlflow.trace(span_type=SpanType.TOOL)
168
+ def add_one(x: int) -> int:
169
+ return x + 1
170
+
171
+
172
+ @mlflow.trace(span_type=SpanType.TOOL)
173
+ def add_two(x: int) -> int:
174
+ return x + 2
175
+
176
+
177
+ @mlflow.trace(span_type=SpanType.TOOL)
178
+ def multiply_by_two(x: int) -> int:
179
+ return x * 2
180
+
181
+
182
+ # Run the function and get the trace
183
+ y = run(2)
184
+ trace_id = mlflow.get_last_active_trace_id()
185
+ trace = mlflow.get_trace(trace_id)
186
+
187
+ # 1. Search spans by name (exact match)
188
+ spans = trace.search_spans(name="add_one")
189
+ print(spans)
190
+ # Output: [Span(name='add_one', ...)]
191
+
192
+ # 2. Search spans by name (regular expression)
193
+ pattern = re.compile(r"add.*")
194
+ spans = trace.search_spans(name=pattern)
195
+ print(spans)
196
+ # Output: [Span(name='add_one', ...), Span(name='add_two', ...)]
197
+
198
+ # 3. Search spans by type
199
+ spans = trace.search_spans(span_type=SpanType.LLM)
200
+ print(spans)
201
+ # Output: [Span(name='run', ...)]
202
+
203
+ # 4. Search spans by name and type
204
+ spans = trace.search_spans(name="add_one", span_type=SpanType.TOOL)
205
+ print(spans)
206
+ # Output: [Span(name='add_one', ...)]
207
+ """
208
+
209
+ def _match_name(span: Span) -> bool:
210
+ if isinstance(name, str):
211
+ return span.name == name
212
+ elif isinstance(name, re.Pattern):
213
+ return name.search(span.name) is not None
214
+ elif name is None:
215
+ return True
216
+ else:
217
+ raise MlflowException(
218
+ f"Invalid type for 'name'. Expected str or re.Pattern. Got: {type(name)}",
219
+ error_code=INVALID_PARAMETER_VALUE,
220
+ )
221
+
222
+ def _match_type(span: Span) -> bool:
223
+ if isinstance(span_type, str):
224
+ return span.span_type == span_type
225
+ elif span_type is None:
226
+ return True
227
+ else:
228
+ raise MlflowException(
229
+ "Invalid type for 'span_type'. Expected str or mlflow.entities.SpanType. "
230
+ f"Got: {type(span_type)}",
231
+ error_code=INVALID_PARAMETER_VALUE,
232
+ )
233
+
234
+ def _match_id(span: Span) -> bool:
235
+ if span_id is None:
236
+ return True
237
+ else:
238
+ return span.span_id == span_id
239
+
240
+ return [
241
+ span
242
+ for span in self.data.spans
243
+ if _match_name(span) and _match_type(span) and _match_id(span)
244
+ ]
245
+
246
+ def search_assessments(
247
+ self,
248
+ name: Optional[str] = None,
249
+ *,
250
+ span_id: Optional[str] = None,
251
+ all: bool = False,
252
+ type: Optional[Literal["expectation", "feedback"]] = None,
253
+ ) -> list["Assessment"]:
254
+ """
255
+ Get assessments for a given name / span ID. By default, this only returns assessments
256
+ that are valid (i.e. have not been overridden by another assessment). To return all
257
+ assessments, specify `all=True`.
258
+
259
+ Args:
260
+ name: The name of the assessment to get. If not provided, this will match
261
+ all assessment names.
262
+ span_id: The span ID to get assessments for.
263
+ If not provided, this will match all spans.
264
+ all: If True, return all assessments regardless of validity.
265
+ type: The type of assessment to get (one of "feedback" or "expectation").
266
+ If not provided, this will match all assessment types.
267
+
268
+ Returns:
269
+ A list of assessments that meet the given conditions.
270
+ """
271
+
272
+ def validate_type(assessment: Assessment) -> bool:
273
+ from mlflow.entities.assessment import Expectation, Feedback
274
+
275
+ if type == "expectation":
276
+ return isinstance(assessment, Expectation)
277
+ elif type == "feedback":
278
+ return isinstance(assessment, Feedback)
279
+
280
+ return True
281
+
282
+ return [
283
+ assessment
284
+ for assessment in self.info.assessments
285
+ if (name is None or assessment.name == name)
286
+ and (span_id is None or assessment.span_id == span_id)
287
+ # valid defaults to true, so Nones are valid
288
+ and (all or assessment.valid in (True, None))
289
+ and (type is None or validate_type(assessment))
290
+ ]
291
+
292
+ @staticmethod
293
+ def pandas_dataframe_columns() -> list[str]:
294
+ return [
295
+ "trace_id",
296
+ "trace",
297
+ "client_request_id",
298
+ "state",
299
+ "request_time",
300
+ "execution_duration",
301
+ "request",
302
+ "response",
303
+ "trace_metadata",
304
+ "tags",
305
+ "spans",
306
+ "assessments",
307
+ ]
308
+
309
+ def to_proto(self):
310
+ """
311
+ Convert into a proto object to sent to the MLflow backend.
312
+
313
+ NB: The Trace definition in MLflow backend doesn't include the `data` field,
314
+ but rather only contains TraceInfoV3.
315
+ """
316
+
317
+ return ProtoTrace(trace_info=self.info.to_proto())
@@ -0,0 +1,71 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, Optional
3
+
4
+ from mlflow.entities import Span
5
+ from mlflow.tracing.constant import SpanAttributeKey
6
+
7
+
8
+ @dataclass
9
+ class TraceData:
10
+ """A container object that holds the spans data of a trace.
11
+
12
+ Args:
13
+ spans: List of spans that are part of the trace.
14
+ """
15
+
16
+ spans: list[Span] = field(default_factory=list)
17
+
18
+ # NB: Custom constructor to allow passing additional kwargs for backward compatibility for
19
+ # DBX agent evaluator. Once they migrates to trace V3 schema, we can remove this.
20
+ def __init__(self, spans: Optional[list[Span]] = None, **kwargs):
21
+ self.spans = spans or []
22
+
23
+ @classmethod
24
+ def from_dict(cls, d):
25
+ if not isinstance(d, dict):
26
+ raise TypeError(f"TraceData.from_dict() expects a dictionary. Got: {type(d).__name__}")
27
+ return cls(spans=[Span.from_dict(span) for span in d.get("spans", [])])
28
+
29
+ def to_dict(self) -> dict[str, Any]:
30
+ return {"spans": [span.to_dict() for span in self.spans]}
31
+
32
+ @property
33
+ def intermediate_outputs(self) -> Optional[dict[str, Any]]:
34
+ """
35
+ Returns intermediate outputs produced by the model or agent while handling the request.
36
+ There are mainly two flows to return intermediate outputs:
37
+ 1. When a trace is generate by the `mlflow.log_trace` API,
38
+ return `intermediate_outputs` attribute of the span.
39
+ 2. When a trace is created normally with a tree of spans,
40
+ aggregate the outputs of non-root spans.
41
+ """
42
+ root_span = self._get_root_span()
43
+ if root_span and root_span.get_attribute(SpanAttributeKey.INTERMEDIATE_OUTPUTS):
44
+ return root_span.get_attribute(SpanAttributeKey.INTERMEDIATE_OUTPUTS)
45
+
46
+ if len(self.spans) > 1:
47
+ return {
48
+ span.name: span.outputs
49
+ for span in self.spans
50
+ if span.parent_id and span.outputs is not None
51
+ }
52
+
53
+ def _get_root_span(self) -> Optional[Span]:
54
+ for span in self.spans:
55
+ if span.parent_id is None:
56
+ return span
57
+
58
+ # `request` and `response` are preserved for backward compatibility with v2
59
+ @property
60
+ def request(self) -> Optional[str]:
61
+ if span := self._get_root_span():
62
+ # Accessing the OTel span directly get serialized value directly.
63
+ return span._span.attributes.get(SpanAttributeKey.INPUTS)
64
+ return None
65
+
66
+ @property
67
+ def response(self) -> Optional[str]:
68
+ if span := self._get_root_span():
69
+ # Accessing the OTel span directly get serialized value directly.
70
+ return span._span.attributes.get(SpanAttributeKey.OUTPUTS)
71
+ return None