rasa-pro 3.14.0.dev20250922__py3-none-any.whl → 3.14.0rc1__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.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (290) hide show
  1. rasa/__main__.py +15 -3
  2. rasa/agents/__init__.py +0 -0
  3. rasa/agents/agent_factory.py +122 -0
  4. rasa/agents/agent_manager.py +211 -0
  5. rasa/agents/constants.py +43 -0
  6. rasa/agents/core/__init__.py +0 -0
  7. rasa/agents/core/agent_protocol.py +107 -0
  8. rasa/agents/core/types.py +81 -0
  9. rasa/agents/exceptions.py +38 -0
  10. rasa/agents/protocol/__init__.py +5 -0
  11. rasa/agents/protocol/a2a/__init__.py +0 -0
  12. rasa/agents/protocol/a2a/a2a_agent.py +879 -0
  13. rasa/agents/protocol/mcp/__init__.py +0 -0
  14. rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
  15. rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
  16. rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
  17. rasa/agents/schemas/__init__.py +13 -0
  18. rasa/agents/schemas/agent_input.py +38 -0
  19. rasa/agents/schemas/agent_output.py +26 -0
  20. rasa/agents/schemas/agent_tool_result.py +65 -0
  21. rasa/agents/schemas/agent_tool_schema.py +186 -0
  22. rasa/agents/templates/__init__.py +0 -0
  23. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
  24. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
  25. rasa/agents/utils.py +206 -0
  26. rasa/agents/validation.py +485 -0
  27. rasa/api.py +24 -9
  28. rasa/builder/config.py +6 -2
  29. rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
  30. rasa/builder/guardrails/constants.py +3 -0
  31. rasa/builder/guardrails/models.py +45 -10
  32. rasa/builder/guardrails/policy_checker.py +324 -0
  33. rasa/builder/guardrails/utils.py +42 -276
  34. rasa/builder/llm_service.py +32 -5
  35. rasa/builder/models.py +1 -0
  36. rasa/builder/project_generator.py +6 -1
  37. rasa/builder/service.py +16 -13
  38. rasa/builder/training_service.py +18 -24
  39. rasa/builder/validation_service.py +1 -1
  40. rasa/cli/arguments/default_arguments.py +12 -0
  41. rasa/cli/arguments/run.py +2 -0
  42. rasa/cli/arguments/train.py +2 -0
  43. rasa/cli/data.py +10 -8
  44. rasa/cli/dialogue_understanding_test.py +10 -7
  45. rasa/cli/e2e_test.py +9 -6
  46. rasa/cli/evaluate.py +4 -2
  47. rasa/cli/export.py +5 -2
  48. rasa/cli/inspect.py +8 -4
  49. rasa/cli/interactive.py +5 -4
  50. rasa/cli/llm_fine_tuning.py +11 -6
  51. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  52. rasa/cli/run.py +12 -10
  53. rasa/cli/scaffold.py +4 -4
  54. rasa/cli/shell.py +9 -5
  55. rasa/cli/studio/studio.py +1 -1
  56. rasa/cli/test.py +34 -14
  57. rasa/cli/train.py +41 -28
  58. rasa/cli/utils.py +1 -393
  59. rasa/cli/validation/__init__.py +0 -0
  60. rasa/cli/validation/bot_config.py +223 -0
  61. rasa/cli/validation/config_path_validation.py +257 -0
  62. rasa/cli/x.py +8 -4
  63. rasa/constants.py +7 -1
  64. rasa/core/actions/action.py +51 -10
  65. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  66. rasa/core/agent.py +19 -2
  67. rasa/core/available_agents.py +229 -0
  68. rasa/core/channels/__init__.py +82 -35
  69. rasa/core/channels/development_inspector.py +3 -3
  70. rasa/core/channels/inspector/README.md +25 -13
  71. rasa/core/channels/inspector/dist/assets/{arc-35222594.js → arc-6177260a.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-a0efbfd3.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-0584c0f2.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  75. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-39f40dbe.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-1ad755f3.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  78. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-b0f4f0fe.js → createText-2e5e7dd3-088372e2.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-9039bff9.js → edges-e0da2a9e-58676240.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-65c9b127.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4f08b38e.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-e95c362a.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  84. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-703c3015.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-699328ea.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-04cf4b05.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{graph-ee94449e.js → graph-0a6f8466.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{index-3862675e-940162b4.js → index-3862675e-7610671a.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  90. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-c79c2866.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-84489d30.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{layout-a9aa9858.js → layout-e7fbc2bf.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{line-eb73cf26.js → line-a8aa457c.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/{linear-b3399f9a.js → linear-3351e0d2.js} +1 -1
  95. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-b095bf1a.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-07644b66.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-573a3f9c.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d457e1e1.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  99. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-9d26e1a2.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-3a9cde10.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-4f3e8cec.js → stateDiagram-587899a1-0e770395.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-e617e5bf.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  103. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-eab30d2f.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-09994be2.js → styles-9a916d00-884a8b5b.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-b7110364.js → styles-c10674c1-dc097813.js} +1 -1
  106. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-3ebc92ad.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-7d13d2f2.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-488385e1.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +18 -18
  111. rasa/core/channels/inspector/src/App.tsx +29 -4
  112. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  113. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  114. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +7 -4
  115. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  116. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  117. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  118. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  119. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  120. rasa/core/channels/inspector/src/types.ts +21 -0
  121. rasa/core/channels/inspector/yarn.lock +336 -189
  122. rasa/core/channels/studio_chat.py +6 -6
  123. rasa/core/channels/telegram.py +4 -9
  124. rasa/core/channels/voice_stream/genesys.py +1 -1
  125. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  126. rasa/core/channels/voice_stream/twilio_media_streams.py +5 -1
  127. rasa/core/channels/voice_stream/voice_channel.py +3 -0
  128. rasa/core/config/__init__.py +0 -0
  129. rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
  130. rasa/core/config/configuration.py +260 -0
  131. rasa/core/config/credentials.py +19 -0
  132. rasa/core/config/message_procesing_config.py +34 -0
  133. rasa/core/constants.py +4 -0
  134. rasa/core/policies/enterprise_search_policy.py +5 -3
  135. rasa/core/policies/flow_policy.py +4 -4
  136. rasa/core/policies/flows/agent_executor.py +632 -0
  137. rasa/core/policies/flows/flow_executor.py +136 -75
  138. rasa/core/policies/flows/mcp_tool_executor.py +298 -0
  139. rasa/core/policies/intentless_policy.py +1 -1
  140. rasa/core/policies/ted_policy.py +20 -12
  141. rasa/core/policies/unexpected_intent_policy.py +6 -0
  142. rasa/core/processor.py +68 -44
  143. rasa/core/run.py +37 -8
  144. rasa/core/test.py +4 -0
  145. rasa/core/tracker_stores/tracker_store.py +3 -7
  146. rasa/core/train.py +1 -1
  147. rasa/core/training/interactive.py +20 -18
  148. rasa/core/training/story_conflict.py +5 -5
  149. rasa/core/utils.py +22 -23
  150. rasa/dialogue_understanding/commands/__init__.py +8 -0
  151. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  152. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  153. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  154. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  155. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  156. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  157. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  158. rasa/dialogue_understanding/commands/utils.py +124 -2
  159. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  160. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  161. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  162. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  163. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  164. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  165. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  166. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  167. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  168. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  169. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  170. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  171. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  172. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  173. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  174. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  175. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  176. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  177. rasa/dialogue_understanding/stack/utils.py +57 -3
  178. rasa/dialogue_understanding/utils.py +24 -4
  179. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  180. rasa/e2e_test/e2e_test_runner.py +13 -3
  181. rasa/engine/caching.py +2 -2
  182. rasa/engine/constants.py +1 -1
  183. rasa/engine/recipes/default_components.py +138 -49
  184. rasa/engine/recipes/default_recipe.py +108 -11
  185. rasa/engine/runner/dask.py +8 -5
  186. rasa/engine/validation.py +19 -6
  187. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  188. rasa/hooks.py +5 -5
  189. rasa/llm_fine_tuning/utils.py +2 -2
  190. rasa/model_training.py +60 -47
  191. rasa/nlu/classifiers/diet_classifier.py +198 -98
  192. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  193. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  194. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  195. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  196. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  197. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  198. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  199. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  200. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  201. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  202. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  203. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  204. rasa/nlu/selectors/response_selector.py +10 -2
  205. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  206. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  207. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  208. rasa/nlu/utils/mitie_utils.py +3 -0
  209. rasa/nlu/utils/spacy_utils.py +3 -2
  210. rasa/plugin.py +8 -8
  211. rasa/privacy/privacy_manager.py +12 -3
  212. rasa/server.py +15 -3
  213. rasa/shared/agents/__init__.py +0 -0
  214. rasa/shared/agents/auth/__init__.py +0 -0
  215. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  216. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  217. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  218. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  219. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  220. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  221. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
  222. rasa/shared/agents/auth/constants.py +12 -0
  223. rasa/shared/agents/auth/types.py +12 -0
  224. rasa/shared/agents/utils.py +35 -0
  225. rasa/shared/constants.py +8 -0
  226. rasa/shared/core/constants.py +16 -1
  227. rasa/shared/core/domain.py +0 -7
  228. rasa/shared/core/events.py +327 -0
  229. rasa/shared/core/flows/constants.py +5 -0
  230. rasa/shared/core/flows/flows_list.py +21 -5
  231. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  232. rasa/shared/core/flows/steps/call.py +49 -5
  233. rasa/shared/core/flows/steps/collect.py +98 -13
  234. rasa/shared/core/flows/validation.py +372 -8
  235. rasa/shared/core/flows/yaml_flows_io.py +3 -2
  236. rasa/shared/core/slots.py +2 -2
  237. rasa/shared/core/trackers.py +5 -2
  238. rasa/shared/exceptions.py +16 -0
  239. rasa/shared/importers/rasa.py +1 -1
  240. rasa/shared/importers/utils.py +9 -3
  241. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  242. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  243. rasa/shared/providers/llm/llm_client.py +7 -3
  244. rasa/shared/providers/llm/llm_response.py +66 -0
  245. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  246. rasa/shared/utils/common.py +24 -0
  247. rasa/shared/utils/health_check/health_check.py +7 -3
  248. rasa/shared/utils/llm.py +39 -16
  249. rasa/shared/utils/mcp/__init__.py +0 -0
  250. rasa/shared/utils/mcp/server_connection.py +247 -0
  251. rasa/shared/utils/mcp/utils.py +20 -0
  252. rasa/shared/utils/schemas/events.py +42 -0
  253. rasa/shared/utils/yaml.py +3 -1
  254. rasa/studio/pull/pull.py +3 -2
  255. rasa/studio/train.py +8 -7
  256. rasa/studio/upload.py +3 -6
  257. rasa/telemetry.py +69 -5
  258. rasa/tracing/config.py +45 -12
  259. rasa/tracing/constants.py +14 -0
  260. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  261. rasa/tracing/instrumentation/instrumentation.py +626 -21
  262. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  263. rasa/tracing/instrumentation/metrics.py +32 -0
  264. rasa/tracing/metric_instrument_provider.py +68 -0
  265. rasa/utils/common.py +92 -1
  266. rasa/utils/endpoints.py +11 -2
  267. rasa/utils/log_utils.py +96 -5
  268. rasa/utils/ml_utils.py +1 -1
  269. rasa/utils/tensorflow/__init__.py +7 -0
  270. rasa/utils/tensorflow/callback.py +136 -101
  271. rasa/utils/tensorflow/crf.py +1 -1
  272. rasa/utils/tensorflow/data_generator.py +21 -8
  273. rasa/utils/tensorflow/layers.py +21 -11
  274. rasa/utils/tensorflow/metrics.py +7 -3
  275. rasa/utils/tensorflow/models.py +56 -8
  276. rasa/utils/tensorflow/rasa_layers.py +8 -6
  277. rasa/utils/tensorflow/transformer.py +2 -3
  278. rasa/utils/train_utils.py +54 -24
  279. rasa/validator.py +5 -5
  280. rasa/version.py +1 -1
  281. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +46 -41
  282. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +285 -226
  283. rasa/builder/scrape_rasa_docs.py +0 -97
  284. rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +0 -1
  285. rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +0 -1
  286. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +0 -1
  287. rasa/core/channels/inspector/dist/assets/index-c941dcb3.js +0 -1336
  288. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
  289. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
  290. {rasa_pro-3.14.0.dev20250922.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
rasa/tracing/constants.py CHANGED
@@ -11,6 +11,11 @@ ENDPOINTS_OTLP_BACKEND_TYPE = "otlp"
11
11
  PROMPT_TOKEN_LENGTH_ATTRIBUTE_NAME = "len_prompt_tokens"
12
12
  REQUEST_BODY_SIZE_IN_BYTES_ATTRIBUTE_NAME = "request_body_size_in_bytes"
13
13
 
14
+ # Tool output value truncation
15
+ # Truncate slot values to prevent excessive memory usage in traces
16
+ # while preserving enough context for debugging
17
+ TOOL_OUTPUT_VALUE_MAX_LENGTH = 500
18
+
14
19
  # metrics constants
15
20
  LLM_COMMAND_GENERATOR_CPU_USAGE_METRIC_NAME = "llm_command_generator_cpu_usage"
16
21
  LLM_COMMAND_GENERATOR_MEMORY_USAGE_METRIC_NAME = "llm_command_generator_memory_usage"
@@ -88,5 +93,14 @@ CONTEXTUAL_RESPONSE_REPHRASER_LLM_RESPONSE_DURATION_METRIC_NAME = (
88
93
  RASA_CLIENT_REQUEST_DURATION_METRIC_NAME = "rasa_client_request_duration"
89
94
  RASA_CLIENT_REQUEST_BODY_SIZE_METRIC_NAME = "rasa_client_request_body_size"
90
95
 
96
+ # Agent and MCP tool execution duration metrics
97
+ AGENT_EXECUTION_DURATION_METRIC_NAME = "agent_execution_duration"
98
+ MCP_TOOL_EXECUTION_DURATION_METRIC_NAME = "mcp_tool_execution_duration"
99
+
100
+ # MCP Agent LLM metrics
101
+ MCP_AGENT_LLM_CPU_USAGE_METRIC_NAME = "mcp_agent_llm_cpu_usage"
102
+ MCP_AGENT_LLM_MEMORY_USAGE_METRIC_NAME = "mcp_agent_llm_memory_usage"
103
+ MCP_AGENT_LLM_PROMPT_TOKEN_USAGE_METRIC_NAME = "mcp_agent_llm_prompt_token_usage"
104
+ MCP_AGENT_LLM_RESPONSE_DURATION_METRIC_NAME = "mcp_agent_llm_response_duration"
91
105
  LLM_BASED_COMMAND_GENERATOR_CPU_MEMORY_USAGE_UNIT_NAME = "percentage"
92
106
  DURATION_UNIT_NAME = "ms"
@@ -3,6 +3,12 @@ import logging
3
3
  from pathlib import Path
4
4
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
5
5
 
6
+ if TYPE_CHECKING:
7
+ from rasa.agents.protocol.a2a.a2a_agent import A2AAgent
8
+ from rasa.agents.protocol.mcp.mcp_base_agent import MCPBaseAgent
9
+ from rasa.agents.schemas import AgentInput
10
+ from rasa.core.agent import Agent
11
+
6
12
  import tiktoken
7
13
  from numpy import ndarray
8
14
  from rasa_sdk.grpc_py import action_webhook_pb2
@@ -10,7 +16,8 @@ from rasa_sdk.grpc_py import action_webhook_pb2
10
16
  from rasa.core.actions.action import DirectCustomActionExecutor
11
17
  from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
12
18
  from rasa.core.actions.http_custom_action_executor import HTTPCustomActionExecutor
13
- from rasa.core.agent import Agent
19
+
20
+ # Import moved inside function to avoid circular import
14
21
  from rasa.core.brokers.broker import EventBroker
15
22
  from rasa.core.channels import UserMessage
16
23
  from rasa.core.lock_store import LOCK_LIFETIME, LockStore
@@ -60,10 +67,13 @@ from rasa.shared.core.constants import REQUESTED_SLOT
60
67
  from rasa.shared.core.domain import Domain
61
68
  from rasa.shared.core.events import DialogueStackUpdated, Event
62
69
  from rasa.shared.core.flows import Flow, FlowsList, FlowStep
70
+ from rasa.shared.core.flows.steps import CallFlowStep
71
+ from rasa.shared.core.slots import Slot
63
72
  from rasa.shared.core.trackers import DialogueStateTracker
64
73
  from rasa.shared.core.training_data.structures import StoryGraph
65
74
  from rasa.shared.importers.importer import TrainingDataImporter
66
75
  from rasa.shared.nlu.constants import INTENT_NAME_KEY, SET_SLOT_COMMAND
76
+ from rasa.shared.utils.health_check.health_check import is_api_health_check_enabled
67
77
  from rasa.shared.utils.llm import (
68
78
  combine_custom_and_default_config,
69
79
  resolve_model_client_config,
@@ -92,7 +102,7 @@ logger = logging.getLogger(__name__)
92
102
 
93
103
 
94
104
  def extract_attrs_for_agent(
95
- self: Agent,
105
+ self: "Agent",
96
106
  message: UserMessage,
97
107
  ) -> Dict[str, Any]:
98
108
  """Extract the attributes for `Agent.handle_message`.
@@ -335,8 +345,12 @@ def extract_llm_config(
335
345
  # ContextualResponseRephraser is not a graph component, so it's
336
346
  # not having a full config.
337
347
  config = {"llm": self.llm_config}
338
- else:
348
+ elif hasattr(self, "config"):
339
349
  config = self.config
350
+ else:
351
+ # For MCP agents and other components without a config attribute,
352
+ # create a config from the available llm_config
353
+ config = {"llm": getattr(self, "_llm_config", None)}
340
354
 
341
355
  llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY))
342
356
  llm_property = combine_custom_and_default_config(llm_config, default_llm_config)
@@ -446,8 +460,6 @@ def extract_attrs_for_performing_health_check(
446
460
  log_source_method: str,
447
461
  log_source_component: str,
448
462
  ) -> Dict[str, Any]:
449
- from rasa.shared.utils.health_check.health_check import is_api_health_check_enabled
450
-
451
463
  attrs = {
452
464
  "api_health_check_enabled": is_api_health_check_enabled(),
453
465
  "health_check_trigger_component": log_source_component,
@@ -460,6 +472,29 @@ def extract_attrs_for_performing_health_check(
460
472
  return attrs
461
473
 
462
474
 
475
+ def extract_attrs_for_a2a_agent_perform_health_check(
476
+ self: "A2AAgent",
477
+ ) -> Dict[str, Any]:
478
+ """Extract attributes for A2A agent health check method."""
479
+ attrs = {
480
+ "api_health_check_enabled": is_api_health_check_enabled(),
481
+ "health_check_trigger_component": "A2AAgent",
482
+ "health_check_trigger_method": "_perform_health_check",
483
+ "health_check_type": "a2a_agent_connectivity",
484
+ }
485
+
486
+ # A2A agents don't have config in the same way as LLM components,
487
+ # but we can include basic agent info for consistency
488
+ if is_api_health_check_enabled():
489
+ attrs["agent_name"] = getattr(self, "_name", "unknown")
490
+ agent_url = "unknown"
491
+ if hasattr(self, "agent_card") and self.agent_card:
492
+ agent_url = str(getattr(self.agent_card, "url", "unknown"))
493
+ attrs["agent_url"] = agent_url
494
+
495
+ return attrs
496
+
497
+
463
498
  def extract_attrs_for_execute_commands(
464
499
  tracker: DialogueStateTracker,
465
500
  all_flows: FlowsList,
@@ -585,7 +620,10 @@ def extract_attrs_for_check_commands_against_startable_flows(
585
620
 
586
621
 
587
622
  def extract_attrs_for_advance_flows(
588
- tracker: DialogueStateTracker, available_actions: List[str], flows: FlowsList
623
+ tracker: DialogueStateTracker,
624
+ available_actions: List[str],
625
+ flows: FlowsList,
626
+ slots: List[Slot],
589
627
  ) -> Dict[str, Any]:
590
628
  from rasa.tracing.instrumentation.instrumentation import FLOW_EXECUTOR_MODULE_NAME
591
629
 
@@ -602,8 +640,10 @@ def extract_attrs_for_du_print_test_results(
602
640
  test_suite_result: DialogueUnderstandingTestSuiteResult,
603
641
  output_prompt: bool,
604
642
  ) -> Dict[str, Any]:
605
- """Extract the attributes for
606
- `rasa.dialogue_understanding_test.io.print_test_results` function.
643
+ """Extract the attributes for print_test_results function.
644
+
645
+ This function extracts tracing attributes for the dialogue understanding
646
+ test results printing functionality.
607
647
  """
608
648
  from rasa.tracing.instrumentation.instrumentation import (
609
649
  DIALOG_UNDERSTANDING_TEST_IO_MODULE_NAME,
@@ -683,6 +723,35 @@ def extract_attrs_for_du_print_test_results(
683
723
  return attributes_dict
684
724
 
685
725
 
726
+ def extract_call_flow_step_attributes(step: "CallFlowStep") -> Dict[str, Any]:
727
+ """Extract common CallFlowStep attributes for tracing.
728
+
729
+ Args:
730
+ step: CallFlowStep instance
731
+
732
+ Returns:
733
+ Dictionary of CallFlowStep attributes for tracing
734
+ """
735
+ attrs = {
736
+ "step_type": "CallFlowStep",
737
+ "call_target": step.call,
738
+ }
739
+
740
+ # Add MCP server if present (for direct MCP tool calls)
741
+ if step.mcp_server:
742
+ attrs["mcp_server"] = step.mcp_server
743
+
744
+ # Add mapping configuration if present (for MCP tool calls)
745
+ if step.mapping:
746
+ attrs["mapping_config"] = json.dumps(step.mapping, sort_keys=True)
747
+
748
+ # Add exit conditions if present (for agent calls)
749
+ if step.exit_if:
750
+ attrs["exit_if_conditions"] = json.dumps(step.exit_if, sort_keys=True)
751
+
752
+ return attrs
753
+
754
+
686
755
  def extract_attrs_for_run_step(
687
756
  step: FlowStep,
688
757
  flow: Flow,
@@ -691,10 +760,11 @@ def extract_attrs_for_run_step(
691
760
  available_actions: List[str],
692
761
  flows: FlowsList,
693
762
  previous_step_id: Text,
763
+ slots: List[Slot],
694
764
  ) -> Dict[str, Any]:
695
765
  current_context = extract_current_context_attribute(stack)
696
766
 
697
- return {
767
+ attrs = {
698
768
  "step_custom_id": step.custom_id if step.custom_id else "None",
699
769
  "step_description": step.description if step.description else "None",
700
770
  "current_flow_id": flow.id,
@@ -702,6 +772,12 @@ def extract_attrs_for_run_step(
702
772
  "previous_step_id": previous_step_id,
703
773
  }
704
774
 
775
+ # Add CallFlowStep specific attributes if this is a CallFlowStep
776
+ if hasattr(step, "call"):
777
+ attrs.update(extract_call_flow_step_attributes(step))
778
+
779
+ return attrs
780
+
705
781
 
706
782
  def extract_attrs_for_policy_prediction(
707
783
  self: Any,
@@ -894,3 +970,60 @@ def extract_attrs_for_grpc_custom_action_executor_request(
894
970
  )
895
971
 
896
972
  return attrs
973
+
974
+
975
+ def extract_attrs_for_mcp_agent_llm_call(
976
+ self: "MCPBaseAgent",
977
+ agent_input: "AgentInput",
978
+ ) -> Dict[str, Any]:
979
+ """Extract attributes for MCP agent LLM calls.
980
+
981
+ This function extracts tracing attributes specifically for MCP agent LLM calls,
982
+ including LLM configuration, prompt messages, and token counts.
983
+ """
984
+ # Extract LLM configuration using the actual resolved config from the LLM client
985
+ attributes = extract_llm_config(
986
+ self,
987
+ default_llm_config=self.llm_client.config,
988
+ default_embeddings_config={}, # MCP agents don't use embeddings
989
+ )
990
+
991
+ # Build messages
992
+ messages = self.build_messages_for_llm_request(agent_input)
993
+
994
+ attributes.update(
995
+ {
996
+ "prompt_messages_count": len(messages),
997
+ }
998
+ )
999
+
1000
+ # Count tokens directly from messages
1001
+ attributes = extend_attributes_with_prompt_tokens_length_for_mcp_agent(
1002
+ self, attributes, messages
1003
+ )
1004
+
1005
+ return attributes
1006
+
1007
+
1008
+ def extend_attributes_with_prompt_tokens_length_for_mcp_agent(
1009
+ self: Any,
1010
+ attributes: Dict[str, Any],
1011
+ messages: List[Dict[str, Any]],
1012
+ ) -> Dict[str, Any]:
1013
+ """Extend attributes with prompt tokens length for MCP agents."""
1014
+ # Count tokens for each message content and sum them up
1015
+ total_tokens = 0
1016
+ for message in messages:
1017
+ content = message.get("content", "")
1018
+ if content:
1019
+ message_tokens = compute_prompt_tokens_length(
1020
+ model_type=attributes["llm_type"],
1021
+ model_name=attributes["llm_model"],
1022
+ prompt=content,
1023
+ )
1024
+ if message_tokens is not None:
1025
+ total_tokens += message_tokens
1026
+
1027
+ attributes[PROMPT_TOKEN_LENGTH_ATTRIBUTE_NAME] = str(total_tokens)
1028
+
1029
+ return attributes