rasa-pro 3.14.0a20__py3-none-any.whl → 3.14.0a23__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 (331) 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/finance/actions/general/__init__.py +0 -0
  52. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  53. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  54. rasa/cli/project_templates/finance/data/general/goodbye.yml +1 -1
  55. rasa/cli/project_templates/finance/data/general/human_handoff.yml +1 -1
  56. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
  57. rasa/cli/project_templates/finance/domain/general/_shared.yml +0 -14
  58. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  59. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  60. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +3 -6
  61. rasa/cli/project_templates/finance/domain/general/welcome.yml +29 -1
  62. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
  63. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
  64. rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
  65. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  66. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
  67. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
  68. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
  69. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  70. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
  71. rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
  72. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +1 -1
  73. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +1 -1
  74. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +1 -1
  75. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +1 -1
  76. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  77. rasa/cli/run.py +12 -10
  78. rasa/cli/scaffold.py +4 -4
  79. rasa/cli/shell.py +9 -5
  80. rasa/cli/studio/studio.py +1 -1
  81. rasa/cli/test.py +34 -14
  82. rasa/cli/train.py +41 -28
  83. rasa/cli/utils.py +1 -393
  84. rasa/cli/validation/__init__.py +0 -0
  85. rasa/cli/validation/bot_config.py +223 -0
  86. rasa/cli/validation/config_path_validation.py +257 -0
  87. rasa/cli/x.py +8 -4
  88. rasa/constants.py +7 -1
  89. rasa/core/actions/action.py +51 -10
  90. rasa/core/actions/action_run_slot_rejections.py +1 -1
  91. rasa/core/actions/direct_custom_actions_executor.py +9 -2
  92. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  93. rasa/core/agent.py +19 -2
  94. rasa/core/available_agents.py +229 -0
  95. rasa/core/brokers/kafka.py +1 -1
  96. rasa/core/channels/__init__.py +82 -35
  97. rasa/core/channels/development_inspector.py +3 -3
  98. rasa/core/channels/inspector/README.md +25 -13
  99. rasa/core/channels/inspector/dist/assets/{arc-35222594.js → arc-6177260a.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-a0efbfd3.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-0584c0f2.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-39f40dbe.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-1ad755f3.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  106. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-b0f4f0fe.js → createText-2e5e7dd3-088372e2.js} +1 -1
  107. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-9039bff9.js → edges-e0da2a9e-58676240.js} +1 -1
  108. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-65c9b127.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  109. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4f08b38e.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  110. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-e95c362a.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  111. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  112. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-703c3015.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  113. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-699328ea.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  114. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-04cf4b05.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  115. rasa/core/channels/inspector/dist/assets/{graph-ee94449e.js → graph-0a6f8466.js} +1 -1
  116. rasa/core/channels/inspector/dist/assets/{index-3862675e-940162b4.js → index-3862675e-7610671a.js} +1 -1
  117. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  118. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-c79c2866.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  119. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-84489d30.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  120. rasa/core/channels/inspector/dist/assets/{layout-a9aa9858.js → layout-e7fbc2bf.js} +1 -1
  121. rasa/core/channels/inspector/dist/assets/{line-eb73cf26.js → line-a8aa457c.js} +1 -1
  122. rasa/core/channels/inspector/dist/assets/{linear-b3399f9a.js → linear-3351e0d2.js} +1 -1
  123. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-b095bf1a.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  124. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-07644b66.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  125. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-573a3f9c.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  126. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d457e1e1.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  127. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-9d26e1a2.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  128. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-3a9cde10.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  129. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-4f3e8cec.js → stateDiagram-587899a1-0e770395.js} +1 -1
  130. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-e617e5bf.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  131. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-eab30d2f.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  132. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-09994be2.js → styles-9a916d00-884a8b5b.js} +1 -1
  133. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-b7110364.js → styles-c10674c1-dc097813.js} +1 -1
  134. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-3ebc92ad.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  135. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-7d13d2f2.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  136. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-488385e1.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  137. rasa/core/channels/inspector/dist/index.html +1 -1
  138. rasa/core/channels/inspector/package.json +18 -18
  139. rasa/core/channels/inspector/src/App.tsx +29 -4
  140. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  141. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  142. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +7 -4
  143. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  144. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  145. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  146. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  147. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  148. rasa/core/channels/inspector/src/types.ts +21 -0
  149. rasa/core/channels/inspector/yarn.lock +336 -189
  150. rasa/core/channels/studio_chat.py +6 -6
  151. rasa/core/channels/telegram.py +4 -9
  152. rasa/core/channels/voice_stream/browser_audio.py +2 -0
  153. rasa/core/channels/voice_stream/genesys.py +1 -1
  154. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  155. rasa/core/channels/voice_stream/twilio_media_streams.py +5 -1
  156. rasa/core/channels/voice_stream/voice_channel.py +3 -0
  157. rasa/core/config/__init__.py +0 -0
  158. rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
  159. rasa/core/config/configuration.py +260 -0
  160. rasa/core/config/credentials.py +19 -0
  161. rasa/core/config/message_procesing_config.py +34 -0
  162. rasa/core/constants.py +5 -0
  163. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +88 -3
  164. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +2 -1
  165. rasa/core/lock_store.py +6 -4
  166. rasa/core/nlg/generator.py +1 -1
  167. rasa/core/policies/enterprise_search_policy.py +5 -3
  168. rasa/core/policies/flow_policy.py +4 -4
  169. rasa/core/policies/flows/agent_executor.py +632 -0
  170. rasa/core/policies/flows/flow_executor.py +137 -76
  171. rasa/core/policies/flows/mcp_tool_executor.py +298 -0
  172. rasa/core/policies/intentless_policy.py +1 -1
  173. rasa/core/policies/ted_policy.py +20 -12
  174. rasa/core/policies/unexpected_intent_policy.py +6 -0
  175. rasa/core/processor.py +68 -44
  176. rasa/core/redis_connection_factory.py +78 -20
  177. rasa/core/run.py +37 -8
  178. rasa/core/test.py +4 -0
  179. rasa/core/tracker_stores/sql_tracker_store.py +1 -1
  180. rasa/core/tracker_stores/tracker_store.py +3 -7
  181. rasa/core/train.py +1 -1
  182. rasa/core/training/interactive.py +20 -18
  183. rasa/core/training/story_conflict.py +5 -5
  184. rasa/core/utils.py +22 -23
  185. rasa/dialogue_understanding/commands/__init__.py +8 -0
  186. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  187. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  188. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  189. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  190. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  191. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  192. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  193. rasa/dialogue_understanding/commands/utils.py +124 -2
  194. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  195. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  196. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  197. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  198. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  199. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  200. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  201. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  202. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  203. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  204. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  205. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  206. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  207. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  208. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  209. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  210. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  211. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  212. rasa/dialogue_understanding/stack/utils.py +57 -3
  213. rasa/dialogue_understanding/utils.py +24 -4
  214. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  215. rasa/e2e_test/e2e_test_runner.py +13 -3
  216. rasa/engine/caching.py +2 -2
  217. rasa/engine/constants.py +1 -1
  218. rasa/engine/loader.py +12 -0
  219. rasa/engine/recipes/default_components.py +138 -49
  220. rasa/engine/recipes/default_recipe.py +108 -11
  221. rasa/engine/runner/dask.py +8 -5
  222. rasa/engine/validation.py +19 -6
  223. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  224. rasa/hooks.py +5 -5
  225. rasa/llm_fine_tuning/utils.py +2 -2
  226. rasa/model_training.py +60 -47
  227. rasa/nlu/classifiers/diet_classifier.py +198 -98
  228. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  229. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  230. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  231. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  232. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  233. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  234. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  235. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  236. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  237. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  238. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  239. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  240. rasa/nlu/selectors/response_selector.py +10 -2
  241. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  242. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  243. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  244. rasa/nlu/utils/mitie_utils.py +3 -0
  245. rasa/nlu/utils/spacy_utils.py +3 -2
  246. rasa/plugin.py +8 -8
  247. rasa/privacy/privacy_manager.py +12 -3
  248. rasa/server.py +15 -3
  249. rasa/shared/agents/__init__.py +0 -0
  250. rasa/shared/agents/auth/__init__.py +0 -0
  251. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  252. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  253. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  254. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  255. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  256. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  257. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
  258. rasa/shared/agents/auth/constants.py +12 -0
  259. rasa/shared/agents/auth/types.py +12 -0
  260. rasa/shared/agents/utils.py +35 -0
  261. rasa/shared/constants.py +8 -0
  262. rasa/shared/core/constants.py +16 -1
  263. rasa/shared/core/domain.py +0 -7
  264. rasa/shared/core/events.py +327 -0
  265. rasa/shared/core/flows/constants.py +5 -0
  266. rasa/shared/core/flows/flow.py +1 -1
  267. rasa/shared/core/flows/flows_list.py +21 -5
  268. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  269. rasa/shared/core/flows/steps/call.py +49 -5
  270. rasa/shared/core/flows/steps/collect.py +98 -13
  271. rasa/shared/core/flows/validation.py +372 -8
  272. rasa/shared/core/flows/yaml_flows_io.py +3 -2
  273. rasa/shared/core/slots.py +2 -2
  274. rasa/shared/core/trackers.py +5 -2
  275. rasa/shared/exceptions.py +16 -0
  276. rasa/shared/importers/rasa.py +1 -1
  277. rasa/shared/importers/utils.py +9 -3
  278. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  279. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  280. rasa/shared/providers/llm/llm_client.py +7 -3
  281. rasa/shared/providers/llm/llm_response.py +66 -0
  282. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  283. rasa/shared/utils/common.py +24 -0
  284. rasa/shared/utils/health_check/health_check.py +7 -3
  285. rasa/shared/utils/llm.py +39 -16
  286. rasa/shared/utils/mcp/__init__.py +0 -0
  287. rasa/shared/utils/mcp/server_connection.py +247 -0
  288. rasa/shared/utils/mcp/utils.py +20 -0
  289. rasa/shared/utils/schemas/events.py +42 -0
  290. rasa/shared/utils/yaml.py +3 -1
  291. rasa/studio/pull/pull.py +3 -2
  292. rasa/studio/train.py +8 -7
  293. rasa/studio/upload.py +3 -6
  294. rasa/telemetry.py +69 -5
  295. rasa/tracing/config.py +45 -12
  296. rasa/tracing/constants.py +14 -0
  297. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  298. rasa/tracing/instrumentation/instrumentation.py +626 -21
  299. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  300. rasa/tracing/instrumentation/metrics.py +32 -0
  301. rasa/tracing/metric_instrument_provider.py +68 -0
  302. rasa/utils/common.py +92 -1
  303. rasa/utils/endpoints.py +11 -2
  304. rasa/utils/log_utils.py +96 -5
  305. rasa/utils/ml_utils.py +1 -1
  306. rasa/utils/pypred.py +38 -0
  307. rasa/utils/tensorflow/__init__.py +7 -0
  308. rasa/utils/tensorflow/callback.py +136 -101
  309. rasa/utils/tensorflow/crf.py +1 -1
  310. rasa/utils/tensorflow/data_generator.py +21 -8
  311. rasa/utils/tensorflow/layers.py +21 -11
  312. rasa/utils/tensorflow/metrics.py +7 -3
  313. rasa/utils/tensorflow/models.py +56 -8
  314. rasa/utils/tensorflow/rasa_layers.py +8 -6
  315. rasa/utils/tensorflow/transformer.py +2 -3
  316. rasa/utils/train_utils.py +54 -24
  317. rasa/validator.py +17 -13
  318. rasa/version.py +1 -1
  319. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/METADATA +48 -42
  320. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/RECORD +323 -251
  321. rasa/builder/scrape_rasa_docs.py +0 -97
  322. rasa/cli/project_templates/finance/data/general/agent_details.yml +0 -6
  323. rasa/cli/project_templates/finance/domain/_system/patterns/pattern_session_start.yml +0 -11
  324. rasa/cli/project_templates/finance/domain/general/agent_details.yml +0 -31
  325. rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +0 -1
  326. rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +0 -1
  327. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +0 -1
  328. rasa/core/channels/inspector/dist/assets/index-c941dcb3.js +0 -1336
  329. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/NOTICE +0 -0
  330. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/WHEEL +0 -0
  331. {rasa_pro-3.14.0a20.dist-info → rasa_pro-3.14.0a23.dist-info}/entry_points.txt +0 -0
