diff --git a/api/app/clients/prompts/titlePrompts.js b/api/app/clients/prompts/titlePrompts.js index 77bdc181d8..de04157ba5 100644 --- a/api/app/clients/prompts/titlePrompts.js +++ b/api/app/clients/prompts/titlePrompts.js @@ -99,10 +99,24 @@ ONLY include the generated translation without quotations, nor its related key([\\s\\S]+?)`); + // Handle null/undefined prompt + if (!prompt) { + return `No ${paramName} provided`; + } + + // Try original format first: value + const simpleRegex = new RegExp(`<${paramName}>(.*?)`, 's'); + const simpleMatch = prompt.match(simpleRegex); + + if (simpleMatch) { + return simpleMatch[1].trim(); + } + + // Try parameter format: value + const paramRegex = new RegExp(`(.*?)`, 's'); const paramMatch = prompt.match(paramRegex); - if (paramMatch && paramMatch[1]) { + if (paramMatch) { return paramMatch[1].trim(); } diff --git a/api/app/clients/prompts/titlePrompts.spec.js b/api/app/clients/prompts/titlePrompts.spec.js new file mode 100644 index 0000000000..df64ed2ae0 --- /dev/null +++ b/api/app/clients/prompts/titlePrompts.spec.js @@ -0,0 +1,73 @@ +const { parseParamFromPrompt } = require('./titlePrompts'); +describe('parseParamFromPrompt', () => { + // Original simple format tests + test('extracts parameter from simple format', () => { + const prompt = 'Simple Title'; + expect(parseParamFromPrompt(prompt, 'title')).toBe('Simple Title'); + }); + + // Parameter format tests + test('extracts parameter from parameter format', () => { + const prompt = + ' Complex Title '; + expect(parseParamFromPrompt(prompt, 'title')).toBe('Complex Title'); + }); + + // Edge cases and error handling + test('returns NO TOOL INVOCATION message for non-matching content', () => { + const prompt = 'Some random text without parameters'; + expect(parseParamFromPrompt(prompt, 'title')).toBe( + 'NO TOOL INVOCATION: Some random text without parameters', + ); + }); + + test('returns default message for empty prompt', () => { + expect(parseParamFromPrompt('', 'title')).toBe('No title provided'); + }); + + test('returns default message for null prompt', () => { + expect(parseParamFromPrompt(null, 'title')).toBe('No title provided'); + }); + + // Multiple parameter tests + test('works with different parameter names', () => { + const prompt = 'John Doe'; + expect(parseParamFromPrompt(prompt, 'name')).toBe('John Doe'); + }); + + test('handles multiline content', () => { + const prompt = `This is a + multiline + description`; + expect(parseParamFromPrompt(prompt, 'description')).toBe( + 'This is a\n multiline\n description', + ); + }); + + // Whitespace handling + test('trims whitespace from extracted content', () => { + const prompt = ' Padded Title '; + expect(parseParamFromPrompt(prompt, 'title')).toBe('Padded Title'); + }); + + test('handles whitespace in parameter format', () => { + const prompt = ' Padded Parameter Title '; + expect(parseParamFromPrompt(prompt, 'title')).toBe('Padded Parameter Title'); + }); + + // Invalid format tests + test('handles malformed tags', () => { + const prompt = 'Incomplete Tag'; + expect(parseParamFromPrompt(prompt, 'title')).toBe('NO TOOL INVOCATION: <title>Incomplete Tag'); + }); + + test('handles empty tags', () => { + const prompt = '<title>'; + expect(parseParamFromPrompt(prompt, 'title')).toBe(''); + }); + + test('handles empty parameter tags', () => { + const prompt = ''; + expect(parseParamFromPrompt(prompt, 'title')).toBe(''); + }); +});