Skip to content

Commit cf91de4

Browse files
author
eust-w
committed
fix(ui-tars): allow VLM key fields from multiple sources during preset import (#532)
1 parent 5c31f54 commit cf91de4

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

apps/ui-tars/src/main/store/setting.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as env from '@main/env';
99
import { logger } from '@main/logger';
1010

1111
import { LocalStore, VLMProviderV2 } from './types';
12-
import { validatePreset } from './validate';
12+
import { validatePreset, mergeWithExistingSettings } from './validate';
1313
import { BrowserWindow } from 'electron';
1414

1515
export const DEFAULT_SETTING: LocalStore = {
@@ -114,8 +114,15 @@ export class SettingStore {
114114
yamlContent: string,
115115
): Promise<LocalStore> {
116116
try {
117-
const settings = await parsePresetYaml(yamlContent);
118-
return settings;
117+
// Get current settings
118+
const currentSettings = this.getStore();
119+
// Parse and validate imported settings
120+
const importedSettings = await parsePresetYaml(yamlContent);
121+
// Merge settings, ensuring required fields exist
122+
const mergedSettings = mergeWithExistingSettings(importedSettings, currentSettings);
123+
// Update storage
124+
this.setStore(mergedSettings);
125+
return mergedSettings;
119126
} catch (error) {
120127
logger.error('Failed to import preset from text:', error);
121128
throw error;
@@ -134,7 +141,7 @@ export class SettingStore {
134141
}
135142
}
136143

137-
async function parsePresetYaml(yamlContent: string): Promise<LocalStore> {
144+
async function parsePresetYaml(yamlContent: string): Promise<Partial<LocalStore>> {
138145
const preset = yaml.load(yamlContent);
139146
const validatedPreset = validatePreset(preset);
140147
return validatedPreset;

apps/ui-tars/src/main/store/validate.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ const PresetSourceSchema = z.object({
1414
});
1515

1616
export const PresetSchema = z.object({
17-
// Required fields
17+
// Fields that can be imported from preset or set in UI
1818
vlmProvider: z.nativeEnum(VLMProviderV2).optional(),
19-
vlmBaseUrl: z.string().url(),
20-
vlmApiKey: z.string().min(1),
21-
vlmModelName: z.string().min(1),
19+
vlmBaseUrl: z.string().url().optional(),
20+
vlmApiKey: z.string().min(1).optional(),
21+
vlmModelName: z.string().min(1).optional(),
2222

2323
// Optional fields
2424
language: z.enum(['zh', 'en']).optional(),
@@ -37,3 +37,16 @@ export type LocalStore = z.infer<typeof PresetSchema>;
3737
export const validatePreset = (data: unknown): LocalStore => {
3838
return PresetSchema.parse(data);
3939
};
40+
41+
// Merge existing settings with imported settings, ensuring required fields exist
42+
export const mergeWithExistingSettings = (imported: Partial<LocalStore>, existing: LocalStore): LocalStore => {
43+
// Merge settings, prioritizing imported values but keeping existing values as fallback
44+
return {
45+
...existing,
46+
...imported,
47+
// Ensure these three key fields have values from at least one source
48+
vlmBaseUrl: imported.vlmBaseUrl || existing.vlmBaseUrl,
49+
vlmApiKey: imported.vlmApiKey || existing.vlmApiKey,
50+
vlmModelName: imported.vlmModelName || existing.vlmModelName,
51+
};
52+
};

0 commit comments

Comments
 (0)