rasa/cli/data.py CHANGED
@@ -15,6 +15,8 @@ from rasa import telemetry
15
15
  from rasa.cli import SubParsersAction
16
16
  from rasa.cli.arguments import data as arguments
17
17
  from rasa.cli.arguments import default_arguments
18
+ from rasa.cli.validation.bot_config import validate_files
19
+ from rasa.cli.validation.config_path_validation import get_validated_path
18
20
  from rasa.e2e_test.e2e_config import create_llm_e2e_test_converter_config
19
21
  from rasa.e2e_test.e2e_test_converter import E2ETestConverter
20
22
  from rasa.e2e_test.utils.e2e_yaml_utils import E2ETestYAMLWriter
@@ -137,7 +139,7 @@ def _add_data_validate_parsers(
137
139
  )
138
140
  _append_story_structure_arguments(validate_parser)
139
141
  validate_parser.set_defaults(
140
- func=lambda args: rasa.cli.utils.validate_files(
142
+ func=lambda args: validate_files(
141
143
  args.fail_on_warnings, args.max_history, _build_training_data_importer(args)
142
144
  )
143
145
  )
@@ -153,7 +155,7 @@ def _add_data_validate_parsers(
153
155
  _append_story_structure_arguments(story_structure_parser)
154
156
 
155
157
  story_structure_parser.set_defaults(
156
- func=lambda args: rasa.cli.utils.validate_files(
158
+ func=lambda args: validate_files(
157
159
  args.fail_on_warnings,
158
160
  args.max_history,
159
161
  _build_training_data_importer(args),
@@ -169,7 +171,7 @@ def _add_data_validate_parsers(
169
171
  help="Checks for inconsistencies in the flows files.",
170
172
  )
171
173
  flows_structure_parser.set_defaults(
172
- func=lambda args: rasa.cli.utils.validate_files(
174
+ func=lambda args: validate_files(
173
175
  args.fail_on_warnings,
174
176
  args.max_history,
175
177
  _build_training_data_importer(args),
@@ -185,7 +187,7 @@ def _add_data_validate_parsers(
185
187
  help="Checks for inconsistencies of the flow and response translation.",
186
188
  )
187
189
  translations_structure_parser.set_defaults(
188
- func=lambda args: rasa.cli.utils.validate_files(
190
+ func=lambda args: validate_files(
189
191
  args.fail_on_warnings,
190
192
  args.max_history,
191
193
  _build_training_data_importer(args),
@@ -196,12 +198,12 @@ def _add_data_validate_parsers(
196
198
 
197
199
 
198
200
  def _build_training_data_importer(args: argparse.Namespace) -> "TrainingDataImporter":
199
- config = rasa.cli.utils.get_validated_path(
201
+ config = get_validated_path(
200
202
  args.config, "config", DEFAULT_CONFIG_PATH, none_is_valid=True
201
203
  )
202
204
 
203
205
  # Exit the validation if the domain path is invalid
204
- domain = rasa.cli.utils.get_validated_path(
206
+ domain = get_validated_path(
205
207
  args.domain, "domain", DEFAULT_DOMAIN_PATHS, none_is_valid=False
206
208
  )
207
209
 
@@ -231,7 +233,7 @@ def split_nlu_data(args: argparse.Namespace) -> None:
231
233
  Args:
232
234
  args: Commandline arguments
233
235
  """
234
- data_path = rasa.cli.utils.get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
236
+ data_path = get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
235
237
  data_path = rasa.shared.data.get_nlu_directory(data_path)
236
238
 
237
239
  nlu_data = rasa.shared.nlu.training_data.loading.load_data(data_path)
@@ -258,7 +260,7 @@ def split_stories_data(args: argparse.Namespace) -> None:
258
260
  YAMLStoryReader,
259
261
  )
260
262
 
261
- data_path = rasa.cli.utils.get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
263
+ data_path = get_validated_path(args.nlu, "nlu", DEFAULT_DATA_PATH)
262
264
  data_files = rasa.shared.data.get_data_files(
263
265
  data_path, YAMLStoryReader.is_stories_file
264
266
  )
@@ -3,6 +3,7 @@ import asyncio
3
3
  import datetime
4
4
  import importlib
5
5
  import sys
6
+ from pathlib import Path
6
7
  from typing import Any, Dict, List, Optional, Type, cast
7
8
 
8
9
  import structlog
@@ -14,9 +15,11 @@ from rasa.cli.arguments.default_arguments import (
14
15
  add_endpoint_param,
15
16
  add_model_param,
16
17
  add_remote_storage_param,
18
+ add_sub_agents_param,
17
19
  )
18
20
  from rasa.core.agent import Agent
19
- from rasa.core.available_endpoints import AvailableEndpoints
21
+ from rasa.core.config.available_endpoints import AvailableEndpoints
22
+ from rasa.core.config.configuration import Configuration
20
23
  from rasa.core.exceptions import AgentNotReady
21
24
  from rasa.core.processor import MessageProcessor
22
25
  from rasa.dialogue_understanding.commands import Command
@@ -47,7 +50,6 @@ from rasa.dialogue_understanding_test.validation import (
47
50
  from rasa.e2e_test.e2e_test_case import TestSuite
48
51
  from rasa.exceptions import RasaException
49
52
  from rasa.shared.constants import (
50
- DEFAULT_ENDPOINTS_PATH,
51
53
  LLM_CONFIG_KEY,
52
54
  ROUTE_TO_CALM_SLOT,
53
55
  )
@@ -174,6 +176,8 @@ def add_du_test_arguments(parser: argparse.ArgumentParser) -> None:
174
176
  ),
175
177
  )
176
178
 
179
+ add_sub_agents_param(du_arguments)
180
+
177
181
 
178
182
  def ensure_calm_only_bot(agent: Agent) -> None:
179
183
  if agent.domain is None or agent.processor is None:
@@ -218,6 +222,7 @@ def execute_dialogue_understanding_tests(args: argparse.Namespace) -> None:
218
222
  model_path=args.model,
219
223
  model_server=endpoints.model,
220
224
  remote_storage=args.remote_storage,
225
+ sub_agents_path=args.sub_agents,
221
226
  )
222
227
  except AgentNotReady as error:
223
228
  structlogger.error(
@@ -323,11 +328,9 @@ def get_valid_test_suite(
323
328
 
324
329
 
325
330
  def set_up_available_endpoints(args: argparse.Namespace) -> AvailableEndpoints:
326
- """Set up the available endpoints for the test runner."""
327
- args.endpoints = rasa.cli.utils.get_validated_path(
328
- args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
329
- )
330
- endpoints = AvailableEndpoints.get_instance(args.endpoints)
331
+ endpoints = Configuration.initialise_endpoints(
332
+ endpoints_path=Path(args.endpoints)
333
+ ).endpoints
331
334
 
332
335
  # Ignore all endpoints apart from action server, model, and nlu
333
336
  # to ensure InMemoryTrackerStore is being used instead of production
rasa/cli/e2e_test.py CHANGED
@@ -17,8 +17,9 @@ from rasa.cli.arguments.default_arguments import (
17
17
  add_endpoint_param,
18
18
  add_model_param,
19
19
  add_remote_storage_param,
20
+ add_sub_agents_param,
20
21
  )
21
- from rasa.core.available_endpoints import AvailableEndpoints
22
+ from rasa.core.config.configuration import Configuration, EndpointsConfigPath
22
23
  from rasa.core.exceptions import AgentNotReady
23
24
  from rasa.e2e_test.aggregate_test_stats_calculator import (
24
25
  AggregateTestStatsCalculator,
@@ -50,7 +51,7 @@ from rasa.e2e_test.utils.io import (
50
51
  )
51
52
  from rasa.e2e_test.utils.validation import validate_model_path
52
53
  from rasa.exceptions import RasaException
53
- from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH, DEFAULT_MODELS_PATH
54
+ from rasa.shared.constants import DEFAULT_MODELS_PATH
54
55
  from rasa.utils.endpoints import EndpointConfig
55
56
 
56
57
  RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME = "RASA_PRO_BETA_FINE_TUNING_RECIPE"
@@ -147,6 +148,8 @@ def add_e2e_test_arguments(parser: argparse.ArgumentParser) -> None:
147
148
  help="Directory where to save coverage report to.",
148
149
  )
149
150
 
151
+ add_sub_agents_param(parser)
152
+
150
153
 
151
154
  def execute_e2e_tests(args: argparse.Namespace) -> None:
152
155
  """Run the end-to-end tests.
@@ -154,10 +157,9 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
154
157
  Args:
155
158
  args: Commandline arguments.
156
159
  """
157
- args.endpoints = rasa.cli.utils.get_validated_path(
158
- args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
159
- )
160
- endpoints = AvailableEndpoints.get_instance(args.endpoints)
160
+ endpoints = Configuration.initialise_endpoints(
161
+ endpoints_path=EndpointsConfigPath.validate(args.endpoints)
162
+ ).endpoints
161
163
 
162
164
  # Ignore all endpoints apart from action server, model, nlu and nlg
163
165
  # to ensure InMemoryTrackerStore is being used instead of production
@@ -192,6 +194,7 @@ def execute_e2e_tests(args: argparse.Namespace) -> None:
192
194
  model_server=endpoints.model,
193
195
  endpoints=endpoints,
194
196
  test_case_path=Path(test_case_path),
197
+ sub_agents_path=args.sub_agents,
195
198
  )
196
199
  except AgentNotReady as error:
197
200
  structlogger.error(
rasa/cli/evaluate.py CHANGED
@@ -6,7 +6,7 @@ import rasa.cli.arguments.evaluate as arguments
6
6
  import rasa.shared.utils.cli
7
7
  from rasa import telemetry
8
8
  from rasa.cli import SubParsersAction
9
- from rasa.core.available_endpoints import AvailableEndpoints
9
+ from rasa.core.config.configuration import Configuration
10
10
  from rasa.core.evaluation.marker_base import Marker, OperatorMarker
11
11
  from rasa.core.evaluation.marker_tracker_loader import MarkerTrackerLoader
12
12
  from rasa.core.tracker_stores.tracker_store import TrackerStore
@@ -217,6 +217,8 @@ def _create_tracker_loader(
217
217
  A MarkerTrackerLoader object configured with the specified strategy against
218
218
  the configured tracker store.
219
219
  """
220
- endpoints = AvailableEndpoints.get_instance(endpoint_config)
220
+ endpoints = Configuration.initialise_endpoints(
221
+ endpoints_path=Path(endpoint_config)
222
+ ).endpoints
221
223
  tracker_store = TrackerStore.create(endpoints.tracker_store, domain=domain)
222
224
  return MarkerTrackerLoader(tracker_store, strategy, count, seed)
rasa/cli/export.py CHANGED
@@ -11,13 +11,14 @@ from rasa import telemetry
11
11
  from rasa.cli import SubParsersAction
12
12
  from rasa.cli.arguments import export as arguments
13
13
  from rasa.core.brokers.pika import PikaEventBroker
14
+ from rasa.core.config.configuration import Configuration
14
15
  from rasa.exceptions import PublishingError
15
16
  from rasa.shared.constants import DOCS_URL_EVENT_BROKERS, DOCS_URL_TRACKER_STORES
16
17
  from rasa.shared.exceptions import RasaException
17
18
 
18
19
  if typing.TYPE_CHECKING:
19
- from rasa.core.available_endpoints import AvailableEndpoints
20
20
  from rasa.core.brokers.broker import EventBroker
21
+ from rasa.core.config.available_endpoints import AvailableEndpoints
21
22
  from rasa.core.exporter import Exporter
22
23
  from rasa.core.tracker_stores.tracker_store import TrackerStore
23
24
 
@@ -179,7 +180,9 @@ def export_trackers(args: argparse.Namespace) -> None:
179
180
  async def _export_trackers(args: argparse.Namespace) -> None:
180
181
  _assert_max_timestamp_is_greater_than_min_timestamp(args)
181
182
 
182
- endpoints = rasa.core.utils.read_endpoints_from_path(args.endpoints)
183
+ endpoints = Configuration.initialise_endpoints(
184
+ endpoints_path=args.endpoints
185
+ ).endpoints
183
186
  tracker_store = _get_tracker_store(endpoints)
184
187
  event_broker = await _get_event_broker(endpoints)
185
188
  _prepare_event_broker(event_broker)
rasa/cli/inspect.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import argparse
2
2
  import webbrowser
3
3
  from asyncio import AbstractEventLoop
4
+ from pathlib import Path
4
5
  from typing import List, Optional, Text
5
6
 
6
7
  from sanic import Sanic
@@ -8,8 +9,9 @@ from sanic import Sanic
8
9
  from rasa import telemetry
9
10
  from rasa.cli import SubParsersAction
10
11
  from rasa.cli.arguments import shell as arguments
12
+ from rasa.cli.arguments.default_arguments import add_sub_agents_param
11
13
  from rasa.core import constants
12
- from rasa.core.available_endpoints import AvailableEndpoints
14
+ from rasa.core.config.configuration import Configuration
13
15
  from rasa.engine.storage.local_model_storage import LocalModelStorage
14
16
  from rasa.exceptions import ModelNotFound
15
17
  from rasa.model import get_local_model
@@ -44,6 +46,8 @@ def add_subparser(
44
46
  "--voice", help="Enable voice", action="store_true", default=False
45
47
  )
46
48
 
49
+ add_sub_agents_param(inspect_parser)
50
+
47
51
  # it'd be confusing to expose those arguments to the user,
48
52
  # so we remove them
49
53
  remove_argument_from_parser(inspect_parser, "--credentials")
@@ -64,7 +68,7 @@ async def open_inspector_in_browser(
64
68
  def inspect(args: argparse.Namespace) -> None:
65
69
  """Inspect the bot using the most recent model."""
66
70
  import rasa.cli.run
67
- from rasa.cli.utils import get_validated_path
71
+ from rasa.cli.validation.config_path_validation import get_validated_path
68
72
  from rasa.shared.constants import DEFAULT_MODELS_PATH
69
73
 
70
74
  async def after_start_hook_open_inspector(_: Sanic, __: AbstractEventLoop) -> None:
@@ -87,8 +91,8 @@ def inspect(args: argparse.Namespace) -> None:
87
91
  # Load endpoints with proper endpoint file location
88
92
  # This will initialise the endpoints singleton properly so that
89
93
  # it can be used safely throughout the codebase with
90
- # `AvailableEndpoints.get_instance()`
91
- AvailableEndpoints.get_instance(args.endpoints)
94
+ # `Configuration.get_instance().endpoints`
95
+ Configuration.initialise_endpoints(endpoints_path=Path(args.endpoints))
92
96
 
93
97
  try:
94
98
  model = get_local_model(model)
rasa/cli/interactive.py CHANGED
@@ -11,6 +11,8 @@ import rasa.utils.common
11
11
  from rasa import model
12
12
  from rasa.cli import SubParsersAction
13
13
  from rasa.cli.arguments import interactive as arguments
14
+ from rasa.cli.validation.config_path_validation import get_validated_path
15
+ from rasa.core.constants import DEFAULT_SUB_AGENTS
14
16
  from rasa.engine.storage.local_model_storage import LocalModelStorage
15
17
  from rasa.shared.constants import (
16
18
  ASSISTANT_ID_DEFAULT_VALUE,
@@ -109,6 +111,7 @@ def _set_not_required_args(args: argparse.Namespace) -> None:
109
111
  args.validation_max_history = None
110
112
  args.remote_storage = None
111
113
  args.keep_local_model_copy = False
114
+ args.sub_agents = DEFAULT_SUB_AGENTS # Default value for sub-agents
112
115
 
113
116
 
114
117
  def perform_interactive_learning(
@@ -133,7 +136,7 @@ def perform_interactive_learning(
133
136
  "Can not run interactive learning on an NLU-only model."
134
137
  )
135
138
 
136
- args.endpoints = rasa.cli.utils.get_validated_path(
139
+ args.endpoints = get_validated_path(
137
140
  args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
138
141
  )
139
142
 
@@ -142,9 +145,7 @@ def perform_interactive_learning(
142
145
 
143
146
  def get_provided_model(arg_model: Text) -> Optional[Union[Text, Path]]:
144
147
  """Checks model path input and selects model from it."""
145
- model_path = rasa.cli.utils.get_validated_path(
146
- arg_model, "model", DEFAULT_MODELS_PATH
147
- )
148
+ model_path = get_validated_path(arg_model, "model", DEFAULT_MODELS_PATH)
148
149
 
149
150
  return (
150
151
  model.get_latest_model(model_path) if os.path.isdir(model_path) else model_path
@@ -1,6 +1,7 @@
1
1
  import argparse
2
2
  import asyncio
3
3
  import sys
4
+ from pathlib import Path
4
5
  from typing import Any, Dict, List, Type, cast
5
6
 
6
7
  import structlog
@@ -14,13 +15,15 @@ from rasa.cli.arguments.default_arguments import (
14
15
  add_endpoint_param,
15
16
  add_model_param,
16
17
  add_remote_storage_param,
18
+ add_sub_agents_param,
17
19
  )
18
20
  from rasa.cli.e2e_test import (
19
21
  RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME,
20
22
  read_test_cases,
21
23
  validate_model_path,
22
24
  )
23
- from rasa.core.available_endpoints import AvailableEndpoints
25
+ from rasa.core.config.available_endpoints import AvailableEndpoints
26
+ from rasa.core.config.configuration import Configuration
24
27
  from rasa.core.exceptions import AgentNotReady
25
28
  from rasa.dialogue_understanding.generator.llm_based_command_generator import (
26
29
  LLMBasedCommandGenerator,
@@ -46,7 +49,6 @@ from rasa.llm_fine_tuning.train_test_split_module import (
46
49
  split_llm_fine_tuning_data,
47
50
  )
48
51
  from rasa.shared.constants import (
49
- DEFAULT_ENDPOINTS_PATH,
50
52
  DEFAULT_MODELS_PATH,
51
53
  LLM_CONFIG_KEY,
52
54
  )
@@ -137,6 +139,8 @@ def add_data_preparation_arguments(parser: argparse.ArgumentParser) -> None:
137
139
  default=DEFAULT_INPUT_E2E_TEST_PATH,
138
140
  )
139
141
 
142
+ add_sub_agents_param(parser)
143
+
140
144
  add_remote_storage_param(parser)
141
145
 
142
146
  rephrasing_arguments = parser.add_argument_group("Rephrasing Module")
@@ -376,6 +380,7 @@ def write_params(
376
380
  "rephrase_config": rephrase_config,
377
381
  "model": args.model,
378
382
  "endpoints": args.endpoints,
383
+ "sub-agents": args.sub_agents,
379
384
  "remote-storage": args.remote_storage,
380
385
  "train_frac": args.train_frac,
381
386
  "output_format": args.output_format,
@@ -393,10 +398,9 @@ def write_statistics(statistics: Dict[str, Any], output_path: str) -> None:
393
398
 
394
399
 
395
400
  def get_valid_endpoints(endpoints_file: str) -> AvailableEndpoints:
396
- validated_endpoints_file = rasa.cli.utils.get_validated_path(
397
- endpoints_file, "endpoints", DEFAULT_ENDPOINTS_PATH, True
398
- )
399
- endpoints = AvailableEndpoints.get_instance(validated_endpoints_file)
401
+ endpoints = Configuration.initialise_endpoints(
402
+ endpoints_path=Path(endpoints_file)
403
+ ).endpoints
400
404
 
401
405
  # Ignore all endpoints apart from action server, model, nlu and nlg
402
406
  # to ensure InMemoryTrackerStore is being used instead of production
@@ -420,6 +424,7 @@ def set_up_e2e_test_runner(args: argparse.Namespace) -> E2ETestRunner:
420
424
  model_path=args.model,
421
425
  model_server=endpoints.model,
422
426
  endpoints=endpoints,
427
+ sub_agents_path=args.sub_agents,
423
428
  )
424
429
  except AgentNotReady as error:
425
430
  structlogger.error(
@@ -0,0 +1,49 @@
1
+ from typing import Any, Dict, List, Text
2
+
3
+ from openai import AsyncOpenAI
4
+ from rasa_sdk import Action, Tracker
5
+ from rasa_sdk.events import BotUttered
6
+ from rasa_sdk.executor import CollectingDispatcher
7
+ from rasa_sdk.types import DomainDict
8
+
9
+
10
+ class ActionHumanHandoff(Action):
11
+ def __init__(self) -> None:
12
+ super().__init__()
13
+ self.client = AsyncOpenAI()
14
+
15
+ def name(self) -> Text:
16
+ return "action_human_handoff"
17
+
18
+ async def run(
19
+ self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict
20
+ ) -> List[Dict[Text, Any]]:
21
+ # Collect conversation
22
+ convo = []
23
+ for event in tracker.events:
24
+ if event.get("event") == "user":
25
+ user_text = "{}".format(event.get("text"))
26
+ user_text2 = "user - " + user_text
27
+ convo.append(user_text2)
28
+ if event.get("event") == "bot":
29
+ bot_text = "{}".format(event.get("text"))
30
+ bot_text2 = "bot - " + bot_text
31
+ # print(bot_text)
32
+ convo.append(bot_text2)
33
+ prompt = (
34
+ f"The following is a conversation between a bot and a human user, "
35
+ f"please summarise so that a human agent can easily understand "
36
+ f"the important context. Conversation: {convo}"
37
+ )
38
+ response = await self.client.chat.completions.create(
39
+ model="gpt-4", # or "gpt-3.5-turbo"
40
+ messages=[{"role": "user", "content": prompt}],
41
+ )
42
+ summarised_conversation = response.choices[0].message.content or ""
43
+ return [
44
+ BotUttered(
45
+ f"I will transfer the following summary of our conversation "
46
+ f"to the Callback Manager:\n"
47
+ f"{summarised_conversation}"
48
+ )
49
+ ]
@@ -0,0 +1,6 @@
1
+ flows:
2
+ bot_challenge:
3
+ name: bot challenge
4
+ description: This flow clarifies that the user is talking to a chatbot, when the user ask if they are talking to a chatbot or a human
5
+ steps:
6
+ - action: utter_bot_challenge
@@ -1,5 +1,5 @@
1
1
  flows:
2
- goodbye_flow:
2
+ goodbye:
3
3
  description: Handle user goodbye messages, say farewell, and collect feedback
4
4
  steps:
5
5
  - action: utter_goodbye
@@ -6,7 +6,7 @@ flows:
6
6
  - collect: confirm_human_handoff
7
7
  ask_before_filling: True
8
8
  next:
9
- - if: slots.confirm_human_handoff is "Yes"
9
+ - if: slots.confirm_human_handoff
10
10
  then:
11
11
  - action: utter_transferring_to_human
12
12
  - action: action_human_handoff
@@ -5,4 +5,4 @@ flows:
5
5
  nlu_trigger:
6
6
  - intent: session_start
7
7
  steps:
8
- - action: utter_greeting
8
+ - link: welcome
@@ -34,20 +34,6 @@ slots:
34
34
  mappings:
35
35
  - type: from_llm
36
36
 
37
- responses:
38
-
39
- # Other utterances
40
- utter_goodbye:
41
- - text: "Thanks for banking with {bank_name} — take care!"
42
- - text: "Thanks for the chat. Have a great day with {bank_name}!"
43
- - text: "Catch you later! Feel free to reach out to {bank_name} anytime."
44
- - text: "Goodbye for now — {bank_name} is here if you need anything."
45
- - text: "Take care! Let {bank_name} know if you have any other questions."
46
-
47
- utter_help:
48
- - text: "I can help you with your everyday banking needs. You can ask me things like: \n {example_questions}"
49
-
50
-
51
37
  session_config:
52
38
  session_expiration_time: 60
53
39
  carry_over_slots_to_new_session: true
@@ -0,0 +1,4 @@
1
+
2
+ responses:
3
+ utter_bot_challenge:
4
+ - text: "You got it - I’m a virtual agent. I’ll do my best to help with your {skills_summary}."
@@ -0,0 +1,7 @@
1
+ responses:
2
+ utter_goodbye:
3
+ - text: "Thanks for banking with {bank_name} — take care!"
4
+ - text: "Thanks for the chat. Have a great day with {bank_name}!"
5
+ - text: "Catch you later! Feel free to reach out to {bank_name} anytime."
6
+ - text: "Goodbye for now — {bank_name} is here if you need anything."
7
+ - text: "Take care! Let {bank_name} know if you have any other questions."
@@ -4,20 +4,17 @@ actions:
4
4
 
5
5
  slots:
6
6
  confirm_human_handoff:
7
- type: "categorical"
7
+ type: "bool"
8
8
  mappings:
9
9
  - type: "from_llm"
10
- values:
11
- - "Yes"
12
- - "No"
13
10
 
14
11
  responses:
15
12
  utter_ask_confirm_human_handoff:
16
13
  - text: "Do you want to be connected to a {bank_name} specialist?"
17
14
  buttons:
18
- - payload: "/SetSlots(confirm_human_handoff=Yes)"
15
+ - payload: "/SetSlots(confirm_human_handoff=True)"
19
16
  title: "Yes"
20
- - payload: "/SetSlots(confirm_human_handoff=No)"
17
+ - payload: "/SetSlots(confirm_human_handoff=False)"
21
18
  title: "No"
22
19
 
23
20
  utter_transferring_to_human:
@@ -1,11 +1,39 @@
1
1
  version: "3.1"
2
2
 
3
+ slots:
4
+ bank_name:
5
+ type: text
6
+ initial_value: "Fenlo"
7
+ mappings:
8
+ - type: controlled
9
+ skills_summary:
10
+ type: text
11
+ initial_value: "transferring money, managing authorised payees, checking an account balance, blocking a card, and answering your general finance enquiries"
12
+ mappings:
13
+ - type: controlled
14
+ example_questions:
15
+ type: text
16
+ initial_value: |
17
+ - What's my account balance?
18
+ - Transfer $50 to Alice today.
19
+ - Block my Visa temporarily.
20
+ - Download my June 2024 statement as a PDF.
21
+ mappings:
22
+ - type: controlled
23
+ agent_name:
24
+ type: text
25
+ initial_value: "Finley"
26
+ mappings:
27
+ - type: controlled
28
+
3
29
  responses:
4
30
  utter_greeting:
5
- - text: "Hi there! I'm {agent_name} 👋. I can help you with your everyday banking needs. \n Here's a few things you can ask me: {example_questions} \n How can I help you today?"
31
+ - text: "Hi there! I'm {agent_name} 👋. I can help you with {skills_summary}. \n Here's a few things you can ask me: {example_questions} \n How can I help you today?"
6
32
  metadata:
7
33
  rephrase: True
8
34
  utter_hello:
9
35
  - text: "Hi nice to meet you - I'm here to help with your {bank_name} account. How can I assist you?"
10
36
  metadata:
11
37
  rephrase: True
38
+ utter_help:
39
+ - text: "I can help you with {skills_summary}. \n\n Here's a few things you can ask me: \n {example_questions}"
@@ -0,0 +1,9 @@
1
+ test_cases:
2
+ - test_case: check balance
3
+ steps:
4
+ - user: "What's my account balance?"
5
+ assertions:
6
+ - flow_started: "check_balance"
7
+ - action_executed: check_balance
8
+ - bot_uttered:
9
+ utter_name: "utter_current_balance"
@@ -0,0 +1,43 @@
1
+ test_cases:
2
+ - test_case: download account statements (happy path)
3
+ steps:
4
+ - user: "Download my June 2024 statement as a PDF."
5
+ assertions:
6
+ - flow_started: "download_statements"
7
+ - slot_was_set:
8
+ - name: "statement_format"
9
+ value: "pdf"
10
+ - name: "statement_month"
11
+ value: "June"
12
+ - name: "statement_year"
13
+ value: "2024"
14
+ - bot_uttered:
15
+ utter_name: "utter_ask_statement_download_confirmation"
16
+ - user: "/SetSlots(confirmation=true)"
17
+ assertions:
18
+ - slot_was_set:
19
+ - name: "confirmation"
20
+ value: true
21
+ - bot_uttered:
22
+ utter_name: "utter_statement_download_complete"
23
+ - test_case: download account statements (unhappy path)
24
+ steps:
25
+ - user: "Download my June 2024 statement as a PDF."
26
+ assertions:
27
+ - flow_started: "download_statements"
28
+ - slot_was_set:
29
+ - name: "statement_format"
30
+ value: "pdf"
31
+ - name: "statement_month"
32
+ value: "June"
33
+ - name: "statement_year"
34
+ value: "2024"
35
+ - bot_uttered:
36
+ utter_name: "utter_ask_statement_download_confirmation"
37
+ - user: "/SetSlots(confirmation=false)"
38
+ assertions:
39
+ - slot_was_set:
40
+ - name: "confirmation"
41
+ value: false
42
+ - bot_uttered:
43
+ utter_name: "utter_statement_download_cancelled"