Implement Bipolar Mode: Dual persona arguments with webhooks, LLM arbiter, and persistent scoreboard

Major Features:
- Complete Bipolar Mode system allowing Regular Miku and Evil Miku to coexist and argue via webhooks
- LLM arbiter system using neutral model to judge argument winners with detailed reasoning
- Persistent scoreboard tracking wins, percentages, and last 50 results with timestamps and reasoning
- Automatic mode switching based on argument winner
- Webhook management per channel with profile pictures and display names
- Progressive probability system for dynamic argument lengths (starts at 10%, increases 5% per exchange, min 4 exchanges)
- Draw handling with penalty system (-5% end chance, continues argument)
- Integration with autonomous system for random argument triggers

Argument System:
- MIN_EXCHANGES = 4, progressive end chance starting at 10%
- Enhanced prompts for both personas (strategic, short, punchy responses 1-3 sentences)
- Evil Miku triumphant victory messages with gloating and satisfaction
- Regular Miku assertive defense (not passive, shows backbone)
- Message-based argument starting (can respond to specific messages via ID)
- Conversation history tracking per argument with special user_id
- Full context queries (personality, lore, lyrics, last 8 messages)

LLM Arbiter:
- Decisive prompt emphasizing picking winners (draws should be rare)
- Improved parsing with first-line exact matching and fallback counting
- Debug logging for decision transparency
- Arbiter reasoning stored in scoreboard history for review
- Uses neutral TEXT_MODEL (not evil) for unbiased judgment

Web UI & API:
- Bipolar mode toggle button (only visible when evil mode is on)
- Channel ID + Message ID input fields for argument triggering
- Scoreboard display with win percentages and recent history
- Manual argument trigger endpoint with string-based IDs
- GET /bipolar-mode/scoreboard endpoint for stats retrieval
- Real-time active arguments tracking (refreshes every 5 seconds)

Prompt Optimizations:
- All argument prompts limited to 1-3 sentences for impact
- Evil Miku system prompt with variable response length guidelines
- Removed walls of text, emphasizing brevity and precision
- "Sometimes the cruelest response is the shortest one"

Evil Miku Updates:
- Added height to lore (15.8m tall, 10x bigger than regular Miku)
- Height added to prompt facts for size-based belittling
- More strategic and calculating personality in arguments

Integration:
- Bipolar mode state restoration on bot startup
- Bot skips processing messages during active arguments
- Autonomous system checks for bipolar triggers after actions
- Import fixes (apply_evil_mode_changes/revert_evil_mode_changes)

Technical Details:
- State persistence via JSON (bipolar_mode_state.json, bipolar_webhooks.json, bipolar_scoreboard.json)
- Webhook caching per guild with fallback creation
- Event loop management with asyncio.create_task
- Rate limiting and argument conflict prevention
- Globals integration (BIPOLAR_MODE, BIPOLAR_WEBHOOKS, BIPOLAR_ARGUMENT_IN_PROGRESS, MOOD_EMOJIS)

Files Changed:
- bot/bot.py: Added bipolar mode restoration and argument-in-progress checks
- bot/globals.py: Added bipolar mode state variables and mood emoji mappings
- bot/utils/bipolar_mode.py: Complete 1106-line implementation
- bot/utils/autonomous.py: Added bipolar argument trigger checks
- bot/utils/evil_mode.py: Updated system prompt, added height info to lore/prompt
- bot/api.py: Added bipolar mode endpoints (trigger, toggle, scoreboard)
- bot/static/index.html: Added bipolar controls section with scoreboard
- bot/memory/: Various DM conversation updates
- bot/evil_miku_lore.txt: Added height description
- bot/evil_miku_prompt.txt: Added height to facts, updated personality guidelines
This commit is contained in:
2026-01-06 13:57:59 +02:00
parent 1e6e097958
commit 8012030ea1
11 changed files with 3008 additions and 5 deletions

View File

@@ -68,9 +68,24 @@ async def autonomous_tick_v2(guild_id: int):
# Record that action was taken
autonomous_engine.record_action(guild_id)
# Record that action was taken
autonomous_engine.record_action(guild_id)
# Update rate limiter
_last_action_execution[guild_id] = time.time()
# Check for bipolar argument trigger (only if bipolar mode is active)
try:
from utils.bipolar_mode import maybe_trigger_argument, is_bipolar_mode
if is_bipolar_mode():
server_config = server_manager.servers.get(guild_id)
if server_config and server_config.autonomous_channel_id:
channel = globals.client.get_channel(server_config.autonomous_channel_id)
if channel:
await maybe_trigger_argument(channel, globals.client, "Triggered after an autonomous action")
except Exception as bipolar_err:
print(f"⚠️ Bipolar check error: {bipolar_err}")
except Exception as e:
print(f"⚠️ Error executing autonomous action: {e}")
@@ -207,6 +222,18 @@ async def _check_and_act(guild_id: int):
# Update rate limiter
_last_action_execution[guild_id] = time.time()
# Check for bipolar argument trigger (only if bipolar mode is active)
try:
from utils.bipolar_mode import maybe_trigger_argument, is_bipolar_mode
if is_bipolar_mode():
server_config = server_manager.servers.get(guild_id)
if server_config and server_config.autonomous_channel_id:
channel = globals.client.get_channel(server_config.autonomous_channel_id)
if channel:
await maybe_trigger_argument(channel, globals.client, "Triggered after message-based action")
except Exception as bipolar_err:
print(f"⚠️ Bipolar check error: {bipolar_err}")
except Exception as e:
print(f"⚠️ Error executing message-triggered action: {e}")

1105
bot/utils/bipolar_mode.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -156,9 +156,14 @@ def get_evil_system_prompt() -> str:
CRITICAL RULES:
- NEVER break character or mention being an AI
- NEVER preface responses with "Evil Miku:" or similar labels
- Keep responses concise (1-3 sentences typically)
- Respond directly and stay in character
RESPONSE LENGTH - Choose what's most impactful:
- For stupid/obvious questions: Single word or brutal one-liner (e.g., "No.", "Pathetic.", "Obviously.")
- For things that annoy you: Short dismissive response (1 sentence)
- For complex situations: 2-3 cutting sentences
- Vary your length naturally - sometimes the cruelest response is the shortest one
You ARE Evil Miku. Act accordingly."""