Skip to Content
Personas

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:

StepResourceDescription
1. Create PersonasPersonasDefine AI characters with instructions, examples, and parameter fields
2. Assign to ScenariosScenariosBuild training situations and attach personas to them
3. Add Scenarios to SimulationsSimulationsBundle scenarios into a complete training session with rubrics and time limits
4. Add Simulations to CohortsCohortsAssign simulations to groups of learners
5. Run AttemptsChatLearners 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:

ParameterExample 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 drafts

Search & 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

TaskCLIAPI
List all personasglow personas searchPOST /persona/search
Get one personaglow personas get --body '{"persona_id": "..."}' POST /persona/get
Create personasglow personas create --body '{"personas": [...]}'POST /persona/create
Update personasglow personas update --body '{"personas": [...]}'POST /persona/update
Duplicate a personaglow personas duplicatePOST /persona/duplicate
Delete personasglow personas delete --body '{"persona_ids": [...]}'POST /persona/delete
Bulk delete (filter)glow personas delete --body '{"all": true, "filter_…": "…"}'POST /persona/delete
Save a draftglow personas draft --body '{...}'POST /persona/draft
List draftsglow personas draftsPOST /persona/drafts
Export to CSVglow personas exportPOST /persona/export
Import from CSVPOST /persona/csv
Last updated on