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