feat(FN-2843): auto-select quick chat default model
- Extend /models API responses to include optional defaultProvider/defaultModelId from global settings, including empty and error paths - Update QuickChatFAB to prefer the configured default model on load and fall back to first-model selection only when no agents exist - Move quick chat model tag/title-wrap inline styles into QuickChatFAB.css using dashboard design tokens - Add QuickChatFAB tests covering default-model auto-selection with and without agents and legacy behavior when no default is configured
This commit is contained in:
@@ -5,10 +5,40 @@ export const registerModelRoutes: ApiRouteRegistrar = (ctx) => {
|
||||
const { router, options, store, runtimeLogger } = ctx;
|
||||
|
||||
router.get("/models", async (_req, res) => {
|
||||
// Get favoriteProviders/favoriteModels and default model from global settings.
|
||||
let favoriteProviders: string[] = [];
|
||||
let favoriteModels: string[] = [];
|
||||
let defaultProvider: string | undefined;
|
||||
let defaultModelId: string | undefined;
|
||||
let useClaudeCli = false;
|
||||
if (store) {
|
||||
try {
|
||||
const globalStore = store.getGlobalSettingsStore();
|
||||
const globalSettings = await globalStore.getSettings();
|
||||
favoriteProviders = globalSettings.favoriteProviders ?? [];
|
||||
favoriteModels = globalSettings.favoriteModels ?? [];
|
||||
defaultProvider = globalSettings.defaultProvider;
|
||||
defaultModelId = globalSettings.defaultModelId;
|
||||
useClaudeCli = globalSettings.useClaudeCli === true;
|
||||
} catch {
|
||||
// Silently ignore settings errors - just return empty favorites/default model
|
||||
}
|
||||
}
|
||||
|
||||
const defaultModelResponse =
|
||||
defaultProvider && defaultModelId
|
||||
? { defaultProvider, defaultModelId }
|
||||
: {};
|
||||
|
||||
// Always return 200 with empty array instead of 404 when no models available.
|
||||
// This ensures the frontend can handle empty states gracefully.
|
||||
if (!options?.modelRegistry) {
|
||||
res.json({ models: [], favoriteProviders: [], favoriteModels: [] });
|
||||
res.json({
|
||||
models: [],
|
||||
favoriteProviders,
|
||||
favoriteModels,
|
||||
...defaultModelResponse,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -22,22 +52,6 @@ export const registerModelRoutes: ApiRouteRegistrar = (ctx) => {
|
||||
contextWindow: m.contextWindow,
|
||||
}));
|
||||
|
||||
// Get favoriteProviders and favoriteModels from global settings
|
||||
let favoriteProviders: string[] = [];
|
||||
let favoriteModels: string[] = [];
|
||||
let useClaudeCli = false;
|
||||
if (store) {
|
||||
try {
|
||||
const globalStore = store.getGlobalSettingsStore();
|
||||
const globalSettings = await globalStore.getSettings();
|
||||
favoriteProviders = globalSettings.favoriteProviders ?? [];
|
||||
favoriteModels = globalSettings.favoriteModels ?? [];
|
||||
useClaudeCli = globalSettings.useClaudeCli === true;
|
||||
} catch {
|
||||
// Silently ignore settings errors - just return empty favorites
|
||||
}
|
||||
}
|
||||
|
||||
// The vendored pi-claude-cli extension registers its provider as
|
||||
// "pi-claude-cli" (distinct from "anthropic") whenever it loads.
|
||||
// When the toggle is OFF, hide those entries from pickers so users
|
||||
@@ -48,14 +62,24 @@ export const registerModelRoutes: ApiRouteRegistrar = (ctx) => {
|
||||
models = models.filter((m) => m.provider !== "pi-claude-cli");
|
||||
}
|
||||
|
||||
res.json({ models, favoriteProviders, favoriteModels });
|
||||
res.json({
|
||||
models,
|
||||
favoriteProviders,
|
||||
favoriteModels,
|
||||
...defaultModelResponse,
|
||||
});
|
||||
} catch (err: unknown) {
|
||||
if (err instanceof ApiError) {
|
||||
throw err;
|
||||
}
|
||||
const message = err instanceof Error ? err.message : String(err);
|
||||
runtimeLogger.child("models").warn(`Failed to load models: ${message}`);
|
||||
res.json({ models: [], favoriteProviders: [], favoriteModels: [] });
|
||||
res.json({
|
||||
models: [],
|
||||
favoriteProviders,
|
||||
favoriteModels,
|
||||
...defaultModelResponse,
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user