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,55 @@
1
+ from mlflow.llama_index.constant import FLAVOR_NAME
2
+ from mlflow.utils.annotations import experimental
3
+ from mlflow.utils.autologging_utils import autologging_integration
4
+
5
+
6
+ @experimental(version="2.15.0")
7
+ def autolog(
8
+ log_traces: bool = True,
9
+ disable: bool = False,
10
+ silent: bool = False,
11
+ ):
12
+ """
13
+ Enables (or disables) and configures autologging from LlamaIndex to MLflow. Currently, MLflow
14
+ only supports autologging for tracing.
15
+
16
+ Args:
17
+ log_traces: If ``True``, traces are logged for LlamaIndex models by using. If ``False``,
18
+ no traces are collected during inference. Default to ``True``.
19
+ disable: If ``True``, disables the LlamaIndex autologging integration. If ``False``,
20
+ enables the LlamaIndex autologging integration.
21
+ silent: If ``True``, suppress all event logs and warnings from MLflow during LlamaIndex
22
+ autologging. If ``False``, show all events and warnings.
23
+ """
24
+ from mlflow.llama_index.tracer import remove_llama_index_tracer, set_llama_index_tracer
25
+
26
+ # NB: The @autologging_integration annotation is used for adding shared logic. However, one
27
+ # caveat is that the wrapped function is NOT executed when disable=True is passed. This prevents
28
+ # us from running cleaning up logging when autologging is turned off. To workaround this, we
29
+ # annotate _autolog() instead of this entrypoint, and define the cleanup logic outside it.
30
+ # TODO: since this implementation is inconsistent, explore a universal way to solve the issue.
31
+ if log_traces and not disable:
32
+ set_llama_index_tracer()
33
+ else:
34
+ remove_llama_index_tracer()
35
+
36
+ _autolog(
37
+ log_traces=log_traces,
38
+ disable=disable,
39
+ silent=silent,
40
+ )
41
+
42
+
43
+ # This is required by mlflow.autolog()
44
+ autolog.integration_name = FLAVOR_NAME
45
+
46
+
47
+ @autologging_integration(FLAVOR_NAME)
48
+ def _autolog(
49
+ log_traces: bool,
50
+ disable: bool = False,
51
+ silent: bool = False,
52
+ ):
53
+ """
54
+ TODO: Implement patching logic for autologging models and artifacts.
55
+ """
@@ -0,0 +1,43 @@
1
+ from llama_index.core.base.llms.types import ChatMessage as LLamaChatMessage
2
+ from llama_index.core.instrumentation.events import BaseEvent
3
+ from llama_index.core.instrumentation.events.llm import (
4
+ LLMChatEndEvent,
5
+ LLMChatStartEvent,
6
+ LLMCompletionEndEvent,
7
+ LLMCompletionStartEvent,
8
+ )
9
+
10
+ # llama-index includes llama-index-llms-openai in its requirements
11
+ # https://github.com/run-llama/llama_index/blob/663e1700f58c2414e549b9f5005abe87a275dd77/pyproject.toml#L52
12
+ from llama_index.llms.openai.utils import to_openai_message_dict
13
+
14
+ from mlflow.types.chat import ChatMessage
15
+ from mlflow.utils.pydantic_utils import model_dump_compat
16
+
17
+
18
+ def get_chat_messages_from_event(event: BaseEvent) -> list[ChatMessage]:
19
+ """
20
+ Extract chat messages from the LlamaIndex callback event.
21
+ """
22
+ if isinstance(event, LLMCompletionStartEvent):
23
+ return [ChatMessage(role="user", content=event.prompt)]
24
+ elif isinstance(event, LLMCompletionEndEvent):
25
+ return [ChatMessage(role="assistant", content=event.response.text)]
26
+ elif isinstance(event, LLMChatStartEvent):
27
+ return [_convert_message_to_mlflow_chat(msg) for msg in event.messages]
28
+ elif isinstance(event, LLMChatEndEvent):
29
+ message = event.response.message
30
+ return [_convert_message_to_mlflow_chat(message)]
31
+
32
+ raise ValueError(f"Unsupported event type for chat attribute extraction: {type(event)}")
33
+
34
+
35
+ def _convert_message_to_mlflow_chat(message: LLamaChatMessage) -> ChatMessage:
36
+ """Convert a message object from LlamaIndex to MLflow's standard format."""
37
+ message = to_openai_message_dict(message, drop_none=False)
38
+
39
+ # tool calls are pydantic models in llama-index
40
+ if tool_calls := message.get("tool_calls"):
41
+ message["tool_calls"] = [model_dump_compat(tool) for tool in tool_calls]
42
+
43
+ return ChatMessage.validate_compat(message)
@@ -0,0 +1 @@
1
+ FLAVOR_NAME = "llama_index"
@@ -0,0 +1,577 @@
1
+ import logging
2
+ import os
3
+ import tempfile
4
+ from typing import Any, Optional, Union
5
+
6
+ import yaml
7
+
8
+ import mlflow
9
+ from mlflow import pyfunc
10
+ from mlflow.entities.model_registry.prompt import Prompt
11
+ from mlflow.exceptions import MlflowException
12
+ from mlflow.llama_index.constant import FLAVOR_NAME
13
+ from mlflow.llama_index.pyfunc_wrapper import create_pyfunc_wrapper
14
+ from mlflow.models import Model, ModelInputExample, ModelSignature
15
+ from mlflow.models.model import (
16
+ MLMODEL_FILE_NAME,
17
+ MODEL_CODE_PATH,
18
+ MODEL_CONFIG,
19
+ _update_active_model_id_based_on_mlflow_model,
20
+ )
21
+ from mlflow.models.signature import _infer_signature_from_input_example
22
+ from mlflow.models.utils import (
23
+ _load_model_code_path,
24
+ _save_example,
25
+ _validate_and_get_model_code_path,
26
+ )
27
+ from mlflow.tracing.provider import trace_disabled
28
+ from mlflow.tracking._model_registry import DEFAULT_AWAIT_MAX_SLEEP_SECONDS
29
+ from mlflow.tracking.artifact_utils import _download_artifact_from_uri
30
+ from mlflow.utils.annotations import experimental
31
+ from mlflow.utils.docstring_utils import LOG_MODEL_PARAM_DOCS, format_docstring
32
+ from mlflow.utils.environment import (
33
+ _CONDA_ENV_FILE_NAME,
34
+ _CONSTRAINTS_FILE_NAME,
35
+ _PYTHON_ENV_FILE_NAME,
36
+ _REQUIREMENTS_FILE_NAME,
37
+ _mlflow_conda_env,
38
+ _process_conda_env,
39
+ _process_pip_requirements,
40
+ _PythonEnv,
41
+ _validate_env_arguments,
42
+ )
43
+ from mlflow.utils.file_utils import get_total_file_size, write_to
44
+ from mlflow.utils.model_utils import (
45
+ _add_code_from_conf_to_system_path,
46
+ _get_flavor_configuration,
47
+ _validate_and_copy_code_paths,
48
+ _validate_and_copy_file_to_directory,
49
+ _validate_and_get_model_config_from_file,
50
+ _validate_and_prepare_target_save_path,
51
+ )
52
+ from mlflow.utils.requirements_utils import _get_pinned_requirement
53
+
54
+ _INDEX_PERSIST_FOLDER = "index"
55
+ _SETTINGS_FILE = "settings.json"
56
+
57
+
58
+ _logger = logging.getLogger(__name__)
59
+
60
+
61
+ def get_default_pip_requirements():
62
+ """
63
+ Returns:
64
+ A list of default pip requirements for MLflow Models produced by this flavor.
65
+ Calls to :func:`save_model()` and :func:`log_model()` produce a pip environment
66
+ that, at a minimum, contains these requirements.
67
+ """
68
+ return [_get_pinned_requirement("llama-index")]
69
+
70
+
71
+ def get_default_conda_env():
72
+ """
73
+ Returns:
74
+ The default Conda environment for MLflow Models produced by calls to
75
+ :func:`save_model()` and :func:`log_model()`.
76
+ """
77
+ return _mlflow_conda_env(additional_pip_deps=get_default_pip_requirements())
78
+
79
+
80
+ def _validate_engine_type(engine_type: str):
81
+ from mlflow.llama_index.pyfunc_wrapper import SUPPORTED_ENGINES
82
+
83
+ if engine_type not in SUPPORTED_ENGINES:
84
+ raise ValueError(
85
+ f"Currently mlflow only supports the following engine types: "
86
+ f"{SUPPORTED_ENGINES}. {engine_type} is not supported, so please "
87
+ "use one of the above types."
88
+ )
89
+
90
+
91
+ def _get_llama_index_version() -> str:
92
+ try:
93
+ import llama_index.core
94
+
95
+ return llama_index.core.__version__
96
+ except ImportError:
97
+ raise MlflowException(
98
+ "The llama_index module is not installed. "
99
+ "Please install it via `pip install llama-index`."
100
+ )
101
+
102
+
103
+ def _supported_classes():
104
+ from llama_index.core.base.base_query_engine import BaseQueryEngine
105
+ from llama_index.core.chat_engine.types import BaseChatEngine
106
+ from llama_index.core.indices.base import BaseIndex
107
+ from llama_index.core.retrievers import BaseRetriever
108
+
109
+ supported = (BaseIndex, BaseChatEngine, BaseQueryEngine, BaseRetriever)
110
+
111
+ try:
112
+ from llama_index.core.workflow import Workflow
113
+
114
+ supported += (Workflow,)
115
+ except ImportError:
116
+ pass
117
+
118
+ return supported
119
+
120
+
121
+ @experimental(version="2.15.0")
122
+ @format_docstring(LOG_MODEL_PARAM_DOCS.format(package_name=FLAVOR_NAME))
123
+ @trace_disabled # Suppress traces while loading model
124
+ def save_model(
125
+ llama_index_model,
126
+ path: str,
127
+ engine_type: Optional[str] = None,
128
+ model_config: Optional[Union[str, dict[str, Any]]] = None,
129
+ code_paths=None,
130
+ mlflow_model: Optional[Model] = None,
131
+ signature: Optional[ModelSignature] = None,
132
+ input_example: Optional[ModelInputExample] = None,
133
+ pip_requirements: Optional[Union[list[str], str]] = None,
134
+ extra_pip_requirements: Optional[Union[list[str], str]] = None,
135
+ conda_env=None,
136
+ metadata: Optional[dict[str, Any]] = None,
137
+ ) -> None:
138
+ """
139
+ Save a LlamaIndex model to a path on the local file system.
140
+
141
+ .. attention::
142
+
143
+ Saving a non-index object is only supported in the 'Model-from-Code' saving mode.
144
+ Please refer to the `Models From Code Guide <https://www.mlflow.org/docs/latest/model/models-from-code.html>`_
145
+ for more information.
146
+
147
+ .. note::
148
+
149
+ When logging a model, MLflow will automatically save the state of the ``Settings``
150
+ object so that you can use the same settings at inference time. However, please
151
+ note that some information in the ``Settings`` object will not be saved, including:
152
+
153
+ - API keys for avoiding key leakage.
154
+ - Function objects which are not serializable.
155
+
156
+ Args:
157
+ llama_index_model: A LlamaIndex object to be saved. Supported model types are:
158
+
159
+ 1. An Index object.
160
+ 2. An Engine object e.g. ChatEngine, QueryEngine, Retriever.
161
+ 3. A `Workflow <https://docs.llamaindex.ai/en/stable/module_guides/workflow/>`_ object.
162
+ 4. A string representing the path to a script contains LlamaIndex model definition
163
+ of the one of the above types.
164
+
165
+ path: Local path where the serialized model (as YAML) is to be saved.
166
+ engine_type: Required when saving an Index object to determine the inference interface
167
+ for the index when loaded as a pyfunc model. This field is **not** required when
168
+ saving other LlamaIndex objects. The supported values are as follows:
169
+
170
+ - ``"chat"``: load the index as an instance of the LlamaIndex
171
+ `ChatEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/chat_engines/>`_.
172
+ - ``"query"``: load the index as an instance of the LlamaIndex
173
+ `QueryEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/>`_.
174
+ - ``"retriever"``: load the index as an instance of the LlamaIndex
175
+ `Retriever <https://docs.llamaindex.ai/en/stable/module_guides/querying/retriever/>`_.
176
+
177
+ model_config: The model configuration to apply when loading the model back with
178
+ ``mlflow.pyfunc.load_model()``. It will be applied in a different way depending on the
179
+ model type and saving method. See the docstring of :func:`log_model` for more details
180
+ and usage examples.
181
+
182
+ code_paths: {{ code_paths }}
183
+ mlflow_model: An MLflow model object that specifies the flavor that this model is being
184
+ added to.
185
+ signature: A Model Signature object that describes the input and output Schema of the
186
+ model. The model signature can be inferred using ``infer_signature`` function
187
+ of ``mlflow.models.signature``.
188
+ input_example: {{ input_example }}
189
+ pip_requirements: {{ pip_requirements }}
190
+ extra_pip_requirements: {{ extra_pip_requirements }}
191
+ conda_env: {{ conda_env }}
192
+ metadata: {{ metadata }}
193
+ """
194
+ from llama_index.core.indices.base import BaseIndex
195
+
196
+ from mlflow.llama_index.serialize_objects import serialize_settings
197
+
198
+ # TODO: make this logic cleaner and maybe a util
199
+ with tempfile.TemporaryDirectory() as temp_dir:
200
+ model_or_code_path = _validate_and_prepare_llama_index_model_or_path(
201
+ llama_index_model, temp_dir
202
+ )
203
+
204
+ _validate_env_arguments(conda_env, pip_requirements, extra_pip_requirements)
205
+
206
+ path = os.path.abspath(path)
207
+ _validate_and_prepare_target_save_path(path)
208
+
209
+ if isinstance(model_config, str):
210
+ model_config = _validate_and_get_model_config_from_file(model_config)
211
+
212
+ model_code_path = None
213
+ if isinstance(model_or_code_path, str):
214
+ model_code_path = model_or_code_path
215
+ llama_index_model = _load_model_code_path(model_code_path, model_config)
216
+ _validate_and_copy_file_to_directory(model_code_path, path, "code")
217
+
218
+ # Warn when user provides `engine_type` argument while saving an engine directly
219
+ if not isinstance(llama_index_model, BaseIndex) and engine_type is not None:
220
+ _logger.warning(
221
+ "The `engine_type` argument is ignored when saving a non-index object."
222
+ )
223
+
224
+ elif isinstance(model_or_code_path, BaseIndex):
225
+ _validate_engine_type(engine_type)
226
+ llama_index_model = model_or_code_path
227
+
228
+ elif isinstance(model_or_code_path, _supported_classes()):
229
+ raise MlflowException.invalid_parameter_value(
230
+ "Saving a non-index object is only supported in the 'Model-from-Code' saving mode. "
231
+ "The legacy serialization method is exclusively for saving index objects. Please "
232
+ "pass the path to the script containing the model definition to save a non-index "
233
+ "object. For more information, see "
234
+ "https://www.mlflow.org/docs/latest/model/models-from-code.html",
235
+ )
236
+
237
+ code_dir_subpath = _validate_and_copy_code_paths(code_paths, path)
238
+
239
+ if mlflow_model is None:
240
+ mlflow_model = Model()
241
+ saved_example = _save_example(mlflow_model, input_example, path)
242
+
243
+ if signature is None and saved_example is not None:
244
+ wrapped_model = create_pyfunc_wrapper(llama_index_model, engine_type, model_config)
245
+ signature = _infer_signature_from_input_example(saved_example, wrapped_model)
246
+ elif signature is False:
247
+ signature = None
248
+
249
+ if mlflow_model is None:
250
+ mlflow_model = Model()
251
+ if signature is not None:
252
+ mlflow_model.signature = signature
253
+ if metadata is not None:
254
+ mlflow_model.metadata = metadata
255
+
256
+ # NB: llama_index.core.Settings is a singleton that manages the storage/service context
257
+ # for a given llama_index application. Given it holds the required objects for most of
258
+ # the index's functionality, we look to serialize the entire object. For components of
259
+ # the object that are not serializable, we log a warning.
260
+ settings_path = os.path.join(path, _SETTINGS_FILE)
261
+ serialize_settings(settings_path)
262
+
263
+ # Do not save the index/engine object in model-from-code saving mode
264
+ if not isinstance(model_code_path, str) and isinstance(llama_index_model, BaseIndex):
265
+ _save_index(llama_index_model, path)
266
+
267
+ pyfunc.add_to_model(
268
+ mlflow_model,
269
+ loader_module="mlflow.llama_index",
270
+ conda_env=_CONDA_ENV_FILE_NAME,
271
+ python_env=_PYTHON_ENV_FILE_NAME,
272
+ code=code_dir_subpath,
273
+ model_code_path=model_code_path,
274
+ model_config=model_config,
275
+ )
276
+ mlflow_model.add_flavor(
277
+ FLAVOR_NAME,
278
+ llama_index_version=_get_llama_index_version(),
279
+ code=code_dir_subpath,
280
+ engine_type=engine_type,
281
+ )
282
+ if size := get_total_file_size(path):
283
+ mlflow_model.model_size_bytes = size
284
+ mlflow_model.save(os.path.join(path, MLMODEL_FILE_NAME))
285
+
286
+ if conda_env is None:
287
+ default_reqs = None
288
+ if pip_requirements is None:
289
+ default_reqs = get_default_pip_requirements()
290
+ inferred_reqs = mlflow.models.infer_pip_requirements(
291
+ str(path), FLAVOR_NAME, fallback=default_reqs
292
+ )
293
+ default_reqs = sorted(set(inferred_reqs).union(default_reqs))
294
+ else:
295
+ default_reqs = None
296
+ conda_env, pip_requirements, pip_constraints = _process_pip_requirements(
297
+ default_reqs,
298
+ pip_requirements,
299
+ extra_pip_requirements,
300
+ )
301
+ else:
302
+ conda_env, pip_requirements, pip_constraints = _process_conda_env(conda_env)
303
+
304
+ with open(os.path.join(path, _CONDA_ENV_FILE_NAME), "w") as f:
305
+ yaml.safe_dump(conda_env, stream=f, default_flow_style=False)
306
+
307
+ if pip_constraints:
308
+ write_to(os.path.join(path, _CONSTRAINTS_FILE_NAME), "\n".join(pip_constraints))
309
+
310
+ write_to(os.path.join(path, _REQUIREMENTS_FILE_NAME), "\n".join(pip_requirements))
311
+
312
+ _PythonEnv.current().to_yaml(os.path.join(path, _PYTHON_ENV_FILE_NAME))
313
+
314
+
315
+ @experimental(version="2.15.0")
316
+ @format_docstring(LOG_MODEL_PARAM_DOCS.format(package_name=FLAVOR_NAME))
317
+ @trace_disabled # Suppress traces while loading model
318
+ def log_model(
319
+ llama_index_model,
320
+ artifact_path: Optional[str] = None,
321
+ engine_type: Optional[str] = None,
322
+ model_config: Optional[dict[str, Any]] = None,
323
+ code_paths: Optional[list[str]] = None,
324
+ registered_model_name: Optional[str] = None,
325
+ signature: Optional[ModelSignature] = None,
326
+ input_example: Optional[ModelInputExample] = None,
327
+ await_registration_for=DEFAULT_AWAIT_MAX_SLEEP_SECONDS,
328
+ pip_requirements: Optional[Union[list[str], str]] = None,
329
+ extra_pip_requirements: Optional[Union[list[str], str]] = None,
330
+ conda_env=None,
331
+ metadata: Optional[dict[str, Any]] = None,
332
+ prompts: Optional[list[Union[str, Prompt]]] = None,
333
+ name: Optional[str] = None,
334
+ params: Optional[dict[str, Any]] = None,
335
+ tags: Optional[dict[str, Any]] = None,
336
+ model_type: Optional[str] = None,
337
+ step: int = 0,
338
+ model_id: Optional[str] = None,
339
+ **kwargs,
340
+ ):
341
+ """
342
+ Log a LlamaIndex model as an MLflow artifact for the current run.
343
+
344
+ .. attention::
345
+
346
+ Saving a non-index object is only supported in the 'Model-from-Code' saving mode.
347
+ Please refer to the `Models From Code Guide <https://www.mlflow.org/docs/latest/model/models-from-code.html>`_
348
+ for more information.
349
+
350
+ .. note::
351
+
352
+ When logging a model, MLflow will automatically save the state of the ``Settings``
353
+ object so that you can use the same settings at inference time. However, please
354
+ note that some information in the ``Settings`` object will not be saved, including:
355
+
356
+ - API keys for avoiding key leakage.
357
+ - Function objects which are not serializable.
358
+
359
+ Args:
360
+ llama_index_model: A LlamaIndex object to be saved. Supported model types are:
361
+
362
+ 1. An Index object.
363
+ 2. An Engine object e.g. ChatEngine, QueryEngine, Retriever.
364
+ 3. A `Workflow <https://docs.llamaindex.ai/en/stable/module_guides/workflow/>`_ object.
365
+ 4. A string representing the path to a script contains LlamaIndex model definition
366
+ of the one of the above types.
367
+
368
+ artifact_path: Deprecated. Use `name` instead.
369
+ engine_type: Required when saving an Index object to determine the inference interface
370
+ for the index when loaded as a pyfunc model. This field is **not** required when
371
+ saving other LlamaIndex objects. The supported values are as follows:
372
+
373
+ - ``"chat"``: load the index as an instance of the LlamaIndex
374
+ `ChatEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/chat_engines/>`_.
375
+ - ``"query"``: load the index as an instance of the LlamaIndex
376
+ `QueryEngine <https://docs.llamaindex.ai/en/stable/module_guides/deploying/query_engine/>`_.
377
+ - ``"retriever"``: load the index as an instance of the LlamaIndex
378
+ `Retriever <https://docs.llamaindex.ai/en/stable/module_guides/querying/retriever/>`_.
379
+
380
+ model_config: The model configuration to apply when loading the model back with
381
+ ``mlflow.pyfunc.load_model()``. It will be applied in a different way depending on the
382
+ model type and saving method:
383
+
384
+ For in-memory Index objects saved directly, it will be passed as keyword arguments to
385
+ instantiate the LlamaIndex engine with the specified engine type at logging.
386
+
387
+ .. code-block:: python
388
+
389
+ with mlflow.start_run() as run:
390
+ model_info = mlflow.llama_index.log_model(
391
+ index,
392
+ name="index",
393
+ engine_type="chat",
394
+ model_config={"top_k": 10},
395
+ )
396
+
397
+ # When loading back, MLflow will call ``index.as_chat_engine(top_k=10)``
398
+ engine = mlflow.pyfunc.load_model(model_info.model_uri)
399
+
400
+ For other model types saved with the `Model-from-Code <https://www.mlflow.org/docs/latest/model/models-from-code.html>`
401
+ method, the config will be accessed via the :py:class`~mlflow.models.ModelConfig`
402
+ object within your model code.
403
+
404
+ .. code-block:: python
405
+
406
+ with mlflow.start_run() as run:
407
+ model_info = mlflow.llama_index.log_model(
408
+ "model.py",
409
+ name="model",
410
+ model_config={"qdrant_host": "localhost", "qdrant_port": 6333},
411
+ )
412
+
413
+ model.py:
414
+
415
+ .. code-block:: python
416
+
417
+ import mlflow
418
+ from llama_index.vector_stores.qdrant import QdrantVectorStore
419
+ import qdrant_client
420
+
421
+
422
+ # The model configuration is accessible via the ModelConfig singleton
423
+ model_config = mlflow.models.ModelConfig()
424
+ qdrant_host = model_config.get("top_k", 5)
425
+ qdrant_port = model_config.get("qdrant_port", 6333)
426
+
427
+ client = qdrant_client.Client(host=qdrant_host, port=qdrant_port)
428
+ vectorstore = QdrantVectorStore(client)
429
+
430
+ # the rest of the model definition...
431
+
432
+ code_paths: {{ code_paths }}
433
+ registered_model_name: If given, create a model
434
+ version under ``registered_model_name``, also creating a
435
+ registered model if one with the given name does not exist.
436
+ signature: A Model Signature object that describes the input and output Schema of the
437
+ model. The model signature can be inferred using ``infer_signature`` function
438
+ of `mlflow.models.signature`.
439
+ input_example: {{ input_example }}
440
+ await_registration_for: Number of seconds to wait for the model version
441
+ to finish being created and is in ``READY`` status.
442
+ By default, the function waits for five minutes.
443
+ Specify 0 or None to skip waiting.
444
+ pip_requirements: {{ pip_requirements }}
445
+ extra_pip_requirements: {{ extra_pip_requirements }}
446
+ conda_env: {{ conda_env }}
447
+ metadata: {{ metadata }}
448
+ prompts: {{ prompts }}
449
+ name: {{ name }}
450
+ params: {{ params }}
451
+ tags: {{ tags }}
452
+ model_type: {{ model_type }}
453
+ step: {{ step }}
454
+ model_id: {{ model_id }}
455
+ kwargs: Additional arguments for :py:class:`mlflow.models.model.Model`
456
+ """
457
+ return Model.log(
458
+ artifact_path=artifact_path,
459
+ name=name,
460
+ engine_type=engine_type,
461
+ model_config=model_config,
462
+ flavor=mlflow.llama_index,
463
+ registered_model_name=registered_model_name,
464
+ llama_index_model=llama_index_model,
465
+ conda_env=conda_env,
466
+ code_paths=code_paths,
467
+ signature=signature,
468
+ input_example=input_example,
469
+ await_registration_for=await_registration_for,
470
+ pip_requirements=pip_requirements,
471
+ extra_pip_requirements=extra_pip_requirements,
472
+ metadata=metadata,
473
+ prompts=prompts,
474
+ params=params,
475
+ tags=tags,
476
+ model_type=model_type,
477
+ step=step,
478
+ model_id=model_id,
479
+ **kwargs,
480
+ )
481
+
482
+
483
+ def _validate_and_prepare_llama_index_model_or_path(llama_index_model, temp_dir=None):
484
+ if isinstance(llama_index_model, str):
485
+ return _validate_and_get_model_code_path(llama_index_model, temp_dir)
486
+
487
+ if not isinstance(llama_index_model, _supported_classes()):
488
+ supported_cls_names = [cls.__name__ for cls in _supported_classes()]
489
+ raise MlflowException.invalid_parameter_value(
490
+ message=f"The provided object of type {type(llama_index_model).__name__} is not "
491
+ "supported. MLflow llama-index flavor only supports saving LlamaIndex objects "
492
+ f"subclassed from one of the following classes: {supported_cls_names}.",
493
+ )
494
+
495
+ return llama_index_model
496
+
497
+
498
+ def _save_index(index, path):
499
+ """Serialize the index."""
500
+ index_path = os.path.join(path, _INDEX_PERSIST_FOLDER)
501
+ index.storage_context.persist(persist_dir=index_path)
502
+
503
+
504
+ def _load_llama_model(path, flavor_conf):
505
+ """Load the LlamaIndex index/engine/workflow from either model code or serialized index."""
506
+ from llama_index.core import StorageContext, load_index_from_storage
507
+
508
+ _add_code_from_conf_to_system_path(path, flavor_conf)
509
+
510
+ # Handle model-from-code
511
+ pyfunc_flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=pyfunc.FLAVOR_NAME)
512
+ if model_code_path := pyfunc_flavor_conf.get(MODEL_CODE_PATH):
513
+ # TODO: The code path saved in the MLModel file is the local absolute path to the code
514
+ # file when it is saved. We should update the relative path in artifact directory.
515
+ model_code_path = os.path.join(path, os.path.basename(model_code_path))
516
+
517
+ model_config = pyfunc_flavor_conf.get(MODEL_CONFIG) or flavor_conf.get(MODEL_CONFIG, {})
518
+ if isinstance(model_config, str):
519
+ config_path = os.path.join(path, os.path.basename(model_config))
520
+ model_config = _validate_and_get_model_config_from_file(config_path)
521
+
522
+ return _load_model_code_path(model_code_path, model_config)
523
+ else:
524
+ # Use default vector store when loading from the serialized index
525
+ index_path = os.path.join(path, _INDEX_PERSIST_FOLDER)
526
+ storage_context = StorageContext.from_defaults(persist_dir=index_path)
527
+ return load_index_from_storage(storage_context)
528
+
529
+
530
+ @experimental(version="2.15.0")
531
+ @trace_disabled # Suppress traces while loading model
532
+ def load_model(model_uri, dst_path=None):
533
+ """
534
+ Load a LlamaIndex index/engine/workflow from a local file or a run.
535
+
536
+ Args:
537
+ model_uri: The location, in URI format, of the MLflow model. For example:
538
+
539
+ - ``/Users/me/path/to/local/model``
540
+ - ``relative/path/to/local/model``
541
+ - ``s3://my_bucket/path/to/model``
542
+ - ``runs:/<mlflow_run_id>/run-relative/path/to/model``
543
+ - ``mlflow-artifacts:/path/to/model``
544
+
545
+ For more information about supported URI schemes, see
546
+ `Referencing Artifacts <https://www.mlflow.org/docs/latest/tracking.html#
547
+ artifact-locations>`_.
548
+ dst_path: The local filesystem path to utilize for downloading the model artifact.
549
+ This directory must already exist if provided. If unspecified, a local output
550
+ path will be created.
551
+
552
+ Returns:
553
+ A LlamaIndex index object.
554
+ """
555
+ from mlflow.llama_index.serialize_objects import deserialize_settings
556
+
557
+ local_model_path = _download_artifact_from_uri(artifact_uri=model_uri, output_path=dst_path)
558
+ mlflow_model = Model.load(local_model_path)
559
+ flavor_conf = _get_flavor_configuration(model_path=local_model_path, flavor_name=FLAVOR_NAME)
560
+
561
+ settings_path = os.path.join(local_model_path, _SETTINGS_FILE)
562
+ # NB: Settings is a singleton and can be loaded via llama_index.core.Settings
563
+ deserialize_settings(settings_path)
564
+ model = _load_llama_model(local_model_path, flavor_conf)
565
+ _update_active_model_id_based_on_mlflow_model(mlflow_model)
566
+ return model
567
+
568
+
569
+ def _load_pyfunc(path, model_config: Optional[dict[str, Any]] = None):
570
+ from mlflow.llama_index.pyfunc_wrapper import create_pyfunc_wrapper
571
+
572
+ index = load_model(path)
573
+ flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME)
574
+ engine_type = flavor_conf.pop(
575
+ "engine_type", None
576
+ ) # Not present when saving an non-index object
577
+ return create_pyfunc_wrapper(index, engine_type, model_config)