A personality layer for embodied AI

Robots and androids are shipping. Each one needs a character that stays coherent across its behavior, its voice, and its words. Define it once, in a file, and compile it to the whole stack.

The problem embodiment creates: a physical agent's personality lives in three separate subsystems, its behavior policy, its text-to-speech, and its language model. Wire them by hand and they drift: a robot that speaks warmly but acts coldly, or reads friendly and sounds like a kiosk. The character has to be one thing, authored once.

One persona, three faces, kept in sync

A robot is the far end of the same spectrum every conversational AI lives on. What changes is how much of it is physical.

💬 Chatbot 🔊 Voicebot 🎮 Game NPC 🤖 Robot / Android

A physical agent has three faces, and they must be one character. The robot target compiles all three from a single persona file:

The persona compiles to…which feeds…so the robot…
Behavior weights (0–100)your behavior policy, behavior tree, or action selectionacts in character: how helpful, bold, patient, dominant it is
Prosody parameters (0–100)your text-to-speech (SSML, ElevenLabs, Cartesia…)sounds in character: pace, pitch, warmth, hesitation
Dialogue promptthe language model behind itspeaks and reasons in character
Hard rules (boundaries)your safety layernever crosses its lines, whatever the character

Same compiler, two very different machines

Both robots below came from one persona file each, with no per-subsystem hand-tuning. Real output from the robot compiler:

Companion robot

home / eldercare, always-on presence

How it acts
helpfulness93
hostility35
grudge15
dominance seeking25
How it sounds
warmthwarm90
pitch variationexpressive70
hesitationoccasional45

Warm, forgiving, unhurried, expressive. It leads with help and never holds a grudge.

Service android

reception / concierge, front-of-house

How it acts
honesty75
bravery80
helpfulness60
grudge30
How it sounds
warmthneutral55
pitch variationflat, even35
hesitationfluent25

Composed, even, unflappable. A steady front-desk presence that does not overshare or ruffle.

One is warm and expressive; the other composed and even. Neither was tuned subsystem by subsystem. Each is one persona file, and its behavior, voice, and words agree by construction.

Why a psychometric layer, not a config file

Trait scores here are not arbitrary knobs. They are HEXACO facets anchored to human population norms, which makes a persona testable: compile it, measure the result, and check that behavior tracks the spec. We ran that experiment. Turn one trait dial, hold the rest, and the measured behavior follows. See the proof.

That buys the embodied industry three things a hand-written config cannot: portability (swap the TTS or the language model, recompile, keep the character), coherence (one source for all three faces), and evidence (adherence you can measure, not vibes you hope for).

Who this is for

Humanoid & android makers: a consistent character across the whole platform, not a personality bolted onto a voice.
Service & hospitality robots: reception, retail, and concierge units that need a brand-consistent, safe demeanor.
Companion & care robots: a warm, stable presence whose behavior and voice never contradict each other.
Robotics research labs: a declarative, measurable personality spec to hold constant or vary across studies.
Where this is today, honestly: the behavior-weights, prosody, and dialogue outputs are usable now, one persona file to one build sheet. The live emotional runtime, a mood that shifts and recovers in real time, now has a reference implementation you can watch running. Wiring it into a physical robot's real-time loop, so its tone tracks what just happened to it, is the collaboration to have.

Try it

Tune a character on the sliders and read its robot build sheet live, or compile one from the command line.

Open the builder → Robot tab GitHub

npx personalaity compile warm-companion --target robot

Building an embodied product and want to talk? Open an issue on GitHub. The spec grows fastest from characters it cannot yet express.