diff --git a/src/widgets/ai-settings.tsx b/src/widgets/ai-settings.tsx index c900041..0b6d689 100644 --- a/src/widgets/ai-settings.tsx +++ b/src/widgets/ai-settings.tsx @@ -232,6 +232,23 @@ const AISettingsComponent: React.FC = ({ return secret?.value; }; + const setSecretToManager = async ( + provider: string, + fieldName: string, + value: string + ): Promise => { + await secretsManager?.set( + Private.getToken(), + SECRETS_NAMESPACE, + `${provider}:${fieldName}`, + { + namespace: SECRETS_NAMESPACE, + id: `${provider}:${fieldName}`, + value + } + ); + }; + /** * Attach a secrets field to the secrets manager. * @param input - the DOm element to attach. @@ -308,9 +325,7 @@ const AISettingsComponent: React.FC = ({ // Retrieve the API key from the secrets manager if necessary. if (model.config.useSecretsManager && secretsManager) { provider.apiKey = - (await getSecretFromManager(provider.provider, 'apiKey')) ?? - provider.apiKey ?? - ''; + (await getSecretFromManager(provider.provider, 'apiKey')) ?? ''; } setEditingProvider(provider); setDialogOpen(true); @@ -354,6 +369,15 @@ const AISettingsComponent: React.FC = ({ if (updates.useSecretsManager !== undefined) { if (updates.useSecretsManager) { for (const provider of model.config.providers) { + // if the secrets manager doesn't have the current API key, copy the current + // one from settings. + if (!(await getSecretFromManager(provider.provider, 'apiKey'))) { + setSecretToManager( + provider.provider, + 'apiKey', + provider.apiKey ?? '' + ); + } provider.apiKey = SECRETS_REPLACEMENT; await model.updateProvider(provider.id, provider); } @@ -719,7 +743,7 @@ const AISettingsComponent: React.FC = ({ label={
Use the secrets manager to manage API keys - {!config.useSecretsManager && ( + {config.useSecretsManager && ( } sx={{ mb: 2 }}> The secrets will be stored in plain text in settings