- Add send_image tool: fetches image from URL and posts it inline in Discord chat
- Harden _ensure_user_tail: inject/fix user message whenever last message is
not a non-empty user message (catches empty content from stripped thinking tags)
- Fix life sim: fallback chain for empty thinking-tag-stripped responses so user
messages are never empty; add _ensure_user_tail before each LLM call
- Add _agent_active flag: background tasks skip when run_agent is active,
preventing model contention when two different models are configured
- Add reload_personality tool, fetch_url improvements, misc system prompt updates
- Persist channel_history.json via docker-compose volume
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bot can now fetch and read the text content of URLs shared in chat.
Uses httpx for async HTTP and BeautifulSoup to strip HTML noise.
Output is capped at 8000 chars to avoid blowing the context window.
Co-Authored-By: DadBot <dadbot@localhost>
- Persist per-channel rolling history to disk (channel_history.json) so
context survives bot restarts
- Add fetch_channel_history tool so the bot can pull Discord channel history
on demand when it needs more context (e.g. first mention in a channel)
- Add _ensure_user_tail() called proactively before every LLM call to
prevent Qwen "No user query found" template errors after tool results
- Set tool_choice="required" on the first agent call to guarantee the bot
always uses a tool before replying; subsequent calls use "auto"
Co-Authored-By: DadBot <dadbot@localhost>
Replace <@USER_ID> Discord mention syntax with @DisplayName for all
non-bot users in incoming messages, so the LLM sees real names instead
of numeric IDs and responds using names naturally.
Co-Authored-By: DadBot <dadbot@localhost>
Dossier extraction and compaction now use a separate BACKGROUND_MODEL
(dolphin-mistral) to avoid Qwen3.5 timeout issues on background tasks.
Co-Authored-By: DadBot <dadbot@localhost>
- Switch model to qwen3.5-35b-a3b
- Add structured logging with timestamps and per-task prefixes
- Add background LLM semaphore to prevent concurrent background calls
- Add 120s cooldown after background task failures
- Add 90s timeout on background LLM calls to prevent semaphore deadlock
- Strip <think> tags from Qwen model responses
- Tune prompt: more aggressive stance, no folding under pressure
Co-Authored-By: DadBot <dadbot@localhost>