feat: per-user feedback AI prompt template with placeholder keys
This commit is contained in:
@@ -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: 'Пустой ответ от модели' };
|
||||
|
||||
Reference in New Issue
Block a user