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,398 @@
1
+ import logging
2
+ import threading
3
+ from collections import defaultdict
4
+ from functools import wraps
5
+ from typing import Any, Optional, Union
6
+
7
+ import dspy
8
+ from dspy.utils.callback import BaseCallback
9
+
10
+ import mlflow
11
+ from mlflow.dspy.constant import FLAVOR_NAME
12
+ from mlflow.dspy.util import log_dspy_module_params, save_dspy_module_state
13
+ from mlflow.entities import SpanStatusCode, SpanType
14
+ from mlflow.entities.run_status import RunStatus
15
+ from mlflow.entities.span_event import SpanEvent
16
+ from mlflow.exceptions import MlflowException
17
+ from mlflow.tracing.fluent import start_span_no_context
18
+ from mlflow.tracing.provider import detach_span_from_context, set_span_in_context
19
+ from mlflow.tracing.utils import maybe_set_prediction_context, set_span_chat_messages
20
+ from mlflow.tracing.utils.token import SpanWithToken
21
+ from mlflow.utils.autologging_utils import (
22
+ get_autologging_config,
23
+ )
24
+ from mlflow.version import IS_TRACING_SDK_ONLY
25
+
26
+ _logger = logging.getLogger(__name__)
27
+ _lock = threading.Lock()
28
+
29
+
30
+ def skip_if_trace_disabled(func):
31
+ @wraps(func)
32
+ def wrapper(*args, **kwargs):
33
+ if get_autologging_config(FLAVOR_NAME, "log_traces"):
34
+ func(*args, **kwargs)
35
+
36
+ return wrapper
37
+
38
+
39
+ class MlflowCallback(BaseCallback):
40
+ """Callback for generating MLflow traces for DSPy components"""
41
+
42
+ def __init__(self, dependencies_schema: Optional[dict[str, Any]] = None):
43
+ self._dependencies_schema = dependencies_schema
44
+ # call_id: (LiveSpan, OTel token)
45
+ self._call_id_to_span: dict[str, SpanWithToken] = {}
46
+
47
+ ###### state management for optimization process ######
48
+ # The current callback logic assumes there is no optimization running in parallel.
49
+ # The state management may not work when multiple optimizations are running in parallel.
50
+ # optimizer_stack_level is used to determine if the callback is called within compile
51
+ # we cannot use boolean flag because the callback can be nested
52
+ self.optimizer_stack_level = 0
53
+ # call_id: (key, step)
54
+ self._call_id_to_metric_key: dict[str, tuple[str, int]] = {}
55
+ self._evaluation_counter = defaultdict(int)
56
+
57
+ def set_dependencies_schema(self, dependencies_schema: dict[str, Any]):
58
+ if self._dependencies_schema:
59
+ raise MlflowException(
60
+ "Dependencies schema should be set only once to the callback.",
61
+ error_code=MlflowException.INVALID_PARAMETER_VALUE,
62
+ )
63
+ self._dependencies_schema = dependencies_schema
64
+
65
+ @skip_if_trace_disabled
66
+ def on_module_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
67
+ span_type = self._get_span_type_for_module(instance)
68
+ attributes = self._get_span_attribute_for_module(instance)
69
+
70
+ # The __call__ method of dspy.Module has a signature of (self, *args, **kwargs),
71
+ # while all built-in modules only accepts keyword arguments. To avoid recording
72
+ # empty "args" key in the inputs, we remove it if it's empty.
73
+ if "args" in inputs and not inputs["args"]:
74
+ inputs.pop("args")
75
+
76
+ self._start_span(
77
+ call_id,
78
+ name=f"{instance.__class__.__name__}.forward",
79
+ span_type=span_type,
80
+ inputs=self._unpack_kwargs(inputs),
81
+ attributes=attributes,
82
+ )
83
+
84
+ @skip_if_trace_disabled
85
+ def on_module_end(
86
+ self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
87
+ ):
88
+ # NB: DSPy's Prediction object is a customized dictionary-like object, but its repr
89
+ # is not easy to read on UI. Therefore, we unpack it to a dictionary.
90
+ # https://github.com/stanfordnlp/dspy/blob/6fe693528323c9c10c82d90cb26711a985e18b29/dspy/primitives/prediction.py#L21-L28
91
+ if isinstance(outputs, dspy.Prediction):
92
+ outputs = outputs.toDict()
93
+
94
+ self._end_span(call_id, outputs, exception)
95
+
96
+ @skip_if_trace_disabled
97
+ def on_lm_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
98
+ span_type = (
99
+ SpanType.CHAT_MODEL if getattr(instance, "model_type", None) == "chat" else SpanType.LLM
100
+ )
101
+
102
+ attributes = {
103
+ **instance.kwargs,
104
+ "model": instance.model,
105
+ "model_type": instance.model_type,
106
+ "cache": instance.cache,
107
+ }
108
+
109
+ inputs = self._unpack_kwargs(inputs)
110
+
111
+ span = self._start_span(
112
+ call_id,
113
+ name=f"{instance.__class__.__name__}.__call__",
114
+ span_type=span_type,
115
+ inputs=inputs,
116
+ attributes=attributes,
117
+ )
118
+
119
+ if messages := self._extract_messages_from_lm_inputs(inputs):
120
+ try:
121
+ set_span_chat_messages(span, messages)
122
+ except Exception as e:
123
+ _logger.debug(f"Failed to set input messages for {span}. Error: {e}")
124
+
125
+ @skip_if_trace_disabled
126
+ def on_lm_end(
127
+ self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
128
+ ):
129
+ st = self._call_id_to_span.get(call_id)
130
+ try:
131
+ output_msg = self._extract_messages_from_lm_outputs(outputs)
132
+ set_span_chat_messages(st.span, output_msg, append=True)
133
+ except Exception as e:
134
+ _logger.debug(f"Failed to set output messages for {call_id}. Error: {e}")
135
+
136
+ self._end_span(call_id, outputs, exception)
137
+
138
+ def _extract_messages_from_lm_inputs(self, inputs: dict[str, Any]) -> list[dict[str, str]]:
139
+ # LM input is either a list of messages or a prompt string
140
+ # https://github.com/stanfordnlp/dspy/blob/ac5bf56bb1ed7261d9637168563328c1dfeb27af/dspy/clients/lm.py#L92
141
+ # TODO: Extract tool definition once https://github.com/stanfordnlp/dspy/pull/2023 is merged
142
+ return inputs.get("messages") or [{"role": "user", "content": inputs.get("prompt")}]
143
+
144
+ def _extract_messages_from_lm_outputs(
145
+ self, outputs: list[Union[str, dict[str, Any]]]
146
+ ) -> list[dict[str, str]]:
147
+ # LM output is either a string or a dictionary of text and logprobs
148
+ # https://github.com/stanfordnlp/dspy/blob/ac5bf56bb1ed7261d9637168563328c1dfeb27af/dspy/clients/lm.py#L105-L114
149
+ # TODO: Extract tool calls once https://github.com/stanfordnlp/dspy/pull/2023 is merged
150
+ return [
151
+ {"role": "assistant", "content": o.get("text") if isinstance(o, dict) else o}
152
+ for o in outputs
153
+ ]
154
+
155
+ @skip_if_trace_disabled
156
+ def on_adapter_format_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
157
+ self._start_span(
158
+ call_id,
159
+ name=f"{instance.__class__.__name__}.format",
160
+ span_type=SpanType.PARSER,
161
+ inputs=self._unpack_kwargs(inputs),
162
+ attributes={},
163
+ )
164
+
165
+ @skip_if_trace_disabled
166
+ def on_adapter_format_end(
167
+ self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
168
+ ):
169
+ self._end_span(call_id, outputs, exception)
170
+
171
+ @skip_if_trace_disabled
172
+ def on_adapter_parse_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
173
+ self._start_span(
174
+ call_id,
175
+ name=f"{instance.__class__.__name__}.parse",
176
+ span_type=SpanType.PARSER,
177
+ inputs=self._unpack_kwargs(inputs),
178
+ attributes={},
179
+ )
180
+
181
+ @skip_if_trace_disabled
182
+ def on_adapter_parse_end(
183
+ self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
184
+ ):
185
+ self._end_span(call_id, outputs, exception)
186
+
187
+ @skip_if_trace_disabled
188
+ def on_tool_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
189
+ # DSPy uses the special "finish" tool to signal the end of the agent.
190
+ if instance.name == "finish":
191
+ return
192
+
193
+ inputs = self._unpack_kwargs(inputs)
194
+ # Tools are always called with keyword arguments only.
195
+ inputs.pop("args", None)
196
+
197
+ self._start_span(
198
+ call_id,
199
+ name=f"Tool.{instance.name}",
200
+ span_type=SpanType.TOOL,
201
+ inputs=inputs,
202
+ attributes={
203
+ "name": instance.name,
204
+ "description": instance.desc,
205
+ "args": instance.args,
206
+ },
207
+ )
208
+
209
+ @skip_if_trace_disabled
210
+ def on_tool_end(
211
+ self, call_id: str, outputs: Optional[Any], exception: Optional[Exception] = None
212
+ ):
213
+ if call_id in self._call_id_to_span:
214
+ self._end_span(call_id, outputs, exception)
215
+
216
+ def on_evaluate_start(self, call_id: str, instance: Any, inputs: dict[str, Any]):
217
+ """
218
+ Callback handler at the beginning of evaluation call. Available with DSPy>=2.6.9.
219
+ This callback starts a nested run for each evaluation call inside optimization.
220
+ If called outside optimization and no active run exists, it creates a new run.
221
+ """
222
+ if not get_autologging_config(FLAVOR_NAME, "log_evals"):
223
+ return
224
+
225
+ key = "eval"
226
+ if callback_metadata := inputs.get("callback_metadata"):
227
+ if "metric_key" in callback_metadata:
228
+ key = callback_metadata["metric_key"]
229
+ if self.optimizer_stack_level > 0:
230
+ with _lock:
231
+ # we may want to include optimizer_stack_level in the key
232
+ # to handle nested optimization
233
+ step = self._evaluation_counter[key]
234
+ self._evaluation_counter[key] += 1
235
+ self._call_id_to_metric_key[call_id] = (key, step)
236
+ mlflow.start_run(run_name=f"{key}_{step}", nested=True)
237
+ else:
238
+ mlflow.start_run(run_name=key, nested=True)
239
+ if program := inputs.get("program"):
240
+ save_dspy_module_state(program, "model.json")
241
+ log_dspy_module_params(program)
242
+
243
+ def on_evaluate_end(
244
+ self,
245
+ call_id: str,
246
+ outputs: Any,
247
+ exception: Optional[Exception] = None,
248
+ ):
249
+ """
250
+ Callback handler at the end of evaluation call. Available with DSPy>=2.6.9.
251
+ This callback logs the evaluation score to the individual run
252
+ and add eval metric to the parent run if called inside optimization.
253
+ """
254
+ if not get_autologging_config(FLAVOR_NAME, "log_evals"):
255
+ return
256
+ if exception:
257
+ mlflow.end_run(status=RunStatus.to_string(RunStatus.FAILED))
258
+ return
259
+ score = None
260
+ if isinstance(outputs, float):
261
+ score = outputs
262
+ elif isinstance(outputs, tuple):
263
+ score = outputs[0]
264
+ elif isinstance(outputs, dspy.Prediction):
265
+ score = float(outputs)
266
+ try:
267
+ mlflow.log_table(self._generate_result_table(outputs.results), "result_table.json")
268
+ except Exception:
269
+ _logger.debug("Failed to log result table.", exc_info=True)
270
+ if score is not None:
271
+ mlflow.log_metric("eval", score)
272
+
273
+ mlflow.end_run()
274
+ # Log the evaluation score to the parent run if called inside optimization
275
+ if self.optimizer_stack_level > 0 and mlflow.active_run() is not None:
276
+ if call_id not in self._call_id_to_metric_key:
277
+ return
278
+ key, step = self._call_id_to_metric_key.pop(call_id)
279
+ if score is not None:
280
+ mlflow.log_metric(
281
+ key,
282
+ score,
283
+ step=step,
284
+ )
285
+
286
+ def reset(self):
287
+ self._call_id_to_metric_key: dict[str, tuple[str, int]] = {}
288
+ self._evaluation_counter = defaultdict(int)
289
+
290
+ def _start_span(
291
+ self,
292
+ call_id: str,
293
+ name: str,
294
+ span_type: SpanType,
295
+ inputs: dict[str, Any],
296
+ attributes: dict[str, Any],
297
+ ):
298
+ if not IS_TRACING_SDK_ONLY:
299
+ from mlflow.pyfunc.context import get_prediction_context
300
+
301
+ prediction_context = get_prediction_context()
302
+ if prediction_context and self._dependencies_schema:
303
+ prediction_context.update(**self._dependencies_schema)
304
+ else:
305
+ prediction_context = None
306
+
307
+ with maybe_set_prediction_context(prediction_context):
308
+ span = start_span_no_context(
309
+ name=name,
310
+ span_type=span_type,
311
+ parent_span=mlflow.get_current_active_span(),
312
+ inputs=inputs,
313
+ attributes=attributes,
314
+ )
315
+
316
+ token = set_span_in_context(span)
317
+ self._call_id_to_span[call_id] = SpanWithToken(span, token)
318
+
319
+ return span
320
+
321
+ def _end_span(
322
+ self,
323
+ call_id: str,
324
+ outputs: Optional[Any],
325
+ exception: Optional[Exception] = None,
326
+ ):
327
+ st = self._call_id_to_span.pop(call_id, None)
328
+
329
+ if not st.span:
330
+ _logger.warning(f"Failed to end a span. Span not found for call_id: {call_id}")
331
+ return
332
+
333
+ status = SpanStatusCode.OK if exception is None else SpanStatusCode.ERROR
334
+
335
+ if exception:
336
+ st.span.add_event(SpanEvent.from_exception(exception))
337
+
338
+ try:
339
+ st.span.end(outputs=outputs, status=status)
340
+ finally:
341
+ detach_span_from_context(st.token)
342
+
343
+ def _get_span_type_for_module(self, instance):
344
+ if isinstance(instance, dspy.Retrieve):
345
+ return SpanType.RETRIEVER
346
+ elif isinstance(instance, dspy.ReAct):
347
+ return SpanType.AGENT
348
+ elif isinstance(instance, dspy.Predict):
349
+ return SpanType.LLM
350
+ elif isinstance(instance, dspy.Adapter):
351
+ return SpanType.PARSER
352
+ else:
353
+ return SpanType.CHAIN
354
+
355
+ def _get_span_attribute_for_module(self, instance):
356
+ if isinstance(instance, dspy.Predict):
357
+ return {"signature": instance.signature.signature}
358
+ elif isinstance(instance, dspy.ChainOfThought):
359
+ if hasattr(instance, "signature"):
360
+ signature = instance.signature.signature
361
+ else:
362
+ signature = instance.predict.signature.signature
363
+
364
+ attributes = {"signature": signature}
365
+ if hasattr(instance, "extended_signature"):
366
+ attributes["extended_signature"] = instance.extended_signature.signature
367
+ return attributes
368
+ return {}
369
+
370
+ def _unpack_kwargs(self, inputs: dict[str, Any]) -> dict[str, Any]:
371
+ """Unpacks the kwargs from the inputs dictionary"""
372
+ # NB: Not using pop() to avoid modifying the original inputs dictionary
373
+ kwargs = inputs.get("kwargs", {})
374
+ inputs_wo_kwargs = {k: v for k, v in inputs.items() if k != "kwargs"}
375
+ return {**inputs_wo_kwargs, **kwargs}
376
+
377
+ def _generate_result_table(
378
+ self, outputs: list[tuple[dspy.Example, dspy.Prediction, Any]]
379
+ ) -> dict[str, list[Any]]:
380
+ result = {"score": []}
381
+ for i, (example, prediction, score) in enumerate(outputs):
382
+ for k, v in example.items():
383
+ if f"example_{k}" not in result:
384
+ result[f"example_{k}"] = [None] * i
385
+ result[f"example_{k}"].append(v)
386
+
387
+ for k, v in prediction.items():
388
+ if f"pred_{k}" not in result:
389
+ result[f"pred_{k}"] = [None] * i
390
+ result[f"pred_{k}"].append(v)
391
+
392
+ result["score"].append(score)
393
+
394
+ for k, v in result.items():
395
+ if len(v) != i + 1:
396
+ result[k].append(None)
397
+
398
+ return result
@@ -0,0 +1 @@
1
+ FLAVOR_NAME = "dspy"
mlflow/dspy/load.py ADDED
@@ -0,0 +1,93 @@
1
+ import logging
2
+ import os
3
+
4
+ import cloudpickle
5
+
6
+ from mlflow.models import Model
7
+ from mlflow.models.dependencies_schemas import _get_dependencies_schema_from_model
8
+ from mlflow.models.model import _update_active_model_id_based_on_mlflow_model
9
+ from mlflow.tracing.provider import trace_disabled
10
+ from mlflow.tracking.artifact_utils import _download_artifact_from_uri
11
+ from mlflow.utils.annotations import experimental
12
+ from mlflow.utils.model_utils import (
13
+ _add_code_from_conf_to_system_path,
14
+ _get_flavor_configuration,
15
+ )
16
+
17
+ _DEFAULT_MODEL_PATH = "data/model.pkl"
18
+ _logger = logging.getLogger(__name__)
19
+
20
+
21
+ def _set_dependency_schema_to_tracer(model_path, callbacks):
22
+ """
23
+ Set dependency schemas from the saved model metadata to the tracer
24
+ to propagate it to inference traces.
25
+ """
26
+ from mlflow.dspy.callback import MlflowCallback
27
+
28
+ tracer = next((cb for cb in callbacks if isinstance(cb, MlflowCallback)), None)
29
+ if tracer is None:
30
+ return
31
+
32
+ model = Model.load(model_path)
33
+ tracer.set_dependencies_schema(_get_dependencies_schema_from_model(model))
34
+
35
+
36
+ def _load_model(model_uri, dst_path=None):
37
+ local_model_path = _download_artifact_from_uri(artifact_uri=model_uri, output_path=dst_path)
38
+ mlflow_model = Model.load(local_model_path)
39
+ flavor_conf = _get_flavor_configuration(model_path=local_model_path, flavor_name="dspy")
40
+
41
+ _add_code_from_conf_to_system_path(local_model_path, flavor_conf)
42
+ model_path = flavor_conf.get("model_path", _DEFAULT_MODEL_PATH)
43
+ with open(os.path.join(local_model_path, model_path), "rb") as f:
44
+ loaded_wrapper = cloudpickle.load(f)
45
+
46
+ _set_dependency_schema_to_tracer(local_model_path, loaded_wrapper.dspy_settings["callbacks"])
47
+ _update_active_model_id_based_on_mlflow_model(mlflow_model)
48
+ return loaded_wrapper
49
+
50
+
51
+ @experimental(version="2.18.0")
52
+ @trace_disabled # Suppress traces for internal calls while loading model
53
+ def load_model(model_uri, dst_path=None):
54
+ """
55
+ Load a Dspy model from a run.
56
+
57
+ This function will also set the global dspy settings `dspy.settings` by the saved settings.
58
+
59
+ Args:
60
+ model_uri: The location, in URI format, of the MLflow model. For example:
61
+
62
+ - ``/Users/me/path/to/local/model``
63
+ - ``relative/path/to/local/model``
64
+ - ``s3://my_bucket/path/to/model``
65
+ - ``runs:/<mlflow_run_id>/run-relative/path/to/model``
66
+ - ``mlflow-artifacts:/path/to/model``
67
+
68
+ For more information about supported URI schemes, see
69
+ `Referencing Artifacts <https://www.mlflow.org/docs/latest/tracking.html#
70
+ artifact-locations>`_.
71
+ dst_path: The local filesystem path to utilize for downloading the model artifact.
72
+ This directory must already exist if provided. If unspecified, a local output
73
+ path will be created.
74
+
75
+ Returns:
76
+ An `dspy.module` instance, representing the dspy model.
77
+ """
78
+ import dspy
79
+
80
+ wrapper = _load_model(model_uri, dst_path)
81
+
82
+ # Set the global dspy settings for reproducing the model's behavior when the model is
83
+ # loaded via `mlflow.dspy.load_model`. Note that for the model to be loaded as pyfunc,
84
+ # settings will be set in the wrapper's `predict` method via local context to avoid the
85
+ # "dspy.settings can only be changed by the thread that initially configured it" error
86
+ # in Databricks model serving.
87
+ dspy.settings.configure(**wrapper.dspy_settings)
88
+
89
+ return wrapper.model
90
+
91
+
92
+ def _load_pyfunc(path):
93
+ return _load_model(path)