UNPKG

@callmedayz/ai-prompt-toolkit

Version:

Professional AI prompt engineering toolkit with advanced template features, real-time dashboards, conditional logic, template inheritance, live monitoring, OpenRouter integration, and 310+ model support

195 lines 8.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PromptOptimizer = void 0; const token_counter_1 = require("./token-counter"); const openrouter_types_1 = require("./openrouter-types"); /** * Prompt optimization utility for reducing token usage while maintaining effectiveness */ class PromptOptimizer { /** * Optimize a prompt to reduce token usage */ static optimize(prompt, model = openrouter_types_1.DEFAULT_FREE_MODEL) { const originalTokens = token_counter_1.TokenCounter.estimateTokens(prompt, model).tokens; let optimizedPrompt = prompt; const optimizations = []; // Apply various optimization techniques optimizedPrompt = this.removeRedundantWords(optimizedPrompt, optimizations); optimizedPrompt = this.simplifyLanguage(optimizedPrompt, optimizations); optimizedPrompt = this.compressWhitespace(optimizedPrompt, optimizations); optimizedPrompt = this.abbreviateCommonPhrases(optimizedPrompt, optimizations); optimizedPrompt = this.removeFillerWords(optimizedPrompt, optimizations); const optimizedTokens = token_counter_1.TokenCounter.estimateTokens(optimizedPrompt, model).tokens; const tokensSaved = originalTokens - optimizedTokens; return { originalPrompt: prompt, optimizedPrompt, tokensSaved, optimizations }; } /** * Remove redundant words and phrases */ static removeRedundantWords(prompt, optimizations) { const redundantPhrases = [ { pattern: /please\s+/gi, replacement: '' }, { pattern: /kindly\s+/gi, replacement: '' }, { pattern: /I would like you to\s+/gi, replacement: '' }, { pattern: /Could you\s+/gi, replacement: '' }, { pattern: /Can you\s+/gi, replacement: '' }, { pattern: /I need you to\s+/gi, replacement: '' }, { pattern: /Make sure to\s+/gi, replacement: '' }, { pattern: /Be sure to\s+/gi, replacement: '' } ]; let result = prompt; let changed = false; redundantPhrases.forEach(({ pattern, replacement }) => { if (pattern.test(result)) { result = result.replace(pattern, replacement); changed = true; } }); if (changed) { optimizations.push('Removed redundant politeness phrases'); } return result; } /** * Simplify complex language constructions */ static simplifyLanguage(prompt, optimizations) { const simplifications = [ { pattern: /in order to/gi, replacement: 'to' }, { pattern: /due to the fact that/gi, replacement: 'because' }, { pattern: /for the purpose of/gi, replacement: 'to' }, { pattern: /with regard to/gi, replacement: 'about' }, { pattern: /in the event that/gi, replacement: 'if' }, { pattern: /at this point in time/gi, replacement: 'now' }, { pattern: /it is important to note that/gi, replacement: 'note:' }, { pattern: /it should be mentioned that/gi, replacement: '' } ]; let result = prompt; let changed = false; simplifications.forEach(({ pattern, replacement }) => { if (pattern.test(result)) { result = result.replace(pattern, replacement); changed = true; } }); if (changed) { optimizations.push('Simplified complex language constructions'); } return result; } /** * Compress whitespace and formatting */ static compressWhitespace(prompt, optimizations) { const original = prompt; // Remove extra spaces let result = prompt.replace(/\s+/g, ' '); // Remove extra line breaks result = result.replace(/\n\s*\n\s*\n/g, '\n\n'); // Trim result = result.trim(); if (result !== original) { optimizations.push('Compressed whitespace'); } return result; } /** * Abbreviate common phrases */ static abbreviateCommonPhrases(prompt, optimizations) { const abbreviations = [ { pattern: /for example/gi, replacement: 'e.g.' }, { pattern: /that is/gi, replacement: 'i.e.' }, { pattern: /and so on/gi, replacement: 'etc.' }, { pattern: /as soon as possible/gi, replacement: 'ASAP' }, { pattern: /frequently asked questions/gi, replacement: 'FAQ' }, { pattern: /application programming interface/gi, replacement: 'API' } ]; let result = prompt; let changed = false; abbreviations.forEach(({ pattern, replacement }) => { if (pattern.test(result)) { result = result.replace(pattern, replacement); changed = true; } }); if (changed) { optimizations.push('Used abbreviations for common phrases'); } return result; } /** * Remove filler words */ static removeFillerWords(prompt, optimizations) { const fillerWords = [ /\b(actually|basically|literally|obviously|clearly|simply|just|really|very|quite|rather|somewhat|fairly|pretty|kind of|sort of)\s+/gi ]; let result = prompt; let changed = false; fillerWords.forEach(pattern => { if (pattern.test(result)) { result = result.replace(pattern, ' '); changed = true; } }); // Clean up any double spaces created result = result.replace(/\s+/g, ' '); if (changed) { optimizations.push('Removed filler words'); } return result; } /** * Optimize for specific token target */ static optimizeToTarget(prompt, targetTokens, model = openrouter_types_1.DEFAULT_FREE_MODEL) { let result = this.optimize(prompt, model); // If still too long, apply more aggressive optimizations let currentTokens = token_counter_1.TokenCounter.estimateTokens(result.optimizedPrompt, model).tokens; if (currentTokens > targetTokens) { // More aggressive optimization result.optimizedPrompt = this.aggressiveOptimization(result.optimizedPrompt, targetTokens, model); result.optimizations.push('Applied aggressive optimization to meet token target'); const finalTokens = token_counter_1.TokenCounter.estimateTokens(result.optimizedPrompt, model).tokens; result.tokensSaved = token_counter_1.TokenCounter.estimateTokens(result.originalPrompt, model).tokens - finalTokens; } return result; } /** * Apply aggressive optimization techniques */ static aggressiveOptimization(prompt, targetTokens, model) { let result = prompt; let currentTokens = token_counter_1.TokenCounter.estimateTokens(result, model).tokens; // Remove examples if present if (currentTokens > targetTokens) { result = result.replace(/example[s]?:[\s\S]*?(?=\n\n|\n[A-Z]|$)/gi, ''); currentTokens = token_counter_1.TokenCounter.estimateTokens(result, model).tokens; } // Shorten sentences if (currentTokens > targetTokens) { const sentences = result.split(/[.!?]+/).filter(s => s.trim()); const shortened = sentences.map(sentence => { return sentence.trim().split(' ').slice(0, 15).join(' '); }); result = shortened.join('. ') + '.'; currentTokens = token_counter_1.TokenCounter.estimateTokens(result, model).tokens; } // Last resort: truncate if (currentTokens > targetTokens) { const words = result.split(' '); const targetWords = Math.floor(targetTokens * 0.75); // Rough estimation result = words.slice(0, targetWords).join(' ') + '...'; } return result; } } exports.PromptOptimizer = PromptOptimizer; //# sourceMappingURL=prompt-optimizer.js.map