Skip to main content
integrations.yml is required at the project root. It defines named model groups, the channels customers reach the agent through, optional MCP tool servers, and optional OpenTelemetry tracing and metrics. agent.yml orchestrator names which group runs the agent. The file is copied into the model archive at rasa train, and each section is read from the place that suits what it configures: The agent’s LLM and reference embedder use the same model-group syntax, but have different lifecycles. The LLM group is resolved from the live project at startup. Reference embeddings are resolved from the packaged snapshot because query vectors must match the vectors built at training time.
integrations.yml
That is a complete, working file. Everything else is optional.

Provider examples

agent.yml orchestrator.model_group names one of the groups below. orchestrator.max_prompt_tokens is optional and defaults to 8000. Provider, model, credentials, and provider-specific options belong on the group. A leftover llm: section is invalid. provider: openai, azure, and self-hosted have dedicated clients. Any other value is passed through to LiteLLM, so a provider LiteLLM supports works by naming it and its model. OpenAI
integrations.yml
Anthropic
integrations.yml
Google Gemini
integrations.yml
Azure OpenAI. Name the deployment rather than the model, and give the endpoint and API version:
integrations.yml
Self-hosted, OpenAI-compatible. For vLLM, Ollama, TGI, or anything else serving the OpenAI API shape. provider, model, and api_base are all required:
integrations.yml
model is the name your server advertises, and api_base points at the OpenAI-compatible route, usually ending in /v1. Omit api_key if the server takes no key. A present api_key: ${LOCAL_LLM_API_KEY} is sent to the provider even when that variable is unset (the unsubstituted ${…} string), so keyless servers must not declare the key.

Secrets

Sensitive values in config files use environment-variable references — never literal secrets. Write the whole field as ${ENV_VAR_NAME} with no extra text:
Put the real value in the process environment (for example a project .env that your shell loads before rasa train / rasa run). Unset ${VAR} placeholders are forwarded as-is to the provider; omit api_key for keyless self-hosted servers instead of pointing at a missing variable. On a model entry, these keys must use ${…} when present — including when nested under oauth:: rasa train and live LLM / embeddings load reject literal values for those keys.

channels

Declares the channels customers reach the agent through.
Each key is a channel name from the built-in channel registry. Values may be: The enabled flag is stripped before the remaining keys are handed to the channel. A non-boolean enabled, or an entry that is neither a mapping nor empty, raises at load.
rest and inspector are the practical minimum: rest is what the evaluation runner talks to, and inspector is required for rasa inspect. A project with no channels: block registers no channels at all.
${VAR} references inside channels: are expanded when the file is read, so channel credentials can come from the environment.

Voice channels

A voice channel takes asr: and tts: sub-mappings, and that is where speech recognition and synthesis are configured. Each takes a name: selecting the engine, plus that engine’s own settings:
integrations.yml
Every key besides name goes to that engine, so the available settings are the engine’s own. language_map keys the model and language off the conversation language, which is how both engines take their settings. name also accepts a Python module path, which loads a custom engine implementing from_config_dict.

Deepgram Flux for speech recognition

Flux is the model family to reach for on a live voice agent. It does turn detection inside the ASR rather than inferring it from silence, so the agent takes its turn on the signal the recogniser already has. Naming a flux- model selects it. The engine reads the model name out of language_map and switches to the Flux API on its own, so there is nothing else to declare:
integrations.yml
The two turn-detection knobs are optional: A Flux config takes these two keys and no others. Anything unrecognised fails the load rather than being ignored, so a typo surfaces at startup. The same asr: / tts: shape applies to every voice channel, including jambonz, audiocodes, twilio_media_streams, and genesys. What differs between them is the telephony connection: server_url, and any credentials that provider needs.

model_groups

Required. Named model configurations used by the agent’s LLM and, when configured, the references embedder.
agent.yml orchestrator.model_group names the group that runs the agent. Point agent.yml at an embeddings group by id:
agent.yml
Every model-group reference must name a group declared here. Naming an undeclared group fails validation. Changing the models inside the orchestrator group requires a restart. Changing orchestrator.model_group, or a reference embeddings group, requires retraining. A group with one model is the usual orchestrator setup. Without a router block, only models[0] is used — extra models are ignored, there is no fallback, and rasa data validate warns. Set router when the group should select among multiple models.

