fix: check all required keys (#1489)
Co-authored-by: Lily Delalande <ldelalande@squareup.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { Provider, ProviderResponse } from './types';
|
import { Provider, ProviderResponse } from './types';
|
||||||
import { getApiUrl, getSecretKey } from '../../../config';
|
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 {
|
export function isSecretKey(keyName: string): boolean {
|
||||||
// Endpoints and hosts should not be stored as secrets
|
// Endpoints and hosts should not be stored as secrets
|
||||||
@@ -17,30 +17,41 @@ export function isSecretKey(keyName: string): boolean {
|
|||||||
return !nonSecretKeys.includes(keyName);
|
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[]> {
|
export async function getActiveProviders(): Promise<string[]> {
|
||||||
try {
|
try {
|
||||||
const configSettings = await getConfigSettings();
|
const configSettings = await getConfigSettings();
|
||||||
|
|
||||||
const activeProviders = Object.values(configSettings)
|
const activeProviders = Object.values(configSettings)
|
||||||
.filter((provider) => {
|
.filter((provider) => {
|
||||||
// 1. Get provider's config_status
|
const providerName = provider.name;
|
||||||
const configStatus = provider.config_status ?? {};
|
const configStatus = provider.config_status ?? {};
|
||||||
|
|
||||||
// 2. Collect only the keys *not* in default_key_value
|
// Skip if provider isn't in required_keys
|
||||||
const requiredKeyEntries = Object.entries(configStatus).filter(([k]) => isRequiredKey(k));
|
if (!required_keys[providerName]) return false;
|
||||||
|
|
||||||
// 3. If there are *no* non-default keys, it is NOT active
|
// Get all required keys for this provider
|
||||||
if (requiredKeyEntries.length === 0) {
|
const providerRequiredKeys = required_keys[providerName];
|
||||||
return false;
|
|
||||||
|
// 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Otherwise, all non-default keys must be `is_set`
|
// For providers with multiple keys or keys without defaults:
|
||||||
return requiredKeyEntries.every(([_, value]) => value?.is_set);
|
// Check if all required keys without defaults are set
|
||||||
|
const requiredNonDefaultKeys = providerRequiredKeys.filter(
|
||||||
|
(key) => !(key in default_key_value)
|
||||||
|
);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, all non-default keys must be set
|
||||||
|
return requiredNonDefaultKeys.every((key) => configStatus[key]?.is_set === true);
|
||||||
})
|
})
|
||||||
.map((provider) => provider.name || 'Unknown Provider');
|
.map((provider) => provider.name || 'Unknown Provider');
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,11 @@ import { GOOSE_PROVIDER } from '../env_vars';
|
|||||||
import { Model } from '../components/settings/models/ModelContext';
|
import { Model } from '../components/settings/models/ModelContext';
|
||||||
|
|
||||||
export function getStoredProvider(config: any): string | null {
|
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);
|
return config.GOOSE_PROVIDER || localStorage.getItem(GOOSE_PROVIDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getStoredModel(): string | null {
|
export function getStoredModel(): string | null {
|
||||||
const storedModel = localStorage.getItem('GOOSE_MODEL'); // Adjust key name if necessary
|
const storedModel = localStorage.getItem('GOOSE_MODEL'); // Adjust key name if necessary
|
||||||
console.log('local storage goose model', storedModel);
|
|
||||||
|
|
||||||
if (storedModel) {
|
if (storedModel) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user