Repository navigation
Gideon v1.6
v1.6 turns Gideon from a chatbot you summon into an attentive assistant for your server. It:
- answers in context, in any channel, thread or forum post, and streams its replies as it writes
- remembers each channel and the people in it, without ever sharing between channels
- catches you up on what you missed
- keeps reminders in your own time zone, and runs events with RSVPs
Underneath, every way of talking to Gideon now goes through one shared reply pipeline, with several security fixes, usage tracking and per-user cost limits.
⚠️ Upgrade notes — read before deploying
-
New dependencies:
dateparserandpython-dateutil. Rebuild the Docker image (docker compose up --build). Outside Docker, runpip install -r requirements.txt. -
The database upgrades itself on first start. Migrations are now versioned, and this release adds:
- tables:
USAGE,EVENTS,EVENT_RSVPS,CHANNEL_USER_MEMORY - reminder columns: repeat rule, DM delivery, time zone
- per-channel settings for
@everyone - the creator of each AI thread
A restored older backup is also brought up to date automatically.
- tables:
-
Tool calling is now on by default for new installs. Existing installs keep their current setting.
-
Welcomes need the privileged "Server Members" intent. They're optional and off by default. Enable the intent in the Discord Developer Portal (Bot → Privileged Gateway Intents) before setting
MEMBERS_INTENT=TRUE, or the bot can't connect. -
Optional bot permissions to add to your invite:
- Create Events, so events also appear in the server's Events list
- Mention
@everyone,@here, and All Roles, if you turn on Gideon pinging@everyone - Send Polls and Create Public Threads
-
Commands that now need permissions:
/resetand/setproviderneed Manage Channels./thread rename|delete|model|systemare limited to the thread's creator and members with Manage Threads.
-
Removed:
/diagnostic(use/admin diagnostic)- the
translate,defineandconvert_unitstools, which the model now answers directly
-
@everyonepings from Gideon are off by default. Turn them on in the dashboard (Settings, or per channel). Even then, only people who are allowed to ping everyone themselves can get Gideon to do it.
🔔 Attentive assistant
- Catch up.
/catchup, or right-click a message → Apps → Summarize from here, gives you a private summary of what you missed with links back to the original messages. - Message menus (right-click → Apps):
- Ask Gideon, answered in the channel
- Remind me about this
- Translate, privately into your Discord language
- Remember this about me
- Reminders in your time zone.
/me timezonemakes "tomorrow at 9am" mean 9am where you are.- Reminders can repeat ("every weekday at 9am", "every mon and thu at 6pm") and keep their time across daylight-saving changes.
- They can be delivered by DM, and have Snooze and Done buttons.
- They're written in the channel persona's voice.
- Events with RSVP. Scheduled events post a Going / Maybe / Can't card, and everyone going is reminded 30 minutes before. When the organizer is allowed to, the event also appears in the server's Events list.
- Welcomes (opt-in). New members are greeted in the persona's voice and pointed to the right channels.
- Never spammy. Unprompted posts are limited (default 6 per channel per hour), and extra reminders are combined into one message.
💬 Smarter conversations
- Streaming replies. Answers appear as they're written, with status lines while tools run, such as "🔎 Searching the web…". This also works through persona webhooks.
- Real replies. Gideon answers as a Discord reply to your message, so it's clear who it's talking to.
- Gideon knows where it is: the date and time, the server, the channel and its topic, and the active persona.
- More context. Gideon sees what your message replies to, forwarded messages, attachments, embeds and stickers. Attachment-only messages are no longer dropped.
- Talk to it anywhere.
@mentionit in user-created threads and forum posts, or just reply to one of its messages. @everyonecontrols. Admins decide whether@everyone/@herecounts as mentioning Gideon, and whether Gideon may ping@everyoneitself. Both work globally or per channel.- New tools. Ask "what did Sam say about the raid?", "what's pinned here?", "what did we decide last month?", "who are the mods?", "what are my reminders?" or "summarize this link". Gideon can also start a thread or cancel a reminder.
- Mentions answered in order. When several people talk at once, Gideon answers the message that mentioned it, not whatever arrived while it was thinking.
- Code blocks survive when a long answer is split across messages.
🧠 Memory
- Per-user memory, per channel. Gideon keeps short notes about each person, separately in every channel; what it learns about you in
#devis never used in#general. Threads share their parent channel's notes. - Your controls:
/memory me,/memory forget,/memory optout, the Remember this about me menu and "@Gideonremember that…". Admins can edit or delete notes in the dashboard. - Notes are never dropped silently. The model has to name a note explicitly to remove it.
- No more lost history. Every path that deletes messages (inactivity rotation, long-history compaction, the scheduled prune, manual summarize) summarizes them first. If summarizing fails, the messages are kept and retried later.
- Fuller summaries that mention plans, dates and open questions. Gideon says roughly when a memory is from.
🔒 Security
- No surprise mass pings. Replies can't ping
@everyone,@hereor roles unless an admin allows@everyone/@here(roles never), and only for people who could ping everyone themselves. Text that Gideon echoes back and tool confirmations always stay safe. - Calculator fixed. The
calculatetool no longer uses sympy'seval-based parser. It now uses a restricted evaluator with limits, so a hostile expression fails fast instead of running code or hanging the bot. - Safe URL fetching.
/summarize_urland the web-page tool refuse private, loopback and cloud-metadata addresses, including after redirects and DNS tricks, and they cap download size. - Text from outside the conversation stays data. Once Gideon has read a web page or other people's messages during a reply, actions such as reminders, polls and memory writes are paused for the rest of that reply.
- No more fake speakers. Display names can no longer fake an extra speaker in the conversation.
- Channel isolation. Search, history and memory lookups never read outside the channel you're in.
- Poll and event checks. Creating polls and events checks your permissions, not Gideon's.
- No bot loops. Other bots and webhooks are recorded as context but never answered, so bots can't trigger each other in a loop.
- API key stays with OpenRouter. Video downloads only send the OpenRouter key to openrouter.ai.
💰 Cost controls & dashboard
- Usage card on Overview: cost, tokens, cached tokens and image/video counts, broken down by feature, model and person, for today, 7 days or 30 days.
- Utility model. A cheap model for background work: summaries, people notes, catch-ups and reminder phrasing.
- Per-user daily limits on chat spend, images (default 25) and videos (default 3). Admins are exempt.
- Prompt caching. The stable part of each prompt comes first so providers can cache it, and Anthropic models get an explicit cache breakpoint.
- New settings:
- streaming
- the two
@everyonecontrols (global and per channel) - Community: welcomes, welcome channel and note, and the unprompted-post limit
🛠️ Reliability & internals
- One reply pipeline (
ConversationService) behind@mentions,/chatand threads:- Threads now get tools and the right provider.
- No code path swaps a shared model mid-request any more, which used to let conversations clobber each other's model.
- Clear errors with retries. Friendly error messages, with the provider's raw response kept in the logs only. OpenRouter rate limits and server errors are retried with backoff.
- Safer database access. Concurrent writes are serialized, a busy timeout is set, and deleting a thread removes its messages. The prune keeps threads that are still active.
- Command errors and shutdown. Failed slash commands get a short private message. Shutdown stops background work and closes connections cleanly.
/helpis built from the real command list, so it always matches.- Fixed a crash path in
state_manager(sqlite3wasn't imported). - CI. GitHub Actions runs ruff and the test suite on every push to
Productionand every PR. The suite has 360 tests. - Docs. README, landing page and
CLAUDE.md(renamed fromCLAUDE.MD) are up to date.
Contributors: @eoko-dev and @claude
Full changelog: v1.5...v1.6