Rasa Pro Change Log
All notable changes to Rasa Pro will be documented in this page. This product adheres to Semantic Versioning starting with version 3.3 (initial version).
Rasa Pro consists of two deployable artifacts: Rasa Pro and Rasa Pro Services. You can read the change log for both artifacts below.
[3.18.0] - 2026-07-20
Rasa Pro 3.18.0 (2026-07-20)
Deprecations and Removals
-
Breaking change: Removed the deprecated
LanguageModelFeaturizerNLU component and its internal HuggingFace integration (rasa.nlu.utils.hugging_face). This removes Rasa's direct dependency on thetransformerslibrary, which was affected by CVE-2026-1839 (arbitrary code execution via a malicious checkpoint file).Assistants whose NLU pipeline references
LanguageModelFeaturizermust migrate to a supported featurizer (for exampleConveRTFeaturizer, or a CALM pipeline usingLLMCommandGenerator) before upgrading.transformersis no longer a first-party component dependency. It remains a transitive dependency ofglinerand is now constrained to>=5.0.0(which contains the fix) wherever it is installed — i.e. on thegliner-based extras (full,pii). The standalonetransformersextra and thesentencepiecedependency have also been removed.
Features
- Added a local (in-process) document retrieval backend for the Rasa copilot. The backend chunks documentation pages by heading, fixed-token sliding window, or whole-page strategy; embeds chunks using fastembed (ONNX); and stores vectors in a parquet artifact. At serving time the copilot ingests a prebuilt parquet artifact so no embedding runs on the query path. Vector and hybrid (vector + BM25) search modes are supported.
Improvements
-
Removed
copy.deepcopy()calls from fourprocessor.pydebug-log events (extract.slots,message.parse,actions.log,actions.policy_prediction), cutting unnecessary per-turn CPU overhead on the message-processing hot path. -
Breaking change — model retrain required: Vector stores now use native
faiss-cpu,qdrant-client, andpymilvusSDKs instead of LangChain wrappers. At release,MINIMUM_COMPATIBLE_VERSIONwill be bumped to3.18.0, so model tarballs trained on earlier Rasa versions are rejected at load time withUnsupportedModelVersionError. This is intentional: retrain is mandatory, not optional.Who is affected by the retrain requirement?
- In-model FAISS used by Enterprise Search, CALM flow retrieval (
FlowRetrieval), andIntentlessPolicy. Legacy LangChain-pickledindex.pklartifacts are detected and rejected (the pickle is never opened). New trains writestore.jsonalongsideindex.faiss. - Enterprise Search with FAISS: retrain the assistant and re-ingest documents after upgrade.
- CALM flow retrieval / IntentlessPolicy with FAISS: retrain the assistant after upgrade.
What is not affected?
- Remote Qdrant and Milvus collections — existing ingested vectors and endpoints configuration are unchanged; no re-ingestion required.
- YAML / endpoints configuration for built-in vector stores — no config migration.
- Custom
InformationRetrievalsubclasses that do not depend on LangChain types — continue to work; update constructors to accept a RasaEmbeddingClient(embed/aembed) instead of LangChain-styleembed_query/embed_documentsmethod names.
Migration steps (summary):
- Upgrade Rasa Pro to 3.18.0.
- Re-ingest knowledge-base documents if you use FAISS Enterprise Search.
- Run
rasa trainto produce a new model tarball (nativestore.jsonformat). - Deploy the retrained model.
- In-model FAISS used by Enterprise Search, CALM flow retrieval (
Bugfixes
-
Fixed an issue where custom actions executed directly by a long-running Rasa server retained stale state after action files were modified or deleted. Previously, changes to custom action code were not picked up until the server was restarted. The direct custom action executor now properly clears cached modules, re-imports updated code from disk, and removes orphaned actions that no longer exist.
-
rasa test e2e --coverage-reportandrasa llm finetune prepare-datanow write one YAML per original source file (mirroring the input folder structure) instead of a single flat YAML. This fixes silent fixture corruption — and, since PR #5461, a hardDuplicateFixtureExceptionon reload — when the same fixture name is defined differently across source files (ENG-2647).Breaking Change: The
--e2e-failed-testsflag now takes a directory instead of a file path; failed tests are written into a timestamped subdirectory under it. -
Upgrade
langsmithdependency to 0.8.5 andstarletteto 1.0.1 to address CVE-2026-45134 and CVE-2026-48710. -
Fixed a leaked privacy-manager background scheduler thread that kept
rasa test e2e(and the finetuning and dialogue-understanding test commands) from exiting cleanly.The privacy manager's background thread is now stopped on every path that retires an agent — the test CLI commands, server model reload/unload, and builder agent swaps — instead of only on server shutdown.
-
Bumped
langchain-classic(~1.0.7, fixes CVE-2026-45134) andstarlette(~1.3.1, fixes CVE-2026-54283) to resolve high-severity dependency security vulnerabilities. Also raised thelangchain-corefloor to~1.3.3, which is required bylangchain-classic 1.0.7. -
Hardened deserialization and webhook parsing across the agent runtime so missing or malformed fields no longer crash production with
KeyErroror similar failures.Tracker and dialogue stack:
from_dictmethods for pattern stack frames, flow stack frames, chit-chat/search frames, and slots now use.get()with safe defaults for fields added after initial release, so older serialized tracker data loads cleanly after upgrades. Event deserialization skips individual malformed events with a warning instead of failing the entire tracker load.LLM and command processing: LLM tool-call parsing, command JSON deserialization, and the command processor tolerate missing optional fields and skip invalid entries rather than raising. Flow retrieval no longer assumes document metadata is always present.
Flows and model loading: Flow step and link
from_jsondeserializers validate required keys up front. Model metadata, graph schema, and local model fingerprint loading handle missing fields with clear errors or safe defaults instead of bare dict access.Channels and voice: Slack, Facebook Messenger, VIER CVG, Deepgram (V1), and AudioCodes webhook handlers validate incoming payloads defensively—returning HTTP 400 for invalid interactive Slack messages (including missing
user.id), logging and skipping malformed Facebook/Audiocodes events, and raising clear errors for malformed VIER CVG recipient IDs without leaking credential blobs in logs.Flow execution: MCP tool step input/output mapping uses safe dict access when mapping fields are absent.
-
Removed the unsupported
eager_eot_thresholdoption from the Deepgram Flux (flux-*) ASR config. -
Upgrade:
ujsonto version5.13.0to address CVE-2026-54911cryptographyto version48.0.1to address GHSA-537c-gmf6-5ccfmsgpackto version1.2.1to address GHSA-6v7p-g79w-8964pydantic-settingsto version2.14.2to address GHSA-4xgf-cpjx-pc3jaiohttpto version3.14.1to address CVE-2026-34993, CVE-2026-47265, CVE-2026-54273,CVE-2026-54274, CVE-2026-54276, CVE-2026-54277 & CVE-2026-54278
-
Fixed
rasa test e2efailing on user steps with metadata when tracker events included extra runtime-injected keys (e.g. model_name, default_language). -
Fixed end-to-end testing incorrectly loading
eval/conftest.yml(simulation/evaluation config) when resolving E2Econftest.ymlfiles, which could cause e2e test CLI to fail schema validation in projects that also define simulation / eval configuration. E2E conftest discovery now only checks each ancestor directory directly (not nested paths) and ignore<project>/eval/conftest.ymlfile path at the assistant project root (detected viaconfig.yml,domain.yml,domain/orconfig/), so nestedeval/conftest.ymlfiles remain valid. Also fixed conftest path lookup hanging indefinitely when no assistant project root was found, which causedrasa test e2eCLI tests to time out. -
Fixed the
--credentialsargument to default tocredentials.ymlinstead ofNone, ensuring consistent behavior with other default configuration paths likeendpoints.ymlandconfig.yml. Updated the--domainhelp message to clarify that it defaults todomain.ymlordomain/directory when not specified (this was always the runtime behavior due to validation fallback logic, but the help text was misleading). -
Fixed
rasa run actionscrashing at Sanic startup withConstructorError: could not determine a constructor for the tag '!env_var'whenendpoints.ymlcontained an unquoted${ENV_VAR}reference. -
Fixed empty Input/Output on command-generator LLM spans in Langfuse tracing: Rasa now forces LiteLLM to emit its own request span when Langfuse is configured (LiteLLM 1.87.0 otherwise skips it under a parent span), and exports the prompt and completion text for self-hosted text-completions calls.
-
Security patch — upgrade strongly recommended: Rasa Pro 3.18.0 removes the LangChain dependency cluster, which pulled in
langsmithwith a known security vulnerability (arbitrary local file read viaTracingMiddleware)
Miscellaneous internal changes
Miscellaneous internal changes.
[3.17.2] - 2026-07-13
Rasa Pro 3.17.2 (2026-07-13)
Bugfixes
- Fixed end-to-end testing incorrectly loading
eval/conftest.yml(simulation/evaluation config) when resolving E2Econftest.ymlfiles, which could cause e2e test CLI to fail schema validation in projects that also define simulation / eval configuration. E2E conftest discovery now only checks each ancestor directory directly (not nested paths) and ignore<project>/eval/conftest.ymlfile path at the assistant project root (detected viaconfig.yml,domain.yml,domain/orconfig/), so nestedeval/conftest.ymlfiles remain valid. Also fixed conftest path lookup hanging indefinitely when no assistant project root was found, which causedrasa test e2eCLI tests to time out. - Restored the
boto3dependency range to>=1.40.60,<1.43on the3.17.xline, matching3.16.15. This range had been widened onmainand3.16.xbut was never backported to3.17.x, which blocked upgrades for users needing newerboto3versions (e.g. for AWS Bedrock).
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.31] - 2026-07-15
Rasa Pro 3.15.31 (2026-07-15)
Bugfixes
- Fixed the
--credentialsargument to default tocredentials.ymlinstead ofNone, ensuring consistent behavior with other default configuration paths likeendpoints.ymlandconfig.yml. Updated the--domainhelp message to clarify that it defaults todomain.ymlordomain/directory when not specified (this was always the runtime behavior due to validation fallback logic, but the help text was misleading).
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.30] - 2026-07-07
Rasa Pro 3.15.30 (2026-07-07)
Deprecations and Removals
-
Breaking change: Removed the deprecated
LanguageModelFeaturizerNLU component and its internal HuggingFace integration (rasa.nlu.utils.hugging_face). This removes Rasa's direct dependency on thetransformerslibrary, which was affected by CVE-2026-1839 (arbitrary code execution via a malicious checkpoint file).Assistants whose NLU pipeline references
LanguageModelFeaturizermust migrate to a supported featurizer (for exampleConveRTFeaturizer, or a CALM pipeline usingLLMCommandGenerator) before upgrading.transformersis no longer a first-party component dependency. It remains a transitive dependency ofglinerand is now constrained to>=5.0.0(which contains the fix) wherever it is installed — i.e. on thegliner-based extras (full,pii). The standalonetransformersextra and thesentencepiecedependency have also been removed.
[3.17.1] - 2026-07-07
Rasa Pro 3.17.1 (2026-07-07)
Deprecations and Removals
-
Breaking change: Removed the deprecated
LanguageModelFeaturizerNLU component and its internal HuggingFace integration (rasa.nlu.utils.hugging_face). This removes Rasa's direct dependency on thetransformerslibrary, which was affected by CVE-2026-1839 (arbitrary code execution via a malicious checkpoint file).Assistants whose NLU pipeline references
LanguageModelFeaturizermust migrate to a supported featurizer (for exampleConveRTFeaturizer, or a CALM pipeline usingLLMCommandGenerator) before upgrading.transformersis no longer a first-party component dependency. It remains a transitive dependency ofglinerand is now constrained to>=5.0.0(which contains the fix) wherever it is installed — i.e. on thegliner-based extras (full,pii). The standalonetransformersextra and thesentencepiecedependency have also been removed.
Bugfixes
-
Hardened deserialization and webhook parsing across the agent runtime so missing or malformed fields no longer crash production with
KeyErroror similar failures.Tracker and dialogue stack:
from_dictmethods for pattern stack frames, flow stack frames, chit-chat/search frames, and slots now use.get()with safe defaults for fields added after initial release, so older serialized tracker data loads cleanly after upgrades. Event deserialization skips individual malformed events with a warning instead of failing the entire tracker load.LLM and command processing: LLM tool-call parsing, command JSON deserialization, and the command processor tolerate missing optional fields and skip invalid entries rather than raising. Flow retrieval no longer assumes document metadata is always present.
Flows and model loading: Flow step and link
from_jsondeserializers validate required keys up front. Model metadata, graph schema, and local model fingerprint loading handle missing fields with clear errors or safe defaults instead of bare dict access.Channels and voice: Slack, Facebook Messenger, VIER CVG, Deepgram (V1), and AudioCodes webhook handlers validate incoming payloads defensively—returning HTTP 400 for invalid interactive Slack messages (including missing
user.id), logging and skipping malformed Facebook/Audiocodes events, and raising clear errors for malformed VIER CVG recipient IDs without leaking credential blobs in logs.Flow execution: MCP tool step input/output mapping uses safe dict access when mapping fields are absent.
-
Fixed
action_session_startbeing incorrectly rejected on legacy trackers that lack aConversationInactiveevent. The session-start guard was treating a time-expired session as already active, leaving the first message after a long inactivity period stranded inpattern_code_changeinstead of starting a fresh session. -
Removed the unsupported
eager_eot_thresholdoption from the Deepgram Flux (flux-*) ASR config. -
Upgrade:
ujsonto version5.13.0to address CVE-2026-54911cryptographyto version48.0.1to address GHSA-537c-gmf6-5ccfmsgpackto version1.2.1to address GHSA-6v7p-g79w-8964pydantic-settingsto version2.14.2to address GHSA-4xgf-cpjx-pc3jaiohttpto version3.14.1to address CVE-2026-34993, CVE-2026-47265, CVE-2026-54273,CVE-2026-54274, CVE-2026-54276, CVE-2026-54277 & CVE-2026-54278
-
Fixed
rasa test e2efailing on user steps with metadata when tracker events included extra runtime-injected keys (e.g. model_name, default_language).
Miscellaneous internal changes
Miscellaneous internal changes.
[3.17.0] - 2026-06-23
Rasa Pro 3.17.0 (2026-06-23)
Features
-
Rasa now integrates with Langfuse for LLM observability. Key execution hot-paths — message processing, command generation, agent calls, and MCP tool calls — are instrumented with
@observespans that nest into a single trace per user turn, including bot responses as trace output and per-turn metadata (sender ID, model ID, assistant ID). -
Custom actions can now stream both text responses token-by-token, and rich responses to the end user in real time.
Action authors initiate the streaming by calling
await dispatcher.stream_start(), then callawait dispatcher.stream_chunk(text=token)for each partial token andawait dispatcher.stream_end()when the response is complete. Rich content (buttons, images, custom JSON) can be streamed mid-response withawait dispatcher.stream_chunk(buttons=[...]). On non-streaming transports,stream_end()automatically replays the accumulated chunks as normalutter_message()calls, so actions remain compatible with every channel without code changes.Streaming is supported over both the gRPC action server transport and the direct custom action executor (in-process).
-
Add a new capabilities API endpoint
GET /conversations/<conversation_id>/capabilitiesand a new built-in capabilities default actionaction_default_capabilitiesto enable dynamic "what can you do?" responses without hard-coded flow lists.The new endpoint:
GET /conversations/<conversation_id>/capabilitiesreturns structured, conversation-aware capabilities metadata for flows (including startability based on current guard evaluation), so custom actions and external integrations can build dynamic "what can you do?" responses without hard-coded flow lists.The new default action:
action_default_capabilitiesgenerates a user-facing capabilities reply directly in Rasa by listing currently startable flows for the active conversation, providing an out-of-the-box implementation for capability discovery. In order to use this action, add it to the user flow handling capabilities user questions, for example:flows:
respond_with_capabilities:
description: Respond to user questions about what the agent can assist with.
steps:
- action: action_default_capabilities -
When an ReAct/A2A agent call or MCP tool call fails, the internal-error pattern frame now receives structured context in its
infofield instead of only default values with an emptyinfodict.Call sites populate
infoso you can branch inpattern_internal_error(for example in flow predicates or responses) by failure kind and source. Supported keys includeerror_source(agentormcp_tool),agent_name,tool_name,mcp_server, anderror_message, plus related agent metadata where applicable (such as flow id from the failing step).For example, override the default pattern flow and branch on
context.info.error_source:pattern_internal_error:
steps:
- noop: true
next:
- if: context.info.error_source is "mcp_tool"
then:
- action: utter_mcp_tool_failed
next: END
- if: context.info.error_source is "agent"
then:
- action: utter_agent_call_failed
next: END
- else:
- action: utter_internal_error_rasa
next: END -
When a user interrupts the assistant (voice barge-in) while a custom action is streaming chunks, Rasa Pro now gracefully cancels the stream instead of continuing to deliver audio and accumulate events.
What happens on interruption:
- Rasa Pro signals the action server to stop streaming by sending an
AckStreamChunksRPC call (gRPC transport) or setting a cancellation flag (direct executor). The action author can react by catching the cancellation insidecancel_stream()on theCollectingDispatcher. - All chunks that were already dispatched before the interruption are saved to the tracker store as
BotUtteredevents (tagged withstreamed_chunk: trueso they are not re-delivered to the output channel). - The Deepgram TTS WebSocket session is cleanly closed — including the case where the
chunk_endevent arrives while already in drain mode — preventing aRuntimeError: Concurrent call to receive() is not allowederror on the next bot utterance. - Any events returned by the action in its
final_result(e.g. slot sets) are still applied, so the dialogue state remains consistent even when the response was cut short.
This behaviour applies to both the gRPC action server transport and the direct custom action executor (in-process).
- Rasa Pro signals the action server to stop streaming by sending an
-
Added
evaluate_agentMCP tool for automated agent evaluation: simulate multi-turn conversations with an LLM-based user, run deterministic assertions (including a new sequencing assertion type), score quality with LLM-as-a-judge using customisable prompt templates, and store per-run results. Evaluation is configured viaeval/conftest.yml, scenarios are defined as YAML files ineval/scenarios/and results are stored ineval/results/<experiment_id>/.Added a
validate_scenarioMCP tool for pre-run YAML validation of scenario structure, assertion schema, slot existence, and slot value type compatibility. -
Added
UserBargeIntracker events for voice conversations, so barge-ins are preserved in the conversation history. -
Added barge-in support for the AudioCodes voice-stream channel by sending AudioCodes speech start and stop events when Rasa detects an interruption.
-
Add support for the SignalWire channel for Voice. External URL script can be used for setting up the SignalWire connection. The script can be found on 'host_url/webhooks/signalwire/webhook'.
-
Added
OutputDeliveryResultfor output channels to return delivery signals (events and failure status) fromsend_response. Voice channels now emit aTTSFinishedtracker event containing TTS latency metadata (tts_time_to_first_byte_ms,tts_total_time_ms). ABotTurnEndedtracker event carrying command-processor and prediction-loop execution times is recorded at the end of each bot turn. -
Add support for Vonage channel for voice streaming. When setting up the Vonage application use 'host_url/webhooks/vonage/webhook' as answer url and 'host_url/webhooks/vonage/call_status' as event url.
-
Rasa assistants can now act as A2A sub-agents: with an
a2a_serverblock inendpoints.yml,rasa runexposes the Agent2Agent protocol on the same Sanic port as REST and channel webhooks. Orchestrators discover capabilities viaAgentCard, send turns over JSON-RPC, and receive A2A task lifecycle updates mapped from Rasa's dialogue state.Enable and configure
Add
a2a_servertoendpoints.yml. Onlydescriptionis required; other fields have sensible defaults.a2a_server:
url: "http://localhost:5005" # optional; inferred from --port / --interface / SSL
description: "My banking sub-agent"
include_conversation_repair: true # false → terminal completed instead of repair input_required
task_timeout_seconds: 600 # per-task safety net; 0 disables
a2a_message_cache_ttl_seconds: 600 # messageId replay TTL; defaults to task timeout
max_contexts: 1000 # in-memory session cap; 0 disables
# agent_card_path: ./static-card.json # optional static AgentCard; url still resolved at startup
# auth: … # JWT bearerWhen
agent_card_pathis omitted, the public AgentCard is auto-generated from user-facing flows at server startup (after the model loads); the advertised URL is resolved fromurlor from--port/--interface/ SSL flags.TLS
A2A uses the same port as the rest of the Rasa server. Configure HTTPS with the usual
rasa runflags — not undera2a_serverinendpoints.yml.Rasa serves HTTPS directly — clients connect to Rasa over TLS using your certificate and key (the same cert covers REST, channels, and A2A):
rasa run --ssl-certificate /certs/server.pem --ssl-keyfile /certs/server-key.pemWhen
urlis omitted, the AgentCard URL scheme follows--ssl-certificate. Set an expliciturl: "https://..."when the public hostname or port differs from the local bind address.HTTPS handled by a reverse proxy or ingress — set
urlto the public base URL orchestrators use. Rasa can listen on plain HTTP behind the proxy while the AgentCard advertises HTTPS:a2a_server:
description: "My banking sub-agent"
url: "https://public.example.com"Startup guardrails (fail fast with actionable errors):
domain.session_config.start_session_after_expirymust befalsewhen A2A is enabled — resumed orchestratorcontextIdvalues reuse the same Rasasender_id; auto session restart would silently reset slots.SANIC_WORKERS=1is required until Redis-backed A2A task/message stores ship — multiple workers breakmessageIdidempotency, in-flight HTTP 409, orchestrator cancel, andmax_contexts. Scale with additional replicas and ingress session affinity instead.
Session config is validated when a model is loaded with
a2a_serverinendpoints.yml(e.g.rasa runviaload_agent). The worker-count check runs only when starting the Sanic server (rasa run).HTTP surface
Route Purpose POST /A2A JSON-RPC ( message/send,message/stream,tasks/cancel,tasks/get, …)GET /.well-known/agent-card.jsonPublic AgentCard(flow-generated at startup, or static file fromagent_card_path)GET /.well-known/agent.jsonDeprecated alias of the AgentCard contextIdin A2A requests maps to Rasasender_id. Each orchestrator message gets a newtask_id;input_requiredkeeps the context reserved for follow-up turns on the samecontextId.Task states and structured status
Rasa maps dialogue stack and tracker state to A2A task states (
working,input_required,completed,failed,canceled,rejected,auth_required). Terminal and interactive-terminal updates include aDataPartwithstate,active_flow, currentslots, and (when applicable) persisted slot values from flows that declarepersisted_slots. ATextPartcarries the user-visible bot utterance when present so clients reading onlystatus.messagestill see NLG.message/streamemitsworkingstatus and artifact deltas during token/chunk streaming custom actions; blockingmessage/sendreturns the final task.Orchestrator operations
tasks/cancel— idle cancel on aninput_requiredcontext, or signal in-flight work; publishescanceledand recordsFlowCancelledwhen a user flow was active.messageIddeduplication — retries with the same(contextId, messageId)replay the cached terminal task without re-running the turn; a concurrent duplicate while in flight returns HTTP 409 with a JSON-RPC error (retry after the first completes).- Session inactivity —
ConversationInactivedoes not release aninput_requiredA2A context; the next message on the samecontextIdcontinues the flow whenstart_session_after_expiry: false(the required A2A setting).
-
Added support for Deepgram Flux (
flux-*) models in thedeepgramASR engine. Flux uses Deepgram's/v2/listenendpoint with model-integrated end-of-turn detection, replacing silence-timer-based endpointing with lower-latency EOT signals.Configure by setting
model: flux-general-en(orflux-general-multi) insidelanguage_map. Three optional fields tune EOT behaviour:eot_threshold,eager_eot_threshold, andeot_timeout_ms. Existing Nova (nova-*) configurations are unchanged. -
Added the
chirpvoice stream channel for Bluejay CHIRP websocket integrations with raw PCM audio frames, optional speech events, Basic authentication, interruption signalling, and L16 24 kHz internal audio support. -
Outbound MCP and A2A calls can now fetch and decrypt credentials only at call time via customer hooks. Hooks return an
OutboundCallResultwhosemetadataRasa merges into the outbound wire (MCP_metaor A2AMessage.metadata). Credentials are never written to slots, the tracker, Kafka, or the inspector — customers store ciphertext in their own secret store keyed bysender_id; Rasa reads via the hook when the call is made.Configure hooks
Flow direct MCP and ReAct external MCP tools — one hook per MCP server in
endpoints.yml(flows reference the server by name only; there is nopre_call_hookon flow steps):mcp_servers:
- name: banking_api
url: http://banking:8000/mcp/
type: http
pre_call_hook: my_auth.credentials.resolve_banking_meta
meta_map:
static:
api_version: "v2"Static
meta_mapvalues are merged first; hookmetadatais applied on top (hook wins on key collision).ReAct custom tools — override
build_custom_tool_call_metadata()on anMCPBaseAgentsubclass (default is a no-op).A2A outbound — dotted import path in the agent
config.yml; stockA2AAgentworks without a subclass:configuration:
agent_card: https://payments.example.com/.well-known/agent-card.json
pre_call_hook: my_auth.credentials.resolve_a2a_metaWhen no hook is configured for a call path, Rasa does not fetch or decrypt credentials and existing behaviour is unchanged.
Hook contract
New package:
rasa.shared.agents.outbound_call_hook.Surface Context type Return type Flow MCP, ReAct MCP MCPOutboundCallContextOutboundCallResultReAct custom tools MCPOutboundCallContextOutboundCallResultA2A outbound A2AOutboundCallContextOutboundCallResultHooks are
async defand receive a frozen, read-only context (sender_idis the secret-store lookup key). Rasa also accepts a plaindictreturn value and normalizes it toOutboundCallResult. Secrets go to metadata only — not toolmapping.input,Message.parts, or top-level A2Acontext_id/task_id.Fail-closed runtime
Hook exception or invalid return aborts the outbound call: flow MCP routes to
pattern_internal_error; ReAct agents return an error result without calling the remote endpoint. Rasa logs metadata key names only, never values.Validation
rasa train/ bot validation fails withvalidation.pre_call_hook.unresolvedwhen a configuredpre_call_hookimport path cannot be resolved. Agent validation applies the same check for A2Aconfiguration.pre_call_hook. -
Added optional AWS Marketplace license validation at
rasa runstartup for container deployments sold through AWS Marketplace. WhenRASA_AWS_MARKETPLACE_ENABLED=true, Rasa performs a PROVISIONALCheckoutLicensecall via AWS License Manager before channels or the Sanic server start; validation failure exits the process so the pod never serves traffic.Set
RASA_AWS_MARKETPLACE_PRODUCT_IDto the Product ID from the AWS Marketplace Management Portal. The deployment must have IAM credentials that can call License Manager (for example via IRSA on EKS) and an active Marketplace subscription that includes theAWS::Marketplace::Usageentitlement. When the feature is disabled (the default), startup behaviour is unchanged.Structured logs record
license.marketplace.checkout.verifiedon success andlicense.marketplace.checkout.failedon failure, without logging client or consumption tokens.
Improvements
-
A2A agent validation now requires
TICKET_LOCK_LIFETIMEto be at least as long asmax_polling_time, preventing the conversation lock from expiring while A2A polling is still in progress. -
Replaced the generic "Start the server from your IDE" message after
rasa tools initwith IDE-specific instructions for Claude Code, Cursor, VS Code, and JetBrains. -
Added
rasa tools statuscommand that displays current project configuration and runtime readiness. -
Propagate the assistant's default language to event metadata under "default_language".
-
LLM latency metrics (time-to-first-token and total duration) are now captured and surfaced in
BotUtteredmetadata for the contextual response rephraser and MCP agent. -
Added asynchronous A2A push notification handling for long-running agent tasks. Rasa now persists task status updates on the conversation tracker, can proactively flush pending agent updates through channels that own a live connection, and falls back to delivering the pending update before the next user message when immediate delivery is not available.
-
Added
ConcurrentKafkaEventBroker, a non-blocking Kafka event broker that offloads publishing to a background thread pool so the event loop is never blocked by Kafka I/O or retry sleeps. Configure it withtype: concurrent_kafkainendpoints.yml. It accepts all config options ofKafkaEventBrokerplusexecutor_max_workers(default: 1). -
The callback channel supports opt-in streaming responses with
stream=trueby sending discrete callback events for stream start, text deltas, and stream end. -
Added HTTP push notifications to the A2A server. When an orchestrator supplies a
pushNotificationConfig.urlonmessage/send,message/stream, or viatasks/pushNotificationConfig/set, Rasa POSTs task state updates to that callback as the task progresses.message/streamemits intermediate states (submitted,working) as well as the terminal state. The publicAgentCardadvertises thepush_notificationscapability when the feature is enabled.Push notifications are disabled by default (
push_notifications_enabled: false) because callback URLs are client-controlled and can be an SSRF vector when the A2A endpoint is reachable by untrusted callers. When enabled, callback URLs are validated on registration and before each POST: onlyhttp/httpsURLs with a hostname are accepted; loopback, link-local, and private-network targets are rejected (including hostnames that resolve to those addresses via DNS); URLs with embedded credentials are rejected. HTTP redirects are not followed, so a registered public callback cannot redirect into an internal target. Outbound push POSTs use an explicit httpx timeout (5s connect, 30s overall). Callback hostname DNS checks in the URL policy are bounded by a 5s application timeout. Operators may optionally restrict callbacks further withpush_notification_allowed_hosts(exact hostname or subdomain match). Rejected URLs surface asInvalidParamsErroron the JSON-RPC methods that register them.DNS validation at registration and before each POST does not pin the resolved IP for the outbound connection; httpx performs a separate lookup at connect time (DNS rebinding TOCTOU). Recommended deployment controls: keep the feature disabled unless required, use
push_notification_allowed_hosts, prefer HTTPS callbacks, and treat callback registration as a trusted orchestrator action.Also added an override on
RasaA2ARequestHandlerto POST the terminalcanceledtask when a callback URL is registered. The reason for this is that the a2a-sdk suppliedon_cancel_taskdoes not send push notifications. -
The A2A sub-agent server now supports optional bearer JWT authentication for orchestrators calling Rasa over the A2A protocol. When
a2a_server.authis set inendpoints.yml, every protected request must includeAuthorization: Bearer <jwt>; missing or invalid tokens receive HTTP 401 with aWWW-Authenticate: Bearerresponse header before message processing starts. This applies to the JSON-RPC endpoint (POST /) and AgentCard discovery (GET /.well-known/agent-card.json, including the deprecated alias). Ifauthis omitted, behaviour is unchanged and no token is required.Configure auth under the existing
a2a_serverblock inendpoints.yml. Onlytype: beareris supported (API key auth is not available). Use asymmetric verification in production (RS256+public_key_pathto your IdP's PEM public key) or symmetric verification for local/dev setups (HS256/HS512+secretreferenced as an environment variable, e.g.'${JWT_SECRET}'— plaintext secrets are rejected at startup). Optionally setissuerand/oraudienceto enforce JWT claims.Example (production-style):
a2a_server:
description: "My domain agent"
auth:
type: bearer
jwt:
algorithm: RS256
public_key_path: "/run/secrets/jwt_public_key.pem"
issuer: "https://auth.example.com"
audience: "rasa-a2a-agent"Orchestrators and local test clients must send the same bearer token when fetching the AgentCard and when calling
message/send,message/stream, or other A2A JSON-RPC methods. Auth validates the orchestrator only; end-user identity still belongs in A2A message metadata / slot pre-population, not in this JWT. -
Added
configure_litellm_for_rasa()in a lightweight_litellm_configmodule to centralize LiteLLM setup: it suppresses print-based provider-list debug footers vialitellm.suppress_debug_infoand sets the LiteLLM logger to WARNING, reducing log noise during LLM, embedding, and router client initialization without pulling in AWS provider dependencies. -
Added orchestrator slot pre-seeding on the inbound A2A server path. On every
message/send/message/streamturn, Rasa reads slot context from the incoming A2AMessage, applies it asSetSlotCommands before dialogue processing, and strips slot markers from the user text so they are not passed to the LLM.Orchestrators can supply slots in any of these shapes (later sources override earlier ones on key conflicts within the payload):
- Text transcript — append to the text part:
SLOTS: {"slot_name": "value", ...}on its own line, or- a trailing fenced block:
```json\n{"slot_name": "value"}\n```
message.metadata—{"slots": {"slot_name": "value", ...}}(merged with JSON-RPC request metadata).DataPart—{"kind": "data", "data": {"slots": {"slot_name": "value", ...}}}(highest precedence).
Only slots defined in the assistant domain are written; unknown, builtin, and agent-internal slots are ignored. Values are coerced to the slot type; invalid or out-of-range values (e.g. categorical mismatches) are skipped. String values
"none","null", and"undefined"are stored asnull.Per-turn precedence: if command generation extracts a
SetSlotCommandfor a slot from the current user message, that value wins over orchestrator metadata for the same slot on that turn (stale snapshots are ignored). Orchestrator values still pre-fill slots the parser did not set.Send an orchestrator slot snapshot on each follow-up message for slots the user did not answer in that turn. Do not rely on user-visible text alone to carry slot values when a collect step is active — prefer
metadata.slotsor aDataPart, or keep slot JSON out of text the user is answering with. - Text transcript — append to the text part:
-
Added streaming response support to the SocketIO channel with three new Socket.IO events (
stream_start,stream_chunk,stream_end) for real-time token-by-token message delivery from LLM-powered responses. This does not change the behaviour of existing events likebot_uttered, they continue to be sent as before.
Bugfixes
-
Fixed MCP task agents exposing
set_slot_*tools and listing slots in the task prompt for controlled-only or NLU-only slots inexit_if. Added aslot_mappings_allow_llm_fillhelper so tool exposure, prompt rendering, andshould_slot_be_setuse the same rule for whether the LLM may fill a slot from its mappings. -
Clarified the Copilot system prompt so it explicitly states that users cannot access runtime assistant logs and the Copilot must not ask them to provide those logs.
-
Fix training time regression caused by eager component imports.
Training time increased by ~30-35% (from ~16s to ~22s locally, ~49s to ~68s in CI) after the Beta Agentic PR merge. This was caused by conditional imports of components with external dependencies (TensorFlow, spacy, mitie, etc.) being executed eagerly at module load time during training initialization.
The fix makes these imports truly lazy by deferring them until the component list is first accessed, eliminating the import overhead and restoring training performance to pre-agentic levels.
-
Fix bug when user's message during bot's speech is queued after bot is done speaking. When interruptions are DISABLED, if the bot is speaking and the user talks over it, the bot should ignore that speech entirely. When interruptions are ENABLED, the bot should only stop and listen if the user says enough words to qualify as an interruption (based on the min_words setting).
-
Fixed crash when running
rasa teston projects containing flows withcall:steps that reference agents.The
rasa testcommand now correctly initializes the agent registry by callingConfiguration.initialise_sub_agents(), aligning its behavior with other CLI commands (rasa train,rasa shell,rasa e2e test,rasa inspect,rasa data). -
Fixed
_no_op_observefallback decorator (used when langfuse is not installed) incorrectly wrappingasyncfunctions in a sync wrapper, causing coroutines decorated with@observeto never be awaited.Renamed the internal
rasa.builder.telemetry.langfusepackage torasa.builder.telemetry.langfuse_integrationto avoid shadowing the third-partylangfusepackage. -
When interruptions are ENABLED, user message should be queued for processing only if it passes interruption criteria.
If interruptions are disabled, user message should be queued only if user speaks during collect step utterance.
Updated signature of following methods:
- send_start_marker:
send_start_marker(self, recipient_id: str)=>send_start_marker(self, marker_input: MarkerInput) - send_intermediate_marker:
send_intermediate_marker(self, recipient_id: str)=>send_intermediate_marker(self, marker_input: MarkerInput) - send_end_marker:
send_end_marker(self, recipient_id: str)=>send_end_marker(self, marker_input: MarkerInput) - send_marker_message:
send_marker_message(self, recipient_id: str)=>send_marker_message(self, marker_input: MarkerInput) - create_marker_message: create_marker_message(self, recipient_id: str) =>
create_marker_message(self, marker_input: MarkerInput) -> MarkerMessageOutput
where MarkerInput is a Pydantic-based class:
class MarkerInput(BaseModel):
recipient_id: str
marker_type: MarkerType
step_type: Optional[StepType] = None - send_start_marker:
-
Remove the "hand over" command from the default GPT-5.1 prompt template. The command had already been removed from all other prompt templates in the 3.16.0 release.
-
Fixed a bug where sub-agent flows would end immediately after interruption resumption instead of re-invoking the agent.
When a flow containing a sub-agent call was interrupted (e.g., by a user digression) and then resumed via
pattern_continue_interrupted, the agent frame's state remainedINTERRUPTED. This caused the flow executor to skip the agent call and advance to END, triggeringpattern_completedprematurely.The agent frame state is now correctly reset to
WAITING_FOR_INPUTduring flow resumption, ensuring the sub-agent is re-invoked with full conversation history as expected. -
Fixed MCP tracing attribute extraction for router-based model groups so tracing no longer crashes with
KeyError('provider')when instrumenting ReAct sub-agentsend_messagecalls. -
When interruptions are enabled and bot is not speaking, user utterances should not be checked if they are passing min_words threshold.
-
Dialogue Understanding Tests (DUT) now skip rephrase endpoint validation.
Previously, running DUT would fail with a validation error when the domain contained responses with
metadata.rephrase: trueas the rephraser is intentionally disabled in DUT. -
Fixed an issue in voice bots where a custom
silence_timeoutdefined on acollectstep was reset to the global default after validation failure, causing the re-prompt to use the wrong timeout value. -
Fix an interrupted sub-agent not being properly resumed after the user answers "Yes" to
pattern_continue_interrupted. This is fixed by introducing a transientRESUMINGagent state that sits betweenINTERRUPTEDandWAITING_FOR_INPUT:resume_flow()now sets the agent frame toRESUMINGinstead of directly toWAITING_FOR_INPUT;run_agent()detects this and re-invokes the agent withresumed_after_interruption=True. -
Voice stream channels no longer narrate image URLs or attachment strings aloud via TTS. Responses containing an
image:orattachment:field are silently dropped on voice channels and a warning is logged instead. -
Fixed
utter_corrected_previous_inputtemplate to explicitly pair each slot name with its corrected value, preventing LLM rephrasers from swapping the associations when multiple slots are corrected at once. -
Fixed
rasa data validateincorrectly rejectingcallsteps that target subagents or MCP tools when no agent configuration is loaded, instead of emitting a warning. -
Fixed
suppress_logsso that concurrent async calls no longer corrupt the process-wide log level, preventing logs from disappearing permanently until pod restart. -
Fixed a spurious "Fatal error on SSL transport" traceback printed to stderr on Windows after
rasa test e2ecompletes by explicitly closing litellm's shared httpx sessions before the event loop shuts down. -
DTMF input collected by the voice channel now bypasses the LLM command generator. The channel injects a
SetSlotCommanddirectly so the target slot can be declared with acontrolledmapping instead offrom_llm, avoiding an unnecessary LLM round-trip for digit input. -
Fixed
rasa data validatedefaulting--endpointstoNoneinstead ofendpoints.yml, which caused the validator to run with empty endpoints and produce false errors fornlg.type: rephrasesetups (ENG-2725). -
Fixed four bugs: fixture dedup in
TestSuite.as_writable()now scopes per file (ENG-2647);ask_before_fillingslots can be filled whenValidateSlotPatternFlowStackFrameis on the stack (PF-992). Inspector active-flow tile no longer blanks duringpattern_user_silence(SWI-1151); Inspector voice latency headline now includes ASR latency and breakdown rows are in chronological order (VO-555). -
Fix the pacing issue in SignalWire channel - when there was a long bot utterance, SignalWire would speed trough generated audio. Fix user barge-in for SignalWire channel.
-
Fixed a performance regression in
SQLTrackerStore.retrieve()introduced in v3.16, where every retrieve loaded the full conversation history before replay-safe session slicing. Retrieve now fetches a minimum event prefix by trying the most recent session boundaries first (up to three). When reconstruction fails with a dialogue-stack patch error, the store retries from the last stack event in that prefix whose patch applies to an empty stack. If all 3 attempts fail, the store falls back to loading the full conversation history as before. This greatly reduces database I/O and memory use for long-lived conversations while preserving replay-safe behaviour. -
Fixed a crash in rasa-tools where training an assistant with a sub-agent MCP server configured caused a
RuntimeError: Attempted to exit cancel scope in a different task than it was entered in, crashing the stdio server and making the next tool call fail withMCP error -32000: Connection closed. -
Removed dead
filled_slots_for_active_flowfunction fromrasa/dialogue_understanding/stack/utils.pyand its tests; the calling code was replaced in a prior fix but the function was never cleaned up. -
A2A agent
run()calls are now properly instrumented with Langfuse, nesting them inside the Rasa message-processing trace instead of generating empty top-level traces. -
Fix two bugs causing random crashes and resource leaks when running Rasa with --workers 2+: a pre-fork event loop left open during JWT setup, and litellm async HTTP clients not being closed on worker shutdown.
Root cause — Sanic uses fork-based multi-worker mode (legacy=True). create_app() was calling asyncio.new_event_loop() + set_event_loop() in the main process to satisfy sanic-jwt's Initialize(), then leaving the loop open. Forked workers inherited its kqueue/epoll file descriptors, conflicting with each worker's own loop (~50% crash at startup). Separately, close_resources() never called litellm.close_litellm_async_clients(), leaving cached async HTTP clients open when workers exit.
-
An explicitly configured
api_keyin therasaprovider model config now takes precedence over the Rasa license, allowing custom endpoints to authenticate with their own credentials. -
Transient tracker store connection errors (e.g. Postgres restart) no longer flood logs with full stack traces on each retry attempt; the error message is preserved on one line.
-
Fix
resume_flow()marking the wrongAgentStackFrameas resumed when a flow contains multiple sub-agent frames, which preventedrun_agent()from taking its resume branch. -
Resumed sub-agents now send the full conversation history to A2A backends and use stronger directive wording in the resume prompt, preventing the agent from re-asking for information the user already provided before the interruption.
-
Fixed multiple Langfuse session IDs being created for a single Dialogue Understanding Test (DUT) run by using the original test-case sender ID as the session ID for all per-step LLM traces.
-
Fixed a bug where a mid-conversation language switch (e.g. a custom action setting the
languageslot followed byutter_language_changed) could silently swallow the confirmation utterance because the call task was torn down by awebsockets.exceptions.ConnectionClosedOK('sent 1000 (OK); then received 1000 (OK)') raised while the ASR engine was being reconnected with the new language.The voice ASR and TTS engines now serialize their close+reopen sequence in
set_languagewith an internalasyncio.Lockso concurrent audio producers/consumers can no longer observe a half-closed websocket. The lock also wraps the writer-side I/O methods themselves (send_audio_chunkson ASR;send_text_chunk,signal_text_done,signal_interrupton the Deepgram/Rime/Azure TTS engines) so they can't race with the reconnect. As a defense in depth:ASREngine.send_audio_chunksnow drops a chunk silently if it lands during a reconnect (instead of raising and tearing down the call task).ASREngine.close_connectionnow nulls outasr_socketso other consumers see "not connected" instead of using a stale, closed reference.- The voice channel's
_consume_audio_bytestreatsConnectionClosedOK/ConnectionClosedErrorfrom the ASR socket as a benign race and continues consuming audio (defense in depth for ASR subclasses that don't swallowConnectionClosed*internally).
-
Refresh the AWS ElastiCache IAM presigned URL before each Redis (re)connect when within 60 seconds of expiry, so lock store and timer store operations no longer fail after >30 minutes of pro-server idleness.
-
Upgrading from 3.15.x to 3.16.x no longer causes every subsequent message to fail with
InvalidFlowStepIdExceptionwhen a tracker was mid-flow at upgrade time and a flow step ID was renamed or removed. The flow executor now detects stale step IDs, logs a structured warning, removes the stale frame, and continues processing — rather than propagating the exception as aGraphComponentException. -
Message processing no longer crashes with
ValueError: Could not find a user flow frame to cancelwhen an action fails (for exampleaction_session_startreturning HTTP 413) on a session whose residual dialogue stack contains only pattern frames; the internal-error pattern is pushed without attempting to cancel a non-existent user flow. -
Fixed a race condition in
KafkaEventBrokerwhere concurrent publish paths (e.g. when usingConcurrentKafkaEventBroker) could create or replace the producer twice. Producer initialisation and reconnect are now protected by a lock.Failed connection checks clear the producer so other threads can retry, and reconnect skips producer replacement if another thread already restored the connection.
_publishnow raises when the producer is missing so retry loops cannot exit successfully without delivering the event. -
Updated stale frame detection to use fingerprint comparison so that modified flows are also treated as stale.
-
Fixed A2A SSE streaming (
message/streamandtasks/resubscribe) so Sanic no longer raisesInvalid response type Noneafter response chunks are sent. -
A frame on the dialogue stack that references a step ID no longer present in the model (e.g. after a flow rename across an upgrade) no longer crashes message processing.
BaseFlowStackFrame.step()now returnsNoneinstead of raising, and_purge_stale_user_flow_framesruns beforeaction_session_startso the action server does not receive stale frames in its tracker payload.BREAKING CHANGE: We removed the
InvalidFlowStepIdExceptionexception;BaseFlowStackFrame.step()now returnsNonefor stale step IDs instead of raising. If you run into import errors for that exception, you need to adapt your code to handleNoneinstead of catching the exception. -
Fixed voice channels arming the silence timeout before the client finished playing the bot's audio, which could inject a spurious
/silence_timeoutand advance the flow while the caller was still listening to a long prompt. Silence monitoring now waits until outstanding audio playback markers are acknowledged, barge-ins clear stale markers so monitoring can re-arm, and synchronous channels (e.g. CHIRP) can opt out viatracks_audio_playback. -
Upgrade
langsmithdependency to 0.8.5 andstarletteto 1.0.1 to address CVE-2026-45134 and CVE-2026-48710. -
Fixed the Inspector's agent name in the top-left corner disappearing on page load or flickering when switching between Preview and Inspect modes.
-
Fixed an issue where streaming a response from a custom action recorded each streamed token as a separate
BotUtteredevent, causing the voice inspector transcript to show one bot message per token instead of a single composed message.Consecutive streamed text tokens are now aggregated into a single
BotUtteredtracker event (rich chunks such as buttons or images are still kept separate). On a user barge-in, the partial message streamed before the interruption is preserved as a single event. -
The MCP server now reads flow, domain, and evaluation config files fresh from disk on every tool call instead of returning stale cached content. Previously, edits to these files had no effect until the MCP server was restarted.
Improved Documentation
- When using AWS Bedrock with IAM role-based authentication, the
bedrock:InvokeModelWithResponseStreampermission is required in addition tobedrock:InvokeModelfor any streaming feature, including the Rephraser (nlg.type: rephrase). The Bedrock credential validation error message now explicitly names this permission when IAM auth fails, and the AWS setup documentation has been updated accordingly.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.19] - 2026-07-15
Rasa Pro 3.16.19 (2026-07-15)
Bugfixes
- Fixed multiple Langfuse session IDs being created for a single Dialogue Understanding Test (DUT) run by using the original test-case sender ID as the session ID for all per-step LLM traces.
- Fixed
rasa test e2efailing on user steps with metadata when tracker events included extra runtime-injected keys (e.g. model_name, default_language). - Fixed the
--credentialsargument to default tocredentials.ymlinstead ofNone, ensuring consistent behavior with other default configuration paths likeendpoints.ymlandconfig.yml. Updated the--domainhelp message to clarify that it defaults todomain.ymlordomain/directory when not specified (this was always the runtime behavior due to validation fallback logic, but the help text was misleading).
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.18] - 2026-07-07
Rasa Pro 3.16.18 (2026-07-07)
Deprecations and Removals
-
Breaking change: Removed the deprecated
LanguageModelFeaturizerNLU component and its internal HuggingFace integration (rasa.nlu.utils.hugging_face). This removes Rasa's direct dependency on thetransformerslibrary, which was affected by CVE-2026-1839 (arbitrary code execution via a malicious checkpoint file).Assistants whose NLU pipeline references
LanguageModelFeaturizermust migrate to a supported featurizer (for exampleConveRTFeaturizer, or a CALM pipeline usingLLMCommandGenerator) before upgrading.transformersis no longer a first-party component dependency. It remains a transitive dependency ofglinerand is now constrained to>=5.0.0(which contains the fix) wherever it is installed — i.e. on thegliner-based extras (full,pii). The standalonetransformersextra and thesentencepiecedependency have also been removed.
Bugfixes
-
Hardened deserialization and webhook parsing across the agent runtime so missing or malformed fields no longer crash production with
KeyErroror similar failures.Tracker and dialogue stack:
from_dictmethods for pattern stack frames, flow stack frames, chit-chat/search frames, and slots now use.get()with safe defaults for fields added after initial release, so older serialized tracker data loads cleanly after upgrades. Event deserialization skips individual malformed events with a warning instead of failing the entire tracker load.LLM and command processing: LLM tool-call parsing, command JSON deserialization, and the command processor tolerate missing optional fields and skip invalid entries rather than raising. Flow retrieval no longer assumes document metadata is always present.
Flows and model loading: Flow step and link
from_jsondeserializers validate required keys up front. Model metadata, graph schema, and local model fingerprint loading handle missing fields with clear errors or safe defaults instead of bare dict access.Channels and voice: Slack, Facebook Messenger, VIER CVG, Deepgram (V1), and AudioCodes webhook handlers validate incoming payloads defensively—returning HTTP 400 for invalid interactive Slack messages (including missing
user.id), logging and skipping malformed Facebook/Audiocodes events, and raising clear errors for malformed VIER CVG recipient IDs without leaking credential blobs in logs.Flow execution: MCP tool step input/output mapping uses safe dict access when mapping fields are absent.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.17] - 2026-06-24
Rasa Pro 3.16.17 (2026-06-24)
Bugfixes
- Bumped
langchain-classic(~1.0.7, fixes CVE-2026-45134) andstarlette(~1.3.1, fixes CVE-2026-54283) on 3.16.x to resolve high-severity dependency security vulnerabilities. Also raised thelangchain-corefloor to~1.3.3, which is required bylangchain-classic 1.0.7. - Fixed
action_session_startbeing incorrectly rejected on legacy trackers that lack aConversationInactiveevent. The session-start guard was treating a time-expired session as already active, leaving the first message after a long inactivity period stranded inpattern_code_changeinstead of starting a fresh session.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.16] - 2026-06-22
Rasa Pro 3.16.16 (2026-06-22)
Bugfixes
- The MCP server now reads flow and domain files fresh from disk on every tool call instead of returning stale cached content. Previously, edits to these files had no effect until the MCP server was restarted.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.14] - 2026-06-11
Rasa Pro 3.16.14 (2026-06-11)
Bugfixes
-
Fixed MCP task agents exposing
set_slot_*tools and listing slots in the task prompt for controlled-only or NLU-only slots inexit_if. Added aslot_mappings_allow_llm_fillhelper so tool exposure, prompt rendering, andshould_slot_be_setuse the same rule for whether the LLM may fill a slot from its mappings. -
Fixed
suppress_logsso that concurrent async calls no longer corrupt the process-wide log level, preventing logs from disappearing permanently until pod restart. -
Refresh the AWS ElastiCache IAM presigned URL before each Redis (re)connect when within 60 seconds of expiry, so lock store and timer store operations no longer fail after >30 minutes of pro-server idleness.
-
Message processing no longer crashes with
ValueError: Could not find a user flow frame to cancelwhen an action fails (for exampleaction_session_startreturning HTTP 413) on a session whose residual dialogue stack contains only pattern frames; the internal-error pattern is pushed without attempting to cancel a non-existent user flow. -
Updated stale frame detection to use fingerprint comparison so that modified flows are also treated as stale.
-
A frame on the dialogue stack that references a step ID no longer present in the model (e.g. after a flow rename across an upgrade) no longer crashes message processing.
BaseFlowStackFrame.step()now returnsNoneinstead of raising, and_purge_stale_user_flow_framesruns beforeaction_session_startso the action server does not receive stale frames in its tracker payload.BREAKING CHANGE: We removed the
InvalidFlowStepIdExceptionexception;BaseFlowStackFrame.step()now returnsNonefor stale step IDs instead of raising. If you run into import errors for that exception, you need to adapt your code to handleNoneinstead of catching the exception.
[3.16.13] - 2026-06-04
Rasa Pro 3.16.13 (2026-06-04)
Bugfixes
-
Fixed a spurious "Fatal error on SSL transport" traceback printed to stderr on Windows after
rasa test e2ecompletes by explicitly closing litellm's shared httpx sessions before the event loop shuts down. -
Fixed a crash in rasa-tools where training an assistant with a sub-agent MCP server configured caused a
RuntimeError: Attempted to exit cancel scope in a different task than it was entered in, crashing the stdio server and making the next tool call fail withMCP error -32000: Connection closed. -
Fix two bugs causing random crashes and resource leaks when running Rasa with --workers 2+: a pre-fork event loop left open during JWT setup, and litellm async HTTP clients not being closed on worker shutdown.
Root cause — Sanic uses fork-based multi-worker mode (legacy=True). create_app() was calling asyncio.new_event_loop() + set_event_loop() in the main process to satisfy sanic-jwt's Initialize(), then leaving the loop open. Forked workers inherited its kqueue/epoll file descriptors, conflicting with each worker's own loop (~50% crash at startup). Separately, close_resources() never called litellm.close_litellm_async_clients(), leaving cached async HTTP clients open when workers exit.
-
An explicitly configured
api_keyin therasaprovider model config now takes precedence over the Rasa license, allowing custom endpoints to authenticate with their own credentials. -
Transient tracker store connection errors (e.g. Postgres restart) no longer flood logs with full stack traces on each retry attempt; the error message is preserved on one line.
-
Fix
resume_flow()marking the wrongAgentStackFrameas resumed when a flow contains multiple sub-agent frames, which preventedrun_agent()from taking its resume branch. -
Upgrading from 3.15.x to 3.16.x no longer causes every subsequent message to fail with
InvalidFlowStepIdExceptionwhen a tracker was mid-flow at upgrade time and a flow step ID was renamed or removed. The flow executor now detects stale step IDs, logs a structured warning, removes the stale frame, and continues processing — rather than propagating the exception as aGraphComponentException.
[3.16.12] - 2026-06-02
Rasa Pro 3.16.12 (2026-06-02)
Bugfixes
- Fixed a performance regression in
SQLTrackerStore.retrieve()introduced in v3.16, where every retrieve loaded the full conversation history before replay-safe session slicing. Retrieve now fetches a minimum event prefix by trying the most recent session boundaries first (up to three). When reconstruction fails with a dialogue-stack patch error, the store retries from the last stack event in that prefix whose patch applies to an empty stack. If all 3 attempts fail, the store falls back to loading the full conversation history as before. This greatly reduces database I/O and memory use for long-lived conversations while preserving replay-safe behaviour. - Fixed graph schema validation on Python 3.13+ when components use PEP 604 union type hints (e.g.
Domain | None), which previously raised a falseGraphSchemaValidationException. - Fixed MCP flow tool tracing metrics when
_execute_mcp_tool_callmutates the sharedinitial_eventslist in place by capturing the pre-mutation event count for output slicing, and by detecting failures fromInternalErrorPatternFlowStackFrameon the dialogue stack rather than from unchanged event list length. - Updated
idna,pipandurllib3to address security vulnerabilities.
[3.16.11] - 2026-06-01
Rasa Pro 3.16.11 (2026-06-01)
Bugfixes
- Fixed DIETClassifier training failures on GPU with TensorFlow 2.19 and Keras 3, where training could fail with an
InvalidArgumentErrorabout unsupportedSparseReshapeoperations on XLA GPU JIT devices.RasaModelnow inherits fromtensorflow.keras.Modelinstead of standalone Keras 3'sModel, so it uses the same Keras stack as the rest of Rasa's TensorFlow code and respectsTF_USE_LEGACY_KERAS=1.
[3.16.10] - 2026-05-22
Rasa Pro 3.16.10 (2026-05-22)
Bugfixes
- Fixed a
KeyErrorinContinueInterruptedPatternFlowStackFrame.from_dictthat occurred when loading tracker events stored before the multi-interrupt fields were introduced. This caused repeated tracker store retries that blocked the server event loop, leading to liveness probe failures and pod restarts.
[3.16.9] - 2026-05-20
Rasa Pro 3.16.9 (2026-05-20)
Bugfixes
- Fix an interrupted sub-agent not being properly resumed after the user answers "Yes" to
pattern_continue_interrupted. This is fixed by introducing a transientRESUMINGagent state that sits betweenINTERRUPTEDandWAITING_FOR_INPUT:resume_flow()now sets the agent frame toRESUMINGinstead of directly toWAITING_FOR_INPUT;run_agent()detects this and re-invokes the agent withresumed_after_interruption=True.
[3.16.8] - 2026-05-19
Rasa Pro 3.16.8 (2026-05-19)
Bugfixes
- Fixed
InvalidFlowIdExceptionand repeated error logs that occurred when a conversation tracker contained historical events referencing flows or slots that were subsequently removed from the model.
[3.16.7] - 2026-05-15
Rasa Pro 3.16.7 (2026-05-15)
Bugfixes
- Updated security-flagged dependencies:
litellm:1.82.4→1.84.0langchain:~0.3.27→~1.2.16langchain-community:~0.3.29→~0.4.1langchain-core:~0.3.81→~1.3.2langsmith:~0.6.3→~0.7.31langchain-qdrant:~0.2.1→~1.1.0langchain-openai: transitive →~1.2.1(new direct pin)langchain-text-splitters: transitive →~1.1.2(new direct pin)
- The
no_text_normalizationparameter is now correctly passed to the Rime TTS WebSocket connection, allowing users to skip text normalization to reduce latency.
[3.16.6] - 2026-05-12
Rasa Pro 3.16.6 (2026-05-12)
Bugfixes
-
Fix bug when user's message during bot's speech is queued after bot is done speaking. When interruptions are DISABLED, if the bot is speaking and the user talks over it, the bot should ignore that speech entirely. When interruptions are ENABLED, the bot should only stop and listen if the user says enough words to qualify as an interruption (based on the min_words setting).
-
When interruptions are ENABLED, user message should be queued for processing only if it passes interruption criteria.
If interruptions are disabled, user message should be queued only if user speaks during collect step utterance.
Updated signature of following methods:
- send_start_marker:
send_start_marker(self, recipient_id: str)=>send_start_marker(self, marker_input: MarkerInput) - send_intermediate_marker:
send_intermediate_marker(self, recipient_id: str)=>send_intermediate_marker(self, marker_input: MarkerInput) - send_end_marker:
send_end_marker(self, recipient_id: str)=>send_end_marker(self, marker_input: MarkerInput) - send_marker_message:
send_marker_message(self, recipient_id: str)=>send_marker_message(self, marker_input: MarkerInput) - create_marker_message: create_marker_message(self, recipient_id: str) =>
create_marker_message(self, marker_input: MarkerInput) -> MarkerMessageOutput
where MarkerInput is a Pydantic-based class:
class MarkerInput(BaseModel):
recipient_id: str
marker_type: MarkerType
step_type: Optional[StepType] = None - send_start_marker:
-
Remove the "hand over" command from the default GPT-5.1 prompt template. The command had already been removed from all other prompt templates in the 3.16.0 release.
-
Fixed a bug where sub-agent flows would end immediately after interruption resumption instead of re-invoking the agent.
When a flow containing a sub-agent call was interrupted (e.g., by a user digression) and then resumed via
pattern_continue_interrupted, the agent frame's state remainedINTERRUPTED. This caused the flow executor to skip the agent call and advance to END, triggeringpattern_completedprematurely.The agent frame state is now correctly reset to
WAITING_FOR_INPUTduring flow resumption, ensuring the sub-agent is re-invoked with full conversation history as expected. -
Fixed MCP tracing attribute extraction for router-based model groups so tracing no longer crashes with
KeyError('provider')when instrumenting ReAct sub-agentsend_messagecalls. -
When interruptions are enabled and bot is not speaking, user utterances should not be checked if they are passing min_words threshold.
[3.16.5] - 2026-04-24
Rasa Pro 3.16.5 (2026-04-24)
Bugfixes
- Fixed a bug where the validator was mutating the allowed values list of categorical slots in-place, causing
Noneentries to accumulate in slots used across multiple flows via subflows. This corrupted the flow retrieval FAISS embeddings during training. - Fixed multi-agent flows looping back to an agent call when the top stack frame was interrupted instead of waiting for input, which could leave multiple agents active and fail graph execution. The loop-back shortcut now applies only when the agent frame is waiting for user input.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.4] - 2026-04-17
Rasa Pro 3.16.4 (2026-04-17)
Bugfixes
- Fixed tracing span attributes for LLM components that use model groups.
Spans now carry the correct model group ID and, for router groups, the representative model's attributes (preferring OpenAI when present for prompt token counting).
The
llm_is_router_groupattribute is also set on spans when a router group is active. - Update
cryptographyto version 46.0.7 to fix a security vulnerability. For more details, see CVE-2026-39892.
[3.16.3] - 2026-04-09
Rasa Pro 3.16.3 (2026-04-09)
Improvements
- Replaced the generic "Start the server from your IDE" message after
rasa tools initwith IDE-specific instructions for Claude Code, Cursor, VS Code, and JetBrains. - Added
rasa tools statuscommand that displays current project configuration and runtime readiness.
Bugfixes
- Fixed validation incorrectly rejecting custom ContextualResponseRephraser subclasses configured as nlg.type in endpoints.yml. The validator now resolves the class and checks inheritance instead of only accepting the literal string "rephrase".
- Updated
PyJWT,werkzeug,aiohttp,orjson,pyasn1,requests, andujsonto resolve security vulnerabilities.
[3.16.2] - 2026-04-02
Rasa Pro 3.16.2 (2026-04-02)
Bugfixes
-
Fixed correction reset when a user answers the active collect slot and corrects another slot in the same turn.
CorrectSlotsCommand.create_correction_frameno longer chooses the reset step only from slots in the correction payload. It also considers the current collect-information step and picks the earlier collect step in flow order, so the stack resets to the question currently being asked instead of jumping ahead to a later slot’s collect step (which skipped validation for the new value on the active slot).
[3.16.1] - 2026-04-01
Rasa Pro 3.16.1 (2026-04-01)
Bugfixes
-
Fixed three bugs in
ConcurrentRedisLockStorethat caused anIndexError: deque index out of rangecrash in the PII anonymization and deletion cron jobs under multi-replica deployments.get_lock()now returnsNonewhen no ticket keys exist in Redis (all tickets had expired), instead of returning an emptyConcurrentTicketLockobject that caused downstream callers to crash.save_lock()now skips the Redis write when the ticket has already expired (TTL ≤ 0), preventing aResponseErrorfrom Redis.save_lock()previously passed the absolute epoch expiry timestamp as the RedisEXTTL, resulting in ticket keys that effectively never expired (~55 years). The TTL is now correctly computed as a relative duration in seconds.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.16.0] - 2026-03-26
Rasa Pro 3.16.0 (2026-03-26)
Breaking changes
Upgrading may require config edits, code updates, or retraining. All incompatible changes for this release are listed below in one place.
-
Default language models used by built-in LLM features have changed. If you need the same behavior as before, pin the previous model names in
endpoints.yml.Component New default model LLMBasedCommandGeneratorgpt-5.1-2025-11-13CompactLLMCommandGeneratorgpt-5.1-2025-11-13SearchReadyLLMCommandGeneratorgpt-5.1-2025-11-13ContextualResponseRephrasergpt-5.1-2025-11-13IntentlessPolicygpt-5-mini-2025-08-07MCPBaseAgentgpt-5.1-2025-11-13EnterpriseSearchPolicygpt-5-mini-2025-08-07LLMBasedRoutergpt-5-mini-2025-08-07ConversationRephrasergpt-5-mini-2025-08-07 -
Default prompts for command generation changed. If you already set a custom
prompt_templateinconfig.yml, that file is still used. -
Default prompts for ReAct agents changed (task vs general assistant behavior and
task_completedguidance). If you override templates, compare your custom files against the latest templates inrasa/agents/templates/.
, #4851, #4867: Agent interface changed.
-
process_outputwas removed from the shared agent protocol. Useprocess_agent_outputforA2AAgentimplementations andprocess_tool_outputfor ReAct/MCP agent implementations:# A2A agents
async def process_agent_output(self, output: AgentOutput) -> AgentOutput
# ReAct/MCP agents
async def process_tool_output(
self,
current_iteration_tool_results: Dict[str, AgentToolResult],
cumulative_tool_results: Dict[str, AgentToolResult],
output_channel: Optional[OutputChannel] = None,
) -> List[Event] -
runsignature changed with optional cooperative cancellation support:async def run(
self,
input: "AgentInput",
output_channel: Optional[OutputChannel] = None,
cancellation_token: Optional["CancellationToken"] = None,
) -> "AgentOutput" -
Custom tool callable signature changed:
- Before:
Callable[[Dict[str, Any]], AgentToolResult] - After:
Callable[[Dict[str, Any], AgentToolContext], AgentToolResult] - Import
AgentToolContextviafrom rasa.agents.schemas import AgentToolContext.
- Before:
Deprecations and Removals
- Remove
HumanHandoffcommand from the codebase and default prompt templates. - Remove generic
process_outputmethod fromAgentProtocol. In ReAct / MCP agents, useprocess_tool_outputfor tool-result-based post-processing. InA2AAgent, useprocess_agent_outputmethod.
Features
-
Added optional
reasoning_efforton LLM model configuration for providers and models that support it (for example OpenAI and Azure OpenAI reasoning-capable models). By default, Rasa tries to apply the lowest appropriatereasoning_effortfor the resolved model name (using provider metadata where available). We recommend using the lowest supported value unless you explicitly need deeper reasoning. Any value you set explicitly is left unchanged. Models that do not support this parameter do not receive a default. For Azure deployments configured without a concretemodelname, Rasa can resolve the backing model and setreasoning_effortafter the first probe response.Example configuration in
endpoints.yml:model_groups:
- id: openai-reasoning
models:
- provider: openai
model: gpt-5-mini-2025-08-07
reasoning_effort: "minimal" -
Added
max_polling_timeandpolling_initial_delayto A2A agent configuration so polling parameters can be set per agent. Defaults remain 60 seconds and 0.5 seconds respectively when not set.To override polling for an A2A agent, set the options in the agent's configuration:
agent:
name: my_agent
protocol: A2A
# ...
configuration:
agent_card: "https://example.com/agent-card.json"
max_polling_time: 120 # max total polling time in seconds (default: 60)
polling_initial_delay: 1.0 # initial delay before first poll in seconds (default: 0.5)
# ... other configuration (timeout, max_retries, etc.) -
Added filler message support for ReAct agents via a new
enable_filler_messagesconfig flag. Filler messages are enabled by default and are streamed to the user before tool execution, with streaming capability determined by a newsupports_streamingproperty onOutputChannel.To disable filler messages for an agent, set
enable_filler_messages: falsein the agent's configuration:agent:
name: my_agent
# ...
configuration:
enable_filler_messages: false
# ... other configuration (llm, timeout, etc.) -
Implements user-scoped tracker querying and durable conversation metadata across all tracker stores. Persists
user_idandconversation_started_timestampin the tracker object to use for querying and ordering:- serialisation now omits null user_id
- deserialisation handles
JSONDecodeError - Ensures
conversation_started_timestampbackfilled on save/update for backward compatibility
Summary of tracker store changes for user-scoped retrieval of conversation trackers:
- SQL: introduces users table (sender_id→user_id, timestamp) with upsert per dialect; JOIN-based retrieval and DB-level ordering/pagination; cleanup on delete
- Redis: maintains secondary index
user_trackers:\{user_id\}(Sorted Set) for O(1) lookup; batch mget, robust deserialisation, index cleanup - Mongo: creates indices on user_id and (conversation_started_timestamp, sender_id); aggregation pipeline for ordering/pagination; restores user_id
- Dynamo: saves user_id and conversation_started_timestamp (Decimal) in update_item; GSI support (user_id-index with sort on conversation_started_timestamp) with full-scan fallback
-
Added optional
user_idparameter toDialogueStateTrackerto enable associating multiple conversations with a single end user. -
Implemented conversation lifecycle management with
ConversationInactiveand enhancedSessionEndedevents. Conversations can now be marked as inactive (resumable via user message orConversationResumedevent) or terminated (permanently ended, blocking all further updates).Added a new
session_configoptionstart_session_after_expirythat controls what happens when a session expires (based onsession_expiration_time).- When
true(default), Rasa emits aSessionStartedevent and starts a new session, ensuring backward compatibility. - When
false, expired sessions simply continue without automatically starting a new session.
- When
-
Add REST API endpoint
/users/{user_id}/trackersto retrieve all conversations for a given user.This admin endpoint provides user-scoped tracker querying with:
- Authentication: Requires token or JWT authentication
- Pagination: Supports
limitandoffsetquery parameters for efficient pagination - Event verbosity: Configurable via
include_eventsquery parameter (NONE, APPLIED, AFTER_RESTART, ALL) - Error handling: Proper validation and HTTP status codes for invalid inputs
- Performance: Database-level sorting and pagination for efficient queries with 1000+ conversations
Important: This is an admin endpoint that should be used as a proxy or in a backend service to manage what data is exposed to the client. Direct client access should be avoided to maintain security and control over sensitive user data.
Example usage:
GET /users/{user_id}/trackers?limit=50&offset=0Response format:
{
"conversations": [...],
"limit": 50,
"offset": 0
} -
Implemented Multilingual Voice AI Agents. The configuration of Automatic Speech Recognition (ASR) and Text to Speech (TTS) changes through the conversation based on the value of built-in
languageslot. For each ASR and TTS Engine, users can configure the language, model or voice to be used for each value oflanguageslot. In case of ASR Engines, reconfiguration requires a websocket reconnect. Rasa manages that on the fly to ensure that no speech is lost. The signature of certain methods in classesASR_EngineandTTS_Enginehave also changed. These methods are, init and from_config_dict. -
Implemented session-scoped conversations. Each conversation session now has a unique
session_id(UUID v4) that is automatically generated and attached to all events within that session. This enables better tracking and analytics of user sessions. Session IDs are automatically generated on session start or resume events and propagated to event metadata.Added
current_session_idfield to DialogueStateTracker. The session ID is automatically:- Generated as a UUID4 when a new session starts or resumes. Generation triggers include:
- Brand new conversations (first event on a tracker)
- SlotSet for session metadata slot
action_session_startorSessionStartedeventsConversationResumedafter inactivityUserUtteredreactivating an inactive conversation
Added
session_idto event metadata. The generated ID is automatically included in the metadata of all events created during a conversation session. - Generated as a UUID4 when a new session starts or resumes. Generation triggers include:
-
Add
timer_storeconfiguration toendpoints.ymlto enable configurable background session timer storage. -
Add MCP
_metaparameter support so you can pass user-specific data to MCP servers without exposing it to the LLM.- Configuration: Optional
meta_mapper MCP server inendpoints.ymlwith:static: Fixed key-value pairs always sent in_metafrom_slots: Slot-to-mcp key mappings; slot values are sent under the given param in_meta
- Execution: Both flow-based and agent-based MCP tool calls build and send
_metawhenmeta_mapis configured. A compatibility layer supports current MCP SDK versions that do not exposemetaoncall_tool. - Agent-based calls: For
from_slots, values are read from agent input only when the slot is present; slots that have been removed from agent input will not appear in_meta.
Example
endpoints.yml:mcp_servers:
- name: internal_api_server
url: http://internal-api:8000/mcp/
type: http
meta_map:
static:
api_version: "v2"
source: "rasa_agent"
from_slots:
- slot: user_id
param: user_id
- slot: role
param: user_roleThis replaces the need to override private Rasa methods (e.g.
execute_mcp_tool,send_message) to inject auth or context into MCP requests. - Configuration: Optional
-
Implemented Session Timer System for automatic session expiration. Conversations are now automatically marked as inactive after a configurable timeout period, supporting both single-instance and horizontally-scaled deployments.
- Timers are scheduled when a session starts and reset on each user message
- When a timer expires, a
ConversationInactiveevent is emitted - Race condition handling ensures correct behavior in multi-pod deployments
- Redis-backed storage enables timer persistence across restarts
- Automatic recovery of expired timers on server startup
- Fallback to in-memory storage during Redis outages
SessionTimerStore/SessionTimerManagerabstract base classesInMemorySessionTimerStore/InMemorySessionTimerManagerfor single-instance deploymentsRedisSessionTimerStore/RedisSessionTimerManagerfor distributed deployments
-
Implemented out-of-the-box collection of customer satisfaction.
- Added built-in
pattern_customer_satisfactionfor CSAT collection. - The pattern is triggered automatically via a link from
pattern_completedwhen users decline to continue the conversation. - It collects a
csat_scoreslot (categorical:satisfied/unsatisfied) and responds with appropriate thank-you messages. - The pattern, its responses (
utter_ask_csat_score,utter_csat_thank_you_satisfiedandutter_csat_thank_you_unsatisfied) and when the pattern is triggered are all fully customizable.
- Added built-in
-
Handle
SessionEndedevents returned from custom actions gracefully by stopping the prediction loop and flow executor when the conversation is terminated. -
Added the system action
action_handoff_metricto mark conversations as "not contained" for containment metrics. Any conversation that includes this action emits anActionExecutedKafka event and is counted as not contained. The action is a no-op; no user-visible behavior or migration is required.Updated the default
pattern_human_handoffflow to runaction_handoff_metricbeforeutter_human_handoff_not_available, so existing assistants automatically emit the metric when the human handoff pattern is used. If you have overriddenpattern_human_handoffin your flows, you can add a stepaction: action_handoff_metricat the start of that flow to include those conversations in containment metrics. -
Add support for multiple Audio Formats in Rasa. These are G.711 μ-law (legacy) along with Linear PCM 24kHz and Linear PCM 48kHz.
-
Extended support for Audio Formats, Updated Azure and Deepgram Automatic Speech Recognition (ASR) to support multiple audio formats. G.711 μ-law, Linear PCM 24kHz and Linear 48kHz. Updated Azure, Deepgram, and Cartesia Text to Speech (TTS) to support the same audio formats. Rime TTS only supports G.711 μ-law and Linear PCM 24kHz. Updated Jambonz and Audiocodes Stream Channel to use Linear PCM 24kHz audio when sending or receiving audio from the platform.
-
Add prompt templates and the corresponding model mapping for GPT-5.1 and GPT-5.2.
-
Update default models for LLM-based components:
CompactLLMCommandGenerator,SearchReadyLLMCommandGenerator,LLMBasedCommandGenerator,ContextualResponseRephraserandMCPBaseAgentwill usegpt-5.1-2025-11-13;EnterpriseSearchPolicy,LLMBasedRouter,ConversationRephraserandIntentlessPolicywill usegpt-5-mini-2025-08-07. -
Browser Audio channel uses Linear PCM 48kHz audio with ASR and TTS components. The sample rate of this encoding can be configured with
sample_rateproperty of the channel. Supported values in kHz are 8000, 24000 and 48000 Voice Inspector has been updated to receive and play Linear PCM at any of the supported sample rates. The sample rate is sent to the Voice Inspector in a handshake message. -
ReAct agent now uses the streaming LLM API and consumes the response incrementally instead of buffering the full stream. Content tokens are delivered to the user in real time when the channel supports streaming. Tool calls are executed after the stream segment completes and their results are sent in one shot. This reduces perceived latency.
-
Voice channels enforce two type of minimum gaps between bot audio: a shorter gap for regular back-to-back utterances, and a longer gap following filler messages (e.g., when streaming assistant text alongside tool calls from ReAct-style agents). After each message is sent, when the next message arrives, the channel checks the time since the last message was sent against the configured minimum delay. If more time is needed, generates silence audio for that duration, sends the silence to the stream, and then sends the next message. Consecutive turns are therefore naturally spaced.
-
Add prompt templates and the corresponding model mapping for Claude Sonnet 4.5 and Claude Sonnet 4.6.
-
Add public method
process_tool_output()inMCPBaseAgentfor implementing custom post-processing logic based on the tool results in each iteration. -
Support metadata pass-through in A2AAgent so that specialized data can be passed to the agent's backend via
AgentInput.metadatawithout being processed by the LLM. The metadata is forwarded to theMessagesent to the A2A server. -
- Add graceful cancellation of long-running A2A agent operations (both polling and streaming). When
ConversationInactiveevent is added to the tracker aftersession_expiration_timeminutes while an A2A task is in progress, the operation is now cancelled promptly instead of running until timeout. Note: This is a model breaking change. Please retrain your model. - Introduce a public method
Agent.cancel_background_tasks(sender_id)that can be used to explicitly trigger the cancellation of the background A2A processing (both streaming and polling) from other components (e.g. from custom channels). - Add a new POST
/cancel_background_tasks/<sender_id>endpoint in the REST channel that allows frontends and external systems to explicitly cancel background processing for a conversation. - Closing the Inspector browser tab now automatically cancels any in-flight A2A operations for that conversation.
- Add graceful cancellation of long-running A2A agent operations (both polling and streaming). When
-
AgentInput.metadatais now propagated to custom tool execution. Tool executors receive(args, context), whereargscontains the LLM-generated tool parameters andcontextis anAgentToolContext. The request metadata is available viacontext.metadataand it can be set by the agent in theprocess_inputmethod using theAgentInput.metadataattribute.
Improvements
-
The continue-interrupted pattern is now triggered after a knowledge (e.g. EnterpriseSearch) answer, so users are asked if they want to resume previously interrupted flows when returning from a search.
-
When an agent was interrupted and then resumed, it now gets reinvoked with the current context and a system instruction that it was interrupted and may use the new context or ask again. Previously, the agent only repeated its last message and did not run again.
-
Add
SessionPausedevent which purpose is to be triggered by external systems when a session is paused. It has the following properties:event- which is always set tosession_pausedreason- which describes why the session was pausedtimestamp- (optional) Unix timestamp, which indicates when the session was paused
If
timestampis not provided, the current Unix timestamp of the Rasa Pro server will be used.This event can be used to notify pipelines bout the pause state of a session, allowing them to take appropriate actions based on the session's status.
To use this event, external systems should trigger it when a session is paused, via
POSTconversations/<sender id>/tracker/events.Example of the payload for the POST request:
{"event": "session_paused", "timestamp": 1761232628.512342, "reason": "Widget closed"} -
Refactor Copilot response handling to support structured streaming from the agent SDK copilot and improve text content processing. The new implementation properly segments text content parts into start, delta, and end events, handles controlled predictions, and fixes buffer handling issues in the legacy copilot handler.
-
Events streamed to the event broker now include
user_idin the message payload alongsidesender_id. This allows downstream consumers to identify the end user associated with each conversation event. -
Add support to stream audio chunks from Azure Speech Service via websocket. Rasa will use streaming via websocket when response does not contain any SSML tags. If response contains any SSML tag, Rasa will default to use HTTPS to create audio chunks from Azure Speech Services. Improve interruption handling by:
- stopping stream from Azure Speech Services when interruption happens
- stopping to send audio chunks from Rasa to external voice service when interruption happens
-
Improve
action_session_startexecution to ensure it runs only once (coordinating calls from theMessageProcessorand theFlowPolicywhen it triggerspattern_session_start). -
Update eligibility and session-splitting logic for privacy cron jobs in line with the new session management improvements.
- when USER_CHAT_INACTIVITY_IN_MINUTES is unset, “new” trackers are processed based on ConversationInactive/SessionEnded events and session_id grouping (with a grace period of min_after_session_end), while “legacy” trackers without session_id fall back to a fixed 30min + min_after_session_end threshold.
- when the env var is set, time-based behavior remains but is now deprecated and applied per session.
SQL tracker store:
update()now supports a content-only path when the timestamp-based delete removes no rows (e.g. anonymization: same timestamps, content changed). In that case, the store either updates existing event rows in place where content differs or performs a full replace if event counts differ, so anonymized content is persisted correctly in a single atomic transaction.Anonymization cron job: the privacy manager now uses
update(updated_tracker)for anonymization instead of delete-then-save. SQL tracker store behavior is aligned with MongoDB, Redis and DynamoDB (overwrite semantics), and anonymization with SQL completes in one atomic operation without a separate delete/save sequence. -
Cancel timer unconditionally when a
SessionEndedevent is appended via the REST API, regardless of whetherexecute_side_effectsis requested. -
Add
model_nameto event metadata. -
Add
tool_timeoutfor MCP/ReAct agents configuration to configure tool-call timeout in seconds. -
Enabled deletion of a Studio assistant during upload. Introduced a new
--dangerously-delete-existingflag torasa studio upload. When set, any existing Studio assistant with the same name is deleted before the upload proceeds, with no interactive confirmation. -
Added logic for signaling interruptions in tts streaming. Sendind a variation of clear command to stop streaming audio and clear the buffer to prepare for the next response.
-
Added a warning log when
carry_over_slots_to_new_sessionandstart_session_after_expiryare both set tofalsein the domain session config, ascarry_over_slots_to_new_sessionhas no effect when no session boundary is created on expiry. -
Use the prompt template for
gpt-5.1-2025-11-13as new default prompt template in theCompactLLMCommandGeneratorandSearchReadyLLMCommandGenerator. -
SQL and Mongo tracker stores now slice the latest conversation session using the same boundary as other tracker stores:
ActionExecuted(action_session_start). That action is always executed by the message processor when a new session starts, whileSessionStartedmay be omitted by a custom action-session-start action. Incremental save offsets and SQL partial-fetch queries were updated to match this boundary. -
Add normalization of
AgentOutput.eventsso entries from ReAct/A2A customizations may be either RasaEventinstances or serialized event dicts; dicts are parsed into proper events before flow handling (e.g. stack metadata attachment), and invalid entries are dropped with structured error logs. -
Declared
safetensorsandkerasas optional NLU extras (pip install 'rasa-pro[nlu]'orfull), so minimal installs no longer pull them in directly.regexis also declared optional and listed under those extras for consistency withWhitespaceTokenizer, but it remains installed on most minimal installs because the base dependencytiktoken(used by the LLM stack) depends onregex.The affected code paths lazy-import
safetensorsandregex; if either package is not installed, they raiseMissingDependencyExceptionwith install instructions.kerasis only pulled in for the TensorFlow model stack (rasa.utils.tensorflow.models), so it is optional for the same minimal-install story assafetensors. -
Improved sub-agent call steps that use
exit_if: when the same ReAct agent runs again in one conversation, slots named inexit_ifare cleared so a new run does not reuse values from the last finished run. Ongoing multi-turn agent sessions (waiting for the next user message) are unchanged. -
Two improvements to
DynamoTrackerStore:- Idempotent
save(): concurrent or retried saves no longer produce duplicate events. New conversations are written viaput_itemwithattribute_not_exists(sender_id), ensuring the full tracker is stored exactly once. Subsequent saves append only new last-turn events via a conditionalupdate_itemguarded bylast_event_timestamp, which atomically rejects any append whose events are already stored — without requiring a read-before-write. - Reused boto3 resource:
boto3.resource("dynamodb")is now instantiated once in__init__asself._dynamoand shared across all methods, eliminating repeated resource construction per call. The connection pool size is configurable via themax_pool_connectionsconstructor argument (default: 50) to prevent urllib3 pool saturation under concurrent load.
- Idempotent
-
The
GET /users/{user_id}/trackersendpoint no longer replays conversation history throughDialogueStateTracker.from_dict()andcurrent_state()on every request. Each tracker store now implementsget_serialized_trackers_by_user_id(), which returns serialized event dicts directly from storage without event replay.Additional store-specific improvements included with this change:
- SQL: replaced an N+1 query loop (one
retrieve_full_trackercall per conversation) with two bulk queries — one paginateduserstable query and oneevents IN (...)fetch — eliminating query count growth with conversation volume. - Redis: orphaned sorted-set index entries are now removed in a single batched
ZREMcall instead of one call per orphan. - All stores:
current_session_idis now derived consistently from the last event's metadata rather than from stored state, correctly returningNonewhen the last event isConversationInactive.
- SQL: replaced an N+1 query loop (one
Bugfixes
-
Restarted task-oriented ReAct agents no longer exit immediately. When an agent is restarted, the previous run's user/assistant messages are now marked in the conversation so the model does not set slots from them; the system prompt instructs the agent to treat the current interaction as a fresh start for slot collection.
-
Fix potential Tensor shape mismatch error in
TEDPolicyandDIETClassifier. -
Fix bug with the missing
language_datamodule by installinglangcodeswith thedataextra dependency. -
Fixed
languageparameter in RimeTTS configuration to be passed correctly to the Rime API. Temporarily changed RimeTTS to non-streaming input mode as a workaround for a Rime API bug that impacts conversation experience; audio is now generated from the complete response at once. -
Update
mcpversion to~1.23.0to address security vulnerability CVE-2025-66416. -
Fix bug in
CommandPayloadReaderwhere regex matching did not account for list slots, leading to incorrect parsing of slot keys and values. Now, slot names and values are correctly extracted even if a list is provided. -
Previously,
DialogueStateTracker.has_coexistence_routing_slotcould incorrectly returnTruewhen the tracker was created without domain slots (i.e., usingAnySlotDict), becauseAnySlotDictpretends all slots exist. Now, the property returns False in that case, so the routing slot is only considered present if it is actually defined in the domain. -
Fix LLM prompt template loading to raise an error instead of just printing a warning when a custom prompt file is missing or cannot be read.
-
Fix
AttributeError: 'str' object has no attribute 'pop'when usingKnowledgeAnswerCommandwith tracing enabled. -
Fix
UnboundLocalErrorinE2ETestRunner._handle_fail_diffthat caused e2e tests to crash when processingslot_was_not_setassertion failures. -
Fixed button payloads with nested parentheses (e.g.,
/SetSlots(slot=value)) not being parsed correctly inrasa shell. The payload was incorrectly stripped of its/SetSlotsprefix, causing it to be treated as text instead of a slot-setting command. -
Add missing deprecation warning for legacy
RASA_PRO_LICENSEenvironment variable. Update license validation error messages to reference the actual environment variable used. -
Include response button titles in conversation history in prompts of LLM based components.
-
Fixed e2e test coverage report to correctly track coverage per flow. Each flow now appears as a separate entry with accurate coverage percentages. Additionally,
call/linksteps andcollectsteps with prefilled slots are now properly marked as visited. -
Fix DUT fails with AttributeError when running with custom CommandGenerator
-
Fix OAuth2AuthStrategy to use URL-encoded parameters with Basic Authentication to fetch access token
-
Remove config file content from endpoint read success logs to prevent sensitive data exposure.
-
The MCP task agent now includes slot changes in the agent output when the state is
INPUT_REQUIREDor when max iterations is reached. Previously, slots set via set_slot tools were updated in memory but not forwarded in the output, so they were not persisted until exit conditions were met. -
Fix race conditions in PII cron jobs by requiring a LockStore for BackgroundPrivacyManager and acquiring a per-sender_id lock while anonymization/deletion jobs read-modify-write trackers.
-
Rasa needs to check if it is in listening mode before it triggers the silence timeout watcher. Silence timeout watcher will be triggered if all are true:
- User is not speaking
- Bot is not speaking
- Rasa is in listening mode
If any of the conditions above are not true, Rasa will cancel the silence timeout watcher.
-
Channel specific silence_timeout can now be set in credentials file. Fixes the type error. If silence_timeout is not set the channel will use global value.
-
Stop silence timeout immediately when interruption is detected.
-
When an A2A task has status
input_required, Rasa now populatesAgentOutput.structured_resultsfrom bothtask.artifactsand DataParts intask.status.message.parts. Previously only the text message was returned and structured data was omitted, so clients can now process artifact data when the agent is waiting for user input. -
Fix PII redaction of user or bot messages when slot values do not match the original message text. This can occur when the original messages are multi-line or TTS-style bot read-backs.
-
Update setuptools to 80.10.2 to address vulnerability https://osv.dev/vulnerability/DEBIAN-CVE-2026-23949. Replaced randomname with duoname (no dependencies) library.
-
Fixed the backend tracing wrapper (e.g., Jaeger or OTLP) around send_message to correctly forward the output_channel argument to the underlying implementation.
-
When an agent or MCP tool call returns a fatal error (e.g. internal server error), the user no longer receives two bot messages. Previously both the internal error message ("Sorry, I am having trouble with that...") and the flow-cancelled message ("Okay, stopping...") were shown. Now only the internal error message is shown; the cancel pattern is not pushed for system-initiated failures, so the flow is still marked ended for tracking but the confusing cancel utterance is omitted.
-
Add rephrase endpoint validation by treating defaults-only misconfiguration as warning and user-defined rephrase misconfiguration as error.
-
Issue a warning when ASR and TTS
language_mapis missing languages fromadditional_languageproperty read fromconfig.yml. -
Fixed replay-safe latest-session handling for all built-in tracker stores. Tracker store
retrievemethod usesget_latest_replay_safe_session_tracker, widening the replay prefix when stack patches cannot be applied on the latest-session slice alone. -
Fixed
default_languageraisingRasaException("No default language configured")even whenlanguage:was properly set inconfig.yml. It happened when thelangaugeslot was reset (set toNone). -
Improved OpenTelemetry histograms for MCP agent LLM usage:
mcp_agent_llm_prompt_token_usageandmcp_agent_llm_response_durationnow record a consistent, call-scoped set of attributes (agent_name,execution_context, andprotocol_type), making metrics easier to aggregate. -
Fixes Implemented:
-
Both default and customized
action_session_startnow raise a Rasa exception when the session is already started for the current message. This exception is caught and handled byMessageProcessorwhich appendsActionExecutionRejectedevent and continues processing the message. This ensures that the message processing flow is not interrupted by the exception and allows for proper handling of the session start action. This change was required to avoid generating new session ids when this action is executed multiple times in the same time-bound tracker session. -
Fix conversation stalling when a flow contains an explicit
action_session_startstep and the session is already started for the current message.
- The root cause explanation: The attempt to execute
action_session_starta 2nd time for an existing session is rejected. The action execution rejection propagates to the DefaultPolicyPredictionEnsemble, which zeroes out action_session_start's confidence across all policy predictions. Since FlowPolicy only predicted that one action (with confidence 1.0), zeroing it leaves only the default action_listen at 0.0. - The fix: detect this condition in FlowPolicy and skip the step immediately, letting FlowPolicy continue the loop and return the actual next flow step's action.
-
-
Fixed empty assistant bubbles in Socket.IO channels (including Inspector) when the model returned whitespace-only or paragraph-only text. Non-streaming LLM responses are now stripped before send and blank segments from
\n\nsplitting are no longer emitted. -
Fixed three bugs in
DynamoTrackerStore:JsonPatchConflicton tracker retrieval: duplicate events appended by concurrent or retriedsave()calls causedjsonpatchto attempt operations on already-mutated dialogue stack fields (e.g. removingframe_typea second time), raising an unhandled exception. Duplicate events are now removed on load via_deduplicate_events(), which deduplicates by full event content to safely handle multiple legitimate events sharing the same timestamp.- Event accumulation across trackers in
get_trackers_by_user_id:events_with_floatswas declared outside the per-item loop in_process_dynamodb_items, causing each reconstructed tracker to accumulate all preceding trackers' events. Each tracker now gets its own isolated events list. - Pre-
UserUtteredevents lost on first save:save()only appended last-turn events (from the latestUserUtteredtimestamp onwards), so events emitted before the first user message — such asaction_session_start,session_started, and initialslotevents — were never persisted for new conversations. First saves now useput_itemto store the complete tracker state.
-
Upgrade
langsmithdependency to 0.6.3 to address CVE-2026-25528.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.29] - 2026-06-23
Rasa Pro 3.15.29 (2026-06-23)
Bugfixes
- Bumped
langchain-classic(~1.0.7, fixes CVE-2026-45134) andstarlette(~1.3.1, fixes CVE-2026-54283) on 3.15.x to resolve high-severity dependency security vulnerabilities. Also raised thelangchain-corefloor to~1.3.3, which is required bylangchain-classic 1.0.7.
[3.15.28] - 2026-06-22
Rasa Pro 3.15.28 (2026-06-22)
Improvements
- A2A agent validation now requires
TICKET_LOCK_LIFETIMEto be at least as long asmax_polling_time, preventing the conversation lock from expiring while A2A polling is still in progress. - Added
configure_litellm_for_rasa()in a lightweight_litellm_configmodule to centralize LiteLLM setup: it suppresses print-based provider-list debug footers vialitellm.suppress_debug_infoand sets the LiteLLM logger to WARNING, reducing log noise during LLM, embedding, and router client initialization without pulling in AWS provider dependencies.
Bugfixes
-
Fixed MCP task agents exposing
set_slot_*tools and listing slots in the task prompt for controlled-only or NLU-only slots inexit_if. Added aslot_mappings_allow_llm_fillhelper so tool exposure, prompt rendering, andshould_slot_be_setuse the same rule for whether the LLM may fill a slot from its mappings. -
Fixed
rasa data validateincorrectly rejectingcallsteps that target subagents or MCP tools when no agent configuration is loaded, instead of emitting a warning. -
Fixed
suppress_logsso that concurrent async calls no longer corrupt the process-wide log level, preventing logs from disappearing permanently until pod restart. -
Refresh the AWS ElastiCache IAM presigned URL before each Redis (re)connect when within 60 seconds of expiry, so lock store and timer store operations no longer fail after >30 minutes of pro-server idleness.
-
Message processing no longer crashes with
ValueError: Could not find a user flow frame to cancelwhen an action fails (for exampleaction_session_startreturning HTTP 413) on a session whose residual dialogue stack contains only pattern frames; the internal-error pattern is pushed without attempting to cancel a non-existent user flow. -
Upgrade
langsmithdependency to 0.8.5 andstarletteto 1.0.1 to address CVE-2026-45134 and CVE-2026-48710. -
Fixed a leaked privacy-manager background scheduler thread that kept
rasa test e2e(and the finetuning and dialogue-understanding test commands) from exiting cleanly.The privacy manager's background thread is now stopped on every path that retires an agent — the test CLI commands, server model reload/unload, and builder agent swaps — instead of only on server shutdown.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.27] - 2026-06-04
Rasa Pro 3.15.27 (2026-06-04)
Bugfixes
-
Fixed a spurious "Fatal error on SSL transport" traceback printed to stderr on Windows after
rasa test e2ecompletes by explicitly closing litellm's shared httpx sessions before the event loop shuts down. -
Fixed a crash in rasa-tools where training an assistant with a sub-agent MCP server configured caused a
RuntimeError: Attempted to exit cancel scope in a different task than it was entered in, crashing the stdio server and making the next tool call fail withMCP error -32000: Connection closed. -
Fix two bugs causing random crashes and resource leaks when running Rasa with --workers 2+: a pre-fork event loop left open during JWT setup, and litellm async HTTP clients not being closed on worker shutdown.
Root cause — Sanic uses fork-based multi-worker mode (legacy=True). create_app() was calling asyncio.new_event_loop() + set_event_loop() in the main process to satisfy sanic-jwt's Initialize(), then leaving the loop open. Forked workers inherited its kqueue/epoll file descriptors, conflicting with each worker's own loop (~50% crash at startup). Separately, close_resources() never called litellm.close_litellm_async_clients(), leaving cached async HTTP clients open when workers exit.
-
An explicitly configured
api_keyin therasaprovider model config now takes precedence over the Rasa license, allowing custom endpoints to authenticate with their own credentials. -
Transient tracker store connection errors (e.g. Postgres restart) no longer flood logs with full stack traces on each retry attempt; the error message is preserved on one line.
-
Fix
resume_flow()marking the wrongAgentStackFrameas resumed when a flow contains multiple sub-agent frames, which preventedrun_agent()from taking its resume branch. -
Fixed multiple Langfuse session IDs being created for a single Dialogue Understanding Test (DUT) run by using the original test-case sender ID as the session ID for all per-step LLM traces.
-
Upgrading from 3.15.x to 3.16.x no longer causes every subsequent message to fail with
InvalidFlowStepIdExceptionwhen a tracker was mid-flow at upgrade time and a flow step ID was renamed or removed. The flow executor now detects stale step IDs, logs a structured warning, removes the stale frame, and continues processing — rather than propagating the exception as aGraphComponentException.
[3.15.26] - 2026-06-02
Rasa Pro 3.15.26 (2026-06-02)
Bugfixes
- Fixed graph schema validation on Python 3.13+ when components use PEP 604 union type hints (e.g.
Domain | None), which previously raised a falseGraphSchemaValidationException. - Fixed MCP flow tool tracing metrics when
_execute_mcp_tool_callmutates the sharedinitial_eventslist in place by capturing the pre-mutation event count for output slicing, and by detecting failures fromInternalErrorPatternFlowStackFrameon the dialogue stack rather than from unchanged event list length. - Updated
idna,pipandurllib3to address security vulnerabilities.
[3.15.25] - 2026-06-01
Rasa Pro 3.15.25 (2026-06-01)
Bugfixes
- Fixed DIETClassifier training failures on GPU with TensorFlow 2.19 and Keras 3, where training could fail with an
InvalidArgumentErrorabout unsupportedSparseReshapeoperations on XLA GPU JIT devices.RasaModelnow inherits fromtensorflow.keras.Modelinstead of standalone Keras 3'sModel, so it uses the same Keras stack as the rest of Rasa's TensorFlow code and respectsTF_USE_LEGACY_KERAS=1.
[3.15.24] - 2026-05-22
Rasa Pro 3.15.24 (2026-05-22)
Bugfixes
- Fix an interrupted sub-agent not being properly resumed after the user answers "Yes" to
pattern_continue_interrupted. This is fixed by introducing a transientRESUMINGagent state that sits betweenINTERRUPTEDandWAITING_FOR_INPUT:resume_flow()now sets the agent frame toRESUMINGinstead of directly toWAITING_FOR_INPUT;run_agent()detects this and dispatches to_handle_resume_interrupted_agent, which replays the agent's last message and transitions the frame back toWAITING_FOR_INPUT. - Fixed a
KeyErrorinContinueInterruptedPatternFlowStackFrame.from_dictthat occurred when loading tracker events stored before the multi-interrupt fields were introduced. This caused repeated tracker store retries that blocked the server event loop, leading to liveness probe failures and pod restarts.
[3.15.23] - 2026-05-15
Rasa Pro 3.15.23 (2026-05-15)
Bugfixes
- Updated security-flagged dependencies:
litellm:1.82.4→1.84.0langchain:~0.3.27→~1.2.16langchain-community:~0.3.29→~0.4.1langchain-core:~0.3.81→~1.3.2langsmith:~0.6.3→~0.7.31langchain-qdrant:~0.2.1→~1.1.0langchain-openai: transitive →~1.2.1(new direct pin)langchain-text-splitters: transitive →~1.1.2(new direct pin)
- The
no_text_normalizationparameter is now correctly passed to the Rime TTS WebSocket connection, allowing users to skip text normalization to reduce latency.
[3.15.22] - 2026-05-06
Rasa Pro 3.15.22 (2026-05-06)
Bugfixes
-
Fixed a bug where sub-agent flows would end immediately after interruption resumption instead of re-invoking the agent.
When a flow containing a sub-agent call was interrupted (e.g., by a user digression) and then resumed via
pattern_continue_interrupted, the agent frame's state remainedINTERRUPTED. This caused the flow executor to skip the agent call and advance to END, triggeringpattern_completedprematurely.The agent frame state is now correctly reset to
WAITING_FOR_INPUTduring flow resumption, ensuring the sub-agent is re-invoked with full conversation history as expected. -
Fixed MCP tracing attribute extraction for router-based model groups so tracing no longer crashes with
KeyError('provider')when instrumenting ReAct sub-agentsend_messagecalls. -
When interruptions are enabled and bot is not speaking, user utterances should not be checked if they are passing min_words threshold.
[3.15.21] - 2026-04-24
Rasa Pro 3.15.21 (2026-04-24)
Bugfixes
- Fixed a bug where the validator was mutating the allowed values list of categorical slots in-place, causing
Noneentries to accumulate in slots used across multiple flows via subflows. This corrupted the flow retrieval FAISS embeddings during training. - Fixed multi-agent flows looping back to an agent call when the top stack frame was interrupted instead of waiting for input, which could leave multiple agents active and fail graph execution. The loop-back shortcut now applies only when the agent frame is waiting for user input.
- Fixed tracing span attributes for LLM components that use model groups.
Spans now carry the correct model group ID and, for router groups, the representative model's attributes (preferring OpenAI when present for prompt token counting).
The
llm_is_router_groupattribute is also set on spans when a router group is active.
[3.15.20] - 2026-04-10
Rasa Pro 3.15.20 (2026-04-10)
Bugfixes
-
When interruptions are ENABLED, user message should be queued for processing only if it passes interruption criteria.
-
If interruptions are disabled, user message should be queued only if user speaks during collect step utterance.
Updated signature of following methods:
- send_start_marker:
send_start_marker(self, recipient_id: str)=>send_start_marker(self, marker_input: MarkerInput) - send_intermediate_marker:
send_intermediate_marker(self, recipient_id: str)=>send_intermediate_marker(self, marker_input: MarkerInput) - send_end_marker:
send_end_marker(self, recipient_id: str)=>send_end_marker(self, marker_input: MarkerInput) - send_marker_message:
send_marker_message(self, recipient_id: str)=>send_marker_message(self, marker_input: MarkerInput) - create_marker_message: create_marker_message(self, recipient_id: str) =>
create_marker_message(self, marker_input: MarkerInput) -> MarkerMessageOutput
where MarkerInput is a Pydantic-based class:
class MarkerInput(BaseModel):
recipient_id: str
marker_type: MarkerType
step_type: Optional[StepType] = None - send_start_marker:
-
Fixed validation incorrectly rejecting custom ContextualResponseRephraser subclasses configured as nlg.type in endpoints.yml. The validator now resolves the class and checks inheritance instead of only accepting the literal string "rephrase".
-
Updated
PyJWT,werkzeug,aiohttp,orjson,pyasn1,requests, andujsonto resolve security vulnerabilities.
[3.15.19] - 2026-04-02
Rasa Pro 3.15.19 (2026-04-02)
Improvements
-
Declared
safetensorsandkerasas optional NLU extras (pip install 'rasa-pro[nlu]'orfull), so minimal installs no longer pull them in directly.regexis also declared optional and listed under those extras for consistency withWhitespaceTokenizer, but it remains installed on most minimal installs because the base dependencytiktoken(used by the LLM stack) depends onregex.The affected code paths lazy-import
safetensorsandregex; if either package is not installed, they raiseMissingDependencyExceptionwith install instructions.kerasis only pulled in for the TensorFlow model stack (rasa.utils.tensorflow.models), so it is optional for the same minimal-install story assafetensors. -
Improved sub-agent call steps that use
exit_if: when the same ReAct agent runs again in one conversation, slots named inexit_ifare cleared so a new run does not reuse values from the last finished run. Ongoing multi-turn agent sessions (waiting for the next user message) are unchanged.
Bugfixes
-
When an agent or MCP tool call returns a fatal error (e.g. internal server error), the user no longer receives two bot messages. Previously both the internal error message ("Sorry, I am having trouble with that...") and the flow-cancelled message ("Okay, stopping...") were shown. Now only the internal error message is shown; the cancel pattern is not pushed for system-initiated failures, so the flow is still marked ended for tracking but the confusing cancel utterance is omitted.
-
Add rephrase endpoint validation by treating defaults-only misconfiguration as warning and user-defined rephrase misconfiguration as error.
-
Improved OpenTelemetry histograms for MCP agent LLM usage:
mcp_agent_llm_prompt_token_usageandmcp_agent_llm_response_durationnow record a consistent, call-scoped set of attributes (agent_name,execution_context, andprotocol_type), making metrics easier to aggregate. -
Upgrade
langsmithdependency to 0.6.3 to address CVE-2026-25528. -
Fixed three bugs in
ConcurrentRedisLockStorethat caused anIndexError: deque index out of rangecrash in the PII anonymization and deletion cron jobs under multi-replica deployments.get_lock()now returnsNonewhen no ticket keys exist in Redis (all tickets had expired), instead of returning an emptyConcurrentTicketLockobject that caused downstream callers to crash.save_lock()now skips the Redis write when the ticket has already expired (TTL ≤ 0), preventing aResponseErrorfrom Redis.save_lock()previously passed the absolute epoch expiry timestamp as the RedisEXTTL, resulting in ticket keys that effectively never expired (~55 years). The TTL is now correctly computed as a relative duration in seconds.
-
Fixed correction reset when a user answers the active collect slot and corrects another slot in the same turn.
CorrectSlotsCommand.create_correction_frameno longer chooses the reset step only from slots in the correction payload. It also considers the current collect-information step and picks the earlier collect step in flow order, so the stack resets to the question currently being asked instead of jumping ahead to a later slot’s collect step (which skipped validation for the new value on the active slot). -
When interruptions are ENABLED, user message should be queued for processing only if it passes interruption criteria.
[3.15.18] - 2026-03-16
Rasa Pro 3.15.18 (2026-03-16)
Bugfixes
- Restarted task-oriented ReAct agents no longer exit immediately. When an agent is restarted, the previous run's user/assistant messages are now marked in the conversation so the model does not set slots from them; the system prompt instructs the agent to treat the current interaction as a fresh start for slot collection.
- When an A2A task has status
input_required, Rasa now populatesAgentOutput.structured_resultsfrom bothtask.artifactsand DataParts intask.status.message.parts. Previously only the text message was returned and structured data was omitted, so clients can now process artifact data when the agent is waiting for user input. - Fix PII redaction of user or bot messages when slot values do not match the original message text. This can occur when the original messages are multi-line or TTS-style bot read-backs.
- Update setuptools to 80.10.2 to address vulnerability https://osv.dev/vulnerability/DEBIAN-CVE-2026-23949. Replaced randomname with duoname (no dependencies) library.
- Fixed the backend tracing wrapper (e.g., Jaeger or OTLP) around send_message to correctly forward the output_channel argument to the underlying implementation.
[3.15.17] - 2026-03-11
Rasa Pro 3.15.17 (2026-03-11)
Deprecations and Removals
- Removed an explicit deprecation warning for the license varible
RASA_PRO_LICENSEto provide clarity that we will continue to support both this and the newerRASA_LICENSEvariable for the forseeable future.
Bugfixes
-
Fixes MCP tool result handling to now process results that contain only
structuredContent(and no or emptycontent). Previously, an emptycontentfield caused the result to be skipped and slots were not set fromstructuredContent. -
Downgraded the A2A polling "waiting to poll again" log from ERROR to INFO so normal polling no longer triggers false alerts.
-
SQL tracker store:
update()now supports a content-only path when the timestamp-based delete removes no rows (e.g. anonymization: same timestamps, content changed). In that case, the store either updates existing event rows in place where content differs or performs a full replace if event counts differ, so anonymized content is persisted correctly in a single atomic transaction.Anonymization cron job: the privacy manager now uses
update(updated_tracker)for anonymization instead of delete-then-save. SQL tracker store behavior is aligned with MongoDB, Redis and DynamoDB (overwrite semantics), and anonymization with SQL completes in one atomic operation without a separate delete/save sequence. -
Prevent
JsonPatchConflictexceptions raised when tracker is split in sub-sessions during PII anonymization cron jobs. Replace usage of a utility function that was recreating tracker objects using sub-sessions with an approach retrieving list of events for each sub-session instead.
[3.15.16] - 2026-03-06
Rasa Pro 3.15.16 (2026-03-06)
Bugfixes
- When a flow had Agent A → flow steps → Agent B and the user restarted Agent A while Agent B was already started (then interrupted), execution after the restarted Agent A completed would jump back to Agent B and skip the flow steps between A and B. Flow steps between agents are now executed correctly, and the previously interrupted Agent B is resumed instead of started from scratch.
- Channel specific silence_timeout can now be set in credentials file. Fixes the type error. If silence_timeout is not set the channel will use global value.
[3.15.15] - 2026-03-03
Rasa Pro 3.15.15 (2026-03-03)
Bugfixes
-
- Kafka event broker background polling thread caused test hangs and didn't allow the process to exit: The background poll thread is now a daemon thread, so the process can terminate when the broker is not closed explicitly (e.g. in tests or after an abrupt exit). The
close()method uses a 5-second join timeout so it does not block forever if the poll thread is stuck (e.g. when the broker is unreachable). - Background polling: The poll loop now runs for the whole lifetime of the broker, even before the producer is created. When the producer is not ready, the loop sleeps briefly instead of exiting. This allows the IAM OAuth callback to be triggered when using SASL_SSL with AWS IAM (MSK), so tokens can be refreshed as the library calls
poll(). - Connection keepalive (optional): New broker options
socket_keepalive_enable,reconnect_backoff_ms,reconnect_backoff_max_ms, andtopic_metadata_refresh_interval_mslet you reduce idle connection drops. Whensocket_keepalive_enableis true, these are passed to the underlying producer.
- Kafka event broker background polling thread caused test hangs and didn't allow the process to exit: The background poll thread is now a daemon thread, so the process can terminate when the broker is not closed explicitly (e.g. in tests or after an abrupt exit). The
-
Fixes race conditions in PII cron jobs by requiring a LockStore for BackgroundPrivacyManager and acquiring a per-sender_id lock while anonymization/deletion jobs read-modify-write trackers.
Implemented measures to defend against JSON patch issues and ensure correct event order.
- Deletion cron job: When reconstructing the tracker from retained events after deleting old sessions, the deletion
job now catches
JsonPatchExceptionandJsonPointerException(e.g. from invalid or inconsistent dialogue stack updates). On failure, the tracker is left unchanged and an error is logged instead of overwriting or deleting data, so no data loss occurs. Users can resolve stack-related issues by appending aRestartedevent to the tracker if needed. - Anonymization cron job: Events from already-anonymized, processed, and ineligible sessions are now sorted by timestamp before rebuilding the tracker, with original index used as a tie-breaker when timestamps are identical. This keeps replay order chronologically consistent and ensures dialogue stack updates and other order-dependent events are applied in the correct sequence.
- Deletion cron job: When reconstructing the tracker from retained events after deleting old sessions, the deletion
job now catches
-
ReAct agents now filter conversation events to user and bot utterances before building assistant and user role messages, and the default context limit is 10 utterance messages. Previously, the last 20 events were taken first and then filtered, so fewer user and assistant messages were included in the context.
[3.15.14] - 2026-02-26
Rasa Pro 3.15.14 (2026-02-26)
Bugfixes
- The MCP task agent now includes slot changes in the agent output when the state is
INPUT_REQUIREDor when max iterations is reached. Previously, slots set via set_slot tools were updated in memory but not forwarded in the output, so they were not persisted until exit conditions were met.
[3.15.13] - 2026-02-25
Rasa Pro 3.15.13 (2026-02-25)
Bugfixes
- Upgraded
litellmto 1.81.15 so thatstrict: Truecan be passed to Bedrock and tool calling has the same guarantees as with OpenAI. Upgradedopenaito >=2.8.0 to satisfy litellm's dependency. - Unquoted environment variable references for MCP and A2A OAuth credentials (
client_id,client_secret) inendpoints.ymlare now accepted. Previously, training failed unless these values were wrapped in double quotes (e.g."${MCP_CLIENT_SECRET}"). - Move MCP task agent exit condition evaluation to after
process_output, so thatSlotSetevents added by customprocess_outputimplementations are considered when checkingexit_ifconditions.
[3.15.12] - 2026-02-23
Rasa Pro 3.15.12 (2026-02-23)
Bugfixes
-
E2E fixture resolution and conftest hierarchy:
Fixture resolution now uses a conftest-style hierarchy, with local overrides taking precedence over global fixtures. This is a change from the previous behavior where all fixtures were merged into a single list, which could lead to silent data loss if duplicate fixture names were used. Now, every test case has its own resolved set of fixtures, and duplicate fixture names are allowed when the intent is "override".
Details:
- Conftest-style hierarchy: Fixtures can be defined at root or folder level (e.g.
conftest.yml/conftest.yaml); all e2e tests under that path see them. - Single-file run parity: Running one test file resolves fixtures the same way as when that file is run as part of the full suite (global/conftest fixtures are loaded for that file’s path).
- Runtime namespace: Each test case has its own resolved set of fixtures; there is no shared mutable fixture state between tests. Duplicate fixture names in different files are allowed when the intent is “override” (no need to remove or rename for full-suite runs).
- Override semantics: Local (file-level) fixtures override folder-level; folder-level overrides root. Within a single file, duplicate fixture names remain an error.
- Conftest-style hierarchy: Fixtures can be defined at root or folder level (e.g.
-
Update cryptography dependency to 46.0.5 to address CVE-2026-26007. Update pillow dependency to 12.1.1 to address CVE-2026-25990. Update pyasn1 dependency to 0.6.2 to address CVE-2026-23490. Update python-multipart dependency to 0.0.22 to address CVE-2026-24486.
[3.15.11] - 2026-02-18
Rasa Pro 3.15.11 (2026-02-18)
Bugfixes
- Upgrade
litellmto 1.80.0. - Remove config file content from endpoint read success logs to prevent sensitive data exposure.
- Update
protobufto v5.29.6 to address CVE-2026-0994. Updatewheelto v0.46.3 to address CVE-2026-24049.
[3.15.10] - 2026-02-10
Rasa Pro 3.15.10 (2026-02-10)
Improvements
- Flows can now link to
pattern_search(e.g. to trigger RAG or branch on knowledge-based search).
Bugfixes
- Added interruption handling for final transcripts. Moved interruption check to eliminate interruption handling delay.
- Fix Enterprise Search Policy triggering
utter_ask_rephraseinstead ofutter_no_relevant_answer_foundwhen the vector store search returns no matching documents. Thepattern_cannot_handlenow correctly receives thecannot_handle_no_relevant_answeras acontext.reasonin all cases where no relevant answer is found, not only when the optional relevancy check rejects the answer.
[3.15.9] - 2026-02-05
Rasa Pro 3.15.9 (2026-02-05)
Bugfixes
- Upgrade Keras to 3.12.1 to address CVE-2026-0897.
- Fixed
languageparameter in RimeTTS configuration to be passed correctly to the Rime API. Temporarily changed RimeTTS to non-streaming input mode as a workaround for a Rime API bug that impacts conversation experience; audio is now generated from the complete response at once.
[3.15.8] - 2026-01-26
Rasa Pro 3.15.8 (2026-01-26)
Bugfixes
- Update azure-core to 1.38.0 to address CVE-2026-21226.
[3.15.7] - 2026-01-21
Rasa Pro 3.15.7 (2026-01-21)
Bugfixes
- Fixed e2e test coverage report to correctly track coverage per flow. Each flow now appears as a separate entry with accurate coverage percentages. Additionally,
call/linksteps andcollectsteps with prefilled slots are now properly marked as visited. - Fix OAuth2AuthStrategy to use URL-encoded parameters with Basic Authentication to fetch access token
[3.15.6] - 2026-01-15
Rasa Pro 3.15.6 (2026-01-15)
Bugfixes
- Fixed an issue where storing documents in FAISS individually could hit the token limit. Now, documents are stored in batches to avoid exceeding the token limit.
- Throw error when duplicate fixtures are found in the same file or across files.
SessionEndeddoes not reset the tracker anymore.- Updated
werkzeug,aiohttp,filelock,fonttools,marshmallow,urllib3andlangchain-coreto resolve security vulnerabilities.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.5] - 2025-12-29
Rasa Pro 3.15.5 (2025-12-29)
Bugfixes
- Include response button titles in conversation history in prompts of LLM based components.
- Fix OpenTelemetry exporter
Invalid type <class 'NoneType'> of value Noneerror when recording the request duration metric for requests made from Rasa server to the custom action server. This error occurred because the url parameter was not being passed to the method that records the request duration metric, resulting in a NoneType value. - Fix DUT fails with AttributeError when running with custom CommandGenerator
[3.15.4] - 2025-12-19
Rasa Pro 3.15.4 (2025-12-19)
Bugfixes
- Fixed token expiration validation failing on servers running in non-UTC timezones. Token expiration checks now use timezone-aware UTC datetimes consistently, preventing premature "access token expired" errors on systems in timezones like UTC+8.
[3.15.3] - 2025-12-11
Rasa Pro 3.15.3 (2025-12-11)
Bugfixes
- Fix potential Tensor shape mismatch error in
TEDPolicyandDIETClassifier. - Update
mcpversion to~1.23.0to address security vulnerability CVE-2025-66416. - Fix bug in
CommandPayloadReaderwhere regex matching did not account for list slots, leading to incorrect parsing of slot keys and values. Now, slot names and values are correctly extracted even if a list is provided. - Previously,
DialogueStateTracker.has_coexistence_routing_slotcould incorrectly returnTruewhen the tracker was created without domain slots (i.e., usingAnySlotDict), becauseAnySlotDictpretends all slots exist. Now, the property returns False in that case, so the routing slot is only considered present if it is actually defined in the domain. - Fix LLM prompt template loading to raise an error instead of just printing a warning when a custom prompt file is missing or cannot be read.
- Fix
AttributeError: 'str' object has no attribute 'pop'when usingKnowledgeAnswerCommandwith tracing enabled. - Fix
UnboundLocalErrorinE2ETestRunner._handle_fail_diffthat caused e2e tests to crash when processingslot_was_not_setassertion failures. - Fixed button payloads with nested parentheses (e.g.,
/SetSlots(slot=value)) not being parsed correctly inrasa shell. The payload was incorrectly stripped of its/SetSlotsprefix, causing it to be treated as text instead of a slot-setting command. - Add missing deprecation warning for legacy
RASA_PRO_LICENSEenvironment variable. Update license validation error messages to reference the actual environment variable used.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.2] - 2025-12-04
Rasa Pro 3.15.2 (2025-12-04)
Bugfixes
- Fix agentic prompt template to access slots directly.
- Disable LLM health check for Enterprise Search Policy when generative search is disabled (i.e. use_generative_llm is False).
- Fix deduplication of collect steps in cases where the same slot was called in different flows.
- Cancel active flow before triggering internal pattern error during a custom action failure.
- Fix bug with the missing
language_datamodule by installinglangcodeswith thedataextra dependency.
[3.15.1] - 2025-12-02
Rasa Pro 3.15.1 (2025-12-02)
Bugfixes
- Raise validation error when duplicate slot definitions are found across domains.
- Raise validation error when a slot with an initial value set is collected by a flow collect step
which sets
asks_before_fillingtotruewithout having a corresponding collect utterance or custom action. - Update
pipto fix security vulnerability. - Fix AgentToolSchema._ensure_property_types() correctly preserves structural keywords ($ref, anyOf, oneOf, etc.)
Miscellaneous internal changes
Miscellaneous internal changes.
[3.15.0] - 2025-11-26
Rasa Pro 3.15.0 (2025-11-26)
Features
-
Added Langfuse integration for tracing LLM and embedding calls. All LLM-based components (Command Generators, Rephraser, Enterprise Search Policy, ReAct Sub Agent) and embedding operations are automatically traced when Langfuse is configured. Each trace includes, among other things, input/output, latency, token usage, cost, session ID, and component name.
To get started, configure Langfuse by adding a
langfuseentry to thetracingsection inendpoints.yml.Example:
tracing:
- type: langfuse
public_key: ${LANGFUSE_PUBLIC_KEY}
private_key: ${LANGFUSE_PRIVATE_KEY}
host: https://cloud.langfuse.comCustom components can override
get_llm_tracing_metadata()to customize metadata. -
Added support for triggering clarification when multiple
StartFlowcommands are generated with no active flow. To enable this feature, set theCLARIFY_ON_MULTIPLE_START_FLOWSenvironment variable toTrue. -
Adds DTMF (Dual-Tone Multi-Frequency) input support for collect steps in flows. Voice channels can now configure DTMF collection with options for digit length, finish key, and audio input control. The feature gracefully handles non-voice channels by skipping DTMF configuration when call_state is not initialized.
-
Added new CLI option
-f, --e2e-failed-teststo export failed e2e tests to a file that can be directly used to re-run only those tests. It accepts an optional filename or directory path, with automatic timestamping to prevent overwriting previous test runs. -
Added support for including current datetime information by default in LLM prompts. This feature enables LLM-based components to include date and time context in their prompts, helping the model understand temporal references and provide time-aware responses.
Components Updated:
CompactLLMCommandGeneratorSearchReadyLLMCommandGeneratorEnterpriseSearchPolicyMCPOpenAgent(with timezone support)MCPTaskAgent(with timezone support)
Prompt Template Updates: When
include_date_timeis enabled, prompts include a "Date & Time Context" section showing:- Current date (formatted as "DD Month, YYYY")
- Current time (formatted as "HH:MM:SS" with timezone)
- Current day of the week
E2E Testing Support: For deterministic testing, you can mock the datetime using the
mocked_datetimeslot in e2e test fixtures. The mocked datetime value must be provided in ISO 8601 format (e.g.,"2024-01-15T10:30:00+00:00"). The e2e test runner validates the format and raises aValidationErrorif the value is invalid.
Improvements
-
Updated
pattern_completedto check wether the user wants to continue the conversation or not by adding acollectstep to the pattern. -
The
OutputChannelis now provided to policies through the graph inputs. This enables any policy to access the output channel and send messages directly to the user, which is particularly useful for sending intermediate or filler messages. -
Allow LLM responses to be streamed to the output channel for any generative responses. This currently only applies to Enterprise Search Policy and Rephraser. Output channels that support streaming should handle duplicate message prevention when a response has already been streamed. Voice output channels (Browser Audio, Genesys, Audiocodes Stream, and Jambonz Stream) have been updated to use the streaming tokens to prepare the Text-to-Speech audio stream instead of waiting for the complete response to be generated. These changes are backward compatible; any existing channel does NOT need any additional changes. However, it can add new methods to make use of the streaming responses whenever they are available.
-
Enhanced the clarification pattern with a configurable limit on the number of flows in the clarification options. Added a new slot
max_clarification_optionsto thedefault_flows_for_patterns.ymlwith an initial value of3which can be changed by overriding theinitial_valueof the slotmax_clarification_optionsto customize the maximum number of flows displayed during clarification. -
Enhanced the clarification pattern to handle empty clarification options. Added
utter_clarification_no_options_rasaresponse todefault_flows_for_patterns.yml, triggered whenpattern_clarificationreceives aClarifyCommandwith no options. -
Allow e2e test results CLI flag
-o,--e2e-resultsto be specified with a custom path. If the flag is used without a path, the default pathtests/is used. -
Enable generative responses dispatched by custom actions to be evaluated by
generative_response_is_groundedandgenerative_response_is_relevantassertions in E2E testing. In order for the E2E testing framework to evaluate generative responses dispatched by custom actions, you must add the custom action dispatching the generative bot response to theutter_sourcekey of the appopriate assertion in the E2E test case. For example, if you have a custom actionaction_generate_summarythat generates a summary using a generative model, you can add the following assertion to your E2E test case:test_cases:
- test_case: Generate summary for user query
steps:
- user: |
Can you provide a summary of the latest news on climate change?
assertions:
- generative_response_is_grounded:
threshold: 0.8
utter_source: action_generate_summary
ground_truth: <insert_ground_truth_summary_here>
- generative_response_is_relevant:
threshold: 0.9
utter_source: action_generate_summary -
Allow
flow_startedandpattern_clarification_containsE2E testing assertions to define the operator i.e.all,any, for matching multiple flow_id values. Previously,flow_startedonly supported a single flow_id value, whilepattern_clarification_containsdefaulted toall. Introduce new format to specify the operator explicitly:test_cases:
- test_case: user is asked to clarify contact-related message
steps:
- user: contacts
assertions:
- pattern_clarification_contains:
operator: "any"
flow_ids:
- remove_contact
- list_contacts
- add_contact
- update_contact
- test_case: user removes a missing contact
steps:
- user: i want to remove a contact
assertions:
- flow_started:
operator: "any"
flow_ids:
- remove_contact
- update_contactThe
operatorfield can take valuesallorany, determining whether all specified flow_ids must match or if any one of them is sufficient.The previous format for these two assertions remains unchanged for backward compatibility, however it has been deprecated and will be removed in a future major release.
-
Updated the default model and voice of Cartesia TTS, using
sonic-3and voice ID American English Katie. -
Move commit messages to top of the SSE
-
Allow trigerring empty
Clarify Commandwithout flow options.
Bugfixes
- Run action_session_start if tracker ends with SessionEnded event.
- Fixed PostgreSQL
UniqueViolationerror when running an assistant with multiple Sanic workers. - Fix Kafka producer creation failing when SASL mechanism is specified in lowercase. The SASL mechanism is now case-insensitive in the Kafka producer configuration.
- Fix issue where the validation of the assistant files continued even when the provided domain was invalid and was being loaded as empty. The training or validation command didn't exit because the final merged domain contained only the default implementations for patterns, slots and responses and therefore passed the check for being non-empty.
- Trigger pattern_internal_error in a CALM assistant when a custom action fails during execution.
- Create AWS Bedrock / Sagemaker client only if the LLM healthcheck environment variable is set. If the environment variable is not set, validate that required credentials are present.
- Update
langchain-coreversion to~0.3.80to address security vulnerability CVE-2025-65106.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.14.29] - 2026-07-15
Rasa Pro 3.14.29 (2026-07-15)
Miscellaneous internal changes
Miscellaneous internal changes.
[3.14.28] - 2026-07-07
Rasa Pro 3.14.28 (2026-07-07)
Deprecations and Removals
-
Breaking change: Removed the deprecated
LanguageModelFeaturizerNLU component and its internal HuggingFace integration (rasa.nlu.utils.hugging_face). This removes Rasa's direct dependency on thetransformerslibrary, which was affected by CVE-2026-1839 (arbitrary code execution via a malicious checkpoint file).Assistants whose NLU pipeline references
LanguageModelFeaturizermust migrate to a supported featurizer (for exampleConveRTFeaturizer, or a CALM pipeline usingLLMCommandGenerator) before upgrading.transformersis no longer a first-party component dependency. It remains a transitive dependency ofglinerand is now constrained to>=5.0.0(which contains the fix) wherever it is installed — i.e. on thegliner-based extras (full,pii). The standalonetransformersextra and thesentencepiecedependency have also been removed.
[3.14.27] - 2026-06-23
Rasa Pro 3.14.27 (2026-06-23)
Bugfixes
- Bumped
langchain-classic(~1.0.7, fixes CVE-2026-45134) andstarlette(~1.3.1, fixes CVE-2026-54283) on 3.14.x to resolve high-severity dependency security vulnerabilities. Also raised thelangchain-corefloor to~1.3.3, which is required bylangchain-classic 1.0.7.
[3.14.26] - 2026-06-22
Rasa Pro 3.14.26 (2026-06-22)
Improvements
- A2A agent validation now requires
TICKET_LOCK_LIFETIMEto be at least as long asmax_polling_time, preventing the conversation lock from expiring while A2A polling is still in progress. - Added
configure_litellm_for_rasa()in a lightweight_litellm_configmodule to centralize LiteLLM setup: it suppresses print-based provider-list debug footers vialitellm.suppress_debug_infoand sets the LiteLLM logger to WARNING, reducing log noise during LLM, embedding, and router client initialization without pulling in AWS provider dependencies.
Bugfixes
- Fixed MCP task agents exposing
set_slot_*tools and listing slots in the task prompt for controlled-only or NLU-only slots inexit_if. Added aslot_mappings_allow_llm_fillhelper so tool exposure, prompt rendering, andshould_slot_be_setuse the same rule for whether the LLM may fill a slot from its mappings. - Fixed
rasa data validateincorrectly rejectingcallsteps that target subagents or MCP tools when no agent configuration is loaded, instead of emitting a warning. - Fixed
suppress_logsso that concurrent async calls no longer corrupt the process-wide log level, preventing logs from disappearing permanently until pod restart. - Refresh the AWS ElastiCache IAM presigned URL before each Redis (re)connect when within 60 seconds of expiry, so lock store and timer store operations no longer fail after >30 minutes of pro-server idleness.
- Message processing no longer crashes with
ValueError: Could not find a user flow frame to cancelwhen an action fails (for exampleaction_session_startreturning HTTP 413) on a session whose residual dialogue stack contains only pattern frames; the internal-error pattern is pushed without attempting to cancel a non-existent user flow. - Upgrade
langsmithdependency to 0.8.5 andstarletteto 1.0.1 to address CVE-2026-45134 and CVE-2026-48710.
Miscellaneous internal changes
Miscellaneous internal changes.
[3.14.25] - 2026-06-04
Rasa Pro 3.14.25 (2026-06-04)
Bugfixes
-
Fixed a spurious "Fatal error on SSL transport" traceback printed to stderr on Windows after
rasa test e2ecompletes by explicitly closing litellm's shared httpx sessions before the event loop shuts down. -
Fixed a crash in rasa-tools where training an assistant with a sub-agent MCP server configured caused a
RuntimeError: Attempted to exit cancel scope in a different task than it was entered in, crashing the stdio server and making the next tool call fail withMCP error -32000: Connection closed. -
Fix two bugs causing random crashes and resource leaks when running Rasa with --workers 2+: a pre-fork event loop left open during JWT setup, and litellm async HTTP clients not being closed on worker shutdown.
Root cause — Sanic uses fork-based multi-worker mode (legacy=True). create_app() was calling asyncio.new_event_loop() + set_event_loop() in the main process to satisfy sanic-jwt's Initialize(), then leaving the loop open. Forked workers inherited its kqueue/epoll file descriptors, conflicting with each worker's own loop (~50% crash at startup). Separately, close_resources() never called litellm.close_litellm_async_clients(), leaving cached async HTTP clients open when workers exit.
-
An explicitly configured
api_keyin therasaprovider model config now takes precedence over the Rasa license, allowing custom endpoints to authenticate with their own credentials. -
Fixed graph schema validation on Python 3.13+ when components use PEP 604 union type hints (e.g.
Domain | None), which previously raised a falseGraphSchemaValidationException. -
Transient tracker store connection errors (e.g. Postgres restart) no longer flood logs with full stack traces on each retry attempt; the error message is preserved on one line.
-
Fix
resume_flow()marking the wrongAgentStackFrameas resumed when a flow contains multiple sub-agent frames, which preventedrun_agent()from taking its resume branch. -
Fixed multiple Langfuse session IDs being created for a single Dialogue Understanding Test (DUT) run by using the original test-case sender ID as the session ID for all per-step LLM traces.
-
Fixed MCP flow tool tracing metrics when
_execute_mcp_tool_callmutates the sharedinitial_eventslist in place by capturing the pre-mutation event count for output slicing, and by detecting failures fromInternalErrorPatternFlowStackFrameon the dialogue stack rather than from unchanged event list length. -
Updated
idna,pipandurllib3to address security vulnerabilities. -
Update Cartesia to use the model
sonic-latestfromsonic-englishwhich has been sunsetted. Also updated the API version to2026-03-01from2024-06-10 -
Upgrading from 3.15.x to 3.16.x no longer causes every subsequent message to fail with
InvalidFlowStepIdExceptionwhen a tracker was mid-flow at upgrade time and a flow step ID was renamed or removed. The flow executor now detects stale step IDs, logs a structured warning, removes the stale frame, and continues processing — rather than propagating the exception as aGraphComponentException.
[3.14.24] - 2026-06-01
Rasa Pro 3.14.24 (2026-06-01)
Bugfixes
- Fixed DIETClassifier training failures on GPU with TensorFlow 2.19 and Keras 3, where training could fail with an
InvalidArgumentErrorabout unsupportedSparseReshapeoperations on XLA GPU JIT devices.RasaModelnow inherits fromtensorflow.keras.Modelinstead of standalone Keras 3'sModel, so it uses the same Keras stack as the rest of Rasa's TensorFlow code and respectsTF_USE_LEGACY_KERAS=1.
[3.14.23] - 2026-05-22
Rasa Pro 3.14.23 (2026-05-22)
Bugfixes
- Fix an interrupted sub-agent not being properly resumed after the user answers "Yes" to
pattern_continue_interrupted. This is fixed by introducing a transientRESUMINGagent state that sits betweenINTERRUPTEDandWAITING_FOR_INPUT:resume_flow()now sets the agent frame toRESUMINGinstead of directly toWAITING_FOR_INPUT;run_agent()detects this and dispatches to_handle_resume_interrupted_agent, which replays the agent's last message and transitions the frame back toWAITING_FOR_INPUT. - Fixed a
KeyErrorinContinueInterruptedPatternFlowStackFrame.from_dictthat occurred when loading tracker events stored before the multi-interrupt fields were introduced. This caused repeated tracker store retries that blocked the server event loop, leading to liveness probe failures and pod restarts.
[3.14.22] - 2026-05-15
Rasa Pro 3.14.22 (2026-05-15)
Bugfixes
-
Updated security-flagged dependencies:
litellm:~1.81.15→1.84.0langchain:~0.3.27→~1.2.16langchain-community:~0.3.29→~0.4.1langchain-core:~0.3.81→~1.3.2langsmith:~0.6.3→~0.7.31qdrant-client:~1.9.1→~1.17.1langchain-qdrant: transitive →~1.1.0(new direct pin)langchain-openai: transitive →~1.2.1(new direct pin)langchain-text-splitters: transitive →~1.1.2(new direct pin)
-
Fixed a bug where sub-agent flows would end immediately after interruption resumption instead of re-invoking the agent.
When a flow containing a sub-agent call was interrupted (e.g., by a user digression) and then resumed via
pattern_continue_interrupted, the agent frame's state remainedINTERRUPTED. This caused the flow executor to skip the agent call and advance to END, triggeringpattern_completedprematurely.The agent frame state is now correctly reset to
WAITING_FOR_INPUTduring flow resumption, ensuring the sub-agent is re-invoked with full conversation history as expected. -
Fixed MCP tracing attribute extraction for router-based model groups so tracing no longer crashes with
KeyError('provider')when instrumenting ReAct sub-agentsend_messagecalls.
[3.14.21] - 2026-04-24
Rasa Pro 3.14.21 (2026-04-24)
Bugfixes
- Fixed a bug where the validator was mutating the allowed values list of categorical slots in-place, causing
Noneentries to accumulate in slots used across multiple flows via subflows. This corrupted the flow retrieval FAISS embeddings during training. - Fixed multi-agent flows looping back to an agent call when the top stack frame was interrupted instead of waiting for input, which could leave multiple agents active and fail graph execution. The loop-back shortcut now applies only when the agent frame is waiting for user input.
- Fixed validation incorrectly rejecting custom ContextualResponseRephraser subclasses configured as nlg.type in endpoints.yml. The validator now resolves the class and checks inheritance instead of only accepting the literal string "rephrase".
- Updated
PyJWT,werkzeug,aiohttp,orjson,pyasn1,requests, andujsonto resolve security vulnerabilities. - Fixed tracing span attributes for LLM components that use model groups.
Spans now carry the correct model group ID and, for router groups, the representative model's attributes (preferring OpenAI when present for prompt token counting).
The
llm_is_router_groupattribute is also set on spans when a router group is active.
[3.14.20] - 2026-04-02
Rasa Pro 3.14.20 (2026-04-02)
Improvements
-
Declared
safetensorsandkerasas optional NLU extras (pip install 'rasa-pro[nlu]'orfull), so minimal installs no longer pull them in directly.regexis also declared optional and listed under those extras for consistency withWhitespaceTokenizer, but it remains installed on most minimal installs because the base dependencytiktoken(used by the LLM stack) depends onregex.The affected code paths lazy-import
safetensorsandregex; if either package is not installed, they raiseMissingDependencyExceptionwith install instructions.kerasis only pulled in for the TensorFlow model stack (rasa.utils.tensorflow.models), so it is optional for the same minimal-install story assafetensors. -
Improved sub-agent call steps that use
exit_if: when the same ReAct agent runs again in one conversation, slots named inexit_ifare cleared so a new run does not reuse values from the last finished run. Ongoing multi-turn agent sessions (waiting for the next user message) are unchanged.
Bugfixes
-
When an agent or MCP tool call returns a fatal error (e.g. internal server error), the user no longer receives two bot messages. Previously both the internal error message ("Sorry, I am having trouble with that...") and the flow-cancelled message ("Okay, stopping...") were shown. Now only the internal error message is shown; the cancel pattern is not pushed for system-initiated failures, so the flow is still marked ended for tracking but the confusing cancel utterance is omitted.
-
Add rephrase endpoint validation by treating defaults-only misconfiguration as warning and user-defined rephrase misconfiguration as error.
-
Upgrade
langsmithdependency to 0.6.3 to address CVE-2026-25528. -
Fixed three bugs in
ConcurrentRedisLockStorethat caused anIndexError: deque index out of rangecrash in the PII anonymization and deletion cron jobs under multi-replica deployments.get_lock()now returnsNonewhen no ticket keys exist in Redis (all tickets had expired), instead of returning an emptyConcurrentTicketLockobject that caused downstream callers to crash.save_lock()now skips the Redis write when the ticket has already expired (TTL ≤ 0), preventing aResponseErrorfrom Redis.save_lock()previously passed the absolute epoch expiry timestamp as the RedisEXTTL, resulting in ticket keys that effectively never expired (~55 years). The TTL is now correctly computed as a relative duration in seconds.
-
Fixed correction reset when a user answers the active collect slot and corrects another slot in the same turn.
CorrectSlotsCommand.create_correction_frameno longer chooses the reset step only from slots in the correction payload. It also considers the current collect-information step and picks the earlier collect step in flow order, so the stack resets to the question currently being asked instead of jumping ahead to a later slot’s collect step (which skipped validation for the new value on the active slot).
[3.14.19] - 2026-03-16
Rasa Pro 3.14.19 (2026-03-16)
Bugfixes
- Restarted task-oriented ReAct agents no longer exit immediately. When an agent is restarted, the previous run's user/assistant messages are now marked in the conversation so the model does not set slots from them; the system prompt instructs the agent to treat the current interaction as a fresh start for slot collection.
- When an A2A task has status
input_required, Rasa now populatesAgentOutput.structured_resultsfrom bothtask.artifactsand DataParts intask.status.message.parts. Previously only the text message was returned and structured data was omitted, so clients can now process artifact data when the agent is waiting for user input. - Fix PII redaction of user or bot messages when slot values do not match the original message text. This can occur when the original messages are multi-line or TTS-style bot read-backs.
- Update setuptools to 80.10.2 to address vulnerability https://osv.dev/vulnerability/DEBIAN-CVE-2026-23949. Replaced randomname with duoname (no dependencies) library.
[3.14.18] - 2026-03-11
Rasa Pro 3.14.18 (2026-03-11)
Deprecations and Removals
- Removed an explicit deprecation warning for the license varible
RASA_PRO_LICENSEto provide clarity that we will continue to support both this and the newerRASA_LICENSEvariable for the forseeable future.
Bugfixes
-
When a flow had Agent A → flow steps → Agent B and the user restarted Agent A while Agent B was already started (then interrupted), execution after the restarted Agent A completed would jump back to Agent B and skip the flow steps between A and B. Flow steps between agents are now executed correctly, and the previously interrupted Agent B is resumed instead of started from scratch.
-
Fixes MCP tool result handling to now process results that contain only
structuredContent(and no or emptycontent). Previously, an emptycontentfield caused the result to be skipped and slots were not set fromstructuredContent. -
Downgraded the A2A polling "waiting to poll again" log from ERROR to INFO so normal polling no longer triggers false alerts.
-
SQL tracker store:
update()now supports a content-only path when the timestamp-based delete removes no rows (e.g. anonymization: same timestamps, content changed). In that case, the store either updates existing event rows in place where content differs or performs a full replace if event counts differ, so anonymized content is persisted correctly in a single atomic transaction.Anonymization cron job: the privacy manager now uses
update(updated_tracker)for anonymization instead of delete-then-save. SQL tracker store behavior is aligned with MongoDB, Redis and DynamoDB (overwrite semantics), and anonymization with SQL completes in one atomic operation without a separate delete/save sequence. -
Prevent
JsonPatchConflictexceptions raised when tracker is split in sub-sessions during PII anonymization cron jobs. Replace usage of a utility function that was recreating tracker objects using sub-sessions with an approach retrieving list of events for each sub-session instead.
[3.14.17] - 2026-03-03
Rasa Pro 3.14.17 (2026-03-03)
Bugfixes
-
- Kafka event broker background polling thread caused test hangs and didn't allow the process to exit: The background poll thread is now a daemon thread, so the process can terminate when the broker is not closed explicitly (e.g. in tests or after an abrupt exit). The
close()method uses a 5-second join timeout so it does not block forever if the poll thread is stuck (e.g. when the broker is unreachable). - Background polling: The poll loop now runs for the whole lifetime of the broker, even before the producer is created. When the producer is not ready, the loop sleeps briefly instead of exiting. This allows the IAM OAuth callback to be triggered when using SASL_SSL with AWS IAM (MSK), so tokens can be refreshed as the library calls
poll(). - Connection keepalive (optional): New broker options
socket_keepalive_enable,reconnect_backoff_ms,reconnect_backoff_max_ms, andtopic_metadata_refresh_interval_mslet you reduce idle connection drops. Whensocket_keepalive_enableis true, these are passed to the underlying producer.
- Kafka event broker background polling thread caused test hangs and didn't allow the process to exit: The background poll thread is now a daemon thread, so the process can terminate when the broker is not closed explicitly (e.g. in tests or after an abrupt exit). The
-
Fixes race conditions in PII cron jobs by requiring a LockStore for BackgroundPrivacyManager and acquiring a per-sender_id lock while anonymization/deletion jobs read-modify-write trackers.
Implemented measures to defend against JSON patch issues and ensure correct event order.
- Deletion cron job: When reconstructing the tracker from retained events after deleting old sessions, the deletion
job now catches
JsonPatchExceptionandJsonPointerException(e.g. from invalid or inconsistent dialogue stack updates). On failure, the tracker is left unchanged and an error is logged instead of overwriting or deleting data, so no data loss occurs. Users can resolve stack-related issues by appending aRestartedevent to the tracker if needed. - Anonymization cron job: Events from already-anonymized, processed, and ineligible sessions are now sorted by timestamp before rebuilding the tracker, with original index used as a tie-breaker when timestamps are identical. This keeps replay order chronologically consistent and ensures dialogue stack updates and other order-dependent events are applied in the correct sequence.
- Deletion cron job: When reconstructing the tracker from retained events after deleting old sessions, the deletion
job now catches
-
ReAct agents now filter conversation events to user and bot utterances before building assistant and user role messages, and the default context limit is 10 utterance messages. Previously, the last 20 events were taken first and then filtered, so fewer user and assistant messages were included in the context.
[3.14.16] - 2026-02-26
Rasa Pro 3.14.16 (2026-02-26)
Bugfixes
- Upgraded
litellmto 1.81.15 so thatstrict: Truecan be passed to Bedrock and tool calling has the same guarantees as with OpenAI. Upgradedopenaito >=2.8.0 to satisfy litellm's dependency. - Unquoted environment variable references for MCP and A2A OAuth credentials (
client_id,client_secret) inendpoints.ymlare now accepted. Previously, training failed unless these values were wrapped in double quotes (e.g."${MCP_CLIENT_SECRET}"). - Move MCP task agent exit condition evaluation to after
process_output, so thatSlotSetevents added by customprocess_outputimplementations are considered when checkingexit_ifconditions. - The MCP task agent now includes slot changes in the agent output when the state is
INPUT_REQUIREDor when max iterations is reached. Previously, slots set via set_slot tools were updated in memory but not forwarded in the output, so they were not persisted until exit conditions were met.
[3.14.15] - 2026-02-23
Rasa Pro 3.14.15 (2026-02-23)
Bugfixes
-
Remove config file content from endpoint read success logs to prevent sensitive data exposure.
-
Update
protobufto v5.29.6 to address CVE-2026-0994. Updatewheelto v0.46.3 to address CVE-2026-24049. -
E2E fixture resolution and conftest hierarchy:
Fixture resolution now uses a conftest-style hierarchy, with local overrides taking precedence over global fixtures. This is a change from the previous behavior where all fixtures were merged into a single list, which could lead to silent data loss if duplicate fixture names were used. Now, every test case has its own resolved set of fixtures, and duplicate fixture names are allowed when the intent is "override".
Details:
- Conftest-style hierarchy: Fixtures can be defined at root or folder level (e.g.
conftest.yml/conftest.yaml); all e2e tests under that path see them. - Single-file run parity: Running one test file resolves fixtures the same way as when that file is run as part of the full suite (global/conftest fixtures are loaded for that file’s path).
- Runtime namespace: Each test case has its own resolved set of fixtures; there is no shared mutable fixture state between tests. Duplicate fixture names in different files are allowed when the intent is “override” (no need to remove or rename for full-suite runs).
- Override semantics: Local (file-level) fixtures override folder-level; folder-level overrides root. Within a single file, duplicate fixture names remain an error.
- Conftest-style hierarchy: Fixtures can be defined at root or folder level (e.g.
[3.14.14] - 2026-02-12
Rasa Pro 3.14.14 (2026-02-12)
- Upgrade
litellmto 1.80.0. - Fix Enterprise Search Policy triggering
utter_ask_rephraseinstead ofutter_no_relevant_answer_foundwhen the vector store search returns no matching documents. Thepattern_cannot_handlenow correctly receives thecannot_handle_no_relevant_answeras acontext.reasonin all cases where no relevant answer is found, not only when the optional relevancy check rejects the answer.
[3.14.13] - 2026-02-05
Rasa Pro 3.14.13 (2026-02-05)