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,131 @@
1
+ from typing import TYPE_CHECKING, Any, Optional, Union
2
+
3
+ from mlflow.data import Dataset
4
+ from mlflow.data.digest_utils import compute_pandas_digest
5
+ from mlflow.data.evaluation_dataset import EvaluationDataset as LegacyEvaluationDataset
6
+ from mlflow.data.pyfunc_dataset_mixin import PyFuncConvertibleDatasetMixin
7
+ from mlflow.data.spark_dataset_source import SparkDatasetSource
8
+ from mlflow.entities import Dataset as DatasetEntity
9
+
10
+ if TYPE_CHECKING:
11
+ import pandas as pd
12
+ import pyspark
13
+ from databricks.agents.datasets import Dataset as ManagedDataset
14
+
15
+
16
+ class EvaluationDataset(Dataset, PyFuncConvertibleDatasetMixin):
17
+ """
18
+ A dataset for storing evaluation records (inputs and expectations).
19
+
20
+ Currently, this class is only supported for Databricks managed datasets.
21
+ To use this class, you must have the `databricks-agents` package installed.
22
+ """
23
+
24
+ def __init__(self, dataset: "ManagedDataset"):
25
+ self._dataset = dataset
26
+ self._df = None
27
+ self._digest = None
28
+
29
+ @property
30
+ def dataset_id(self) -> str:
31
+ """The unique identifier of the dataset."""
32
+ return self._dataset.dataset_id
33
+
34
+ @property
35
+ def digest(self) -> Optional[str]:
36
+ """String digest (hash) of the dataset provided by the caller that uniquely identifies"""
37
+ # NB: The managed Dataset entity in Agent SDK doesn't propagate the digest
38
+ # information. So we compute the digest of the dataframe view.
39
+ if self._digest is None:
40
+ self._digest = self._dataset.digest or compute_pandas_digest(self.to_df())
41
+ return self._digest
42
+
43
+ @property
44
+ def name(self) -> Optional[str]:
45
+ """The UC table name of the dataset."""
46
+ return self._dataset.name
47
+
48
+ @property
49
+ def schema(self) -> Optional[str]:
50
+ """The schema of the dataset."""
51
+ return self._dataset.schema
52
+
53
+ @property
54
+ def profile(self) -> Optional[str]:
55
+ """The profile of the dataset, summary statistics."""
56
+ return self._dataset.profile
57
+
58
+ @property
59
+ def source(self) -> Optional[str]:
60
+ """Source information for the dataset."""
61
+ # NB: The managed Dataset entity in Agent SDK doesn't propagate the source
62
+ # information. So we use the table name as the fallback source.
63
+ return self._dataset.source or SparkDatasetSource(table_name=self.name)
64
+
65
+ @property
66
+ def source_type(self) -> Optional[str]:
67
+ """The type of the dataset source, e.g. "databricks-uc-table", "DBFS", "S3", ..."""
68
+ return self._dataset.source_type
69
+
70
+ @property
71
+ def create_time(self) -> Optional[str]:
72
+ """The time the dataset was created."""
73
+ return self._dataset.create_time
74
+
75
+ @property
76
+ def created_by(self) -> Optional[str]:
77
+ """The user who created the dataset."""
78
+ return self._dataset.created_by
79
+
80
+ @property
81
+ def last_update_time(self) -> Optional[str]:
82
+ """The time the dataset was last updated."""
83
+ return self._dataset.last_update_time
84
+
85
+ @property
86
+ def last_updated_by(self) -> Optional[str]:
87
+ """The user who last updated the dataset."""
88
+ return self._dataset.last_updated_by
89
+
90
+ def set_profile(self, profile: str) -> "EvaluationDataset":
91
+ """Set the profile of the dataset."""
92
+ dataset = self._dataset.set_profile(profile)
93
+ return EvaluationDataset(dataset)
94
+
95
+ def merge_records(
96
+ self,
97
+ records: Union[list[dict[str, Any]], "pd.DataFrame", "pyspark.sql.DataFrame"],
98
+ ) -> "EvaluationDataset":
99
+ """Merge records into the dataset."""
100
+ dataset = self._dataset.merge_records(records)
101
+ return EvaluationDataset(dataset)
102
+
103
+ def to_df(self) -> "pd.DataFrame":
104
+ """Convert the dataset to a pandas DataFrame."""
105
+ # Cache the dataframe view to avoid re-fetching the records many times
106
+ if self._df is None:
107
+ self._df = self._dataset.to_df()
108
+ return self._df
109
+
110
+ def to_evaluation_dataset(self, path=None, feature_names=None) -> LegacyEvaluationDataset:
111
+ """
112
+ Converts the dataset to the legacy EvaluationDataset for model evaluation. Required
113
+ for use with mlflow.evaluate().
114
+ """
115
+ return LegacyEvaluationDataset(
116
+ data=self.to_df(),
117
+ path=path,
118
+ feature_names=feature_names,
119
+ name=self.name,
120
+ digest=self.digest,
121
+ )
122
+
123
+ def _to_mlflow_entity(self) -> DatasetEntity:
124
+ return DatasetEntity(
125
+ name=self.name,
126
+ digest=self.digest,
127
+ source_type=self.source_type,
128
+ source=self.source.to_json(),
129
+ schema=self.schema,
130
+ profile=self.profile,
131
+ )
@@ -0,0 +1,3 @@
1
+ from mlflow.genai.evaluation.base import evaluate, to_predict_fn
2
+
3
+ __all__ = ["evaluate", "to_predict_fn"]
@@ -0,0 +1,411 @@
1
+ import logging
2
+ import time
3
+ import warnings
4
+ from typing import TYPE_CHECKING, Any, Callable, Optional
5
+
6
+ import mlflow
7
+ from mlflow.exceptions import MlflowException
8
+ from mlflow.genai.datasets import EvaluationDataset
9
+ from mlflow.genai.evaluation.utils import (
10
+ _convert_scorer_to_legacy_metric,
11
+ _convert_to_legacy_eval_set,
12
+ )
13
+ from mlflow.genai.scorers import Scorer
14
+ from mlflow.genai.scorers.builtin_scorers import GENAI_CONFIG_NAME, BuiltInScorer
15
+ from mlflow.genai.scorers.validation import valid_data_for_builtin_scorers, validate_scorers
16
+ from mlflow.genai.utils.trace_utils import (
17
+ clean_up_extra_traces,
18
+ convert_predict_fn,
19
+ )
20
+ from mlflow.models.evaluation.base import (
21
+ EvaluationResult,
22
+ _is_model_deployment_endpoint_uri,
23
+ )
24
+ from mlflow.tracing.constant import (
25
+ DATABRICKS_OPTIONS_KEY,
26
+ DATABRICKS_OUTPUT_KEY,
27
+ RETURN_TRACE_OPTION_KEY,
28
+ )
29
+ from mlflow.tracing.utils.copy import copy_trace_to_experiment
30
+ from mlflow.utils.annotations import experimental
31
+ from mlflow.utils.uri import is_databricks_uri
32
+
33
+ if TYPE_CHECKING:
34
+ from genai.evaluation.utils import EvaluationDatasetTypes
35
+
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+ @experimental(version="3.0.0")
41
+ def evaluate(
42
+ data: "EvaluationDatasetTypes",
43
+ scorers: list[Scorer],
44
+ predict_fn: Optional[Callable[..., Any]] = None,
45
+ model_id: Optional[str] = None,
46
+ ) -> EvaluationResult:
47
+ """
48
+ Evaluate the performance of a generative AI model/application using specified
49
+ data and scorers.
50
+
51
+ This function allows you to evaluate a model's performance on a given dataset
52
+ using various scoring criteria. It supports both built-in scorers provided by
53
+ MLflow and custom scorers. The evaluation results include metrics and detailed
54
+ per-row assessments.
55
+
56
+ There are three different ways to use this function:
57
+
58
+ **1. Use Traces to evaluate the model/application.**
59
+
60
+ The `data` parameter takes a DataFrame with `trace` column, which contains a
61
+ single trace object corresponding to the prediction for the row. This dataframe
62
+ is easily obtained from the existing traces stored in MLflow, by using the
63
+ :py:func:`mlflow.search_traces` function.
64
+
65
+ .. code-block:: python
66
+
67
+ import mlflow
68
+ from mlflow.genai.scorers import Correctness, Safety
69
+ import pandas as pd
70
+
71
+ trace_df = mlflow.search_traces(model_id="<my-model-id>")
72
+
73
+ mlflow.genai.evaluate(
74
+ data=trace_df,
75
+ scorers=[Correctness(), Safety()],
76
+ )
77
+
78
+ Built-in scorers will understand the model inputs, outputs, and other intermediate
79
+ information e.g. retrieved context, from the trace object. You can also access to
80
+ the trace object from the custom scorer function by using the `trace` parameter.
81
+
82
+ .. code-block:: python
83
+
84
+ from mlflow.genai.scorers import scorer
85
+
86
+
87
+ @scorer
88
+ def faster_than_one_second(inputs, outputs, trace):
89
+ return trace.info.execution_duration < 1000
90
+
91
+ **2. Use DataFrame or dictionary with "inputs", "outputs", "expectations" columns.**
92
+
93
+ Alternatively, you can pass inputs, outputs, and expectations (ground truth) as
94
+ a column in the dataframe (or equivalent list of dictionaries).
95
+
96
+ .. code-block:: python
97
+
98
+ import mlflow
99
+ from mlflow.genai.scorers import Correctness
100
+ import pandas as pd
101
+
102
+ data = pd.DataFrame(
103
+ [
104
+ {
105
+ "inputs": {"question": "What is MLflow?"},
106
+ "outputs": "MLflow is an ML platform",
107
+ "expectations": "MLflow is an ML platform",
108
+ },
109
+ {
110
+ "inputs": {"question": "What is Spark?"},
111
+ "outputs": "I don't know",
112
+ "expectations": "Spark is a data engine",
113
+ },
114
+ ]
115
+ )
116
+
117
+ mlflow.genai.evaluate(
118
+ data=data,
119
+ scorers=[Correctness()],
120
+ )
121
+
122
+ **3. Pass `predict_fn` and input samples (and optionally expectations).**
123
+
124
+ If you want to generate the outputs and traces on-the-fly from your input samples,
125
+ you can pass a callable to the `predict_fn` parameter. In this case, MLflow will
126
+ pass the inputs to the `predict_fn` as keyword arguments. Therefore, the "inputs"
127
+ column must be a dictionary with the parameter names as keys.
128
+
129
+ .. code-block:: python
130
+
131
+ import mlflow
132
+ from mlflow.genai.scorers import Correctness, Safety
133
+ import openai
134
+
135
+ # Create a dataframe with input samples
136
+ data = pd.DataFrame(
137
+ [
138
+ {"inputs": {"question": "What is MLflow?"}},
139
+ {"inputs": {"question": "What is Spark?"}},
140
+ ]
141
+ )
142
+
143
+
144
+ # Define a predict function to evaluate. The "inputs" column will be
145
+ # passed to the prediction function as keyword arguments.
146
+ def predict_fn(question: str) -> str:
147
+ response = openai.OpenAI().chat.completions.create(
148
+ model="gpt-4o-mini",
149
+ messages=[{"role": "user", "content": question}],
150
+ )
151
+ return response.choices[0].message.content
152
+
153
+
154
+ mlflow.genai.evaluate(
155
+ data=data,
156
+ predict_fn=predict_fn,
157
+ scorers=[Correctness(), Safety()],
158
+ )
159
+
160
+ Args:
161
+ data: Dataset for the evaluation. Must be one of the following formats:
162
+
163
+ * An EvaluationDataset entity
164
+ * Pandas DataFrame
165
+ * Spark DataFrame
166
+ * List of dictionaries
167
+
168
+ The dataset must include either of the following columns:
169
+
170
+ 1. `trace` column that contains a single trace object corresponding
171
+ to the prediction for the row.
172
+
173
+ If this column is present, MLflow extracts inputs, outputs, assessments,
174
+ and other intermediate information e.g. retrieved context, from the trace
175
+ object and uses them for scoring. When this column is present, the
176
+ `predict_fn` parameter must not be provided.
177
+
178
+ 2. `inputs`, `outputs`, `expectations` columns.
179
+
180
+ Alternatively, you can pass inputs, outputs, and expectations(ground
181
+ truth) as a column in the dataframe (or equivalent list of dictionaries).
182
+
183
+ - inputs (required): Column containing inputs for evaluation. The value
184
+ must be a dictionary. When `predict_fn` is provided, MLflow will pass
185
+ the inputs to the `predict_fn` as keyword arguments. For example,
186
+
187
+ * predict_fn: `def predict_fn(question: str, context: str) -> str`
188
+ * inputs: `{"question": "What is MLflow?", "context": "MLflow is an ML platform"}`
189
+ * `predict_fn` will receive "What is MLflow?" as the first argument
190
+ (`question`) and "MLflow is an ML platform" as the second argument (`context`)
191
+
192
+ - outputs (optional): Column containing model or app outputs.
193
+ If this column is present, `predict_fn` must not be provided.
194
+
195
+ - expectations (optional): Column containing a dictionary of ground truths.
196
+
197
+ For list of dictionaries, each dict should follow the above schema.
198
+
199
+ scorers: A list of Scorer objects that produces evaluation scores from
200
+ inputs, outputs, and other additional contexts. MLflow provides pre-defined
201
+ scorers, but you can also define custom ones.
202
+
203
+ predict_fn: The target function to be evaluated. The specified function will be
204
+ executed for each row in the input dataset, and outputs will be used for
205
+ scoring.
206
+
207
+ The function must emit a single trace per call. If it doesn't, decorate
208
+ the function with @mlflow.trace decorator to ensure a trace to be emitted.
209
+
210
+ model_id: Optional model identifier (e.g. "models:/my-model/1") to associate with
211
+ the evaluation results. Can be also set globally via the
212
+ :py:func:`mlflow.set_active_model` function.
213
+
214
+ Returns:
215
+ An :py:class:`mlflow.models.EvaluationResult~` object.
216
+
217
+ Note:
218
+ This function is only supported on Databricks. The tracking URI must be
219
+ set to Databricks.
220
+
221
+ .. warning::
222
+
223
+ This function is not thread-safe. Please do not use it in multi-threaded
224
+ environments.
225
+ """
226
+ try:
227
+ import databricks.agents # noqa: F401
228
+ except ImportError:
229
+ raise ImportError(
230
+ "The `databricks-agents` package is required to use mlflow.genai.evaluate() "
231
+ "Please install it with `pip install databricks-agents`."
232
+ )
233
+
234
+ if not is_databricks_uri(mlflow.get_tracking_uri()):
235
+ raise ValueError(
236
+ "The genai evaluation function is only supported on Databricks. "
237
+ "Please set the tracking URI to Databricks."
238
+ )
239
+
240
+ is_managed_dataset = isinstance(data, EvaluationDataset)
241
+
242
+ scorers = validate_scorers(scorers)
243
+ # convert into a pandas dataframe with current evaluation set schema
244
+ df = data.to_df() if is_managed_dataset else _convert_to_legacy_eval_set(data)
245
+
246
+ builtin_scorers = [scorer for scorer in scorers if isinstance(scorer, BuiltInScorer)]
247
+ valid_data_for_builtin_scorers(df, builtin_scorers, predict_fn)
248
+
249
+ # "request" column must exist after conversion
250
+ input_key = "inputs" if is_managed_dataset else "request"
251
+ sample_input = df.iloc[0][input_key]
252
+
253
+ # Only check 'inputs' column when it is not derived from the trace object
254
+ if "trace" not in df.columns and not isinstance(sample_input, dict):
255
+ raise MlflowException.invalid_parameter_value(
256
+ "The 'inputs' column must be a dictionary of field names and values. "
257
+ "For example: {'query': 'What is MLflow?'}"
258
+ )
259
+
260
+ if predict_fn:
261
+ predict_fn = convert_predict_fn(predict_fn=predict_fn, sample_input=sample_input)
262
+
263
+ with warnings.catch_warnings():
264
+ warnings.filterwarnings(
265
+ "ignore",
266
+ message=r"Hint: Inferred schema contains integer column\(s\).*",
267
+ category=UserWarning,
268
+ )
269
+ # Suppress numpy warning about ragged nested sequences. This is raised when passing
270
+ # a dataset that contains complex object to mlflow.evaluate(). MLflow converts data
271
+ # into numpy array to compute dataset digest, which triggers the warning.
272
+ warnings.filterwarnings(
273
+ "ignore",
274
+ message=r"Creating an ndarray from ragged nested sequences",
275
+ module="mlflow.data.evaluation_dataset",
276
+ )
277
+
278
+ eval_start_time = int(time.time() * 1000)
279
+ result = mlflow.models.evaluate(
280
+ model=predict_fn,
281
+ # If the input dataset is a managed dataset, we pass the original dataset
282
+ # to the evaluate function to preserve metadata like dataset name.
283
+ data=data if is_managed_dataset else df,
284
+ evaluator_config={GENAI_CONFIG_NAME: {"metrics": []}}, # Turn off the default metrics
285
+ # Scorers are passed to the eval harness as extra metrics
286
+ extra_metrics=[_convert_scorer_to_legacy_metric(_scorer) for _scorer in scorers],
287
+ model_type=GENAI_CONFIG_NAME,
288
+ model_id=model_id,
289
+ _called_from_genai_evaluate=True,
290
+ )
291
+
292
+ # Clean up noisy traces generated during evaluation
293
+ clean_up_extra_traces(result.run_id, eval_start_time)
294
+ return result
295
+
296
+
297
+ @experimental(version="3.0.0")
298
+ def to_predict_fn(endpoint_uri: str) -> Callable[..., Any]:
299
+ """
300
+ Convert an endpoint URI to a predict function.
301
+
302
+ Args:
303
+ endpoint_uri: The endpoint URI to convert.
304
+
305
+ Returns:
306
+ A predict function that can be used to make predictions.
307
+
308
+ Example:
309
+
310
+ The following example assumes that the model serving endpoint accepts a JSON
311
+ object with a `messages` key. Please adjust the input based on the actual
312
+ schema of the model serving endpoint.
313
+
314
+ .. code-block:: python
315
+
316
+ from mlflow.genai.scorers import get_all_scorers
317
+
318
+ data = [
319
+ {
320
+ "inputs": {
321
+ "messages": [
322
+ {"role": "system", "content": "You are a helpful assistant."},
323
+ {"role": "user", "content": "What is MLflow?"},
324
+ ]
325
+ }
326
+ },
327
+ {
328
+ "inputs": {
329
+ "messages": [
330
+ {"role": "system", "content": "You are a helpful assistant."},
331
+ {"role": "user", "content": "What is Spark?"},
332
+ ]
333
+ }
334
+ },
335
+ ]
336
+ predict_fn = mlflow.genai.to_predict_fn("endpoints:/chat")
337
+ mlflow.genai.evaluate(
338
+ data=data,
339
+ predict_fn=predict_fn,
340
+ scorers=get_all_scorers(),
341
+ )
342
+
343
+ You can also directly invoke the function to validate if the endpoint works
344
+ properly with your input schema.
345
+
346
+ .. code-block:: python
347
+
348
+ predict_fn(**data[0]["inputs"])
349
+ """
350
+ if not _is_model_deployment_endpoint_uri(endpoint_uri):
351
+ raise ValueError(
352
+ f"Invalid endpoint URI: {endpoint_uri}. The endpoint URI must be a valid model "
353
+ f"deployment endpoint URI."
354
+ )
355
+
356
+ from mlflow.deployments import get_deploy_client
357
+ from mlflow.metrics.genai.model_utils import _parse_model_uri
358
+
359
+ client = get_deploy_client("databricks")
360
+ _, endpoint = _parse_model_uri(endpoint_uri)
361
+ endpoint_info = client.get_endpoint(endpoint)
362
+
363
+ # Databricks Foundation Model API does not allow passing "databricks_options" in the payload,
364
+ # so we need to handle this case separately.
365
+ is_fmapi = False
366
+ if isinstance(endpoint_info, dict):
367
+ is_fmapi = endpoint_info.get("endpoint_type") == "FOUNDATION_MODEL_API"
368
+
369
+ # NB: Wrap the function to show better docstring and change signature to `model_inputs`
370
+ # to unnamed keyword arguments. This is necessary because we pass input samples as
371
+ # keyword arguments to the predict function.
372
+ def predict_fn(**kwargs):
373
+ start_time_ms = int(time.time_ns() / 1e6)
374
+ # Inject `{"databricks_options": {"return_trace": True}}` to the input payload
375
+ # to return the trace in the response.
376
+ databricks_options = {DATABRICKS_OPTIONS_KEY: {RETURN_TRACE_OPTION_KEY: True}}
377
+ payload = kwargs if is_fmapi else {**kwargs, **databricks_options}
378
+ result = client.predict(endpoint=endpoint, inputs=payload)
379
+ end_time_ms = int(time.time_ns() / 1e6)
380
+
381
+ # If the endpoint returns a trace, copy it to the current experiment.
382
+ if trace_dict := result.pop(DATABRICKS_OUTPUT_KEY, {}).get("trace"):
383
+ try:
384
+ copy_trace_to_experiment(trace_dict)
385
+ return result
386
+ except Exception:
387
+ logger.debug(
388
+ "Failed to copy trace from the endpoint response to the current experiment. "
389
+ "Trace will only have a root span with request and response.",
390
+ exc_info=True,
391
+ )
392
+
393
+ # If the endpoint doesn't return a trace, manually create a trace with request/response.
394
+ mlflow.log_trace(
395
+ name="predict",
396
+ request=kwargs,
397
+ response=result,
398
+ start_time_ms=start_time_ms,
399
+ execution_time_ms=end_time_ms - start_time_ms,
400
+ )
401
+ return result
402
+
403
+ predict_fn.__doc__ = f"""
404
+ A wrapper function for invoking the model serving endpoint `{endpoint_uri}`.
405
+
406
+ Args:
407
+ **kwargs: The input samples to be passed to the model serving endpoint.
408
+ For example, if the endpoint accepts a JSON object with a `messages` key,
409
+ the function also expects to get `messages` as an argument.
410
+ """
411
+ return predict_fn
@@ -0,0 +1,23 @@
1
+ class AgentEvaluationReserverKey:
2
+ """
3
+ Expectation column names that are used by Agent Evaluation.
4
+ Ref: https://docs.databricks.com/aws/en/generative-ai/agent-evaluation/evaluation-schema
5
+ """
6
+
7
+ EXPECTED_RESPONSE = "expected_response"
8
+ EXPECTED_RETRIEVED_CONTEXT = "expected_retrieved_context"
9
+ EXPECTED_FACTS = "expected_facts"
10
+ GUIDELINES = "guidelines"
11
+
12
+ @classmethod
13
+ def get_all(cls) -> set[str]:
14
+ return {
15
+ cls.EXPECTED_RESPONSE,
16
+ cls.EXPECTED_RETRIEVED_CONTEXT,
17
+ cls.EXPECTED_FACTS,
18
+ cls.GUIDELINES,
19
+ }
20
+
21
+
22
+ # A column name for storing custom expectations dictionary in Agent Evaluation.
23
+ AGENT_EVAL_CUSTOM_EXPECTATION_KEY = "custom_expected"