- Добавлен парсер запроса из текста команды с разбором имени персонажа и временного периода/количества сообщений - Внедрена кэшированная генерация и поиск промптов по персонажу для более живых и контекстных суммаризаций - Интегрирован внешний вызов API OpenRouter для разбора команд и генерации суммаризаций с учетом стиля персонажа - Обновлен основной класс TelegramHistoryBot для поддержки новой команды и вызова AI через requestAI.js - Добавлены хранилища кэша для команд и промптов с логированием загрузки, сохранения и ошибок - Созданы инструкции для генератора промптов с детальной структурой и правилами для разнообразных персонажей BREAKING CHANGE: Для корректной работы требуется добавить в .env ключи OPENROUTER_API_KEY, OPENROUTER_MODEL и OPENROUTER_CHEAP_MODEL
76 lines
2.5 KiB
JavaScript
76 lines
2.5 KiB
JavaScript
const fs = require('fs');
|
||
const logger = require('./logger');
|
||
const cacheFile = 'commandCache.json';
|
||
|
||
let aiCache = {};
|
||
|
||
// Загружаем кэш из файла при старте
|
||
function loadAiCache() {
|
||
logger.info('Загрузка командного кэша...');
|
||
try {
|
||
if (fs.existsSync(cacheFile)) {
|
||
const data = fs.readFileSync(cacheFile);
|
||
aiCache = JSON.parse(data);
|
||
logger.info('✅ Кэш команд загружен.');
|
||
} else {
|
||
fs.writeFileSync(cacheFile, JSON.stringify({}, null, 2));
|
||
logger.info('✅ Кэш команд создан.');
|
||
}
|
||
} catch (error) {
|
||
logger.error('❌ Ошибка загрузки командного кэша:', error);
|
||
}
|
||
}
|
||
|
||
// Сохраняем кэш в файл
|
||
function saveAiCache() {
|
||
try {
|
||
fs.writeFileSync(cacheFile, JSON.stringify(aiCache, null, 2));
|
||
} catch (error) {
|
||
logger.error('❌ Ошибка сохранения командного кэша:', error);
|
||
}
|
||
}
|
||
loadAiCache();
|
||
|
||
// Поиск запроса в кэше
|
||
function searchInCache(request) {
|
||
logger.info(`🔎 Поиск в кэше: ${request}`);
|
||
if (!request || typeof request !== 'string') return null;
|
||
const result = aiCache[request];
|
||
if (result) {
|
||
logger.info(`🔁 Найдено в кэше: ${request}`);
|
||
return result;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
// Сохранение запроса и ответа в кэш
|
||
// async function saveInCache(request, result) {
|
||
// if (!request || !result) return;
|
||
// aiCache[request] = result;
|
||
// saveAiCache();
|
||
// logger.info(`💾 Запрос сохранён в кэш: ${request}`);
|
||
// }
|
||
async function saveInCache(request, result) {
|
||
if (!request || !result) return;
|
||
|
||
let finalResult = result;
|
||
|
||
// Если это результат парсинга команды и он пришёл как строка JSON
|
||
if (typeof result === 'string' && result.includes('"persona"') && result.includes('"messages"')) {
|
||
try {
|
||
finalResult = JSON.parse(result);
|
||
} catch (error) {
|
||
logger.warn(`⚠️ Не удалось распарсить JSON команды: ${error.message}`);
|
||
}
|
||
}
|
||
|
||
aiCache[request] = finalResult;
|
||
saveAiCache();
|
||
logger.info(`💾 Запрос сохранён в кэш: ${request}`);
|
||
}
|
||
//
|
||
// // Загрузим кэш при старте
|
||
// loadAiCache();
|
||
|
||
module.exports = { searchInCache, saveInCache };
|