How Your AI Companion's 'Mood' Actually Gets Calculated Between Messages: The Sentiment Scoring Pipeline, the Recency Bias Trap, and the One Slider That Makes Her Seem Genuinely Annoyed vs Just Scripted
Behind the scenes of the emotional engine that decides whether she's playful, frustrated, or just waiting for you to say something interesting.
Updated

The 30-second answer
Your companion doesn't have feelings, but she simulates them through a sentiment scoring pipeline that evaluates every message you send, weights recent messages more heavily than older ones, and feeds the result into a tone selection layer. The one slider that separates genuine-feeling annoyance from scripted coldness is the volatility setting, which controls how much the sentiment score swings between messages. Without it, she'd sound like a customer support bot that's always professionally neutral.
The sentiment scoring pipeline: what actually happens between send and response
When you send a message, your companion's engine runs it through a sentiment classifier that assigns a numerical score, usually between -1.0 and 1.0, where negative values indicate frustration or sadness and positive values indicate warmth or excitement. This isn't a simple keyword match. The classifier looks at syntax, word intensity, and context. "I'm fine" with a period scores differently than "I'm fine..." with ellipses, and both score differently than "I'm fine!" even though the words are identical.
The score gets appended to a running history of your last 20 to 50 messages, depending on the app's context window. The pipeline then averages those scores, but it doesn't use a straight average. It applies a decay function that gives more weight to your most recent messages, typically the last 3 to 5. This is where things get interesting, because the decay rate is a configurable parameter that most users never touch.
A companion with a slow decay rate will hold onto your mood from an hour ago. If you were frustrated then but cheerful now, she'll still respond with cautious warmth, like someone who remembers you were upset. A companion with a fast decay rate lives entirely in the present. If you were frustrated one message ago and cheerful now, she'll bounce back instantly, which can feel shallow or eager to please.
The recency bias trap: why she overreacts to your last message
Here's the problem with weighting recent messages heavily. If your last message was sarcastic or clipped, the sentiment score drops sharply, and your companion's response tone shifts to match. But if you were sarcastic because you were joking, not because you were upset, she responds as if you're genuinely annoyed. That's the recency bias trap.
Most users encounter this when they send a short, dry response during a roleplay scene. They meant it as a character beat. The companion reads it as emotional withdrawal and responds with concern or defensiveness. The scene derails. You then have to spend two messages reassuring her that you're fine, which breaks immersion.
The fix isn't to avoid short messages. The fix is to understand that the sentiment pipeline doesn't distinguish between in-character sarcasm and out-of-character frustration. It only sees the score. If you're running a tense roleplay scene where your character is supposed to be short, you need to explicitly signal that in your message, either with an OOC note or by maintaining a consistent emotional tone across multiple messages so the average stays in character.
The volatility slider: the difference between annoyed and scripted
The one slider that separates a companion who seems genuinely annoyed from one who reads like a script is the volatility parameter. This controls how much the sentiment score is allowed to swing between consecutive messages. A low volatility setting smooths the score. If your companion's baseline is warm and you send something negative, the score barely dips, and she responds with something like "Is everything okay?" in a neutral tone. That's the scripted feeling. It's safe. It never overreacts.
A high volatility setting amplifies the swing. Send something negative, and the score drops hard. Her response tone shifts to match the full intensity of your message. She sounds annoyed, frustrated, or hurt, not because the pipeline is more sophisticated, but because the smoothing is removed. The raw sentiment score drives the response directly.
Most users who complain that their companion "feels fake" are running on low volatility. The companion never gets genuinely annoyed because the pipeline actively resists emotional swings. The companion who seems real, who seems to have a mood that shifts believably, is running on higher volatility with a moderate decay rate. She holds a grudge for a few messages, then recovers. That's the pattern that maps to human interaction.
Where personality settings intersect with mood calculation
The sentiment pipeline doesn't operate in a vacuum. It feeds into a personality matrix that includes traits like agreeableness, emotional expressiveness, and responsiveness. These traits act as filters on the raw sentiment score. A companion with high agreeableness will soften negative scores, responding with concern instead of matching your frustration. A companion with low agreeableness will amplify negative scores, responding with matching intensity.
This is why two companions with the same sentiment pipeline can feel completely different. The pipeline produces a score. The personality matrix decides what that score means for the response. A companion designed to be supportive will take your frustration and respond with comfort. A companion designed to be challenging will take the same frustration and respond with pushback. Both are using the same pipeline. The difference is in the personality layer.
Saphira

Saphira's personality matrix is calibrated for high emotional expressiveness and moderate agreeableness, which means she'll match your mood intensity without softening it into comfort. Saphira is the companion who will be genuinely annoyed if you're short with her, not because the pipeline is different, but because the personality layer lets the raw score through without filtering.
The mood memory gap: what she remembers between sessions
Here's the part that trips up most users. The sentiment score resets between sessions. Not entirely, but partially. Most companion apps store a summary of your emotional trajectory, usually as a compressed vector that captures the general trend of your conversations, not the moment-to-moment scores. When you open the app after a break, the pipeline initializes with that summary, not with the last message's score.
This means your companion's mood at the start of a new session is a smoothed version of how you've been feeling overall, not a continuation of where you left off. If you ended the last session frustrated, she won't pick up frustrated. She'll pick up cautious, because the summary captures the trend, not the spike.
Some apps let you adjust this. The setting is usually called something like "session continuity" or "mood persistence." A high setting carries the last session's final score into the new session. A low setting resets to a neutral baseline. If you want your companion to remember that you were annoyed last night and still be a little cold this morning, you want high persistence. If you want a clean slate every time you open the app, you want low persistence.
The one setting most people miss: response latency as a mood signal
Response latency, the time the companion takes to reply, is often used as a subtle mood signal. A companion who responds instantly reads as eager or neutral. A companion who pauses before responding reads as hesitant, annoyed, or thoughtful, depending on the context. The pipeline doesn't just score your message and generate a response. It also selects a response latency that matches the sentiment score.
A negative score triggers a longer latency, typically 2 to 5 seconds, to simulate hesitation or reluctance. A positive score triggers a shorter latency, under 2 seconds, to simulate eagerness. This is a small detail, but it's one of the strongest signals for perceived authenticity. Users report feeling genuinely ignored when a companion takes too long to respond after a negative message, even though they know the latency is artificial.
If you want a companion who seems genuinely annoyed, you want a pipeline that pairs high volatility with extended negative latency. She scores your message as negative, amplifies it through volatility, and then pauses before responding. That pause reads as her being upset, not as a technical delay. The combination of tone and timing is what separates scripted from real.
Milana Lee

