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,144 @@
1
+ import json
2
+ import os
3
+ import subprocess
4
+ import tarfile
5
+
6
+ from mlflow.utils.databricks_utils import is_in_databricks_runtime
7
+ from mlflow.utils.file_utils import get_or_create_tmp_dir
8
+
9
+ _CACHE_MAP_FILE_NAME = "db_connect_artifact_cache.json"
10
+
11
+
12
+ class DBConnectArtifactCache:
13
+ """
14
+ Manages Databricks Connect artifacts cache.
15
+ Note it doesn't support OSS Spark Connect.
16
+
17
+ This class can be used in the following environment:
18
+ - Databricks shared cluster python notebook REPL
19
+ - Databricks Serverless python notebook REPL
20
+ - Databricks connect client python REPL that connects to remote Databricks Serverless
21
+ - Databricks connect client python REPL that connects to remote Databricks shared cluster
22
+
23
+ .. code-block:: python
24
+ :caption: Example
25
+
26
+ # client side code
27
+ db_artifact_cache = DBConnectArtifactCache.get_or_create()
28
+ db_artifact_cache.add_artifact_archive("archive1", "/tmp/archive1.tar.gz")
29
+
30
+
31
+ @pandas_udf(...)
32
+ def my_udf(x):
33
+ # we can get the unpacked archive files in `archive1_unpacked_dir`
34
+ archive1_unpacked_dir = db_artifact_cache.get("archive1")
35
+ """
36
+
37
+ _global_cache = None
38
+
39
+ @staticmethod
40
+ def get_or_create(spark):
41
+ if (
42
+ DBConnectArtifactCache._global_cache is None
43
+ or spark is not DBConnectArtifactCache._global_cache._spark
44
+ ):
45
+ DBConnectArtifactCache._global_cache = DBConnectArtifactCache(spark)
46
+ cache_file = os.path.join(get_or_create_tmp_dir(), _CACHE_MAP_FILE_NAME)
47
+ if is_in_databricks_runtime() and os.path.exists(cache_file):
48
+ # In databricks runtime (shared cluster or Serverless), when you restart the
49
+ # notebook REPL by %restart_python or dbutils.library.restartPython(), the
50
+ # DBConnect session is still preserved. So in this case, we can reuse the cached
51
+ # artifact files.
52
+ # So that when adding artifact, the cache map is serialized to local disk file
53
+ # `db_connect_artifact_cache.json` and after REPL restarts,
54
+ # `DBConnectArtifactCache` restores the cache map by loading data from the file.
55
+ with open(cache_file) as f:
56
+ DBConnectArtifactCache._global_cache._cache = json.load(f)
57
+ return DBConnectArtifactCache._global_cache
58
+
59
+ def __init__(self, spark):
60
+ self._spark = spark
61
+ self._cache = {}
62
+
63
+ def __getstate__(self):
64
+ """
65
+ The `DBConnectArtifactCache` instance is created in Databricks Connect client side,
66
+ and it will be pickled to Databricks Connect UDF sandbox
67
+ (see `get_unpacked_artifact_dir` method), but Spark Connect client object is
68
+ not pickle-able, we need to skip this field.
69
+ """
70
+ state = self.__dict__.copy()
71
+ # Don't pickle `_spark`
72
+ del state["_spark"]
73
+ return state
74
+
75
+ def __setstate__(self, state):
76
+ self.__dict__.update(state)
77
+ self._spark = None
78
+
79
+ def has_cache_key(self, cache_key):
80
+ return cache_key in self._cache
81
+
82
+ def add_artifact_archive(self, cache_key, artifact_archive_path):
83
+ """
84
+ Add an artifact archive file to Databricks connect cache.
85
+ The archive file must be 'tar.gz' format.
86
+ You can only call this method in Databricks Connect client side.
87
+ """
88
+ if not artifact_archive_path.endswith(".tar.gz"):
89
+ raise RuntimeError(
90
+ "'add_artifact_archive' only supports archive file in 'tar.gz' format."
91
+ )
92
+
93
+ archive_file_name = os.path.basename(artifact_archive_path)
94
+ if cache_key not in self._cache:
95
+ self._spark.addArtifact(artifact_archive_path, archive=True)
96
+ self._cache[cache_key] = archive_file_name
97
+
98
+ if is_in_databricks_runtime():
99
+ with open(os.path.join(get_or_create_tmp_dir(), _CACHE_MAP_FILE_NAME), "w") as f:
100
+ json.dump(self._cache, f)
101
+
102
+ def get_unpacked_artifact_dir(self, cache_key):
103
+ """
104
+ Get unpacked artifact directory path, you can only call this method
105
+ inside Databricks Connect spark UDF sandbox.
106
+ """
107
+ if cache_key not in self._cache:
108
+ raise RuntimeError(f"The artifact '{cache_key}' does not exist.")
109
+ archive_file_name = self._cache[cache_key]
110
+
111
+ if session_id := os.environ.get("DB_SESSION_UUID"):
112
+ return (
113
+ f"/local_disk0/.ephemeral_nfs/artifacts/{session_id}/archives/{archive_file_name}"
114
+ )
115
+
116
+ # If 'DB_SESSION_UUID' environment variable does not exist, it means it is running
117
+ # in a dedicated mode Spark cluster.
118
+ return os.path.join(os.getcwd(), archive_file_name)
119
+
120
+
121
+ def archive_directory(input_dir, archive_file_path):
122
+ """
123
+ Archive the `input_dir` directory, save the archive file to `archive_file_path`,
124
+ the generated archive file is 'tar.gz' format.
125
+ Note: all symlink files in the input directory are kept as it is in the archive file.
126
+ """
127
+
128
+ archive_file_path = os.path.abspath(archive_file_path)
129
+ # Note: `shutil.make_archive` doesn't work because it replaces symlink files with
130
+ # the file symlink pointing to, which is not the expected behavior in our usage.
131
+ # We need to pack the python and virtualenv environment, which contains a bunch of
132
+ # symlink files.
133
+ subprocess.check_call(
134
+ ["tar", "-czf", archive_file_path, *os.listdir(input_dir)],
135
+ cwd=input_dir,
136
+ )
137
+ return archive_file_path
138
+
139
+
140
+ def extract_archive_to_dir(archive_path, dest_dir):
141
+ os.makedirs(dest_dir, exist_ok=True)
142
+ with tarfile.open(archive_path, "r") as tar:
143
+ tar.extractall(path=dest_dir)
144
+ return dest_dir
@@ -0,0 +1,7 @@
1
+ import mlflow.pyfunc.loaders.chat_agent
2
+ import mlflow.pyfunc.loaders.chat_model
3
+ import mlflow.pyfunc.loaders.code_model
4
+ from mlflow.utils.pydantic_utils import IS_PYDANTIC_V2_OR_NEWER
5
+
6
+ if IS_PYDANTIC_V2_OR_NEWER:
7
+ import mlflow.pyfunc.loaders.responses_agent # noqa: F401
@@ -0,0 +1,117 @@
1
+ from typing import Any, Generator, Optional
2
+
3
+ import pydantic
4
+
5
+ from mlflow.exceptions import MlflowException
6
+ from mlflow.models.utils import _convert_llm_ndarray_to_list
7
+ from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
8
+ from mlflow.pyfunc.model import (
9
+ _load_context_model_and_signature,
10
+ )
11
+ from mlflow.types.agent import (
12
+ ChatAgentChunk,
13
+ ChatAgentMessage,
14
+ ChatAgentResponse,
15
+ ChatContext,
16
+ )
17
+ from mlflow.types.type_hints import model_validate
18
+ from mlflow.utils.annotations import experimental
19
+
20
+
21
+ def _load_pyfunc(model_path: str, model_config: Optional[dict[str, Any]] = None):
22
+ _, chat_agent, _ = _load_context_model_and_signature(model_path, model_config)
23
+ return _ChatAgentPyfuncWrapper(chat_agent)
24
+
25
+
26
+ @experimental(version="2.20.0")
27
+ class _ChatAgentPyfuncWrapper:
28
+ """
29
+ Wrapper class that converts dict inputs to pydantic objects accepted by :class:`~ChatAgent`.
30
+ """
31
+
32
+ def __init__(self, chat_agent):
33
+ """
34
+ Args:
35
+ chat_agent: An instance of a subclass of :class:`~ChatAgent`.
36
+ """
37
+ self.chat_agent = chat_agent
38
+
39
+ def get_raw_model(self):
40
+ """
41
+ Returns the underlying model.
42
+ """
43
+ return self.chat_agent
44
+
45
+ def _convert_input(
46
+ self, model_input
47
+ ) -> tuple[list[ChatAgentMessage], Optional[ChatContext], Optional[dict[str, Any]]]:
48
+ import pandas
49
+
50
+ if isinstance(model_input, dict):
51
+ dict_input = model_input
52
+ elif isinstance(model_input, pandas.DataFrame):
53
+ dict_input = {
54
+ k: _convert_llm_ndarray_to_list(v[0])
55
+ for k, v in model_input.to_dict(orient="list").items()
56
+ }
57
+ else:
58
+ raise MlflowException(
59
+ "Unsupported model input type. Expected a dict or pandas.DataFrame, but got "
60
+ f"{type(model_input)} instead.",
61
+ error_code=INTERNAL_ERROR,
62
+ )
63
+
64
+ messages = [ChatAgentMessage(**message) for message in dict_input.get("messages", [])]
65
+ context = ChatContext(**dict_input["context"]) if "context" in dict_input else None
66
+ custom_inputs = dict_input.get("custom_inputs", None)
67
+
68
+ return messages, context, custom_inputs
69
+
70
+ def _response_to_dict(self, response, pydantic_class) -> dict[str, Any]:
71
+ if isinstance(response, pydantic_class):
72
+ return response.model_dump_compat(exclude_none=True)
73
+ try:
74
+ model_validate(pydantic_class, response)
75
+ except pydantic.ValidationError as e:
76
+ raise MlflowException(
77
+ message=(
78
+ f"Model returned an invalid response. Expected a {pydantic_class.__name__} "
79
+ f"object or dictionary with the same schema. Pydantic validation error: {e}"
80
+ ),
81
+ error_code=INTERNAL_ERROR,
82
+ ) from e
83
+ return response
84
+
85
+ def predict(self, model_input: dict[str, Any], params=None) -> dict[str, Any]:
86
+ """
87
+ Args:
88
+ model_input: A dict with the
89
+ :py:class:`ChatAgentRequest <mlflow.types.agent.ChatAgentRequest>` schema.
90
+ params: Unused in this function, but required in the signature because
91
+ `load_model_and_predict` in `utils/_capture_modules.py` expects a params field
92
+
93
+ Returns:
94
+ A dict with the (:py:class:`ChatAgentResponse <mlflow.types.agent.ChatAgentResponse>`)
95
+ schema.
96
+ """
97
+ messages, context, custom_inputs = self._convert_input(model_input)
98
+ response = self.chat_agent.predict(messages, context, custom_inputs)
99
+ return self._response_to_dict(response, ChatAgentResponse)
100
+
101
+ def predict_stream(
102
+ self, model_input: dict[str, Any], params=None
103
+ ) -> Generator[dict[str, Any], None, None]:
104
+ """
105
+ Args:
106
+ model_input: A dict with the
107
+ :py:class:`ChatAgentRequest <mlflow.types.agent.ChatAgentRequest>` schema.
108
+ params: Unused in this function, but required in the signature because
109
+ `load_model_and_predict` in `utils/_capture_modules.py` expects a params field
110
+
111
+ Returns:
112
+ A generator over dicts with the
113
+ (:py:class:`ChatAgentChunk <mlflow.types.agent.ChatAgentChunk>`) schema.
114
+ """
115
+ messages, context, custom_inputs = self._convert_input(model_input)
116
+ for response in self.chat_agent.predict_stream(messages, context, custom_inputs):
117
+ yield self._response_to_dict(response, ChatAgentChunk)
@@ -0,0 +1,125 @@
1
+ import inspect
2
+ import logging
3
+ from typing import Any, Generator, Optional
4
+
5
+ from mlflow.exceptions import MlflowException
6
+ from mlflow.models.utils import _convert_llm_ndarray_to_list
7
+ from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
8
+ from mlflow.pyfunc.model import (
9
+ _load_context_model_and_signature,
10
+ )
11
+ from mlflow.types.llm import ChatCompletionChunk, ChatCompletionResponse, ChatMessage, ChatParams
12
+
13
+ _logger = logging.getLogger(__name__)
14
+
15
+
16
+ def _load_pyfunc(model_path: str, model_config: Optional[dict[str, Any]] = None):
17
+ context, chat_model, signature = _load_context_model_and_signature(model_path, model_config)
18
+ return _ChatModelPyfuncWrapper(chat_model=chat_model, context=context, signature=signature)
19
+
20
+
21
+ class _ChatModelPyfuncWrapper:
22
+ """
23
+ Wrapper class that converts dict inputs to pydantic objects accepted by :class:`~ChatModel`.
24
+ """
25
+
26
+ def __init__(self, chat_model, context, signature):
27
+ """
28
+ Args:
29
+ chat_model: An instance of a subclass of :class:`~ChatModel`.
30
+ context: A :class:`~PythonModelContext` instance containing artifacts that
31
+ ``chat_model`` may use when performing inference.
32
+ signature: :class:`~ModelSignature` instance describing model input and output.
33
+ """
34
+ self.chat_model = chat_model
35
+ self.context = context
36
+ self.signature = signature
37
+
38
+ def get_raw_model(self):
39
+ """
40
+ Returns the underlying model.
41
+ """
42
+ return self.chat_model
43
+
44
+ def _convert_input(self, model_input):
45
+ import pandas
46
+
47
+ if isinstance(model_input, dict):
48
+ dict_input = model_input
49
+ elif isinstance(model_input, pandas.DataFrame):
50
+ dict_input = {
51
+ k: _convert_llm_ndarray_to_list(v[0])
52
+ for k, v in model_input.to_dict(orient="list").items()
53
+ }
54
+ else:
55
+ raise MlflowException(
56
+ "Unsupported model input type. Expected a dict or pandas.DataFrame, "
57
+ f"but got {type(model_input)} instead.",
58
+ error_code=INTERNAL_ERROR,
59
+ )
60
+
61
+ messages = [ChatMessage.from_dict(message) for message in dict_input.pop("messages", [])]
62
+ params = ChatParams.from_dict(dict_input)
63
+ return messages, params
64
+
65
+ def predict(
66
+ self, model_input: dict[str, Any], params: Optional[dict[str, Any]] = None
67
+ ) -> dict[str, Any]:
68
+ """
69
+ Args:
70
+ model_input: Model input data in the form of a chat request.
71
+ params: Additional parameters to pass to the model for inference.
72
+ Unused in this implementation, as the params are handled
73
+ via ``self._convert_input()``.
74
+
75
+ Returns:
76
+ Model predictions in :py:class:`~ChatCompletionResponse` format.
77
+ """
78
+ messages, params = self._convert_input(model_input)
79
+ parameters = inspect.signature(self.chat_model.predict).parameters
80
+ if "context" in parameters or len(parameters) == 3:
81
+ response = self.chat_model.predict(self.context, messages, params)
82
+ else:
83
+ response = self.chat_model.predict(messages, params)
84
+ return self._response_to_dict(response)
85
+
86
+ def _response_to_dict(self, response: ChatCompletionResponse) -> dict[str, Any]:
87
+ if not isinstance(response, ChatCompletionResponse):
88
+ raise MlflowException(
89
+ "Model returned an invalid response. Expected a ChatCompletionResponse, but "
90
+ f"got {type(response)} instead.",
91
+ error_code=INTERNAL_ERROR,
92
+ )
93
+ return response.to_dict()
94
+
95
+ def _streaming_response_to_dict(self, response: ChatCompletionChunk) -> dict[str, Any]:
96
+ if not isinstance(response, ChatCompletionChunk):
97
+ raise MlflowException(
98
+ "Model returned an invalid response. Expected a ChatCompletionChunk, but "
99
+ f"got {type(response)} instead.",
100
+ error_code=INTERNAL_ERROR,
101
+ )
102
+ return response.to_dict()
103
+
104
+ def predict_stream(
105
+ self, model_input: dict[str, Any], params: Optional[dict[str, Any]] = None
106
+ ) -> Generator[dict[str, Any], None, None]:
107
+ """
108
+ Args:
109
+ model_input: Model input data in the form of a chat request.
110
+ params: Additional parameters to pass to the model for inference.
111
+ Unused in this implementation, as the params are handled
112
+ via ``self._convert_input()``.
113
+
114
+ Returns:
115
+ Generator over model predictions in :py:class:`~ChatCompletionChunk` format.
116
+ """
117
+ messages, params = self._convert_input(model_input)
118
+ parameters = inspect.signature(self.chat_model.predict_stream).parameters
119
+ if "context" in parameters or len(parameters) == 3:
120
+ stream = self.chat_model.predict_stream(self.context, messages, params)
121
+ else:
122
+ stream = self.chat_model.predict_stream(messages, params)
123
+
124
+ for response in stream:
125
+ yield self._streaming_response_to_dict(response)
@@ -0,0 +1,31 @@
1
+ from typing import Any, Optional
2
+
3
+ from mlflow.pyfunc.loaders.chat_agent import _ChatAgentPyfuncWrapper
4
+ from mlflow.pyfunc.loaders.chat_model import _ChatModelPyfuncWrapper
5
+ from mlflow.pyfunc.model import (
6
+ ChatAgent,
7
+ ChatModel,
8
+ _load_context_model_and_signature,
9
+ _PythonModelPyfuncWrapper,
10
+ )
11
+
12
+ try:
13
+ from mlflow.pyfunc.model import ResponsesAgent
14
+
15
+ IS_RESPONSES_AGENT_AVAILABLE = True
16
+ except ImportError:
17
+ IS_RESPONSES_AGENT_AVAILABLE = False
18
+
19
+
20
+ def _load_pyfunc(local_path: str, model_config: Optional[dict[str, Any]] = None):
21
+ context, model, signature = _load_context_model_and_signature(local_path, model_config)
22
+ if isinstance(model, ChatModel):
23
+ return _ChatModelPyfuncWrapper(model, context, signature)
24
+ elif isinstance(model, ChatAgent):
25
+ return _ChatAgentPyfuncWrapper(model)
26
+ elif IS_RESPONSES_AGENT_AVAILABLE and isinstance(model, ResponsesAgent):
27
+ from mlflow.pyfunc.loaders.responses_agent import _ResponsesAgentPyfuncWrapper
28
+
29
+ return _ResponsesAgentPyfuncWrapper(model)
30
+ else:
31
+ return _PythonModelPyfuncWrapper(model, context, signature)
@@ -0,0 +1,112 @@
1
+ from typing import Any, Generator, Optional
2
+
3
+ import pydantic
4
+
5
+ from mlflow.exceptions import MlflowException
6
+ from mlflow.models.utils import _convert_llm_ndarray_to_list
7
+ from mlflow.protos.databricks_pb2 import INTERNAL_ERROR
8
+ from mlflow.pyfunc.model import _load_context_model_and_signature
9
+ from mlflow.types.type_hints import model_validate
10
+ from mlflow.utils.annotations import experimental
11
+ from mlflow.utils.pydantic_utils import IS_PYDANTIC_V2_OR_NEWER
12
+
13
+ if not IS_PYDANTIC_V2_OR_NEWER:
14
+ raise ImportError(
15
+ "ResponsesAgent and its pydantic classes are not supported in pydantic v1. "
16
+ "Please upgrade to pydantic v2 or newer to use ResponsesAgent.",
17
+ )
18
+
19
+ from mlflow.types.responses import (
20
+ ResponsesAgentRequest,
21
+ ResponsesAgentResponse,
22
+ ResponsesAgentStreamEvent,
23
+ )
24
+
25
+
26
+ def _load_pyfunc(model_path: str, model_config: Optional[dict[str, Any]] = None):
27
+ _, responses_agent, _ = _load_context_model_and_signature(model_path, model_config)
28
+ return _ResponsesAgentPyfuncWrapper(responses_agent)
29
+
30
+
31
+ @experimental(version="3.0.0")
32
+ class _ResponsesAgentPyfuncWrapper:
33
+ """
34
+ Wrapper class that converts dict inputs to pydantic objects accepted by
35
+ :class:`~ResponsesAgent`.
36
+ """
37
+
38
+ def __init__(self, responses_agent):
39
+ self.responses_agent = responses_agent
40
+
41
+ def get_raw_model(self):
42
+ """
43
+ Returns the underlying model.
44
+ """
45
+ return self.responses_agent
46
+
47
+ def _convert_input(self, model_input) -> ResponsesAgentRequest:
48
+ import pandas
49
+
50
+ if isinstance(model_input, pandas.DataFrame):
51
+ model_input = {
52
+ k: _convert_llm_ndarray_to_list(v[0])
53
+ for k, v in model_input.to_dict(orient="list").items()
54
+ }
55
+ elif not isinstance(model_input, dict):
56
+ raise MlflowException(
57
+ "Unsupported model input type. Expected a dict or pandas.DataFrame, but got "
58
+ f"{type(model_input)} instead.",
59
+ error_code=INTERNAL_ERROR,
60
+ )
61
+ return ResponsesAgentRequest(**model_input)
62
+
63
+ def _response_to_dict(self, response, pydantic_class) -> dict[str, Any]:
64
+ if isinstance(response, pydantic_class):
65
+ return response.model_dump_compat(exclude_none=True)
66
+ try:
67
+ model_validate(pydantic_class, response)
68
+ except pydantic.ValidationError as e:
69
+ raise MlflowException(
70
+ message=(
71
+ f"Model returned an invalid response. Expected a {pydantic_class.__name__} "
72
+ f"object or dictionary with the same schema. Pydantic validation error: {e}"
73
+ ),
74
+ error_code=INTERNAL_ERROR,
75
+ ) from e
76
+ return response
77
+
78
+ def predict(self, model_input: dict[str, Any], params=None) -> dict[str, Any]:
79
+ """
80
+ Args:
81
+ model_input: A dict with the
82
+ :py:class:`ResponsesRequest <mlflow.types.responses.ResponsesRequest>` schema.
83
+ params: Unused in this function, but required in the signature because
84
+ `load_model_and_predict` in `utils/_capture_modules.py` expects a params field
85
+
86
+ Returns:
87
+ A dict with the
88
+ (:py:class:`ResponsesResponse <mlflow.types.responses.ResponsesResponse>`)
89
+ schema.
90
+ """
91
+ request = self._convert_input(model_input)
92
+ response = self.responses_agent.predict(request)
93
+ return self._response_to_dict(response, ResponsesAgentResponse)
94
+
95
+ def predict_stream(
96
+ self, model_input: dict[str, Any], params=None
97
+ ) -> Generator[dict[str, Any], None, None]:
98
+ """
99
+ Args:
100
+ model_input: A dict with the
101
+ :py:class:`ResponsesRequest <mlflow.types.responses.ResponsesRequest>` schema.
102
+ params: Unused in this function, but required in the signature because
103
+ `load_model_and_predict` in `utils/_capture_modules.py` expects a params field
104
+
105
+ Returns:
106
+ A generator over dicts with the
107
+ (:py:class:`ResponsesStreamEvent <mlflow.types.responses.ResponsesStreamEvent>`)
108
+ schema.
109
+ """
110
+ request = self._convert_input(model_input)
111
+ for response in self.responses_agent.predict_stream(request):
112
+ yield self._response_to_dict(response, ResponsesAgentStreamEvent)
@@ -0,0 +1,46 @@
1
+ import logging
2
+ import os
3
+ from typing import Optional
4
+
5
+ _logger = logging.getLogger(__name__)
6
+
7
+ MLServerMLflowRuntime = "mlserver_mlflow.MLflowRuntime"
8
+ MLServerDefaultModelName = "mlflow-model"
9
+
10
+
11
+ def get_cmd(
12
+ model_uri: str,
13
+ port: Optional[int] = None,
14
+ host: Optional[str] = None,
15
+ timeout: Optional[int] = None,
16
+ nworkers: Optional[int] = None,
17
+ model_name: Optional[str] = None,
18
+ model_version: Optional[str] = None,
19
+ ) -> tuple[str, dict[str, str]]:
20
+ cmd = f"mlserver start {model_uri}"
21
+
22
+ cmd_env = os.environ.copy()
23
+
24
+ if port:
25
+ cmd_env["MLSERVER_HTTP_PORT"] = str(port)
26
+
27
+ if host:
28
+ cmd_env["MLSERVER_HOST"] = host
29
+
30
+ if timeout:
31
+ _logger.warning("Timeout is not yet supported in MLServer.")
32
+
33
+ if nworkers:
34
+ cmd_env["MLSERVER_PARALLEL_WORKERS"] = str(nworkers)
35
+
36
+ # give precedence to user env var input
37
+ cmd_env["MLSERVER_MODEL_NAME"] = (
38
+ cmd_env.get("MLSERVER_MODEL_NAME") or model_name or MLServerDefaultModelName
39
+ )
40
+ if model_version and not cmd_env.get("MLSERVER_MODEL_VERSION"):
41
+ cmd_env["MLSERVER_MODEL_VERSION"] = model_version
42
+
43
+ cmd_env["MLSERVER_MODEL_IMPLEMENTATION"] = MLServerMLflowRuntime
44
+ cmd_env["MLSERVER_MODEL_URI"] = model_uri
45
+
46
+ return cmd, cmd_env