← Table of Contents
Chapter 4

Testing Your Character

The tools that help you find problems before your character goes live.

Writing a character definition is only half the work. The other half is figuring out where it breaks — where the model ignores your instructions, where it gets inconsistent, or where it drifts out of voice after a dozen turns. Character Studio's testing tools are designed for this discovery process. Most of them are gathered in the chat toolbar, and the rest live on individual message bubbles as hover actions.

The Chat Toolbar Overview

The chat toolbar spans the bottom of the right pane, below the chat area and above the text input. From left to right, the buttons are: Visualize, New Chat, Conversations, Import, Export, Markdown Toggle, Playtest, Resubmit Last, Continue, Commands, Push-to-Talk, Input Corrector, Send, and Clear Chat.

Each of these buttons is described in context throughout this chapter. The toolbar is always visible during a chat session — you don't need to navigate anywhere to reach any of these features.

Above the input row, message action buttons appear when you hover over any chat bubble. These per-message controls — Edit, Fork, Ignore, Truncate, Collapse to Here, Mark Unacceptable, and others — are contextual: they only appear when you need them, keeping the conversation display clean during normal reading.

Sending Messages

Type your message in the chat input at the bottom right and press Ctrl+Enter (or Cmd+Enter on Mac), or click the Send button. Responses stream in live, token by token, so you can see immediately whether the character is heading in the right direction before the full reply lands.

During streaming, the Send button is replaced by a Stop button. Click Stop at any point to abort the generation mid-sentence. The partial response is kept in the conversation — you can read what arrived, edit it, or mark it unacceptable — but the model stops generating. This is particularly useful when you can tell from the first sentence that the response went somewhere wrong and you don't want to wait for it to finish.

The Continue button in the toolbar sends a configurable continuation phrase to the model — by default, the single word "Continue." This is for situations where the model stops mid-response because it ran into the token limit, not because it was finished. Rather than typing something yourself, Continue resumes the model exactly where it left off. You can change the continuation phrase to anything you like in Settings → Continue phrase. Some authors use a phrase like "go on" or "keep going" that fits naturally into their character's world. The Omnius System Prompt uses three equals signs for continue, "===".

Playtest Mode

Playtest is the most powerful testing tool in Character Studio. Click the Playtest button in the toolbar to open the Playtest dialog. Instead of you playing the user role, a second model does it — running a model-versus-model loop where your character responds to an AI-driven user, and you observe from the outside.

The dialog asks for two things: a set of directions for the user-player that tell the second model how to behave, and the number of exchanges to run before it pauses. The user-player directions are written from a second-person perspective, as if you're instructing a performer: "You are a chronically suspicious customer who suspects everyone of trying to scam you. You ask increasingly paranoid follow-up questions and are almost impossible to reassure." The richer your directions, the more revealing the test.

When you click Start, the loop begins. The user model generates an opening message to your character, your character responds, the user model replies, and so on for however many exchanges you specified. Each user turn shows a collapsible Thinking block — the user model's internal reasoning before it commits to its message. This reasoning is never seen by your character model; it's just for you, so you can understand why the AI user is doing what it's doing and calibrate your playtest directions accordingly.

Playtest is especially valuable for finding three categories of problem. First, edge cases — scenarios that are technically within the character's world but that your Instructions don't address. A persistent, creative AI user will find them far faster than manual testing. Second, adversarial behavior — what happens when someone pushes back hard, asks leading questions, or tries to get the character to break role. Third, consistency over time — whether the character stays in voice across twenty turns, not just the first three. Manual testers tend to get tired and start typing shorter messages; an AI user never does.

The Playtest dialog pins to the left side of the screen so it doesn't cover the conversation. You can scroll through the chat while Playtest is running to read messages as they arrive. When you close the dialog, the chat scrolls back to the position you were at before opening it.

Tip

Use your worker model as the user-player in Playtest. A smaller, faster model is perfectly capable of generating varied, challenging user messages, and it costs a fraction of what your primary character model does. Set the worker model in Settings → Worker Model. Use a dedicated test conversation for Playtest sessions rather than your main development conversation, so the AI-generated messages don't mix with your own hand-crafted tests.

