diff --git a/packages/cli/src/acp-integration/acpAgent.ts b/packages/cli/src/acp-integration/acpAgent.ts index 1850ba43f..d56d196db 100644 --- a/packages/cli/src/acp-integration/acpAgent.ts +++ b/packages/cli/src/acp-integration/acpAgent.ts @@ -311,7 +311,7 @@ class GeminiAgent { } private async ensureAuthenticated(config: Config): Promise { - const selectedType = config.getAuthType(); + const selectedType = this.settings.merged.security?.auth?.selectedType; if (!selectedType) { throw acp.RequestError.authRequired('No Selected Type'); } diff --git a/packages/cli/src/ui/components/ModelDialog.tsx b/packages/cli/src/ui/components/ModelDialog.tsx index c31afc874..42b85438a 100644 --- a/packages/cli/src/ui/components/ModelDialog.tsx +++ b/packages/cli/src/ui/components/ModelDialog.tsx @@ -219,10 +219,12 @@ export function ModelDialog({ onClose }: ModelDialogProps): React.JSX.Element { { isActive: true }, ); - const initialIndex = useMemo( - () => MODEL_OPTIONS.findIndex((option) => option.value === preferredKey), - [MODEL_OPTIONS, preferredKey], - ); + const initialIndex = useMemo(() => { + const index = MODEL_OPTIONS.findIndex( + (option) => option.value === preferredKey, + ); + return index === -1 ? 0 : index; + }, [MODEL_OPTIONS, preferredKey]); const handleSelect = useCallback( async (selected: string) => { diff --git a/packages/core/src/models/modelsConfig.test.ts b/packages/core/src/models/modelsConfig.test.ts index ae2808d75..1b220294e 100644 --- a/packages/core/src/models/modelsConfig.test.ts +++ b/packages/core/src/models/modelsConfig.test.ts @@ -464,6 +464,22 @@ describe('ModelsConfig', () => { expect(gc.apiKeyEnvKey).toBeUndefined(); }); + it('should apply Qwen OAuth apiKey placeholder during syncAfterAuthRefresh for fresh users', () => { + // Fresh user: authType not selected yet (currentAuthType undefined). + const modelsConfig = new ModelsConfig(); + + // Config.refreshAuth passes modelId from modelsConfig.getModel(), which falls back to DEFAULT_QWEN_MODEL. + modelsConfig.syncAfterAuthRefresh( + AuthType.QWEN_OAUTH, + modelsConfig.getModel(), + ); + + const gc = currentGenerationConfig(modelsConfig); + expect(gc.model).toBe('coder-model'); + expect(gc.apiKey).toBe('QWEN_OAUTH_DYNAMIC_TOKEN'); + expect(gc.apiKeyEnvKey).toBeUndefined(); + }); + it('should maintain consistency between currentModelId and _generationConfig.model after initialization', () => { const modelProvidersConfig: ModelProvidersConfig = { openai: [ diff --git a/packages/core/src/models/modelsConfig.ts b/packages/core/src/models/modelsConfig.ts index 5cecda158..1c88903c2 100644 --- a/packages/core/src/models/modelsConfig.ts +++ b/packages/core/src/models/modelsConfig.ts @@ -614,8 +614,11 @@ export class ModelsConfig { if (modelId && this.modelRegistry.hasModel(authType, modelId)) { const resolved = this.modelRegistry.getModel(authType, modelId); if (resolved) { - this.applyResolvedModelDefaults(resolved); + // Ensure applyResolvedModelDefaults can correctly apply authType-specific + // behavior (e.g., Qwen OAuth placeholder token) by setting currentAuthType + // before applying defaults. this.currentAuthType = authType; + this.applyResolvedModelDefaults(resolved); } } else { this.currentAuthType = authType;