rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev6__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 (464) hide show
  1. rasa/agents/agent_factory.py +122 -0
  2. rasa/agents/agent_manager.py +163 -0
  3. rasa/agents/constants.py +40 -0
  4. rasa/agents/core/agent_protocol.py +107 -0
  5. rasa/agents/core/types.py +70 -0
  6. rasa/agents/exceptions.py +8 -0
  7. rasa/agents/protocol/__init__.py +5 -0
  8. rasa/agents/protocol/a2a/a2a_agent.py +662 -0
  9. rasa/agents/protocol/mcp/mcp_base_agent.py +684 -0
  10. rasa/agents/protocol/mcp/mcp_open_agent.py +290 -0
  11. rasa/agents/protocol/mcp/mcp_task_agent.py +484 -0
  12. rasa/agents/schemas/__init__.py +12 -0
  13. rasa/agents/schemas/agent_input.py +38 -0
  14. rasa/agents/schemas/agent_output.py +26 -0
  15. rasa/agents/schemas/agent_tool_result.py +67 -0
  16. rasa/agents/schemas/agent_tool_schema.py +134 -0
  17. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +15 -0
  18. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +17 -0
  19. rasa/agents/utils.py +72 -0
  20. rasa/api.py +5 -0
  21. rasa/cli/arguments/default_arguments.py +12 -0
  22. rasa/cli/arguments/run.py +2 -0
  23. rasa/cli/dialogue_understanding_test.py +4 -0
  24. rasa/cli/e2e_test.py +4 -0
  25. rasa/cli/inspect.py +3 -0
  26. rasa/cli/llm_fine_tuning.py +5 -0
  27. rasa/cli/project_templates/tutorial/config.yml +1 -2
  28. rasa/cli/run.py +4 -0
  29. rasa/cli/scaffold.py +2 -46
  30. rasa/cli/shell.py +3 -0
  31. rasa/constants.py +6 -0
  32. rasa/core/actions/action.py +56 -10
  33. rasa/core/agent.py +19 -1
  34. rasa/core/available_agents.py +199 -0
  35. rasa/core/available_endpoints.py +30 -0
  36. rasa/core/channels/channel.py +3 -4
  37. rasa/core/channels/development_inspector.py +4 -4
  38. rasa/core/channels/hangouts.py +2 -2
  39. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-63212852.js} +1 -1
  40. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-eecf6b13.js} +1 -1
  41. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-8f798a9a.js} +1 -1
  42. rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +1 -0
  43. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-df71a04c.js} +1 -1
  44. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-9b275968.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +1 -0
  46. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-1c669cad.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-b1553799.js} +1 -1
  48. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-112388d6.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-fdebec47.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-6280ede1.js} +1 -1
  51. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +1 -0
  52. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-e1dc03e5.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-83f68c51.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-22f8666f.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-ca9e6217.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-c5ceb692.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/index-3e293924.js +1353 -0
  58. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-faa9999b.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c4dda8d9.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-d4307784.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0567aaa7.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-c11b95cf.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-0c7d3ca9.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-34b433fa.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-4cab816e.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-8c22fa9e.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-70ce9e8e.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fbcd7fc9.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-45f05ea6.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-beab1ea6.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-2f29dbd5.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-951eac83.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-897fbfdd.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d667fac1.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e3205144.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-4abeb0e2.js} +1 -1
  77. rasa/core/channels/inspector/dist/index.html +2 -2
  78. rasa/core/channels/inspector/index.html +1 -1
  79. rasa/core/channels/inspector/src/App.tsx +11 -10
  80. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
  81. rasa/core/channels/inspector/src/components/DialogueStack.tsx +6 -4
  82. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  83. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  84. rasa/core/channels/inspector/src/types.ts +4 -0
  85. rasa/core/channels/socketio.py +51 -212
  86. rasa/core/channels/studio_chat.py +29 -49
  87. rasa/core/channels/voice_stream/genesys.py +1 -1
  88. rasa/core/channels/voice_stream/voice_channel.py +3 -5
  89. rasa/core/constants.py +4 -0
  90. rasa/core/policies/enterprise_search_policy.py +11 -6
  91. rasa/core/policies/flow_policy.py +4 -4
  92. rasa/core/policies/flows/flow_executor.py +470 -45
  93. rasa/core/policies/flows/mcp_tool_executor.py +277 -0
  94. rasa/core/policies/intentless_policy.py +1 -1
  95. rasa/core/policies/unexpected_intent_policy.py +1 -0
  96. rasa/core/processor.py +18 -15
  97. rasa/core/run.py +11 -14
  98. rasa/core/tracker_stores/tracker_store.py +3 -7
  99. rasa/core/train.py +1 -1
  100. rasa/core/training/interactive.py +16 -16
  101. rasa/core/training/story_conflict.py +5 -5
  102. rasa/core/utils.py +21 -1
  103. rasa/dialogue_understanding/commands/__init__.py +8 -0
  104. rasa/dialogue_understanding/commands/cancel_flow_command.py +97 -4
  105. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
  106. rasa/dialogue_understanding/commands/clarify_command.py +10 -0
  107. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  108. rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
  109. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  110. rasa/dialogue_understanding/commands/start_flow_command.py +164 -8
  111. rasa/dialogue_understanding/commands/utils.py +6 -2
  112. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  113. rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
  114. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  115. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  116. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  117. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
  118. rasa/{cli/project_templates/telco/prompts/command-generator.jinja2 → dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2} +7 -3
  119. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
  120. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
  121. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
  122. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
  123. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
  124. rasa/dialogue_understanding/patterns/continue_interrupted.py +163 -1
  125. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +52 -8
  126. rasa/dialogue_understanding/processor/command_processor.py +31 -15
  127. rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
  128. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  129. rasa/dialogue_understanding/stack/utils.py +17 -2
  130. rasa/dialogue_understanding_test/du_test_runner.py +7 -2
  131. rasa/e2e_test/e2e_test_runner.py +12 -2
  132. rasa/engine/caching.py +2 -2
  133. rasa/engine/recipes/default_components.py +10 -18
  134. rasa/engine/storage/local_model_storage.py +2 -45
  135. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  136. rasa/hooks.py +5 -5
  137. rasa/llm_fine_tuning/utils.py +2 -2
  138. rasa/model_manager/model_api.py +5 -4
  139. rasa/model_manager/runner_service.py +1 -1
  140. rasa/model_manager/socket_bridge.py +14 -20
  141. rasa/model_manager/trainer_service.py +9 -12
  142. rasa/model_manager/utils.py +29 -1
  143. rasa/model_manager/warm_rasa_process.py +1 -1
  144. rasa/nlu/extractors/extractor.py +2 -1
  145. rasa/plugin.py +8 -8
  146. rasa/privacy/privacy_manager.py +11 -2
  147. rasa/server.py +14 -2
  148. rasa/shared/agents/utils.py +35 -0
  149. rasa/shared/constants.py +5 -0
  150. rasa/shared/core/constants.py +12 -1
  151. rasa/shared/core/domain.py +11 -58
  152. rasa/shared/core/events.py +327 -0
  153. rasa/shared/core/flows/flow_step.py +1 -7
  154. rasa/shared/core/flows/flows_list.py +15 -5
  155. rasa/shared/core/flows/flows_yaml_schema.json +112 -186
  156. rasa/shared/core/flows/steps/call.py +53 -5
  157. rasa/shared/core/flows/validation.py +177 -7
  158. rasa/shared/core/flows/yaml_flows_io.py +9 -17
  159. rasa/shared/core/slots.py +2 -6
  160. rasa/shared/core/trackers.py +5 -2
  161. rasa/shared/exceptions.py +4 -0
  162. rasa/shared/importers/importer.py +0 -6
  163. rasa/shared/importers/rasa.py +1 -1
  164. rasa/shared/importers/utils.py +10 -80
  165. rasa/shared/providers/_utils.py +44 -60
  166. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
  167. rasa/shared/providers/llm/_base_litellm_client.py +39 -7
  168. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
  169. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  170. rasa/shared/providers/llm/llm_client.py +7 -3
  171. rasa/shared/providers/llm/llm_response.py +66 -0
  172. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  173. rasa/shared/utils/llm.py +28 -5
  174. rasa/shared/utils/mcp/server_connection.py +166 -0
  175. rasa/shared/utils/schemas/events.py +42 -0
  176. rasa/shared/utils/yaml.py +3 -1
  177. rasa/studio/upload.py +47 -16
  178. rasa/telemetry.py +23 -97
  179. rasa/tracing/instrumentation/instrumentation.py +14 -10
  180. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  181. rasa/utils/common.py +79 -0
  182. rasa/utils/io.py +9 -27
  183. rasa/utils/json_utils.py +1 -6
  184. rasa/utils/log_utils.py +2 -6
  185. rasa/utils/ml_utils.py +1 -1
  186. rasa/utils/tensorflow/rasa_layers.py +1 -1
  187. rasa/utils/train_utils.py +15 -15
  188. rasa/validator.py +19 -21
  189. rasa/version.py +1 -1
  190. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/METADATA +14 -17
  191. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/RECORD +201 -432
  192. rasa/builder/README.md +0 -120
  193. rasa/builder/auth.py +0 -176
  194. rasa/builder/config.py +0 -115
  195. rasa/builder/copilot/constants.py +0 -25
  196. rasa/builder/copilot/copilot.py +0 -372
  197. rasa/builder/copilot/copilot_response_handler.py +0 -487
  198. rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
  199. rasa/builder/copilot/exceptions.py +0 -20
  200. rasa/builder/copilot/models.py +0 -431
  201. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
  202. rasa/builder/copilot/telemetry.py +0 -195
  203. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
  204. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
  205. rasa/builder/document_retrieval/constants.py +0 -15
  206. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
  207. rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
  208. rasa/builder/document_retrieval/models.py +0 -62
  209. rasa/builder/download.py +0 -140
  210. rasa/builder/exceptions.py +0 -55
  211. rasa/builder/guardrails/__init__.py +0 -1
  212. rasa/builder/guardrails/constants.py +0 -3
  213. rasa/builder/guardrails/exceptions.py +0 -4
  214. rasa/builder/guardrails/lakera.py +0 -206
  215. rasa/builder/guardrails/models.py +0 -199
  216. rasa/builder/guardrails/utils.py +0 -305
  217. rasa/builder/job_manager.py +0 -87
  218. rasa/builder/jobs.py +0 -234
  219. rasa/builder/llm_service.py +0 -246
  220. rasa/builder/logging_utils.py +0 -209
  221. rasa/builder/main.py +0 -174
  222. rasa/builder/models.py +0 -197
  223. rasa/builder/project_generator.py +0 -450
  224. rasa/builder/project_info.py +0 -72
  225. rasa/builder/scrape_rasa_docs.py +0 -97
  226. rasa/builder/service.py +0 -1142
  227. rasa/builder/shared/tracker_context.py +0 -212
  228. rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
  229. rasa/builder/training_service.py +0 -132
  230. rasa/builder/validation_service.py +0 -93
  231. rasa/cli/project_templates/basic/actions/action_api.py +0 -15
  232. rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
  233. rasa/cli/project_templates/basic/config.yml +0 -23
  234. rasa/cli/project_templates/basic/credentials.yml +0 -34
  235. rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
  236. rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
  237. rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
  238. rasa/cli/project_templates/basic/data/general/help.yml +0 -6
  239. rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
  240. rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
  241. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
  242. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
  243. rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
  244. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
  245. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
  246. rasa/cli/project_templates/basic/docs/template.txt +0 -7
  247. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
  248. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
  249. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
  250. rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
  251. rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
  252. rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
  253. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
  254. rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
  255. rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
  256. rasa/cli/project_templates/basic/endpoints.yml +0 -73
  257. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  258. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  259. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  260. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  261. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  262. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  263. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  264. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  265. rasa/cli/project_templates/finance/actions/database.py +0 -277
  266. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  267. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  268. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  269. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  270. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  271. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  272. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
  273. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  274. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  275. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  276. rasa/cli/project_templates/finance/config.yml +0 -21
  277. rasa/cli/project_templates/finance/credentials.yml +0 -32
  278. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  279. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  280. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  281. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  282. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  283. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  284. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  285. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  286. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
  287. rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
  288. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  289. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  290. rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
  291. rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
  292. rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
  293. rasa/cli/project_templates/finance/data/general/help.yml +0 -9
  294. rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
  295. rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
  296. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  297. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
  298. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
  299. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
  300. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
  301. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  302. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  303. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  304. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  305. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  306. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  307. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  308. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  309. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  310. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  311. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  312. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
  313. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  314. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  315. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  316. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  317. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  318. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  319. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  320. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  321. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  322. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  323. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  324. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  325. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  326. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  327. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  328. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  329. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  330. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  331. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  332. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  333. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  334. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  335. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  336. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  337. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  338. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  339. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  340. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  341. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  342. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  343. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  344. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  345. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  346. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  347. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  348. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  349. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  350. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  351. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  352. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  353. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  354. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  355. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  356. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  357. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  358. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  359. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  360. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  361. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  362. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  363. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  364. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  365. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  366. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  367. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  368. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  369. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  370. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  371. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  372. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  373. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  374. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  375. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  376. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  377. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  378. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  379. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  380. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  381. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  382. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  383. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  384. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  385. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  386. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  387. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  388. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  389. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  390. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  391. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  392. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  393. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  394. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
  395. rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
  396. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  397. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  398. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  399. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
  400. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  401. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
  402. rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
  403. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  404. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
  405. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  406. rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
  407. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  408. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  409. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  410. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
  411. rasa/cli/project_templates/finance/endpoints.yml +0 -63
  412. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  413. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  414. rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
  415. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
  416. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
  417. rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
  418. rasa/cli/project_templates/telco/config.yml +0 -25
  419. rasa/cli/project_templates/telco/credentials.yml +0 -33
  420. rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
  421. rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
  422. rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
  423. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
  424. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
  425. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
  426. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
  427. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
  428. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
  429. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
  430. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
  431. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
  432. rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
  433. rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
  434. rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
  435. rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
  436. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
  437. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
  438. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
  439. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
  440. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
  441. rasa/cli/project_templates/telco/endpoints.yml +0 -60
  442. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
  443. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
  444. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
  445. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
  446. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
  447. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
  448. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
  449. rasa/core/channels/constants.py +0 -3
  450. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  451. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  452. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  453. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  454. rasa/utils/openapi.py +0 -144
  455. /rasa/{builder → agents}/__init__.py +0 -0
  456. /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
  457. /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
  458. /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
  459. /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
  460. /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
  461. /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
  462. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/NOTICE +0 -0
  463. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/WHEEL +0 -0
  464. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev6.dist-info}/entry_points.txt +0 -0
