feat: новая функция
This commit is contained in:
@@ -137,7 +137,8 @@ class AIAssistant {
|
||||
systemPrompt: aiSettings ? aiSettings.system_prompt : '',
|
||||
history: conversationHistory,
|
||||
model: aiSettings ? aiSettings.model : undefined,
|
||||
rules: rules ? rules.rules : null
|
||||
rules: rules ? rules.rules : null,
|
||||
selectedRagTables: aiSettings ? aiSettings.selected_rag_tables : []
|
||||
});
|
||||
|
||||
if (!aiResponse) {
|
||||
|
||||
@@ -216,8 +216,18 @@ class EncryptedDataService {
|
||||
continue;
|
||||
}
|
||||
const currentParamIndex = paramIndex++;
|
||||
filteredData[key] = value; // Добавляем в отфильтрованные данные
|
||||
console.log(`✅ Добавили зашифрованное поле ${key} = "${value}" в filteredData`);
|
||||
|
||||
// Преобразуем значение в строку для шифрования
|
||||
let valueToEncrypt;
|
||||
if (typeof value === 'object') {
|
||||
// Если это объект/массив, преобразуем в JSON
|
||||
valueToEncrypt = JSON.stringify(value);
|
||||
} else {
|
||||
valueToEncrypt = value;
|
||||
}
|
||||
|
||||
filteredData[key] = valueToEncrypt; // Добавляем в отфильтрованные данные
|
||||
console.log(`✅ Добавили зашифрованное поле ${key} = "${valueToEncrypt}" в filteredData`);
|
||||
if (encryptedColumn.data_type === 'jsonb') {
|
||||
encryptedData[`${key}_encrypted`] = `encrypt_json($${currentParamIndex}, ${hasEncryptedFields ? '$1::text' : 'NULL'})`;
|
||||
} else {
|
||||
@@ -289,7 +299,27 @@ class EncryptedDataService {
|
||||
const placeholders = Object.keys(allData).map(key => allData[key]).join(', ');
|
||||
|
||||
const query = `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders}) RETURNING *`;
|
||||
const params = hasEncryptedFields ? [this.encryptionKey, ...Object.values(filteredData)] : [...Object.values(filteredData)];
|
||||
|
||||
// Собираем параметры в правильном порядке: сначала для encrypted, потом для unencrypted
|
||||
const paramsArray = [];
|
||||
if (hasEncryptedFields) paramsArray.push(this.encryptionKey);
|
||||
|
||||
// Добавляем параметры для encrypted колонок
|
||||
for (const key of Object.keys(encryptedData)) {
|
||||
const originalKey = key.replace('_encrypted', '');
|
||||
if (filteredData[originalKey] !== undefined) {
|
||||
paramsArray.push(filteredData[originalKey]);
|
||||
} else if (filteredData[originalKey + '_unencrypted'] !== undefined) {
|
||||
paramsArray.push(filteredData[originalKey + '_unencrypted']);
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем параметры для unencrypted колонок
|
||||
for (const key of Object.keys(unencryptedData)) {
|
||||
paramsArray.push(filteredData[key + '_unencrypted'] || filteredData[key]);
|
||||
}
|
||||
|
||||
const params = paramsArray;
|
||||
|
||||
console.log(`🔍 Выполняем INSERT запрос:`, query);
|
||||
console.log(`🔍 Параметры:`, params);
|
||||
@@ -359,9 +389,13 @@ class EncryptedDataService {
|
||||
params.push(...paramsToAdd);
|
||||
}
|
||||
|
||||
// Добавляем ключ шифрования в начало, если есть зашифрованные поля
|
||||
const hasEncryptedFields = columns.some(col => col.column_name.endsWith('_encrypted'));
|
||||
if (hasEncryptedFields) {
|
||||
// Определяем, нужно ли добавлять ключ шифрования
|
||||
// Проверяем, есть ли в WHERE условиях зашифрованные колонки
|
||||
const hasEncryptedFieldsInConditions = Object.keys(conditions).some(key => {
|
||||
return columns.find(col => col.column_name === `${key}_encrypted`);
|
||||
});
|
||||
|
||||
if (hasEncryptedFieldsInConditions) {
|
||||
params.unshift(this.encryptionKey);
|
||||
}
|
||||
|
||||
|
||||
@@ -201,13 +201,20 @@ async function ragAnswer({ tableId, userQuestion, product = null, threshold = 30
|
||||
/**
|
||||
* Загрузка всех плейсхолдеров и их значений из пользовательских таблиц
|
||||
* Возвращает объект: { placeholder1: value1, placeholder2: value2, ... }
|
||||
* @param {Array} selectedRagTables - Массив ID выбранных RAG таблиц для фильтрации
|
||||
*/
|
||||
async function getAllPlaceholdersWithValues() {
|
||||
async function getAllPlaceholdersWithValues(selectedRagTables = []) {
|
||||
try {
|
||||
console.log('[RAG] Начинаем загрузку плейсхолдеров...');
|
||||
|
||||
// Получаем все колонки с плейсхолдерами
|
||||
const columns = await encryptedDb.getData('user_columns', {});
|
||||
// Получаем колонки с плейсхолдерами
|
||||
let columns = await encryptedDb.getData('user_columns', {});
|
||||
|
||||
// Фильтруем по выбранным RAG таблицам, если они указаны
|
||||
if (selectedRagTables && selectedRagTables.length > 0) {
|
||||
columns = columns.filter(col => selectedRagTables.includes(col.table_id));
|
||||
console.log(`[RAG] Фильтруем по RAG таблицам: ${selectedRagTables.join(', ')}`);
|
||||
}
|
||||
console.log(`[RAG] Получено колонок: ${columns.length}`);
|
||||
|
||||
const columnsWithPlaceholders = columns.filter(col => col.placeholder && col.placeholder.trim() !== '');
|
||||
@@ -281,7 +288,8 @@ async function generateLLMResponse({
|
||||
date,
|
||||
rules,
|
||||
history,
|
||||
model
|
||||
model,
|
||||
selectedRagTables
|
||||
}) {
|
||||
console.log(`[RAG] generateLLMResponse called with:`, {
|
||||
userQuestion,
|
||||
@@ -338,7 +346,7 @@ async function generateLLMResponse({
|
||||
// --- ДОБАВЛЕНО: подстановка плейсхолдеров ---
|
||||
let finalSystemPrompt = systemPrompt;
|
||||
if (systemPrompt && systemPrompt.includes('{')) {
|
||||
const placeholders = await getAllPlaceholdersWithValues();
|
||||
const placeholders = await getAllPlaceholdersWithValues(selectedRagTables);
|
||||
finalSystemPrompt = replacePlaceholders(systemPrompt, placeholders);
|
||||
console.log(`[RAG] Подставлены плейсхолдеры в системный промпт`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user