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,853 @@
1
+ import functools
2
+ import json
3
+ import logging
4
+ import threading
5
+ import uuid
6
+ import warnings
7
+ from typing import Any, Optional, Union
8
+
9
+ import mlflow
10
+ from mlflow.entities.logged_model import LoggedModel
11
+ from mlflow.entities.model_registry import ModelVersion, Prompt, PromptVersion, RegisteredModel
12
+ from mlflow.entities.run import Run
13
+ from mlflow.environment_variables import (
14
+ MLFLOW_PRINT_MODEL_URLS_ON_CREATION,
15
+ MLFLOW_PROMPT_CACHE_MAX_SIZE,
16
+ )
17
+ from mlflow.exceptions import MlflowException
18
+ from mlflow.models.model import MLMODEL_FILE_NAME
19
+ from mlflow.prompt.registry_utils import parse_prompt_name_or_uri, require_prompt_registry
20
+ from mlflow.protos.databricks_pb2 import (
21
+ ALREADY_EXISTS,
22
+ NOT_FOUND,
23
+ RESOURCE_ALREADY_EXISTS,
24
+ ErrorCode,
25
+ )
26
+ from mlflow.store.artifact.runs_artifact_repo import RunsArtifactRepository
27
+ from mlflow.store.artifact.utils.models import _parse_model_id_if_present
28
+ from mlflow.store.entities.paged_list import PagedList
29
+ from mlflow.store.model_registry import (
30
+ SEARCH_MODEL_VERSION_MAX_RESULTS_DEFAULT,
31
+ SEARCH_REGISTERED_MODEL_MAX_RESULTS_DEFAULT,
32
+ )
33
+ from mlflow.tracing.fluent import get_active_trace_id
34
+ from mlflow.tracing.trace_manager import InMemoryTraceManager
35
+ from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
36
+ from mlflow.tracking.client import MlflowClient
37
+ from mlflow.tracking.fluent import active_run, get_active_model_id
38
+ from mlflow.utils import get_results_from_paginated_fn, mlflow_tags
39
+ from mlflow.utils.databricks_utils import (
40
+ _construct_databricks_uc_registered_model_url,
41
+ get_workspace_id,
42
+ get_workspace_url,
43
+ stage_model_for_databricks_model_serving,
44
+ )
45
+ from mlflow.utils.env_pack import EnvPackType, pack_env_for_databricks_model_serving
46
+ from mlflow.utils.logging_utils import eprint
47
+ from mlflow.utils.uri import is_databricks_unity_catalog_uri
48
+
49
+ _logger = logging.getLogger(__name__)
50
+
51
+
52
+ PROMPT_API_MIGRATION_MSG = (
53
+ "The `mlflow.{func_name}` API is moved to the `mlflow.genai` namespace. Please use "
54
+ "`mlflow.genai.{func_name}` instead. The original API will be removed in the "
55
+ "future release."
56
+ )
57
+
58
+
59
+ def register_model(
60
+ model_uri,
61
+ name,
62
+ await_registration_for=DEFAULT_AWAIT_MAX_SLEEP_SECONDS,
63
+ *,
64
+ tags: Optional[dict[str, Any]] = None,
65
+ env_pack: Optional[EnvPackType] = None,
66
+ ) -> ModelVersion:
67
+ """Create a new model version in model registry for the model files specified by ``model_uri``.
68
+
69
+ Note that this method assumes the model registry backend URI is the same as that of the
70
+ tracking backend.
71
+
72
+ Args:
73
+ model_uri: URI referring to the MLmodel directory. Use a ``runs:/`` URI if you want to
74
+ record the run ID with the model in model registry (recommended), or pass the
75
+ local filesystem path of the model if registering a locally-persisted MLflow
76
+ model that was previously saved using ``save_model``.
77
+ ``models:/`` URIs are currently not supported.
78
+ name: Name of the registered model under which to create a new model version. If a
79
+ registered model with the given name does not exist, it will be created
80
+ automatically.
81
+ await_registration_for: Number of seconds to wait for the model version to finish
82
+ being created and is in ``READY`` status. By default, the function
83
+ waits for five minutes. Specify 0 or None to skip waiting.
84
+ tags: A dictionary of key-value pairs that are converted into
85
+ :py:class:`mlflow.entities.model_registry.ModelVersionTag` objects.
86
+ env_pack: If specified, the model dependencies will first be installed into the current
87
+ Python environment, and then the complete environment will be packaged and included
88
+ in the registered model artifacts. This is useful when deploying the model to a
89
+ serving environment like Databricks Model Serving.
90
+
91
+ .. Note:: Experimental: This parameter may change or be removed in a future
92
+ release without warning.
93
+
94
+ Returns:
95
+ Single :py:class:`mlflow.entities.model_registry.ModelVersion` object created by
96
+ backend.
97
+
98
+ .. code-block:: python
99
+ :test:
100
+ :caption: Example
101
+
102
+ import mlflow.sklearn
103
+ from mlflow.models import infer_signature
104
+ from sklearn.datasets import make_regression
105
+ from sklearn.ensemble import RandomForestRegressor
106
+
107
+ mlflow.set_tracking_uri("sqlite:////tmp/mlruns.db")
108
+ params = {"n_estimators": 3, "random_state": 42}
109
+ X, y = make_regression(n_features=4, n_informative=2, random_state=0, shuffle=False)
110
+ # Log MLflow entities
111
+ with mlflow.start_run() as run:
112
+ rfr = RandomForestRegressor(**params).fit(X, y)
113
+ signature = infer_signature(X, rfr.predict(X))
114
+ mlflow.log_params(params)
115
+ mlflow.sklearn.log_model(rfr, name="sklearn-model", signature=signature)
116
+ model_uri = f"runs:/{run.info.run_id}/sklearn-model"
117
+ mv = mlflow.register_model(model_uri, "RandomForestRegressionModel")
118
+ print(f"Name: {mv.name}")
119
+ print(f"Version: {mv.version}")
120
+
121
+ .. code-block:: text
122
+ :caption: Output
123
+
124
+ Name: RandomForestRegressionModel
125
+ Version: 1
126
+ """
127
+ return _register_model(
128
+ model_uri=model_uri,
129
+ name=name,
130
+ await_registration_for=await_registration_for,
131
+ tags=tags,
132
+ env_pack=env_pack,
133
+ )
134
+
135
+
136
+ def _register_model(
137
+ model_uri,
138
+ name,
139
+ await_registration_for=DEFAULT_AWAIT_MAX_SLEEP_SECONDS,
140
+ *,
141
+ tags: Optional[dict[str, Any]] = None,
142
+ local_model_path=None,
143
+ env_pack: Optional[EnvPackType] = None,
144
+ ) -> ModelVersion:
145
+ client = MlflowClient()
146
+ try:
147
+ create_model_response = client.create_registered_model(name)
148
+ eprint(f"Successfully registered model '{create_model_response.name}'.")
149
+ except MlflowException as e:
150
+ if e.error_code in (
151
+ ErrorCode.Name(RESOURCE_ALREADY_EXISTS),
152
+ ErrorCode.Name(ALREADY_EXISTS),
153
+ ):
154
+ eprint(
155
+ f"Registered model {name!r} already exists. Creating a new version of this model..."
156
+ )
157
+ else:
158
+ raise e
159
+
160
+ run_id = None
161
+ model_id = None
162
+ source = model_uri
163
+ if RunsArtifactRepository.is_runs_uri(model_uri):
164
+ # If the uri is of the form runs:/...
165
+ (run_id, artifact_path) = RunsArtifactRepository.parse_runs_uri(model_uri)
166
+ runs_artifact_repo = RunsArtifactRepository(model_uri)
167
+ # List artifacts in `<run_artifact_root>/<artifact_path>` to see if the run has artifacts.
168
+ # If so use the run's artifact location as source.
169
+ artifacts = runs_artifact_repo._list_run_artifacts()
170
+ if MLMODEL_FILE_NAME in (art.path for art in artifacts):
171
+ source = RunsArtifactRepository.get_underlying_uri(model_uri)
172
+ # Otherwise check if there's a logged model with
173
+ # name artifact_path and source_run_id run_id
174
+ else:
175
+ run = client.get_run(run_id)
176
+ logged_models = _get_logged_models_from_run(run, artifact_path)
177
+ if not logged_models:
178
+ raise MlflowException(
179
+ f"Unable to find a logged_model with artifact_path {artifact_path} "
180
+ f"under run {run_id}",
181
+ error_code=ErrorCode.Name(NOT_FOUND),
182
+ )
183
+ if len(logged_models) > 1:
184
+ if run.outputs is None:
185
+ raise MlflowException.invalid_parameter_value(
186
+ f"Multiple logged models found for run {run_id}. Cannot determine "
187
+ "which model to register. Please use `models:/<model_id>` instead."
188
+ )
189
+ # If there are multiple such logged models, get the one logged at the largest step
190
+ model_id_to_step = {m_o.model_id: m_o.step for m_o in run.outputs.model_outputs}
191
+ model_id = max(logged_models, key=lambda lm: model_id_to_step[lm.model_id]).model_id
192
+ else:
193
+ model_id = logged_models[0].model_id
194
+ source = f"models:/{model_id}"
195
+ _logger.warning(
196
+ f"Run with id {run_id} has no artifacts at artifact path {artifact_path!r}, "
197
+ f"registering model based on {source} instead"
198
+ )
199
+
200
+ # Otherwise if the uri is of the form models:/..., try to get the model_id from the uri directly
201
+ model_id = _parse_model_id_if_present(model_uri) if not model_id else model_id
202
+
203
+ if env_pack == "databricks_model_serving":
204
+ eprint("Packing environment for Databricks Model Serving...")
205
+ with pack_env_for_databricks_model_serving(
206
+ model_uri,
207
+ enforce_pip_requirements=True,
208
+ ) as artifacts_path_with_env:
209
+ client.log_model_artifacts(model_id, artifacts_path_with_env)
210
+
211
+ create_version_response = client._create_model_version(
212
+ name=name,
213
+ source=source,
214
+ run_id=run_id,
215
+ tags=tags,
216
+ await_creation_for=await_registration_for,
217
+ local_model_path=local_model_path,
218
+ model_id=model_id,
219
+ )
220
+ created_message = (
221
+ f"Created version '{create_version_response.version}' of model "
222
+ f"'{create_version_response.name}'"
223
+ )
224
+ # Print a link to the UC model version page if the model is in UC.
225
+ registry_uri = mlflow.get_registry_uri()
226
+ if (
227
+ MLFLOW_PRINT_MODEL_URLS_ON_CREATION.get()
228
+ and is_databricks_unity_catalog_uri(registry_uri)
229
+ and (url := get_workspace_url())
230
+ ):
231
+ uc_model_url = _construct_databricks_uc_registered_model_url(
232
+ url,
233
+ create_version_response.name,
234
+ create_version_response.version,
235
+ get_workspace_id(),
236
+ )
237
+ created_message = "🔗 " + created_message + f": {uc_model_url}"
238
+ else:
239
+ created_message += "."
240
+ eprint(created_message)
241
+
242
+ if model_id:
243
+ new_value = [
244
+ {
245
+ "name": create_version_response.name,
246
+ "version": create_version_response.version,
247
+ }
248
+ ]
249
+ model = client.get_logged_model(model_id)
250
+ if existing_value := model.tags.get(mlflow_tags.MLFLOW_MODEL_VERSIONS):
251
+ new_value = json.loads(existing_value) + new_value
252
+
253
+ client.set_logged_model_tags(
254
+ model_id,
255
+ {mlflow_tags.MLFLOW_MODEL_VERSIONS: json.dumps(new_value)},
256
+ )
257
+
258
+ if env_pack == "databricks_model_serving":
259
+ eprint(
260
+ f"Staging model {create_version_response.name} "
261
+ f"version {create_version_response.version} "
262
+ "for Databricks Model Serving..."
263
+ )
264
+ try:
265
+ stage_model_for_databricks_model_serving(
266
+ model_name=create_version_response.name,
267
+ model_version=create_version_response.version,
268
+ )
269
+ except Exception as e:
270
+ eprint(
271
+ f"Failed to stage model for Databricks Model Serving: {e!s}. "
272
+ "The model was registered successfully and is available for serving, but may take "
273
+ "longer to deploy."
274
+ )
275
+
276
+ return create_version_response
277
+
278
+
279
+ def _get_logged_models_from_run(source_run: Run, model_name: str) -> list[LoggedModel]:
280
+ """Get all logged models from the source rnu that have the specified model name.
281
+
282
+ Args:
283
+ source_run: Source run from which to retrieve logged models.
284
+ model_name: Name of the model to retrieve.
285
+ """
286
+ client = MlflowClient()
287
+ logged_models = []
288
+ page_token = None
289
+
290
+ while True:
291
+ logged_models_page = client.search_logged_models(
292
+ experiment_ids=[source_run.info.experiment_id],
293
+ # TODO: Filter by 'source_run_id' once Databricks backend supports it
294
+ filter_string=f"name = '{model_name}'",
295
+ page_token=page_token,
296
+ )
297
+ logged_models.extend(
298
+ m for m in logged_models_page if m.source_run_id == source_run.info.run_id
299
+ )
300
+ if not logged_models_page.token:
301
+ break
302
+ page_token = logged_models_page.token
303
+
304
+ return logged_models
305
+
306
+
307
+ def search_registered_models(
308
+ max_results: Optional[int] = None,
309
+ filter_string: Optional[str] = None,
310
+ order_by: Optional[list[str]] = None,
311
+ ) -> list[RegisteredModel]:
312
+ """Search for registered models that satisfy the filter criteria.
313
+
314
+ Args:
315
+ max_results: If passed, specifies the maximum number of models desired. If not
316
+ passed, all models will be returned.
317
+ filter_string: Filter query string (e.g., "name = 'a_model_name' and tag.key = 'value1'"),
318
+ defaults to searching for all registered models. The following identifiers, comparators,
319
+ and logical operators are supported.
320
+
321
+ Identifiers
322
+ - "name": registered model name.
323
+ - "tags.<tag_key>": registered model tag. If "tag_key" contains spaces, it must be
324
+ wrapped with backticks (e.g., "tags.`extra key`").
325
+
326
+ Comparators
327
+ - "=": Equal to.
328
+ - "!=": Not equal to.
329
+ - "LIKE": Case-sensitive pattern match.
330
+ - "ILIKE": Case-insensitive pattern match.
331
+
332
+ Logical operators
333
+ - "AND": Combines two sub-queries and returns True if both of them are True.
334
+
335
+ order_by: List of column names with ASC|DESC annotation, to be used for ordering
336
+ matching search results.
337
+
338
+ Returns:
339
+ A list of :py:class:`mlflow.entities.model_registry.RegisteredModel` objects
340
+ that satisfy the search expressions.
341
+
342
+ .. code-block:: python
343
+ :test:
344
+ :caption: Example
345
+
346
+ import mlflow
347
+ from sklearn.linear_model import LogisticRegression
348
+
349
+ with mlflow.start_run():
350
+ mlflow.sklearn.log_model(
351
+ LogisticRegression(),
352
+ name="Cordoba",
353
+ registered_model_name="CordobaWeatherForecastModel",
354
+ )
355
+ mlflow.sklearn.log_model(
356
+ LogisticRegression(),
357
+ name="Boston",
358
+ registered_model_name="BostonWeatherForecastModel",
359
+ )
360
+
361
+ # Get search results filtered by the registered model name
362
+ filter_string = "name = 'CordobaWeatherForecastModel'"
363
+ results = mlflow.search_registered_models(filter_string=filter_string)
364
+ print("-" * 80)
365
+ for res in results:
366
+ for mv in res.latest_versions:
367
+ print(f"name={mv.name}; run_id={mv.run_id}; version={mv.version}")
368
+
369
+ # Get search results filtered by the registered model name that matches
370
+ # prefix pattern
371
+ filter_string = "name LIKE 'Boston%'"
372
+ results = mlflow.search_registered_models(filter_string=filter_string)
373
+ print("-" * 80)
374
+ for res in results:
375
+ for mv in res.latest_versions:
376
+ print(f"name={mv.name}; run_id={mv.run_id}; version={mv.version}")
377
+
378
+ # Get all registered models and order them by ascending order of the names
379
+ results = mlflow.search_registered_models(order_by=["name ASC"])
380
+ print("-" * 80)
381
+ for res in results:
382
+ for mv in res.latest_versions:
383
+ print(f"name={mv.name}; run_id={mv.run_id}; version={mv.version}")
384
+
385
+ .. code-block:: text
386
+ :caption: Output
387
+
388
+ --------------------------------------------------------------------------------
389
+ name=CordobaWeatherForecastModel; run_id=248c66a666744b4887bdeb2f9cf7f1c6; version=1
390
+ --------------------------------------------------------------------------------
391
+ name=BostonWeatherForecastModel; run_id=248c66a666744b4887bdeb2f9cf7f1c6; version=1
392
+ --------------------------------------------------------------------------------
393
+ name=BostonWeatherForecastModel; run_id=248c66a666744b4887bdeb2f9cf7f1c6; version=1
394
+ name=CordobaWeatherForecastModel; run_id=248c66a666744b4887bdeb2f9cf7f1c6; version=1
395
+ """
396
+
397
+ def pagination_wrapper_func(number_to_get, next_page_token):
398
+ return MlflowClient().search_registered_models(
399
+ max_results=number_to_get,
400
+ filter_string=filter_string,
401
+ order_by=order_by,
402
+ page_token=next_page_token,
403
+ )
404
+
405
+ return get_results_from_paginated_fn(
406
+ pagination_wrapper_func,
407
+ SEARCH_REGISTERED_MODEL_MAX_RESULTS_DEFAULT,
408
+ max_results,
409
+ )
410
+
411
+
412
+ def search_model_versions(
413
+ max_results: Optional[int] = None,
414
+ filter_string: Optional[str] = None,
415
+ order_by: Optional[list[str]] = None,
416
+ ) -> list[ModelVersion]:
417
+ """Search for model versions that satisfy the filter criteria.
418
+
419
+ .. warning:
420
+
421
+ The model version search results may not have aliases populated for performance reasons.
422
+
423
+ Args:
424
+ max_results: If passed, specifies the maximum number of models desired. If not
425
+ passed, all models will be returned.
426
+ filter_string: Filter query string
427
+ (e.g., ``"name = 'a_model_name' and tag.key = 'value1'"``),
428
+ defaults to searching for all model versions. The following identifiers, comparators,
429
+ and logical operators are supported.
430
+
431
+ Identifiers
432
+ - ``name``: model name.
433
+ - ``source_path``: model version source path.
434
+ - ``run_id``: The id of the mlflow run that generates the model version.
435
+ - ``tags.<tag_key>``: model version tag. If ``tag_key`` contains spaces, it must be
436
+ wrapped with backticks (e.g., ``"tags.`extra key`"``).
437
+
438
+ Comparators
439
+ - ``=``: Equal to.
440
+ - ``!=``: Not equal to.
441
+ - ``LIKE``: Case-sensitive pattern match.
442
+ - ``ILIKE``: Case-insensitive pattern match.
443
+ - ``IN``: In a value list. Only ``run_id`` identifier supports ``IN`` comparator.
444
+
445
+ Logical operators
446
+ - ``AND``: Combines two sub-queries and returns True if both of them are True.
447
+
448
+ order_by: List of column names with ASC|DESC annotation, to be used for ordering
449
+ matching search results.
450
+
451
+ Returns:
452
+ A list of :py:class:`mlflow.entities.model_registry.ModelVersion` objects
453
+ that satisfy the search expressions.
454
+
455
+ .. code-block:: python
456
+ :test:
457
+ :caption: Example
458
+
459
+ import mlflow
460
+ from sklearn.linear_model import LogisticRegression
461
+
462
+ for _ in range(2):
463
+ with mlflow.start_run():
464
+ mlflow.sklearn.log_model(
465
+ LogisticRegression(),
466
+ name="Cordoba",
467
+ registered_model_name="CordobaWeatherForecastModel",
468
+ )
469
+
470
+ # Get all versions of the model filtered by name
471
+ filter_string = "name = 'CordobaWeatherForecastModel'"
472
+ results = mlflow.search_model_versions(filter_string=filter_string)
473
+ print("-" * 80)
474
+ for res in results:
475
+ print(f"name={res.name}; run_id={res.run_id}; version={res.version}")
476
+
477
+ # Get the version of the model filtered by run_id
478
+ filter_string = "run_id = 'ae9a606a12834c04a8ef1006d0cff779'"
479
+ results = mlflow.search_model_versions(filter_string=filter_string)
480
+ print("-" * 80)
481
+ for res in results:
482
+ print(f"name={res.name}; run_id={res.run_id}; version={res.version}")
483
+
484
+ .. code-block:: text
485
+ :caption: Output
486
+
487
+ --------------------------------------------------------------------------------
488
+ name=CordobaWeatherForecastModel; run_id=ae9a606a12834c04a8ef1006d0cff779; version=2
489
+ name=CordobaWeatherForecastModel; run_id=d8f028b5fedf4faf8e458f7693dfa7ce; version=1
490
+ --------------------------------------------------------------------------------
491
+ name=CordobaWeatherForecastModel; run_id=ae9a606a12834c04a8ef1006d0cff779; version=2
492
+ """
493
+
494
+ def pagination_wrapper_func(number_to_get, next_page_token):
495
+ return MlflowClient().search_model_versions(
496
+ max_results=number_to_get,
497
+ filter_string=filter_string,
498
+ order_by=order_by,
499
+ page_token=next_page_token,
500
+ )
501
+
502
+ return get_results_from_paginated_fn(
503
+ paginated_fn=pagination_wrapper_func,
504
+ max_results_per_page=SEARCH_MODEL_VERSION_MAX_RESULTS_DEFAULT,
505
+ max_results=max_results,
506
+ )
507
+
508
+
509
+ def set_model_version_tag(
510
+ name: str,
511
+ version: Optional[str] = None,
512
+ key: Optional[str] = None,
513
+ value: Any = None,
514
+ ) -> None:
515
+ """
516
+ Set a tag for the model version.
517
+
518
+ Args:
519
+ name: Registered model name.
520
+ version: Registered model version.
521
+ key: Tag key to log. key is required.
522
+ value: Tag value to log. value is required.
523
+ """
524
+ return MlflowClient().set_model_version_tag(
525
+ name=name,
526
+ version=version,
527
+ key=key,
528
+ value=value,
529
+ )
530
+
531
+
532
+ @require_prompt_registry
533
+ def register_prompt(
534
+ name: str,
535
+ template: str,
536
+ commit_message: Optional[str] = None,
537
+ tags: Optional[dict[str, str]] = None,
538
+ ) -> PromptVersion:
539
+ """
540
+ Register a new :py:class:`Prompt <mlflow.entities.Prompt>` in the MLflow Prompt Registry.
541
+
542
+ A :py:class:`Prompt <mlflow.entities.Prompt>` is a pair of name and
543
+ template text at minimum. With MLflow Prompt Registry, you can create, manage, and
544
+ version control prompts with the MLflow's robust model tracking framework.
545
+
546
+ If there is no registered prompt with the given name, a new prompt will be created.
547
+ Otherwise, a new version of the existing prompt will be created.
548
+
549
+
550
+ Args:
551
+ name: The name of the prompt.
552
+ template: The template text of the prompt. It can contain variables enclosed in
553
+ double curly braces, e.g. {variable}, which will be replaced with actual values
554
+ by the `format` method.
555
+
556
+ .. note::
557
+
558
+ If you want to use the prompt with a framework that uses single curly braces
559
+ e.g. LangChain, you can use the `to_single_brace_format` method to convert the
560
+ loaded prompt to a format that uses single curly braces.
561
+
562
+ .. code-block:: python
563
+
564
+ prompt = client.load_prompt("my_prompt")
565
+ langchain_format = prompt.to_single_brace_format()
566
+
567
+ commit_message: A message describing the changes made to the prompt, similar to a
568
+ Git commit message. Optional.
569
+ tags: A dictionary of tags associated with the **prompt version**.
570
+ This is useful for storing version-specific information, such as the author of
571
+ the changes. Optional.
572
+
573
+ Returns:
574
+ A :py:class:`Prompt <mlflow.entities.Prompt>` object that was created.
575
+
576
+ Example:
577
+
578
+ .. code-block:: python
579
+
580
+ import mlflow
581
+
582
+ # Register a new prompt
583
+ mlflow.register_prompt(
584
+ name="my_prompt",
585
+ template="Respond to the user's message as a {{style}} AI.",
586
+ )
587
+
588
+ # Load the prompt from the registry
589
+ prompt = mlflow.load_prompt("my_prompt")
590
+
591
+ # Use the prompt in your application
592
+ import openai
593
+
594
+ openai_client = openai.OpenAI()
595
+ openai_client.chat.completion.create(
596
+ model="gpt-4o-mini",
597
+ messages=[
598
+ {"role": "system", "content": prompt.format(style="friendly")},
599
+ {"role": "user", "content": "Hello, how are you?"},
600
+ ],
601
+ )
602
+
603
+ # Update the prompt with a new version
604
+ prompt = mlflow.register_prompt(
605
+ name="my_prompt",
606
+ template="Respond to the user's message as a {{style}} AI. {{greeting}}",
607
+ commit_message="Add a greeting to the prompt.",
608
+ tags={"author": "Bob"},
609
+ )
610
+ """
611
+ warnings.warn(
612
+ PROMPT_API_MIGRATION_MSG.format(func_name="register_prompt"),
613
+ category=FutureWarning,
614
+ stacklevel=3,
615
+ )
616
+
617
+ return MlflowClient().register_prompt(
618
+ name=name,
619
+ template=template,
620
+ commit_message=commit_message,
621
+ tags=tags,
622
+ )
623
+
624
+
625
+ @require_prompt_registry
626
+ def search_prompts(
627
+ filter_string: Optional[str] = None,
628
+ max_results: Optional[int] = None,
629
+ ) -> PagedList[Prompt]:
630
+ warnings.warn(
631
+ PROMPT_API_MIGRATION_MSG.format(func_name="search_prompts"),
632
+ category=FutureWarning,
633
+ stacklevel=3,
634
+ )
635
+
636
+ def pagination_wrapper_func(number_to_get, next_page_token):
637
+ return MlflowClient().search_prompts(
638
+ filter_string=filter_string, max_results=number_to_get, page_token=next_page_token
639
+ )
640
+
641
+ return get_results_from_paginated_fn(
642
+ pagination_wrapper_func,
643
+ SEARCH_REGISTERED_MODEL_MAX_RESULTS_DEFAULT,
644
+ max_results,
645
+ )
646
+
647
+
648
+ @require_prompt_registry
649
+ def load_prompt(
650
+ name_or_uri: str,
651
+ version: Optional[Union[str, int]] = None,
652
+ allow_missing: bool = False,
653
+ link_to_model: bool = True,
654
+ model_id: Optional[str] = None,
655
+ ) -> PromptVersion:
656
+ """
657
+ Load a :py:class:`Prompt <mlflow.entities.Prompt>` from the MLflow Prompt Registry.
658
+
659
+ The prompt can be specified by name and version, or by URI.
660
+
661
+ Args:
662
+ name_or_uri: The name of the prompt, or the URI in the format "prompts:/name/version".
663
+ version: The version of the prompt (required when using name, not allowed when using URI).
664
+ allow_missing: If True, return None instead of raising Exception if the specified prompt
665
+ is not found.
666
+ link_to_model: If True, the prompt will be linked to the model with the ID specified
667
+ by `model_id`, or the active model ID if `model_id` is None and
668
+ there is an active model.
669
+ model_id: The ID of the model to which to link the prompt, if `link_to_model` is True.
670
+
671
+ Example:
672
+
673
+ .. code-block:: python
674
+
675
+ import mlflow
676
+
677
+ # Load a specific version of the prompt
678
+ prompt = mlflow.load_prompt("my_prompt", version=1)
679
+
680
+ # Load a specific version of the prompt by URI
681
+ prompt = mlflow.load_prompt("prompts:/my_prompt/1")
682
+
683
+ # Load a prompt version with an alias "production"
684
+ prompt = mlflow.load_prompt("prompts:/my_prompt@production")
685
+
686
+ """
687
+ warnings.warn(
688
+ PROMPT_API_MIGRATION_MSG.format(func_name="load_prompt"),
689
+ category=FutureWarning,
690
+ stacklevel=3,
691
+ )
692
+
693
+ if "@" in name_or_uri:
694
+ # Don't cache prompts loaded by alias since aliases can change over time
695
+ prompt = _load_prompt_not_cached(
696
+ name_or_uri=name_or_uri,
697
+ version=version,
698
+ allow_missing=allow_missing,
699
+ )
700
+ else:
701
+ # Otherwise, we use a cached function to avoid loading the same prompt multiple times.
702
+ # If the prompt from the cache is not found and allowing_missing is True, we
703
+ # try to load the prompt from the client without cache, since it may have been
704
+ # registered after the cache was created (uncommon scenario).
705
+ prompt = _load_prompt_cached(
706
+ name_or_uri=name_or_uri,
707
+ version=version,
708
+ allow_missing=allow_missing,
709
+ ) or _load_prompt_not_cached(
710
+ name_or_uri=name_or_uri,
711
+ version=version,
712
+ allow_missing=allow_missing,
713
+ )
714
+ if prompt is None:
715
+ return
716
+
717
+ client = MlflowClient()
718
+
719
+ # If there is an active MLflow run, associate the prompt with the run.
720
+ # Note that we do this synchronously because it's unlikely that run linking occurs
721
+ # in a latency sensitive environment, since runs aren't typically used in real-time /
722
+ # production scenarios
723
+ if run := active_run():
724
+ client.link_prompt_version_to_run(
725
+ run.info.run_id, f"prompts:/{prompt.name}/{prompt.version}"
726
+ )
727
+
728
+ if link_to_model:
729
+ model_id = model_id or get_active_model_id()
730
+ if model_id is not None:
731
+ # Run linking in background thread to avoid blocking prompt loading. Prompt linking
732
+ # is not critical for the user's workflow (if the prompt fails to link, the user's
733
+ # workflow is minorly affected), so we handle it asynchronously and gracefully
734
+ # handle any failures without impacting the core prompt loading functionality.
735
+
736
+ def _link_prompt_async():
737
+ try:
738
+ client.link_prompt_version_to_model(
739
+ name=prompt.name,
740
+ version=prompt.version,
741
+ model_id=model_id,
742
+ )
743
+ except Exception:
744
+ # NB: We should still load the prompt even if linking fails, since the prompt
745
+ # is critical to the caller's application logic
746
+ _logger.warn(
747
+ f"Failed to link prompt '{prompt.name}' version '{prompt.version}'"
748
+ f" to model '{model_id}'.",
749
+ exc_info=True,
750
+ )
751
+
752
+ # Start linking in background - don't wait for completion
753
+ link_thread = threading.Thread(
754
+ target=_link_prompt_async, name=f"link_prompt_thread-{uuid.uuid4().hex[:8]}"
755
+ )
756
+ link_thread.start()
757
+
758
+ if trace_id := get_active_trace_id():
759
+ InMemoryTraceManager.get_instance().register_prompt(
760
+ trace_id=trace_id,
761
+ prompt=prompt,
762
+ )
763
+
764
+ return prompt
765
+
766
+
767
+ @functools.lru_cache(maxsize=MLFLOW_PROMPT_CACHE_MAX_SIZE.get())
768
+ def _load_prompt_cached(
769
+ name_or_uri: str,
770
+ version: Optional[Union[str, int]] = None,
771
+ allow_missing: bool = False,
772
+ ) -> Optional[PromptVersion]:
773
+ """
774
+ Internal cached function to load prompts from registry.
775
+ """
776
+ return _load_prompt_not_cached(name_or_uri, version, allow_missing)
777
+
778
+
779
+ def _load_prompt_not_cached(
780
+ name_or_uri: str,
781
+ version: Optional[Union[str, int]] = None,
782
+ allow_missing: bool = False,
783
+ ) -> Optional[PromptVersion]:
784
+ """
785
+ Load prompt from client, handling URI parsing.
786
+ """
787
+ client = MlflowClient()
788
+
789
+ # Use utility to handle URI vs name+version parsing
790
+ parsed_name_or_uri, parsed_version = parse_prompt_name_or_uri(name_or_uri, version)
791
+ if parsed_name_or_uri.startswith("prompts:/"):
792
+ # For URIs, don't pass version parameter
793
+ return client.load_prompt(parsed_name_or_uri, allow_missing=allow_missing)
794
+ else:
795
+ # For names, use the parsed version
796
+ return client.load_prompt(
797
+ parsed_name_or_uri, version=parsed_version, allow_missing=allow_missing
798
+ )
799
+
800
+
801
+ @require_prompt_registry
802
+ def set_prompt_alias(name: str, alias: str, version: int) -> None:
803
+ """
804
+ Set an alias for a :py:class:`Prompt <mlflow.entities.Prompt>` in the MLflow Prompt Registry.
805
+
806
+ Args:
807
+ name: The name of the prompt.
808
+ alias: The alias to set for the prompt.
809
+ version: The version of the prompt.
810
+
811
+ Example:
812
+
813
+ .. code-block:: python
814
+
815
+ import mlflow
816
+
817
+ # Set an alias for the prompt
818
+ mlflow.set_prompt_alias(name="my_prompt", version=1, alias="production")
819
+
820
+ # Load the prompt by alias (use "@" to specify the alias)
821
+ prompt = mlflow.load_prompt("prompts:/my_prompt@production")
822
+
823
+ # Switch the alias to a new version of the prompt
824
+ mlflow.set_prompt_alias(name="my_prompt", version=2, alias="production")
825
+
826
+ # Delete the alias
827
+ mlflow.delete_prompt_alias(name="my_prompt", alias="production")
828
+ """
829
+ warnings.warn(
830
+ PROMPT_API_MIGRATION_MSG.format(func_name="set_prompt_alias"),
831
+ category=FutureWarning,
832
+ stacklevel=3,
833
+ )
834
+
835
+ MlflowClient().set_prompt_alias(name=name, version=version, alias=alias)
836
+
837
+
838
+ @require_prompt_registry
839
+ def delete_prompt_alias(name: str, alias: str) -> None:
840
+ """
841
+ Delete an alias for a :py:class:`Prompt <mlflow.entities.Prompt>` in the MLflow Prompt Registry.
842
+
843
+ Args:
844
+ name: The name of the prompt.
845
+ alias: The alias to delete for the prompt.
846
+ """
847
+ warnings.warn(
848
+ PROMPT_API_MIGRATION_MSG.format(func_name="delete_prompt_alias"),
849
+ category=FutureWarning,
850
+ stacklevel=3,
851
+ )
852
+
853
+ MlflowClient().delete_prompt_alias(name=name, alias=alias)