@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
333 lines (319 loc) • 10.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TemplateInheritanceManager = void 0;
exports.createCommonBaseTemplates = createCommonBaseTemplates;
exports.createInheritanceManager = createInheritanceManager;
const advanced_prompt_template_1 = require("./advanced-prompt-template");
/**
* Template Inheritance System
* Enables hierarchical template structures with base templates and child templates
*/
class TemplateInheritanceManager {
constructor() {
this.baseTemplates = new Map();
this.templateHierarchy = new Map(); // parent -> children
}
/**
* Register a base template
*/
registerBaseTemplate(name, template) {
this.baseTemplates.set(name, template);
if (!this.templateHierarchy.has(name)) {
this.templateHierarchy.set(name, []);
}
}
/**
* Create a child template that inherits from a base template
*/
createChildTemplate(baseName, childOptions) {
const baseTemplate = this.baseTemplates.get(baseName);
if (!baseTemplate) {
throw new Error(`Base template '${baseName}' not found`);
}
// Build the child template with inheritance
const childTemplate = this.buildInheritedTemplate(baseTemplate, childOptions);
// Track the inheritance relationship
const children = this.templateHierarchy.get(baseName) || [];
children.push(childOptions.name);
this.templateHierarchy.set(baseName, children);
return childTemplate;
}
/**
* Build an inherited template by combining base and child specifications
*/
buildInheritedTemplate(baseTemplate, childOptions) {
// Start with base template structure
let templateString = baseTemplate.template;
// Replace or extend blocks defined in child
if (childOptions.blocks) {
Object.entries(childOptions.blocks).forEach(([blockName, blockContent]) => {
const blockRegex = new RegExp(`\\{\\{#block\\s+${blockName}\\}\\}[\\s\\S]*?\\{\\{\\/block\\}\\}`, 'g');
if (blockRegex.test(templateString)) {
// Replace existing block
templateString = templateString.replace(blockRegex, `{{#block ${blockName}}}${blockContent.content}{{/block}}`);
}
else {
// Add new block at the end
templateString += `\n{{#block ${blockName}}}${blockContent.content}{{/block}}`;
}
});
}
// Handle section extensions
if (childOptions.sections) {
Object.entries(childOptions.sections).forEach(([sectionName, sectionOptions]) => {
const sectionRegex = new RegExp(`\\{\\{#section\\s+${sectionName}\\}\\}([\\s\\S]*?)\\{\\{\\/section\\}\\}`, 'g');
templateString = templateString.replace(sectionRegex, (match, existingContent) => {
let newContent = existingContent;
switch (sectionOptions.mode) {
case 'replace':
newContent = sectionOptions.content;
break;
case 'prepend':
newContent = sectionOptions.content + '\n' + existingContent;
break;
case 'append':
newContent = existingContent + '\n' + sectionOptions.content;
break;
default:
newContent = sectionOptions.content;
}
return `{{#section ${sectionName}}}${newContent}{{/section}}`;
});
});
}
// Merge variables (child overrides base)
const mergedVariables = {
...baseTemplate.defaultVariables,
...childOptions.variables
};
// Merge custom functions
const mergedFunctions = {
...(baseTemplate.customFunctions || {}),
...(childOptions.customFunctions || {})
};
return new advanced_prompt_template_1.AdvancedPromptTemplate({
template: templateString,
variables: mergedVariables,
customFunctions: mergedFunctions,
enableConditionals: true,
enableLoops: true,
enableInheritance: true,
escapeHtml: childOptions.escapeHtml ?? baseTemplate.escapeHtml,
preserveWhitespace: childOptions.preserveWhitespace ?? baseTemplate.preserveWhitespace
});
}
/**
* Get the inheritance hierarchy for a base template
*/
getHierarchy(baseName) {
const children = this.templateHierarchy.get(baseName) || [];
const baseTemplate = this.baseTemplates.get(baseName);
return {
baseName,
baseTemplate: baseTemplate || null,
children: children.map(childName => ({
name: childName,
// In a real implementation, you'd store child template metadata
blocks: [],
sections: []
}))
};
}
/**
* Validate template inheritance structure
*/
validateInheritance(baseName) {
const errors = [];
const warnings = [];
const baseTemplate = this.baseTemplates.get(baseName);
if (!baseTemplate) {
errors.push(`Base template '${baseName}' not found`);
return { isValid: false, errors, warnings };
}
// Check for required blocks
if (baseTemplate.requiredBlocks) {
baseTemplate.requiredBlocks.forEach(blockName => {
const blockRegex = new RegExp(`\\{\\{#block\\s+${blockName}\\}\\}`);
if (!blockRegex.test(baseTemplate.template)) {
warnings.push(`Required block '${blockName}' not found in base template`);
}
});
}
// Check for circular dependencies (simplified check)
const children = this.templateHierarchy.get(baseName) || [];
if (children.includes(baseName)) {
errors.push(`Circular dependency detected in template '${baseName}'`);
}
return {
isValid: errors.length === 0,
errors,
warnings
};
}
/**
* Get all base template names
*/
getBaseTemplateNames() {
return Array.from(this.baseTemplates.keys());
}
/**
* Export template hierarchy as JSON
*/
exportHierarchy() {
const hierarchy = {};
this.baseTemplates.forEach((template, name) => {
hierarchy[name] = {
template: template.template,
defaultVariables: template.defaultVariables,
children: this.templateHierarchy.get(name) || []
};
});
return hierarchy;
}
}
exports.TemplateInheritanceManager = TemplateInheritanceManager;
/**
* Helper function to create common base templates
*/
function createCommonBaseTemplates() {
return [
{
name: 'basic_prompt',
template: `{{#section header}}
You are a helpful AI assistant.
{{/section}}
{{#section task}}
{{#block task_description}}
Please help with the following task:
{{/block}}
{{/section}}
{{#section content}}
{{#block main_content}}
{content}
{{/block}}
{{/section}}
{{#section instructions}}
{{#block instructions}}
Please provide a clear and helpful response.
{{/block}}
{{/section}}
{{#section footer}}
{{#block footer}}
Thank you for using our AI assistant.
{{/block}}
{{/section}}`,
description: 'Basic prompt template with standard sections',
defaultVariables: {
content: 'Please specify the content to process'
},
requiredBlocks: ['main_content'],
optionalBlocks: ['task_description', 'instructions', 'footer']
},
{
name: 'analysis_prompt',
template: `{{#section header}}
You are an expert analyst with deep knowledge in {domain}.
{{/section}}
{{#section context}}
{{#block context}}
{{#if context}}
Context: {context}
{{/if}}
{{/block}}
{{/section}}
{{#section task}}
{{#block analysis_task}}
Please analyze the following {content_type}:
{{/block}}
{{/section}}
{{#section content}}
{{#block main_content}}
{content}
{{/block}}
{{/section}}
{{#section requirements}}
{{#block analysis_requirements}}
Focus on:
{{#each focus_areas as area}}
- {area}
{{/each}}
{{/block}}
{{/section}}
{{#section output}}
{{#block output_format}}
Provide your analysis in the following format:
1. Summary
2. Key findings
3. Recommendations
{{/block}}
{{/section}}`,
description: 'Template for analytical tasks',
defaultVariables: {
domain: 'general analysis',
content_type: 'data',
focus_areas: ['key insights', 'patterns', 'recommendations']
},
requiredBlocks: ['main_content', 'analysis_task'],
optionalBlocks: ['context', 'analysis_requirements', 'output_format']
},
{
name: 'creative_prompt',
template: `{{#section header}}
You are a creative AI assistant specializing in {creative_domain}.
{{/section}}
{{#section inspiration}}
{{#block inspiration}}
{{#if inspiration_sources}}
Draw inspiration from: {inspiration_sources}
{{/if}}
{{/block}}
{{/section}}
{{#section task}}
{{#block creative_task}}
Create {creative_output_type} based on the following:
{{/block}}
{{/section}}
{{#section content}}
{{#block main_content}}
{content}
{{/block}}
{{/section}}
{{#section style}}
{{#block style_guide}}
Style requirements:
- Tone: {tone}
- Style: {style}
{{#if constraints}}
- Constraints: {constraints}
{{/if}}
{{/block}}
{{/section}}
{{#section output}}
{{#block creative_output}}
Please provide your creative response below:
{{/block}}
{{/section}}`,
description: 'Template for creative tasks',
defaultVariables: {
creative_domain: 'content creation',
creative_output_type: 'content',
tone: 'engaging',
style: 'creative'
},
requiredBlocks: ['main_content', 'creative_task'],
optionalBlocks: ['inspiration', 'style_guide', 'creative_output']
}
];
}
/**
* Helper function to create a template inheritance manager with common base templates
*/
function createInheritanceManager() {
const manager = new TemplateInheritanceManager();
// Register common base templates
createCommonBaseTemplates().forEach(template => {
manager.registerBaseTemplate(template.name, template);
});
return manager;
}
//# sourceMappingURL=template-inheritance.js.map