ваше сообщение коммита

This commit is contained in:
2025-11-14 12:34:24 +03:00
parent f37e9e1428
commit bbf1c6aa5a
7 changed files with 726 additions and 110 deletions

View File

@@ -319,6 +319,101 @@ class UniversalGuestService {
}
}
/**
* Извлечь имя гостя из текста сообщения через ИИ и сохранить в metadata
* @param {string} identifier - Идентификатор гостя
* @param {string} content - Текст сообщения
* @param {string} channel - Канал
* @returns {Promise<void>}
*/
async extractAndSaveGuestName(identifier, content, channel) {
try {
if (!content || !content.trim()) {
return; // Нет текста для анализа
}
const encryptionKey = encryptionUtils.getEncryptionKey();
// Находим первое сообщение гостя
const firstMessageResult = await db.getQuery()(
`WITH decrypted_guest AS (
SELECT
id,
decrypt_text(identifier_encrypted, $2) as guest_identifier,
channel,
metadata
FROM unified_guest_messages
WHERE user_id IS NULL
)
SELECT
MIN(id) as first_message_id,
MIN(metadata) as metadata
FROM decrypted_guest
WHERE guest_identifier = $1 AND channel = $3
GROUP BY guest_identifier, channel`,
[identifier, encryptionKey, channel]
);
if (firstMessageResult.rows.length === 0) {
return; // Гость не найден
}
const firstMessage = firstMessageResult.rows[0];
let metadata = firstMessage.metadata || {};
// Если metadata - строка, парсим её
if (typeof metadata === 'string') {
try {
metadata = JSON.parse(metadata);
} catch (e) {
metadata = {};
}
}
// Если уже есть кастомное имя, не извлекаем заново
if (metadata.custom_name) {
logger.info(`[UniversalGuestService] У гостя ${identifier} уже есть кастомное имя: ${metadata.custom_name}`);
return;
}
// Используем существующий сервис для извлечения имени
const profileAnalysisService = require('./profileAnalysisService');
const nameResult = await profileAnalysisService.extractName(content);
// Проверяем результат извлечения имени
if (!nameResult || !nameResult.name || !nameResult.should_update_name) {
logger.info(`[UniversalGuestService] Имя не найдено в сообщении гостя ${identifier} (confidence: ${nameResult?.confidence || 0})`);
return;
}
const extractedName = nameResult.name;
// Разбиваем имя на части
const nameParts = extractedName.split(' ');
const firstName = nameParts[0] || '';
const lastName = nameParts.slice(1).join(' ') || '';
// Сохраняем имя в metadata
metadata.custom_name = extractedName;
metadata.custom_first_name = firstName;
metadata.custom_last_name = lastName;
// Обновляем metadata первого сообщения гостя
await db.getQuery()(
`UPDATE unified_guest_messages
SET metadata = $1
WHERE id = $2`,
[JSON.stringify(metadata), firstMessage.first_message_id]
);
logger.info(`[UniversalGuestService] Имя гостя ${identifier} извлечено и сохранено: ${extractedName}`);
} catch (error) {
logger.error('[UniversalGuestService] Ошибка извлечения имени гостя:', error);
throw error;
}
}
/**
* Обработать сообщение гостя (сохранить + получить AI ответ)
* @param {Object} messageData
@@ -398,6 +493,12 @@ class UniversalGuestService {
const saveResult = await this.saveMessage(messageData);
const processedContent = saveResult.processedContent;
// 1.5. Извлекаем имя из текста сообщения через ИИ (если это первое сообщение гостя)
await this.extractAndSaveGuestName(identifier, content, channel).catch(error => {
// Не критично, если не удалось извлечь имя - просто логируем
logger.warn(`[UniversalGuestService] Ошибка извлечения имени гостя:`, error);
});
// 2. Загружаем историю для контекста (заново, так как могли добавиться сообщения)
const conversationHistory = await this.getHistory(identifier);