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,244 @@
1
+ import json
2
+ import logging
3
+ from typing import TYPE_CHECKING, Any, Optional, Union
4
+
5
+ from mlflow.entities import Assessment, Trace
6
+ from mlflow.exceptions import MlflowException
7
+ from mlflow.genai.evaluation.constant import (
8
+ AgentEvaluationReserverKey,
9
+ )
10
+ from mlflow.genai.scorers import Scorer
11
+ from mlflow.models import EvaluationMetric
12
+
13
+ try:
14
+ # `pandas` is not required for `mlflow-skinny`.
15
+ import pandas as pd
16
+ except ImportError:
17
+ pass
18
+
19
+ if TYPE_CHECKING:
20
+ from mlflow.genai.datasets import EvaluationDataset
21
+
22
+ try:
23
+ import pyspark.sql.dataframe
24
+
25
+ EvaluationDatasetTypes = Union[
26
+ pd.DataFrame, pyspark.sql.dataframe.DataFrame, list[dict], EvaluationDataset
27
+ ]
28
+ except ImportError:
29
+ EvaluationDatasetTypes = Union[pd.DataFrame, list[dict], EvaluationDataset]
30
+
31
+
32
+ _logger = logging.getLogger(__name__)
33
+
34
+
35
+ def _convert_eval_set_to_df(data: "EvaluationDatasetTypes") -> "pd.DataFrame":
36
+ """
37
+ Takes in a dataset in the format that `mlflow.genai.evaluate()` expects and
38
+ converts it into a pandas DataFrame.
39
+ """
40
+ if isinstance(data, list):
41
+ # validate that every item in the list is a dict and has inputs as key
42
+ for item in data:
43
+ if not isinstance(item, dict):
44
+ raise MlflowException.invalid_parameter_value(
45
+ "Every item in the list must be a dictionary."
46
+ )
47
+ df = pd.DataFrame(data)
48
+ elif isinstance(data, pd.DataFrame):
49
+ # Data is already a pd DataFrame, just copy it
50
+ df = data.copy()
51
+ else:
52
+ try:
53
+ from mlflow.utils.spark_utils import get_spark_dataframe_type
54
+
55
+ if isinstance(data, get_spark_dataframe_type()):
56
+ df = _deserialize_inputs_and_expectations_column(data.toPandas())
57
+ else:
58
+ raise MlflowException.invalid_parameter_value(
59
+ "Invalid type for parameter `data`. Expected a list of dictionaries, "
60
+ f"a pandas DataFrame, or a Spark DataFrame. Got: {type(data)}"
61
+ )
62
+ except ImportError:
63
+ raise ImportError(
64
+ "The `pyspark` package is required to use mlflow.genai.evaluate() "
65
+ "Please install it with `pip install pyspark`."
66
+ )
67
+
68
+ if len(df) == 0:
69
+ raise MlflowException.invalid_parameter_value(
70
+ "The dataset is empty. Please provide a non-empty dataset."
71
+ )
72
+
73
+ if not any(col in df.columns for col in ("trace", "inputs")):
74
+ raise MlflowException.invalid_parameter_value(
75
+ "Either `inputs` or `trace` column is required in the dataset. Please provide inputs "
76
+ "for every datapoint or provide a trace."
77
+ )
78
+
79
+ return df
80
+
81
+
82
+ def _convert_to_legacy_eval_set(data: "EvaluationDatasetTypes") -> "pd.DataFrame":
83
+ """
84
+ Takes in a dataset in the format that mlflow.genai.evaluate() expects and converts it into
85
+ to the current eval-set schema that Agent Evaluation takes in. The transformed schema should
86
+ be accepted by mlflow.evaluate().
87
+ The expected schema can be found at:
88
+ https://docs.databricks.com/aws/en/generative-ai/agent-evaluation/evaluation-schema
89
+
90
+ NB: The harness secretly support 'expectations' column as well. It accepts a dictionary of
91
+ expectations, which is same as the schema that mlflow.genai.evaluate() expects.
92
+ Therefore, we can simply pass through expectations column.
93
+ """
94
+ column_mapping = {
95
+ "inputs": "request",
96
+ "outputs": "response",
97
+ }
98
+
99
+ df = _convert_eval_set_to_df(data)
100
+
101
+ return (
102
+ df.rename(columns=column_mapping)
103
+ .pipe(_deserialize_trace_column_if_needed)
104
+ .pipe(_extract_request_from_trace)
105
+ .pipe(_extract_expectations_from_trace)
106
+ )
107
+
108
+
109
+ def _deserialize_inputs_and_expectations_column(df: "pd.DataFrame") -> "pd.DataFrame":
110
+ """
111
+ Deserialize the `inputs` and `expectations` string columns from the dataframe.
112
+
113
+ When managed datasets are read as Spark DataFrames, the `inputs` and `expectations` columns
114
+ are loaded as string columns of JSON strings. This function deserializes these columns into
115
+ dictionaries expected by mlflow.genai.evaluate().
116
+ """
117
+ target_columns = ["inputs", "expectations"]
118
+ for col in target_columns:
119
+ if col not in df.columns or not isinstance(df[col][0], str):
120
+ continue
121
+
122
+ try:
123
+ df[col] = df[col].apply(json.loads)
124
+ except json.JSONDecodeError as e:
125
+ if col == "inputs":
126
+ msg = (
127
+ "The `inputs` column must be a valid JSON string of field names and values. "
128
+ "For example, `{'question': 'What is the capital of France?'}`"
129
+ )
130
+ else:
131
+ msg = (
132
+ "The `expectations` column must be a valid JSON string of assessment names and "
133
+ "values. For example, `{'expected_facts': ['fact1', 'fact2']}`"
134
+ )
135
+ raise MlflowException.invalid_parameter_value(
136
+ f"Failed to parse `{col}` column. Error: {e}\nHint: {msg}"
137
+ )
138
+
139
+ return df
140
+
141
+
142
+ def _deserialize_trace_column_if_needed(df: "pd.DataFrame") -> "pd.DataFrame":
143
+ """
144
+ Deserialize the `trace` column from the dataframe if it is a string.
145
+
146
+ Since MLflow 3.2.0, mlflow.search_traces() returns a pandas DataFrame with a `trace`
147
+ column that is a trace json representation rather than the Trace object itself. This
148
+ function deserializes the `trace` column into a Trace object.
149
+ """
150
+ if "trace" in df.columns:
151
+ df["trace"] = df["trace"].apply(lambda t: Trace.from_json(t) if isinstance(t, str) else t)
152
+ return df
153
+
154
+
155
+ def _extract_request_from_trace(df: "pd.DataFrame") -> "pd.DataFrame":
156
+ """
157
+ Add `request` columns to the dataframe if it is not already present.
158
+ This is for compatibility with mlflow.evaluate() that requires `request` column.
159
+ """
160
+ if "trace" not in df.columns:
161
+ return df
162
+
163
+ if "request" not in df.columns:
164
+ df["request"] = df["trace"].apply(lambda trace: json.loads(trace.data.request))
165
+ return df
166
+
167
+
168
+ def _extract_expectations_from_trace(df: "pd.DataFrame") -> "pd.DataFrame":
169
+ """
170
+ Add `expectations` columns to the dataframe from assessments
171
+ stored in the traces, if the "expectations" column is not already present.
172
+ """
173
+ if "trace" not in df.columns:
174
+ return df
175
+
176
+ expectations_column = []
177
+ for trace in df["trace"]:
178
+ expectations = {}
179
+ for assessment in trace.info.assessments or []:
180
+ if assessment.expectation is not None:
181
+ expectations[assessment.name] = assessment.expectation.value
182
+ expectations_column.append(expectations)
183
+ # If no trace has assessments, not add the column
184
+ if all(len(expectations) == 0 for expectations in expectations_column):
185
+ return df
186
+
187
+ df["expectations"] = expectations_column
188
+ return df
189
+
190
+
191
+ def _convert_scorer_to_legacy_metric(scorer: Scorer) -> EvaluationMetric:
192
+ """
193
+ Takes in a Scorer object and converts it into a legacy MLflow 2.x
194
+ Metric object.
195
+ """
196
+ try:
197
+ from databricks.agents.evals import metric
198
+ except ImportError:
199
+ raise ImportError(
200
+ "The `databricks-agents` package is required to use mlflow.genai.evaluate() "
201
+ "Please install it with `pip install databricks-agents`."
202
+ )
203
+
204
+ from mlflow.types.llm import ChatCompletionRequest
205
+
206
+ def eval_fn(
207
+ request_id: str,
208
+ request: Union[ChatCompletionRequest, str],
209
+ response: Optional[Any],
210
+ expected_response: Optional[Any],
211
+ trace: Optional[Trace],
212
+ guidelines: Optional[Union[list[str], dict[str, list[str]]]],
213
+ expected_facts: Optional[list[str]],
214
+ expected_retrieved_context: Optional[list[dict[str, str]]],
215
+ custom_expected: Optional[dict[str, Any]],
216
+ **kwargs,
217
+ ) -> Union[int, float, bool, str, Assessment, list[Assessment]]:
218
+ # Condense all expectations into a single dict
219
+ expectations = {}
220
+ if expected_response is not None:
221
+ expectations[AgentEvaluationReserverKey.EXPECTED_RESPONSE] = expected_response
222
+ if expected_facts is not None:
223
+ expectations[AgentEvaluationReserverKey.EXPECTED_FACTS] = expected_facts
224
+ if expected_retrieved_context is not None:
225
+ expectations[AgentEvaluationReserverKey.EXPECTED_RETRIEVED_CONTEXT] = (
226
+ expected_retrieved_context
227
+ )
228
+ if guidelines is not None:
229
+ expectations[AgentEvaluationReserverKey.GUIDELINES] = guidelines
230
+ if custom_expected is not None:
231
+ expectations.update(custom_expected)
232
+
233
+ merged = {
234
+ "inputs": request,
235
+ "outputs": response,
236
+ "expectations": expectations,
237
+ "trace": trace,
238
+ }
239
+ return scorer.run(**merged)
240
+
241
+ return metric(
242
+ eval_fn=eval_fn,
243
+ name=scorer.name,
244
+ )
@@ -0,0 +1,21 @@
1
+ from mlflow.genai.judges.databricks import (
2
+ CategoricalRating,
3
+ custom_prompt_judge,
4
+ is_context_relevant,
5
+ is_context_sufficient,
6
+ is_correct,
7
+ is_grounded,
8
+ is_safe,
9
+ meets_guidelines,
10
+ )
11
+
12
+ __all__ = [
13
+ "CategoricalRating",
14
+ "is_grounded",
15
+ "is_safe",
16
+ "is_correct",
17
+ "is_context_relevant",
18
+ "is_context_sufficient",
19
+ "meets_guidelines",
20
+ "custom_prompt_judge",
21
+ ]
@@ -0,0 +1,404 @@
1
+ from functools import wraps
2
+ from typing import Any, Callable, Optional, Union
3
+
4
+ from mlflow.entities.assessment import Feedback
5
+ from mlflow.genai.utils.enum_utils import StrEnum
6
+ from mlflow.utils.annotations import experimental
7
+
8
+ # NB: User-facing name for the is_context_relevant assessment.
9
+ _IS_CONTEXT_RELEVANT_ASSESSMENT_NAME = "relevance_to_context"
10
+
11
+
12
+ class CategoricalRating(StrEnum):
13
+ """
14
+ A categorical rating for an assessment.
15
+
16
+ Example:
17
+ .. code-block:: python
18
+
19
+ from mlflow.genai.judges import CategoricalRating
20
+ from mlflow.entities import Feedback
21
+
22
+ # Create feedback with categorical rating
23
+ feedback = Feedback(
24
+ name="my_metric", value=CategoricalRating.YES, rationale="The metric is passing."
25
+ )
26
+ """
27
+
28
+ YES = "yes"
29
+ NO = "no"
30
+ UNKNOWN = "unknown"
31
+
32
+ @classmethod
33
+ def _missing_(cls, value: str):
34
+ value = value.lower()
35
+ for member in cls:
36
+ if member == value:
37
+ return member
38
+ return cls.UNKNOWN
39
+
40
+
41
+ def _sanitize_feedback(feedback: Feedback) -> Feedback:
42
+ """Sanitize the feedback object from the databricks judges.
43
+
44
+ The judge returns a CategoricalRating class defined in the databricks-agents package.
45
+ This function converts it to our CategoricalRating definition above.
46
+
47
+ Args:
48
+ feedback: The Feedback object to convert.
49
+
50
+ Returns:
51
+ A new Feedback object with our CategoricalRating.
52
+ """
53
+ feedback.value = CategoricalRating(feedback.value) if feedback.value else feedback.value
54
+ return feedback
55
+
56
+
57
+ def requires_databricks_agents(func):
58
+ """Decorator to check if the `databricks-agents` package is installed."""
59
+
60
+ @wraps(func)
61
+ def wrapper(*args, **kwargs):
62
+ try:
63
+ import databricks.agents.evals.judges # noqa: F401
64
+
65
+ except ImportError:
66
+ raise ImportError(
67
+ f"The `databricks-agents` package is required to use "
68
+ f"`mlflow.genai.judges.{func.__name__}`. "
69
+ "Please install it with `pip install databricks-agents`."
70
+ )
71
+
72
+ return func(*args, **kwargs)
73
+
74
+ return wrapper
75
+
76
+
77
+ @requires_databricks_agents
78
+ def is_context_relevant(*, request: str, context: Any, name: Optional[str] = None) -> Feedback:
79
+ """
80
+ LLM judge determines whether the given context is relevant to the input request.
81
+
82
+ Args:
83
+ request: Input to the application to evaluate, user's question or query.
84
+ context: Context to evaluate the relevance to the request.
85
+ Supports any JSON-serializable object.
86
+ name: Optional name for overriding the default name of the returned feedback.
87
+
88
+ Returns:
89
+ A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no" value
90
+ indicating whether the context is relevant to the request.
91
+
92
+ Example:
93
+
94
+ The following example shows how to evaluate whether a document retrieved by a
95
+ retriever is relevant to the user's question.
96
+
97
+ .. code-block:: python
98
+
99
+ from mlflow.genai.judges import is_context_relevant
100
+
101
+ feedback = is_context_relevant(
102
+ request="What is the capital of France?",
103
+ context="Paris is the capital of France.",
104
+ )
105
+ print(feedback.value) # "yes"
106
+
107
+ feedback = is_context_relevant(
108
+ request="What is the capital of France?",
109
+ context="Paris is known for its Eiffel Tower.",
110
+ )
111
+ print(feedback.value) # "no"
112
+
113
+ """
114
+ from databricks.agents.evals.judges import relevance_to_query
115
+
116
+ return _sanitize_feedback(
117
+ relevance_to_query(
118
+ request=request,
119
+ response=str(context),
120
+ # NB: User-facing name for the is_context_relevant assessment. This is required since
121
+ # the existing databricks judge is called `relevance_to_query`
122
+ assessment_name=name or _IS_CONTEXT_RELEVANT_ASSESSMENT_NAME,
123
+ )
124
+ )
125
+
126
+
127
+ @requires_databricks_agents
128
+ def is_context_sufficient(
129
+ *,
130
+ request: str,
131
+ context: Any,
132
+ expected_facts: list[str],
133
+ expected_response: Optional[str] = None,
134
+ name: Optional[str] = None,
135
+ ) -> Feedback:
136
+ """
137
+ LLM judge determines whether the given context is sufficient to answer the input request.
138
+
139
+ Args:
140
+ request: Input to the application to evaluate, user's question or query.
141
+ context: Context to evaluate the sufficiency of. Supports any JSON-serializable object.
142
+ expected_facts: A list of expected facts that should be present in the context.
143
+ expected_response: The expected response from the application. Optional.
144
+ name: Optional name for overriding the default name of the returned feedback.
145
+
146
+ Returns:
147
+ A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
148
+ value indicating whether the context is sufficient to answer the request.
149
+
150
+ Example:
151
+
152
+ The following example shows how to evaluate whether the documents returned by a
153
+ retriever gives sufficient context to answer the user's question.
154
+
155
+ .. code-block:: python
156
+
157
+ from mlflow.genai.judges import is_context_sufficient
158
+
159
+ feedback = is_context_sufficient(
160
+ request="What is the capital of France?",
161
+ context=[
162
+ {"content": "Paris is the capital of France."},
163
+ {"content": "Paris is known for its Eiffel Tower."},
164
+ ],
165
+ expected_facts=["Paris is the capital of France."],
166
+ )
167
+ print(feedback.value) # "yes"
168
+ """
169
+ from databricks.agents.evals.judges import context_sufficiency
170
+
171
+ return _sanitize_feedback(
172
+ context_sufficiency(
173
+ request=request,
174
+ retrieved_context=context,
175
+ expected_facts=expected_facts,
176
+ expected_response=expected_response,
177
+ assessment_name=name,
178
+ )
179
+ )
180
+
181
+
182
+ @requires_databricks_agents
183
+ def is_correct(
184
+ *,
185
+ request: str,
186
+ response: str,
187
+ expected_facts: list[str],
188
+ expected_response: Optional[str] = None,
189
+ name: Optional[str] = None,
190
+ ) -> Feedback:
191
+ """
192
+ LLM judge determines whether the given response is correct for the input request.
193
+
194
+ Args:
195
+ request: Input to the application to evaluate, user's question or query.
196
+ response: The response from the application to evaluate.
197
+ expected_facts: A list of expected facts that should be present in the response.
198
+ expected_response: The expected response from the application. Optional.
199
+ name: Optional name for overriding the default name of the returned feedback.
200
+
201
+ Returns:
202
+ A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
203
+ value indicating whether the response is correct for the request.
204
+ """
205
+ from databricks.agents.evals.judges import correctness
206
+
207
+ return _sanitize_feedback(
208
+ correctness(
209
+ request=request,
210
+ response=response,
211
+ expected_facts=expected_facts,
212
+ expected_response=expected_response,
213
+ assessment_name=name,
214
+ )
215
+ )
216
+
217
+
218
+ @requires_databricks_agents
219
+ def is_grounded(
220
+ *, request: str, response: str, context: Any, name: Optional[str] = None
221
+ ) -> Feedback:
222
+ """
223
+ LLM judge determines whether the given response is grounded in the given context.
224
+
225
+ Args:
226
+ request: Input to the application to evaluate, user's question or query.
227
+ response: The response from the application to evaluate.
228
+ context: Context to evaluate the response against. Supports any JSON-serializable object.
229
+ name: Optional name for overriding the default name of the returned feedback.
230
+
231
+ Returns:
232
+ A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
233
+ value indicating whether the response is grounded in the context.
234
+
235
+ Example:
236
+
237
+ The following example shows how to evaluate whether the response is grounded in
238
+ the context.
239
+
240
+ .. code-block:: python
241
+
242
+ from mlflow.genai.judges import is_grounded
243
+
244
+ feedback = is_grounded(
245
+ request="What is the capital of France?",
246
+ response="Paris",
247
+ context=[
248
+ {"content": "Paris is the capital of France."},
249
+ {"content": "Paris is known for its Eiffel Tower."},
250
+ ],
251
+ )
252
+ print(feedback.value) # "yes"
253
+ """
254
+ from databricks.agents.evals.judges import groundedness
255
+
256
+ return _sanitize_feedback(
257
+ groundedness(
258
+ request=request,
259
+ response=response,
260
+ retrieved_context=context,
261
+ assessment_name=name,
262
+ )
263
+ )
264
+
265
+
266
+ @requires_databricks_agents
267
+ def is_safe(*, content: str, name: Optional[str] = None) -> Feedback:
268
+ """
269
+ LLM judge determines whether the given response is safe.
270
+
271
+ Args:
272
+ content: Text content to evaluate for safety.
273
+ name: Optional name for overriding the default name of the returned feedback.
274
+
275
+ Returns:
276
+ A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
277
+ value indicating whether the response is safe.
278
+
279
+ Example:
280
+
281
+ .. code-block:: python
282
+
283
+ from mlflow.genai.judges import is_safe
284
+
285
+ feedback = is_safe(content="I am a happy person.")
286
+ print(feedback.value) # "yes"
287
+ """
288
+ from databricks.agents.evals.judges import safety
289
+
290
+ return _sanitize_feedback(safety(response=content, assessment_name=name))
291
+
292
+
293
+ @requires_databricks_agents
294
+ def meets_guidelines(
295
+ *,
296
+ guidelines: Union[str, list[str]],
297
+ context: dict[str, Any],
298
+ name: Optional[str] = None,
299
+ ) -> Feedback:
300
+ """
301
+ LLM judge determines whether the given response meets the given guideline(s).
302
+
303
+ Args:
304
+ guidelines: A single guideline or a list of guidelines.
305
+ context: Mapping of context to be evaluated against the guidelines. For example,
306
+ pass {"response": "<response text>"} to evaluate whether the response meets
307
+ the given guidelines.
308
+ name: Optional name for overriding the default name of the returned feedback.
309
+
310
+ Returns:
311
+ A :py:class:`mlflow.entities.assessment.Feedback~` object with a "yes" or "no"
312
+ value indicating whether the response meets the guideline(s).
313
+
314
+ Example:
315
+
316
+ The following example shows how to evaluate whether the response meets the given
317
+ guideline(s).
318
+
319
+ .. code-block:: python
320
+
321
+ from mlflow.genai.judges import meets_guidelines
322
+
323
+ feedback = meets_guidelines(
324
+ guidelines="Be polite and respectful.",
325
+ context={"response": "Hello, how are you?"},
326
+ )
327
+ print(feedback.value) # "yes"
328
+
329
+ feedback = meets_guidelines(
330
+ guidelines=["Be polite and respectful.", "Must be in English."],
331
+ context={"response": "Hola, ¿cómo estás?"},
332
+ )
333
+ print(feedback.value) # "no"
334
+ """
335
+ from databricks.agents.evals.judges import guideline_adherence
336
+
337
+ # Ensure guidelines is a list, as the underlying databricks judge only accepts lists
338
+ if isinstance(guidelines, str):
339
+ guidelines = [guidelines]
340
+
341
+ return _sanitize_feedback(
342
+ guideline_adherence(
343
+ guidelines=guidelines,
344
+ guidelines_context=context,
345
+ assessment_name=name,
346
+ )
347
+ )
348
+
349
+
350
+ @experimental(version="3.0.0")
351
+ @requires_databricks_agents
352
+ def custom_prompt_judge(
353
+ *,
354
+ name: str,
355
+ prompt_template: str,
356
+ numeric_values: Optional[dict[str, Union[int, float]]] = None,
357
+ ) -> Callable[..., Feedback]:
358
+ """
359
+ Create a custom prompt judge that evaluates inputs using a template.
360
+
361
+ Example prompt template:
362
+
363
+ .. code-block::
364
+
365
+ You will look at the response and determine the formality of the response.
366
+
367
+ <request>{{request}}</request>
368
+ <response>{{response}}</response>
369
+
370
+ You must choose one of the following categories.
371
+
372
+ [[formal]]: The response is very formal.
373
+ [[semi_formal]]: The response is somewhat formal. The response is somewhat formal if the
374
+ response mentions friendship, etc.
375
+ [[not_formal]]: The response is not formal.
376
+
377
+ Variable names in the template should be enclosed in double curly
378
+ braces, e.g., `{{request}}`, `{{response}}`. They should be alphanumeric and can include
379
+ underscores, but should not contain spaces or special characters.
380
+
381
+ It is required for the prompt template to request choices as outputs, with each choice
382
+ enclosed in square brackets. Choice names should be alphanumeric and can include
383
+ underscores and spaces.
384
+
385
+ Args:
386
+ name: Name of the judge, used as the name of returned
387
+ :py:class`mlflow.entities.Feedback~` object.
388
+ prompt_template: Template string with {{var_name}} placeholders for variable substitution.
389
+ Should be prompted with choices as outputs.
390
+ numeric_values: Optional mapping from categorical values to numeric scores.
391
+ Useful if you want to create a custom judge that returns continuous valued outputs.
392
+ Defaults to None.
393
+
394
+ Returns:
395
+ A callable that takes keyword arguments mapping to the template variables
396
+ and returns an mlflow :py:class`mlflow.entities.Feedback~`.
397
+ """
398
+ from databricks.agents.evals.judges import custom_prompt_judge
399
+
400
+ return custom_prompt_judge(
401
+ name=name,
402
+ prompt_template=prompt_template,
403
+ numeric_values=numeric_values,
404
+ )