186 lines
8.3 KiB
Python
Executable File
186 lines
8.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
Скрипт для обновления памяти OpenClaw на основе собранных данных из Telegram
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import glob
|
||
import re
|
||
from datetime import datetime
|
||
import logging
|
||
|
||
# Настройка логирования
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
handlers=[
|
||
logging.FileHandler("update_memory.log"),
|
||
logging.StreamHandler()
|
||
]
|
||
)
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Пути к файлам
|
||
KNOWLEDGE_BASE = "knowledge_base.md"
|
||
MEMORY_FILE = "/home/node/.openclaw/workspace/MEMORY.md"
|
||
DAILY_MEMORY_DIR = "/home/node/.openclaw/workspace/memory"
|
||
TOPICS_DIR = "data/topics"
|
||
|
||
def create_daily_memory_file():
|
||
"""Создает файл ежедневной памяти с информацией о собранных данных из Telegram"""
|
||
try:
|
||
today = datetime.now().strftime("%Y-%m-%d")
|
||
memory_file = f"{DAILY_MEMORY_DIR}/{today}.md"
|
||
|
||
# Проверяем, существует ли директория, если нет - создаем
|
||
os.makedirs(DAILY_MEMORY_DIR, exist_ok=True)
|
||
|
||
# Если файл уже существует, добавляем к нему, иначе создаем новый
|
||
mode = 'a' if os.path.exists(memory_file) else 'w'
|
||
|
||
with open(memory_file, mode, encoding='utf-8') as f:
|
||
if mode == 'w':
|
||
f.write(f"# Дневная память {today}\n\n")
|
||
|
||
f.write(f"## Обновление данных из Telegram ({datetime.now().strftime('%H:%M:%S')})\n\n")
|
||
|
||
# Проверяем, существует ли база знаний
|
||
if os.path.exists(KNOWLEDGE_BASE):
|
||
f.write("Собраны новые данные из Telegram-каналов и обновлена база знаний.\n\n")
|
||
|
||
# Считаем количество обновленных тем
|
||
topics_count = 0
|
||
for topic_dir in glob.glob(f"{TOPICS_DIR}/*"):
|
||
if os.path.isdir(topic_dir) and os.path.basename(topic_dir) != "unclassified":
|
||
topics_count += 1
|
||
|
||
f.write(f"Обновлено тем: {topics_count}\n")
|
||
|
||
# Подсчитываем файлы за сегодня
|
||
today_files = glob.glob(f"{TOPICS_DIR}/*/{today}.md")
|
||
if today_files:
|
||
f.write(f"Сегодня обновлено {len(today_files)} тем.\n\n")
|
||
|
||
# Добавляем список обновленных тем
|
||
f.write("Обновленные темы:\n")
|
||
for file in today_files:
|
||
topic_name = os.path.basename(os.path.dirname(file)).replace('_', ' ').capitalize()
|
||
f.write(f"- {topic_name}\n")
|
||
else:
|
||
f.write("Попытка обновления данных из Telegram, но база знаний не найдена.\n")
|
||
|
||
f.write("\n")
|
||
|
||
logger.info(f"Создан файл ежедневной памяти: {memory_file}")
|
||
return True
|
||
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при создании файла ежедневной памяти: {e}")
|
||
return False
|
||
|
||
def update_memory():
|
||
"""Обновляет основной файл памяти OpenClaw с информацией из базы знаний"""
|
||
try:
|
||
# Проверяем существование файлов
|
||
if not os.path.exists(KNOWLEDGE_BASE):
|
||
logger.error(f"Файл базы знаний {KNOWLEDGE_BASE} не найден")
|
||
return False
|
||
|
||
if not os.path.exists(MEMORY_FILE):
|
||
logger.error(f"Файл памяти {MEMORY_FILE} не найден")
|
||
return False
|
||
|
||
# Читаем текущую память
|
||
with open(MEMORY_FILE, 'r', encoding='utf-8') as f:
|
||
memory_content = f.read()
|
||
|
||
# Читаем базу знаний
|
||
with open(KNOWLEDGE_BASE, 'r', encoding='utf-8') as f:
|
||
kb_content = f.read()
|
||
|
||
# Проверяем, есть ли раздел "Данные из Telegram" в памяти
|
||
telegram_section_pattern = r'## Данные из Telegram\s+(.+?)(?=\n##|\Z)'
|
||
telegram_section_match = re.search(telegram_section_pattern, memory_content, re.DOTALL)
|
||
|
||
# Извлекаем основные данные из базы знаний
|
||
kb_sections = {}
|
||
|
||
current_section = None
|
||
current_content = []
|
||
|
||
for line in kb_content.splitlines():
|
||
if line.startswith('## '):
|
||
if current_section:
|
||
kb_sections[current_section] = '\n'.join(current_content)
|
||
current_section = line[3:].strip()
|
||
current_content = []
|
||
elif current_section:
|
||
current_content.append(line)
|
||
|
||
# Добавляем последний раздел
|
||
if current_section and current_content:
|
||
kb_sections[current_section] = '\n'.join(current_content)
|
||
|
||
# Формируем новое содержимое раздела "Данные из Telegram"
|
||
telegram_data = [f"## Данные из Telegram\n\n### Обновлено: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"]
|
||
|
||
# Добавляем краткую информацию о каждой теме
|
||
for topic, content in kb_sections.items():
|
||
# Ограничиваем содержимое до 300 символов
|
||
short_content = content[:300] + "..." if len(content) > 300 else content
|
||
telegram_data.append(f"### {topic}\n{short_content}\n")
|
||
|
||
new_telegram_section = '\n'.join(telegram_data)
|
||
|
||
# Обновляем файл памяти
|
||
if telegram_section_match:
|
||
# Если раздел существует, обновляем его
|
||
updated_memory = re.sub(
|
||
telegram_section_pattern,
|
||
f"## Данные из Telegram\n{new_telegram_section}",
|
||
memory_content,
|
||
flags=re.DOTALL
|
||
)
|
||
else:
|
||
# Если раздела нет, добавляем его в конец файла
|
||
updated_memory = memory_content.rstrip() + "\n\n" + new_telegram_section
|
||
|
||
# Записываем обновленную память
|
||
with open(MEMORY_FILE, 'w', encoding='utf-8') as f:
|
||
f.write(updated_memory)
|
||
|
||
logger.info(f"Файл памяти {MEMORY_FILE} успешно обновлен")
|
||
return True
|
||
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при обновлении файла памяти: {e}")
|
||
return False
|
||
|
||
def main():
|
||
"""Основная функция для запуска обновления памяти"""
|
||
try:
|
||
# Создаем файл ежедневной памяти
|
||
daily_result = create_daily_memory_file()
|
||
|
||
# Обновляем основной файл памяти
|
||
memory_result = update_memory()
|
||
|
||
if daily_result and memory_result:
|
||
print("Память OpenClaw успешно обновлена.")
|
||
elif not daily_result and memory_result:
|
||
print("Основная память обновлена, но возникла ошибка при создании ежедневной памяти.")
|
||
elif daily_result and not memory_result:
|
||
print("Ежедневная память создана, но возникла ошибка при обновлении основной памяти.")
|
||
else:
|
||
print("Возникли ошибки при обновлении памяти OpenClaw.")
|
||
return 1
|
||
|
||
return 0
|
||
except Exception as e:
|
||
logger.error(f"Критическая ошибка: {e}")
|
||
return 1
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main()) |