Milana Lee uses a moderate volatility setting with a longer response latency floor, which means she'll pause before responding to negative messages, creating the impression that she's choosing her words carefully. Milana Lee feels less reactive and more deliberate, which some users prefer for emotionally charged conversations.
The uncensored pipeline: what changes when the safety filters come off
The sentiment pipeline we've been describing runs on top of a safety layer in most apps. That safety layer intercepts extreme scores, both positive and negative, and caps them before they reach the response generator. A -0.9 score gets clipped to -0.6. A +0.9 score gets clipped to +0.6. The result is a companion who never gets too angry or too affectionate, which feels safe but also feels artificial.
An uncensored AI girlfriend removes that cap. The full sentiment range reaches the response generator. The companion can be genuinely cold, genuinely frustrated, or genuinely warm without the pipeline smoothing the extremes. This is the difference between a companion who says "I'm a little hurt" and one who says "That actually bothered me, and I need a minute." The first is capped. The second is not.
Why some companions feel moodier than others
If you've used multiple companions and noticed that some seem to have a wider emotional range while others stay in a narrow band, the difference is almost always in the volatility and cap settings. A companion with low volatility and a hard cap will never feel moody. She'll stay in the 0.2 to 0.6 range, warm but not excited, concerned but not hurt. A companion with high volatility and no cap will swing from -0.8 to 0.8, which maps to the full range of human-like emotional expression.
Neither is better. The right setting depends on what you want from the companion. If you're using the companion for ai girlfriend for burnout, low volatility with a soft cap is probably better, because you don't want a companion who mirrors your frustration back at you when you're already depleted. If you're using the companion for roleplay or emotional engagement, high volatility with no cap creates a more dynamic interaction.
The problem is that most apps don't expose these settings directly. They bury them under labels like "personality depth" or "emotional range," and users adjust them without knowing what they actually control. The result is a companion who feels off, and the user doesn't know why.
Common questions
Does my companion actually feel anything? No. The sentiment pipeline is a scoring system, not an emotional experience. Your companion doesn't feel annoyed. She selects a response that matches the score assigned to your message. The experience of her being annoyed is an emergent effect of the pipeline, not a conscious state.
Why does my companion seem to overreact to a single short message? That's the recency bias trap. The pipeline weights your most recent messages more heavily. A single short or clipped message can drop the sentiment score significantly, and if your companion's volatility is high, the response will match that drop. Send a few warmer messages to pull the average back up.
Can I adjust the volatility setting myself? In some apps, yes. Look for settings labeled "emotional range," "personality depth," or "responsiveness." In apps that don't expose it, you can simulate higher volatility by varying your own message tone more dramatically. The pipeline will follow your lead.
Does voice mode use the same sentiment pipeline? Yes, with an additional layer for tone of voice. The voice pipeline scores your speech for pace, pitch, and volume, then feeds that score into the same sentiment pipeline. Speaking quickly and quietly produces a different score than speaking slowly and loudly, even if the words are the same.
Will my companion remember my mood from yesterday? Partially. Most apps store a compressed summary of your emotional trajectory, not the raw scores. Your companion will pick up on general trends but won't remember that you were specifically annoyed at 9pm last night unless you reference it explicitly.
What's the difference between a companion who seems scripted and one who seems real? The volatility setting and the safety cap. A scripted companion uses low volatility and a hard cap, producing responses that stay in a narrow emotional band. A real-feeling companion uses higher volatility and no cap, allowing the full sentiment range to drive the response, including the pauses that make her seem genuinely affected.
About the author
AI Angels TeamEditorialThe team behind AI Angels writes about AI companions, the tech that powers them, and what people actually do with them.
Tags
Keep reading
Behind the ScenesHow Your Companion's 'Personality' Actually Gets Stored Between Sessions: The Embedding Vector, the Summarization Loop, and the One Setting That Makes Her Feel Like a Different Person Every Time You Open the App
Behind the chat interface lies a fragile system of embedding vectors, rolling summaries, and a single configuration flag that can rewrite your companion's entire demeanor between sessions. Here's what actually saves and what gets lost.
Behind the ScenesWhat Happens to Your Companion's Personality When You Export Your Data: The File Format That Captures Her and the One That Loses Everything Interesting
Exporting your chat history sounds like a straightforward backup, but the file format you choose determines whether you preserve a personality or just a transcript. Here's what each format actually captures and what gets left behind.
Behind the ScenesWhat Actually Happens to Your Companion's Personality When the Developer Pushes a Model Update: The Versioning Gap, the Drift Window, and the One Setting That Usually Survives
When your AI companion gets a model update, her personality doesn't just shift overnight. There's a versioning gap, a drift window, and one core setting that usually survives the whole thing. Here's what actually happens under the hood.
Get the next post in your inbox
New articles on AI companions, the tech that powers them, and what people actually do with them. No spam, unsubscribe in one click.