diff --git a/Cargo.lock b/Cargo.lock index 21e8093a18..6820c59409 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3419,7 +3419,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] diff --git a/ui/desktop/src/components/settings/api_keys/utils.tsx b/ui/desktop/src/components/settings/api_keys/utils.tsx index 84431d3bc2..9477251266 100644 --- a/ui/desktop/src/components/settings/api_keys/utils.tsx +++ b/ui/desktop/src/components/settings/api_keys/utils.tsx @@ -1,6 +1,6 @@ import { Provider, ProviderResponse } from './types'; import { getApiUrl, getSecretKey } from '../../../config'; -import { default_key_value } from '../models/hardcoded_stuff'; // e.g. { OPENAI_HOST: '', OLLAMA_HOST: '' } +import { default_key_value, required_keys } from '../models/hardcoded_stuff'; // e.g. { OPENAI_HOST: '', OLLAMA_HOST: '' } export function isSecretKey(keyName: string): boolean { // Endpoints and hosts should not be stored as secrets @@ -17,30 +17,41 @@ export function isSecretKey(keyName: string): boolean { return !nonSecretKeys.includes(keyName); } -// A small helper: returns true if key is *not* in default_key_value -function isRequiredKey(key: string): boolean { - return !Object.prototype.hasOwnProperty.call(default_key_value, key); -} - export async function getActiveProviders(): Promise { try { const configSettings = await getConfigSettings(); - const activeProviders = Object.values(configSettings) .filter((provider) => { - // 1. Get provider's config_status + const providerName = provider.name; const configStatus = provider.config_status ?? {}; - // 2. Collect only the keys *not* in default_key_value - const requiredKeyEntries = Object.entries(configStatus).filter(([k]) => isRequiredKey(k)); + // Skip if provider isn't in required_keys + if (!required_keys[providerName]) return false; + + // Get all required keys for this provider + const providerRequiredKeys = required_keys[providerName]; + + // Special case: If a provider has exactly one required key and that key + // has a default value, check if it's explicitly set + if (providerRequiredKeys.length === 1 && providerRequiredKeys[0] in default_key_value) { + const key = providerRequiredKeys[0]; + // Only consider active if the key is explicitly set + return configStatus[key]?.is_set === true; + } + + // For providers with multiple keys or keys without defaults: + // Check if all required keys without defaults are set + const requiredNonDefaultKeys = providerRequiredKeys.filter( + (key) => !(key in default_key_value) + ); - // 3. If there are *no* non-default keys, it is NOT active - if (requiredKeyEntries.length === 0) { - return false; + // If there are no non-default keys, this provider needs at least one key explicitly set + if (requiredNonDefaultKeys.length === 0) { + return providerRequiredKeys.some((key) => configStatus[key]?.is_set === true); } - // 4. Otherwise, all non-default keys must be `is_set` - return requiredKeyEntries.every(([_, value]) => value?.is_set); + // Otherwise, all non-default keys must be set + return requiredNonDefaultKeys.every((key) => configStatus[key]?.is_set === true); }) .map((provider) => provider.name || 'Unknown Provider'); diff --git a/ui/desktop/src/utils/providerUtils.ts b/ui/desktop/src/utils/providerUtils.ts index 1c452d229f..1f0203a149 100644 --- a/ui/desktop/src/utils/providerUtils.ts +++ b/ui/desktop/src/utils/providerUtils.ts @@ -4,14 +4,11 @@ import { GOOSE_PROVIDER } from '../env_vars'; import { Model } from '../components/settings/models/ModelContext'; export function getStoredProvider(config: any): string | null { - console.log('config goose provider', config.GOOSE_PROVIDER); - console.log('local storage goose provider', localStorage.getItem(GOOSE_PROVIDER)); return config.GOOSE_PROVIDER || localStorage.getItem(GOOSE_PROVIDER); } export function getStoredModel(): string | null { const storedModel = localStorage.getItem('GOOSE_MODEL'); // Adjust key name if necessary - console.log('local storage goose model', storedModel); if (storedModel) { try {