From 0181ff2dca19f9b8edf5262e45d82c162eb225fe Mon Sep 17 00:00:00 2001 From: Lex Christopherson Date: Tue, 10 Mar 2026 23:54:33 -0600 Subject: [PATCH] fix: auto-select default model after login to prevent 'No model configured' error When users logged in via /login but never explicitly ran /model, the agent would throw 'No model configured' on every action. Now GSD auto-selects a default model from available authenticated providers on startup. Preference order: claude-sonnet-4-20250514 > any Anthropic model > first available. Also documented /model command in README Getting Started section. Closes #4 --- README.md | 6 ++++++ src/cli.ts | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/README.md b/README.md index 92c974af5..9f30261dd 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,12 @@ gsd Select from 20+ providers — Anthropic, OpenAI, Google, OpenRouter, GitHub Copilot, and more. If you have a Claude Max or Copilot subscription, the OAuth flow handles everything. Otherwise, paste your API key when prompted. +GSD auto-selects a default model after login. To switch models later: + +```bash +/model +``` + ### Use it Open a terminal in your project and run: diff --git a/src/cli.ts b/src/cli.ts index 1c9dff7da..3b7f226a8 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -17,6 +17,21 @@ await runWizardIfNeeded(authStorage) const modelRegistry = new ModelRegistry(authStorage) const settingsManager = SettingsManager.create(agentDir) +// Auto-select a default model if none is configured. +// This prevents the "No model configured" error for users who logged in +// but never explicitly ran /model to pick one. +if (!settingsManager.getDefaultModel()) { + const availableModels = modelRegistry.getAvailable() + if (availableModels.length > 0) { + // Prefer Anthropic's default (claude-sonnet-4-20250514), then any Anthropic model, then first available + const preferred = + availableModels.find((m) => m.provider === 'anthropic' && m.id === 'claude-sonnet-4-20250514') || + availableModels.find((m) => m.provider === 'anthropic') || + availableModels[0] + settingsManager.setDefaultModelAndProvider(preferred.provider, preferred.id) + } +} + // GSD always uses quiet startup — the gsd extension renders its own branded header if (!settingsManager.getQuietStartup()) { settingsManager.setQuietStartup(true)