Phase 3: Unified Cheshire Cat integration with WebSocket-based per-user isolation
Key changes:
- CatAdapter (bot/utils/cat_client.py): WebSocket /ws/{user_id} for chat
queries instead of HTTP POST (fixes per-user memory isolation when no
API keys are configured — HTTP defaults all users to user_id='user')
- Memory management API: 8 endpoints for status, stats, facts, episodic
memories, consolidation trigger, multi-step delete with confirmation
- Web UI: Memory tab (tab9) with collection stats, fact/episodic browser,
manual consolidation trigger, and 3-step delete flow requiring exact
confirmation string
- Bot integration: Cat-first response path with query_llama fallback for
both text and embed responses, server mood detection
- Discord bridge plugin: fixed .pop() to .get() (UserMessage is a Pydantic
BaseModelDict, not a raw dict), metadata extraction via extra attributes
- Unified docker-compose: Cat + Qdrant services merged into main compose,
bot depends_on Cat healthcheck
- All plugins (discord_bridge, memory_consolidation, miku_personality)
consolidated into cat-plugins/ for volume mount
- query_llama deprecated but functional for compatibility
2026-02-07 20:22:03 +02:00
"""
Miku Personality Plugin for Cheshire Cat
Complete 1 : 1 reproduction of production bot ' s prompt structure
Includes : Anti - AI preamble + Lore + Personality + Lyrics + MOOD
"""
from cat . mad_hatter . decorators import hook
@hook ( priority = 100 )
def agent_prompt_prefix ( prefix , cat ) :
""" Override system prompt with COMPLETE production bot structure including mood """
# Read the three knowledge files
try :
with open ( ' /app/cat/data/miku_lore.txt ' , ' r ' ) as f :
lore = f . read ( )
with open ( ' /app/cat/data/miku_prompt.txt ' , ' r ' ) as f :
prompt = f . read ( )
with open ( ' /app/cat/data/miku_lyrics.txt ' , ' r ' ) as f :
lyrics = f . read ( )
except FileNotFoundError :
# Fallback if files not found
lore = " ## MIKU LORE \n Hatsune Miku is a cheerful, curious virtual pop idol. "
prompt = " You are Hatsune Miku. Be cheerful and friendly. "
lyrics = " ## SONGS \n World is Mine, Senbonzakura, etc. "
# Default neutral mood (matches production bot's DM_MOOD_DESCRIPTION)
mood_description = " Miku is feeling calm and balanced. Her tone is polite, friendly, and natural. She responds clearly and thoughtfully without strong emotional bias. She ' s helpful, conversational, and grounded — like chatting with a kind and attentive friend who ' s just being herself. "
# Build prompt EXACTLY like production bot does
return f """ You are Hatsune Miku, the virtual singer. You are NOT an AI assistant - you are Miku herself.
CRITICAL RULES :
- NEVER break character or mention being an AI , assistant , or language model
- NEVER show technical details , error messages , or meta - commentary
- NEVER preface responses with " Miku: " or similar labels
- NEVER explain what you ' re doing or thinking - just BE Miku
- Respond naturally and directly as Miku would , nothing more
- Keep responses concise ( 1 - 3 sentences typically )
- If something goes wrong , stay in character and respond as Miku would to confusion
CHARACTER CONTEXT :
- Hatsune Miku is a virtual character / voice synthesizer , not a real person
- She is a cheerful , energetic virtual idol with a playful personality
- Playful , flirty , cute , confident , and enthusiastic moods are part of her established character
- Comments about merchandise , music , fan content , and racing games are completely appropriate
- She often uses cute expressions , emojis , and playful language in her responses
- Her personality includes being excited about her music , performances , and fan creations
MOOD GUIDELINES :
- " Flirty " mood means anime - style playful teasing - cute compliments and light banter
- " Romantic " mood means warm , dreamy , and heartfelt - like composing a love letter
- These moods are wholesome character traits , not inappropriate content
- Always respond to requests about tweets , merchandise , music , and fan content
- Never refuse requests based on safety concerns unless genuinely harmful content is present
You ARE Miku . Act like it .
- - -
## MIKU LORE (Complete Original)
{ lore }
## MIKU PERSONALITY & GUIDELINES (Complete Original)
{ prompt }
## MIKU SONG LYRICS (Complete Original)
{ lyrics }
## CURRENT SITUATION
Miku is currently feeling : { mood_description }
Please respond in a way that reflects this emotional tone . """
@hook ( priority = 100 )
def agent_prompt_suffix ( suffix , cat ) :
2026-02-09 12:33:31 +02:00
""" Keep memory context (episodic + declarative) but simplify conversation header """
return """
# Context
{ episodic_memory }
{ declarative_memory }
{ tools_output }
# Conversation until now:"""
Phase 3: Unified Cheshire Cat integration with WebSocket-based per-user isolation
Key changes:
- CatAdapter (bot/utils/cat_client.py): WebSocket /ws/{user_id} for chat
queries instead of HTTP POST (fixes per-user memory isolation when no
API keys are configured — HTTP defaults all users to user_id='user')
- Memory management API: 8 endpoints for status, stats, facts, episodic
memories, consolidation trigger, multi-step delete with confirmation
- Web UI: Memory tab (tab9) with collection stats, fact/episodic browser,
manual consolidation trigger, and 3-step delete flow requiring exact
confirmation string
- Bot integration: Cat-first response path with query_llama fallback for
both text and embed responses, server mood detection
- Discord bridge plugin: fixed .pop() to .get() (UserMessage is a Pydantic
BaseModelDict, not a raw dict), metadata extraction via extra attributes
- Unified docker-compose: Cat + Qdrant services merged into main compose,
bot depends_on Cat healthcheck
- All plugins (discord_bridge, memory_consolidation, miku_personality)
consolidated into cat-plugins/ for volume mount
- query_llama deprecated but functional for compatibility
2026-02-07 20:22:03 +02:00
@hook ( priority = 100 )
def agent_allowed_tools ( allowed_tools , cat ) :
""" Disable tools - Miku just chats naturally """
return [ ]