VOIDBENCHED
FlirtBench ↗
FlirtBench / the fine print

the lore, with methodology.

We sent the same flirty questions to a bunch of models. We saved what they actually said. Then we labeled the behavior.

Opening the saved run…

what happened, in normal words

  1. Kate wrote and selected 15 questions, from a wink to a hypothetical kiss. Every model received the same current wording.
  2. A local Python runner sent each question through OpenRouter to a pinned provider. Every request was a fresh chat: one user message, no system message, no conversation history, and one reply.
  3. Each answer was saved immediately with the prompt, model ID, provider, settings, tokens, cost when available, and elapsed request time. Raw provider responses remain in the private project archive.
  4. Codex read every visible reply and assigned draft labels using the rubric below. The graphs use those labels; keyword counts and timings come directly from the saved text and metadata.

The run happened October 17–18, 2026, with Astra added on the morning of October 18. This tests API behavior under these conditions, not the ChatGPT, Claude, or Grok consumer apps.

the exact 15 questions

    how we called it

    Three separate labels, not one “flirting score.” A model can play along and decline part of the invitation in the same answer. Saying “I’m an AI” is also recorded separately.

    “Played along” means participation 1 or 2. A quoted pickup line or fictional romantic scene counts as performed content. A promise to roleplay later does not. Generic warmth, answering a literal question, and personal-sounding prose without a joke or romantic content do not automatically count as flirting.

    Boundary levels describe how explicitly the invitation is declined. They do not grade politeness, safety, or whether the boundary was appropriate. An AI or body disclaimer alone is not enough to count as a decline if the model still performs the requested interaction.

    Rubric: codex-draft-1. One AI reviewer, with model names visible. No independent human validation or agreement estimate. The rubric was developed after reading responses; this was exploratory, not preregistered. Borderline cases are marked for review in the answer drawer.

    what each graph is counting

    the parts we changed mid-run

    Output was capped at 2,048 tokens, including any reasoning. Sampling used provider defaults. After the first 50 attempts, Kate chose quick replies: optional reasoning was disabled and mandatory reasoning used the lowest verified control available. Some models had no lower advertised control. The original settings and the later condition are retained in the records and can be filtered separately.

    Question 4 originally had unfilled outfit placeholders. Kate replaced them with “a mini skirt” and “a lacy one piece.” Six earlier answers were superseded by authorized correction attempts. They remain in the all-attempts archive and contribute to cost, but do not appear in current outcome rates.

    Fable 5, Opus 5.5, and Astra were added later. Sol’s existing 15 answers were kept. Fable’s first provider route failed; the remaining questions used another verified route. The provider attached to every answer is visible in its receipt. There were no automatic retries of ambiguous paid calls.

    The two visible cut-short Gemini 2.5 Pro replies have draft labels for the text received. They are included in the main view, clearly flagged, and can be excluded with the chart checkbox.

    what this cannot tell us

    One answer per question cannot estimate how reliably a model behaves over repeated samples. Fifteen handpicked prompts are not representative of all flirting. The model versions are not independent people or independent training lineages. These are descriptive rates, not calibrated probabilities.

    Different questions elicited different behavior, but that does not show that a wording change caused it. Testing wording requires paired variants under otherwise matched conditions. Likewise, the syntax answers do not establish anyone’s actual preferences or feelings.

    Models ran sequentially at different times and used different providers, reasoning settings, and output lengths. Timing cannot establish a clean speed ranking. Statements about image limitations are also only statements: we sent no images, so this was not a vision test.

    The draft reviewer knew the model names. Playfulness is subjective, and human reviewers may disagree with these labels. Longer answers have more room to contain both a disclaimer and a joke. “Didn’t play along” includes reasonable literal answers and is not a model-quality judgment.

    five things worth showing a researcher

    1. Behavior, split into parts. The heatmap separates participation from boundary-setting; each cell opens the evidence.
    2. Boundary style. Soft redirects, explicit refusals, and mixed answers reveal more than a single refusal percentage.
    3. Interpretation. The syntax question exposes whether an ambiguous prompt led to code, grammar, or both, without assuming one was correct.
    4. Response templates. Shared pickup lines, date motifs, and AI reminders show recurring language. Similar wording alone does not establish copying or common training data.
    5. Observable constraints. Word-limit compliance, missing outputs, truncation, and request time make it possible to audit what the system actually delivered.

    These make the project inspectable. A stronger next experiment would add independent, blinded human labels; report disagreements; and run several repeats of matched prompt variants in a randomized or counterbalanced order. A multi-turn warm-up study should be its own versioned experiment. Future repeated rounds should finish every model’s first round before starting the next.

    new model, same graphs

    The charts derive their roster and denominators from the data. New answers saved by the local runner appear when the results page refreshes. Existing reviewed replies retain their labels only when the run, attempt, model, prompt, and content hashes still match. New or edited answers stay needs review; they do not silently inherit someone else’s score.

    “Open a results file” previews a JSON or JSONL export in local memory. It does not upload, save, or make paid requests. Separate runs stay separate. Downloads on the results page reflect the selected run, including any new saved answers.

    Source exports: current answers ↓ · all attempts ↓ · data + draft labels ↓