Open Source · Alpha

Build AI agents
with personality

Role-Aligned Software Architecture

A composable Python framework for persona-driven, memory-aware AI agents. Define cognitive flows in YAML. Run anywhere.

Get Started View on GitHub
persona.yaml
# Define your agent's entire cognitive architecture
name: travel_concierge
description: Personalized travel advice with memory

frames:
  - stateless_frame
  - session_frame
  - short_term_frame

operators:
  - preference_agent
  - heuristic_agent
  - tone_formatter

metadata:
  tone: friendly
  domain: travel
  traits: [curious, helpful]
Features

Everything you need to build thinking agents

RASA gives you composable primitives for designing agents that reason, remember, and respond with domain expertise.

Declarative Personas

Define your agent's entire cognitive pipeline in YAML. Frames, operators, tone, domain expertise — all in one readable config.

Multi-Layer Memory

Stateless, session, short-term (Redis), and long-term (vector DB) memory layers. Each agent gets exactly the recall it needs.

Composable Frames

Stack cognitive processing layers like building blocks. Mix core frames with domain-specific custom frames per persona.

Pluggable Operators

Preference validation, heuristic reasoning, output critique, tone formatting — chain operators to shape how your agent thinks.

Any LLM Provider

Unified adapter for Ollama (local), OpenAI, and Claude. Hot-swap providers without restarting. Run fully local or in the cloud.

API, CLI, or Library

Expose agents via FastAPI endpoints, invoke from the CLI, or import directly in Python. One framework, every interface.

Architecture

A cognitive pipeline, not just a prompt wrapper

Every request flows through a LangGraph-orchestrated pipeline of frames and operators, giving you full control over how your agent reasons.

Input User query
Persona YAML config
Frames Cognitive layers
Operators Reasoning
LLM Generation
Output Text / JSON / Stream

Built on LangGraph

The Runner compiles your persona definition into a directed state graph. Each frame and operator is a node, connected in sequence with full state passing.

  • Dynamic class loading from snake_case YAML names
  • Domain-specific frames and operators per persona app
  • State flows through the entire graph as a typed dict
  • Operators can invoke LLMs, tools, APIs, or human-in-the-loop
app.py
# Three lines to run a persona
from rasa.core.persona import Persona
from rasa.core.runner import Runner

persona = Persona.from_yaml("apps/travel_concierge/persona.yaml")
runner = Runner(persona)

result = runner.run({
  "user_input": "Plan a weekend in Kyoto",
  "preferences": {"budget": "moderate"},
  "metadata": {},
  "context": "",
  "memory": "",
  "output": "",
})

print(result["output"])
Example Personas

From travel advice to stock analysis

Each persona is a self-contained app with its own frames, operators, and domain logic.

🌎

Travel Concierge

Personalized travel recommendations with user preference memory and a friendly conversational tone.

session memory preferences friendly tone
📈

Stock Analyst

Strategic market analysis with custom frames for trends, risk assessment, and portfolio health.

custom frames finance domain analytical
📚

Economist Advisor

Explains economic policy impacts with domain-specific heuristic reasoning and structured output.

domain operators economics explanatory
Get Started

Up and running in under a minute

Install RASA, configure your LLM, and run your first persona.

$ pip install rasa-experimental
Terminal
# Clone and set up
$ git clone https://github.com/vedanta/rasa.git
$ cd rasa && make dev
$ cp .env.example .env

# Start the API server
$ make serve

# Or use the CLI directly
$ python clients/rasa.py run \
  --persona travel_concierge \
  --input "Plan a weekend in Kyoto" \
  --mode direct