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,561 @@
1
+ import inspect
2
+ import json
3
+ import logging
4
+ from functools import singledispatchmethod
5
+ from typing import Any, Generator, Optional, Union
6
+
7
+ import llama_index.core
8
+ import pydantic
9
+ from llama_index.core.base.agent.types import BaseAgent, BaseAgentWorker, TaskStepOutput
10
+ from llama_index.core.base.base_retriever import BaseRetriever
11
+ from llama_index.core.base.embeddings.base import BaseEmbedding
12
+ from llama_index.core.base.llms.base import BaseLLM
13
+ from llama_index.core.base.llms.types import ChatResponse, CompletionResponse
14
+ from llama_index.core.base.response.schema import AsyncStreamingResponse, StreamingResponse
15
+ from llama_index.core.chat_engine.types import StreamingAgentChatResponse
16
+ from llama_index.core.instrumentation.event_handlers import BaseEventHandler
17
+ from llama_index.core.instrumentation.events import BaseEvent
18
+ from llama_index.core.instrumentation.events.agent import AgentToolCallEvent
19
+ from llama_index.core.instrumentation.events.embedding import EmbeddingStartEvent
20
+ from llama_index.core.instrumentation.events.exception import ExceptionEvent
21
+ from llama_index.core.instrumentation.events.llm import (
22
+ LLMChatEndEvent,
23
+ LLMChatStartEvent,
24
+ LLMCompletionEndEvent,
25
+ LLMCompletionStartEvent,
26
+ LLMPredictStartEvent,
27
+ )
28
+ from llama_index.core.instrumentation.events.rerank import ReRankStartEvent
29
+ from llama_index.core.instrumentation.span.base import BaseSpan
30
+ from llama_index.core.instrumentation.span_handlers import BaseSpanHandler
31
+ from llama_index.core.multi_modal_llms import MultiModalLLM
32
+ from llama_index.core.schema import NodeWithScore
33
+ from llama_index.core.tools import BaseTool
34
+ from packaging.version import Version
35
+
36
+ import mlflow
37
+ from mlflow.entities import LiveSpan, SpanEvent, SpanType
38
+ from mlflow.entities.document import Document
39
+ from mlflow.entities.span_status import SpanStatusCode
40
+ from mlflow.llama_index.chat import get_chat_messages_from_event
41
+ from mlflow.tracing.constant import SpanAttributeKey, TokenUsageKey
42
+ from mlflow.tracing.fluent import start_span_no_context
43
+ from mlflow.tracing.provider import detach_span_from_context, set_span_in_context
44
+ from mlflow.tracing.utils import set_span_chat_messages, set_span_chat_tools
45
+ from mlflow.utils.pydantic_utils import model_dump_compat
46
+
47
+ _logger = logging.getLogger(__name__)
48
+
49
+
50
+ def _get_llama_index_version() -> Version:
51
+ return Version(llama_index.core.__version__)
52
+
53
+
54
+ def set_llama_index_tracer():
55
+ """
56
+ Set the MlflowSpanHandler and MlflowEventHandler to the global dispatcher.
57
+ If the handlers are already set, skip setting.
58
+ """
59
+ from llama_index.core.instrumentation import get_dispatcher
60
+
61
+ dsp = get_dispatcher()
62
+ span_handler = None
63
+ for handler in dsp.span_handlers:
64
+ if isinstance(handler, MlflowSpanHandler):
65
+ _logger.debug("MlflowSpanHandler is already set to the dispatcher. Skip setting.")
66
+ span_handler = handler
67
+ break
68
+ else:
69
+ span_handler = MlflowSpanHandler()
70
+ dsp.add_span_handler(span_handler)
71
+
72
+ for handler in dsp.event_handlers:
73
+ if isinstance(handler, MlflowEventHandler):
74
+ _logger.debug("MlflowEventHandler is already set to the dispatcher. Skip setting.")
75
+ break
76
+ else:
77
+ dsp.add_event_handler(MlflowEventHandler(span_handler))
78
+
79
+
80
+ def remove_llama_index_tracer():
81
+ """
82
+ Remove the MlflowSpanHandler and MlflowEventHandler from the global dispatcher.
83
+ """
84
+ from llama_index.core.instrumentation import get_dispatcher
85
+
86
+ dsp = get_dispatcher()
87
+ dsp.span_handlers = [h for h in dsp.span_handlers if h.class_name() != "MlflowSpanHandler"]
88
+ dsp.event_handlers = [h for h in dsp.event_handlers if h.class_name() != "MlflowEventHandler"]
89
+
90
+
91
+ class _LlamaSpan(BaseSpan, extra="allow"):
92
+ _mlflow_span: LiveSpan = pydantic.PrivateAttr()
93
+
94
+ def __init__(self, id_: str, parent_id: Optional[str], mlflow_span: LiveSpan):
95
+ super().__init__(id_=id_, parent_id=parent_id)
96
+ self._mlflow_span = mlflow_span
97
+
98
+
99
+ def _end_span(span: LiveSpan, status=SpanStatusCode.OK, outputs=None, token=None):
100
+ """An utility function to end the span or trace."""
101
+ if isinstance(outputs, (StreamingResponse, AsyncStreamingResponse, StreamingAgentChatResponse)):
102
+ _logger.warning(
103
+ "Trying to record streaming response to the MLflow trace. This may consume "
104
+ "the generator and result in an empty response."
105
+ )
106
+
107
+ # for retriever spans, convert the outputs to Document objects
108
+ # so they can be rendered in a more user-friendly way in the UI
109
+ if (
110
+ span.span_type == SpanType.RETRIEVER
111
+ and isinstance(outputs, list)
112
+ and all(isinstance(item, NodeWithScore) for item in outputs)
113
+ ):
114
+ try:
115
+ outputs = [Document.from_llama_index_node_with_score(node) for node in outputs]
116
+ except Exception as e:
117
+ _logger.debug(
118
+ f"Failed to convert NodeWithScore to Document objects: {e}", exc_info=True
119
+ )
120
+
121
+ if outputs is None:
122
+ outputs = span.outputs
123
+
124
+ try:
125
+ span.end(status=status, outputs=outputs)
126
+ finally:
127
+ # We should detach span even when end_span / end_trace API call fails
128
+ if token:
129
+ detach_span_from_context(token)
130
+
131
+
132
+ class MlflowSpanHandler(BaseSpanHandler[_LlamaSpan], extra="allow"):
133
+ def __init__(self):
134
+ super().__init__()
135
+ self._span_id_to_token = {}
136
+ self._stream_resolver = StreamResolver()
137
+ self._pending_spans: dict[str, _LlamaSpan] = {}
138
+
139
+ @classmethod
140
+ def class_name(cls) -> str:
141
+ return "MlflowSpanHandler"
142
+
143
+ def get_span_for_event(self, event: BaseEvent) -> LiveSpan:
144
+ llama_span = self.open_spans.get(event.span_id) or self._pending_spans.get(event.span_id)
145
+ return llama_span._mlflow_span if llama_span else None
146
+
147
+ def new_span(
148
+ self,
149
+ id_: str,
150
+ bound_args: inspect.BoundArguments,
151
+ instance: Optional[Any] = None,
152
+ parent_span_id: Optional[str] = None,
153
+ **kwargs: Any,
154
+ ) -> _LlamaSpan:
155
+ with self.lock:
156
+ parent = self.open_spans.get(parent_span_id) if parent_span_id else None
157
+
158
+ parent_span = parent._mlflow_span if parent else mlflow.get_current_active_span()
159
+
160
+ try:
161
+ input_args = bound_args.arguments
162
+ attributes = self._get_instance_attributes(instance)
163
+ span_type = self._get_span_type(instance) or SpanType.UNKNOWN
164
+ span = start_span_no_context(
165
+ name=id_.partition("-")[0],
166
+ parent_span=parent_span,
167
+ span_type=span_type,
168
+ inputs=input_args,
169
+ attributes=attributes,
170
+ )
171
+
172
+ token = set_span_in_context(span)
173
+ self._span_id_to_token[span.span_id] = token
174
+
175
+ # NB: The tool definition is passed to LLM via kwargs, but it is not set
176
+ # to the LLM/Chat start event. Therefore, we need to handle it here.
177
+ tools = input_args.get("kwargs", {}).get("tools")
178
+ if tools and span_type in [SpanType.LLM, SpanType.CHAT_MODEL]:
179
+ try:
180
+ set_span_chat_tools(span, tools)
181
+ except Exception as e:
182
+ _logger.debug(f"Failed to set tools for {span}: {e}")
183
+
184
+ return _LlamaSpan(id_=id_, parent_id=parent_span_id, mlflow_span=span)
185
+ except BaseException as e:
186
+ _logger.debug(f"Failed to create a new span: {e}", exc_info=True)
187
+
188
+ def prepare_to_exit_span(
189
+ self,
190
+ id_: str,
191
+ result: Optional[Any] = None,
192
+ **kwargs: Any,
193
+ ) -> _LlamaSpan:
194
+ try:
195
+ with self.lock:
196
+ llama_span = self.open_spans.get(id_)
197
+ if not llama_span:
198
+ return
199
+
200
+ span = llama_span._mlflow_span
201
+ token = self._span_id_to_token.pop(span.span_id, None)
202
+
203
+ if self._stream_resolver.is_streaming_result(result):
204
+ # If the result is a generator, we keep the span in progress for streaming
205
+ # and end it when the generator is exhausted.
206
+ is_pended = self._stream_resolver.register_stream_span(span, result)
207
+ if is_pended:
208
+ self._pending_spans[id_] = llama_span
209
+ # We still need to detach the span from the context, otherwise it will
210
+ # be considered as "active"
211
+ detach_span_from_context(token)
212
+ else:
213
+ # If the span is not pended successfully, end it immediately
214
+ _end_span(span=span, outputs=result, token=token)
215
+ else:
216
+ _end_span(span=span, outputs=result, token=token)
217
+ return llama_span
218
+ except BaseException as e:
219
+ _logger.debug(f"Failed to end a span: {e}", exc_info=True)
220
+
221
+ def resolve_pending_stream_span(self, span: LiveSpan, event: Any):
222
+ """End the pending streaming span(s)"""
223
+ self._stream_resolver.resolve(span, event)
224
+ self._pending_spans.pop(event.span_id, None)
225
+
226
+ def prepare_to_drop_span(self, id_: str, err: Optional[Exception], **kwargs) -> _LlamaSpan:
227
+ """Logic for handling errors during the model execution."""
228
+ with self.lock:
229
+ llama_span = self.open_spans.get(id_)
230
+ span = llama_span._mlflow_span
231
+ token = self._span_id_to_token.pop(span.span_id, None)
232
+
233
+ if _get_llama_index_version() >= Version("0.10.59"):
234
+ # LlamaIndex determines if a workflow is terminated or not by propagating an special
235
+ # exception WorkflowDone. We should treat this exception as a successful termination.
236
+ from llama_index.core.workflow.errors import WorkflowDone
237
+
238
+ if err and isinstance(err, WorkflowDone):
239
+ return _end_span(span=span, status=SpanStatusCode.OK, token=token)
240
+
241
+ span.add_event(SpanEvent.from_exception(err))
242
+ _end_span(span=span, status="ERROR", token=token)
243
+ return llama_span
244
+
245
+ def _get_span_type(self, instance: Any) -> SpanType:
246
+ """
247
+ Map LlamaIndex instance type to MLflow span type. Some span type cannot be determined
248
+ by instance type alone, rather need event info e.g. ChatModel, ReRanker
249
+ """
250
+ if isinstance(instance, (BaseLLM, MultiModalLLM)):
251
+ return SpanType.LLM
252
+ elif isinstance(instance, BaseRetriever):
253
+ return SpanType.RETRIEVER
254
+ elif isinstance(instance, (BaseAgent, BaseAgentWorker)):
255
+ return SpanType.AGENT
256
+ elif isinstance(instance, BaseEmbedding):
257
+ return SpanType.EMBEDDING
258
+ elif isinstance(instance, BaseTool):
259
+ return SpanType.TOOL
260
+ else:
261
+ return SpanType.CHAIN
262
+
263
+ @singledispatchmethod
264
+ def _get_instance_attributes(self, instance: Any) -> dict[str, Any]:
265
+ """
266
+ Extract span attributes from LlamaIndex objects.
267
+
268
+ NB: There are some overlap between attributes extracted from instance metadata and the
269
+ events. For example, model name for an LLM is available in both. However, events might
270
+ not always be triggered (e.g. 3P llm integration doesn't implement the event logic),
271
+ so the instance metadata serves as a fallback source of information.
272
+ """
273
+
274
+ # TODO: Union type hint doesn't work with singledispatchmethod, so we have to define
275
+ # two separate methods for BaseLLM and MultiModalLLM. Once we upgrade to Python 3.10,
276
+ # we can use `BaseLLM | MultiModelLLM` type hint and it works with singledispatchmethod.
277
+ @_get_instance_attributes.register
278
+ def _(self, instance: BaseLLM):
279
+ return self._get_llm_attributes(instance)
280
+
281
+ @_get_instance_attributes.register
282
+ def _(self, instance: MultiModalLLM):
283
+ return self._get_llm_attributes(instance)
284
+
285
+ def _get_llm_attributes(self, instance) -> dict[str, Any]:
286
+ attr = {}
287
+ if metadata := instance.metadata:
288
+ attr["model_name"] = metadata.model_name
289
+ if params_str := metadata.json(exclude_unset=True):
290
+ attr["invocation_params"] = json.loads(params_str)
291
+ return attr
292
+
293
+ @_get_instance_attributes.register
294
+ def _(self, instance: BaseEmbedding):
295
+ return {
296
+ "model_name": instance.model_name,
297
+ "embed_batch_size": instance.embed_batch_size,
298
+ }
299
+
300
+ @_get_instance_attributes.register
301
+ def _(self, instance: BaseTool):
302
+ metadata = instance.metadata
303
+ attributes = {"description": metadata.description}
304
+ try:
305
+ attributes["name"] = metadata.name
306
+ except ValueError:
307
+ # ToolMetadata.get_name() raises ValueError if name is None
308
+ pass
309
+ try:
310
+ attributes["parameters"] = json.loads(metadata.fn_schema_str)
311
+ except ValueError:
312
+ # ToolMetadata.get_fn_schema_str() raises ValueError if fn_schema is None
313
+ pass
314
+ return attributes
315
+
316
+
317
+ class MlflowEventHandler(BaseEventHandler, extra="allow"):
318
+ """
319
+ Event handler processes various events that are triggered during execution.
320
+
321
+ Events are used as supplemental source for recording additional metadata to the span,
322
+ such as model name, parameters to the span, because they are not available in the inputs
323
+ and outputs in SpanHandler.
324
+ """
325
+
326
+ _span_handler: MlflowSpanHandler
327
+
328
+ @classmethod
329
+ def class_name(cls) -> str:
330
+ return "MlflowEventHandler"
331
+
332
+ def __init__(self, _span_handler):
333
+ super().__init__()
334
+ self._span_handler = _span_handler
335
+
336
+ def handle(self, event: BaseEvent) -> Any:
337
+ try:
338
+ if span := self._span_handler.get_span_for_event(event):
339
+ self._handle_event(event, span)
340
+ except Exception as e:
341
+ _logger.debug(f"Failed to handle event: {e}", exc_info=True)
342
+
343
+ @singledispatchmethod
344
+ def _handle_event(self, event: BaseEvent, span: LiveSpan):
345
+ # Pass through the events we are not interested in
346
+ pass
347
+
348
+ @_handle_event.register
349
+ def _(self, event: AgentToolCallEvent, span: LiveSpan):
350
+ span.set_attribute("name", event.tool.name)
351
+ span.set_attribute("description", event.tool.description)
352
+ span.set_attribute("parameters", event.tool.get_parameters_dict())
353
+
354
+ @_handle_event.register
355
+ def _(self, event: EmbeddingStartEvent, span: LiveSpan):
356
+ span.set_attribute("model_dict", event.model_dict)
357
+
358
+ @_handle_event.register
359
+ def _(self, event: LLMPredictStartEvent, span: LiveSpan):
360
+ """
361
+ An event triggered when LLM's predict() is called.
362
+
363
+ In LlamaIndex, predict() is a gateway method that dispatch the request to
364
+ either chat() or completion() method depending on the model type, as well
365
+ as crafting prompt from the template.
366
+ """
367
+ template = event.template
368
+ template_args = {
369
+ **template.kwargs,
370
+ **(event.template_args if event.template_args else {}),
371
+ }
372
+ span.set_attributes(
373
+ {
374
+ "prmopt_template": template.get_template(),
375
+ "template_arguments": {var: template_args.get(var) for var in template_args},
376
+ }
377
+ )
378
+
379
+ @_handle_event.register
380
+ def _(self, event: LLMCompletionStartEvent, span: LiveSpan):
381
+ span.set_attribute("prompt", event.prompt)
382
+ span.set_attribute("model_dict", event.model_dict)
383
+ self._extract_and_set_chat_messages(span, event)
384
+
385
+ @_handle_event.register
386
+ def _(self, event: LLMCompletionEndEvent, span: LiveSpan):
387
+ span.set_attribute("usage", self._extract_token_usage(event.response))
388
+ token_counts = self._parse_usage(span)
389
+ span.set_attribute(SpanAttributeKey.CHAT_USAGE, token_counts)
390
+ self._extract_and_set_chat_messages(span, event)
391
+ self._span_handler.resolve_pending_stream_span(span, event)
392
+
393
+ @_handle_event.register
394
+ def _(self, event: LLMChatStartEvent, span: LiveSpan):
395
+ span.set_attribute(SpanAttributeKey.SPAN_TYPE, SpanType.CHAT_MODEL)
396
+ span.set_attribute("model_dict", event.model_dict)
397
+ self._extract_and_set_chat_messages(span, event)
398
+
399
+ @_handle_event.register
400
+ def _(self, event: LLMChatEndEvent, span: LiveSpan):
401
+ span.set_attribute("usage", self._extract_token_usage(event.response))
402
+ token_counts = self._parse_usage(span)
403
+ span.set_attribute(SpanAttributeKey.CHAT_USAGE, token_counts)
404
+ self._extract_and_set_chat_messages(span, event)
405
+ self._span_handler.resolve_pending_stream_span(span, event)
406
+
407
+ @_handle_event.register
408
+ def _(self, event: ReRankStartEvent, span: LiveSpan):
409
+ span.set_attribute(SpanAttributeKey.SPAN_TYPE, SpanType.RERANKER)
410
+ span.set_attributes(
411
+ {
412
+ "model_name": event.model_name,
413
+ "top_n": event.top_n,
414
+ }
415
+ )
416
+
417
+ @_handle_event.register
418
+ def _(self, event: ExceptionEvent, span: LiveSpan):
419
+ """
420
+ Handle an exception event for stream spans.
421
+
422
+ For non-stream spans, exception is processed by the prepare_to_drop_span() handler of
423
+ the span handler. However, for stream spans, the exception may raised during the
424
+ streaming after it exit. Therefore, we need to resolve the span here.
425
+ """
426
+ self._span_handler.resolve_pending_stream_span(span, event)
427
+
428
+ def _extract_token_usage(
429
+ self, response: Union[ChatResponse, CompletionResponse]
430
+ ) -> dict[str, int]:
431
+ if raw := response.raw:
432
+ # The raw response can be a Pydantic model or a dictionary
433
+ if isinstance(raw, pydantic.BaseModel):
434
+ raw = model_dump_compat(raw)
435
+
436
+ if usage := raw.get("usage"):
437
+ return usage
438
+
439
+ # If the usage is not found in the raw response, look for token counts
440
+ # in additional_kwargs of the completion payload
441
+ usage = {}
442
+ if additional_kwargs := getattr(response, "additional_kwargs", None):
443
+ for k in ["prompt_tokens", "completion_tokens", "total_tokens"]:
444
+ if (v := additional_kwargs.get(k)) is not None:
445
+ usage[k] = v
446
+ return usage
447
+
448
+ def _parse_usage(self, span: LiveSpan):
449
+ try:
450
+ usage = span.get_attribute("usage")
451
+ return {
452
+ TokenUsageKey.INPUT_TOKENS: usage["prompt_tokens"],
453
+ TokenUsageKey.OUTPUT_TOKENS: usage["completion_tokens"],
454
+ TokenUsageKey.TOTAL_TOKENS: usage.get(
455
+ "total_tokens", usage["prompt_tokens"] + usage["completion_tokens"]
456
+ ),
457
+ }
458
+ except Exception as e:
459
+ _logger.debug(f"Failed to set TokenUsage to the span: {e}", exc_info=True)
460
+
461
+ def _extract_and_set_chat_messages(self, span: LiveSpan, event: BaseEvent):
462
+ try:
463
+ messages = get_chat_messages_from_event(event)
464
+ set_span_chat_messages(span, messages, append=True)
465
+ except Exception as e:
466
+ _logger.debug(f"Failed to set chat messages to the span: {e}", exc_info=True)
467
+
468
+
469
+ _StreamEndEvent = Union[LLMChatEndEvent, LLMCompletionEndEvent, ExceptionEvent]
470
+
471
+
472
+ class StreamResolver:
473
+ """
474
+ A class is responsible for closing the pending streaming spans that are waiting
475
+ for the stream to be exhausted. Once the associated stream is exhausted, this
476
+ class will resolve the span, as well as recursively resolve the parent spans
477
+ that returns the same (or derived) stream.
478
+ """
479
+
480
+ def __init__(self):
481
+ self._span_id_to_span_and_gen: dict[str, tuple[LiveSpan, Generator]] = {}
482
+
483
+ def is_streaming_result(self, result: Any) -> bool:
484
+ return (
485
+ inspect.isgenerator(result) # noqa: SIM101
486
+ or isinstance(result, (StreamingResponse, AsyncStreamingResponse))
487
+ or isinstance(result, StreamingAgentChatResponse)
488
+ or (isinstance(result, TaskStepOutput) and self.is_streaming_result(result.output))
489
+ )
490
+
491
+ def register_stream_span(self, span: LiveSpan, result: Any) -> bool:
492
+ """
493
+ Register the pending streaming span with the associated generator.
494
+
495
+ Args:
496
+ span: The span that has a streaming output.
497
+ result: The streaming result that is being processed.
498
+
499
+ Returns:
500
+ True if the span is registered successfully, False otherwise.
501
+ """
502
+ if inspect.isgenerator(result):
503
+ stream = result
504
+ elif isinstance(result, (StreamingResponse, AsyncStreamingResponse)):
505
+ stream = result.response_gen
506
+ elif isinstance(result, StreamingAgentChatResponse):
507
+ stream = result.chat_stream
508
+ elif isinstance(result, TaskStepOutput):
509
+ stream = result.output.chat_stream
510
+ else:
511
+ raise ValueError(f"Unsupported streaming response type: {type(result)}")
512
+
513
+ if inspect.getgeneratorstate(stream) == inspect.GEN_CLOSED:
514
+ # Not registering the span because the generator is already exhausted.
515
+ # It's counter-intuitive that the generator is closed before the response
516
+ # is returned, but it can happen because some agents run streaming request
517
+ # in a separate thread. In this case, the generator can be closed before
518
+ # the response is returned in the main thread.
519
+ return False
520
+
521
+ self._span_id_to_span_and_gen[span.span_id] = (span, stream)
522
+ return True
523
+
524
+ def resolve(self, span: LiveSpan, event: _StreamEndEvent):
525
+ """
526
+ Finish the streaming span and recursively resolve the parent spans that
527
+ returns the same (or derived) stream.
528
+ """
529
+ _, stream = self._span_id_to_span_and_gen.pop(span.span_id, (None, None))
530
+ if not stream:
531
+ return
532
+
533
+ if isinstance(event, (LLMChatEndEvent, LLMCompletionEndEvent)):
534
+ outputs = event.response
535
+ status = SpanStatusCode.OK
536
+ elif isinstance(event, ExceptionEvent):
537
+ outputs = None
538
+ status = SpanStatusCode.ERROR
539
+ span.add_event(SpanEvent.from_exception(event.exception))
540
+ else:
541
+ raise ValueError(f"Unsupported event type to resolve streaming: {type(event)}")
542
+
543
+ _end_span(span=span, status=status, outputs=outputs)
544
+
545
+ # Extract the complete text from the event.
546
+ if isinstance(outputs, ChatResponse):
547
+ output_text = outputs.message.content
548
+ elif isinstance(outputs, CompletionResponse):
549
+ output_text = outputs.response.text
550
+ else:
551
+ output_text = None
552
+
553
+ # Recursively resolve the parent spans that are also waiting for the same token
554
+ # stream to be exhausted.
555
+ while span.parent_id in self._span_id_to_span_and_gen:
556
+ if span_and_stream := self._span_id_to_span_and_gen.pop(span.parent_id, None):
557
+ span, stream = span_and_stream
558
+ # We reuse the same output text for parent spans. This may not be 100% correct
559
+ # as token stream can be modified by callers. However, it is technically
560
+ # challenging to track the modified stream across multiple spans.
561
+ _end_span(span=span, status=status, outputs=output_text)