summy/commandResponser.js
Vufer 18611835cb feat: добавить обработку команды /summy с разбором персонажа и периода для суммаризации
- Добавлен парсер запроса из текста команды с разбором имени персонажа и временного периода/количества сообщений
- Внедрена кэшированная генерация и поиск промптов по персонажу для более живых и контекстных суммаризаций
- Интегрирован внешний вызов API OpenRouter для разбора команд и генерации суммаризаций с учетом стиля персонажа
- Обновлен основной класс TelegramHistoryBot для поддержки новой команды и вызова AI через requestAI.js
- Добавлены хранилища кэша для команд и промптов с логированием загрузки, сохранения и ошибок
- Созданы инструкции для генератора промптов с детальной структурой и правилами для разнообразных персонажей

BREAKING CHANGE: Для корректной работы требуется добавить в .env ключи OPENROUTER_API_KEY, OPENROUTER_MODEL и OPENROUTER_CHEAP_MODEL
2025-06-29 22:54:46 +03:00

76 lines
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 };