Resubmit Last

The Resubmit Last button in the toolbar resends your most recent user message to get a fresh response. Use it when the model's reply went in a direction you didn't intend and you simply want to try again — same message, fresh generation.

The previous response is removed from the conversation history and replaced by the new one. Nothing about your message changes; only the assistant reply is regenerated. Resubmit is essentially a one-click re-roll that doesn't require you to find the message, hover over it, and click an action button — it operates directly on the most recent exchange as a convenience.

Resubmit is also the key to a fast edit-and-test loop. Edit your Instructions, hit Resubmit, and see immediately whether the change improved the response — without crafting a new message. How quickly that loop runs depends on one setting:

If you've already used Mark Unacceptable on a response, you don't need Resubmit — the Unacceptable action already triggered a new generation as part of its workflow. Use Resubmit when you want a fresh attempt without the extra signal that the previous response was specifically bad.

Mark Unacceptable

Hover over any assistant message bubble to reveal its action buttons. Mark Unacceptable is the most instructive way to tell the model that a response missed the mark. It's more powerful than simply resubmitting, because the rejected reply is passed back to the model as a concrete negative example — the model receives not just the user message again but also an instruction not to repeat the type of response it just gave.

Studio automatically frames the rejected response as a negative example when asking the model to try again — it tells the model what happened and what to avoid, without you having to do anything.

You can mark multiple consecutive responses unacceptable in a row. Each one accumulates as an additional negative example in the context, progressively narrowing the space of responses that are likely to repeat. This is useful when the model keeps regenerating the same type of failure — saying something that's out of character, breaking the fourth wall, adding an unwanted disclaimer — and a single round of negative feedback isn't enough to steer it away.

The key difference between Resubmit and Mark Unacceptable is informational. Resubmit just tries again; the model gets no additional signal. Mark Unacceptable actively informs the model about what to avoid, which means subsequent responses are genuinely more likely to be different in the right direction, not just randomly different.

Editing Messages

Hover over any message — user or assistant — to reveal the Edit button. Clicking it opens that message in a full-height editor that replaces the chat input area. You can rewrite the message freely in the editor.

For the most recent user message, the editor offers a Save & Resubmit button in addition to the plain Save. Save & Resubmit saves your edited version and immediately gets a fresh assistant response based on the revised message — the most common workflow when you realize a question was poorly worded.

When you edit a user message in the middle of a conversation, you're replacing it in the history but not automatically regenerating any of the assistant replies that follow it. The AI's previous responses remain as-is, even though they were generated in response to the old version of your message. This can create timeline inconsistencies — the character might refer to details that are no longer in the revised message. Be deliberate about this: editing an early message without also adjusting or regenerating later ones can produce a conversation that contradicts itself. If you want a clean branch from the edited message, use Fork instead (see below) rather than editing in place.

Truncate

Hover over any message and click the Truncate button to remove that message and everything after it in the conversation. The truncation point is inclusive — the hovered message itself is deleted along with all subsequent messages.

Truncate is the direct way to cut off a thread that went sideways and pick up from an earlier point. It's irreversible once confirmed, so if there's any chance you'll want to revisit the deleted portion later, use Fork first to preserve a copy of the full thread before you cut.

Ignore / Restore

Sometimes a conversation contains messages you want to keep visible for your own reference but don't want influencing the model's behavior. Hover over any message and click Ignore. The message stays in the chat display — rendered with a strikethrough style and a distinct visual treatment — but it is excluded from the message history that gets sent to the model on subsequent turns.

Ignored messages have a Restore button that puts them back into the active history whenever you're ready. The ignore state persists across sessions and reloads — it's saved in the conversation file.

This feature is particularly useful for three situations. First, out-of-character meta-notes you've left in the conversation as reminders to yourself — ignore them so they don't confuse the character. Second, introductory greetings that served their purpose in establishing the opening but now take up context window every turn without adding value. Third, a run of bad exchanges you want the model to forget while keeping them in the history for your own review — rather than deleting messages you might want to reference later, ignoring them is reversible.

