?

What "experimental" means here

Rousseau's default posture is minimal: one static Go binary, one SQLite file, no external dependencies. Any feature that requires an extra runtime (whisper.cpp), extra state (FTS5 index for recall), or extra provider cost (LLM-backed compression) is opt-in.

None of these are unstable. They ship, they have tests, they're supported. But because they change the operational cost or surface, they default to off — you turn on the ones you need.

Voice mode (whisper.cpp)

Off by default because it requires the whisper binary from whisper.cpp to be installed on the daemon host.

Toggle: whatsapp.voice.enabled: true in config.yaml. See VoiceConfig in internal/config/config.go.

What it does. When WhatsApp delivers a voice note, the whatsmeow client downloads the OGG payload, invokes whisper with the configured model, and treats the transcript as the inbound message text. Structured log events (internal/transport/whatsapp/dispatch.go):

  • whatsapp.audio_downloaded size=N
  • whatsapp.transcribed elapsed=N

Why it's off. Two reasons: (1) a fresh install would fail confusingly when the whisper binary is missing, (2) transcription is a real-time CPU spend most operators would opt into rather than surprise.

See User Guide: Voice mode for the full setup.

FTS5 recall

Toggle. On by default, but only used by tools that ask for it. The FTS5 index is built and maintained regardless (EnsureSearch in internal/state/sqlite/search.go); the "opt-in" is whether the agent asks the model to search it.

What it does. SQLite FTS5 full-text index over every stored session. Powered through rousseau session search, the MCP tool rousseau_search_sessions, and (when the agent is configured with a recall searcher) the model can query it mid-turn.

Why it's structured this way. The index is cheap to maintain — the triggers in internal/state/sqlite/search.go handle it — but exposing it to the model on every turn has a cost. It gets wired only when the agent loop is constructed with a RecallSearcher (internal/state/sqlite/recall.go).

See User Guide: Compression + Recall.

LLM-backed compression

Off by default because it costs tokens.

Toggle: agent.compression.enabled: true. Full field list on the Guide: Context management.

What it does. When a session grows past trigger_messages (default 60), the LLMCompressor (internal/agent/compressor.go) summarises the oldest slice into one synthetic user message, preserving the most recent keep_recent messages verbatim. Every subsequent turn is smaller and cheaper.

Why it's off. The reference deployment runs claudecli on a subscription tier where token count is not billed. Compression pays for itself on Anthropic direct, Bedrock, Vertex, and OpenAI-compatible providers.

OpenRouter and Ollama base URLs (pre-configured, still opt-in)

Not strictly experimental, but worth naming: rousseau's setDefaults in internal/config/config.go pre-configures OpenRouter and Ollama base URLs:

  • openrouter.base_url: https://openrouter.ai/api/v1
  • ollama.base_url: http://localhost:11434/v1
  • ollama.api_key: not-required

Selecting these providers is opt-in via provider: openrouter / provider: ollama — the endpoints are just pre-filled so you don't have to remember them.

Prompt-injection detection (roadmap)

Not shipped. See Guides: Prompt injection for the honest threat model. Mitigation today is entirely approver-based; classifier-based detection is a roadmap item pending research that actually works.

Streaming to non-Anthropic providers (partial)

The Anthropic provider (internal/llm/anthropic/client.go) supports the SDK's streaming interface. Other adapters currently run in non-streaming mode. Streaming across every adapter is a planned uniformity pass.

Related

Type to search 150+ pages. Ranking: BM25 with title/description boost.