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,662 @@
1
+ """
2
+ The :py:mod:`mlflow.models.signature` module provides an API for specification of model signature.
3
+
4
+ Model signature defines schema of model input and output. See :py:class:`mlflow.types.schema.Schema`
5
+ for more details on Schema and data types.
6
+ """
7
+
8
+ import inspect
9
+ import logging
10
+ import re
11
+ import warnings
12
+ from copy import deepcopy
13
+ from dataclasses import dataclass, is_dataclass
14
+ from typing import TYPE_CHECKING, Any, Optional, Union, get_type_hints
15
+
16
+ import numpy as np
17
+ import pandas as pd
18
+
19
+ from mlflow.environment_variables import _MLFLOW_TESTING
20
+ from mlflow.exceptions import MlflowException
21
+ from mlflow.models import Model
22
+ from mlflow.models.model import MLMODEL_FILE_NAME
23
+ from mlflow.models.utils import _contains_params, _Example
24
+ from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE, RESOURCE_DOES_NOT_EXIST
25
+ from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository
26
+ from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
27
+ from mlflow.tracking.artifact_utils import _download_artifact_from_uri, _upload_artifact_to_uri
28
+ from mlflow.types.schema import AnyType, ColSpec, ParamSchema, Schema, convert_dataclass_to_schema
29
+ from mlflow.types.type_hints import (
30
+ InvalidTypeHintException,
31
+ _get_data_validation_result,
32
+ _infer_schema_from_list_type_hint,
33
+ _infer_schema_from_type_hint,
34
+ _is_list_type_hint,
35
+ )
36
+ from mlflow.types.utils import (
37
+ InvalidDataForSignatureInferenceError,
38
+ _infer_param_schema,
39
+ _infer_schema,
40
+ )
41
+ from mlflow.utils.annotations import filter_user_warnings_once
42
+ from mlflow.utils.uri import append_to_uri_path
43
+
44
+ # At runtime, we don't need `pyspark.sql.dataframe`
45
+ if TYPE_CHECKING:
46
+ try:
47
+ import pyspark.sql.dataframe
48
+
49
+ MlflowInferableDataset = Union[
50
+ pd.DataFrame, np.ndarray, dict[str, np.ndarray], pyspark.sql.dataframe.DataFrame
51
+ ]
52
+ except ImportError:
53
+ MlflowInferableDataset = Union[pd.DataFrame, np.ndarray, dict[str, np.ndarray]]
54
+
55
+ _logger = logging.getLogger(__name__)
56
+
57
+ _LOG_MODEL_INFER_SIGNATURE_WARNING_TEMPLATE = (
58
+ "Failed to infer the model signature from the input example. Reason: %s. To see the full "
59
+ "traceback, set the logging level to DEBUG via "
60
+ '`logging.getLogger("mlflow").setLevel(logging.DEBUG)`.'
61
+ )
62
+
63
+
64
+ class ModelSignature:
65
+ """
66
+ ModelSignature specifies schema of model's inputs, outputs and params.
67
+
68
+ ModelSignature can be :py:func:`inferred <mlflow.models.infer_signature>` from training
69
+ dataset, model predictions using and params for inference, or constructed by hand by
70
+ passing an input and output :py:class:`Schema <mlflow.types.Schema>`, and params
71
+ :py:class:`ParamSchema <mlflow.types.ParamSchema>`.
72
+ """
73
+
74
+ def __init__(
75
+ self,
76
+ inputs: Union[Schema, dataclass] = None,
77
+ outputs: Union[Schema, dataclass] = None,
78
+ params: ParamSchema = None,
79
+ ):
80
+ if inputs and not isinstance(inputs, Schema) and not is_dataclass(inputs):
81
+ raise TypeError(
82
+ "inputs must be either None, mlflow.models.signature.Schema, or a dataclass,"
83
+ f"got '{type(inputs).__name__}'"
84
+ )
85
+ if outputs and not isinstance(outputs, Schema) and not is_dataclass(outputs):
86
+ raise TypeError(
87
+ "outputs must be either None, mlflow.models.signature.Schema, or a dataclass,"
88
+ f"got '{type(outputs).__name__}'"
89
+ )
90
+ if params and not isinstance(params, ParamSchema):
91
+ raise TypeError(
92
+ "If params are provided, they must by of type mlflow.models.signature.ParamSchema, "
93
+ f"got '{type(params).__name__}'"
94
+ )
95
+ if all(x is None for x in [inputs, outputs, params]):
96
+ raise ValueError("At least one of inputs, outputs or params must be provided")
97
+ if is_dataclass(inputs):
98
+ self.inputs = convert_dataclass_to_schema(inputs)
99
+ else:
100
+ self.inputs = inputs
101
+ if is_dataclass(outputs):
102
+ self.outputs = convert_dataclass_to_schema(outputs)
103
+ else:
104
+ self.outputs = outputs
105
+ self.params = params
106
+ self.__is_signature_from_type_hint = False
107
+ self.__is_type_hint_from_example = False
108
+
109
+ @property
110
+ def _is_signature_from_type_hint(self):
111
+ return self.__is_signature_from_type_hint
112
+
113
+ @_is_signature_from_type_hint.setter
114
+ def _is_signature_from_type_hint(self, value):
115
+ self.__is_signature_from_type_hint = value
116
+
117
+ @property
118
+ def _is_type_hint_from_example(self):
119
+ return self.__is_type_hint_from_example
120
+
121
+ @_is_type_hint_from_example.setter
122
+ def _is_type_hint_from_example(self, value):
123
+ self.__is_type_hint_from_example = value
124
+
125
+ def to_dict(self) -> dict[str, Any]:
126
+ """
127
+ Serialize into a 'jsonable' dictionary.
128
+
129
+ Input and output schema are represented as json strings. This is so that the
130
+ representation is compact when embedded in an MLmodel yaml file.
131
+
132
+ Returns:
133
+ dictionary representation with input and output schema represented as json strings.
134
+ """
135
+
136
+ return {
137
+ "inputs": self.inputs.to_json() if self.inputs else None,
138
+ "outputs": self.outputs.to_json() if self.outputs else None,
139
+ "params": self.params.to_json() if self.params else None,
140
+ }
141
+
142
+ @classmethod
143
+ def from_dict(cls, signature_dict: dict[str, Any]):
144
+ """
145
+ Deserialize from dictionary representation.
146
+
147
+ Args:
148
+ signature_dict: Dictionary representation of model signature.
149
+ Expected dictionary format:
150
+ `{'inputs': <json string>,
151
+ 'outputs': <json string>,
152
+ 'params': <json string>" }`
153
+
154
+ Returns:
155
+ ModelSignature populated with the data form the dictionary.
156
+ """
157
+ inputs = Schema.from_json(x) if (x := signature_dict.get("inputs")) else None
158
+ outputs = Schema.from_json(x) if (x := signature_dict.get("outputs")) else None
159
+ params = ParamSchema.from_json(x) if (x := signature_dict.get("params")) else None
160
+ return cls(inputs, outputs, params)
161
+
162
+ def __eq__(self, other) -> bool:
163
+ return (
164
+ isinstance(other, ModelSignature)
165
+ and self.inputs == other.inputs
166
+ and self.outputs == other.outputs
167
+ and self.params == other.params
168
+ )
169
+
170
+ def __repr__(self) -> str:
171
+ return (
172
+ "inputs: \n"
173
+ f" {self.inputs!r}\n"
174
+ "outputs: \n"
175
+ f" {self.outputs!r}\n"
176
+ "params: \n"
177
+ f" {self.params!r}\n"
178
+ )
179
+
180
+
181
+ def infer_signature(
182
+ model_input: Any = None,
183
+ model_output: "MlflowInferableDataset" = None,
184
+ params: Optional[dict[str, Any]] = None,
185
+ ) -> ModelSignature:
186
+ """
187
+ Infer an MLflow model signature from the training data (input), model predictions (output)
188
+ and parameters (for inference).
189
+
190
+ The signature represents model input and output as data frames with (optionally) named columns
191
+ and data type specified as one of types defined in :py:class:`mlflow.types.DataType`. It also
192
+ includes parameters schema for inference, .
193
+ This method will raise an exception if the user data contains incompatible types or is not
194
+ passed in one of the supported formats listed below.
195
+
196
+ The input should be one of these:
197
+ - pandas.DataFrame
198
+ - pandas.Series
199
+ - dictionary of { name -> numpy.ndarray}
200
+ - numpy.ndarray
201
+ - pyspark.sql.DataFrame
202
+ - scipy.sparse.csr_matrix
203
+ - scipy.sparse.csc_matrix
204
+ - dictionary / list of dictionaries of JSON-convertible types
205
+
206
+ The element types should be mappable to one of :py:class:`mlflow.types.DataType`.
207
+
208
+ For pyspark.sql.DataFrame inputs, columns of type DateType and TimestampType are both inferred
209
+ as type :py:data:`datetime <mlflow.types.DataType.datetime>`, which is coerced to
210
+ TimestampType at inference.
211
+
212
+ Args:
213
+ model_input: Valid input to the model. E.g. (a subset of) the training dataset.
214
+ model_output: Valid model output. E.g. Model predictions for the (subset of) training
215
+ dataset.
216
+ params: Valid parameters for inference. It should be a dictionary of parameters
217
+ that can be set on the model during inference by passing `params` to pyfunc
218
+ `predict` method.
219
+
220
+ An example of valid parameters:
221
+
222
+ .. code-block:: python
223
+
224
+ from mlflow.models import infer_signature
225
+ from mlflow.transformers import generate_signature_output
226
+
227
+ # Define parameters for inference
228
+ params = {
229
+ "num_beams": 5,
230
+ "max_length": 30,
231
+ "do_sample": True,
232
+ "remove_invalid_values": True,
233
+ }
234
+
235
+ # Infer the signature including parameters
236
+ signature = infer_signature(
237
+ data,
238
+ generate_signature_output(model, data),
239
+ params=params,
240
+ )
241
+
242
+ # Saving model with model signature
243
+ mlflow.transformers.save_model(
244
+ model,
245
+ path=model_path,
246
+ signature=signature,
247
+ )
248
+
249
+ pyfunc_loaded = mlflow.pyfunc.load_model(model_path)
250
+
251
+ # Passing params to `predict` function directly
252
+ result = pyfunc_loaded.predict(data, params=params)
253
+
254
+ Returns:
255
+ ModelSignature
256
+ """
257
+ schemas = {"inputs": model_input, "outputs": model_output}
258
+ for key, data in schemas.items():
259
+ if data is not None:
260
+ try:
261
+ schemas[key] = (
262
+ convert_dataclass_to_schema(data) if is_dataclass(data) else _infer_schema(data)
263
+ )
264
+ except InvalidDataForSignatureInferenceError:
265
+ raise
266
+ except Exception:
267
+ extra_msg = (
268
+ ("Note that MLflow doesn't validate data types during inference for AnyType. ")
269
+ if key == "inputs"
270
+ else ""
271
+ )
272
+ _logger.warning(
273
+ f"Failed to infer schema for {key}. "
274
+ f"Setting schema to `Schema([ColSpec(type=AnyType())]` as default. {extra_msg}"
275
+ "To see the full traceback, set logging level to DEBUG.",
276
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
277
+ )
278
+ schemas[key] = Schema([ColSpec(type=AnyType())])
279
+ schemas["params"] = _infer_param_schema(params) if params else None
280
+ return ModelSignature(**schemas)
281
+
282
+
283
+ # `t\w*\.` matches the `typing` module or its alias
284
+ _LIST_OF_STRINGS_PATTERN = re.compile(r"^(t\w*\.)?list\[str\]$", re.IGNORECASE)
285
+
286
+
287
+ def _is_list_str(hint_str):
288
+ return _LIST_OF_STRINGS_PATTERN.match(hint_str.replace(" ", "")) is not None
289
+
290
+
291
+ _LIST_OF_STR_DICT_PATTERN = re.compile(
292
+ r"^(t\w*\.)?list\[(t\w*\.)?dict\[str,str\]\]$", re.IGNORECASE
293
+ )
294
+
295
+
296
+ def _is_list_of_string_dict(hint_str):
297
+ return _LIST_OF_STR_DICT_PATTERN.match(hint_str.replace(" ", "")) is not None
298
+
299
+
300
+ def _infer_hint_from_str(hint_str):
301
+ if _is_list_str(hint_str):
302
+ return list[str]
303
+ elif _is_list_of_string_dict(hint_str):
304
+ return list[dict[str, str]]
305
+ else:
306
+ return None
307
+
308
+
309
+ def _get_arg_names(f):
310
+ return list(inspect.signature(f).parameters.keys())
311
+
312
+
313
+ class _TypeHints:
314
+ def __init__(self, input_=None, output=None):
315
+ self.input = input_
316
+ self.output = output
317
+
318
+ def __repr__(self):
319
+ return f"<input: {self.input}, output: {self.output}>"
320
+
321
+
322
+ def _extract_type_hints(f, input_arg_index):
323
+ """
324
+ Extract type hints from a function.
325
+
326
+ Args:
327
+ f: Function to extract type hints from.
328
+ input_arg_index: Index of the function argument that corresponds to the model input.
329
+
330
+ Returns:
331
+ A `_TypeHints` object containing the input and output type hints.
332
+ """
333
+ if not hasattr(f, "__annotations__") and hasattr(f, "__call__"):
334
+ return _extract_type_hints(f.__call__, input_arg_index)
335
+
336
+ if f.__annotations__ == {}:
337
+ return _TypeHints()
338
+
339
+ arg_names = list(filter(lambda x: x != "self", _get_arg_names(f)))
340
+ if len(arg_names) - 1 < input_arg_index:
341
+ raise MlflowException.invalid_parameter_value(
342
+ f"The specified input argument index ({input_arg_index}) is out of range for the "
343
+ "function signature: {}".format(input_arg_index, arg_names)
344
+ )
345
+ arg_name = arg_names[input_arg_index]
346
+ try:
347
+ hints = get_type_hints(f)
348
+ except (
349
+ TypeError,
350
+ NameError, # To handle this issue: https://github.com/python/typing/issues/797
351
+ ):
352
+ # ---
353
+ # from __future__ import annotations # postpones evaluation of 'list[str]'
354
+ #
355
+ # def f(x: list[str]) -> list[str]:
356
+ # ^^^^^^^^^ Evaluating this expression ('list[str]') results in a TypeError in
357
+ # Python < 3.9 because the built-in list type is not subscriptable.
358
+ # return x
359
+ # ---
360
+ # Best effort to infer type hints from strings
361
+ hints = {}
362
+ for arg in [arg_name, "return"]:
363
+ if hint_str := f.__annotations__.get(arg, None):
364
+ if hint := _infer_hint_from_str(hint_str):
365
+ hints[arg] = hint
366
+ else:
367
+ _logger.info("Unsupported type hint: %s, skipping schema inference", hint_str)
368
+ except Exception as e:
369
+ _logger.warning("Failed to extract type hints from function %s: %s", f.__name__, repr(e))
370
+ return _TypeHints()
371
+
372
+ return _TypeHints(hints.get(arg_name), hints.get("return"))
373
+
374
+
375
+ def _is_context_in_predict_function_signature(*, func=None, parameters=None):
376
+ if parameters is None:
377
+ if func is None:
378
+ raise ValueError("Either `func` or `parameters` must be provided.")
379
+ parameters = inspect.signature(func).parameters
380
+ return (
381
+ # predict(self, context, model_input, ...)
382
+ "context" in parameters
383
+ # predict(self, ctx, model_input, ...) ctx can be any parameter name
384
+ or len([param for param in parameters if param not in ("self", "params")]) == 2
385
+ )
386
+
387
+
388
+ @filter_user_warnings_once
389
+ def _infer_signature_from_type_hints(
390
+ func, type_hints: _TypeHints, input_example=None
391
+ ) -> Optional[ModelSignature]:
392
+ """
393
+ Infer the signature from type hints.
394
+ """
395
+ if type_hints.input is None:
396
+ return None
397
+
398
+ params = None
399
+ params_key = "params"
400
+ if _contains_params(input_example):
401
+ input_example, params = input_example
402
+
403
+ try:
404
+ input_schema = _infer_schema_from_list_type_hint(type_hints.input)
405
+ except InvalidTypeHintException:
406
+ raise MlflowException.invalid_parameter_value(
407
+ "The `predict` function has unsupported type hints for the model input "
408
+ "arguments. Update it to one of supported type hints, or remove type hints "
409
+ "to bypass this check. Error: {e}"
410
+ )
411
+ except Exception as e:
412
+ warnings.warn(f"Failed to infer signature from type hint: {e.message}", stacklevel=3)
413
+ return None
414
+
415
+ # only warn if the pyfunc decorator is not used and schema can
416
+ # be inferred from the input type hint
417
+ _pyfunc_decorator_used = getattr(func, "_is_pyfunc", False)
418
+ if not _pyfunc_decorator_used:
419
+ # stacklevel is 3 because we have a decorator
420
+ warnings.warn(
421
+ "Decorate your function with `@mlflow.pyfunc.utils.pyfunc` to enable auto "
422
+ "data validation against model input type hints.",
423
+ stacklevel=3,
424
+ )
425
+
426
+ default_output_schema = Schema([ColSpec(type=AnyType())])
427
+ is_output_type_hint_valid = False
428
+ output_schema = None
429
+ if type_hints.output:
430
+ try:
431
+ # output type hint doesn't need to be a list
432
+ # but if it's a list, we infer the schema from the list type hint
433
+ # to be consistent with input schema inference
434
+ output_schema = (
435
+ _infer_schema_from_list_type_hint(type_hints.output)
436
+ if _is_list_type_hint(type_hints.output)
437
+ else _infer_schema_from_type_hint(type_hints.output)
438
+ )
439
+ is_output_type_hint_valid = True
440
+ except Exception as e:
441
+ _logger.info(
442
+ f"Failed to infer output type hint, setting output schema to AnyType. {e}",
443
+ stacklevel=2,
444
+ )
445
+ output_schema = default_output_schema
446
+ else:
447
+ output_schema = default_output_schema
448
+ params_schema = _infer_param_schema(params) if params else None
449
+
450
+ if input_example is not None:
451
+ # only validate input example here if pyfunc decorator is not used
452
+ # because when the decorator is used, the input is validated in the predict function
453
+ if not _pyfunc_decorator_used and (
454
+ msg := _get_data_validation_result(
455
+ data=input_example, type_hint=type_hints.input
456
+ ).error_message
457
+ ):
458
+ _logger.warning(
459
+ "Input example is not compatible with the type hint of the `predict` function. "
460
+ f"Error: {msg}"
461
+ )
462
+ else:
463
+ kwargs = (
464
+ {params_key: params}
465
+ if params and params_key in inspect.signature(func).parameters
466
+ else {}
467
+ )
468
+ # This is for PythonModel's predict function
469
+ if _is_context_in_predict_function_signature(func=func):
470
+ inputs = [None, input_example]
471
+ else:
472
+ inputs = [input_example]
473
+ _logger.info("Running the predict function to generate output based on input example")
474
+ try:
475
+ output_example = func(*inputs, **kwargs)
476
+ except Exception:
477
+ _logger.warning(
478
+ "Failed to run the predict function on input example. To see the full "
479
+ "traceback, set logging level to DEBUG.",
480
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
481
+ )
482
+ else:
483
+ if is_output_type_hint_valid and (
484
+ msg := _get_data_validation_result(
485
+ data=output_example, type_hint=type_hints.output
486
+ ).error_message
487
+ ):
488
+ _logger.warning(
489
+ f"Failed to validate output `{output_example}` against type hint "
490
+ f"`{type_hints.output}`, setting output schema to AnyType. "
491
+ f"Error: {msg}"
492
+ )
493
+ output_schema = default_output_schema
494
+ if not any([input_schema, output_schema, params_schema]):
495
+ return None
496
+ signature = ModelSignature(inputs=input_schema, outputs=output_schema, params=params_schema)
497
+ signature._is_signature_from_type_hint = True
498
+ return signature
499
+
500
+
501
+ def _infer_signature_from_input_example(
502
+ input_example: Optional[_Example], wrapped_model
503
+ ) -> Optional[ModelSignature]:
504
+ """
505
+ Infer the signature from an example input and a PyFunc wrapped model. Catches all exceptions.
506
+
507
+ Args:
508
+ input_example: Saved _Example object that contains input example instance.
509
+ wrapped_model: A PyFunc wrapped model which has a `predict` method.
510
+
511
+ Returns:
512
+ A `ModelSignature` object containing the inferred schema of both the model's inputs
513
+ based on the `input_example` and the model's outputs based on the prediction from the
514
+ `wrapped_model`.
515
+ """
516
+ from mlflow.pyfunc import _validate_prediction_input
517
+
518
+ if input_example is None:
519
+ return None
520
+
521
+ try:
522
+ # Copy the input example so that it is not mutated by predict()
523
+ input_data = deepcopy(input_example.inference_data)
524
+ params = input_example.inference_params
525
+
526
+ input_schema = _infer_schema(input_data)
527
+ params_schema = _infer_param_schema(params) if params else None
528
+ # do the same validation as pyfunc predict to make sure the signature is correctly
529
+ # applied to the model
530
+ input_data, params = _validate_prediction_input(
531
+ input_data, params, input_schema, params_schema
532
+ )
533
+ prediction = wrapped_model.predict(input_data, params=params)
534
+ # For column-based inputs, 1D numpy arrays likely signify row-based predictions. Thus, we
535
+ # convert them to a Pandas series for inferring as a single ColSpec Schema.
536
+ if (
537
+ not input_schema.is_tensor_spec()
538
+ and isinstance(prediction, np.ndarray)
539
+ and prediction.ndim == 1
540
+ ):
541
+ prediction = pd.Series(prediction)
542
+
543
+ output_schema = None
544
+ try:
545
+ output_schema = _infer_schema(prediction)
546
+ except Exception:
547
+ # try assign output schema if failing to infer it from prediction for langchain models
548
+ try:
549
+ from mlflow.langchain.model import _LangChainModelWrapper
550
+ from mlflow.langchain.utils.chat import _ChatResponse
551
+ except ImportError:
552
+ pass
553
+ else:
554
+ if isinstance(wrapped_model, _LangChainModelWrapper) and isinstance(
555
+ prediction, _ChatResponse
556
+ ):
557
+ output_schema = prediction.get_schema()
558
+ if output_schema is None:
559
+ _logger.warning(
560
+ "Failed to infer model output schema from prediction result, setting "
561
+ "output schema to AnyType. For full traceback, set logging level to debug.",
562
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
563
+ )
564
+ output_schema = Schema([ColSpec(type=AnyType())])
565
+
566
+ return ModelSignature(input_schema, output_schema, params_schema)
567
+ except Exception as e:
568
+ if _MLFLOW_TESTING.get():
569
+ raise
570
+ _logger.warning(
571
+ _LOG_MODEL_INFER_SIGNATURE_WARNING_TEMPLATE,
572
+ repr(e),
573
+ exc_info=_logger.isEnabledFor(logging.DEBUG),
574
+ )
575
+
576
+
577
+ def set_signature(
578
+ model_uri: str,
579
+ signature: ModelSignature,
580
+ ):
581
+ """
582
+ Sets the model signature for specified model artifacts.
583
+
584
+ The process involves downloading the MLmodel file in the model artifacts (if it's non-local),
585
+ updating its model signature, and then overwriting the existing MLmodel file. Should the
586
+ artifact repository associated with the model artifacts disallow overwriting, this function will
587
+ fail.
588
+
589
+ Furthermore, as model registry artifacts are read-only, model artifacts located in the
590
+ model registry and represented by ``models:/`` URI schemes are not compatible with this API.
591
+ To set a signature on a model version, first set the signature on the source model artifacts.
592
+ Following this, generate a new model version using the updated model artifacts. For more
593
+ information about setting signatures on model versions, see
594
+ `this doc section <https://www.mlflow.org/docs/latest/models.html#set-signature-on-mv>`_.
595
+
596
+ Args:
597
+ model_uri: The location, in URI format, of the MLflow model. For example:
598
+
599
+ - ``/Users/me/path/to/local/model``
600
+ - ``relative/path/to/local/model``
601
+ - ``s3://my_bucket/path/to/model``
602
+ - ``runs:/<mlflow_run_id>/run-relative/path/to/model``
603
+ - ``mlflow-artifacts:/path/to/model``
604
+ - ``models:/<model_id>``
605
+
606
+ For more information about supported URI schemes, see
607
+ `Referencing Artifacts <https://www.mlflow.org/docs/latest/concepts.html#
608
+ artifact-locations>`_.
609
+
610
+ Please note that model URIs with the ``models:/<name>/<version>`` scheme are not
611
+ supported.
612
+
613
+ signature: ModelSignature to set on the model.
614
+
615
+ .. code-block:: python
616
+ :caption: Example
617
+
618
+ import mlflow
619
+ from mlflow.models import set_signature, infer_signature
620
+
621
+ # load model from run artifacts
622
+ run_id = "96771d893a5e46159d9f3b49bf9013e2"
623
+ artifact_path = "models"
624
+ model_uri = f"runs:/{run_id}/{artifact_path}"
625
+ model = mlflow.pyfunc.load_model(model_uri)
626
+
627
+ # determine model signature
628
+ test_df = ...
629
+ predictions = model.predict(test_df)
630
+ signature = infer_signature(test_df, predictions)
631
+
632
+ # set the signature for the logged model
633
+ set_signature(model_uri, signature)
634
+ """
635
+ assert isinstance(signature, ModelSignature), (
636
+ "The signature argument must be a ModelSignature object"
637
+ )
638
+ resolved_uri = model_uri
639
+ if RunsArtifactRepository.is_runs_uri(model_uri):
640
+ resolved_uri = RunsArtifactRepository.get_underlying_uri(model_uri)
641
+ elif ModelsArtifactRepository._is_logged_model_uri(model_uri):
642
+ resolved_uri = ModelsArtifactRepository.get_underlying_uri(model_uri)
643
+ elif ModelsArtifactRepository.is_models_uri(model_uri):
644
+ raise MlflowException(
645
+ f"Failed to set signature on {model_uri!r}. "
646
+ "Model URIs with the `models:/<name>/<version>` scheme are not supported.",
647
+ INVALID_PARAMETER_VALUE,
648
+ )
649
+
650
+ try:
651
+ ml_model_file = _download_artifact_from_uri(
652
+ artifact_uri=append_to_uri_path(resolved_uri, MLMODEL_FILE_NAME)
653
+ )
654
+ except Exception as ex:
655
+ raise MlflowException(
656
+ f'Failed to download an "{MLMODEL_FILE_NAME}" model file from "{model_uri}"',
657
+ RESOURCE_DOES_NOT_EXIST,
658
+ ) from ex
659
+ model_meta = Model.load(ml_model_file)
660
+ model_meta.signature = signature
661
+ model_meta.save(ml_model_file)
662
+ _upload_artifact_to_uri(ml_model_file, resolved_uri)