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,597 @@
1
+ import ast
2
+ import logging
3
+ from contextvars import ContextVar
4
+ from typing import Any, Optional, Sequence, Union
5
+ from uuid import UUID
6
+
7
+ import pydantic
8
+ from langchain_core.agents import AgentAction, AgentFinish
9
+ from langchain_core.callbacks.base import BaseCallbackHandler
10
+ from langchain_core.documents import Document
11
+ from langchain_core.load.dump import dumps
12
+ from langchain_core.messages import BaseMessage
13
+ from langchain_core.outputs import (
14
+ ChatGenerationChunk,
15
+ GenerationChunk,
16
+ LLMResult,
17
+ )
18
+ from tenacity import RetryCallState
19
+
20
+ import mlflow
21
+ from mlflow.entities import Document as MlflowDocument
22
+ from mlflow.entities import LiveSpan, SpanEvent, SpanStatus, SpanStatusCode, SpanType
23
+ from mlflow.entities.span import NO_OP_SPAN_TRACE_ID
24
+ from mlflow.exceptions import MlflowException
25
+ from mlflow.langchain.utils.chat import (
26
+ convert_lc_generation_to_chat_message,
27
+ convert_lc_message_to_chat_message,
28
+ parse_token_usage,
29
+ )
30
+ from mlflow.tracing.constant import SpanAttributeKey
31
+ from mlflow.tracing.fluent import start_span_no_context
32
+ from mlflow.tracing.provider import detach_span_from_context, set_span_in_context
33
+ from mlflow.tracing.utils import (
34
+ maybe_set_prediction_context,
35
+ set_span_chat_messages,
36
+ set_span_chat_tools,
37
+ )
38
+ from mlflow.tracing.utils.token import SpanWithToken
39
+ from mlflow.types.chat import ChatMessage, ChatTool, FunctionToolDefinition
40
+ from mlflow.utils import IS_PYDANTIC_V2_OR_NEWER
41
+ from mlflow.utils.autologging_utils import ExceptionSafeAbstractClass
42
+ from mlflow.version import IS_TRACING_SDK_ONLY
43
+
44
+ if not IS_TRACING_SDK_ONLY:
45
+ from mlflow.pyfunc.context import Context
46
+
47
+
48
+ _logger = logging.getLogger(__name__)
49
+
50
+ _should_attach_span_to_context = ContextVar("should_attach_span_to_context", default=True)
51
+
52
+
53
+ class MlflowLangchainTracer(BaseCallbackHandler, metaclass=ExceptionSafeAbstractClass):
54
+ """
55
+ Callback for auto-logging traces.
56
+ We need to inherit ExceptionSafeAbstractClass to avoid invalid new
57
+ input arguments added to original function call.
58
+
59
+ Args:
60
+ prediction_context: Optional prediction context object to be set for the
61
+ thread-local context. Occasionally this has to be passed manually because
62
+ the callback may be invoked asynchronously and Langchain doesn't correctly
63
+ propagate the thread-local context.
64
+ """
65
+
66
+ def __init__(
67
+ self,
68
+ prediction_context: Optional["Context"] = None,
69
+ ):
70
+ # NB: The tracer can handle multiple traces in parallel under multi-threading scenarios.
71
+ # DO NOT use instance variables to manage the state of single trace.
72
+ super().__init__()
73
+ # run_id: (LiveSpan, OTel token)
74
+ self._run_span_mapping: dict[str, SpanWithToken] = {}
75
+ self._prediction_context = prediction_context
76
+
77
+ def _get_span_by_run_id(self, run_id: UUID) -> Optional[LiveSpan]:
78
+ if span_with_token := self._run_span_mapping.get(str(run_id), None):
79
+ return span_with_token.span
80
+ raise MlflowException(f"Span for run_id {run_id!s} not found.")
81
+
82
+ def _serialize_invocation_params(
83
+ self, attributes: Optional[dict[str, Any]]
84
+ ) -> Optional[dict[str, Any]]:
85
+ """
86
+ Serialize the 'invocation_params' in the attributes dictionary.
87
+ If 'invocation_params' contains a key 'response_format' whose value is a subclass
88
+ of pydantic.BaseModel, replace it with its JSON schema.
89
+ """
90
+ if not attributes:
91
+ return attributes
92
+
93
+ invocation_params = attributes.get("invocation_params")
94
+ if not isinstance(invocation_params, dict):
95
+ return attributes
96
+
97
+ response_format = invocation_params.get("response_format")
98
+ if isinstance(response_format, type) and issubclass(response_format, pydantic.BaseModel):
99
+ try:
100
+ invocation_params["response_format"] = (
101
+ response_format.model_json_schema()
102
+ if IS_PYDANTIC_V2_OR_NEWER
103
+ else response_format.schema()
104
+ )
105
+ except Exception as e:
106
+ _logger.error(
107
+ "Failed to generate JSON schema for response_format: %s", e, exc_info=True
108
+ )
109
+ return attributes
110
+
111
+ def _start_span(
112
+ self,
113
+ span_name: str,
114
+ parent_run_id: Optional[UUID],
115
+ span_type: str,
116
+ run_id: UUID,
117
+ inputs: Optional[Union[str, dict[str, Any]]] = None,
118
+ attributes: Optional[dict[str, Any]] = None,
119
+ ) -> LiveSpan:
120
+ """Start MLflow Span (or Trace if it is root component)"""
121
+ serialized_attributes = self._serialize_invocation_params(attributes)
122
+ dependencies_schemas = (
123
+ self._prediction_context.dependencies_schemas if self._prediction_context else None
124
+ )
125
+ with maybe_set_prediction_context(
126
+ self._prediction_context
127
+ ): # When parent_run_id is None, this is root component so start trace
128
+ span = start_span_no_context(
129
+ name=span_name,
130
+ span_type=span_type,
131
+ parent_span=self._get_parent_span(parent_run_id),
132
+ inputs=inputs,
133
+ attributes=serialized_attributes,
134
+ tags=dependencies_schemas,
135
+ )
136
+
137
+ # Debugging purpose
138
+ if span.trace_id == NO_OP_SPAN_TRACE_ID:
139
+ _logger.debug("No Op span was created, the trace will not be recorded.")
140
+
141
+ # Attach the span to the current context to mark it "active"
142
+ token = set_span_in_context(span) if _should_attach_span_to_context.get() else None
143
+ self._run_span_mapping[str(run_id)] = SpanWithToken(span, token)
144
+ return span
145
+
146
+ def _get_parent_span(self, parent_run_id) -> Optional[LiveSpan]:
147
+ """
148
+ Get parent span from multiple sources:
149
+ 1. If there is an active span in current context, use it as parent span
150
+ 2. If parent_run_id is provided, get the corresponding span from the run -> span mapping
151
+ 3. If none of the above, return None
152
+ """
153
+ if active_span := mlflow.get_current_active_span():
154
+ return active_span
155
+ elif parent_run_id:
156
+ return self._get_span_by_run_id(parent_run_id)
157
+ return None
158
+
159
+ def _end_span(
160
+ self,
161
+ run_id: UUID,
162
+ span: LiveSpan,
163
+ outputs=None,
164
+ attributes=None,
165
+ status=SpanStatus(SpanStatusCode.OK),
166
+ ):
167
+ """Close MLflow Span (or Trace if it is root component)"""
168
+ try:
169
+ with maybe_set_prediction_context(self._prediction_context):
170
+ span.end(
171
+ outputs=outputs,
172
+ attributes=attributes,
173
+ status=status,
174
+ )
175
+ finally:
176
+ # Span should be detached from the context even when the client.end_span fails
177
+ st = self._run_span_mapping.pop(str(run_id), None)
178
+ if _should_attach_span_to_context.get():
179
+ if st.token is None:
180
+ raise MlflowException(
181
+ f"Token for span {st.span} is not found. "
182
+ "Cannot detach the span from context."
183
+ )
184
+ detach_span_from_context(st.token)
185
+
186
+ def flush(self):
187
+ """Flush the state of the tracer."""
188
+ # Ideally, all spans should be popped and ended. However, LangChain sometimes
189
+ # does not trigger the end event properly and some spans may be left open.
190
+ # To avoid leaking tracing context, we remove all spans from the mapping.
191
+ for st in self._run_span_mapping.values():
192
+ if st.token:
193
+ _logger.debug(f"Found leaked span {st.span}. Force ending it.")
194
+ detach_span_from_context(st.token)
195
+
196
+ self._run_span_mapping = {}
197
+
198
+ def _assign_span_name(self, serialized: dict[str, Any], default_name="unknown") -> str:
199
+ return serialized.get("name", serialized.get("id", [default_name])[-1])
200
+
201
+ def on_chat_model_start(
202
+ self,
203
+ serialized: dict[str, Any],
204
+ messages: list[list[BaseMessage]],
205
+ *,
206
+ run_id: UUID,
207
+ tags: Optional[list[str]] = None,
208
+ parent_run_id: Optional[UUID] = None,
209
+ metadata: Optional[dict[str, Any]] = None,
210
+ name: Optional[str] = None,
211
+ **kwargs: Any,
212
+ ):
213
+ """Run when a chat model starts running."""
214
+
215
+ if metadata:
216
+ kwargs.update({"metadata": metadata})
217
+
218
+ span = self._start_span(
219
+ span_name=name or self._assign_span_name(serialized, "chat model"),
220
+ parent_run_id=parent_run_id,
221
+ span_type=SpanType.CHAT_MODEL,
222
+ run_id=run_id,
223
+ inputs=messages,
224
+ attributes=kwargs,
225
+ )
226
+
227
+ mlflow_messages = [
228
+ convert_lc_message_to_chat_message(msg)
229
+ for message_list in messages
230
+ for msg in message_list
231
+ ]
232
+ set_span_chat_messages(span, mlflow_messages)
233
+
234
+ if tools := self._extract_tool_definitions(kwargs):
235
+ set_span_chat_tools(span, tools)
236
+
237
+ def on_llm_start(
238
+ self,
239
+ serialized: dict[str, Any],
240
+ prompts: list[str],
241
+ *,
242
+ run_id: UUID,
243
+ tags: Optional[list[str]] = None,
244
+ parent_run_id: Optional[UUID] = None,
245
+ metadata: Optional[dict[str, Any]] = None,
246
+ name: Optional[str] = None,
247
+ **kwargs: Any,
248
+ ) -> None:
249
+ """Run when LLM (non-chat models) starts running."""
250
+ if metadata:
251
+ kwargs.update({"metadata": metadata})
252
+
253
+ span = self._start_span(
254
+ span_name=name or self._assign_span_name(serialized, "llm"),
255
+ parent_run_id=parent_run_id,
256
+ span_type=SpanType.LLM,
257
+ run_id=run_id,
258
+ inputs=prompts,
259
+ attributes=kwargs,
260
+ )
261
+
262
+ mlflow_messages = [ChatMessage(role="user", content=prompt) for prompt in prompts]
263
+ set_span_chat_messages(span, mlflow_messages)
264
+
265
+ if tools := self._extract_tool_definitions(kwargs):
266
+ set_span_chat_tools(span, tools)
267
+
268
+ def _extract_tool_definitions(self, kwargs: dict[str, Any]) -> list[ChatTool]:
269
+ raw_tools = kwargs.get("invocation_params", {}).get("tools", [])
270
+ tools = []
271
+ for raw_tool in raw_tools:
272
+ # First, try to parse the raw tool dictionary as OpenAI-style tool
273
+ try:
274
+ tool = ChatTool.validate_compat(raw_tool)
275
+ tools.append(tool)
276
+ except pydantic.ValidationError:
277
+ # If not OpenAI style, just try to extract the name and descriptions.
278
+ if name := raw_tool.get("name"):
279
+ tool = ChatTool(
280
+ type="function",
281
+ function=FunctionToolDefinition(
282
+ name=name, description=raw_tool.get("description")
283
+ ),
284
+ )
285
+ tools.append(tool)
286
+ else:
287
+ _logger.warning(f"Failed to parse tool definition for tracing: {raw_tool}.")
288
+
289
+ return tools
290
+
291
+ def on_llm_new_token(
292
+ self,
293
+ token: str,
294
+ *,
295
+ chunk: Optional[Union[GenerationChunk, ChatGenerationChunk]] = None,
296
+ run_id: UUID,
297
+ parent_run_id: Optional[UUID] = None,
298
+ **kwargs: Any,
299
+ ):
300
+ """Run on new LLM token. Only available when streaming is enabled."""
301
+ llm_span = self._get_span_by_run_id(run_id)
302
+ event_kwargs = {"token": token}
303
+ if chunk:
304
+ event_kwargs["chunk"] = dumps(chunk)
305
+ llm_span.add_event(
306
+ SpanEvent(
307
+ name="new_token",
308
+ attributes=event_kwargs,
309
+ )
310
+ )
311
+
312
+ def on_retry(
313
+ self,
314
+ retry_state: RetryCallState,
315
+ *,
316
+ run_id: UUID,
317
+ **kwargs: Any,
318
+ ):
319
+ """Run on a retry event."""
320
+ span = self._get_span_by_run_id(run_id)
321
+ retry_d: dict[str, Any] = {
322
+ "slept": retry_state.idle_for,
323
+ "attempt": retry_state.attempt_number,
324
+ }
325
+ if retry_state.outcome is None:
326
+ retry_d["outcome"] = "N/A"
327
+ elif retry_state.outcome.failed:
328
+ retry_d["outcome"] = "failed"
329
+ exception = retry_state.outcome.exception()
330
+ retry_d["exception"] = str(exception)
331
+ retry_d["exception_type"] = exception.__class__.__name__
332
+ else:
333
+ retry_d["outcome"] = "success"
334
+ retry_d["result"] = str(retry_state.outcome.result())
335
+ span.add_event(
336
+ SpanEvent(
337
+ name="retry",
338
+ attributes=retry_d,
339
+ )
340
+ )
341
+
342
+ def on_llm_end(self, response: LLMResult, *, run_id: UUID, **kwargs: Any):
343
+ """End the span for an LLM run."""
344
+ llm_span = self._get_span_by_run_id(run_id)
345
+
346
+ # Record the chat messages attribute
347
+ input_messages = llm_span.get_attribute(SpanAttributeKey.CHAT_MESSAGES) or []
348
+ # response.generations is a nested list of messages
349
+ generations = [g for gen_list in response.generations for g in gen_list]
350
+ output_messages = [convert_lc_generation_to_chat_message(g) for g in generations]
351
+ set_span_chat_messages(llm_span, input_messages + output_messages)
352
+
353
+ # Record the token usage attribute
354
+ try:
355
+ if usage := parse_token_usage(generations):
356
+ llm_span.set_attribute(SpanAttributeKey.CHAT_USAGE, usage)
357
+ except Exception as e:
358
+ _logger.debug(f"Failed to log token usage for LangChain: {e}", exc_info=True)
359
+
360
+ self._end_span(run_id, llm_span, outputs=response)
361
+
362
+ def on_llm_error(
363
+ self,
364
+ error: BaseException,
365
+ *,
366
+ run_id: UUID,
367
+ **kwargs: Any,
368
+ ):
369
+ """Handle an error for an LLM run."""
370
+ llm_span = self._get_span_by_run_id(run_id)
371
+ llm_span.add_event(SpanEvent.from_exception(error))
372
+ self._end_span(run_id, llm_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
373
+
374
+ def on_chain_start(
375
+ self,
376
+ serialized: dict[str, Any],
377
+ inputs: Union[dict[str, Any], Any],
378
+ *,
379
+ run_id: UUID,
380
+ tags: Optional[list[str]] = None,
381
+ parent_run_id: Optional[UUID] = None,
382
+ metadata: Optional[dict[str, Any]] = None,
383
+ run_type: Optional[str] = None,
384
+ name: Optional[str] = None,
385
+ **kwargs: Any,
386
+ ):
387
+ """Start span for a chain run."""
388
+ if metadata:
389
+ kwargs.update({"metadata": metadata})
390
+ # not considering streaming events for now
391
+ self._start_span(
392
+ span_name=name or self._assign_span_name(serialized, "chain"),
393
+ parent_run_id=parent_run_id,
394
+ span_type=SpanType.CHAIN,
395
+ run_id=run_id,
396
+ inputs=inputs,
397
+ attributes=kwargs,
398
+ )
399
+
400
+ def on_chain_end(
401
+ self,
402
+ outputs: dict[str, Any],
403
+ *,
404
+ run_id: UUID,
405
+ inputs: Optional[Union[dict[str, Any], Any]] = None,
406
+ **kwargs: Any,
407
+ ):
408
+ """Run when chain ends running."""
409
+ chain_span = self._get_span_by_run_id(run_id)
410
+ if inputs:
411
+ chain_span.set_inputs(inputs)
412
+ self._end_span(run_id, chain_span, outputs=outputs)
413
+
414
+ def on_chain_error(
415
+ self,
416
+ error: BaseException,
417
+ *,
418
+ inputs: Optional[Union[dict[str, Any], Any]] = None,
419
+ run_id: UUID,
420
+ **kwargs: Any,
421
+ ):
422
+ """Run when chain errors."""
423
+ chain_span = self._get_span_by_run_id(run_id)
424
+ if inputs:
425
+ chain_span.set_inputs(inputs)
426
+ chain_span.add_event(SpanEvent.from_exception(error))
427
+ self._end_span(run_id, chain_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
428
+
429
+ def on_tool_start(
430
+ self,
431
+ serialized: dict[str, Any],
432
+ input_str: str,
433
+ *,
434
+ run_id: UUID,
435
+ tags: Optional[list[str]] = None,
436
+ parent_run_id: Optional[UUID] = None,
437
+ metadata: Optional[dict[str, Any]] = None,
438
+ name: Optional[str] = None,
439
+ # We don't use inputs here because LangChain override the original inputs
440
+ # with None for some cases. In order to avoid losing the original inputs,
441
+ # we try to parse the input_str instead.
442
+ # https://github.com/langchain-ai/langchain/blob/2813e8640703b8066d8dd6c739829bb4f4aa634e/libs/core/langchain_core/tools/base.py#L636-L640
443
+ inputs: Optional[dict[str, Any]] = None,
444
+ **kwargs: Any,
445
+ ):
446
+ """Start span for a tool run."""
447
+ if metadata:
448
+ kwargs.update({"metadata": metadata})
449
+
450
+ # For function calling, input_str can be a stringified dictionary
451
+ # like "{'key': 'value'}". We try parsing it for better rendering,
452
+ # but conservatively fallback to original if it fails.
453
+ try:
454
+ inputs = ast.literal_eval(input_str)
455
+ except Exception:
456
+ inputs = input_str
457
+
458
+ self._start_span(
459
+ span_name=name or self._assign_span_name(serialized, "tool"),
460
+ parent_run_id=parent_run_id,
461
+ span_type=SpanType.TOOL,
462
+ run_id=run_id,
463
+ inputs=inputs,
464
+ attributes=kwargs,
465
+ )
466
+
467
+ def on_tool_end(self, output: Any, *, run_id: UUID, **kwargs: Any):
468
+ """Run when tool ends running."""
469
+ tool_span = self._get_span_by_run_id(run_id)
470
+ self._end_span(run_id, tool_span, outputs=output)
471
+
472
+ def on_tool_error(
473
+ self,
474
+ error: BaseException,
475
+ *,
476
+ run_id: UUID,
477
+ **kwargs: Any,
478
+ ):
479
+ """Run when tool errors."""
480
+ tool_span = self._get_span_by_run_id(run_id)
481
+ tool_span.add_event(SpanEvent.from_exception(error))
482
+ self._end_span(run_id, tool_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
483
+
484
+ def on_retriever_start(
485
+ self,
486
+ serialized: dict[str, Any],
487
+ query: str,
488
+ *,
489
+ run_id: UUID,
490
+ parent_run_id: Optional[UUID] = None,
491
+ tags: Optional[list[str]] = None,
492
+ metadata: Optional[dict[str, Any]] = None,
493
+ name: Optional[str] = None,
494
+ **kwargs: Any,
495
+ ):
496
+ """Run when Retriever starts running."""
497
+ if metadata:
498
+ kwargs.update({"metadata": metadata})
499
+ self._start_span(
500
+ span_name=name or self._assign_span_name(serialized, "retriever"),
501
+ parent_run_id=parent_run_id,
502
+ span_type=SpanType.RETRIEVER,
503
+ run_id=run_id,
504
+ inputs=query,
505
+ attributes=kwargs,
506
+ )
507
+
508
+ def on_retriever_end(self, documents: Sequence[Document], *, run_id: UUID, **kwargs: Any):
509
+ """Run when Retriever ends running."""
510
+ retriever_span = self._get_span_by_run_id(run_id)
511
+ try:
512
+ # attempt to convert documents to MlflowDocument
513
+ documents = [MlflowDocument.from_langchain_document(doc) for doc in documents]
514
+ except Exception as e:
515
+ _logger.debug(
516
+ f"Failed to convert LangChain Document to MLflow Document: {e}",
517
+ exc_info=True,
518
+ )
519
+ self._end_span(
520
+ run_id,
521
+ retriever_span,
522
+ outputs=documents,
523
+ )
524
+
525
+ def on_retriever_error(
526
+ self,
527
+ error: BaseException,
528
+ *,
529
+ run_id: UUID,
530
+ **kwargs: Any,
531
+ ):
532
+ """Run when Retriever errors."""
533
+ retriever_span = self._get_span_by_run_id(run_id)
534
+ retriever_span.add_event(SpanEvent.from_exception(error))
535
+ self._end_span(run_id, retriever_span, status=SpanStatus(SpanStatusCode.ERROR, str(error)))
536
+
537
+ def on_agent_action(
538
+ self,
539
+ action: AgentAction,
540
+ *,
541
+ run_id: UUID,
542
+ **kwargs: Any,
543
+ ) -> Any:
544
+ """
545
+ Run on agent action.
546
+
547
+ NB: Agent action doesn't create a new LangChain Run, so instead of creating a new span,
548
+ an action will be recorded as an event of the existing span created by a parent chain.
549
+ """
550
+ span = self._get_span_by_run_id(run_id)
551
+ span.add_event(
552
+ SpanEvent(
553
+ name="agent_action",
554
+ attributes={
555
+ "tool": action.tool,
556
+ "tool_input": dumps(action.tool_input),
557
+ "log": action.log,
558
+ },
559
+ )
560
+ )
561
+
562
+ def on_agent_finish(
563
+ self,
564
+ finish: AgentFinish,
565
+ *,
566
+ run_id: UUID,
567
+ **kwargs: Any,
568
+ ) -> Any:
569
+ """Run on agent end."""
570
+ span = self._get_span_by_run_id(run_id)
571
+ span.add_event(
572
+ SpanEvent(
573
+ name="agent_finish",
574
+ attributes={"return_values": dumps(finish.return_values), "log": finish.log},
575
+ )
576
+ )
577
+
578
+ def on_text(
579
+ self,
580
+ text: str,
581
+ *,
582
+ run_id: UUID,
583
+ parent_run_id: Optional[UUID] = None,
584
+ **kwargs: Any,
585
+ ) -> Any:
586
+ """Run on arbitrary text."""
587
+ try:
588
+ span = self._get_span_by_run_id(run_id)
589
+ except MlflowException:
590
+ _logger.warning("Span not found for text event. Skipping text event logging.")
591
+ else:
592
+ span.add_event(
593
+ SpanEvent(
594
+ "text",
595
+ attributes={"text": text},
596
+ )
597
+ )