Zeli AvatarDeveloper docs

Concepts / Emotions

Emotions

There is no emotion API. Nothing in the product classifies the feeling of an utterance and tells your app about it. What does exist is tone matching, which the server does on its own, without a switch to turn on and without an event to subscribe to.

Do not build on EMOTION_DETECTED

ZeliEvent.EMOTION_DETECTED, EmotionEvent and AvatarConfig.emotion_responsive are reserved. No server sends an emotion frame, so the handler never runs; the configuration field is never transmitted, so setting it changes nothing. They are still exported, because both packages are published and deleting a name a program has already typed would break a build to remove a branch that costs nothing. Kept is not the same as working, and this page is the one place that says so plainly.

What actually happens instead

The server picks a tone clip per reply, by itself, from whatever tone variants the avatar you chose happens to have. You do not ask for it and you cannot switch it off. There is no classification step your app can see, and no event in the middle.

Two things you can observe, and they are the honest substitutes:

  • Which tone was used. The reply frame carries the face that delivered it, so a transcript line can be labelled with the tone actually on screen. See Avatars and tones.
  • Which tones exist. The session announces the avatar's tone variants when it opens, so your UI can say what this avatar is capable of rather than guessing. Coverage is per avatar: a reply can be neutral simply because that face has no clip for what the words are doing.

If you need the feeling of a turn

Classify it yourself, on the text you already have. Your app sees every user message and every assistant reply, so the sentiment of a turn is something you can decide with your own model and your own thresholds, and then act on in your own UI. That is a real option today, and it does not depend on anything here changing.

Why the page still exists

It used to teach the opposite: a worked example setting emotion_responsive=True, a handler printing event.emotion, and a note explaining which channel the events arrive on. None of that ever ran. Deleting the page would leave the same wrong idea in everyone's notes with nothing to correct it, so it says what is true instead.

Zeli Avatar · real-time avatars over WebRTC · self-hostable · AU data residency · source