Build a voice retail banking agent with the new Rasa Skills / Maestro architecture and Deepgram for speech-to-text and text-to-speech.
We call our agent Rasano.
This repo is both:
- A finished working agent you can run immediately
- A live-session tutorial (
tutorial/TUTORIAL.md) with paste-ready snippets
It replaces the older CALM-flows retail banking starter with Skills, progressive control, and end-to-end voice.
| Skill | Capability |
|---|---|
check_balance |
Look up account balances |
transfer_money |
Send money (composes add_payee when needed) |
list_payees / add_payee / remove_payee |
Manage authorised payees |
block_card |
Block lost/stolen/damaged cards + replacement |
banking_faq |
Answer common banking questions from references |
human_handoff |
Create a live-agent ticket |
goodbye / intro |
Orient and close the conversation |
Demo customer: John Smith (seeded SQLite bank under data/source/).
- Python 3.11 or 3.12
- uv
- Rasa Pro Developer Edition license (
RASA_LICENSE) - OpenAI API key (
OPENAI_API_KEY) - Deepgram API key (
DEEPGRAM_API_KEY) for ASR and TTS
make install # install dependencies with uv
make env # create .env from .env.example
# edit .env and set RASA_LICENSE, OPENAI_API_KEY, DEEPGRAM_API_KEY
make verify # pre-flight: keys, project, demo data, connectivity
make train
make inspectmake verify is the single command to run whenever anything looks wrong. It
checks your Python version, license expiry, API keys, project validity, demo
data, and live connectivity to OpenAI and Deepgram, and tells you the exact fix
for anything it finds.
make inspect opens the Inspector. Use the microphone for voice (Deepgram) or type as a fallback.
agent.yml # Rasano persona + voice flags
integrations.yml # OpenAI + Inspector (Deepgram ASR/TTS)
memory.yml # project-wide memory
responses.yml # greeting override
skills/ # one folder per skill (skill-local tools.py lives here)
tools/ # shared @tool functions (used by 2+ skills)
lib/ # SQLite demo bank helpers
data/source/ # seed JSON
tutorial/ # live session script + snippets
- Audience guide:
tutorial/TUTORIAL.md - Paste sets:
tutorial/snippets/
Teaching spine: scaffold → FAQ prose → first tool → tool constraints → block-card progressive control → transfer composition → voice demo.
| Lever | Where | What it guarantees |
|---|---|---|
tool_constraints.requires |
skill frontmatter | Tool hidden until memory condition is true |
requires_confirmation |
skill frontmatter | Explicit user approval before side effects |
if: paragraphs |
skill body | Only matching branch stays in the LLM prompt |
utter: + responses.yml |
frontmatter + YAML | Exact wording (compliance / warnings) |
:::ordered_block |
skill body | Strict step order when sequence is the requirement |
Run make with no arguments for the full grouped help screen.
| Target | Action |
|---|---|
make install |
Install dependencies (uv sync --prerelease=allow) |
make env |
Create .env from .env.example (never overwrites) |
make verify |
Full pre-flight diagnostics — start here if stuck |
make validate |
Fast skill / memory / tool validation only |
make train |
Validate + package the agent |
make inspect |
Open Inspector (voice + text) |
make run |
Start the API server |
make show-demo-data |
Print John Smith's accounts, cards, payees |
make reset-db |
Reseed the demo bank from data/source/ |
make tutorial |
Show the live-session chapters and snippet paths |
make clean |
Remove models / caches / local db |
make clean-all |
Also remove .venv (full reset) |
- Package:
rasa-pro==3.19.0.dev3(pre-release;uvprereleases enabled) - Scaffold a fresh Maestro project with
rasa init --engine maestro(there is no--template voice) - LLM is
gpt-5.2; do not settemperature(GPT-5 reasoning models only accept the default) - Tools import from
rasa.calm_v2.tools(not classicrasa_sdkAction classes) - Local-first tools: a single-skill tool lives in
skills/<name>/tools.pyand is auto-discovered; only tools shared by 2+ skills go intools/*.pyand are pulled in withimport_tools - Tools are named in plain prose (
Call list_accounts), never@tool.name - Identity is loaded deterministically at session start: the project overrides
default_session_starttoexecute_tool-runload_customer_profile - Channels live in
integrations.yml(nocredentials.ymlfor Maestro projects) - Inspector uses Deepgram by default when configured under
channels.inspector
Use with a valid Rasa Pro Developer Edition license. Review the Developer Terms.