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,545 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import time
5
+ from dataclasses import dataclass
6
+ from typing import Any, Optional, Union
7
+
8
+ from google.protobuf.json_format import MessageToDict, ParseDict
9
+ from google.protobuf.struct_pb2 import Value
10
+
11
+ from mlflow.entities._mlflow_object import _MlflowObject
12
+ from mlflow.entities.assessment_error import AssessmentError
13
+ from mlflow.entities.assessment_source import AssessmentSource, AssessmentSourceType
14
+ from mlflow.exceptions import MlflowException
15
+ from mlflow.protos.assessments_pb2 import Assessment as ProtoAssessment
16
+ from mlflow.protos.assessments_pb2 import Expectation as ProtoExpectation
17
+ from mlflow.protos.assessments_pb2 import Feedback as ProtoFeedback
18
+ from mlflow.utils.annotations import experimental
19
+ from mlflow.utils.exception_utils import get_stacktrace
20
+ from mlflow.utils.proto_json_utils import proto_timestamp_to_milliseconds
21
+
22
+ # Feedback value should be one of the following types:
23
+ # - float
24
+ # - int
25
+ # - str
26
+ # - bool
27
+ # - list of values of the same types as above
28
+ # - dict with string keys and values of the same types as above
29
+ PbValueType = Union[float, int, str, bool]
30
+ FeedbackValueType = Union[PbValueType, dict[str, PbValueType], list[PbValueType]]
31
+
32
+
33
+ @experimental(version="2.21.0")
34
+ @dataclass
35
+ class Assessment(_MlflowObject):
36
+ """
37
+ Base class for assessments that can be attached to a trace.
38
+ An Assessment should be one of the following types:
39
+
40
+ - Expectations: A label that represents the expected value for a particular operation.
41
+ For example, an expected answer for a user question from a chatbot.
42
+ - Feedback: A label that represents the feedback on the quality of the operation.
43
+ Feedback can come from different sources, such as human judges, heuristic scorers,
44
+ or LLM-as-a-Judge.
45
+ """
46
+
47
+ name: str
48
+ source: AssessmentSource
49
+ # NB: The trace ID is optional because the assessment object itself may be created
50
+ # standalone. For example, a custom metric function returns an assessment object
51
+ # without a trace ID. That said, the trace ID is required when logging the
52
+ # assessment to a trace in the backend eventually.
53
+ # https://docs.databricks.com/aws/en/generative-ai/agent-evaluation/custom-metrics#-metric-decorator
54
+ trace_id: Optional[str] = None
55
+ rationale: Optional[str] = None
56
+ metadata: Optional[dict[str, str]] = None
57
+ span_id: Optional[str] = None
58
+ create_time_ms: Optional[int] = None
59
+ last_update_time_ms: Optional[int] = None
60
+ # NB: The assessment ID should always be generated in the backend. The CreateAssessment
61
+ # backend API asks for an incomplete Assessment object without an ID and returns a
62
+ # complete one with assessment_id, so the ID is Optional in the constructor here.
63
+ assessment_id: Optional[str] = None
64
+ # Deprecated, use `error` in Feedback instead. Just kept for backward compatibility
65
+ # and will be removed in the 3.0.0 release.
66
+ error: Optional[AssessmentError] = None
67
+ # Should only be used internally. To create an assessment with an expectation or feedback,
68
+ # use the`Expectation` or `Feedback` classes instead.
69
+ expectation: Optional[ExpectationValue] = None
70
+ feedback: Optional[FeedbackValue] = None
71
+ # The ID of the assessment which this assessment overrides.
72
+ overrides: Optional[str] = None
73
+ # Whether this assessment is valid (i.e. has not been overridden).
74
+ # This should not be set by the user, it is automatically set by the backend.
75
+ valid: Optional[bool] = None
76
+
77
+ def __post_init__(self):
78
+ if (self.expectation is not None) + (self.feedback is not None) != 1:
79
+ raise MlflowException.invalid_parameter_value(
80
+ "Exactly one of `expectation` or `feedback` should be specified.",
81
+ )
82
+
83
+ # Populate the error field to the feedback object
84
+ if self.error is not None:
85
+ if self.expectation is not None:
86
+ raise MlflowException.invalid_parameter_value(
87
+ "Cannot set `error` when `expectation` is specified.",
88
+ )
89
+ if self.feedback is None:
90
+ raise MlflowException.invalid_parameter_value(
91
+ "Cannot set `error` when `feedback` is not specified.",
92
+ )
93
+ self.feedback.error = self.error
94
+
95
+ # Set timestamp if not provided
96
+ current_time = int(time.time() * 1000) # milliseconds
97
+ if self.create_time_ms is None:
98
+ self.create_time_ms = current_time
99
+ if self.last_update_time_ms is None:
100
+ self.last_update_time_ms = current_time
101
+
102
+ if not isinstance(self.source, AssessmentSource):
103
+ raise MlflowException.invalid_parameter_value(
104
+ "`source` must be an instance of `AssessmentSource`. "
105
+ f"Got {type(self.source)} instead."
106
+ )
107
+
108
+ def to_proto(self):
109
+ assessment = ProtoAssessment()
110
+ assessment.assessment_name = self.name
111
+ assessment.trace_id = self.trace_id or ""
112
+
113
+ assessment.source.CopyFrom(self.source.to_proto())
114
+
115
+ # Convert time in milliseconds to protobuf Timestamp
116
+ assessment.create_time.FromMilliseconds(self.create_time_ms)
117
+ assessment.last_update_time.FromMilliseconds(self.last_update_time_ms)
118
+
119
+ if self.span_id is not None:
120
+ assessment.span_id = self.span_id
121
+ if self.rationale is not None:
122
+ assessment.rationale = self.rationale
123
+ if self.assessment_id is not None:
124
+ assessment.assessment_id = self.assessment_id
125
+
126
+ if self.expectation is not None:
127
+ assessment.expectation.CopyFrom(self.expectation.to_proto())
128
+ elif self.feedback is not None:
129
+ assessment.feedback.CopyFrom(self.feedback.to_proto())
130
+
131
+ if self.metadata:
132
+ assessment.metadata.update(self.metadata)
133
+ if self.overrides:
134
+ assessment.overrides = self.overrides
135
+ if self.valid is not None:
136
+ assessment.valid = self.valid
137
+
138
+ return assessment
139
+
140
+ @classmethod
141
+ def from_proto(cls, proto):
142
+ if proto.WhichOneof("value") == "expectation":
143
+ return Expectation.from_proto(proto)
144
+ elif proto.WhichOneof("value") == "feedback":
145
+ return Feedback.from_proto(proto)
146
+ else:
147
+ raise MlflowException.invalid_parameter_value(
148
+ f"Unknown assessment type: {proto.WhichOneof('value')}"
149
+ )
150
+
151
+ def to_dictionary(self):
152
+ # Note that MessageToDict excludes None fields. For example, if assessment_id is None,
153
+ # it won't be included in the resulting dictionary.
154
+ return MessageToDict(self.to_proto(), preserving_proto_field_name=True)
155
+
156
+ @classmethod
157
+ def from_dictionary(cls, d: dict[str, Any]) -> "Assessment":
158
+ if d.get("expectation"):
159
+ return Expectation.from_dictionary(d)
160
+ elif d.get("feedback"):
161
+ return Feedback.from_dictionary(d)
162
+ else:
163
+ raise MlflowException.invalid_parameter_value(
164
+ f"Unknown assessment type: {d.get('assessment_name')}"
165
+ )
166
+
167
+
168
+ DEFAULT_FEEDBACK_NAME = "feedback"
169
+
170
+
171
+ @experimental(version="3.0.0")
172
+ @dataclass
173
+ class Feedback(Assessment):
174
+ """
175
+ Represents feedback about the output of an operation. For example, if the response from a
176
+ generative AI application to a particular user query is correct, then a human or LLM judge
177
+ may provide feedback with the value ``"correct"``.
178
+
179
+ Args:
180
+ name: The name of the assessment. If not provided, the default name "feedback" is used.
181
+ value: The feedback value. This can be one of the following types:
182
+ - float
183
+ - int
184
+ - str
185
+ - bool
186
+ - list of values of the same types as above
187
+ - dict with string keys and values of the same types as above
188
+ error: An optional error associated with the feedback. This is used to indicate
189
+ that the feedback is not valid or cannot be processed. Accepts an exception
190
+ object, or an :py:class:`~mlflow.entities.Expectation` object.
191
+ rationale: The rationale / justification for the feedback.
192
+ source: The source of the assessment. If not provided, the default source is CODE.
193
+ trace_id: The ID of the trace associated with the assessment. If unset, the assessment
194
+ is not associated with any trace yet.
195
+ should be specified.
196
+ metadata: The metadata associated with the assessment.
197
+ span_id: The ID of the span associated with the assessment, if the assessment should
198
+ be associated with a particular span in the trace.
199
+ create_time_ms: The creation time of the assessment in milliseconds. If unset, the
200
+ current time is used.
201
+ last_update_time_ms: The last update time of the assessment in milliseconds.
202
+ If unset, the current time is used.
203
+
204
+ Example:
205
+
206
+ .. code-block:: python
207
+
208
+ from mlflow.entities import AssessmentSource, Feedback
209
+
210
+ feedback = Feedback(
211
+ name="correctness",
212
+ value=True,
213
+ rationale="The response is correct.",
214
+ source=AssessmentSource(
215
+ source_type="HUMAN",
216
+ source_id="john@example.com",
217
+ ),
218
+ metadata={"project": "my-project"},
219
+ )
220
+ """
221
+
222
+ def __init__(
223
+ self,
224
+ name: str = DEFAULT_FEEDBACK_NAME,
225
+ value: Optional[FeedbackValueType] = None,
226
+ error: Optional[Union[Exception, AssessmentError]] = None,
227
+ source: Optional[AssessmentSource] = None,
228
+ trace_id: Optional[str] = None,
229
+ metadata: Optional[dict[str, str]] = None,
230
+ span_id: Optional[str] = None,
231
+ create_time_ms: Optional[int] = None,
232
+ last_update_time_ms: Optional[int] = None,
233
+ rationale: Optional[str] = None,
234
+ overrides: Optional[str] = None,
235
+ valid: bool = True,
236
+ ):
237
+ if value is None and error is None:
238
+ raise MlflowException.invalid_parameter_value(
239
+ "Either `value` or `error` must be provided.",
240
+ )
241
+
242
+ # Default to CODE source if not provided
243
+ if source is None:
244
+ source = AssessmentSource(source_type=AssessmentSourceType.CODE)
245
+
246
+ if isinstance(error, Exception):
247
+ error = AssessmentError(
248
+ error_message=str(error),
249
+ error_code=error.__class__.__name__,
250
+ stack_trace=get_stacktrace(error),
251
+ )
252
+
253
+ super().__init__(
254
+ name=name,
255
+ source=source,
256
+ trace_id=trace_id,
257
+ metadata=metadata,
258
+ span_id=span_id,
259
+ create_time_ms=create_time_ms,
260
+ last_update_time_ms=last_update_time_ms,
261
+ feedback=FeedbackValue(value=value, error=error),
262
+ rationale=rationale,
263
+ overrides=overrides,
264
+ valid=valid,
265
+ )
266
+ self.error = error
267
+
268
+ @property
269
+ def value(self) -> FeedbackValueType:
270
+ return self.feedback.value
271
+
272
+ @value.setter
273
+ def value(self, value: FeedbackValueType):
274
+ self.feedback.value = value
275
+
276
+ @classmethod
277
+ def from_proto(cls, proto):
278
+ # Convert ScalarMapContainer to a normal Python dict
279
+ metadata = dict(proto.metadata) if proto.metadata else None
280
+ feedback_value = FeedbackValue.from_proto(proto.feedback)
281
+ feedback = cls(
282
+ trace_id=proto.trace_id,
283
+ name=proto.assessment_name,
284
+ source=AssessmentSource.from_proto(proto.source),
285
+ create_time_ms=proto.create_time.ToMilliseconds(),
286
+ last_update_time_ms=proto.last_update_time.ToMilliseconds(),
287
+ value=feedback_value.value,
288
+ error=feedback_value.error,
289
+ rationale=proto.rationale or None,
290
+ metadata=metadata,
291
+ span_id=proto.span_id or None,
292
+ overrides=proto.overrides or None,
293
+ valid=proto.valid,
294
+ )
295
+ feedback.assessment_id = proto.assessment_id or None
296
+ return feedback
297
+
298
+ @classmethod
299
+ def from_dictionary(cls, d: dict[str, Any]) -> "Feedback":
300
+ feedback_value = d.get("feedback")
301
+
302
+ if not feedback_value:
303
+ raise MlflowException.invalid_parameter_value(
304
+ "`feedback` must exist in the dictionary."
305
+ )
306
+
307
+ feedback_value = FeedbackValue.from_dictionary(feedback_value)
308
+
309
+ feedback = cls(
310
+ trace_id=d.get("trace_id"),
311
+ name=d["assessment_name"],
312
+ source=AssessmentSource.from_dictionary(d["source"]),
313
+ create_time_ms=proto_timestamp_to_milliseconds(d["create_time"]),
314
+ last_update_time_ms=proto_timestamp_to_milliseconds(d["last_update_time"]),
315
+ value=feedback_value.value,
316
+ error=feedback_value.error,
317
+ rationale=d.get("rationale"),
318
+ metadata=d.get("metadata"),
319
+ span_id=d.get("span_id"),
320
+ overrides=d.get("overrides"),
321
+ valid=d.get("valid", True),
322
+ )
323
+ feedback.assessment_id = d.get("assessment_id") or None
324
+ return feedback
325
+
326
+ # Backward compatibility: The old assessment object had these fields at top level.
327
+ @property
328
+ def error_code(self) -> Optional[str]:
329
+ """The error code of the error that occurred when the feedback was created."""
330
+ return self.feedback.error.error_code if self.feedback.error else None
331
+
332
+ @property
333
+ def error_message(self) -> Optional[str]:
334
+ """The error message of the error that occurred when the feedback was created."""
335
+ return self.feedback.error.error_message if self.feedback.error else None
336
+
337
+
338
+ @experimental(version="2.21.0")
339
+ @dataclass
340
+ class Expectation(Assessment):
341
+ """
342
+ Represents an expectation about the output of an operation, such as the expected response
343
+ that a generative AI application should provide to a particular user query.
344
+
345
+ Args:
346
+ name: The name of the assessment.
347
+ value: The expected value of the operation. This can be any JSON-serializable value.
348
+ source: The source of the assessment. If not provided, the default source is HUMAN.
349
+ trace_id: The ID of the trace associated with the assessment. If unset, the assessment
350
+ is not associated with any trace yet.
351
+ should be specified.
352
+ metadata: The metadata associated with the assessment.
353
+ span_id: The ID of the span associated with the assessment, if the assessment should
354
+ be associated with a particular span in the trace.
355
+ create_time_ms: The creation time of the assessment in milliseconds. If unset, the
356
+ current time is used.
357
+ last_update_time_ms: The last update time of the assessment in milliseconds.
358
+ If unset, the current time is used.
359
+
360
+ Example:
361
+
362
+ .. code-block:: python
363
+
364
+ from mlflow.entities import AssessmentSource, Expectation
365
+
366
+ expectation = Expectation(
367
+ name="expected_response",
368
+ value="The capital of France is Paris.",
369
+ source=AssessmentSource(
370
+ source_type=AssessmentSourceType.HUMAN,
371
+ source_id="john@example.com",
372
+ ),
373
+ metadata={"project": "my-project"},
374
+ )
375
+ """
376
+
377
+ def __init__(
378
+ self,
379
+ name: str,
380
+ value: Any,
381
+ source: Optional[AssessmentSource] = None,
382
+ trace_id: Optional[str] = None,
383
+ metadata: Optional[dict[str, str]] = None,
384
+ span_id: Optional[str] = None,
385
+ create_time_ms: Optional[int] = None,
386
+ last_update_time_ms: Optional[int] = None,
387
+ ):
388
+ if source is None:
389
+ source = AssessmentSource(source_type=AssessmentSourceType.HUMAN)
390
+
391
+ if value is None:
392
+ raise MlflowException.invalid_parameter_value("The `value` field must be specified.")
393
+
394
+ super().__init__(
395
+ name=name,
396
+ source=source,
397
+ trace_id=trace_id,
398
+ metadata=metadata,
399
+ span_id=span_id,
400
+ create_time_ms=create_time_ms,
401
+ last_update_time_ms=last_update_time_ms,
402
+ expectation=ExpectationValue(value=value),
403
+ )
404
+
405
+ @property
406
+ def value(self) -> Any:
407
+ return self.expectation.value
408
+
409
+ @value.setter
410
+ def value(self, value: Any):
411
+ self.expectation.value = value
412
+
413
+ @classmethod
414
+ def from_proto(cls, proto) -> "Expectation":
415
+ # Convert ScalarMapContainer to a normal Python dict
416
+ metadata = dict(proto.metadata) if proto.metadata else None
417
+ expectation_value = ExpectationValue.from_proto(proto.expectation)
418
+ expectation = cls(
419
+ trace_id=proto.trace_id,
420
+ name=proto.assessment_name,
421
+ source=AssessmentSource.from_proto(proto.source),
422
+ create_time_ms=proto.create_time.ToMilliseconds(),
423
+ last_update_time_ms=proto.last_update_time.ToMilliseconds(),
424
+ value=expectation_value.value,
425
+ metadata=metadata,
426
+ span_id=proto.span_id or None,
427
+ )
428
+ expectation.assessment_id = proto.assessment_id or None
429
+ return expectation
430
+
431
+ @classmethod
432
+ def from_dictionary(cls, d: dict[str, Any]) -> "Expectation":
433
+ expectation_value = d.get("expectation")
434
+
435
+ if not expectation_value:
436
+ raise MlflowException.invalid_parameter_value(
437
+ "`expectation` must exist in the dictionary."
438
+ )
439
+
440
+ expectation_value = ExpectationValue.from_dictionary(expectation_value)
441
+
442
+ expectation = cls(
443
+ trace_id=d.get("trace_id"),
444
+ name=d["assessment_name"],
445
+ source=AssessmentSource.from_dictionary(d["source"]),
446
+ create_time_ms=proto_timestamp_to_milliseconds(d["create_time"]),
447
+ last_update_time_ms=proto_timestamp_to_milliseconds(d["last_update_time"]),
448
+ value=expectation_value.value,
449
+ metadata=d.get("metadata"),
450
+ span_id=d.get("span_id"),
451
+ )
452
+ expectation.assessment_id = d.get("assessment_id") or None
453
+ return expectation
454
+
455
+
456
+ _JSON_SERIALIZATION_FORMAT = "JSON_FORMAT"
457
+
458
+
459
+ @experimental(version="3.0.0")
460
+ @dataclass
461
+ class ExpectationValue(_MlflowObject):
462
+ """Represents an expectation value."""
463
+
464
+ value: Any
465
+
466
+ def to_proto(self):
467
+ if self._need_serialization():
468
+ try:
469
+ serialized_value = json.dumps(self.value)
470
+ except Exception as e:
471
+ raise MlflowException.invalid_parameter_value(
472
+ f"Failed to serialize value {self.value} to JSON string. "
473
+ "Expectation value must be JSON-serializable."
474
+ ) from e
475
+ return ProtoExpectation(
476
+ serialized_value=ProtoExpectation.SerializedValue(
477
+ serialization_format=_JSON_SERIALIZATION_FORMAT,
478
+ value=serialized_value,
479
+ )
480
+ )
481
+
482
+ return ProtoExpectation(value=ParseDict(self.value, Value()))
483
+
484
+ @classmethod
485
+ def from_proto(cls, proto) -> "Expectation":
486
+ if proto.HasField("serialized_value"):
487
+ if proto.serialized_value.serialization_format != _JSON_SERIALIZATION_FORMAT:
488
+ raise MlflowException.invalid_parameter_value(
489
+ f"Unknown serialization format: {proto.serialized_value.serialization_format}. "
490
+ "Only JSON_FORMAT is supported."
491
+ )
492
+ return cls(value=json.loads(proto.serialized_value.value))
493
+ else:
494
+ return cls(value=MessageToDict(proto.value))
495
+
496
+ def to_dictionary(self):
497
+ return MessageToDict(self.to_proto(), preserving_proto_field_name=True)
498
+
499
+ @classmethod
500
+ def from_dictionary(cls, d):
501
+ if "value" in d:
502
+ return cls(d["value"])
503
+ elif "serialized_value" in d:
504
+ return cls(value=json.loads(d["serialized_value"]["value"]))
505
+ else:
506
+ raise MlflowException.invalid_parameter_value(
507
+ "Either 'value' or 'serialized_value' must be present in the dictionary "
508
+ "representation of an Expectation."
509
+ )
510
+
511
+ def _need_serialization(self):
512
+ # Values like None, lists, dicts, should be serialized as a JSON string
513
+ return self.value is not None and not isinstance(self.value, (int, float, bool, str))
514
+
515
+
516
+ @experimental(version="2.21.0")
517
+ @dataclass
518
+ class FeedbackValue(_MlflowObject):
519
+ """Represents a feedback value."""
520
+
521
+ value: FeedbackValueType
522
+ error: Optional[AssessmentError] = None
523
+
524
+ def to_proto(self):
525
+ return ProtoFeedback(
526
+ value=ParseDict(self.value, Value(), ignore_unknown_fields=True),
527
+ error=self.error.to_proto() if self.error else None,
528
+ )
529
+
530
+ @classmethod
531
+ def from_proto(cls, proto) -> "FeedbackValue":
532
+ return FeedbackValue(
533
+ value=MessageToDict(proto.value),
534
+ error=AssessmentError.from_proto(proto.error) if proto.HasField("error") else None,
535
+ )
536
+
537
+ def to_dictionary(self):
538
+ return MessageToDict(self.to_proto(), preserving_proto_field_name=True)
539
+
540
+ @classmethod
541
+ def from_dictionary(cls, d):
542
+ return cls(
543
+ value=d["value"],
544
+ error=AssessmentError.from_dictionary(err) if (err := d.get("error")) else None,
545
+ )
@@ -0,0 +1,80 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ from mlflow.entities._mlflow_object import _MlflowObject
5
+ from mlflow.protos.assessments_pb2 import AssessmentError as ProtoAssessmentError
6
+ from mlflow.utils.annotations import experimental
7
+
8
+ _STACK_TRACE_TRUNCATION_PREFIX = "[Stack trace is truncated]\n...\n"
9
+ _STACK_TRACE_TRUNCATION_LENGTH = 1000
10
+
11
+
12
+ @experimental(version="2.21.0")
13
+ @dataclass
14
+ class AssessmentError(_MlflowObject):
15
+ """
16
+ Error object representing any issues during generating the assessment.
17
+
18
+ For example, if the LLM-as-a-Judge fails to generate an feedback, you can
19
+ log an error with the error code and message as shown below:
20
+
21
+ .. code-block:: python
22
+
23
+ from mlflow.entities import AssessmentError
24
+
25
+ error = AssessmentError(
26
+ error_code="RATE_LIMIT_EXCEEDED",
27
+ error_message="Rate limit for the judge exceeded.",
28
+ stack_trace="...",
29
+ )
30
+
31
+ mlflow.log_feedback(
32
+ trace_id="1234",
33
+ name="faithfulness",
34
+ source=AssessmentSourceType.LLM_JUDGE,
35
+ error=error,
36
+ # Skip setting value when an error is present
37
+ )
38
+
39
+ Args:
40
+ error_code: The error code.
41
+ error_message: The detailed error message. Optional.
42
+ stack_trace: The stack trace of the error. Truncated to 1000 characters
43
+ before being logged to MLflow. Optional.
44
+ """
45
+
46
+ error_code: str
47
+ error_message: Optional[str] = None
48
+ stack_trace: Optional[str] = None
49
+
50
+ def to_proto(self):
51
+ error = ProtoAssessmentError()
52
+ error.error_code = self.error_code
53
+ if self.error_message:
54
+ error.error_message = self.error_message
55
+ if self.stack_trace:
56
+ if len(self.stack_trace) > _STACK_TRACE_TRUNCATION_LENGTH:
57
+ trunc_len = _STACK_TRACE_TRUNCATION_LENGTH - len(_STACK_TRACE_TRUNCATION_PREFIX)
58
+ error.stack_trace = _STACK_TRACE_TRUNCATION_PREFIX + self.stack_trace[-trunc_len:]
59
+ else:
60
+ error.stack_trace = self.stack_trace
61
+ return error
62
+
63
+ @classmethod
64
+ def from_proto(cls, proto):
65
+ return cls(
66
+ error_code=proto.error_code,
67
+ error_message=proto.error_message or None,
68
+ stack_trace=proto.stack_trace or None,
69
+ )
70
+
71
+ def to_dictionary(self):
72
+ return {
73
+ "error_code": self.error_code,
74
+ "error_message": self.error_message,
75
+ "stack_trace": self.stack_trace,
76
+ }
77
+
78
+ @classmethod
79
+ def from_dictionary(cls, error_dict):
80
+ return cls(**error_dict)