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,527 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import re
5
+ import warnings
6
+ from pathlib import Path
7
+ from typing import TYPE_CHECKING, Union
8
+
9
+ import cloudpickle
10
+ import yaml
11
+
12
+ from mlflow.exceptions import MlflowException
13
+ from mlflow.langchain.utils.logging import (
14
+ _BASE_LOAD_KEY,
15
+ _CONFIG_LOAD_KEY,
16
+ _MODEL_DATA_FOLDER_NAME,
17
+ _MODEL_DATA_KEY,
18
+ _MODEL_DATA_PKL_FILE_NAME,
19
+ _MODEL_DATA_YAML_FILE_NAME,
20
+ _MODEL_LOAD_KEY,
21
+ _MODEL_TYPE_KEY,
22
+ _PICKLE_LOAD_KEY,
23
+ _RUNNABLE_LOAD_KEY,
24
+ _load_base_lcs,
25
+ _load_from_json,
26
+ _load_from_pickle,
27
+ _load_from_yaml,
28
+ _patch_loader,
29
+ _save_base_lcs,
30
+ _validate_and_prepare_lc_model_or_path,
31
+ base_lc_types,
32
+ custom_type_to_loader_dict,
33
+ get_unsupported_model_message,
34
+ lc_runnable_assign_types,
35
+ lc_runnable_binding_types,
36
+ lc_runnable_branch_types,
37
+ lc_runnable_with_steps_types,
38
+ lc_runnables_types,
39
+ patch_langchain_type_to_cls_dict,
40
+ picklable_runnable_types,
41
+ )
42
+
43
+ if TYPE_CHECKING:
44
+ from langchain.schema.runnable import Runnable
45
+
46
+ _STEPS_FOLDER_NAME = "steps"
47
+ _RUNNABLE_STEPS_FILE_NAME = "steps.yaml"
48
+ _BRANCHES_FOLDER_NAME = "branches"
49
+ _MAPPER_FOLDER_NAME = "mapper"
50
+ _RUNNABLE_BRANCHES_FILE_NAME = "branches.yaml"
51
+ _DEFAULT_BRANCH_NAME = "default"
52
+ _RUNNABLE_BINDING_CONF_FILE_NAME = "binding_conf.yaml"
53
+
54
+
55
+ @patch_langchain_type_to_cls_dict
56
+ def _load_model_from_config(path, model_config):
57
+ from langchain.chains.loading import type_to_loader_dict as chains_type_to_loader_dict
58
+ from langchain.llms import get_type_to_cls_dict as llms_get_type_to_cls_dict
59
+
60
+ try:
61
+ from langchain.prompts.loading import type_to_loader_dict as prompts_types
62
+ except ImportError:
63
+ prompts_types = {"prompt", "few_shot_prompt"}
64
+
65
+ config_path = os.path.join(path, model_config.get(_MODEL_DATA_KEY, _MODEL_DATA_YAML_FILE_NAME))
66
+ # Load runnables from config file
67
+ if config_path.endswith(".yaml"):
68
+ config = _load_from_yaml(config_path)
69
+ elif config_path.endswith(".json"):
70
+ config = _load_from_json(config_path)
71
+ else:
72
+ raise MlflowException(
73
+ f"Cannot load runnable without a config file. Got path {config_path}."
74
+ )
75
+ _type = config.get("_type")
76
+ if _type in chains_type_to_loader_dict:
77
+ from langchain.chains.loading import load_chain
78
+
79
+ return _patch_loader(load_chain)(config_path)
80
+ elif _type in prompts_types:
81
+ from langchain.prompts.loading import load_prompt
82
+
83
+ return load_prompt(config_path)
84
+ elif _type in llms_get_type_to_cls_dict():
85
+ from langchain_community.llms.loading import load_llm
86
+
87
+ return _patch_loader(load_llm)(config_path)
88
+ elif _type in custom_type_to_loader_dict():
89
+ return custom_type_to_loader_dict()[_type](config)
90
+ raise MlflowException(f"Unsupported type {_type} for loading.")
91
+
92
+
93
+ def _load_model_from_path(path: str, model_config=None):
94
+ model_load_fn = model_config.get(_MODEL_LOAD_KEY)
95
+ if model_load_fn == _RUNNABLE_LOAD_KEY:
96
+ return _load_runnables(path, model_config)
97
+ if model_load_fn == _BASE_LOAD_KEY:
98
+ return _load_base_lcs(path, model_config)
99
+ if model_load_fn == _CONFIG_LOAD_KEY:
100
+ return _load_model_from_config(path, model_config)
101
+ if model_load_fn == _PICKLE_LOAD_KEY:
102
+ return _load_from_pickle(os.path.join(path, model_config.get(_MODEL_DATA_KEY)))
103
+ raise MlflowException(f"Unsupported model load key {model_load_fn}")
104
+
105
+
106
+ def _validate_path(file_path: Union[str, Path]):
107
+ load_path = Path(file_path)
108
+ if not load_path.exists() or not load_path.is_dir():
109
+ raise MlflowException(
110
+ f"Path {load_path} must be an existing directory in order to load model."
111
+ )
112
+ return load_path
113
+
114
+
115
+ def _load_runnable_with_steps(file_path: Union[Path, str], model_type: str):
116
+ """Load the model
117
+
118
+ Args:
119
+ file_path: Path to file to load the model from.
120
+ model_type: Type of the model to load.
121
+ """
122
+ from langchain.schema.runnable import RunnableParallel, RunnableSequence
123
+
124
+ load_path = _validate_path(file_path)
125
+
126
+ steps_conf_file = load_path / _RUNNABLE_STEPS_FILE_NAME
127
+ if not steps_conf_file.exists():
128
+ raise MlflowException(
129
+ f"File {steps_conf_file} must exist in order to load runnable with steps."
130
+ )
131
+ steps_conf = _load_from_yaml(steps_conf_file)
132
+ steps_path = load_path / _STEPS_FOLDER_NAME
133
+ _validate_path(steps_path)
134
+
135
+ steps = {}
136
+ # ignore hidden files
137
+ for step in (f for f in os.listdir(steps_path) if not f.startswith(".")):
138
+ config = steps_conf.get(step)
139
+ # load model from the folder of the step
140
+ runnable = _load_model_from_path(os.path.join(steps_path, step), config)
141
+ steps[step] = runnable
142
+
143
+ if model_type == RunnableSequence.__name__:
144
+ steps = [value for _, value in sorted(steps.items(), key=lambda item: int(item[0]))]
145
+ return runnable_sequence_from_steps(steps)
146
+ if model_type == RunnableParallel.__name__:
147
+ return RunnableParallel(steps)
148
+
149
+
150
+ def runnable_sequence_from_steps(steps):
151
+ """Construct a RunnableSequence from steps.
152
+
153
+ Args:
154
+ steps: List of steps to construct the RunnableSequence from.
155
+ """
156
+ from langchain.schema.runnable import RunnableSequence
157
+
158
+ if len(steps) < 2:
159
+ raise ValueError(f"RunnableSequence must have at least 2 steps, got {len(steps)}.")
160
+
161
+ first, *middle, last = steps
162
+ return RunnableSequence(first=first, middle=middle, last=last)
163
+
164
+
165
+ def _load_runnable_branch(file_path: Union[Path, str]):
166
+ """Load the model
167
+
168
+ Args:
169
+ file_path: Path to file to load the model from.
170
+ """
171
+ from langchain.schema.runnable import RunnableBranch
172
+
173
+ load_path = _validate_path(file_path)
174
+
175
+ branches_conf_file = load_path / _RUNNABLE_BRANCHES_FILE_NAME
176
+ if not branches_conf_file.exists():
177
+ raise MlflowException(
178
+ f"File {branches_conf_file} must exist in order to load runnable with steps."
179
+ )
180
+ branches_conf = _load_from_yaml(branches_conf_file)
181
+ branches_path = load_path / _BRANCHES_FOLDER_NAME
182
+ _validate_path(branches_path)
183
+
184
+ branches = []
185
+ for branch in os.listdir(branches_path):
186
+ # load model from the folder of the branch
187
+ if branch == _DEFAULT_BRANCH_NAME:
188
+ default_branch_path = branches_path / _DEFAULT_BRANCH_NAME
189
+ default = _load_model_from_path(
190
+ default_branch_path, branches_conf.get(_DEFAULT_BRANCH_NAME)
191
+ )
192
+ else:
193
+ branch_tuple = []
194
+ for i in range(2):
195
+ config = branches_conf.get(f"{branch}-{i}")
196
+ runnable = _load_model_from_path(
197
+ os.path.join(branches_path, branch, str(i)), config
198
+ )
199
+ branch_tuple.append(runnable)
200
+ branches.append(tuple(branch_tuple))
201
+
202
+ # default branch must be the last branch
203
+ branches.append(default)
204
+
205
+ return RunnableBranch(*branches)
206
+
207
+
208
+ def _load_runnable_assign(file_path: Union[Path, str]):
209
+ """Load the model
210
+
211
+ Args:
212
+ file_path: Path to file to load the model from.
213
+ """
214
+ from langchain.schema.runnable.passthrough import RunnableAssign
215
+
216
+ load_path = _validate_path(file_path)
217
+
218
+ mapper_file = load_path / _MAPPER_FOLDER_NAME
219
+ _validate_path(mapper_file)
220
+ mapper = _load_runnable_with_steps(mapper_file, "RunnableParallel")
221
+ return RunnableAssign(mapper)
222
+
223
+
224
+ def _load_runnable_binding(file_path: Union[Path, str]):
225
+ """
226
+ Load runnable binding model from the path
227
+ """
228
+ from langchain.schema.runnable import RunnableBinding
229
+
230
+ load_path = _validate_path(file_path)
231
+
232
+ model_conf = _load_from_yaml(load_path / _RUNNABLE_BINDING_CONF_FILE_NAME)
233
+ for field, value in model_conf.items():
234
+ if _is_json_primitive(value):
235
+ model_conf[field] = value
236
+ # value is dictionary
237
+ else:
238
+ model_conf[field] = _load_model_from_path(load_path, value)
239
+ return RunnableBinding(**model_conf)
240
+
241
+
242
+ def _save_internal_runnables(runnable, path, loader_fn, persist_dir):
243
+ conf = {}
244
+ if isinstance(runnable, lc_runnables_types()):
245
+ conf[_MODEL_TYPE_KEY] = runnable.__class__.__name__
246
+ conf.update(_save_runnables(runnable, path, loader_fn, persist_dir))
247
+ elif isinstance(runnable, base_lc_types()):
248
+ lc_model = _validate_and_prepare_lc_model_or_path(runnable, loader_fn)
249
+ conf[_MODEL_TYPE_KEY] = lc_model.__class__.__name__
250
+ conf.update(_save_base_lcs(lc_model, path, loader_fn, persist_dir))
251
+ else:
252
+ conf = {
253
+ _MODEL_TYPE_KEY: runnable.__class__.__name__,
254
+ _MODEL_DATA_KEY: _MODEL_DATA_YAML_FILE_NAME,
255
+ _MODEL_LOAD_KEY: _CONFIG_LOAD_KEY,
256
+ }
257
+ model_path = path / _MODEL_DATA_YAML_FILE_NAME
258
+
259
+ _warning_if_imported_from_lc_partner_pkg(runnable)
260
+
261
+ # Save some simple runnables that langchain natively supports.
262
+ if hasattr(runnable, "save"):
263
+ runnable.save(model_path)
264
+ elif hasattr(runnable, "dict"):
265
+ runnable_dict = runnable.dict()
266
+ with open(model_path, "w") as f:
267
+ yaml.dump(runnable_dict, f, default_flow_style=False)
268
+ # if the model cannot be loaded back, then `dict` is not enough for saving.
269
+ _load_model_from_config(path, conf)
270
+ else:
271
+ raise Exception("Cannot save runnable without `save` or `dict` methods.")
272
+ return conf
273
+
274
+
275
+ _LC_PARTNER_MODULE_PATTERN = re.compile(
276
+ r"langchain_(?!core|community|experimental|cli|text-splitters)([a-z0-9-]+)$"
277
+ )
278
+
279
+
280
+ def _warning_if_imported_from_lc_partner_pkg(runnable):
281
+ """
282
+ Issues a warning if the model contains LangChain partner packages in its requirements.
283
+
284
+ Popular integrations like OpenAI have been migrated from the central langchain-community
285
+ package to their own partner packages (e.g. langchain-openai). However, the class loading
286
+ mechanism in MLflow does not handle partner packages and always loads the community version.
287
+ This can lead to unexpected behavior because the community version is no longer maintained.
288
+ """
289
+ module = runnable.__module__
290
+ root_module = module.split(".")[0]
291
+ if m := _LC_PARTNER_MODULE_PATTERN.match(root_module):
292
+ warnings.warn(
293
+ "Your model contains a class imported from the LangChain partner package "
294
+ f"`langchain-{m.group(1)}`. When loading the model back, MLflow will use the "
295
+ "community version of the classes instead of the partner packages, which may "
296
+ "lead to unexpected behavior. To ensure that the model is loaded correctly, "
297
+ "it is recommended to save the model with the 'model-from-code' method "
298
+ "instead: https://mlflow.org/docs/latest/models.html#models-from-code"
299
+ )
300
+
301
+
302
+ def _save_runnable_with_steps(model, file_path: Union[Path, str], loader_fn=None, persist_dir=None): # noqa: D417
303
+ """Save the model with steps. Currently it supports saving RunnableSequence and
304
+ RunnableParallel.
305
+
306
+ If saving a RunnableSequence, steps is a list of Runnable objects. We save each step to the
307
+ subfolder named by the step index.
308
+ e.g. - model
309
+ - steps
310
+ - 0
311
+ - model.yaml
312
+ - 1
313
+ - model.pkl
314
+ - steps.yaml
315
+ If saving a RunnableParallel, steps is a dictionary of key-Runnable pairs. We save each step to
316
+ the subfolder named by the key.
317
+ e.g. - model
318
+ - steps
319
+ - context
320
+ - model.yaml
321
+ - question
322
+ - model.pkl
323
+ - steps.yaml
324
+
325
+ We save steps.yaml file to the model folder. It contains each step's model's configuration.
326
+
327
+ Args:
328
+ model: Runnable to be saved.
329
+ file_path: Path to file to save the model to.
330
+ """
331
+ # Convert file to Path object.
332
+ save_path = Path(file_path)
333
+ save_path.mkdir(parents=True, exist_ok=True)
334
+
335
+ # Save steps into a folder
336
+ steps_path = save_path / _STEPS_FOLDER_NAME
337
+ steps_path.mkdir()
338
+
339
+ steps = get_runnable_steps(model)
340
+ if isinstance(steps, list):
341
+ generator = enumerate(steps)
342
+ elif isinstance(steps, dict):
343
+ generator = steps.items()
344
+ else:
345
+ raise MlflowException(
346
+ f"Runnable {model} steps attribute must be either a list or a dictionary. "
347
+ f"Got {type(steps).__name__}."
348
+ )
349
+ unsaved_runnables = {}
350
+ steps_conf = {}
351
+ for key, runnable in generator:
352
+ step = str(key)
353
+ # Save each step into a subfolder named by step
354
+ save_runnable_path = steps_path / step
355
+ save_runnable_path.mkdir()
356
+ try:
357
+ steps_conf[step] = _save_internal_runnables(
358
+ runnable, save_runnable_path, loader_fn, persist_dir
359
+ )
360
+ except Exception as e:
361
+ unsaved_runnables[step] = f"{runnable.get_name()} -- {e}"
362
+
363
+ if unsaved_runnables:
364
+ raise MlflowException(f"Failed to save runnable sequence: {unsaved_runnables}.")
365
+
366
+ # save steps configs
367
+ with save_path.joinpath(_RUNNABLE_STEPS_FILE_NAME).open("w") as f:
368
+ yaml.dump(steps_conf, f, default_flow_style=False)
369
+
370
+
371
+ def _save_runnable_branch(model, file_path, loader_fn, persist_dir):
372
+ """
373
+ Save runnable branch in to path.
374
+ """
375
+ save_path = Path(file_path)
376
+ save_path.mkdir(parents=True, exist_ok=True)
377
+ # save branches into a folder
378
+ branches_path = save_path / _BRANCHES_FOLDER_NAME
379
+ branches_path.mkdir()
380
+
381
+ unsaved_runnables = {}
382
+ branches_conf = {}
383
+ for index, branch_tuple in enumerate(model.branches):
384
+ # Save each branch into a subfolder named by index
385
+ # and save condition and runnable into subfolder
386
+ for i, runnable in enumerate(branch_tuple):
387
+ save_runnable_path = branches_path / str(index) / str(i)
388
+ save_runnable_path.mkdir(parents=True)
389
+ branches_conf[f"{index}-{i}"] = {}
390
+
391
+ try:
392
+ branches_conf[f"{index}-{i}"] = _save_internal_runnables(
393
+ runnable, save_runnable_path, loader_fn, persist_dir
394
+ )
395
+ except Exception as e:
396
+ unsaved_runnables[f"{index}-{i}"] = f"{runnable.get_name()} -- {e}"
397
+
398
+ # save default branch
399
+ default_branch_path = branches_path / _DEFAULT_BRANCH_NAME
400
+ default_branch_path.mkdir()
401
+ try:
402
+ branches_conf[_DEFAULT_BRANCH_NAME] = _save_internal_runnables(
403
+ model.default, default_branch_path, loader_fn, persist_dir
404
+ )
405
+ except Exception as e:
406
+ unsaved_runnables[_DEFAULT_BRANCH_NAME] = f"{model.default.get_name()} -- {e}"
407
+ if unsaved_runnables:
408
+ raise MlflowException(f"Failed to save runnable branch: {unsaved_runnables}.")
409
+
410
+ # save branches configs
411
+ with save_path.joinpath(_RUNNABLE_BRANCHES_FILE_NAME).open("w") as f:
412
+ yaml.dump(branches_conf, f, default_flow_style=False)
413
+
414
+
415
+ def _save_runnable_assign(model, file_path, loader_fn=None, persist_dir=None):
416
+ from langchain.schema.runnable import RunnableParallel
417
+
418
+ save_path = Path(file_path)
419
+ save_path.mkdir(parents=True, exist_ok=True)
420
+ # save mapper into a folder
421
+ mapper_path = save_path / _MAPPER_FOLDER_NAME
422
+ mapper_path.mkdir()
423
+
424
+ if not isinstance(model.mapper, RunnableParallel):
425
+ raise MlflowException(
426
+ f"Failed to save model {model} with type {model.__class__.__name__}. "
427
+ "RunnableAssign's mapper must be a RunnableParallel."
428
+ )
429
+ _save_runnable_with_steps(model.mapper, mapper_path, loader_fn, persist_dir)
430
+
431
+
432
+ def _is_json_primitive(value):
433
+ return (
434
+ value is None
435
+ or isinstance(value, (str, int, float, bool))
436
+ or (isinstance(value, list) and all(_is_json_primitive(v) for v in value))
437
+ )
438
+
439
+
440
+ def _save_runnable_binding(model, file_path, loader_fn=None, persist_dir=None):
441
+ save_path = Path(file_path)
442
+ save_path.mkdir(parents=True, exist_ok=True)
443
+ model_config = {}
444
+
445
+ # runnableBinding bound is the real runnable to be invoked
446
+ model_config["bound"] = _save_internal_runnables(model.bound, save_path, loader_fn, persist_dir)
447
+
448
+ # save other fields
449
+ for field, value in model.dict().items():
450
+ if _is_json_primitive(value):
451
+ model_config[field] = value
452
+ elif field != "bound":
453
+ model_config[field] = {
454
+ _MODEL_LOAD_KEY: _PICKLE_LOAD_KEY,
455
+ _MODEL_DATA_KEY: f"{field}.pkl",
456
+ }
457
+ _pickle_object(value, os.path.join(save_path, f"{field}.pkl"))
458
+
459
+ # save fields configs
460
+ with save_path.joinpath(_RUNNABLE_BINDING_CONF_FILE_NAME).open("w") as f:
461
+ yaml.dump(model_config, f, default_flow_style=False)
462
+
463
+
464
+ def _pickle_object(model, path: str):
465
+ if not path.endswith(".pkl"):
466
+ raise ValueError(f"File path must end with .pkl, got {path}.")
467
+ with open(path, "wb") as f:
468
+ cloudpickle.dump(model, f)
469
+
470
+
471
+ def _save_runnables(model, path, loader_fn=None, persist_dir=None):
472
+ model_data_kwargs = {
473
+ _MODEL_LOAD_KEY: _RUNNABLE_LOAD_KEY,
474
+ _MODEL_TYPE_KEY: model.__class__.__name__,
475
+ }
476
+ if isinstance(model, lc_runnable_with_steps_types()):
477
+ model_data_path = _MODEL_DATA_FOLDER_NAME
478
+ _save_runnable_with_steps(
479
+ model, os.path.join(path, model_data_path), loader_fn, persist_dir
480
+ )
481
+ elif isinstance(model, picklable_runnable_types()):
482
+ model_data_path = _MODEL_DATA_PKL_FILE_NAME
483
+ _pickle_object(model, os.path.join(path, model_data_path))
484
+ elif isinstance(model, lc_runnable_branch_types()):
485
+ model_data_path = _MODEL_DATA_FOLDER_NAME
486
+ _save_runnable_branch(model, os.path.join(path, model_data_path), loader_fn, persist_dir)
487
+ elif isinstance(model, lc_runnable_assign_types()):
488
+ model_data_path = _MODEL_DATA_FOLDER_NAME
489
+ _save_runnable_assign(model, os.path.join(path, model_data_path), loader_fn, persist_dir)
490
+ elif isinstance(model, lc_runnable_binding_types()):
491
+ model_data_path = _MODEL_DATA_FOLDER_NAME
492
+ _save_runnable_binding(model, os.path.join(path, model_data_path), loader_fn, persist_dir)
493
+ else:
494
+ raise MlflowException.invalid_parameter_value(
495
+ get_unsupported_model_message(type(model).__name__)
496
+ )
497
+ model_data_kwargs[_MODEL_DATA_KEY] = model_data_path
498
+ return model_data_kwargs
499
+
500
+
501
+ def _load_runnables(path, conf):
502
+ model_type = conf.get(_MODEL_TYPE_KEY)
503
+ model_data = conf.get(_MODEL_DATA_KEY, _MODEL_DATA_YAML_FILE_NAME)
504
+ if model_type in (x.__name__ for x in lc_runnable_with_steps_types()):
505
+ return _load_runnable_with_steps(os.path.join(path, model_data), model_type)
506
+ if (
507
+ model_type in (x.__name__ for x in picklable_runnable_types())
508
+ or model_data == _MODEL_DATA_PKL_FILE_NAME
509
+ ):
510
+ return _load_from_pickle(os.path.join(path, model_data))
511
+ if model_type in (x.__name__ for x in lc_runnable_branch_types()):
512
+ return _load_runnable_branch(os.path.join(path, model_data))
513
+ if model_type in (x.__name__ for x in lc_runnable_assign_types()):
514
+ return _load_runnable_assign(os.path.join(path, model_data))
515
+ if model_type in (x.__name__ for x in lc_runnable_binding_types()):
516
+ return _load_runnable_binding(os.path.join(path, model_data))
517
+ raise MlflowException.invalid_parameter_value(get_unsupported_model_message(model_type))
518
+
519
+
520
+ def get_runnable_steps(model: Runnable):
521
+ try:
522
+ return model.steps
523
+ except AttributeError:
524
+ # RunnableParallel stores steps as `steps__` attribute since version 0.16.0, while it was
525
+ # stored as `steps` attribute before that and other runnables like RunnableSequence still
526
+ # has `steps` property.
527
+ return model.steps__