Skip to main content

План развития памяти Veles

Дата: 2026-03-25 Основано на: Исследование памяти OpenClaw Цель: Внедрить систему долговременной памяти в стиле OpenClaw в Veles с минимальными изменениями основного цикла.

Текущее состояние

Файловая память (veles/agent/memory.py)

  • MemoryStore: управляет memory/MEMORY.md (структурированные долгосрочные факты).
  • MemoryConsolidator: консолидация на базе LLM, которая архивирует старые сообщения в MEMORY.md, когда контекст превышает половину окна.
  • Содержимое MEMORY.md встраивается в системный промпт через ContextBuilder.
  • Консолидация использует принудительный вызов инструмента save_memory с откатом к обычному архивированию.

Векторная память (veles/agent/vector_memory.py)

  • VectorMemoryManager: индексирует workspace/docs/<project>/ с использованием гибридного поиска (BM25 + векторный).
  • SQLite + sqlite-vec + FTS5, эмбеддинги через litellm.
  • Фоновый цикл синхронизации (интервал 60с), поиск с ограничением по проекту.
  • VectorSearchTool: предоставляет агенту инструмент vector_search.

Сессии (veles/session/manager.py)

  • JSONL-файлы в workspace/sessions/ (один на пару канал:chat_id).
  • Строка метаданных + дополняемые словари сообщений.
  • get_history() возвращает messages[last_consolidated:].

Что отсутствует (по сравнению с OpenClaw)

  1. Нет датированных файлов памяти ✅ Реализовано (Фаза 1)
  2. Нет сброса памяти перед сжатием контекста ✅ Реализовано (Фаза 2)
  3. Файлы памяти не индексируются для поиска ✅ Реализовано (Фаза 3)
  4. Нет инструмента memory_search ✅ Реализовано (Фаза 4)
  5. HISTORY.md избыточен ✅ Удален (заменен датированными файлами + memory_search)
  6. Нет временного затухания (temporal decay) ✅ Реализовано (отдельная конфигурация для памяти и документов)

Что мы создаем

Четыре функции в порядке реализации: Что остается без изменений:
  • Текущий алгоритм гибридного поиска (BM25 + векторный).
  • Текущий конвейер эмбеддингов (litellm).
  • Текущая логика консолидация (MemoryConsolidator).
  • Текущий формат сессий JSONL.
  • Наличие MEMORY.md в системном промпте.

Фаза 1: Датированные файлы памяти по завершении сессии

Цель: При вызове /new резюмировать завершающуюся сессию в файл memory/YYYY-MM-DD-slug.md.

Новый класс: SessionMemoryWriter

Файл: veles/agent/memory.py (добавить в существующий файл)

Логика

  1. Взять последние max_messages сообщений пользователя/ассистента из снимка сессии (пропустить вызовы инструментов для сокращения контекста LLM).
  2. Если сообщений от пользователя меньше 3 — пропустить (слишком короткая сессия).
  3. Вызвать LLM со специализированным промптом:
    • System: “Вы — составитель памяти. Создайте краткое резюме этого диалога.”
    • Использовать принудительный вызов create_session_memory с параметрами:
      • slug: короткий идентификатор файла в kebab-case (макс. 40 символов, например “api-design-review”).
      • summary: описание ключевых тем, решений и фактов в формате markdown.
  4. Записать в memory/YYYY-MM-DD-slug.md:
  1. При ошибке вызова LLM записать сырой фрагмент стенограммы (по аналогии с _raw_archive в MemoryStore).

Точка интеграции в loop.py

Текущий обработчик /new:
Добавляем одну строку — запуск записи памяти сессии в фоне:

Дополнение в конфиг (schema.py)

Вложить в ToolsConfig рядом с vector_memory:

Измененные файлы

  • veles/agent/memory.py — добавлен класс SessionMemoryWriter (~80 строк).
  • veles/agent/loop.py — инициализация self.session_memory_writer + 1 строка в /new.
  • veles/config/schema.py — добавлена SessionMemoryConfig.

Фаза 2: Сброс памяти перед сжатием контекста

Цель: Перед тем как maybe_consolidate_by_tokens начнет архивировать сообщения, запустить выделенный ход LLM для записи важных фактов в memory/YYYY-MM-DD.md.

Новый класс: MemoryFlusher

Файл: veles/agent/memory.py (добавить в существующий файл)

Логика

  1. Условие срабатывания: estimated_tokens > context_window - threshold_tokens.
  2. Защита: Пропускать, если для этой сессии в текущем цикле сжатия сброс уже выполнялся.
  3. Дедупликация: Прочитать текущий memory/YYYY-MM-DD.md, чтобы не дублировать информацию.
  4. Вызвать LLM с системным промптом:
  5. Если ответ [silent] — пропустить запись.
  6. Иначе — дозаписать в memory/YYYY-MM-DD.md:

Точка интеграции

В MemoryConsolidator.maybe_consolidate_by_tokens() (memory.py), добавить вызов флеша перед циклом консолидации:

Измененные файлы

  • veles/agent/memory.py — добавлен класс MemoryFlusher (~70 строк), изменен MemoryConsolidator.__init__ для его приема.
  • veles/agent/loop.py — передача экземпляра MemoryFlusher в MemoryConsolidator.
  • veles/config/schema.py — добавлена MemoryFlushConfig.

Фаза 3: Индексация файлов памяти

Цель: Расширить VectorMemoryManager для индексации memory/MEMORY.md и memory/*.md, сделав их доступными для поиска наравне с документацией.

Изменения в VectorMemoryManager

Файл: veles/agent/vector_memory.py

1. Расширение _discover_files()

Добавляем поиск в папке memory/ с зарезервированным именем проекта _memory.

2. Добавление метода search_memory()

Удобный метод для поиска только по файлам памяти (фильтр project='_memory').

Измененные файлы

  • veles/agent/vector_memory.py — расширено обнаружение файлов, добавлен метод search_memory().

Цель: Дать агенту инструмент для поиска по его собственным файлам памяти.

Новый файл: veles/agent/tools/memory_search.py

Инструмент memory_search позволяет агенту искать по MEMORY.md и датированным логам в папке memory/, используя гибридный поиск. Это критически важно для восстановления контекста прошлых диалогов, решений и предпочтений.

Регистрация в loop.py

Добавить регистрацию нового инструмента в _register_default_tools() после vector_search.

Обновление системного промпта (context.py)

Обновить описание рабочего пространства в _get_identity(), указав на наличие инструментов поиска по памяти.

Архитектура после реализации

Veles получает многослойную систему памяти:
  • MEMORY.md: Долгосрочные, отобранные факты (всегда в промпте).
  • Датированные логи: Автоматически создаваемые резюме сессий (доступны через поиск).
  • Поиск по памяти: Инструмент memory_search для доступа к истории.
  • Векторная база: Единое хранилище для документации проектов и личной памяти агента.

Жизненный цикл сессии

  • При приближении к лимиту контекста важные факты сбрасываются в дневной лог.
  • При завершении сессии создается ее краткое резюме.
  • В новой сессии агент может мгновенно найти детали прошлых обсуждений, используя поиск, при этом не перегружая основной контекст.

План работ и оценка

Итого: ~220 новых строк кода, около 6-9 рабочих часов.

Зависимости

  • Фазы 3 и 4 требуют включенной векторной памяти (tools.vector_memory.enabled: true).
  • Фазы 1 и 2 работают независимо (записывают обычные markdown-файлы).
  • Фаза 4 зависит от Фазы 3.