diff --git a/src/settings/versions/v1/v1.ts b/src/settings/versions/v1/v1.ts index 2fc29dd..6799aac 100644 --- a/src/settings/versions/v1/v1.ts +++ b/src/settings/versions/v1/v1.ts @@ -5,6 +5,7 @@ import { MAX_DELAY, MAX_MAX_CHAR_LIMIT, MIN_DELAY, MIN_MAX_CHAR_LIMIT, + MIN_MAX_TOKENS, azureOAIApiSettingsSchema, fewShotExampleSchema, modelOptionsSchema, @@ -151,7 +152,7 @@ export const DEFAULT_SETTINGS = { top_p: 0.1, frequency_penalty: 0.25, presence_penalty: 0, - max_tokens: 800, + max_tokens: MIN_MAX_TOKENS, }, // Prompt settings systemMessage: `Your job is to predict the most logical text that should be written at the location of the . diff --git a/src/types/settings.test.ts b/src/types/settings.test.ts index a768869..d4faf67 100644 --- a/src/types/settings.test.ts +++ b/src/types/settings.test.ts @@ -454,4 +454,82 @@ describe('settings migration', () => { }, }) }) + + it('should migrate max_tokens from old value to new minimum', () => { + // Test case: user has old max_tokens value (800) that needs to be migrated + const settingsWithOldMaxTokens = { + version: 0.4, + modelOptions: { + temperature: 1, + top_p: 0.1, + frequency_penalty: 0.25, + presence_penalty: 0, + max_tokens: 800, // Old value that's below new minimum + }, + // Include other required fields for valid settings + autocompleteEnabled: true, + advancedMode: false, + apiProvider: 'openai', + triggers: DEFAULT_SETTINGS.triggers, + delay: 500, + systemMessage: DEFAULT_SETTINGS.systemMessage, + fewShotExamples: DEFAULT_SETTINGS.fewShotExamples, + userMessageTemplate: '{{prefix}}{{suffix}}', + chainOfThoughRemovalRegex: '(.|\\n)*ANSWER:', + dontIncludeDataviews: true, + maxPrefixCharLimit: 4000, + maxSuffixCharLimit: 4000, + removeDuplicateMathBlockIndicator: true, + removeDuplicateCodeBlockIndicator: true, + ignoredFilePatterns: '**/secret/**\n', + ignoredTags: '', + cacheSuggestions: true, + debugMode: false, + } + + const result = parseInfioSettings(settingsWithOldMaxTokens) + + // Should successfully parse and migrate max_tokens to 4096 + expect(result.modelOptions.max_tokens).toBe(4096) + expect(result.version).toBe(0.5) + }) + + it('should not change max_tokens if it is already above minimum', () => { + // Test case: user has max_tokens already above minimum + const settingsWithValidMaxTokens = { + version: 0.4, + modelOptions: { + temperature: 1, + top_p: 0.1, + frequency_penalty: 0.25, + presence_penalty: 0, + max_tokens: 6000, // Already above minimum + }, + // Include other required fields for valid settings + autocompleteEnabled: true, + advancedMode: false, + apiProvider: 'openai', + triggers: DEFAULT_SETTINGS.triggers, + delay: 500, + systemMessage: DEFAULT_SETTINGS.systemMessage, + fewShotExamples: DEFAULT_SETTINGS.fewShotExamples, + userMessageTemplate: '{{prefix}}{{suffix}}', + chainOfThoughRemovalRegex: '(.|\\n)*ANSWER:', + dontIncludeDataviews: true, + maxPrefixCharLimit: 4000, + maxSuffixCharLimit: 4000, + removeDuplicateMathBlockIndicator: true, + removeDuplicateCodeBlockIndicator: true, + ignoredFilePatterns: '**/secret/**\n', + ignoredTags: '', + cacheSuggestions: true, + debugMode: false, + } + + const result = parseInfioSettings(settingsWithValidMaxTokens) + + // Should keep the existing max_tokens value since it's already valid + expect(result.modelOptions.max_tokens).toBe(6000) + expect(result.version).toBe(0.5) + }) }) diff --git a/src/types/settings.ts b/src/types/settings.ts index cd1bb86..9bad35e 100644 --- a/src/types/settings.ts +++ b/src/types/settings.ts @@ -6,6 +6,7 @@ import { MAX_MAX_CHAR_LIMIT, MIN_DELAY, MIN_MAX_CHAR_LIMIT, + MIN_MAX_TOKENS, fewShotExampleSchema, modelOptionsSchema } from '../settings/versions/shared'; @@ -13,7 +14,7 @@ import { DEFAULT_SETTINGS } from "../settings/versions/v1/v1"; import { ApiProvider } from '../types/llm/model'; import { isRegexValid, isValidIgnorePattern } from '../utils/auto-complete'; -export const SETTINGS_SCHEMA_VERSION = 0.4 +export const SETTINGS_SCHEMA_VERSION = 0.5 const InfioProviderSchema = z.object({ name: z.literal('Infio'), @@ -432,9 +433,28 @@ const MIGRATIONS: Migration[] = [ { fromVersion: 0.1, toVersion: 0.4, + migrate: (data) => { + const newData = { ...data } + newData.version = 0.4 + return newData + }, + }, + { + fromVersion: 0.4, + toVersion: 0.5, migrate: (data) => { const newData = { ...data } newData.version = SETTINGS_SCHEMA_VERSION + + // Handle max_tokens minimum value increase from 800 to 4096 + if (newData.modelOptions && typeof newData.modelOptions === 'object') { + const modelOptions = newData.modelOptions as Record + if (typeof modelOptions.max_tokens === 'number' && modelOptions.max_tokens < MIN_MAX_TOKENS) { + console.log(`Updating max_tokens from ${modelOptions.max_tokens} to ${MIN_MAX_TOKENS} due to minimum value change`) + modelOptions.max_tokens = MIN_MAX_TOKENS + } + } + return newData }, },