diff --git a/apps/app/src/app/context/providers/provider-auth-modal.tsx b/apps/app/src/app/context/providers/provider-auth-modal.tsx index 3460d2c28..61dbc45db 100644 --- a/apps/app/src/app/context/providers/provider-auth-modal.tsx +++ b/apps/app/src/app/context/providers/provider-auth-modal.tsx @@ -90,19 +90,6 @@ export default function ProviderAuthModal(props: ProviderAuthModalProps) { return normalizedId === "openai" || normalizedName === "openai"; }; - // TODO: remove once we upgrade to opencode 1.3.0 — the Claude Pro/Max OAuth - // method is dropped upstream there, so this client-side filter is no longer needed. - const isAnthropicProvider = (id: string, fallbackName?: string) => { - const normalizedId = id.trim().toLowerCase(); - const normalizedName = fallbackName?.trim().toLowerCase() ?? ""; - return normalizedId === "anthropic" || normalizedName === "anthropic"; - }; - - const isClaudeProMaxMethod = (method: ProviderAuthMethod) => { - const label = method.label.toLowerCase(); - return method.type === "oauth" && label.includes("pro/max"); - }; - const entries = createMemo(() => { const methods = props.authMethods ?? {}; const connected = new Set(props.connectedProviderIds ?? []); @@ -112,9 +99,6 @@ export default function ProviderAuthModal(props: ProviderAuthModalProps) { .map((id): ProviderAuthEntry => { const provider = providers.find((item) => item.id === id); const entryMethods = (methods[id] ?? []).filter((method) => { - if (isAnthropicProvider(id, provider?.name) && isClaudeProMaxMethod(method)) { - return false; - } if (!isOpenAiProvider(id, provider?.name)) return true; if (method.type !== "oauth") return true; if (isRemoteWorker()) return isOpenAiHeadlessMethod(method); diff --git a/apps/app/src/app/context/providers/store.ts b/apps/app/src/app/context/providers/store.ts index 7a9f61e84..04836c691 100644 --- a/apps/app/src/app/context/providers/store.ts +++ b/apps/app/src/app/context/providers/store.ts @@ -336,6 +336,12 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) { workerType: "local" | "remote", cloudProviders: DenOrgLlmProvider[], ) => { + const isNamedProvider = (id: string, fallbackName: string | undefined, target: string) => { + const normalizedId = id.trim().toLowerCase(); + const normalizedName = fallbackName?.trim().toLowerCase() ?? ""; + return normalizedId === target || normalizedName === target; + }; + const merged = Object.fromEntries( Object.entries(methods ?? {}).map(([id, providerMethods]) => [ id, @@ -355,9 +361,7 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) { } for (const [id, providerMethods] of Object.entries(merged)) { const provider = availableProviders.find((item) => item.id === id); - const normalizedId = id.trim().toLowerCase(); - const normalizedName = provider?.name?.trim().toLowerCase() ?? ""; - const isOpenAiProvider = normalizedId === "openai" || normalizedName === "openai"; + const isOpenAiProvider = isNamedProvider(id, provider?.name, "openai"); if (!isOpenAiProvider) continue; merged[id] = providerMethods.filter((method) => { if (method.type !== "oauth") return true; @@ -377,6 +381,13 @@ export function createProvidersStore(options: CreateProvidersStoreOptions) { merged[id] = [...existing, buildCloudProviderMethod(provider)]; } + for (const [id, providerMethods] of Object.entries(merged)) { + const provider = availableProviders.find((item) => item.id === id); + if (!isNamedProvider(id, provider?.name, "anthropic")) continue; + // Anthropic no longer supports in-product key creation or subscription sign-in. + merged[id] = providerMethods.filter((method) => method.type === "api"); + } + return merged; }; diff --git a/pr/anthropic-manual-api-key-only/anthropic-api-key-only-screen.png b/pr/anthropic-manual-api-key-only/anthropic-api-key-only-screen.png new file mode 100644 index 000000000..f73d4bda6 Binary files /dev/null and b/pr/anthropic-manual-api-key-only/anthropic-api-key-only-screen.png differ diff --git a/pr/anthropic-manual-api-key-only/anthropic-filtered-modal.png b/pr/anthropic-manual-api-key-only/anthropic-filtered-modal.png new file mode 100644 index 000000000..ebb235a00 Binary files /dev/null and b/pr/anthropic-manual-api-key-only/anthropic-filtered-modal.png differ diff --git a/pr/anthropic-manual-api-key-only/anthropic-provider-modal.png b/pr/anthropic-manual-api-key-only/anthropic-provider-modal.png new file mode 100644 index 000000000..4b85d301a Binary files /dev/null and b/pr/anthropic-manual-api-key-only/anthropic-provider-modal.png differ