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
* @returns {string} The parsed parameter's value or a default value if not found.
*/
function parseParamFromPrompt(prompt, paramName) {
- const paramRegex = new RegExp(`<${paramName}>([\\s\\S]+?)${paramName}>`);
+ // Handle null/undefined prompt
+ if (!prompt) {
+ return `No ${paramName} provided`;
+ }
+
+ // Try original format first:
value
+ const simpleRegex = new RegExp(`<${paramName}>(.*?)${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: Incomplete Tag');
+ });
+
+ test('handles empty tags', () => {
+ const prompt = '';
+ expect(parseParamFromPrompt(prompt, 'title')).toBe('');
+ });
+
+ test('handles empty parameter tags', () => {
+ const prompt = '';
+ expect(parseParamFromPrompt(prompt, 'title')).toBe('');
+ });
+});