@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
JavaScript
;
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