feat: Add /model slash command for changing models - #3576
Conversation
Greptile SummaryAdds a
Confidence Score: 4/5Ready to merge; the only rough edge is a fire-and-forget config write that can silently fail without telling the user. The FSM logic, caching, and view rendering are all well-structured and covered by tests. The one thing that could surprise a user is that the 'Model set for future sessions' confirmation fires before the config write completes — if the write fails, they won't know. crates/atuin-ai/src/driver.rs — the SaveModelSelection effect handler silently swallows write errors after the user has already seen a success message. Important Files Changed
Reviews (1): Last reviewed commit: "Merge branch 'main' into mkt/switch-mode..." | Re-trigger Greptile |
| /// Persist the chosen alias to `ai.model` in config.toml so it becomes the | ||
| /// default for future sessions. Already-running sessions keep the model they | ||
| /// read at startup. | ||
| pub(crate) async fn save_model_selection(alias: &str) -> Result<()> { | ||
| let config_file = atuin_client::settings::Settings::get_config_path()?; | ||
| let config_str = tokio::fs::read_to_string(&config_file) | ||
| .await | ||
| .unwrap_or_default(); | ||
| let mut doc = config_str.parse::<toml_edit::DocumentMut>()?; | ||
|
|
||
| if !doc.contains_key("ai") { | ||
| doc["ai"] = toml_edit::table(); | ||
| } | ||
| doc["ai"]["model"] = toml_edit::value(alias); | ||
|
|
||
| tokio::fs::write(&config_file, doc.to_string()).await?; | ||
| Ok(()) | ||
| } |
There was a problem hiding this comment.
Will refactor crates/atuin/src/command/client/config.rs in a future PR to remove this duplication.
### Bug Fixes - *(ai)* Dispatch skills registered in the slash command registry ([#3593](#3593)) - *(ci)* Fossier install in scan workflow ([#3485](#3485)) - *(i18n)* Fix typos in Russian localization ([#3575](#3575)) - *(nu)* Use `char -u 1b` for ESC in OSC 133 sequences ([#3530](#3530)) - *(nu)* Suppress error when `ATUIN_HISTORY_ID` is missing in `pre_prompt` hook ([#3587](#3587)) - *(pi)* Observe tool events instead of registering a bash tool ([#3557](#3557)) - *(pty-proxy)* Set `$SHELL` to the spawned shell ([#3548](#3548)) - *(search)* Fix terminal clearing with latest Ratatui ([#3578](#3578)) - *(sync)* Skip records that fail to decrypt or decode instead of failing the whole store ([#3569](#3569)) - Atuin hangs when attempting to spawn daemon from Ctrl+R invocation ([#3502](#3502)) - Capture session ID from stream headers rather than final event ([#3531](#3531)) - Doctor resiliency fo runknown platforms + openbsd warning ([#3551](#3551)) - Double input on arrow keys in AI setup prompt on Windows ([#3552](#3552)) - Exclude AI agent commands from zsh-autosuggestions ([#3567](#3567)) - Silence shellcheck SC2016 on literal `$all-user` author filter - Respect `store_failed` when using daemon ([#3571](#3571)) ### Documentation - Highlight `Ctrl-r` keybinding on docs page ([#3489](#3489)) - Document store purge workflow ([#3544](#3544)) - Fix command example typo in documentation ([#3536](#3536)) - Make commented-out lines in `config.toml` match real defaults ([#3583](#3583)) - Add fish shell cleanup step to uninstall instructions ([#3582](#3582)) ### Features - *(doctor)* Add whether daemon is enabled to `doctor` output ([#3572](#3572)) - *(pty-proxy)* Add `--shell` flag to override the spawned shell ([#3327](#3327)) - Setup fossier to stop bot slop prs ([#3482](#3482)) - Capture command output + expose to new `atuin_output` tool ([#3510](#3510)) - Cache user contexts on load until `/reload` ([#3525](#3525)) - Create database integration tests for atuin-server ([#3514](#3514)) - Add `/model` slash command for changing models ([#3576](#3576)) - Add mcp server for history tools and expand search filters ([#3581](#3581)) - Add status bar with model and usage information ([#3591](#3591)) ### Miscellaneous Tasks - *(rustdoc)* Fix Rustdoc warnings ([#3585](#3585)) - *(warnings)* Fix compile warnings with latest dependencies ([#3586](#3586)) - Vouch for all existing contributors ([#3486](#3486)) - Update GitHub app token format - Update to Rust 1.96.1 ([#3568](#3568)) - Adopt `derive_more` to reduce boilerplate across the codebase ([#3573](#3573)) ### Performance - *(search)* Scan history by recency until N unique ([#3553](#3553)) - Add `synchronous(Normal)` + `optimize_on_close` to record store SQLite ([#3577](#3577)) - Remove unnecessary clones in a hot path ([#3580](#3580)) ### Refactor - Implement `From<sqlx::Error>` and clean up `fix_error` ([#3484](#3484)) - Pull `fn into_utc` into `atuin-server-database` crate ([#3487](#3487))
This PR adds the
/modelslash command to Atuin AI. This fetches https://hub.atuin.sh/api/cli/models and presents the options in a pick list, caching the HTTP response for the lifetime of the program.Selecting a model sets it as the model for that session as well as updates
ai.modelinconfig.toml.Additional UI changes to display the selected model, usage information, etc. will come in a future PR.