rasa/studio/upload.py CHANGED
@@ -7,6 +7,7 @@ from typing import Any, Dict, Iterable, List, Optional, Set, Text, Tuple, Union
7
7
  import questionary
8
8
  import requests
9
9
  import structlog
10
+ from pydantic import BaseModel, Field
10
11
 
11
12
  import rasa.cli.telemetry
12
13
  import rasa.cli.utils
@@ -23,13 +24,9 @@ from rasa.shared.constants import (
23
24
  DEFAULT_DOMAIN_PATHS,
24
25
  )
25
26
  from rasa.shared.core.domain import Domain
26
- from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader
27
+ from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader, YamlFlowsWriter
27
28
  from rasa.shared.exceptions import RasaException
28
- from rasa.shared.importers.importer import TrainingDataImporter
29
- from rasa.shared.importers.utils import (
30
- CALMUserData,
31
- extract_calm_import_parts_from_importer,
32
- )
29
+ from rasa.shared.importers.importer import FlowSyncImporter, TrainingDataImporter
33
30
  from rasa.shared.nlu.training_data.formats.rasa_yaml import (
34
31
  RasaYAMLReader,
35
32
  RasaYAMLWriter,
@@ -37,6 +34,7 @@ from rasa.shared.nlu.training_data.formats.rasa_yaml import (
37
34
  from rasa.shared.utils.llm import collect_custom_prompts
38
35
  from rasa.shared.utils.yaml import (
39
36
  dump_obj_as_yaml_to_string,
37
+ read_yaml,
40
38
  read_yaml_file,
41
39
  )
42
40
  from rasa.studio import results_logger
@@ -45,7 +43,6 @@ from rasa.studio.config import StudioConfig
45
43
  from rasa.studio.results_logger import StudioResult, with_studio_error_handler
46
44
  from rasa.studio.utils import validate_argument_paths
47
45
  from rasa.telemetry import track_upload_to_studio_failed
48
- from rasa.utils.json_utils import extract_values
49
46
 
50
47
  structlogger = structlog.get_logger()
51
48
 
@@ -71,6 +68,16 @@ DOMAIN_KEYS = [
71
68
  ]
72
69
 
73
70
 
71
+ class CALMImportParts(BaseModel):
72
+ """All pieces that will be uploaded to Rasa Studio."""
73
+
74
+ flows: Dict[str, Any]
75
+ domain: Dict[str, Any]
76
+ config: Dict[str, Any]
77
+ endpoints: Dict[str, Any]
78
+ nlu: Dict[str, Any] = Field(default_factory=dict)
79
+
80
+
74
81
  def _get_selected_entities_and_intents(
75
82
  args: argparse.Namespace,
76
83
  intents_from_files: Set[Text],
@@ -108,10 +115,9 @@ def run_validation(args: argparse.Namespace) -> None:
108
115
  """
109
116
  from rasa.validator import Validator
110
117
 
111
- training_data_paths = args.data if isinstance(args.data, list) else [args.data]
112
118
  training_data_importer = TrainingDataImporter.load_from_dict(
113
119
  domain_path=args.domain,
114
- training_data_paths=training_data_paths,
120
+ training_data_paths=[args.data],
115
121
  config_path=args.config,
116
122
  expand_env_vars=False,
117
123
  )
@@ -188,6 +194,11 @@ config_keys = [
188
194
  ]
189
195
 
190
196
 
197
+ def extract_values(data: Dict, keys: List[Text]) -> Dict:
198
+ """Extracts values for given keys from a dictionary."""
199
+ return {key: data.get(key) for key in keys if data.get(key)}
200
+
201
+
191
202
  def _get_assistant_name(config: Dict[Text, Any]) -> str:
192
203
  config_assistant_id = config.get("assistant_id", "")
193
204
  assistant_name = questionary.text(
@@ -226,7 +237,7 @@ def build_calm_import_parts(
226
237
  config_path: Text,
227
238
  endpoints_path: Optional[Text] = None,
228
239
  assistant_name: Optional[Text] = None,
229
- ) -> Tuple[str, CALMUserData]:
240
+ ) -> Tuple[str, CALMImportParts]:
230
241
  """Builds the parts of the assistant to be uploaded to Studio.
231
242
 
232
243
  Args:
@@ -239,11 +250,9 @@ def build_calm_import_parts(
239
250
  Returns:
240
251
  The assistant name and the parts to be uploaded
241
252
  """
242
- training_data_paths = data_path if isinstance(data_path, list) else [str(data_path)]
243
253
  importer = TrainingDataImporter.load_from_dict(
244
254
  domain_path=domain_path,
245
255
  config_path=config_path,
246
- training_data_paths=training_data_paths,
247
256
  expand_env_vars=False,
248
257
  )
249
258
 
@@ -251,10 +260,33 @@ def build_calm_import_parts(
251
260
  endpoints = read_yaml_file(endpoints_path, expand_env_vars=False)
252
261
  assistant_name = assistant_name or _get_assistant_name(config)
253
262
 
254
- parts = extract_calm_import_parts_from_importer(
255
- importer=importer,
263
+ domain_from_files = importer.get_user_domain().as_dict()
264
+ domain = extract_values(domain_from_files, DOMAIN_KEYS)
265
+
266
+ flow_importer = FlowSyncImporter.load_from_dict(
267
+ training_data_paths=[str(data_path)], expand_env_vars=False
268
+ )
269
+
270
+ flows = list(flow_importer.get_user_flows())
271
+ flows_yaml = YamlFlowsWriter().dumps(flows)
272
+ flows = read_yaml(flows_yaml, expand_env_vars=False)
273
+
274
+ nlu_importer = TrainingDataImporter.load_from_dict(
275
+ training_data_paths=[str(data_path)], expand_env_vars=False
276
+ )
277
+ nlu_data = nlu_importer.get_nlu_data()
278
+ nlu_examples = nlu_data.filter_training_examples(
279
+ lambda ex: ex.get("intent") in nlu_data.intents
280
+ )
281
+ nlu_examples_yaml = RasaYAMLWriter().dumps(nlu_examples)
282
+ nlu = read_yaml(nlu_examples_yaml, expand_env_vars=False)
283
+
284
+ parts = CALMImportParts(
285
+ flows=flows,
286
+ domain=domain,
256
287
  config=config,
257
288
  endpoints=endpoints,
289
+ nlu=nlu,
258
290
  )
259
291
 
260
292
  return assistant_name, parts
@@ -317,10 +349,9 @@ def upload_nlu_assistant(
317
349
  "rasa.studio.upload.nlu_data_read",
318
350
  event_info="Found DM1 assistant data, parsing...",
319
351
  )
320
- training_data_paths = args.data if isinstance(args.data, list) else [args.data]
321
352
  importer = TrainingDataImporter.load_from_dict(
322
353
  domain_path=args.domain,
323
- training_data_paths=training_data_paths,
354
+ training_data_paths=[args.data],
324
355
  config_path=args.config,
325
356
  expand_env_vars=False,
326
357
  )
rasa/telemetry.py CHANGED
@@ -3,6 +3,7 @@ import contextlib
3
3
  import hashlib
4
4
  import inspect
5
5
  import json
6
+ import logging
6
7
  import multiprocessing
7
8
  import os
8
9
  import platform
@@ -69,7 +70,7 @@ if typing.TYPE_CHECKING:
69
70
  from rasa.shared.importers.importer import TrainingDataImporter
70
71
  from rasa.shared.nlu.training_data.training_data import TrainingData
71
72
 
72
- structlogger = structlog.get_logger()
73
+ logger = logging.getLogger(__name__)
73
74
 
74
75
  SEGMENT_TRACK_ENDPOINT = "https://api.segment.io/v1/track"
75
76
  SEGMENT_IDENTIFY_ENDPOINT = "https://api.segment.io/v1/identify"
@@ -196,10 +197,6 @@ TELEMETRY_E2E_TEST_CONVERSION_EVENT = "E2E Test Conversion Completed"
196
197
  E2E_TEST_CONVERSION_FILE_TYPE = "file_type"
197
198
  E2E_TEST_CONVERSION_TEST_CASE_COUNT = "test_case_count"
198
199
 
199
- # Copilot telemetry
200
- TELEMETRY_COPILOT_USER_MESSAGE_EVENT = "copilot_user_message"
201
- TELEMETRY_COPILOT_BOT_MESSAGE_EVENT = "copilot_bot_message"
202
-
203
200
 
204
201
  def print_telemetry_reporting_info() -> None:
205
202
  """Print telemetry information to std out."""
@@ -258,11 +255,7 @@ def _is_telemetry_enabled_in_configuration() -> bool:
258
255
 
259
256
  return stored_config[CONFIG_TELEMETRY_ENABLED]
260
257
  except ValueError as e:
261
- structlogger.debug(
262
- "telemetry.is_telemetry_enabled_in_configuration.error",
263
- error=str(e),
264
- event_info="Could not read telemetry settings from configuration file",
265
- )
258
+ logger.debug(f"Could not read telemetry settings from configuration file: {e}")
266
259
 
267
260
  # seems like there is no config, we'll create one and enable telemetry
268
261
  success = _write_default_telemetry_configuration()
@@ -279,10 +272,7 @@ def is_telemetry_enabled() -> bool:
279
272
  from rasa.utils import licensing
280
273
 
281
274
  if licensing.is_champion_server_license():
282
- structlogger.debug(
283
- "telemetry.enabled.developer_license",
284
- event_info="Telemetry is enabled for developer licenses.",
285
- )
275
+ logger.debug("Telemetry is enabled for developer licenses.")
286
276
  return True
287
277
 
288
278
  telemetry_environ = os.environ.get(TELEMETRY_ENABLED_ENVIRONMENT_VARIABLE)
@@ -318,13 +308,9 @@ def initialize_telemetry() -> bool:
318
308
 
319
309
  return telemetry_environ.lower() == "true"
320
310
  except Exception as e: # skipcq:PYL-W0703
321
- structlogger.exception(
322
- "telemetry.initialize_telemetry.error",
323
- error=str(e),
324
- event_info=(
325
- "Failed to initialize telemetry reporting. "
326
- "Telemetry reporting will be disabled."
327
- ),
311
+ logger.exception(
312
+ f"Failed to initialize telemetry reporting: {e}."
313
+ f"Telemetry reporting will be disabled."
328
314
  )
329
315
  return False
330
316
 
@@ -495,10 +481,7 @@ def print_telemetry_payload(payload: Dict[Text, Any]) -> None:
495
481
  payload: payload to be delivered to segment.
496
482
  """
497
483
  payload_json = json.dumps(payload, indent=2)
498
- structlogger.debug(
499
- "telemetry.print_telemetry_payload.debug",
500
- event_info=f"Telemetry payload: {payload_json}",
501
- )
484
+ logger.debug(f"Telemetry payload: {payload_json}")
502
485
 
503
486
 
504
487
  def _get_telemetry_write_key() -> Optional[Text]:
@@ -552,24 +535,10 @@ def _send_request(url: Text, payload: Dict[Text, Any]) -> None:
552
535
  if not write_key:
553
536
  # If RASA_TELEMETRY_WRITE_KEY is empty or `None`, telemetry has not
554
537
  # been enabled for this build (e.g. because it is running from source)
555
- structlogger.debug(
556
- "telemetry.send_request.no_telemetry_key",
557
- event_info="Skipping request to external service: telemetry key not set.",
558
- )
538
+ logger.debug("Skipping request to external service: telemetry key not set.")
559
539
  return
560
540
 
561
- send_segment_request(url, payload, write_key)
562
-
563
-
564
- def send_segment_request(url: Text, payload: Dict[Text, Any], write_key: Text) -> None:
565
- """Send a request to the Segment API.
566
-
567
- Args:
568
- url: URL of the Segment API endpoint
569
- payload: payload to send to the Segment API
570
- write_key: write key for the Segment API
571
- """
572
- headers = segment_request_header(write_key)
541
+ headers = rasa.telemetry.segment_request_header(write_key)
573
542
 
574
543
  resp = requests.post(
575
544
  url=url,
@@ -579,22 +548,15 @@ def send_segment_request(url: Text, payload: Dict[Text, Any], write_key: Text) -
579
548
  )
580
549
  # handle different failure cases
581
550
  if resp.status_code != 200:
582
- structlogger.debug(
583
- "telemetry.send_segment_request.error_response",
584
- event_info=(
585
- f"Segment telemetry request returned a {resp.status_code} "
586
- f"response. Body: {resp.text}"
587
- ),
551
+ logger.debug(
552
+ f"Segment telemetry request returned a {resp.status_code} response. "
553
+ f"Body: {resp.text}"
588
554
  )
589
555
  else:
590
556
  data = resp.json()
591
557
  if not data.get("success"):
592
- structlogger.debug(
593
- "telemetry.send_segment_request.failure",
594
- event_info=(
595
- f"Segment telemetry request returned a failure. "
596
- f"Response: {data}"
597
- ),
558
+ logger.debug(
559
+ f"Segment telemetry request returned a failure. Response: {data}"
598
560
  )
599
561
 
600
562
 
@@ -647,15 +609,6 @@ def with_default_context_fields(
647
609
  return {**_default_context_fields(), **context}
648
610
 
649
611
 
650
- def get_deployment_stack() -> Text:
651
- """Return the deployment stack.
652
-
653
- Returns:
654
- The deployment stack.
655
- """
656
- return os.environ.get("DEPLOYMENT_STACK", "")
657
-
658
-
659
612
  def _default_context_fields() -> Dict[Text, Any]:
660
613
  """Return a dictionary that contains the default context values.
661
614
 
@@ -679,7 +632,6 @@ def _default_context_fields() -> Dict[Text, Any]:
679
632
  "cpu": multiprocessing.cpu_count(),
680
633
  "docker": _is_docker(),
681
634
  "license_hash": get_license_hash(),
682
- "deployment_stack": get_deployment_stack(),
683
635
  "company": property_of_active_license(
684
636
  lambda active_license: active_license.company
685
637
  ),
@@ -711,10 +663,7 @@ def _track(
711
663
  telemetry_id = get_telemetry_id()
712
664
 
713
665
  if not telemetry_id:
714
- structlogger.debug(
715
- "telemetry.track.no_id_found",
716
- event_info="Will not report telemetry events as no ID was found.",
717
- )
666
+ logger.debug("Will not report telemetry events as no ID was found.")
718
667
  return
719
668
 
720
669
  if not properties:
@@ -732,11 +681,7 @@ def _track(
732
681
  with_default_context_fields(context),
733
682
  )
734
683
  except Exception as e: # skipcq:PYL-W0703
735
- structlogger.debug(
736
- "telemetry.track.error",
737
- error=str(e),
738
- event_info="Skipping telemetry reporting",
739
- )
684
+ logger.debug(f"Skipping telemetry reporting: {e}")
740
685
 
741
686
 
742
687
  def _identify(
@@ -757,10 +702,7 @@ def _identify(
757
702
  telemetry_id = get_telemetry_id()
758
703
 
759
704
  if not telemetry_id:
760
- structlogger.debug(
761
- "telemetry.identify.no_id_found",
762
- event_info="Will not report telemetry events as no ID was found.",
763
- )
705
+ logger.debug("Will not report telemetry events as no ID was found.")
764
706
  return
765
707
 
766
708
  if not traits:
@@ -768,11 +710,7 @@ def _identify(
768
710
 
769
711
  _send_traits(telemetry_id, traits, with_default_context_fields(context))
770
712
  except Exception as e:
771
- structlogger.debug(
772
- "telemetry.identify.error",
773
- error=str(e),
774
- event_info="Skipping telemetry reporting",
775
- )
713
+ logger.debug(f"Skipping telemetry reporting: {e}")
776
714
 
777
715
 
778
716
  def _send_traits(
@@ -930,16 +868,13 @@ def strip_sensitive_data_from_sentry_event(
930
868
 
931
869
 
932
870
  @ensure_telemetry_enabled
933
- def initialize_error_reporting(private_mode: bool = True) -> None:
871
+ def initialize_error_reporting() -> None:
934
872
  """Sets up automated error reporting.
935
873
 
936
874
  Exceptions are reported to sentry. We avoid sending any metadata (local
937
875
  variables, paths, ...) to make sure we don't compromise any data. Only the
938
876
  exception and its stacktrace is logged and only if the exception origins
939
877
  from the `rasa` package.
940
-
941
- Args:
942
- private_mode: If True, try to send as little data as possible.
943
878
  """
944
879
  import sentry_sdk
945
880
  from sentry_sdk import configure_scope
@@ -957,18 +892,11 @@ def initialize_error_reporting(private_mode: bool = True) -> None:
957
892
 
958
893
  telemetry_id = get_telemetry_id()
959
894
 
960
- # in hello rasa we use a different project, so we need to be able
961
- # to set the whole url. since we can't change the behavior of sentry in pro
962
- # we have two kinds of keys, full urls and jsut the key within the fixed rasa
963
- # pro project.
964
- if not key.startswith("https://"):
965
- key = f"https://{key}.ingest.sentry.io/2801673"
966
-
967
895
  # this is a very defensive configuration, avoiding as many integrations as
968
896
  # possible. it also submits very little data (exception with error message
969
897
  # and line numbers).
970
898
  sentry_sdk.init(
971
- key,
899
+ f"https://{key}.ingest.sentry.io/2801673",
972
900
  before_send=before_send,
973
901
  integrations=[
974
902
  ExcepthookIntegration(),
@@ -988,7 +916,7 @@ def initialize_error_reporting(private_mode: bool = True) -> None:
988
916
  OSError,
989
917
  ],
990
918
  in_app_include=["rasa"], # only submit errors in this package
991
- include_local_variables=not private_mode,
919
+ include_local_variables=False, # don't submit local variables
992
920
  release=f"rasa-{rasa.__version__}",
993
921
  default_integrations=False,
994
922
  environment="development" if in_continuous_integration() else "production",
@@ -1009,7 +937,6 @@ def initialize_error_reporting(private_mode: bool = True) -> None:
1009
937
  # os is a nested dict, hence we report it separately
1010
938
  scope.set_context("Operating System", default_context.pop("os"))
1011
939
  scope.set_context("Environment", default_context)
1012
- structlogger.debug("telemetry.sentry.initialized")
1013
940
 
1014
941
 
1015
942
  @contextlib.contextmanager
@@ -1499,7 +1426,6 @@ def track_shell_started(model_type: Text, assistant_id: Text) -> None:
1499
1426
 
1500
1427
  Args:
1501
1428
  model_type: Type of the model, core / nlu or rasa.
1502
- assistant_id: ID of the assistant being inspected.
1503
1429
  """
1504
1430
  _track(
1505
1431
  TELEMETRY_SHELL_STARTED_EVENT,
@@ -2071,7 +1997,7 @@ def _extract_stream_pii(event_broker: Optional["EventBroker"]) -> bool:
2071
1997
  def track_privacy_enabled(
2072
1998
  privacy_config: "PrivacyConfig", event_broker: Optional["EventBroker"]
2073
1999
  ) -> None:
2074
- """Track when PII management capability is enabled."""
2000
+ """Track when PII management capability is enabled"""
2075
2001
  stream_pii = _extract_stream_pii(event_broker)
2076
2002
  privacy_properties = _extract_privacy_enabled_event_properties(
2077
2003
  privacy_config, stream_pii
@@ -53,6 +53,7 @@ from rasa.engine.graph import GraphNode
53
53
  from rasa.engine.training.graph_trainer import GraphTrainer
54
54
  from rasa.shared.core.domain import Domain
55
55
  from rasa.shared.core.flows import FlowsList
56
+ from rasa.shared.core.slots import Slot
56
57
  from rasa.shared.core.trackers import DialogueStateTracker
57
58
  from rasa.shared.nlu.constants import SET_SLOT_COMMAND
58
59
  from rasa.shared.nlu.training_data.message import Message
@@ -443,7 +444,7 @@ def instrument(
443
444
  tracer_provider.get_tracer(lock_store_class.__module__),
444
445
  attribute_extractors.extract_attrs_for_lock_store,
445
446
  )
446
- lock_store_class.lock = contextlib.asynccontextmanager(traced_lock_method) # type: ignore[assignment]
447
+ lock_store_class.lock = contextlib.asynccontextmanager(traced_lock_method) # type: ignore[method-assign]
447
448
 
448
449
  logger.debug(f"Instrumented '{lock_store_class.__name__}.lock'.")
449
450
 
@@ -790,7 +791,7 @@ def _instrument_nlu_command_adapter_predict_commands(
790
791
 
791
792
  return wrapper
792
793
 
793
- nlu_command_adapter_class.predict_commands = ( # type: ignore[assignment]
794
+ nlu_command_adapter_class.predict_commands = ( # type: ignore[method-assign]
794
795
  tracing_nlu_command_adapter_predict_commands_wrapper(
795
796
  nlu_command_adapter_class.predict_commands
796
797
  )
@@ -839,7 +840,7 @@ def _instrument_multi_step_llm_command_generator_parse_commands(
839
840
 
840
841
  return wrapper
841
842
 
842
- multi_step_llm_command_generator_class.parse_commands = ( # type: ignore[assignment]
843
+ multi_step_llm_command_generator_class.parse_commands = ( # type: ignore[method-assign]
843
844
  tracing_multi_step_llm_command_generator_parse_commands_wrapper(
844
845
  multi_step_llm_command_generator_class.parse_commands
845
846
  )
@@ -873,7 +874,7 @@ def _instrument_information_retrieval_search(
873
874
 
874
875
  return wrapper
875
876
 
876
- vector_store_class.search = tracing_information_retrieval_search_wrapper( # type: ignore[assignment]
877
+ vector_store_class.search = tracing_information_retrieval_search_wrapper( # type: ignore[method-assign]
877
878
  vector_store_class.search
878
879
  )
879
880
 
@@ -1013,7 +1014,7 @@ def _instrument_get_tracker(
1013
1014
 
1014
1015
  return wrapper
1015
1016
 
1016
- processor_class.get_tracker = tracing_get_tracker_wrapper( # type: ignore[assignment]
1017
+ processor_class.get_tracker = tracing_get_tracker_wrapper( # type: ignore[method-assign]
1017
1018
  processor_class.get_tracker
1018
1019
  )
1019
1020
 
@@ -1088,13 +1089,16 @@ def _instrument_advance_flows_until_next_action(
1088
1089
  ) -> None:
1089
1090
  def tracing_advance_flows_until_next_action_wrapper(fn: Callable) -> Callable:
1090
1091
  @functools.wraps(fn)
1091
- def wrapper(
1092
+ async def wrapper(
1092
1093
  tracker: DialogueStateTracker,
1093
1094
  available_actions: List[str],
1094
1095
  flows: FlowsList,
1096
+ slots: List[Slot],
1095
1097
  ) -> FlowActionPrediction:
1096
1098
  with tracer.start_as_current_span(f"{module_name}.{fn.__name__}") as span:
1097
- prediction: FlowActionPrediction = fn(tracker, available_actions, flows)
1099
+ prediction: FlowActionPrediction = await fn(
1100
+ tracker, available_actions, flows, slots
1101
+ )
1098
1102
 
1099
1103
  span.set_attributes(
1100
1104
  {
@@ -1223,7 +1227,7 @@ def _instrument_run_action(
1223
1227
 
1224
1228
  return wrapper
1225
1229
 
1226
- processor_class._run_action = tracing_run_action_wrapper( # type: ignore[assignment]
1230
+ processor_class._run_action = tracing_run_action_wrapper( # type: ignore[method-assign]
1227
1231
  processor_class._run_action
1228
1232
  )
1229
1233
 
@@ -1282,7 +1286,7 @@ def _instrument_endpoint_config(
1282
1286
 
1283
1287
  return wrapper
1284
1288
 
1285
- endpoint_config_class.request = tracing_endpoint_config_wrapper( # type: ignore[assignment]
1289
+ endpoint_config_class.request = tracing_endpoint_config_wrapper( # type: ignore[method-assign]
1286
1290
  endpoint_config_class.request
1287
1291
  )
1288
1292
 
@@ -1314,7 +1318,7 @@ def _instrument_grpc_custom_action_executor(
1314
1318
 
1315
1319
  return wrapper
1316
1320
 
1317
- grpc_custom_action_executor_class.run = tracing_grpc_custom_action_executor_wrapper( # type: ignore[assignment]
1321
+ grpc_custom_action_executor_class.run = tracing_grpc_custom_action_executor_wrapper( # type: ignore[method-assign]
1318
1322
  grpc_custom_action_executor_class.run
1319
1323
  )
1320
1324
 
@@ -37,7 +37,7 @@ def _instrument_select_response_examples(
37
37
 
38
38
  return wrapper
39
39
 
40
- policy_class.select_response_examples = tracing_select_response_examples_wrapper( # type: ignore[assignment]
40
+ policy_class.select_response_examples = tracing_select_response_examples_wrapper( # type: ignore[method-assign]
41
41
  policy_class.select_response_examples
42
42
  )
43
43
 
@@ -72,7 +72,7 @@ def _instrument_select_few_shot_conversations(
72
72
 
73
73
  return wrapper
74
74
 
75
- policy_class.select_few_shot_conversations = ( # type: ignore[assignment]
75
+ policy_class.select_few_shot_conversations = ( # type: ignore[method-assign]
76
76
  tracing_select_few_shot_conversations_wrapper(
77
77
  policy_class.select_few_shot_conversations
78
78
  )
@@ -104,7 +104,7 @@ def _instrument_extract_ai_responses(
104
104
 
105
105
  return wrapper
106
106
 
107
- policy_class.extract_ai_responses = tracing_extract_ai_responses_wrapper( # type: ignore[assignment]
107
+ policy_class.extract_ai_responses = tracing_extract_ai_responses_wrapper( # type: ignore[method-assign]
108
108
  policy_class.extract_ai_responses
109
109
  )
110
110
 
@@ -137,7 +137,7 @@ def _instrument_generate_answer(
137
137
 
138
138
  return wrapper
139
139
 
140
- policy_class.generate_answer = tracing_generate_answer_wrapper( # type: ignore[assignment]
140
+ policy_class.generate_answer = tracing_generate_answer_wrapper( # type: ignore[method-assign]
141
141
  policy_class.generate_answer
142
142
  )
143
143
 
rasa/utils/common.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import copy
2
2
  import inspect
3
+ import json
3
4
  import logging
4
5
  import logging.config
5
6
  import logging.handlers
@@ -34,7 +35,9 @@ from rasa.constants import (
34
35
  ENV_LOG_LEVEL_KAFKA,
35
36
  ENV_LOG_LEVEL_LIBRARIES,
36
37
  ENV_LOG_LEVEL_MATPLOTLIB,
38
+ ENV_LOG_LEVEL_MCP,
37
39
  ENV_LOG_LEVEL_RABBITMQ,
40
+ ENV_MCP_LOGGING_ENABLED,
38
41
  )
39
42
  from rasa.shared.constants import DEFAULT_LOG_LEVEL, ENV_LOG_LEVEL, TCP_PROTOCOL
40
43
  from rasa.shared.exceptions import RasaException
@@ -281,6 +284,7 @@ def configure_library_logging() -> None:
281
284
  update_kafka_log_level(library_log_level)
282
285
  update_rabbitmq_log_level(library_log_level)
283
286
  update_websockets_log_level(library_log_level)
287
+ update_mcp_log_level()
284
288
 
285
289
 
286
290
  def update_apscheduler_log_level() -> None:
@@ -415,6 +419,56 @@ def update_websockets_log_level(library_log_level: Text) -> None:
415
419
  logging.getLogger("websockets").propagate = False
416
420
 
417
421
 
422
+ def update_mcp_log_level() -> None:
423
+ """Set the log level for MCP-related loggers.
424
+
425
+ This function configures logging levels for MCP (Model Context Protocol) related
426
+ loggers to reduce noise from HTTP and MCP client libraries.
427
+
428
+ Environment Variables:
429
+ LOG_LEVEL_MCP: Set the log level for MCP-related loggers.
430
+ Valid values: DEBUG, INFO, WARNING, ERROR, CRITICAL
431
+ Default: ERROR
432
+
433
+ MCP_LOGGING_ENABLED: Enable or disable MCP logging completely.
434
+ Valid values: true, false
435
+ Default: true
436
+
437
+ Examples:
438
+ # Show only ERROR and above for MCP logs
439
+ export LOG_LEVEL_MCP=ERROR
440
+
441
+ # Show DEBUG level MCP logs (very verbose)
442
+ export LOG_LEVEL_MCP=DEBUG
443
+
444
+ # Completely disable MCP logging
445
+ export MCP_LOGGING_ENABLED=false
446
+ """
447
+ # Check if MCP logging is completely disabled
448
+ mcp_logging_enabled = (
449
+ os.environ.get(ENV_MCP_LOGGING_ENABLED, "true").lower() == "true"
450
+ )
451
+
452
+ # Default to ERROR level for MCP logs to reduce noise
453
+ mcp_log_level: Union[int, str] = os.environ.get(ENV_LOG_LEVEL_MCP, "ERROR")
454
+ if not mcp_logging_enabled:
455
+ # Completely disable MCP logging
456
+ mcp_log_level = logging.CRITICAL + 1 # Higher than CRITICAL to disable all logs
457
+
458
+ # MCP client and HTTP-related loggers that are commonly noisy
459
+ mcp_loggers = [
460
+ "mcp.client.streamable_http",
461
+ "mcp.client",
462
+ "httpcore.connection",
463
+ "httpcore.http11",
464
+ "httpx",
465
+ ]
466
+
467
+ for logger_name in mcp_loggers:
468
+ logging.getLogger(logger_name).setLevel(mcp_log_level)
469
+ logging.getLogger(logger_name).propagate = False
470
+
471
+
418
472
  def sort_list_of_dicts_by_first_key(dicts: List[Dict]) -> List[Dict]:
419
473
  """Sorts a list of dictionaries by their first key."""
420
474
  return sorted(dicts, key=lambda d: next(iter(d.keys())))
@@ -646,3 +700,28 @@ def get_bool_env_variable(variable_name: str, default_variable_value: bool) -> b
646
700
  f"Available values are `{true_values + false_values}`"
647
701
  )
648
702
  return value.lower() in true_values
703
+
704
+
705
+ def try_parse_json(value: Any) -> Any:
706
+ """If value is a JSON string, parse it into a dict/list, else return as-is."""
707
+ if isinstance(value, str):
708
+ try:
709
+ return json.loads(value)
710
+ except json.JSONDecodeError:
711
+ return value
712
+ return value
713
+
714
+
715
+ def ensure_jsonified_iterable(value: Any) -> Any:
716
+ """Convert iterables to JSON strings, flatten nested JSON strings in dicts/lists."""
717
+ if isinstance(value, dict):
718
+ # Recursively process dict values
719
+ return {
720
+ key: ensure_jsonified_iterable(try_parse_json(val))
721
+ for key, val in value.items()
722
+ }
723
+ elif isinstance(value, list):
724
+ # Recursively process each item
725
+ return [ensure_jsonified_iterable(try_parse_json(val)) for val in value]
726
+ # Keep primitives as-is
727
+ return value