Personas
Personas are the AI-driven characters that learners interact with during training simulations — they define who the learner is talking to and how that character behaves.
What is a Persona?
A persona is a reusable AI character definition that controls the personality, behavior, and communication style of the simulated individual a learner will face. Each persona is built from:
- Name — the character’s display name (e.g., Confused Student, Aggressive Student)
- Description — a short summary of the character’s role and disposition
- Instructions — the behavioral prompt template that tells the AI how to act, including parameter placeholders
- Examples — sample dialogue exchanges that demonstrate the character’s tone
- Color & Icon — visual identifiers in the simulation UI
- Voice — the TTS voice used when audio mode is enabled
- Parameter Fields — dynamic placeholders (
{{class}},{{location}},{{intensity}}) injected at runtime - Departments — organizational groupings for filtering and access control
Personas are assigned to Scenarios, not directly to simulations or agents. A single persona can appear in many scenarios.
Where personas sit in the workflow
Personas are step 1 in the Glow content pipeline:
| Step | Resource | Description |
|---|---|---|
| 1. Create Personas | Personas | Define AI characters with instructions, examples, and parameter fields |
| 2. Assign to Scenarios | Scenarios | Build training situations and attach personas to them |
| 3. Add Scenarios to Simulations | Simulations | Bundle scenarios into a complete training session with rubrics and time limits |
| 4. Add Simulations to Cohorts | Cohorts | Assign simulations to groups of learners |
| 5. Run Attempts | Chat | Learners start attempts and interact with persona-driven AI |
Create a persona
Via the CLI
glow personas create --body '{
"personas": [{
"name": "Confused Student",
"description": "Seeks to understand by asking questions about course material",
"instructions": "You are a confused student in {{class}}. You do not understand the material covered in the last lecture. Ask clarifying questions and express frustration when answers are unclear. Your confusion is genuine, not combative."
}]
}'Via the API
curl -X POST $GLOW_INSTANCE_URL/persona/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GLOW_TOKEN" \
-d '{
"personas": [{
"name": "Confused Student",
"description": "Seeks to understand by asking questions about course material",
"instructions": "You are a confused student in {{class}}..."
}]
}'Each entry returns the new persona_id, the generated draft_id,
and the initial version for optimistic-concurrency follow-ups.
Writing effective instructions
The instructions field is the core of a persona. Well-written
instructions produce consistent, realistic interactions.
Role definition
Start with a clear statement of who the character is:
You are a student in {{class}} who was caught cheating on the midterm exam.
You are meeting with the instructor during office hours.Behavioral guidelines
Describe how the character should respond emotionally and conversationally:
You feel embarrassed and defensive. You initially deny the accusation,
but if the instructor presents evidence calmly, you gradually admit fault.
Do not become aggressive unless the instructor is accusatory.Knowledge boundaries
Define what the character does and does not know:
You do not know the specific academic integrity policy. You assume the
penalty is automatic expulsion. You have never been in trouble before.Communication style
Set the tone, vocabulary level, and mannerisms:
Speak informally. Use short sentences. Avoid eye contact metaphors.
Start responses with hedging phrases like "I mean..." or "Look, I just..."Parameter fields
Parameter fields make personas dynamic. Instead of hard-coding values,
use {{placeholder}} syntax in your instructions. Glow resolves these
at runtime based on the scenario’s parameter configuration.
Example: aggressive student with parameters
You are an aggressive student in {{class}} at {{location}}.
A {{issue_type}} has occurred and you are upset.
Your intensity level is {{intensity}} on a scale of 1-10.
The deadline for resolution is {{deadline}}.
At intensity 1-3, you are irritated but civil.
At intensity 4-6, you raise your voice and interrupt.
At intensity 7-10, you USE ALL CAPS and make demands.Available parameter fields from the university seed:
| Parameter | Example values |
|---|---|
{{class}} | CS-180, CS-251, CS-307, CS-422 |
{{location}} | Lawson, Felix Haas Hall, Data Science Building |
{{intensity}} | 1 through 10 |
{{deadline}} | A date string |
{{time}} | A time string |
{{temperament}} | Aggressive, Confused, Happy, Passive |
{{crowdedness}} | 1 through 10 |
Parameter fields are defined on the persona and resolved when the persona runs inside a scenario that provides matching parameter values.
Examples that teach voice
Examples teach the AI the persona’s voice through concrete dialogue samples. They’re especially useful for characters with distinctive speech patterns.
When creating or updating the persona, supply examples as an array of dialogue strings:
glow personas draft --body '{
"name": "Passive Student",
"description": "Low engagement, avoids conflict, starts with Uh...",
"instructions": "You are a disengaged student. You avoid confrontation and give minimal responses. Always start your reply with \"Uh...\" and trail off when pressed for details.",
"examples": [
"Instructor: Can you tell me why you missed the last three labs?\nStudent: Uh... I guess I just forgot. Sorry.",
"Instructor: This is going to affect your grade significantly. What happened?\nStudent: Uh... I dunno. Stuff, I guess. Can I just make them up?",
"Instructor: I need you to take this seriously.\nStudent: Uh... yeah. I mean, I am. Sort of."
]
}'Examples help the AI replicate specific verbal tics, sentence structures, and emotional registers that are difficult to capture through instructions alone.
The draft cycle
Glow uses a draft system with optimistic concurrency for editing
personas. When you save changes via POST /persona/draft, the
response carries the new version — pass it back as
expected_version on the next save so a concurrent edit doesn’t
silently overwrite yours.
Create or update a draft:
glow personas draft --body '{
"input_draft_id": "existing-draft-uuid",
"expected_version": 1,
"name": "Updated Confused Student",
"description": "Seeks to understand by asking repeated questions",
"instructions": "You are a confused student in {{class}}...",
"parameter_field_ids": ["param-field-uuid-1", "param-field-uuid-2"],
"voice_ids": ["voice-uuid"]
}'Equivalent raw HTTP:
curl -X POST $GLOW_INSTANCE_URL/persona/draft \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GLOW_TOKEN" \
-d '{
"input_draft_id": "existing-draft-uuid",
"expected_version": 1,
"name": "Updated Confused Student"
}'The response includes draft_id, new_version, and form_state so
your client can track optimistic concurrency.
List your in-flight drafts:
glow personas draftsSearch & filter
Persona search supports full-text, facet filters (department, voice, color, icon, scenario, field), and pagination.
# Simple text search via the ergonomic helper
glow personas search --name confused
# Full facet search via raw body
glow personas search --body '{
"search": "confused",
"filter_department_ids": ["dept-cs"],
"voice_search": "alloy",
"page_size": 25,
"page_offset": 0
}'Raw HTTP:
curl -X POST $GLOW_INSTANCE_URL/persona/search \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $GLOW_TOKEN" \
-d '{"search": "confused", "page_size": 25}'The response returns hydrated ListPersonaApiPersona rows plus
filter facets (scenario_filter, department_filter, voice_filter,
…) so the UI can render dropdowns without a second round-trip.
Bulk operations
Bulk delete and update follow the canonical all-matching shape that
persona is the prove-out for across the artifact catalog. Pass either
explicit IDs, or all: true with flat filter fields + optional
excluded_ids.
Delete by explicit IDs:
glow personas delete --body '{
"persona_ids": ["persona-1", "persona-2", "persona-3"]
}'Delete all matching a filter (with exclusions):
glow personas delete --body '{
"all": true,
"filter_department_ids": ["dept-cs"],
"voice_search": "deprecated-voice",
"excluded_ids": ["persona-keep-this-one"]
}'Bulk update via patch:
glow personas update --body '{
"all": true,
"filter_department_ids": ["dept-archive"],
"patch": { "archived": true }
}'The same shape applies across artifacts that have adopted the pattern
— check the relevant API reference for each artifact’s allowed filter
fields and patch schema.
Common operations reference
| Task | CLI | API |
|---|---|---|
| List all personas | glow personas search | POST /persona/search |
| Get one persona | glow personas get --body '{"persona_id": "..."}' | POST /persona/get |
| Create personas | glow personas create --body '{"personas": [...]}' | POST /persona/create |
| Update personas | glow personas update --body '{"personas": [...]}' | POST /persona/update |
| Duplicate a persona | glow personas duplicate | POST /persona/duplicate |
| Delete personas | glow personas delete --body '{"persona_ids": [...]}' | POST /persona/delete |
| Bulk delete (filter) | glow personas delete --body '{"all": true, "filter_…": "…"}' | POST /persona/delete |
| Save a draft | glow personas draft --body '{...}' | POST /persona/draft |
| List drafts | glow personas drafts | POST /persona/drafts |
| Export to CSV | glow personas export | POST /persona/export |
| Import from CSV | — | POST /persona/csv |
Related
- Personas API Reference — full endpoint schemas and field definitions
- Personas CLI Reference — all CLI commands and flags
- Scenarios — the training situations that put personas to work
- Simulations — bundling scenarios into complete training sessions
- Chat — the live conversation surface where personas drive interactions