dbeaver/pro#9994 fixes broken AI settings to fix the AI form flow (#4540)

* dbeaver/pro#9994 fixes broken AI settings to fix the AI form flow

* dbeaver/pro#9994 reverts ai settings changes

* dbeaver/pro#9994 fix returning empty configuration id

* dbeaver/pro#9994 adds validations and info messages to handle empty default configuration case

* dbeaver/pro#9994 syncs resources to get changes from backend ai settings

* dbeaver/pro#9994 cleanup

* dbeaver/pro#9994 allows to reset language

---------

Co-authored-by: Ainur <ainur.iagudin@dbeaver.com>
Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
This commit is contained in:
sergeyteleshev
2026-08-18 13:22:41 +02:00
committed by GitHub
co-authored by Ainur Daria Marutkina
parent 9078a379b0
commit 2d0b7d428c
8 changed files with 28 additions and 30 deletions
@@ -75,16 +75,12 @@ public class WebServiceAI implements DBWServiceAI {
public WebAISettingsConfig getAiSettings() throws DBWebException {
WebAIUtils.validateAiPluginEnabled();
AISettings settings = AISettingsManager.getInstance().getSettings();
try {
AIConfigurationProfile configuration = settings.getDefaultConfiguration();
return new WebAISettingsConfig(
configuration.getEngineId(),
configuration.getProfileId(),
getAiLanguage()
);
} catch (DBException e) {
throw new DBWebException(e);
}
AIConfigurationProfile configuration = settings.getDefaultConfigurationOrNull();
return new WebAISettingsConfig(
configuration == null ? "" : configuration.getEngineId(),
configuration == null ? null : configuration.getProfileId(),
getAiLanguage()
);
}
@NotNull
@@ -8,12 +8,14 @@
import { observer } from 'mobx-react-lite';
import {
Alert,
ColoredContainer,
Select,
Container,
Form,
Group,
GroupTitle,
Text,
ToolsAction,
ToolsPanel,
useAutoLoad,
@@ -51,16 +53,6 @@ export const AIAdministrationPage = observer<{
onSubmit: handleSave,
});
function handleLanguageChange(value: string | null) {
settingsInfoPart.state.language = value ?? '';
}
function selectDefaultProfile(value: string | null) {
if (value) {
settingsInfoPart.state.defaultConfiguration = value;
}
}
async function handleSave() {
const saved = await formState.save();
@@ -97,28 +89,33 @@ export const AIAdministrationPage = observer<{
<Group gap keepSize medium>
<Container gap vertical>
<GroupTitle>{translate('ai_administration_settings')}</GroupTitle>
{!profiles.length && (
<Alert title={translate('plugin_ai_administration_default_profile_no_profiles_title')}>
<Text>{translate('plugin_ai_administration_default_profile_no_profiles_message')}</Text>
</Alert>
)}
<Select
items={profiles}
valueSelector={value => value.name}
keySelector={value => value.id}
value={settingsInfoPart.state.defaultConfiguration}
state={settingsInfoPart.state}
name="defaultConfiguration"
description={translate('plugin_ai_administration_default_profile_description')}
disabled={!profiles.length}
iconSelector={value => aiEnginesResource.data.find(e => e.id === value.engineId)?.icon}
small
onSelect={selectDefaultProfile}
>
{translate('plugin_ai_administration_default_profile_label')}
</Select>
<Combobox
value={settingsInfoPart.state.language}
name="language"
state={settingsInfoPart.state}
items={LANGUAGE_OPTIONS}
description={translate('plugin_ai_administration_language_description')}
allowCustomValue
allowClear
small
onChange={handleLanguageChange}
>
{translate('plugin_ai_administration_language_label')}
</Combobox>
@@ -40,6 +40,7 @@ export class AIProfilesResource extends CachedMapResource<string, AIProfile> {
permissionsResource.require(this, EAdminPermission.admin).outdateResource(this);
this.onItemDelete.addHandler(() => aiSettingsResource.markOutdated());
this.onItemUpdate.addHandler(() => aiSettingsResource.markOutdated());
}
async create(config: AIProfileInput): Promise<AIAdminProfile> {
@@ -54,13 +54,9 @@ export class AdministrationAISettingsInfoPart extends FormPart<IAdministrationAI
}
protected override async saveChanges(): Promise<void> {
if (!this.state.defaultConfiguration) {
return;
}
await this.aiSettingsResource.saveSettings({
defaultConfiguration: this.state.defaultConfiguration,
language: this.state.language ?? undefined,
defaultConfiguration: this.state.defaultConfiguration ?? undefined,
language: this.state.language ?? '',
});
}
@@ -21,6 +21,8 @@ export default [
['plugin_ai_administration_language_length_validation_error', 'Die Sprache darf nicht länger als 128 Zeichen sein'],
['plugin_ai_administration_default_profile_label', 'Standardprofil'],
['plugin_ai_administration_default_profile_description', 'Profil, das standardmäßig für KI-Funktionen verwendet wird'],
['plugin_ai_administration_default_profile_no_profiles_title', 'No profiles available'],
['plugin_ai_administration_default_profile_no_profiles_message', 'Create a profile in the "{alias:plugin_ai_administration_profiles_title}" tab'],
['plugin_ai_administration_profiles_title', 'Profile'],
['plugin_ai_administration_profiles_table_empty_placeholder', 'Keine Profile gefunden. Erstellen Sie ein neues Profil'],
['plugin_ai_administration_profile_column_name', 'Name'],
@@ -21,6 +21,8 @@ export default [
['plugin_ai_administration_language_length_validation_error', 'Language must not be longer than 128 characters'],
['plugin_ai_administration_default_profile_label', 'Default profile'],
['plugin_ai_administration_default_profile_description', 'Profile used by default for AI features'],
['plugin_ai_administration_default_profile_no_profiles_title', 'No profiles available'],
['plugin_ai_administration_default_profile_no_profiles_message', 'Create a profile in the "{alias:plugin_ai_administration_profiles_title}" tab'],
['plugin_ai_administration_profiles_title', 'Profiles'],
['plugin_ai_administration_profiles_table_empty_placeholder', 'No profiles found. Create a new profile'],
['plugin_ai_administration_profile_column_name', 'Name'],
@@ -21,6 +21,8 @@ export default [
['plugin_ai_administration_language_length_validation_error', 'La langue ne doit pas dépasser 128 caractères'],
['plugin_ai_administration_default_profile_label', 'Profil par défaut'],
['plugin_ai_administration_default_profile_description', "Profil utilisé par défaut pour les fonctionnalités d'IA"],
['plugin_ai_administration_default_profile_no_profiles_title', 'No profiles available'],
['plugin_ai_administration_default_profile_no_profiles_message', 'Create a profile in the "{alias:plugin_ai_administration_profiles_title}" tab'],
['plugin_ai_administration_profiles_title', 'Profils'],
['plugin_ai_administration_profiles_table_empty_placeholder', 'Aucun profil trouvé. Créez un nouveau profil'],
['plugin_ai_administration_profile_column_name', 'Nom'],
@@ -21,6 +21,8 @@ export default [
['plugin_ai_administration_language_length_validation_error', 'Язык не должен превышать 128 символов'],
['plugin_ai_administration_default_profile_label', 'Профиль по умолчанию'],
['plugin_ai_administration_default_profile_description', 'Профиль, используемый по умолчанию для функций ИИ'],
['plugin_ai_administration_default_profile_no_profiles_title', 'Нет доступных профилей'],
['plugin_ai_administration_default_profile_no_profiles_message', 'Создайте профиль на вкладке "{alias:plugin_ai_administration_profiles_title}"'],
['plugin_ai_administration_profiles_title', 'Профили'],
['plugin_ai_administration_profiles_table_empty_placeholder', 'Профили не найдены. Создайте новый профиль'],
['plugin_ai_administration_profile_column_name', 'Название'],