2026-10-21
Course: Human-AI Interaction β Willamette University
Format: Hands-on lab (CLI/IDE workflow, no Rasa Studio required)
Outcome: Build, train, test, and locally deploy two working assistants
By the end of lab, you will:
In this lab, we optimize for conceptual understanding, not just click-through completion.
Windows: .venv\Scripts\activate
rasa.com/rasa-pro-developer-edition-license-key-request
RASA_PRO_LICENSE still works (deprecated).
Expect: - Rasa Pro version - SDK version - Python version - License Expires date
If error: license.not_found.error β license variable not set in current shell.
Why tutorial template? - Uses free hosted Rasa tutorial LLM - No OpenAI billing/API-key setup needed for students
| File/Folder | Purpose |
|---|---|
config.yml |
CALM config (CompactLLMCommandGenerator, FlowPolicy) |
domain.yml |
Slots + responses |
data/flows.yml |
Conversation business logic |
data/patterns.yml |
Built-in repair flows |
actions/ |
Custom Python actions |
credentials.yml |
Channel connectors (REST default) |
endpoints.yml |
LLM/action server endpoints |
description: flow trigger intent (LLM-readable)collect: request and fill slottext, categorical, float, β¦)β Key feature for demo: digressions (pause current flow, handle interruption, then resume)
Goal: Trigger flows + static responses (no slot collection)
data/flows.ymlflows:
tell_office_hours:
description: User wants to know instructor office hours.
steps:
- action: utter_office_hours
tell_syllabus_location:
description: User wants to know where to find the course syllabus.
steps:
- action: utter_syllabus_location
tell_assignment_deadline:
description: User wants to know when an assignment is due.
steps:
- action: utter_assignment_deadlinedomain.ymlresponses:
utter_office_hours:
- text: "Office hours are Tue/Thu 2β3pm in Ford 210, or by appointment."
utter_syllabus_location:
- text: "The syllabus is posted on the course Canvas page, under Files."
utter_assignment_deadline:
- text: "Check the Canvas calendar for exact due dates β they vary by assignment."β οΈ Keep one responses: block only.
Visualization:
Try paraphrased user asks to demonstrate CALM generalization.
Health check:
REST test:
Goal: slot collection + conditional branching + digressions/corrections
domain.yml)responses:
utter_ask_issue_category:
- text: "What kind of issue is this β hardware, software, or account access?"
utter_ask_issue_description:
- text: "Briefly describe the problem."
utter_ask_urgency:
- text: "How urgent is this β low, medium, or high?"
utter_escalate:
- text: "This looks urgent β flagging it for immediate review."
utter_ticket_summary:
- text: "Ticket created: {issue_category} issue β '{issue_description}', urgency: {urgency}."submit_it_ticket:
description: User wants to report a tech problem or request IT help.
steps:
- collect: issue_category
- collect: issue_description
- collect: urgency
next:
- if: slots.urgency == "high"
then:
- action: utter_escalate
- link: pattern_human_handoff
- else:
- action: utter_ticket_summary
next: ENDCommands:
| Symptom | Cause | Fix |
|---|---|---|
duplicate flows/responses key |
second top-level header added | keep one block |
CategoricalSlot ... unexpected keyword |
slot indentation error | align slot names |
missing a 'next' in branch |
terminal step without next |
add next: END |
invalid choice: 'validate' |
wrong command | rasa data validate |
address already in use |
port conflict | free port/process |
license.not_found.error |
env var unset | export license |
Default tutorial endpoint is free.
Swap in OpenAI or Gemini in endpoints.yml when needed.
Cost note: paid providers bill every class run.