rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev7__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 (477) 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 +38 -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 +685 -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 +77 -0
  20. rasa/agents/validation.py +484 -0
  21. rasa/api.py +14 -6
  22. rasa/cli/arguments/default_arguments.py +12 -0
  23. rasa/cli/arguments/run.py +2 -0
  24. rasa/cli/arguments/train.py +2 -0
  25. rasa/cli/dialogue_understanding_test.py +4 -0
  26. rasa/cli/e2e_test.py +4 -0
  27. rasa/cli/inspect.py +3 -0
  28. rasa/cli/interactive.py +2 -0
  29. rasa/cli/llm_fine_tuning.py +5 -0
  30. rasa/cli/project_templates/tutorial/config.yml +1 -2
  31. rasa/cli/run.py +4 -0
  32. rasa/cli/scaffold.py +2 -46
  33. rasa/cli/shell.py +3 -0
  34. rasa/cli/train.py +2 -0
  35. rasa/cli/utils.py +85 -1
  36. rasa/constants.py +6 -0
  37. rasa/core/actions/action.py +52 -10
  38. rasa/core/agent.py +19 -1
  39. rasa/core/available_agents.py +220 -0
  40. rasa/core/available_endpoints.py +30 -0
  41. rasa/core/channels/channel.py +3 -4
  42. rasa/core/channels/development_inspector.py +4 -4
  43. rasa/core/channels/hangouts.py +2 -2
  44. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-cce7e0a8.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-e2a49be7.js} +1 -1
  46. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-3def7895.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +1 -0
  48. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-e66fe4df.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-eb874aaa.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +1 -0
  51. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-cf934643.js} +1 -1
  52. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-8fdf9155.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-6106fb96.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-4c2bb040.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-f0ff96af.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +1 -0
  57. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-a21707ec.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-c165acb1.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-b0564cf1.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-e557e67a.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-1ce60e9e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/index-996fe816.js +1353 -0
  63. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-893569e2.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c29c864f.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-649a5eae.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0e5685ed.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-eaa320bd.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-f35df9e6.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-78339e96.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-9b5f2f14.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-d05ddb3a.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-d9be5dfd.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-0f1c4348.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-9ddf63b3.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-bc2b81ed.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-0a287936.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-e3941990.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-ce4eca24.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d822b1a8.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e144c7a7.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-ab7f4e14.js} +1 -1
  82. rasa/core/channels/inspector/dist/index.html +2 -2
  83. rasa/core/channels/inspector/index.html +1 -1
  84. rasa/core/channels/inspector/src/App.tsx +37 -12
  85. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  86. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +3 -2
  87. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
  88. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  89. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  90. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  91. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  92. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  93. rasa/core/channels/inspector/src/types.ts +21 -0
  94. rasa/core/channels/socketio.py +51 -212
  95. rasa/core/channels/studio_chat.py +29 -49
  96. rasa/core/channels/voice_stream/genesys.py +1 -1
  97. rasa/core/channels/voice_stream/voice_channel.py +3 -5
  98. rasa/core/constants.py +4 -0
  99. rasa/core/policies/enterprise_search_policy.py +11 -6
  100. rasa/core/policies/flow_policy.py +4 -4
  101. rasa/core/policies/flows/flow_executor.py +519 -73
  102. rasa/core/policies/flows/mcp_tool_executor.py +277 -0
  103. rasa/core/policies/intentless_policy.py +1 -1
  104. rasa/core/policies/unexpected_intent_policy.py +1 -0
  105. rasa/core/processor.py +18 -15
  106. rasa/core/run.py +11 -14
  107. rasa/core/tracker_stores/tracker_store.py +3 -7
  108. rasa/core/train.py +1 -1
  109. rasa/core/training/interactive.py +16 -16
  110. rasa/core/training/story_conflict.py +5 -5
  111. rasa/core/utils.py +21 -1
  112. rasa/dialogue_understanding/commands/__init__.py +8 -0
  113. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  114. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
  115. rasa/dialogue_understanding/commands/clarify_command.py +10 -0
  116. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  117. rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
  118. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  119. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  120. rasa/dialogue_understanding/commands/utils.py +124 -2
  121. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  122. rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
  123. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  124. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  125. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  126. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
  127. 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
  128. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
  129. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
  130. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
  131. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
  132. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
  133. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  134. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  135. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  136. rasa/dialogue_understanding/processor/command_processor.py +31 -15
  137. rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
  138. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  139. rasa/dialogue_understanding/stack/utils.py +57 -3
  140. rasa/dialogue_understanding/utils.py +24 -4
  141. rasa/dialogue_understanding_test/du_test_runner.py +7 -2
  142. rasa/e2e_test/e2e_test_runner.py +12 -2
  143. rasa/engine/caching.py +2 -2
  144. rasa/engine/recipes/default_components.py +10 -18
  145. rasa/engine/storage/local_model_storage.py +2 -45
  146. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  147. rasa/hooks.py +5 -5
  148. rasa/llm_fine_tuning/utils.py +2 -2
  149. rasa/model_manager/model_api.py +5 -4
  150. rasa/model_manager/runner_service.py +1 -1
  151. rasa/model_manager/socket_bridge.py +14 -20
  152. rasa/model_manager/trainer_service.py +9 -12
  153. rasa/model_manager/utils.py +29 -1
  154. rasa/model_manager/warm_rasa_process.py +1 -1
  155. rasa/model_training.py +8 -6
  156. rasa/nlu/extractors/extractor.py +2 -1
  157. rasa/plugin.py +8 -8
  158. rasa/privacy/privacy_manager.py +11 -2
  159. rasa/server.py +14 -2
  160. rasa/shared/agents/utils.py +35 -0
  161. rasa/shared/constants.py +8 -0
  162. rasa/shared/core/constants.py +11 -1
  163. rasa/shared/core/domain.py +11 -58
  164. rasa/shared/core/events.py +327 -0
  165. rasa/shared/core/flows/flow_step.py +1 -7
  166. rasa/shared/core/flows/flows_list.py +15 -5
  167. rasa/shared/core/flows/flows_yaml_schema.json +112 -186
  168. rasa/shared/core/flows/steps/call.py +53 -5
  169. rasa/shared/core/flows/validation.py +177 -7
  170. rasa/shared/core/flows/yaml_flows_io.py +9 -17
  171. rasa/shared/core/slots.py +2 -6
  172. rasa/shared/core/trackers.py +5 -2
  173. rasa/shared/exceptions.py +4 -0
  174. rasa/shared/importers/importer.py +0 -6
  175. rasa/shared/importers/rasa.py +1 -1
  176. rasa/shared/importers/utils.py +10 -80
  177. rasa/shared/providers/_utils.py +44 -60
  178. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
  179. rasa/shared/providers/llm/_base_litellm_client.py +39 -7
  180. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
  181. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  182. rasa/shared/providers/llm/llm_client.py +7 -3
  183. rasa/shared/providers/llm/llm_response.py +66 -0
  184. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  185. rasa/shared/utils/health_check/health_check.py +7 -3
  186. rasa/shared/utils/llm.py +28 -5
  187. rasa/shared/utils/mcp/server_connection.py +186 -0
  188. rasa/shared/utils/schemas/events.py +42 -0
  189. rasa/shared/utils/yaml.py +3 -1
  190. rasa/studio/upload.py +47 -16
  191. rasa/telemetry.py +23 -97
  192. rasa/tracing/instrumentation/instrumentation.py +14 -10
  193. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  194. rasa/utils/common.py +79 -0
  195. rasa/utils/io.py +9 -27
  196. rasa/utils/json_utils.py +1 -6
  197. rasa/utils/log_utils.py +2 -6
  198. rasa/utils/ml_utils.py +1 -1
  199. rasa/utils/tensorflow/rasa_layers.py +1 -1
  200. rasa/utils/train_utils.py +15 -15
  201. rasa/validator.py +19 -21
  202. rasa/version.py +1 -1
  203. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/METADATA +14 -17
  204. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/RECORD +214 -442
  205. rasa/builder/README.md +0 -120
  206. rasa/builder/auth.py +0 -176
  207. rasa/builder/config.py +0 -115
  208. rasa/builder/copilot/constants.py +0 -25
  209. rasa/builder/copilot/copilot.py +0 -372
  210. rasa/builder/copilot/copilot_response_handler.py +0 -487
  211. rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
  212. rasa/builder/copilot/exceptions.py +0 -20
  213. rasa/builder/copilot/models.py +0 -431
  214. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
  215. rasa/builder/copilot/telemetry.py +0 -195
  216. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
  217. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
  218. rasa/builder/document_retrieval/constants.py +0 -15
  219. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
  220. rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
  221. rasa/builder/document_retrieval/models.py +0 -62
  222. rasa/builder/download.py +0 -140
  223. rasa/builder/exceptions.py +0 -55
  224. rasa/builder/guardrails/__init__.py +0 -1
  225. rasa/builder/guardrails/constants.py +0 -3
  226. rasa/builder/guardrails/exceptions.py +0 -4
  227. rasa/builder/guardrails/lakera.py +0 -206
  228. rasa/builder/guardrails/models.py +0 -199
  229. rasa/builder/guardrails/utils.py +0 -305
  230. rasa/builder/job_manager.py +0 -87
  231. rasa/builder/jobs.py +0 -234
  232. rasa/builder/llm_service.py +0 -246
  233. rasa/builder/logging_utils.py +0 -209
  234. rasa/builder/main.py +0 -174
  235. rasa/builder/models.py +0 -197
  236. rasa/builder/project_generator.py +0 -450
  237. rasa/builder/project_info.py +0 -72
  238. rasa/builder/scrape_rasa_docs.py +0 -97
  239. rasa/builder/service.py +0 -1142
  240. rasa/builder/shared/tracker_context.py +0 -212
  241. rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
  242. rasa/builder/training_service.py +0 -132
  243. rasa/builder/validation_service.py +0 -93
  244. rasa/cli/project_templates/basic/actions/action_api.py +0 -15
  245. rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
  246. rasa/cli/project_templates/basic/config.yml +0 -23
  247. rasa/cli/project_templates/basic/credentials.yml +0 -34
  248. rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
  249. rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
  250. rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
  251. rasa/cli/project_templates/basic/data/general/help.yml +0 -6
  252. rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
  253. rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
  254. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
  255. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
  256. rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
  257. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
  258. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
  259. rasa/cli/project_templates/basic/docs/template.txt +0 -7
  260. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
  261. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
  262. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
  263. rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
  264. rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
  265. rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
  266. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
  267. rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
  268. rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
  269. rasa/cli/project_templates/basic/endpoints.yml +0 -73
  270. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  271. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  272. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  273. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  274. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  275. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  276. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  277. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  278. rasa/cli/project_templates/finance/actions/database.py +0 -277
  279. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  280. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  281. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  282. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  283. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  284. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  285. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
  286. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  287. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  288. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  289. rasa/cli/project_templates/finance/config.yml +0 -21
  290. rasa/cli/project_templates/finance/credentials.yml +0 -32
  291. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  292. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  293. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  294. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  295. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  296. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  297. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  298. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  299. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
  300. rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
  301. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  302. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  303. rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
  304. rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
  305. rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
  306. rasa/cli/project_templates/finance/data/general/help.yml +0 -9
  307. rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
  308. rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
  309. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  310. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
  311. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
  312. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
  313. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
  314. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  315. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  316. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  317. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  318. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  319. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  320. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  321. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  322. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  323. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  324. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  325. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
  326. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  327. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  328. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  329. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  330. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  331. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  332. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  333. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  334. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  335. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  336. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  337. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  338. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  339. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  340. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  341. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  342. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  343. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  344. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  345. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  346. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  347. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  348. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  349. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  350. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  351. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  352. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  353. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  354. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  355. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  356. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  357. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  358. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  359. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  360. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  361. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  362. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  363. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  364. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  365. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  366. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  367. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  368. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  369. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  370. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  371. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  372. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  373. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  374. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  375. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  376. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  377. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  378. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  379. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  380. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  381. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  382. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  383. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  384. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  385. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  386. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  387. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  388. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  389. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  390. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  391. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  392. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  393. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  394. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  395. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  396. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  397. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  398. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  399. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  400. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  401. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  402. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  403. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  404. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  405. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  406. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  407. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
  408. rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
  409. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  410. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  411. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  412. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
  413. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  414. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
  415. rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
  416. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  417. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
  418. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  419. rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
  420. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  421. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  422. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  423. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
  424. rasa/cli/project_templates/finance/endpoints.yml +0 -63
  425. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  426. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  427. rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
  428. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
  429. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
  430. rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
  431. rasa/cli/project_templates/telco/config.yml +0 -25
  432. rasa/cli/project_templates/telco/credentials.yml +0 -33
  433. rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
  434. rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
  435. rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
  436. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
  437. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
  438. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
  439. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
  440. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
  441. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
  442. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
  443. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
  444. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
  445. rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
  446. rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
  447. rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
  448. rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
  449. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
  450. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
  451. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
  452. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
  453. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
  454. rasa/cli/project_templates/telco/endpoints.yml +0 -60
  455. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
  456. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
  457. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
  458. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
  459. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
  460. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
  461. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
  462. rasa/core/channels/constants.py +0 -3
  463. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  464. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  465. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  466. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  467. rasa/utils/openapi.py +0 -144
  468. /rasa/{builder → agents}/__init__.py +0 -0
  469. /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
  470. /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
  471. /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
  472. /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
  473. /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
  474. /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
  475. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/NOTICE +0 -0
  476. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/WHEEL +0 -0
  477. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,685 @@
