Skip to main content
When you already have your test cases written down (in a spreadsheet, a test plan, or exported from another system), you can skip building Digital Humans one at a time and upload them in bulk from a CSV. Each row becomes one Digital Human, with full control over its intent, success criteria, voice, behavior, expected tool calls, custom traits, and scripted responses. This is the fastest way to stand up a large, deterministic benchmark population, and the only authoring path where every field is explicit. Nothing is AI-generated unless you leave it blank. Upload Custom Digital Humans card on the Create Simulation modal

When to Reach for a CSV Upload

Uploading a CSV

1

Open the upload panel

Go to Simulations → Create Simulation, pick your agent, and choose the Upload Custom Digital Humans card (upload icon) in the type grid.
2

Download the sample template

Click Sample CSV to download sample_digital_humans.csv. It contains the full set of supported column headers plus two worked example rows. Start from this rather than building the header row by hand.
3

Fill in your rows

One Digital Human per row. Only the columns you care about are required; every blank cell falls back to a sensible default (see Partial rows).
4

Upload the file

Drag and drop the .csv onto the dropzone, or click to browse. Only .csv files are accepted.
5

Review and run

On success the panel reads “N Digital Humans will be generated.” Continue the Create Simulation flow to review the population and launch the run. Use Upload different file to swap in a corrected CSV.
CSV upload dropzone with Sample CSV download button

CSV Format

  • The first non-empty row is the header. The file needs a header row plus at least one data row.
  • Column headers are matched case-insensitively and trimmed. Columns Bluejay doesn’t recognize are ignored, so you can keep your own notes columns in the file.
  • Fully blank rows are skipped.
There are four kinds of columns: core fields, behavior fields, tool calls (TC_ prefix), and custom traits (CT_ prefix).

Core columns

Behavior columns

These mirror the levers on the manual configuration screen. Leave a cell blank to keep the default.

Tool call columns (TC_)

Any column whose header starts with TC_ defines an expected tool call. The tool name is whatever follows the prefix, so TC_lookup_account expects a call to lookup_account. The cell value can be either:
  • A plain string, treated as the expected tool output (e.g. account_lookup_completed).
  • A JSON object with output and/or parameters keys (e.g. {"output":"identity_verified"} or {"parameters":{"account_id":"12345"}}). If the object has neither key, the whole object is treated as the expected parameters.

Custom trait columns (CT_)

Any column whose header starts with CT_ defines a custom trait. The trait name is whatever follows the prefix, so CT_customer_tier becomes a trait named customer_tier. The cell is the trait value (parsed as JSON when it looks like JSON, otherwise stored as a plain string).

Partial rows and defaults

Rows can be sparse, so a row with just Intent and one TC_ column is perfectly valid. Empty behavior cells (voice, creativity, interruptions, and the rest) fall through to the simulation’s Default Generation Settings; name and avatar are auto-assigned when omitted. Every row produces a runnable Digital Human.
Keep one CSV per benchmark and commit it alongside your repo. Re-uploading the same file reproduces the exact same population, which is handy for regression suites and for sharing test matrices across a team.

JSON Column Formats

Three columns take JSON. You can author these in a spreadsheet (Bluejay will auto-repair the most common quoting mistakes), but the Sample CSV is the easiest starting point.

Scripted Responses

Make a Digital Human reply deterministically when your agent says (or means) something specific. The cell is either a single JSON object or an array of objects. Each object supports:
Example: array of two rules
Audio scripted responses (playing an uploaded clip) can’t be attached through a CSV because there’s no file to reference. Add those in the scripted-responses editor after import.

Interruptions

A single JSON object keyed by interruptions_type:

Speaks First

Controls whether the Digital Human opens the conversation:
speaks_first: AI-generated opener
speaks_first: custom opener
Agent speaks first
When speaks_first is true, mode must be ai_generated or custom; custom requires a non-empty message.

Validation and auto-correction

Bluejay validates every row as it parses and reports issues without blocking the rows that are fine:
  • Per-row errors (an invalid enum value, an out-of-range number, malformed JSON, an unrecognized Voice key) surface in an error toast listing the first few problems and a count of the rest. The offending field is skipped or defaulted; the rest of the row still imports.
  • JSON auto-repair. JSON cells are parsed strictly first. If that fails, Bluejay makes a best-effort repair of the two most common spreadsheet mistakes (unescaped inner double-quotes, and raw newlines or tabs pasted into a cell), then re-parses. When a cell is repaired this way, a warning toast asks you to verify those rows, since the repair is a guess.
Auto-correction is conservative and can’t fix every malformed cell. After importing a CSV that triggered a “verify these rows” warning, spot-check the affected Digital Humans (especially Scripted Responses) before running the simulation.

Next Steps

Configuration

The full set of behavior levers, explained. These are the same fields the CSV columns map to.

Use Cases

Real-world patterns for building effective Digital Human test suites.

Customer Journeys

Multi-step sequences run by a single persona. Another Create Simulation method.

Generate via API

Create Digital Humans programmatically with the generation endpoint.