feat: per-user feedback AI prompt template with placeholder keys

This commit is contained in:
dev
2026-10-06 18:55:04 +03:00
parent 285ee84c98
commit a73b1b3f8c
8 changed files with 269 additions and 8 deletions
+31 -1
View File
@@ -1216,6 +1216,22 @@ function createFeedbackWriter(opts) {
}
}
async function resolveFeedbackPrompt(row) {
let prompt = defaultPrompt;
try {
const base = await getSettingValue('feedback_ai_prompt', '');
if (base && base.trim()) prompt = base.trim();
} catch (e) {}
try {
if (row.author_id) {
const r = await pool.query(`SELECT value FROM user_settings WHERE user_id = $1 AND key = 'feedback_prompt'`, [row.author_id]);
const own = r.rows[0] && r.rows[0].value;
if (own && own.trim()) prompt = own.trim();
}
} catch (e) {}
return prompt;
}
async function processOne(row) {
if (row.text && String(row.text).trim().length >= MIN_CHARS) {
// allow overwrite only if empty? keep as done? but generate on request
@@ -1240,7 +1256,21 @@ function createFeedbackWriter(opts) {
context += `- ${s.lesson_date || ''} – ${s.topic || '-'} – ${s.message || ''}\n`;
}
}
const systemPrompt = defaultPrompt + (context ? '\n\nКОНТЕКСТ:\n' + context : '');
const prompt = await resolveFeedbackPrompt(row);
const keys = {
group: row.group_name || '',
date: row.feedback_date || '',
resident: row.resident || '',
topic: row.topic || '',
past_review: row.past_review || 'нет',
shorts: shorts.length ? shorts.map(s => `- ${s.lesson_date || ''} – ${s.topic || '-'} – ${s.message || ''}`).join('\n') : 'нет',
context: context,
text: (row.text || '').trim(),
};
const hasKeys = /\{(group|date|resident|topic|past_review|shorts|context|text)\}/.test(prompt);
const systemPrompt = hasKeys
? prompt.replace(/\{(\w+)\}/g, (m, k) => (Object.prototype.hasOwnProperty.call(keys, k) ? String(keys[k]) : m))
: prompt + (context ? '\n\nКОНТЕКСТ:\n' + context : '');
let out = await callModel(systemPrompt, row.text && row.text.trim() ? row.text : (context || 'Сформируй отзыв по контексту'), row.ai_profile || null);
let norm = normalizeOutput(out);
if (!norm) return { status: 'error', error: 'Пустой ответ от модели' };