1
+ import json
2
+ from abc import abstractmethod
3
+ from inspect import isawaitable
4
+ from typing import Any, Dict, List, Optional, Tuple
5
+
6
+ import structlog
7
+ from jinja2 import Template
8
+ from mcp import ListToolsResult
9
+
10
+ from rasa.agents.constants import (
11
+ AGENT_DEFAULT_MAX_RETRIES,
12
+ AGENT_DEFAULT_TIMEOUT_SECONDS,
13
+ AGENT_METADATA_TOOL_RESULTS_KEY,
14
+ KEY_ARGUMENTS,
15
+ KEY_CONTENT,
16
+ KEY_FUNCTION,
17
+ KEY_ID,
18
+ KEY_NAME,
19
+ KEY_ROLE,
20
+ KEY_TOOL_CALL_ID,
21
+ KEY_TOOL_CALLS,
22
+ KEY_TYPE,
23
+ )
24
+ from rasa.agents.core.agent_protocol import AgentProtocol
25
+ from rasa.agents.core.types import AgentStatus, ProtocolType
26
+ from rasa.agents.schemas import (
27
+ AgentInput,
28
+ AgentOutput,
29
+ AgentToolResult,
30
+ AgentToolSchema,
31
+ CustomToolSchema,
32
+ )
33
+ from rasa.core.available_agents import AgentConfig, AgentMCPServerConfig, ProtocolConfig
34
+ from rasa.shared.agents.utils import make_agent_identifier
35
+ from rasa.shared.constants import (
36
+ MAX_COMPLETION_TOKENS_CONFIG_KEY,
37
+ MODEL_CONFIG_KEY,
38
+ OPENAI_PROVIDER,
39
+ PROVIDER_CONFIG_KEY,
40
+ ROLE_ASSISTANT,
41
+ ROLE_SYSTEM,
42
+ ROLE_TOOL,
43
+ ROLE_USER,
44
+ TEMPERATURE_CONFIG_KEY,
45
+ TIMEOUT_CONFIG_KEY,
46
+ )
47
+ from rasa.shared.core.events import BotUttered, UserUttered
48
+ from rasa.shared.exceptions import AgentInitializationException
49
+ from rasa.shared.providers.llm.llm_response import LLMResponse, LLMToolCall
50
+ from rasa.shared.utils.constants import LOG_COMPONENT_SOURCE_METHOD_INIT
51
+ from rasa.shared.utils.llm import (
52
+ get_prompt_template,
53
+ llm_factory,
54
+ resolve_model_client_config,
55
+ )
56
+ from rasa.shared.utils.mcp.server_connection import MCPServerConnection
57
+
58
+ DEFAULT_OPENAI_MAX_GENERATED_TOKENS = 256
59
+ MODEL_NAME_GPT_4O_2024_11_20 = "gpt-4o-2024-11-20"
60
+ DEFAULT_LLM_CONFIG = {
61
+ PROVIDER_CONFIG_KEY: OPENAI_PROVIDER,
62
+ MODEL_CONFIG_KEY: MODEL_NAME_GPT_4O_2024_11_20,
63
+ TEMPERATURE_CONFIG_KEY: 0.0,
64
+ MAX_COMPLETION_TOKENS_CONFIG_KEY: DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
65
+ TIMEOUT_CONFIG_KEY: 7,
66
+ }
67
+
68
+
69
+ structlogger = structlog.get_logger()
70
+
71
+
72
+ class MCPBaseAgent(AgentProtocol):
73
+ """MCP protocol implementation"""
74
+
75
+ MAX_ITERATIONS = 10
76
+
77
+ # ============================================================================
78
+ # Initialization & Setup
79
+ # ============================================================================
80
+
81
+ def __init__(
82
+ self,
83
+ name: str,
84
+ description: str,
85
+ protocol_type: ProtocolConfig,
86
+ server_configs: List[AgentMCPServerConfig],
87
+ llm_config: Optional[Dict[str, Any]] = None,
88
+ prompt_template: Optional[str] = None,
89
+ timeout: Optional[int] = None,
90
+ max_retries: Optional[int] = None,
91
+ ):
92
+ self._name = name
93
+
94
+ self._description = description
95
+
96
+ self._protocol_type = protocol_type
97
+
98
+ self._llm_config = resolve_model_client_config(
99
+ llm_config, self.__class__.__name__
100
+ )
101
+
102
+ self.llm_client = llm_factory(self._llm_config, self.get_default_llm_config())
103
+
104
+ self.prompt_template = get_prompt_template(
105
+ prompt_template,
106
+ self.get_default_prompt_template(),
107
+ log_source_component=self.__class__.__name__,
108
+ log_source_method=LOG_COMPONENT_SOURCE_METHOD_INIT,
109
+ )
110
+
111
+ self._timeout = timeout or AGENT_DEFAULT_TIMEOUT_SECONDS
112
+
113
+ self._max_retries = max_retries or AGENT_DEFAULT_MAX_RETRIES
114
+
115
+ self._server_configs = server_configs or []
116
+
117
+ # Stores the MCP tools for the agent.
118
+ self._mcp_tools: List[AgentToolSchema] = []
119
+
120
+ # Stores the custom tools for the agent.
121
+ self._custom_tools: List[CustomToolSchema] = [
122
+ CustomToolSchema.from_dict(tool)
123
+ for tool in self.get_custom_tool_definitions()
124
+ ]
125
+
126
+ # Maps the tool names to the MCP servers that provide them.
127
+ # key: tool name, value: server name.
128
+ self._tool_to_server_mapper: Dict[str, str] = {}
129
+
130
+ # Stores the connections to the MCP servers.
131
+ # key: server name, value: connection object.
132
+ self._server_connections: Dict[str, MCPServerConnection] = {}
133
+
134
+ @classmethod
135
+ def from_config(cls, config: AgentConfig) -> "MCPBaseAgent":
136
+ """Initialize the MCP Open Agent with the given configuration."""
137
+ return cls(
138
+ name=config.agent.name,
139
+ description=config.agent.description,
140
+ protocol_type=config.agent.protocol,
141
+ llm_config=config.configuration.llm if config.configuration else None,
142
+ prompt_template=config.configuration.prompt_template
143
+ if config.configuration
144
+ else None,
145
+ timeout=config.configuration.timeout if config.configuration else None,
146
+ max_retries=config.configuration.max_retries
147
+ if config.configuration
148
+ else None,
149
+ server_configs=config.connections.mcp_servers
150
+ if config.connections
151
+ else None,
152
+ )
153
+
154
+ # ============================================================================
155
+ # Class Configuration & Properties
156
+ # ============================================================================
157
+
158
+ @classmethod
159
+ @abstractmethod
160
+ def get_default_prompt_template(cls) -> str: ...
161
+
162
+ @property
163
+ def agent_conforms_to(self) -> ProtocolConfig:
164
+ return self._protocol_type
165
+
166
+ @property
167
+ @abstractmethod
168
+ def protocol_type(self) -> ProtocolType: ...
169
+
170
+ @staticmethod
171
+ def get_default_llm_config() -> Dict[str, Any]:
172
+ """Get the default LLM config for the command generator."""
173
+ return DEFAULT_LLM_CONFIG
174
+
175
+ @classmethod
176
+ def get_agent_specific_built_in_tools(
177
+ cls, agent_input: AgentInput
178
+ ) -> List[AgentToolSchema]:
179
+ """Get agentic specific built-in tools."""
180
+ return []
181
+
182
+ def get_custom_tool_definitions(self) -> List[Dict[str, Any]]:
183
+ """Add custom tool definitions and their executors for MCP agents.
184
+
185
+ This method can be overridden to provide custom tools that the agent
186
+ can use during its operation. The tools should be defined in the OpenAI
187
+ JSON format, which includes the tool name, description, and parameters.
188
+
189
+ Refer: https://platform.openai.com/docs/guides/function-calling?api-mode=responses
190
+
191
+ Note:
192
+ The tool executor method should be a coroutine function that returns an
193
+ AgentToolResult object.
194
+
195
+ Returns:
196
+ A list of custom tool definitions along with their tool executor method.
197
+
198
+ Example:
199
+ ```python
200
+ def get_custom_tool_definitions(self) -> List[Dict[str, Any]]:
201
+ return [
202
+ {
203
+ "type": "function",
204
+ "function": {
205
+ "name": "get_current_weather",
206
+ "description": "Get the current weather in given location",
207
+ "parameters": {
208
+ "type": "object",
209
+ "properties": {
210
+ "location": {
211
+ "type": "string",
212
+ "description": "The city, e.g. San Francisco",
213
+ },
214
+ "unit": {
215
+ "type": "string",
216
+ "enum": ["celsius", "fahrenheit"],
217
+ },
218
+ },
219
+ "required": ["location"],
220
+ },
221
+ },
222
+ "tool_executor": self.get_current_weather,
223
+ }
224
+ ]
225
+ ```
226
+ """
227
+ return []
228
+
229
+ # ============================================================================
230
+ # Connection Management
231
+ # ============================================================================
232
+
233
+ async def connect(self) -> None:
234
+ """Connect to the MCP servers and initialize the agent.
235
+
236
+ This method establishes connections to the configured MCP servers,
237
+ fetches the available tools, and prepares the agent for operation.
238
+ It should be called before sending any messages to the agent.
239
+
240
+ Retries:
241
+ Retries connection N times if a ConnectionError is raised.
242
+
243
+ Logs:
244
+ Warning: If the connection to any server fails.
245
+ Warning: If there is a duplicate tool name across servers.
246
+ Warning: If there is an error fetching tools from any server.
247
+ """
248
+ for attempt in range(1, self._max_retries + 1):
249
+ try:
250
+ await self.connect_to_servers()
251
+ await self.fetch_and_store_available_tools()
252
+ break
253
+ except ConnectionError as ce:
254
+ structlogger.warning(
255
+ "mcp_agent.connect.connection_error",
256
+ event_info=f"Connection attempt {attempt} failed.",
257
+ error=str(ce),
258
+ attempt=attempt,
259
+ max_retries=self._max_retries,
260
+ )
261
+ if attempt == self._max_retries:
262
+ structlogger.error(
263
+ "mcp_agent.connect.failed_after_retries",
264
+ event_info="All connection attempts failed.",
265
+ )
266
+ raise AgentInitializationException(
267
+ f"Failed to connect to MCP servers after {self._max_retries} "
268
+ f"attempts. Agent `{self._name}` failed to initialize."
269
+ ) from ce
270
+ except Exception as e:
271
+ structlogger.error(
272
+ "mcp_agent.connect.unexpected_exception",
273
+ event_info="Unexpected error during agent initialization.",
274
+ error=str(e),
275
+ agent_name=self._name,
276
+ agent_id=str(make_agent_identifier(self._name, self.protocol_type)),
277
+ )
278
+ raise AgentInitializationException(e) from e
279
+
280
+ async def connect_to_server(self, server_config: AgentMCPServerConfig) -> None:
281
+ server_name = server_config.name
282
+ connection = MCPServerConnection.from_config(server_config.model_dump())
283
+ try:
284
+ await connection.connect()
285
+ self._server_connections[server_name] = connection
286
+ structlogger.info(
287
+ "mcp_agent.connect_to_server.connected",
288
+ event_info=(
289
+ f"Agent `{self._name}` connected to MCP server - "
290
+ f"`{server_name}` @ `{connection.server_url}`"
291
+ ),
292
+ server_id=server_name,
293
+ server_url=connection.server_url,
294
+ agent_name=self._name,
295
+ agent_id=str(make_agent_identifier(self._name, self.protocol_type)),
296
+ )
297
+ except Exception as e:
298
+ event_info = (
299
+ f"Agent `{self._name}` failed to connect to MCP server - "
300
+ f"`{server_name}` @ `{server_config.url}`: {e!s}"
301
+ )
302
+ structlogger.error(
303
+ "mcp_agent.connect.failed_to_connect",
304
+ event_info=event_info,
305
+ server_id=server_name,
306
+ server_url=server_config.url,
307
+ agent_name=self._name,
308
+ agent_id=str(make_agent_identifier(self._name, self.protocol_type)),
309
+ )
310
+ raise ConnectionError(e)
311
+
312
+ async def connect_to_servers(self) -> None:
313
+ """Connect to MCP servers."""
314
+ for server_config in self._server_configs:
315
+ await self.connect_to_server(server_config)
316
+
317
+ async def disconnect_server(self, server_name: str) -> None:
318
+ """Disconnect from an MCP server.
319
+
320
+ Args:
321
+ server_name: The name of the server to disconnect from.
322
+
323
+ Side effects:
324
+ - Removes the server from the server connections.
325
+
326
+ Logs:
327
+ - An error if the server disconnect fails.
328
+ """
329
+ if server_name not in self._server_connections:
330
+ return
331
+ try:
332
+ await self._server_connections[server_name].close()
333
+ del self._server_connections[server_name]
334
+ except Exception as e:
335
+ structlogger.error(
336
+ "mcp_agent.disconnect_server.error",
337
+ event_info=f"Failed to disconnect from server `{server_name}`: {e!s}",
338
+ server_name=server_name,
339
+ agent_name=self._name,
340
+ agent_id=str(make_agent_identifier(self._name, self.protocol_type)),
341
+ )
342
+
343
+ async def disconnect(self) -> None:
344
+ """Close all MCP server connections."""
345
+ server_names = list(self._server_connections.keys())
346
+ for server_name in server_names:
347
+ await self.disconnect_server(server_name)
348
+
349
+ # ============================================================================
350
+ # Tool Management
351
+ # ============================================================================
352
+
353
+ async def list_tools(self, connection: MCPServerConnection) -> ListToolsResult:
354
+ """List the tools from the MCP server."""
355
+ session = await connection.ensure_active_session()
356
+ return await session.list_tools()
357
+
358
+ def get_custom_tools(self) -> List[AgentToolSchema]:
359
+ """Get the custom tools for the agent."""
360
+ return [tool.tool_definition for tool in self._custom_tools]
361
+
362
+ def get_available_tools(self, agent_input: AgentInput) -> List[AgentToolSchema]:
363
+ """Get the available tools for the agent."""
364
+ return (
365
+ self._mcp_tools
366
+ + self.get_agent_specific_built_in_tools(agent_input)
367
+ + self.get_custom_tools()
368
+ )
369
+
370
+ async def _get_filtered_tools_from_server(
371
+ self,
372
+ server_name: str,
373
+ connection: MCPServerConnection,
374
+ include_tools: Optional[List[str]] = None,
375
+ exclude_tools: Optional[List[str]] = None,
376
+ ) -> List[AgentToolSchema]:
377
+ """Get filtered tools from the MCP server.
378
+
379
+ This method fetches the available tools from the MCP server and filters them
380
+ based on the include_tools and exclude_tools parameters.
381
+
382
+ Args:
383
+ server_name: The name of the MCP server.
384
+ connection: The MCP server connection.
385
+ include_tools: List of tool names to include. If provided, only tools in
386
+ this list will be fetched.
387
+ exclude_tools: List of tool names to exclude. If provided, tools in this
388
+ list will not be fetched.
389
+
390
+ Returns:
391
+ A list of AgentToolSchema objects representing the filtered tools.
392
+
393
+ Logs:
394
+ Warning: If there is a duplicate tool name across servers.
395
+ Warning: If there is an error fetching tools from the server.
396
+ """
397
+ try:
398
+ tools_response = await self.list_tools(connection)
399
+ if not tools_response:
400
+ return []
401
+
402
+ filtered_tools = []
403
+ for tool in tools_response.tools:
404
+ if include_tools and tool.name not in include_tools:
405
+ continue
406
+ if exclude_tools and tool.name in exclude_tools:
407
+ continue
408
+ filtered_tools.append(AgentToolSchema.from_mcp_tool(tool))
409
+
410
+ return filtered_tools
411
+
412
+ except Exception as e:
413
+ event_info = f"Failed to load tools from {server_name}"
414
+ structlogger.warning(
415
+ "mcp_agent.get_filtered_tools_from_server.failed_to_get_tools",
416
+ event_info=event_info,
417
+ server_name=server_name,
418
+ server_url=connection.server_url,
419
+ error=str(e),
420
+ )
421
+ return []
422
+
423
+ def _get_include_exclude_tools_from_server_configs(
424
+ self, server_name: str
425
+ ) -> Tuple[Optional[List[str]], Optional[List[str]]]:
426
+ """Get the include and exclude tools from the server configs."""
427
+ for server_config in self._server_configs:
428
+ if server_config.name == server_name:
429
+ return server_config.include_tools, server_config.exclude_tools
430
+ return None, None
431
+
432
+ async def fetch_and_store_available_tools(self) -> None:
433
+ """Fetch and store the available tools from the MCP servers.
434
+
435
+ This method fetches the available tools from the MCP servers and stores them
436
+ in the agent's internal state. It also maps the tool names to the MCP servers
437
+ that provide them.
438
+
439
+ Side effects:
440
+ - Updates the `_mcp_tools` attribute.
441
+ - Updates the `_tool_to_server_mapper` attribute.
442
+
443
+ Logs:
444
+ Warning: If there is a duplicate tool name across servers.
445
+ Warning: If there is an error fetching tools from any server.
446
+ """
447
+ for server_name, connection in self._server_connections.items():
448
+ # Get the include and exclude tools from the server configs.
449
+ include_tools, exclude_tools = (
450
+ self._get_include_exclude_tools_from_server_configs(server_name)
451
+ )
452
+
453
+ # Get the filtered tools from the server.
454
+ tools = await self._get_filtered_tools_from_server(
455
+ server_name, connection, include_tools, exclude_tools
456
+ )
457
+
458
+ # Add the tools to the tool_to_server_mapper and the available_tools.
459
+ for tool in tools:
460
+ if tool.name in self._tool_to_server_mapper:
461
+ structlogger.warning(
462
+ "mcp_agent.duplicate_tool_name",
463
+ event_info=(
464
+ f"Tool - {tool.name} from server {server_name} already "
465
+ f"exists in {self._tool_to_server_mapper[tool.name]}. "
466
+ f"Omitting the tool from server {server_name}."
467
+ ),
468
+ tool_name=tool.name,
469
+ server_name=server_name,
470
+ server_url=connection.server_url,
471
+ )
472
+ continue
473
+
474
+ self._tool_to_server_mapper[tool.name] = server_name
475
+ self._mcp_tools.append(tool)
476
+
477
+ structlogger.debug(
478
+ "mcp_agent.fetch_and_store_available_tools.success",
479
+ event_info=(
480
+ "Successfully fetched and stored available tools from MCP servers."
481
+ ),
482
+ agent_name=self._name,
483
+ agent_id=str(make_agent_identifier(self._name, self.protocol_type)),
484
+ mcp_tools_fetched=len(self._mcp_tools),
485
+ mcp_tools=[tool.name for tool in self._mcp_tools],
486
+ )
487
+
488
+ # ============================================================================
489
+ # LLM & Prompt Management
490
+ # ============================================================================
491
+
492
+ def render_prompt_template(self, context: AgentInput) -> str:
493
+ """Render the prompt template with the provided inputs."""
494
+ return Template(self.prompt_template).render(
495
+ **context.model_dump(exclude={"id", "timestamp", "events"}),
496
+ description=self._description,
497
+ )
498
+
499
+ def build_messages_for_llm_request(
500
+ self, context: AgentInput, turns: int = 20
501
+ ) -> List[Dict[str, str]]:
502
+ """Build messages for the LLM request."""
503
+ messages = [
504
+ {KEY_ROLE: ROLE_SYSTEM, KEY_CONTENT: self.render_prompt_template(context)}
505
+ ]
506
+
507
+ # Limit to last N events - set by `turns`.
508
+ for event in context.events[-turns:]:
509
+ if isinstance(event, UserUttered):
510
+ if not event.text:
511
+ continue
512
+ messages.append({KEY_ROLE: ROLE_USER, KEY_CONTENT: event.text})
513
+ elif isinstance(event, BotUttered):
514
+ if not event.text:
515
+ continue
516
+ messages.append({KEY_ROLE: ROLE_ASSISTANT, KEY_CONTENT: event.text})
517
+
518
+ if context.user_message != messages[-1][KEY_CONTENT]:
519
+ messages.append({KEY_ROLE: ROLE_USER, KEY_CONTENT: context.user_message})
520
+ return messages
521
+
522
+ def _get_assistant_message_with_tool_calls(
523
+ self, llm_response: LLMResponse
524
+ ) -> Dict[str, Any]:
525
+ """Get assistant message with tool calls."""
526
+ if not llm_response.tool_calls:
527
+ return {}
528
+ return {
529
+ KEY_ROLE: ROLE_ASSISTANT,
530
+ KEY_CONTENT: llm_response.choices[0],
531
+ KEY_TOOL_CALLS: [
532
+ {
533
+ KEY_ID: tool_call.id,
534
+ KEY_TYPE: tool_call.type,
535
+ KEY_FUNCTION: {
536
+ KEY_NAME: tool_call.tool_name,
537
+ KEY_ARGUMENTS: json.dumps(tool_call.tool_args),
538
+ },
539
+ }
540
+ for tool_call in llm_response.tool_calls
541
+ ],
542
+ }
543
+
544
+ def _get_tool_call_message(self, tool_response: AgentOutput) -> Dict[str, Any]:
545
+ """Get the tool call message."""
546
+ return {
547
+ KEY_ROLE: ROLE_TOOL,
548
+ KEY_TOOL_CALL_ID: tool_response.id,
549
+ KEY_CONTENT: tool_response.response_message,
550
+ }
551
+
552
+ # ============================================================================
553
+ # Tool Execution
554
+ # ============================================================================
555
+
556
+ async def _execute_mcp_tool(
557
+ self, tool_name: str, arguments: Dict[str, Any]
558
+ ) -> AgentToolResult:
559
+ """Execute a tool call via MCP servers."""
560
+ if tool_name not in self._tool_to_server_mapper:
561
+ return AgentToolResult(
562
+ tool_name=tool_name,
563
+ result=None,
564
+ is_error=True,
565
+ error_message=f"Tool `{tool_name}` not found in the server.",
566
+ )
567
+
568
+ server_id = self._tool_to_server_mapper[tool_name]
569
+ connection = self._server_connections[server_id]
570
+ try:
571
+ session = await connection.ensure_active_session()
572
+ result = await session.call_tool(tool_name, arguments)
573
+ return AgentToolResult.from_mcp_tool_result(tool_name, result)
574
+ except Exception as e:
575
+ return AgentToolResult(
576
+ tool_name=tool_name,
577
+ result=None,
578
+ is_error=True,
579
+ error_message=(
580
+ f"Failed to execute tool `{tool_name}` via MCP server `{server_id}`"
581
+ f" @ `{connection.server_url}`: {e!s}"
582
+ ),
583
+ )
584
+
585
+ async def _execute_tool_call(
586
+ self, tool_name: str, arguments: Dict[str, Any]
587
+ ) -> AgentToolResult:
588
+ """Execute a tool call.
589
+
590
+ This method first checks if the tool is a built-in tool. If it is, it executes
591
+ the built-in tool. If it is not, it executes the tool via MCP servers.
592
+
593
+ Args:
594
+ tool_name: The name of the tool to execute.
595
+ arguments: The arguments to pass to the tool.
596
+
597
+ Returns:
598
+ The result of the tool execution as an AgentToolResult object.
599
+ """
600
+ try:
601
+ for custom_tool in self._custom_tools:
602
+ if custom_tool.tool_name == tool_name:
603
+ result = custom_tool.tool_executor(arguments)
604
+ return await result if isawaitable(result) else result
605
+ except Exception as e:
606
+ return AgentToolResult(
607
+ tool_name=tool_name,
608
+ result=None,
609
+ is_error=True,
610
+ error_message=f"Failed to execute built-in tool `{tool_name}`: {e!s}",
611
+ )
612
+ return await self._execute_mcp_tool(tool_name, arguments)
613
+
614
+ def _generate_agent_error_output(
615
+ self,
616
+ tool_output: AgentToolResult,
617
+ agent_input: AgentInput,
618
+ tool_call: LLMToolCall,
619
+ ) -> AgentOutput:
620
+ """Generate an agent error output."""
621
+ structlogger.error(
622
+ "mcp_agent.send_message.tool_execution_error",
623
+ event_info=(
624
+ f"Tool `{tool_output.tool_name}` returned an error: "
625
+ f"{tool_output.error_message}"
626
+ ),
627
+ tool_name=tool_output.tool_name,
628
+ tool_args=json.dumps(tool_call.tool_args),
629
+ )
630
+ if tool_output.is_error:
631
+ return AgentOutput(
632
+ id=agent_input.id,
633
+ status=AgentStatus.FATAL_ERROR,
634
+ error_message=tool_output.error_message,
635
+ )
636
+ else:
637
+ return AgentOutput(
638
+ id=agent_input.id,
639
+ status=AgentStatus.RECOVERABLE_ERROR,
640
+ error_message=tool_output.error_message,
641
+ )
642
+
643
+ def _get_tool_results_for_agent_output(
644
+ self,
645
+ agent_input: AgentInput,
646
+ current_tool_results: Dict[str, AgentToolResult],
647
+ ) -> List[List[Dict[str, Any]]]:
648
+ """Get the tool results for the agent output."""
649
+ tool_results_of_current_iteration: List[Dict[str, Any]] = []
650
+ for tool_result in current_tool_results.values():
651
+ tool_results_of_current_iteration.append(
652
+ {"tool_name": tool_result.tool_name, "result": tool_result.result}
653
+ )
654
+
655
+ previous_tool_results: List[List[Dict[str, Any]]] = (
656
+ agent_input.metadata.get(AGENT_METADATA_TOOL_RESULTS_KEY, []) or []
657
+ )
658
+ previous_tool_results.append(tool_results_of_current_iteration)
659
+
660
+ return previous_tool_results
661
+
662
+ # ============================================================================
663
+ # Core Protocol Methods
664
+ # ============================================================================
665
+
666
+ @abstractmethod
667
+ async def send_message(self, agent_input: AgentInput) -> AgentOutput:
668
+ """Send a message to the agent."""
669
+ ...
670
+
671
+ async def run(self, input: AgentInput) -> AgentOutput:
672
+ """Send a message to Agent/server and return response."""
673
+ return await self.send_message(input)
674
+
675
+ # ============================================================================
676
+ # Message Processing
677
+ # ============================================================================
678
+
679
+ async def process_input(self, input: AgentInput) -> AgentInput:
680
+ """Pre-process the input before sending it to the agent."""
681
+ return input
682
+
683
+ async def process_output(self, output: AgentOutput) -> AgentOutput:
684
+ """Post-process the output before returning it to Rasa."""
685
+ return output