Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: check all required keys #1489

Merged
merged 5 commits into from
Mar 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 26 additions & 15 deletions ui/desktop/src/components/settings/api_keys/utils.tsx
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<string[]> {
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');

Expand Down
3 changes: 0 additions & 3 deletions ui/desktop/src/utils/providerUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Loading