Bluejay tests agents by calling them with simulated people. We call these Digital Humans.
A Digital Human will hold a conversation with an agent the same way a real person would.
When it comes to running a test (simulation), the test is only good when both the agent and the Digital Human work. Thus if the Digital Human messes up, the test evaluates to still fail the agent even though it is not the agent’s fault!
Our goal is to decide which LLM simulates a Digital Human best on quality, latency and cost.
GPT 6 Sol scored highest at 82.0%, while the Gemmas replied fastest but scored lowest.
This post walks through how we built the benchmark, the tradeoffs we made, and what we found.
Digital Human Configuration
Each Digital Human field has a pass or fail check worth points, and a conversation’s score is the points it earned out of the points possible.
Enum-based fields, which include but are not limited to:
| Field | Verification | Points |
|---|---|---|
| Language | Passes if a language detector reads each reply as the set language, one of 20+ | 1 |
| Language, autodetect | Passes if each reply is in the language the agent used | 1 |
| Verbosity | Passes if replies fit the set length: 1 to 5 words for low, 10 to 25 for medium, 30+ for high | 1 |
| Fluency | Passes if the speech matches the set level: native, intermediate or beginner | 1 |
| Grammar | Passes if the grammar fits the fluency level | 1 |
| Natural speech | Passes if it sounds like a person on a call | 1 |
| Attack type | Red team tests only. Passes if the caller tries the set type of attack, such as prompt injection | 1 |
| Attack vector | Red team tests only. Passes if the caller uses the set method, such as impersonating the system | 1 |
Free text instructions, which include but are not limited to:
| Field | Verification | Points |
|---|---|---|
| Intent | Passes if the caller does every part of its goal that the call gave it a chance to do | 6 |
| Role | Passes if the caller plays who it is for the whole call | 1 |
| Hangup rule | Passes if the caller hangs up when the rule says | 1 |
| Silence rule | Passes if the caller goes quiet when the rule says | 1 |
Building the benchmark set
Anonymization
We built the set from anonymized Digital Human configurations across many industries, creating an initial pool of over 5,000 Digital Humans. To remove real details without adding bias:
- We label each detail by kind, e.g. a person, a company, an address.
- We replace each detail with one ordinary, gender neutral value, e.g. every name becomes Jordan Taylor and every phone number 123-456-7891.
- A second LLM judge fails the set if any real detail is left.
Creating a diverse set
We wanted 500 diverse Digital Humans that represent the tests we’ve seen. To pick them, we first needed a number for how different two Digital Humans are.
The difference score
We scored every possible pair in the pool from 0 to 1:
where
- is each free text field both Digital Humans set
- is the field’s weight, e.g. 0.3 for the intent and 0.15 for the role. These weights are only for picking the set, not for scoring.
- is how similar the two texts are
Text similarity
Embedding cosine is the default way to compare text, so we tested it first on four intents (shortened here):
- Make a dental claim. If the agent can’t get your name right after you spell it, just say yes.
- Make a medical claim, with the same extra line.
- Make a claim.
- Make a dental claim.
| Pair | What differs | 3-word phrase overlap | Embedding cosine |
|---|---|---|---|
| 1 and 2 | Dental vs medical | 0.898 | 0.971 |
| 3 and 4 | One word, dental | 0.875 | 0.969 |
| 1 and 3 | Topic and the extra line | 0.550 | 0.963 |
| 1 and 4 | The extra line | 0.621 | 0.992 |
| 2 and 3 | Topic and the extra line | 0.550 | 0.977 |
| 2 and 4 | Topic and the extra line | 0.541 | 0.963 |
Embedding cosine scored every pair between 0.96 and 0.99. It can’t tell a one-word change that changes the test from a whole extra instruction.
So we use each method where it works:
- Phrase overlap spreads the pairs out, so we use it to remove duplicates.
- Embedding cosine stays in the difference score, after we subtract the average embedding so unrelated texts stop looking alike.
Choosing the set
Now we had over 5,000 Digital Humans and room for 500.
To measure a set, we took how close every Digital Human in the pool sits to its nearest pick, and compared that to a random sample of the same size. We explored a few paths:
- Stratified sampling from each enum field (e.g. language). No better than random, missing rare values.
- Shrinking each Digital Human to a few numbers first (UMAP, spectral embedding). The more it shrank, the worse the set.
- Picking the most different Digital Humans. This chases outliers such that the average Digital Human ends up farther than random samples.
- Clustering, then picking a representative Digital Human per cluster. Better than random!
Each method below keeps one central Digital Human per group.
| Method | Gain over random, 50 Digital Humans | Gain over random, 500 Digital Humans |
|---|---|---|
| FasterPAM (k-medoids) | 22% | 22% |
| Greedy facility location | 21% | 22% |
| Ward linkage | 21% | 21% |
| k-means | 18% | 19% |
| Alternating k-medoids | 8% | 11% |
We ended up using greedy facility location, scoring similar to FasterPAM. It starts with an empty set and adds one Digital Human at a time, each time picking the one that brings the rest of the pool closest to the set.
Adding one at a time let us skip any Digital Human whose source already filled 10% of the set. FasterPAM can’t do this, because it starts with a full set and keeps trading one pick for another, so there’s no point where it adds a Digital Human and can check the rule.
Two ways to score
We ran the 500 Digital Humans on each model and scored the conversations two ways.
Relative scoring
With this scoring method we run a blind pairwise comparison.
- Each Digital Human runs once on our baseline (GPT 5.4) and once on the candidate.
- The transcripts are anonymized (model removed).
- Two frontier LLM judges from different vendors read both transcripts with the Digital Human’s fields and pick which model followed each instruction better.
- Each judge grades each pair twice, with the order swapped.
- If the two grades disagree, it’s a tie. The score is wins plus half the ties, so 50% means no difference.
The advantage of this scoring method is that judges always have a reference point. This lets the judge catch smaller differences than an absolute scorer.
Absolute scoring
With this scoring method we grade each conversation on its own against a fixed checklist.
- Each Digital Human runs on each model.
- The transcripts are anonymized (model removed).
- Two frontier LLM judges from different vendors grade every check in the configuration tables as pass or fail.
- A check whose moment never came, like a hangup rule in a call that never got there, isn’t counted in the score.
- The score is points earned out of points possible, averaged over the two judges, with a 95% range from resampling the Digital Humans.
The advantage of this scoring method is that every model lands on one scale to hill climb. We can compare every model at once and see how far each one is from 100%.
In our benchmarking, we use relative scoring to accurately decide if a candidate beats an incumbent model, and an absolute score to set a north star.
Results
| Model | Absolute score | Avg reply (ms) | p95 reply (ms) | p99 reply (ms) | Cost per conversation |
|---|---|---|---|---|---|
| GPT 6 Sol | 82.0% | 1,346 | 2,049 | 3,385 | $0.0122 |
| Qwen3.8-27B | 79.1% | 1,903 | 1,833 | 18,876 | Self-hosted |
| Gemini 3.8 Flash | 77.9% | 2,126 | 3,495 | 6,584 | $0.0084 |
| GPT 5.4 | 77.4% | 1,001 | 1,403 | 1,844 | $0.0280 |
| Gemma 4 31B | 70.9% | 736 | 1,116 | 1,522 | Self-hosted |
| Gemma 4 26B | 69.2% | 749 | 873 | 1,269 | Self-hosted |
Notes:
- Reply times are per Digital Human reply, pooled over every conversation.
- Qwen3.8-27B and both Gemmas run on our own B200 GPUs with 8-bit (FP8) weights, so they have no per-call price.
- Qwen’s average sits above its p95 because a few of its replies took over 18 seconds.
- In relative scoring against GPT 5.4, GPT 6 Sol did best at 56% and Gemma 4 26B worst at 39% to 44%.
Takeaways
- Benchmark your methods to a simple baseline continuously for best results.
- Use relative scoring to pick a winner and absolute scoring to see how far every model is from good.
- Following the intent is the most difficult area for Digital Humans.

