fix(provider,web): align provider availability predicates and add flow gating

This commit is contained in:
lc6464 2026-04-28 23:25:47 +08:00
parent d5f870feba
commit e76527d932
No known key found for this signature in database
GPG key ID: 53C61B42FEC71D6D
5 changed files with 31 additions and 5 deletions

View file

@ -984,8 +984,8 @@ func TestModelProviderOptions(t *testing.T) {
}
if option, ok := seen["bedrock"]; !ok {
t.Fatal("bedrock option missing")
} else if option.CreateAllowed {
t.Fatal("bedrock should not be creatable from the web form")
} else if !option.CreateAllowed {
t.Fatal("bedrock should be creatable and defer credential/build errors to runtime")
}
if option, ok := seen["antigravity"]; !ok {
t.Fatal("antigravity option missing")

View file

@ -36,7 +36,7 @@ var attachedModelProviderMetaByName = map[string]attachedModelProviderMeta{
protocolMeta: protocolMeta{defaultAPIBase: "https://api.anthropic.com/v1"},
createAllowed: true,
},
"bedrock": {},
"bedrock": {createAllowed: true},
"antigravity": {createAllowed: true, defaultAuthMethod: "oauth", authMethodLocked: true},
"claude-cli": {createAllowed: true},
"codex-cli": {createAllowed: true},

View file

@ -93,7 +93,6 @@ func hasModelConfiguration(m *config.ModelConfig) bool {
if configured, checked := hasStoredOAuthCredential(m); checked {
return configured
}
return true
}
if authMethod == "" && providerUsesImplicitOAuth(protocol) {

View file

@ -253,6 +253,27 @@ func TestHandleListModels_AvailabilityForOAuthModelWithCredential(t *testing.T)
}
}
func TestHasModelConfiguration_OAuthWithoutMappedCredentialFallsBackToAPIKey(t *testing.T) {
noKey := &config.ModelConfig{
Provider: "gemini",
Model: "gemini-2.5-flash",
AuthMethod: "oauth",
}
if hasModelConfiguration(noKey) {
t.Fatal("oauth model without credential mapping and api key should be unconfigured")
}
withKey := &config.ModelConfig{
Provider: "gemini",
Model: "gemini-2.5-flash",
AuthMethod: "oauth",
APIKeys: config.SimpleSecureStrings("gemini-key"),
}
if !hasModelConfiguration(withKey) {
t.Fatal("oauth model without credential mapping should fall back to api key configuration")
}
}
func TestHandleListModels_AntigravityImplicitOAuthAvailability(t *testing.T) {
configPath, cleanup := setupOAuthTestEnv(t)
defer cleanup()

View file

@ -47,6 +47,7 @@ export function ModelsPage() {
const [settingDefaultIndex, setSettingDefaultIndex] = useState<number | null>(
null,
)
const addDisabled = loading || providerOptions.length === 0
const fetchModels = useCallback(async () => {
try {
@ -141,7 +142,12 @@ export function ModelsPage() {
<div className="flex h-full flex-col">
<PageHeader title={t("navigation.models")}>
<div className="flex items-center gap-3">
<Button size="sm" variant="outline" onClick={() => setAddOpen(true)}>
<Button
size="sm"
variant="outline"
disabled={addDisabled}
onClick={() => setAddOpen(true)}
>
<IconPlus className="size-4" />
{t("models.add.button")}
</Button>