mcp_servers

Optional. A list of named MCP servers a skill can import tools from with mcp/<server-name>:<tool-name> in import_tools. Each entry needs a unique name and a url. Auth, if any, is one of token, api_key, oauth, or module at the top level of that entry. Secrets must use ${ENV_VAR} form — literal secret strings are rejected.
integrations.yml
Use at most one of token, api_key, oauth, or module per server. Omit all four when the server needs no auth. Auth examples are in Auth examples.

Auth examples

integrations.yml
integrations.yml
integrations.yml
integrations.yml

meta_map

Optional. Builds an MCP _meta object on each tool call without exposing those values to the LLM:
integrations.yml
static is a mapping of fixed string key/value pairs always sent in _meta.

How skills use a server

Allowlist only the tools you need in the skill’s import_tools:
skills/check_balance/skill.md
See Import MCP tools for a short walkthrough and skill.md → import_tools for collision and load-failure rules.

Validation

rasa train and rasa data validate check this file:

Tracing

Optional. Configure under tracing: in integrations.yml. Supported types: langfuse, otlp, and jaeger. Restart the process after changing this section. Span catalog: Observability. tracing: takes a single tracer, or a list with at most one langfuse entry and at most one otlp or jaeger entry. See Langfuse with OTLP or Jaeger. Tracing is read only from integrations.yml. A tracing: block in endpoints.yml is ignored, and startup logs a warning. If the tracing: section is invalid, rasa train reports it and rasa run starts without tracing.

Langfuse

public_key and private_key must use ${ENV_VAR} references — literal secrets are rejected at validation and apply time. Those references are kept as literal strings when integrations.yml is parsed (they are not expanded like channel credentials). They are resolved when Langfuse configures at CLI startup; if a variable is unset, resolution is best-effort and may leave the literal ${VAR} in the process environment, so tracing is skipped rather than aborting startup. Use rasa data validate to catch invalid shape or key syntax before deploy. Install the monitoring extra (pip install rasa-pro[monitoring]), set LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY, then enable the block. Example agents ship it commented out so local defaults stay key-free.

OTLP

Jaeger

With credentials, set insecure: false so they are not sent in plaintext:

Langfuse with OTLP or Jaeger

List both tracers to send LLM traces to Langfuse and spans to a collector:
Each entry takes the same keys as its single-tracer form above. Declaring two langfuse entries, or both otlp and jaeger, is a validation error.

Metrics

Optional. Export OpenTelemetry metrics to an OTLP collector:
Metrics can be enabled without configuring tracing. Metric catalog: Metrics. Metrics are read only from integrations.yml. A metrics: block in endpoints.yml is ignored, and startup logs a warning. If the metrics: section is invalid, rasa train reports it and rasa run starts without metrics.

event_broker

Optional. Stream conversation events to a broker. Read only from integrations.yml; an event_broker: block in endpoints.yml is ignored, and startup logs a warning. Omit the section to publish no events.
Other keys are the ones that broker type already accepts (queues, topic, path, and so on).

timer_store

Optional. Store background session timers. Read only from integrations.yml; a timer_store: block in endpoints.yml is ignored, and startup logs a warning. Omit the section to keep timers in memory.
The shared Redis connection keys also apply: username, use_ssl, ssl_certfile, ssl_keyfile, ssl_ca_certs, deployment_mode, endpoints, and sentinel_service. Any value can be a ${VAR} placeholder, including port and db.

rasa_model_server

Optional. Pull a trained model from a server at startup, and again every wait_time_between_pulls seconds. This is the remote model server. It is not the models list inside a model_groups entry. Read only from integrations.yml. A models: block in endpoints.yml is ignored, and startup logs a warning. A top-level models: block in integrations.yml fails train (mantle.validation.config.invalid_model_server); move it to rasa_model_server:. Omit the section to load a local model (rasa train, then rasa run --model) or use --remote-storage.
Any value can be a ${VAR} placeholder, including wait_time_between_pulls.

See also