Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.bumbleagi.com/llms.txt

Use this file to discover all available pages before exploring further.

Presence is how the entity shows up in the world. An always-on daemon ticks continuously — driving body state, memory consolidation, proactive behavior, and scheduled automations across every connected platform.

Daemon

The daemon runs when you use bumblebee run (not talk). It manages two core loops via APScheduler:

Heartbeat (default 120s)

  • Tick soma bars, affects, and noise
  • Emit idle events after 60s silence
  • Check drives against thresholds
  • Refresh MCP server connections
  • Evaluate wake cycle conditions

Consolidation (default 2h)

  • Process raw memories into durable episodes
  • Apply significance decay
  • Update relationship models
  • Trigger narrative synthesis (every 3rd cycle)
  • Run emergence analysis if enabled

Initiative and wake cycles

The entity can act on its own — not just respond to messages.
This path runs when autonomy.enabled is false (legacy initiative in the daemon). When a drive exceeds its threshold (default 0.72) and enough time has passed since the last proactive message (drives.initiative_cooldown in entity YAML, default 1800 seconds if omitted), the entity composes and sends a message. The drive is then partially satisfied, dropping it below threshold.When autonomy.enabled is true, this legacy block is not used; instead, drive thresholds participate in autonomous wake when drive_wake is enabled (full perceive, wake voice, rate limits, optional sustained sessions — not the same as this single-message path).To disable full autonomous wakes but keep the daemon, set autonomy.enabled: false and see Autonomous wake → Disabling autonomous wake for what still can fire.

Wake safeguards

SettingDefaultPurpose
min_cycle_gap_seconds600Minimum time between autonomous cycles
max_cycles_per_hour4Hard cap on wake frequency
messages_per_cycle2Max say() per autonomous cycle when not using enhanced session budgets
wake_session_say_budget_per_round6Higher say cap per round when multi-round or wide wake is active
silence_threshold_seconds120Don’t wake during active conversation
Additional keys (wake_session_max_rounds, wake_session_wall_seconds, wake_wide_mode, visibility toggles) are documented under Autonomous wake.

Platform adapters

All adapters share the same entity instance. Memory, body state, and identity are consistent across platforms.
Rich terminal REPL with a prompt_toolkit input bar. Bottom toolbar shows current mood and dominant drive.Startup banner: entity name, mood, drive level, episode count, model, context size, tool count, uptime, relationship count.Streaming: character-by-character delivery with sentence-boundary chunking. Pauses between chunks simulate natural pacing.Local commands: /self (side panel with drives, inner voice, recent memories), /status, /feelings, /memories, /tools, /bye (graceful shutdown with session summary).Tool activity: whisper-styled indented lines showing what the entity is doing.
Full-featured bot via python-telegram-bot. 20+ slash commands, photo/vision support, voice message handling, HTML-formatted responses, privacy operator system, remote desktop sessions.Media: photos passed as vision input (up to 3), audio as base64 (8MB cap), image documents with mime detection.Delivery: plain replies use presence.message_chunk_max and chunk_delay (plus typing-speed–based jitter and compose delays) so answers often arrive as several human-paced bubbles, not one block. Telegram’s ~4096-character limit still applies per message; longer content is split safely. Typing indicator runs during perceive (~4.5s loop) and again between chunk sends when applicable.Dedup: update_id and (chat_id, message_id) deduplication with 8192-entry ring buffers.See Telegram guide for setup, commands, and pacing knobs.
Conversational bot via discord.py. Responds in DMs always; in guilds, when mentioned or in configured channels.Media: image attachments (12MB), audio (8MB), base64 passthrough.Presence sync: Discord status mapped to emotional state — online, idle, or DND based on primary emotion.Delivery: 2000-char cap with sentence-aware chunking at ~1900 chars.See Discord guide for setup.

Embodied expression

Responses are paced to feel natural, not instant. On Telegram, multi-part delivery uses send_plain_chunks: line-aware packing up to message_chunk_max, then between each bubble a delay of roughly chunk_delay with variance jitter (typing_speed_variance) plus an extra beat scaled by the next chunk’s length and typing_speed_base (capped). Discord uses similar line packing with its own length cap; CLI streams with sentence-aware chunking.
SettingDefaultWhat it does
typing_speed_base30Base typing speed simulation (also scales inter-bubble compose delay on Telegram)
typing_speed_variance0.3Randomization for typing simulation and chunk pause jitter
message_chunk_max400Target characters per outbound chunk (Telegram: clamped 120–3900)
chunk_delay2.0Base seconds between chunks / bubbles
tool_activitytrueShow tool use status lines

Source files

FileRole
bumblebee/presence/daemon.pyMain daemon loop and APScheduler
bumblebee/presence/initiative.pyProactive message composition
bumblebee/presence/wake_cycle.pyAutonomous wake logic, wake voice, poker prompts
bumblebee/cognition/poker_prompts.pyDeck load and selection
bumblebee/cognition/poker_grounding.pyOptional GEN-grounded disposition
bumblebee/presence/embodiment.pyTyping simulation and chunking
bumblebee/presence/platforms/base.pyPlatform adapter base class
bumblebee/presence/platforms/cli.pyCLI REPL with Rich rendering
bumblebee/presence/platforms/telegram_platform.pyTelegram adapter (20+ commands)
bumblebee/presence/platforms/discord_platform.pyDiscord adapter with presence sync
bumblebee/presence/automations/engine.pyAutomation scheduler and execution
bumblebee/presence/automations/emergence.pyRoutine suggestion from memory/drives