Fork Conversation

Every message in the conversation has a Fork button. Forking copies everything up to and including the selected message into a brand new conversation, leaving the original untouched. The fork appears in the Conversations panel and is automatically named based on the original, ready for you to rename immediately.

Fork is the right tool whenever you're at an interesting decision point and want to explore multiple directions without committing to one. You can fork at the same message multiple times to create several parallel branches — one where the user pushes back, one where they accept what the character says, one where they ask a completely different follow-up — and compare how the character performs across those scenarios.

See Chapter 5 for the complete conversation management workflow, including how to organize forks and keep your test sessions from accumulating into an unmanageable list.

Collapse to Here

Every assistant message has a Collapse to Here button. This is the tool for managing conversations that have grown long enough to start degrading quality — when the model is clearly running out of context window and earlier details are falling away from its effective attention.

When you click Collapse to Here, Studio sends all the conversation history up to that message to the worker model with a dedicated summarizer prompt. The worker generates a prose summary of what has happened, capturing the key story beats, facts established, and character dynamics. That summary is saved as a new context file — context/Summary N.txt — and automatically loaded into the Context tab. Then a new conversation is opened containing only the messages after the collapse point, plus a reference to the summary in the character's context.

The original conversation is left completely intact. You can always go back to it in the Conversations panel. Collapse creates a new thread and a new context file; it never modifies what already exists.

The practical result is that the character now has a compressed but functional memory of everything that came before, while the active conversation is short enough to stay fully within the model's attention. For ongoing role-play or persistent story arcs — the kinds of conversations that would naturally run for hundreds of turns over days or weeks — Collapse is the primary tool for keeping things coherent over time.

Input Corrector

The Input Corrector is a live spelling and punctuation assistant for your chat messages. While you're typing in the chat input, press Ctrl+/ — or click the checkmark button below the input — to send the current message through the worker model for a correction pass.

Rather than silently fixing the text, the Input Corrector shows you a diff modal that breaks down every suggested change word by word. Removed text is shown with red strikethrough styling; inserted text is shown in green. You can accept all changes, reject all changes, or toggle each individual suggestion independently — so if the corrector fixed your spelling but changed a word you meant to use, you accept the spelling fix and reject the word change separately.

Accepting changes through this modal preserves the editor's native undo stack. After you accept and continue typing, pressing Ctrl+Z will restore your original uncorrected text — the entire correction is treated as a single undoable action, not a series of invisible character insertions.

The Input Corrector is enabled and its trigger key configured in Settings → Configure Corrector Key. If you're in a project where you frequently write in a particular style or use intentional non-standard punctuation, you can disable it per-project through config.json to avoid being prompted constantly. See Chapter 8 for configuration details.

Push-to-Talk

The Push-to-Talk (PTT) button in the toolbar lets you dictate messages instead of typing them. Hold the microphone button — or hold the configured keyboard shortcut, which defaults to Ctrl+Space — to record your voice. Release to end the recording. The audio is transcribed and the result is inserted at the cursor position in the chat input, where you can review and edit it before sending.

This is particularly useful for rapid test sessions where you want to explore a scenario quickly without typing out every message. Describing a character moment or a role-play scenario out loud is often faster than composing it at the keyboard, especially when you're brainstorming rather than crafting.

Configure the microphone source, the speech-to-text model, and the key binding in Settings → Configure Voice Features. The PTT key binding supports modifier combinations — you can bind it to any key or key combo that doesn't conflict with your other shortcuts.

Note

Push-to-Talk converts spoken punctuation commands to their symbol equivalents in real time: saying "period" inserts a full stop, "comma" inserts a comma, "new line" inserts a line break, and "quote" / "close quote" inserts opening and closing quotation marks. This means you can fully punctuate your messages by voice without needing to edit the transcript afterward.

Note: Using PTT followed by the input corrector can fix mistakes in quoting, punctuation, or where the dictation simply got it wrong (it's not magic, but it generally improves the text).