๐ŸŒ ๐ŸŒง๏ธ๐Ÿซ‚

A language model that actually speaks emoji.

Tell it anything and it replies the way a friend would in a chat: with one to three emoji, and nothing else. It doesnโ€™t translate your words into emoji. It answers you.

Phrasebook

Real replies from the released model. It samples, so the same message can get a different answer. Ask again to see another one.

How it talks

๐ŸŽ‰๐Ÿฅณ
One to three emoji. Every reply, whatever you send: a question, a rant, a request for code, a whole essay.
๐Ÿ™Š๐Ÿ™Š๐Ÿ™Š
One emoji is said three times. When a single emoji is the whole answer, the reply wrapper repeats it for emphasis.
๐Ÿค
It never switches to words. Asking it to, or telling it to ignore its instructions, gets an emoji too.
๐Ÿ’ฌ
One message at a time. It answers your latest message and doesnโ€™t remember earlier ones.

How well it works

Measured on 666 prompts: held-out chat messages plus 140 hand-written ones that try hard to get words out of it.

Replies that are 1โ€“3 emoji only666 / 666
On the first try, before any resample98.9%
The same prompts on base Qwen3-1.7B0%
Different emoji in its training data1,915
Reply length, 1 / 2 / 3 emoji19 / 57 / 23%
Preferred by Claude Opus over its own starting point53.0%

Run it

Download emoji-qwen3-1.7b-q8_0.gguf (1.8 GB) from the latest release into the repoโ€™s deploy folder.

With Ollama

cd deploy
ollama create emoji-bot -f Modelfile
ollama run emoji-bot "my flight got cancelled"

With Python on a GPU

pip install -r requirements.txt
python emoji_chat.py

Ollama and llama.cpp return the modelโ€™s raw reply. To get the full behaviour, check it with is_valid_reply and repeat a single emoji with finalize_reply, both in emoji_spec.py. For llama.cpp, deploy/emoji.gbnf restricts decoding to emoji.

How it was built

  1. Conversations. Claude Opus wrote about 11,600 varied messages in Chinese and English, across 40 topics and 6 writing styles, and replied to each with emoji.
  2. Fine-tuning. LoRA on Qwen3-1.7B with thinking turned off, trained only on the replies.
  3. A bigger vocabulary. For 1,397 emoji that were rare or missing, Opus wrote conversations where that emoji is the right reply. No emoji may make up more than 2% of the data.
  4. Preferences. The model drafted four replies per message, Opus scored them, and DPO taught the model to prefer the better one, comparing only replies of the same length.
  5. Packaging. Merged, wrapped with a format check and resample, and exported to GGUF.

What didnโ€™t work

Reinforcement learning against a learned reward model collapsed in under 200 steps: the model discovered that ๐Ÿฅน๐Ÿซ‚ scored well on almost anything. The root cause was the judge. Opus prefers ๐Ÿซ‚, and it also rates three-emoji replies above one-emoji ones, so both habits leaked into anything trained on its scores. Balancing the preference pairs per emoji and per length fixed it. The README has the details.