From 766643ea1c3035ab3708a031844b4a5d41f4ee78 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 6 Nov 2024 13:40:49 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=AF=20feat:=20Enhance=20Title=20Parame?= =?UTF-8?q?ter=20Parsing=20with=20new=20Anthropic=20Format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/clients/prompts/titlePrompts.js | 18 ++++- api/app/clients/prompts/titlePrompts.spec.js | 73 ++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 api/app/clients/prompts/titlePrompts.spec.js 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(''); + }); +});