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
mlflow/dspy/save.py ADDED
@@ -0,0 +1,393 @@
1
+ """Functions for saving DSPY models to MLflow."""
2
+
3
+ import os
4
+ from pathlib import Path
5
+ from typing import Any, Optional, Union
6
+
7
+ import cloudpickle
8
+ import yaml
9
+
10
+ import mlflow
11
+ from mlflow import pyfunc
12
+ from mlflow.dspy.constant import FLAVOR_NAME
13
+ from mlflow.dspy.wrapper import DspyChatModelWrapper, DspyModelWrapper
14
+ from mlflow.entities.model_registry.prompt import Prompt
15
+ from mlflow.exceptions import INVALID_PARAMETER_VALUE, MlflowException
16
+ from mlflow.models import (
17
+ Model,
18
+ ModelInputExample,
19
+ ModelSignature,
20
+ infer_pip_requirements,
21
+ )
22
+ from mlflow.models.dependencies_schemas import _get_dependencies_schemas
23
+ from mlflow.models.model import MLMODEL_FILE_NAME
24
+ from mlflow.models.rag_signatures import SIGNATURE_FOR_LLM_INFERENCE_TASK
25
+ from mlflow.models.resources import Resource, _ResourceBuilder
26
+ from mlflow.models.signature import _infer_signature_from_input_example
27
+ from mlflow.models.utils import _save_example
28
+ from mlflow.tracing.provider import trace_disabled
29
+ from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
30
+ from mlflow.types.schema import DataType
31
+ from mlflow.utils.annotations import experimental
32
+ from mlflow.utils.docstring_utils import LOG_MODEL_PARAM_DOCS, format_docstring
33
+ from mlflow.utils.environment import (
34
+ _CONDA_ENV_FILE_NAME,
35
+ _CONSTRAINTS_FILE_NAME,
36
+ _PYTHON_ENV_FILE_NAME,
37
+ _REQUIREMENTS_FILE_NAME,
38
+ _mlflow_conda_env,
39
+ _process_conda_env,
40
+ _process_pip_requirements,
41
+ _PythonEnv,
42
+ )
43
+ from mlflow.utils.file_utils import get_total_file_size, write_to
44
+ from mlflow.utils.model_utils import (
45
+ _validate_and_copy_code_paths,
46
+ _validate_and_prepare_target_save_path,
47
+ )
48
+ from mlflow.utils.requirements_utils import _get_pinned_requirement
49
+
50
+ _MODEL_SAVE_PATH = "model"
51
+ _MODEL_DATA_PATH = "data"
52
+
53
+
54
+ def get_default_pip_requirements():
55
+ """
56
+ Returns:
57
+ A list of default pip requirements for MLflow Models produced by Dspy flavor. Calls to
58
+ `save_model()` and `log_model()` produce a pip environment that, at minimum, contains these
59
+ requirements.
60
+ """
61
+ return [_get_pinned_requirement("dspy")]
62
+
63
+
64
+ def get_default_conda_env():
65
+ """
66
+ Returns:
67
+ The default Conda environment for MLflow Models produced by calls to `save_model()` and
68
+ `log_model()`.
69
+ """
70
+ return _mlflow_conda_env(additional_pip_deps=get_default_pip_requirements())
71
+
72
+
73
+ @experimental(version="2.18.0")
74
+ @format_docstring(LOG_MODEL_PARAM_DOCS.format(package_name=FLAVOR_NAME))
75
+ @trace_disabled # Suppress traces for internal predict calls while logging model
76
+ def save_model(
77
+ model,
78
+ path: str,
79
+ task: Optional[str] = None,
80
+ model_config: Optional[dict[str, Any]] = None,
81
+ code_paths: Optional[list[str]] = None,
82
+ mlflow_model: Optional[Model] = None,
83
+ conda_env: Optional[Union[list[str], str]] = None,
84
+ signature: Optional[ModelSignature] = None,
85
+ input_example: Optional[ModelInputExample] = None,
86
+ pip_requirements: Optional[Union[list[str], str]] = None,
87
+ extra_pip_requirements: Optional[Union[list[str], str]] = None,
88
+ metadata: Optional[dict[str, Any]] = None,
89
+ resources: Optional[Union[str, Path, list[Resource]]] = None,
90
+ ):
91
+ """
92
+ Save a Dspy model.
93
+
94
+ This method saves a Dspy model along with metadata such as model signature and conda
95
+ environments to local file system. This method is called inside `mlflow.dspy.log_model()`.
96
+
97
+ Args:
98
+ model: an instance of `dspy.Module`. The Dspy model/module to be saved.
99
+ path: local path where the MLflow model is to be saved.
100
+ task: defaults to None. The task type of the model. Can only be `llm/v1/chat` or None for
101
+ now.
102
+ model_config: keyword arguments to be passed to the Dspy Module at instantiation.
103
+ code_paths: {{ code_paths }}
104
+ mlflow_model: an instance of `mlflow.models.Model`, defaults to None. MLflow model
105
+ configuration to which to add the Dspy model metadata. If None, a blank instance will
106
+ be created.
107
+ conda_env: {{ conda_env }}
108
+ signature: {{ signature }}
109
+ input_example: {{ input_example }}
110
+ pip_requirements: {{ pip_requirements }}
111
+ extra_pip_requirements: {{ extra_pip_requirements }}
112
+ metadata: {{ metadata }}
113
+ resources: A list of model resources or a resources.yaml file containing a list of
114
+ resources required to serve the model.
115
+ """
116
+
117
+ import dspy
118
+
119
+ from mlflow.transformers.llm_inference_utils import (
120
+ _LLM_INFERENCE_TASK_KEY,
121
+ _METADATA_LLM_INFERENCE_TASK_KEY,
122
+ )
123
+
124
+ if signature:
125
+ num_inputs = len(signature.inputs.inputs)
126
+ if num_inputs == 0:
127
+ raise MlflowException(
128
+ "The model signature's input schema must contain at least one field.",
129
+ error_code=INVALID_PARAMETER_VALUE,
130
+ )
131
+ if task and task not in SIGNATURE_FOR_LLM_INFERENCE_TASK:
132
+ raise MlflowException(
133
+ "Invalid task: {task} at `mlflow.dspy.save_model()` call. The task must be None or one "
134
+ f"of: {list(SIGNATURE_FOR_LLM_INFERENCE_TASK.keys())}",
135
+ error_code=INVALID_PARAMETER_VALUE,
136
+ )
137
+
138
+ if mlflow_model is None:
139
+ mlflow_model = Model()
140
+ if signature is not None:
141
+ mlflow_model.signature = signature
142
+ saved_example = None
143
+ if input_example is not None:
144
+ path = os.path.abspath(path)
145
+ _validate_and_prepare_target_save_path(path)
146
+ saved_example = _save_example(mlflow_model, input_example, path)
147
+ if metadata is not None:
148
+ mlflow_model.metadata = metadata
149
+
150
+ with _get_dependencies_schemas() as dependencies_schemas:
151
+ schema = dependencies_schemas.to_dict()
152
+ if schema is not None:
153
+ if mlflow_model.metadata is None:
154
+ mlflow_model.metadata = {}
155
+ mlflow_model.metadata.update(schema)
156
+
157
+ model_data_subpath = _MODEL_DATA_PATH
158
+ # Construct new data folder in existing path.
159
+ data_path = os.path.join(path, model_data_subpath)
160
+ os.makedirs(data_path, exist_ok=True)
161
+ # Set the model path to end with ".pkl" as we use cloudpickle for serialization.
162
+ model_subpath = os.path.join(model_data_subpath, _MODEL_SAVE_PATH) + ".pkl"
163
+ model_path = os.path.join(path, model_subpath)
164
+ # Dspy has a global context `dspy.settings`, and we need to save it along with the model.
165
+ dspy_settings = dict(dspy.settings.config)
166
+
167
+ # Don't save the trace in the model, which is only useful during the training phase.
168
+ dspy_settings.pop("trace", None)
169
+
170
+ # Store both dspy model and settings in `DspyChatModelWrapper` or `DspyModelWrapper` for
171
+ # serialization.
172
+ if task == "llm/v1/chat":
173
+ wrapped_dspy_model = DspyChatModelWrapper(model, dspy_settings, model_config)
174
+ else:
175
+ wrapped_dspy_model = DspyModelWrapper(model, dspy_settings, model_config)
176
+
177
+ flavor_options = {
178
+ "model_path": model_subpath,
179
+ }
180
+
181
+ if task:
182
+ if mlflow_model.signature is None:
183
+ mlflow_model.signature = SIGNATURE_FOR_LLM_INFERENCE_TASK[task]
184
+ flavor_options.update({_LLM_INFERENCE_TASK_KEY: task})
185
+ if mlflow_model.metadata:
186
+ mlflow_model.metadata[_METADATA_LLM_INFERENCE_TASK_KEY] = task
187
+ else:
188
+ mlflow_model.metadata = {_METADATA_LLM_INFERENCE_TASK_KEY: task}
189
+
190
+ if saved_example and mlflow_model.signature is None:
191
+ signature = _infer_signature_from_input_example(saved_example, wrapped_dspy_model)
192
+ mlflow_model.signature = signature
193
+
194
+ streamable = False
195
+ # Set the output schema to the model wrapper to use it for streaming
196
+ if mlflow_model.signature and mlflow_model.signature.outputs:
197
+ wrapped_dspy_model.output_schema = mlflow_model.signature.outputs
198
+ # DSPy streaming only supports string outputs.
199
+ if all(spec.type == DataType.string for spec in mlflow_model.signature.outputs):
200
+ streamable = True
201
+
202
+ with open(model_path, "wb") as f:
203
+ cloudpickle.dump(wrapped_dspy_model, f)
204
+
205
+ code_dir_subpath = _validate_and_copy_code_paths(code_paths, path)
206
+
207
+ # Add flavor info to `mlflow_model`.
208
+ mlflow_model.add_flavor(FLAVOR_NAME, code=code_dir_subpath, **flavor_options)
209
+ # Add loader_module, data and env data to `mlflow_model`.
210
+ pyfunc.add_to_model(
211
+ mlflow_model,
212
+ loader_module="mlflow.dspy",
213
+ code=code_dir_subpath,
214
+ conda_env=_CONDA_ENV_FILE_NAME,
215
+ python_env=_PYTHON_ENV_FILE_NAME,
216
+ streamable=streamable,
217
+ )
218
+
219
+ # Add model file size to `mlflow_model`.
220
+ if size := get_total_file_size(path):
221
+ mlflow_model.model_size_bytes = size
222
+
223
+ # Add resources if specified.
224
+ if resources is not None:
225
+ if isinstance(resources, (Path, str)):
226
+ serialized_resource = _ResourceBuilder.from_yaml_file(resources)
227
+ else:
228
+ serialized_resource = _ResourceBuilder.from_resources(resources)
229
+
230
+ mlflow_model.resources = serialized_resource
231
+
232
+ # Save mlflow_model to path/MLmodel.
233
+ mlflow_model.save(os.path.join(path, MLMODEL_FILE_NAME))
234
+
235
+ if conda_env is None:
236
+ if pip_requirements is None:
237
+ default_reqs = get_default_pip_requirements()
238
+ # To ensure `_load_pyfunc` can successfully load the model during the dependency
239
+ # inference, `mlflow_model.save` must be called beforehand to save an MLmodel file.
240
+ inferred_reqs = infer_pip_requirements(path, FLAVOR_NAME, fallback=default_reqs)
241
+ default_reqs = sorted(set(inferred_reqs).union(default_reqs))
242
+ else:
243
+ default_reqs = None
244
+ conda_env, pip_requirements, pip_constraints = _process_pip_requirements(
245
+ default_reqs,
246
+ pip_requirements,
247
+ extra_pip_requirements,
248
+ )
249
+ else:
250
+ conda_env, pip_requirements, pip_constraints = _process_conda_env(conda_env)
251
+
252
+ with open(os.path.join(path, _CONDA_ENV_FILE_NAME), "w") as f:
253
+ yaml.safe_dump(conda_env, stream=f, default_flow_style=False)
254
+
255
+ # Save `constraints.txt` if necessary.
256
+ if pip_constraints:
257
+ write_to(os.path.join(path, _CONSTRAINTS_FILE_NAME), "\n".join(pip_constraints))
258
+
259
+ # Save `requirements.txt`.
260
+ write_to(os.path.join(path, _REQUIREMENTS_FILE_NAME), "\n".join(pip_requirements))
261
+
262
+ _PythonEnv.current().to_yaml(os.path.join(path, _PYTHON_ENV_FILE_NAME))
263
+
264
+
265
+ @experimental(version="2.18.0")
266
+ @format_docstring(LOG_MODEL_PARAM_DOCS.format(package_name=FLAVOR_NAME))
267
+ @trace_disabled # Suppress traces for internal predict calls while logging model
268
+ def log_model(
269
+ dspy_model,
270
+ artifact_path: Optional[str] = None,
271
+ task: Optional[str] = None,
272
+ model_config: Optional[dict[str, Any]] = None,
273
+ code_paths: Optional[list[str]] = None,
274
+ conda_env: Optional[Union[list[str], str]] = None,
275
+ signature: Optional[ModelSignature] = None,
276
+ input_example: Optional[ModelInputExample] = None,
277
+ registered_model_name: Optional[str] = None,
278
+ await_registration_for: int = DEFAULT_AWAIT_MAX_SLEEP_SECONDS,
279
+ pip_requirements: Optional[Union[list[str], str]] = None,
280
+ extra_pip_requirements: Optional[Union[list[str], str]] = None,
281
+ metadata: Optional[dict[str, Any]] = None,
282
+ resources: Optional[Union[str, Path, list[Resource]]] = None,
283
+ prompts: Optional[list[Union[str, Prompt]]] = None,
284
+ name: Optional[str] = None,
285
+ params: Optional[dict[str, Any]] = None,
286
+ tags: Optional[dict[str, Any]] = None,
287
+ model_type: Optional[str] = None,
288
+ step: int = 0,
289
+ model_id: Optional[str] = None,
290
+ ):
291
+ """
292
+ Log a Dspy model along with metadata to MLflow.
293
+
294
+ This method saves a Dspy model along with metadata such as model signature and conda
295
+ environments to MLflow.
296
+
297
+ Args:
298
+ dspy_model: an instance of `dspy.Module`. The Dspy model to be saved.
299
+ artifact_path: Deprecated. Use `name` instead.
300
+ task: defaults to None. The task type of the model. Can only be `llm/v1/chat` or None for
301
+ now.
302
+ model_config: keyword arguments to be passed to the Dspy Module at instantiation.
303
+ code_paths: {{ code_paths }}
304
+ conda_env: {{ conda_env }}
305
+ signature: {{ signature }}
306
+ input_example: {{ input_example }}
307
+ registered_model_name: defaults to None. If set, create a model version under
308
+ `registered_model_name`, also create a registered model if one with the given name does
309
+ not exist.
310
+ await_registration_for: defaults to
311
+ `mlflow.tracking._model_registry.DEFAULT_AWAIT_MAX_SLEEP_SECONDS`. Number of
312
+ seconds to wait for the model version to finish being created and is in ``READY``
313
+ status. By default, the function waits for five minutes. Specify 0 or None to skip
314
+ waiting.
315
+ pip_requirements: {{ pip_requirements }}
316
+ extra_pip_requirements: {{ extra_pip_requirements }}
317
+ metadata: Custom metadata dictionary passed to the model and stored in the MLmodel
318
+ file.
319
+ resources: A list of model resources or a resources.yaml file containing a list of
320
+ resources required to serve the model.
321
+ prompts: {{ prompts }}
322
+ name: {{ name }}
323
+ params: {{ params }}
324
+ tags: {{ tags }}
325
+ model_type: {{ model_type }}
326
+ step: {{ step }}
327
+ model_id: {{ model_id }}
328
+
329
+ .. code-block:: python
330
+ :caption: Example
331
+
332
+ import dspy
333
+ import mlflow
334
+ from mlflow.models import ModelSignature
335
+ from mlflow.types.schema import ColSpec, Schema
336
+
337
+ # Set up the LM.
338
+ lm = dspy.LM(model="openai/gpt-4o-mini", max_tokens=250)
339
+ dspy.settings.configure(lm=lm)
340
+
341
+
342
+ class CoT(dspy.Module):
343
+ def __init__(self):
344
+ super().__init__()
345
+ self.prog = dspy.ChainOfThought("question -> answer")
346
+
347
+ def forward(self, question):
348
+ return self.prog(question=question)
349
+
350
+
351
+ dspy_model = CoT()
352
+
353
+ mlflow.set_tracking_uri("http://127.0.0.1:5000")
354
+ mlflow.set_experiment("test-dspy-logging")
355
+
356
+ from mlflow.dspy import log_model
357
+
358
+ input_schema = Schema([ColSpec("string")])
359
+ output_schema = Schema([ColSpec("string")])
360
+ signature = ModelSignature(inputs=input_schema, outputs=output_schema)
361
+
362
+ with mlflow.start_run():
363
+ log_model(
364
+ dspy_model,
365
+ "model",
366
+ input_example="what is 2 + 2?",
367
+ signature=signature,
368
+ )
369
+ """
370
+ return Model.log(
371
+ artifact_path=artifact_path,
372
+ name=name,
373
+ flavor=mlflow.dspy,
374
+ model=dspy_model,
375
+ task=task,
376
+ model_config=model_config,
377
+ code_paths=code_paths,
378
+ conda_env=conda_env,
379
+ registered_model_name=registered_model_name,
380
+ signature=signature,
381
+ input_example=input_example,
382
+ await_registration_for=await_registration_for,
383
+ pip_requirements=pip_requirements,
384
+ extra_pip_requirements=extra_pip_requirements,
385
+ metadata=metadata,
386
+ resources=resources,
387
+ prompts=prompts,
388
+ params=params,
389
+ tags=tags,
390
+ model_type=model_type,
391
+ step=step,
392
+ model_id=model_id,
393
+ )
mlflow/dspy/util.py ADDED
@@ -0,0 +1,109 @@
1
+ import logging
2
+ import tempfile
3
+ from collections import defaultdict
4
+ from pathlib import Path
5
+ from typing import Any, Optional
6
+
7
+ from dspy import Example
8
+
9
+ import mlflow
10
+
11
+ _logger = logging.getLogger(__name__)
12
+
13
+
14
+ def save_dspy_module_state(program, file_name: str = "model.json"):
15
+ """
16
+ Save states of dspy `Module` to a temporary directory and log it as an artifact.
17
+
18
+ Args:
19
+ program: The dspy `Module` to be saved.
20
+ file_name: The name of the file to save the dspy module state. Default is `model.json`.
21
+ """
22
+ try:
23
+ with tempfile.TemporaryDirectory() as tmp_dir:
24
+ path = Path(tmp_dir, file_name)
25
+ program.save(path)
26
+ mlflow.log_artifact(path)
27
+ except Exception as e:
28
+ _logger.warning(f"Failed to save dspy module state: {e}")
29
+
30
+
31
+ def log_dspy_module_params(program):
32
+ """
33
+ Log the parameters of the dspy `Module` as run parameters.
34
+
35
+ Args:
36
+ program: The dspy `Module` to be logged.
37
+ """
38
+ try:
39
+ states = program.dump_state()
40
+ flat_state_dict = _flatten_dspy_module_state(
41
+ states, exclude_keys=("metadata", "lm", "traces", "train")
42
+ )
43
+ mlflow.log_params(
44
+ {f"{program.__class__.__name__}.{k}": v for k, v in flat_state_dict.items()}
45
+ )
46
+ except Exception as e:
47
+ _logger.warning(f"Failed to log dspy module params: {e}")
48
+
49
+
50
+ def log_dspy_dataset(dataset: list["Example"], file_name: str):
51
+ """
52
+ Log the DSPy dataset as a table.
53
+
54
+ Args:
55
+ dataset: The dataset to be logged.
56
+ file_name: The name of the file to save the dataset.
57
+ """
58
+ result = defaultdict(list)
59
+ try:
60
+ for example in dataset:
61
+ for k, v in example.items():
62
+ result[k].append(v)
63
+ mlflow.log_table(result, file_name)
64
+ except Exception as e:
65
+ _logger.warning(f"Failed to log dataset: {e}")
66
+
67
+
68
+ def _flatten_dspy_module_state(
69
+ d, parent_key="", sep=".", exclude_keys: Optional[set[str]] = None
70
+ ) -> dict[str, Any]:
71
+ """
72
+ Flattens a nested dictionary and accumulates the key names.
73
+
74
+ Args:
75
+ d: The dictionary or list to flatten.
76
+ parent_key: The base key used in recursion. Defaults to "".
77
+ sep: Separator for nested keys. Defaults to '.'.
78
+ exclude_keys: Keys to exclude from the flattened dictionary. Defaults to ().
79
+
80
+ Returns:
81
+ dict: A flattened dictionary with accumulated keys.
82
+
83
+ Example:
84
+ >>> _flatten_dspy_module_state({"a": {"b": [5, 6]}})
85
+ {'a.b.0': 5, 'a.b.1': 6}
86
+ """
87
+ items: dict[str, Any] = {}
88
+
89
+ if isinstance(d, dict):
90
+ for k, v in d.items():
91
+ if exclude_keys and k in exclude_keys:
92
+ continue
93
+ new_key = f"{parent_key}{sep}{k}" if parent_key else k
94
+ if isinstance(v, Example):
95
+ # Don't flatten Example objects further even if it has dict or list values
96
+ v = {key: str(value) for key, value in v.items()}
97
+ items.update(_flatten_dspy_module_state(v, new_key, sep))
98
+ elif isinstance(d, list):
99
+ for i, v in enumerate(d):
100
+ new_key = f"{parent_key}{sep}{i}" if parent_key else str(i)
101
+ if isinstance(v, Example):
102
+ # Don't flatten Example objects further even if it has dict or list values
103
+ v = {key: str(value) for key, value in v.items()}
104
+ items.update(_flatten_dspy_module_state(v, new_key, sep))
105
+ else:
106
+ if d is not None:
107
+ items[parent_key] = d
108
+
109
+ return items