Skip to main content

Dynamic Prompt Generation

System prompts are generated dynamically based on detected language, conversation context, and configuration settings.

Language Selection Flow

Implementation

Location: app/api/chat/system-prompt.ts:246-292

export function generateDynamicSystemPrompt(
language?: 'et' | 'en' | 'mixed',
context?: { recipient?: string; occasion?: string; productType?: string }
): string {
// STEP 1: Select base prompt by language
// Rules:
// 1. Estonian query ('et') → Estonian prompt
// 2. English query ('en') → English prompt
// 3. Mixed query ('mixed') → Estonian prompt (default)
// 4. Undefined → Estonian prompt (primary market)

let basePrompt = (!language || language === 'mixed' || language === 'et')
? buildEstonianSystemPrompt()
: buildEnglishSystemPrompt();

console.log('📋 SYSTEM PROMPT: Language-based prompt selection', {
detectedLanguage: language || 'undefined (default to et)',
promptLanguage: (!language || language === 'mixed' || language === 'et')
? 'Estonian'
: 'English',
rule: getRuleApplied(language)
});

// STEP 2: Add context reminders for multi-turn coherence
if (context) {
const isEstonian = (!language || language === 'mixed' || language === 'et');
let contextReminders = '';

if (context.recipient) {
contextReminders += isEstonian
? `\n\nKONTEKSTI MEELDETULETUS: Tooted on sobivad "${context.recipient}" jaoks - mainige seda vastuses!`
: `\n\nCONTEXT REMINDER: Products are suitable for "${context.recipient}" - mention this in your response!`;
}

if (context.occasion && !context.recipient) {
contextReminders += isEstonian
? `\n\nKONTEKSTI MEELDETULETUS: Need sobivad puhuseks "${context.occasion}" - mainige seda!`
: `\n\nCONTEXT REMINDER: These are for "${context.occasion}" - mention this occasion!`;
}

if (contextReminders) {
basePrompt += contextReminders;
}
}

return basePrompt;
}

Context Adaptation

Recipient Context

When user specifies recipient:

context = { recipient: "ema" }

// Adds to prompt:
"KONTEKSTI MEELDETULETUS: Tooted on sobivad "ema" jaoks -
mainige seda vastuses!"

AI Output:

"Siin on suurepärased kingitused sinu emale..."

Occasion Context

When user specifies occasion:

context = { occasion: "sünnipäev" }

// Adds to prompt:
"KONTEKSTI MEELDETULETUS: Need sobivad puhuseks "sünnipäev" -
mainige seda!"

AI Output:

"Need raamatud teevad unustamatu sünnipäevakingituse..."

Combined Context

Both recipient and occasion:

context = { 
recipient: "sõber",
occasion: "sünnipäev"
}

// Only recipient reminder added
// (occasion implied in recipient context)

Multi-Turn Coherence Strategy

Problem: AI forgets context between turns

Solution: Context reminders in system prompt

Example Flow

Turn 1:
User: "kingitus 10-aastasele tüdrukule"
Context: { recipient: "10-aastane tüdruk" }
AI: [Products with context]

Turn 2:
User: "näita rohkem"
Context: { recipient: "10-aastane tüdruk" } ← PRESERVED
Prompt: + "Products are suitable for 10-aastane tüdruk"
AI: "Veel suurepäraseid valikuid 10-aastasele tüdrukule!"
↑ Mentions recipient naturally ↑

Logging & Debugging

console.log('📋 SYSTEM PROMPT: Language-based prompt selection', {
detectedLanguage: 'et',
promptLanguage: 'Estonian',
rule: 'Rule 1: Estonian → Estonian'
});

console.log('📋 CONTEXT REMINDERS ADDED', {
recipient: 'ema',
occasion: null,
reminderCount: 1
});

Performance

Prompt generation time:

Language detection: ~5ms
Base prompt selection: <1ms
Context reminders: ~2ms
Enrichment section: ~1ms
────────────────────────
Total: ~9ms ✓

Token impact:

Base Estonian prompt: ~350 tokens
+ Context reminder: ~25 tokens
+ Enrichment section: ~50 tokens
─────────────────────────────
Total: ~425 tokens

Edge Cases

Case 1: Language Mismatch

Scenario: User writes in English, but language detected as 'et'

Resolution:

// GPT-5.1 is smart enough to respond in appropriate language
// even if prompt is in different language

// Fallback: Response validation catches language mismatch
if (userLanguage !== responseLanguage) {
console.warn('Language mismatch detected');
// Log for analysis
}

Case 2: Mixed Language Query

Scenario: "Tere, I want books for sünnipäev"

Resolution:

language = 'mixed'
→ Estonian prompt (Rule 3)
GPT-5.1 responds in Estonian (primary market)

Case 3: Context Changes Mid-Conversation

Scenario:

Turn 1: "kingitus emale" (recipient: ema)
Turn 2: "kingitus isale" (recipient: isa)

Resolution:

// Context updated for Turn 2
context = { recipient: "isa" } // New context
// Prompt includes new recipient reminder
// AI correctly switches context

Testing

describe('Dynamic Prompt Generation', () => {
it('selects Estonian for et language', () => {
const prompt = generateDynamicSystemPrompt('et');
expect(prompt).toContain('Olen RahvaRaamatu AI ostuabi');
});

it('selects English for en language', () => {
const prompt = generateDynamicSystemPrompt('en');
expect(prompt).toContain('I am RahvaRaamat AI');
});

it('defaults to Estonian for mixed', () => {
const prompt = generateDynamicSystemPrompt('mixed');
expect(prompt).toContain('eesti keeles');
});

it('adds context reminders', () => {
const prompt = generateDynamicSystemPrompt('et', {
recipient: 'ema'
});

expect(prompt).toContain('KONTEKSTI MEELDETULETUS');
expect(prompt).toContain('"ema"');
});
});