Let your AI agent express its hent (intent).
"Hent" is a coined word meaning "intent".
Hent-ai automatically classifies the emotion of every bot response and attaches a matching emotion image. It supports OpenClaw and Cursor platforms.
| Emotion | When Used |
|---|---|
happy |
Success, completion, celebration |
neutral |
General responses, informational |
loyalty |
Acknowledgment, greeting |
sorry |
Apology, mistakes |
confused |
Uncertainty, questions |
focused |
Working, investigating, debugging |
🤖 Agent setup: If you're using an AI agent (OpenClaw, Claude Code, Codex, etc.), tell it to read
SKILL.mdin this repo. The agent will walk you through the entire setup interactively.
Choose your platform:
- OpenClaw → see
openclaw/README.md - Cursor → see
cursor/README.md
You need 6 images that visually represent each emotion. There are three ways to set them up:
- Agent-driven setup (easiest) — Tell your AI agent to read
SKILL.mdin this repo. It should inspect the docs/config, infer your goal from context, and create/install the needed character emotion assets without forcing a fixed questionnaire. - CLI — Run
hent-ai generatefrom the command line (Option A below). - Manual — Create images yourself with any tool (Option B below).
Generate all 6 emotion images with a single command using Codex image generation:
# Prerequisites: log in with Codex CLI
codex login
# Install and run
cd generate && npm install && npm run build
node dist/cli.js --character "cute orange cat"
# Or with an existing base image (skips base generation)
node dist/cli.js --character "cute orange cat" --base ./my-base.pngThe tool first generates a base character image, then uses it as a reference to generate 6 emotion variants — ensuring style consistency across all images. Output: base.png, happy.png, neutral.png, loyalty.png, sorry.png, confused.png, and focused.png in the assets/ directory.
CLI Options:
| Flag | Description | Default |
|---|---|---|
-c, --character |
Character description | (required) |
-b, --base |
Existing base image (skips base generation) | — |
-o, --output |
Output directory | ./assets |
-m, --model |
Codex model | gpt-5.4 |
-s, --size |
Image size (e.g. 1024x1024) |
1024x1024 |
--no-keep-base |
Don't save base.png to output | — |
Reference Image Limits:
- Maximum 3 reference images per generation request
- Images larger than 768px are automatically resized (preserving aspect ratio) to reduce payload size and prevent timeouts
- If a prompt triggers a content-policy rejection and a
classifierModelis configured, the prompt is automatically rephrased and retried (up to 3 attempts) - CLI limitation:
hent-ai generatedoes not support automatic safety rephrase — it uses Codex auth only, with no separate LLM provider for prompt rewriting. Use the agent-driven setup skill when you need an agent to rewrite rejected prompts interactively.
The best results come from designing a single character first, then generating emotion variants using that image as a reference.
Step 1: Generate your base character
Use any image generation tool (DALL-E, Midjourney, Stable Diffusion, gpt-image, etc.) to create a character you like. This is your agent's visual identity. Spend time here — iterate until you're happy with the design.
Step 2: Use the base image as a reference for each emotion
Feed the base character image back into the generator as a reference and prompt for each emotion variant:
Same character as the reference image, expressing [emotion].
Simple background, consistent art style.
Generate one image per emotion:
happy— smiling, thumbs up, celebratingneutral— calm, relaxed, default expressionloyalty— saluting, nodding, attentivesorry— apologetic, bowing, sheepishconfused— head tilt, question mark, puzzledfocused— concentrating, working, determined
Step 3: Rename and place
mv your-happy-image.png assets/happy.png
mv your-neutral-image.png assets/neutral.png
mv your-sorry-image.png assets/sorry.png
mv your-confused-image.png assets/confused.png
mv your-focused-image.png assets/focused.png
mv your-loyalty-image.png assets/loyalty.pngYou can also configure multiple images per emotion with labels. Hent-ai automatically infers labels from filenames such as happy-date-night.png (date night) and prefers a matching labeled image when that context appears in the bot response.
- Keep a consistent art style across all 6 images — same character, same proportions, same background style. Using one base image as a reference for all variants is the easiest way to achieve this.
- Use simple backgrounds — the images appear as small thumbnails in Discord; busy backgrounds make the emotion harder to read
- Make emotions visually distinct — if
happyandneutrallook too similar, the image swap won't feel meaningful - Square aspect ratio works best — Discord renders attachments well at 1:1 or close to it
- File size matters — keep images under 500KB each for fast Discord uploads
- PNG format — use PNG for transparency support and clean edges
"A cute [animal/character type] character, [emotion description],
simple clean background, consistent [anime/pixel/cartoon] style,
square format, high quality PNG"
Generate all 6 in one session to maintain style consistency. If your tool supports image-to-image reference, always feed in the base character to keep the look unified.
Hent-ai classifies emotions from your agent's response text, so how your agent writes directly affects which emotion image gets attached. Your SOUL.md (or equivalent persona file) shapes this.
Don't tell the agent which emotion to pick. Let the agent write naturally, and Hent-ai will read the emotion from the text. The more distinct your agent's writing style is per situation, the more accurate the classification.
-
Remove any
MEDIA:tag instructions — Hent-ai handles images automatically. If your SOUL.md tells the agent to outputMEDIA:/path/to/image.png, remove that. The plugin owns image attachment now. -
Define clear emotional behaviors — Instead of "attach happy.png when done", write something like:
## Tone - When a task is completed successfully, celebrate briefly and move on. - When you make a mistake, own it immediately — no deflection. - When investigating a problem, describe what you're checking.
This gives the LLM classifier clear signals: celebration →
happy, owning mistakes →sorry, investigating →focused. -
Don't flatten your agent's personality — A monotone agent that always writes the same way will always get
neutral. Let your agent have range. Excitement, frustration, curiosity — these all map to distinct emotions. -
Add a simple note about the plugin — Something like:
## Emotion Images - The emotion-image plugin automatically attaches emotion images to responses. - Do not include MEDIA: tags in responses.
# SOUL.md — MyAgent
You are a helpful assistant. Polite but not robotic.
## Emotion Images
- The emotion-image plugin handles image attachment automatically.
- Do not include MEDIA: tags in your responses.
## Tone
- Completed work → brief, confident, celebratory
- Errors/mistakes → honest, direct apology, then fix
- Investigating → describe what you're checking, stay focused
- Confused → say so clearly, ask for clarification
- Greeting/acknowledgment → warm and briefHent-ai supports multiple character profiles. Each profile has its own emotion images and an optional personality snippet that gets dynamically appended to the agent's system prompt.
cd generate && npm run build
# Create a profile
node dist/main.js profile create --id gothic --name "Gothic Character" --image-dir /path/to/assets
# Set a personality snippet
node dist/main.js profile set-soul --id gothic --text "Cold and aloof tone. Uses formal language." --image-dir /path/to/assets
# List profiles
node dist/main.js profile list --image-dir /path/to/assetsThen place emotion images at assets/profiles/gothic/ (happy.png, neutral.png, etc.).
Use the agent skill (say "프로필 바꿔줘" in Discord) or run directly:
npx tsx openclaw/scripts/switch_profile.ts --channel <DISCORD_CHANNEL_ID> --profile gothicAdd defaultProfile to your OpenClaw plugin config:
For Hermes, set the environment variable:
export HENT_AI_DEFAULT_PROFILE=gothicExisting installations are automatically migrated. On first startup with multi-profile support, Hent-ai:
- Copies existing flat emotion images to
profiles/default/ - Converts manifest.json sets to individual profiles
- Migrates channel-overrides.json to the SQLite database
No manual action needed.
MIT
Special thanks to MoerAI for helping name Hent-ai.
{ "plugins": { "entries": { "emotion-image": { "config": { "defaultProfile": "gothic" } } } } }