feat: /model slash command with native Discord autocomplete#192
Closed
sh14y wants to merge 3 commits intoopenabdev:mainfrom
Closed
feat: /model slash command with native Discord autocomplete#192sh14y wants to merge 3 commits intoopenabdev:mainfrom
sh14y wants to merge 3 commits intoopenabdev:mainfrom
Conversation
…model - Add ModelInfo struct and model state fields to AcpConnection - Parse available models from session/new response - Add session_set_model() and resolve_model_alias() methods - Add !model Discord command to list and switch models - Support aliases: opus, sonnet, haiku, auto Kiro ACP session/set_model verified on Kiro CLI v1.29.3
Move the entrypoint.sh logic into main.rs so openab is independent of any
external shell wrapper. Before loading config, it now:
1. Restores ~/.local/share/kiro-cli/data.sqlite3 from KIRO_CRED_B64 if
missing (idempotent — skips when file already exists, e.g. from a
mounted volume).
2. Generates the config file from DISCORD_BOT_TOKEN / DISCORD_CHANNEL_ID
env vars when the path doesn't exist. Secrets are written as literal
${VAR} placeholders so they get expanded by load_config() at read
time and never land on disk in plaintext.
Why: Zeabur deployments were intermittently running images built without
the entrypoint shim (e.g. when the source branch was switched mid-flight),
producing "failed to read /etc/openab/config.toml" with no entrypoint logs.
With the bootstrap inside the binary, the deploy is robust to any image
build path that happens to omit our shell wrapper.
The Dockerfile entrypoint.sh remains as a belt-and-suspenders no-op when
present.
…plete Discord's slash commands give a much better UX than text commands: - Typing /m surfaces /model in Discord's native command picker - Autocomplete on the model option shows the live list of available models (and aliases) with arrow-key selection - Discord renders the response as an interaction reply instead of cluttering the channel as a regular bot message Implementation notes: - SessionPool gains a cached_models snapshot updated on every session_new(). Autocomplete must respond within Discord's 3-second deadline, which rules out spawning a fresh kiro-cli (~10s cold start). - main.rs adds a background warmup task that creates one session at startup so the cache is populated before the first user invocation. - /model is registered as a guild command on ready() for instant propagation (global commands take up to 1 hour). - The interaction handler defers the response on the set path because cold session creation can exceed Discord's 3s window for non-deferred replies. - README documents the applications.commands scope requirement; without it the slash command will not appear in Discord clients. The !model text command is removed entirely — /model is its replacement, not an addition.
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Replaces the text-based
!modelcommand (#186) with a Discord-native/modelslash command that supports autocomplete and arrow-key model selection.What changed
SessionPoolcached_models — everysession/newnow updates a global snapshot of available models on the pool, so autocomplete can serve suggestions instantly without spawning a fresh agent (~10scold start would blow Discord's 3s autocomplete deadline).main.rsspawns a background__warmup__session at boot so the cache is populated before the first slash command fires./modelregistration — registered as a guild command onready()for every guild the bot is in. Guild commands appear instantly; global commands take up to 1 hour to propagate.interaction_createhandler — dispatchesCommand(the actual/modelinvocation) andAutocomplete(live filtering as the user types) interactions. The set path defers the response since cold session creation may exceed 3s.auto,opus,sonnet,haikuare surfaced as friendly shortcuts (sonnet → claude-sonnet-4.6) but only when their target is actually available.!modelremoved —/modelis the replacement, not an addition. The text-command intercept indiscord.rsis gone.applications.commandsOAuth scope requirement and the new/modelUX.UX
/min Discord/modelmodelfield✅ Switched to <id>/modelwith no argumentImportant: bot invite scope
/modelwill not appear unless the bot is invited with bothbotandapplications.commandsOAuth scopes. Existing installations that only havebotscope will need to re-invite the bot using a new URL — the bot account itself stays the same and no data is lost.The README has been updated to call this out in the Quick Start section.
Test plan
cargo build --releaseclean/model(no arg) lists all available models with current marker/model autoswitches and replies✅ Switched to auto/model sonnetresolves alias and switches