Playtime, gentle strokes and optional conversation

Update: 22 October 2026. These are playful screen animations, not motor commands or claims of physical sensation.

AreaImplementation / result
Personality intensity slidersSilliness and cuddly personality each have a persistent 0–100% slider, default 100%. Tests compare low/high expression strength, complete carousel turns, zero-level suppression, cooldown scaling, invalid-value rejection and reload persistence. Numeric settings reach the LLM context; arbitrary prompts are not accepted as settings. Cuddle invitations work independently of the silliness setting and retain the two-per-session/no-unanswered-repeat limits. Direct configured-LLM tests at low intensity produced “Hui … ganz sacht. Nochmal ein kleines Hui.” and “Mmmh, ganz sachte.” A fresh end-to-end audio retest after this slider update timed out waiting for readiness while the single live conversation slot was occupied; the existing user's conversation was not interrupted. The successful full playback test below refers to the preceding carousel update, not a new audio pass for the sliders.
Eight cartoon facesCrossed, opposite, wiggle, cheeky, goofy, squishy, fish and peekaboo. Browser checks confirm eight distinct geometries, with 101 finite samples per variant. Existing 40 emotional poses and action lifecycle checks pass.
Adjustable idle playDefault 20 seconds, adjustable 5–180 seconds with a persistent slider. Short grimace sequences, sometimes three carousel turns in six seconds and six seconds of afterglow. Browser contracts verify increasing angular speed through 80%, final braking, increasing smile/mouth opening and upward puppy gaze. The test explicitly fast-forwards the idle clock, verifies both sides of the 20-second boundary, live rescheduling and settings persistence; it is not a claim of a real-time hour-long soak test. User activity cancels optional animations; their own audio does not. No idle animation during reduced motion, ordinary replies, calibration or a hidden tab.
PettingReal Playwright mouse movements over the projected head trigger a soft closed-eye smile without rotating the viewer. Clicks, stationary holds and off-head movements are rejected. Settings persist; normal orbit remains available with Alt-drag or dragging the base.
LLM and voiceA real HTTPS browser test traversed pointer → event → configured LLM → streamed TTS, including two strokes separated by the cooldown. The first reaction started while the mouse button was still held. A subsequent carousel generated “Hui, hui! Huiii, das dreht sich! Juhu, juhu, noch eine Runde!” The browser verified the playback-driven rotation and visible afterglow. No canned emotional response was substituted.
More responsive strokes, still boundedServer-side 12-second spoken-stroke cooldown. Moving strokes can trigger a reaction before mouse release. The LLM chooses brief hums, gentle chuckles and warm remarks, not a prerecorded sentence. Invitations remain unchanged: earliest after three minutes, ten-minute interval, at most two per session, no repetition in an unanswered quiet spell. The configured LLM chose silence after an explicit request for quiet.
Explain the behaviorRecent animation events enter ordinary conversation context, with their ages. Real-model tests produced a relevant explanation of the carousel and fish face. Idle events can also be relayed when a previously disconnected user starts a conversation.
CancellationOptional speech stopped on a synthetic input-activity callback in the actual browser. This tests UI/transport cancellation, not microphone acoustics, echo rejection, speaker recognition or ASR accuracy. Ordinary voice interruption reliability remains a separate, previously documented issue.
Explicit rotationUnambiguous direct commands now receive a six-second first-sentence spin even when the LLM omits its visual tool call. Tests cover negations, quotes, conditional rules, direction and a missing tool call. Three actual-model requests yielded spin plans and spoken replies. A separate real-browser test uses synthetic PCM (not TTS or microphone audio) to verify a complete playback-driven spin while audio is playing, even at zero idle-play intensity. Master-disable and reduced-motion preferences remain respected and have a visible action-panel explanation. After the live slot became free, the expanded HTTPS test also PASSED with the current server: two stroke reactions, carousel and afterglow, then a typed counterclockwise rotation request. Actual LLM/TTS audio played during the visible spin and the robot completed the turn. This resolves the earlier blocked audio retest noted above; physical microphone/ASR accuracy was not tested.
Regression suite328 offline unit tests pass. CPU-only browser checks pass without JavaScript errors. No new GPU model or browser dependency is added.

Current vocal tests include a genuine model-generated “Mmmh, ganz sanft … das ist ja niedlich.” and escalating carousel calls. Optional rides pair the actual audio with carousel → afterglow actions, while invitations pair audio with the puppy pose. The schema and cooldown tests cover both action plans. Model phrasing and acoustic realization remain variable.

Authenticity and boundaries

The director may express a warm, playful personality, appreciation and amusement. It must not invent physical touch sensations, suffering, loneliness, neediness or a need for exclusive friendship. Asked directly about physical feeling, the model explained that the gesture is recognized as an avatar event, not felt bodily. Optional comments may remain silent and are abandoned when the LLM times out or TTS is already busy. These are safeguards and measured samples, not a guarantee of every future model response.

Reproduce

Run python run_unit_checks.py, python personality_director_checks.py, and the Playwright scripts personality_browser_checks.py, avatar_browser_checks.py, personality_live_browser_check.py. Use the existing Python environment plus Playwright and Chrome. The live test uses the single conversation slot; do not run multiple audio tests together. Test fixtures use authored text and synthetic pointer activity, never private microphone recordings.

Files and data

avatar_personality.py validates event context and cooldowns; avatar_actions.py extends the tool schema; static/avatar-actions.js supplies animation and idle scheduling; static/avatar-petting.js handles the hand cursor and stroke detector. The director, TTS bridge, server and UI carry bounded events and optional cancellation. The existing software renderer supplies projected head hit regions. Events remain in session RAM and do not identify a speaker or save biometrics.