Агентская амнезия: как я решил эту проблему на Go
- суббота, 21 февраля 2026 г. в 00:00:14
Эта статья является быстрым переводом моей собственной статьи, написанной на английском языке и опубликованной на Medium. В обоих статьях использовался AI для небольшого редактирования текста, перевода и добавления длинных тире
–. Оригинал
Недавно наткнулся на статью про Echovault на Хабре — инструмент для памяти AI-агентов, написанный на Python. Автор описывал ровно ту же боль, что и я испытывал месяцами. Идея хорошая, реализация — рабочая. Но Python. Я ничего не имею против языка, просто не мой выбор для инструментов, которыми пользуюсь каждый день. Люблю скомпилированные бинарники: кинул файл — и работает, без virtualenv, без pip, без «а какая у тебя версия питона». Поэтому я взял идею и переписал её с нуля на Go. Получился Pantry.
Расскажу, зачем это вообще нужно и что внутри.
Я использую AI-агентов для работы с кодом каждый день. Claude Code, Cursor, иногда другие. Реально полезные инструменты: пишут код, держат контекст, ловят баги. Но была одна вещь, которая раздражала меня постоянно.
Каждое утро я открывал проект, и агент понятия не имел, что мы делали вчера. Ноль. Не просто какой код писали — а почему мы выбрали именно эту библиотеку, почему здесь нет connection pool, почему вот этот модуль назван так странно. Всё это испарялось после каждой сессии.
В итоге первые двадцать минут уходили на то, чтобы снова всё объяснить. Или я не объяснял — и агент предлагал именно то, что мы уже пробовали и отвергли. Ощущение, будто работаешь с кем-то, кто каждое утро просыпается без памяти о своей жизни.
Меня это достало достаточно сильно, чтобы что-то сделать.
Очевидная идея: просто держать большой файл с заметками. CONTEXT.md в репозитории, вставлять в каждую сессию. Это работает — примерно. Но быстро превращается в хаос. Огромная стена текста, которую ты сбрасываешь в каждый чат, большая часть которой вообще не релевантна прямо сейчас.
Ещё проблема — разные проекты, разный контекст. И я не всегда помню обновить заметки. И в части заметок случайно оказываются API-ключи — отдельная катастрофа.
Посмотрел, что существует из готового. Были cloud-based решения для памяти агентов. Но я не хочу, чтобы мои рабочие заметки жили на чужом сервере, участвовали в обучении моделей или ждали своего часа в очередной утечке данных. Хотел что-то локальное, под своим контролем.
Ничего подходящего не нашёл. Написал сам.
Pantry — это локальная система хранения заметок для AI-агентов. Маленький Go-бинарник, который работает как MCP-сервер. Агент общается с ним так же, как с инструментами веб-поиска или чтения файлов. Агенту доступны три операции: сохранить заметку, найти заметки, получить контекст для текущей сессии.
Всё. Простая идея.
Но детали интересные.
Все заметки хранятся в ~/.pantry/shelves/ как обычные Markdown-файлы. Не в проприетарном формате, не в облаке, не в базе данных, которую невозможно открыть руками. Просто Markdown. Можно прямо сейчас открыть в Obsidian. Можно grep-нуть в терминале. Вы полностью ими владеете.
У каждой заметки есть заголовок, содержимое, теги и source (какой агент сохранил). Когда начинается новая сессия в проекте, агент вызывает pantry_context и автоматически получает наиболее релевантные последние заметки по этому проекту. Никакого ручного paste, никакого ритуала при старте.
Вот что важно для developer tools: чувствительные данные утекают в них постоянно. Вставляешь stack trace с database URL. Описываешь проблему деплоя и упоминаешь API-ключ. Просишь помочь с аутентификацией и приводишь JWT как пример.
В Pantry есть трёхуровневая система редакции, которая срабатывает перед любым сохранением.
Первый уровень — явный. Оборачиваешь что угодно в теги <redacted>...</redacted> — Pantry вырежет это. Простой ручной контроль.
Второй уровень — автоматический. Pantry поставляется с паттернами для очевидного: Stripe secret keys, GitHub tokens, AWS access keys, JWT, всё что похоже на пароль или secret-переменную. Редактируется до того, как заметка вообще касается базы данных.
Третий уровень — ваш. Файл .pantryignore в проекте с собственными regex-паттернами. Внутренние хостнеймы, корпоративные форматы credentials, что угодно. Pantry проверяет их все.
Работаю с проектами, где в кодовой базе бывают реальные credentials (пожалуйста, не делайте так, но это случается). Понимание, что система заметок активно пытается их не сохранять, важно для меня практически.
Поиск кажется решённой задачей, пока не начинаешь реализовывать его для технических заметок.
Keyword search хорошо работает для точных терминов. Помнишь, что писал про "rate limiting" — найдёшь. Но если помнишь концепцию, а не точные слова — тупик. Здесь помогает vector search: описываешь, что ищешь, на естественном языке — он находит семантически похожие заметки.
Проблема чистого vector search — стоимость. Каждый поиск бьёт по embedding API. Для системы заметок, которую используют сотни раз в день, это накапливается.
Pantry делает вот что: сначала пробует full-text search — быстро и бесплатно (используется SQLite FTS5, отличная штука). Если результаты нормальные — готово. Если sparse — вызывает embedding API, мержит два result set с weighted score и возвращает лучшие совпадения.
Большую часть времени получаешь скорость и нулевую стоимость keyword search. Семантическую мощь vector search — когда нужна. Всё это прозрачно. Просто пишешь запрос и получаешь результаты.
Для embeddings Pantry поддерживает Ollama (полностью локально, без интернета, бесплатно), OpenAI и OpenRouter. Хочешь полную приватность — запускаешь Ollama локально, никаких внешних API-вызовов. Хочешь лучшее качество — OpenAI. Хочешь гибкость — OpenRouter даёт доступ к множеству моделей через один API.
Фича, которую я не планировал, но она стала одной из любимых.
Я не всегда использую одного агента. Один день — Claude Code. Другой — Cursor, потому что коллега предпочитает его. Иногда другой инструмент для конкретной задачи.
Pantry — просто MCP-сервер, все агенты говорят на MCP. Значит, любой агент может подключиться к одному инстансу Pantry. Заметки, сохранённые из Claude Code, ищутся из Cursor. Контекст, накопленный за месяцы работы, доступен везде.
И когда переключаешься между инструментами, не начинаешь с нуля. Это реальная вещь. Раньше при переходе на новый агент было ощущение небольшой потери — понимаешь, что оставляешь накопленный контекст позади. Теперь нет.
Ставишь бинарник, запускаешь pantry init, потом pantry setup claude-code (или cursor, или codex, или opencode). Команда сама находит конфиг-файл агента и добавляет конфигурацию MCP-сервера.
Затем добавляешь несколько строк в AGENTS.md проекта — объясняешь агенту, что нужно проверять Pantry в начале сессии и сохранять заметки перед завершением. В README есть готовый текст для этого.
После этого просто работает. Агент начинает помнить.
Есть команда pantry doctor — проверяет конфигурацию, тестирует подключение к embeddings, сообщает о проблемах. Когда что-то не работает, запускаешь doctor и получаешь конкретный ответ вместо того, чтобы гадать.
Я выработал привычку сохранять определённые типы заметок — те, которые реально полезны.
Архитектурные решения — на первом месте. Не сам код, а почему он устроен именно так. "Мы используем эту queue library вместо той, потому что та не поддерживает ordering сообщений, а он нужен нам для payment flow." Вот такое.
Паттерны багов — второе. Когда нахожу неочевидный баг, заметка описывает симптом, причину и фикс. В следующий раз агент видит похожий код уже с контекстом.
Особенности окружения. Проект требует Node 18, а не 20. Этот API требует специфический заголовок, которого нет в документации. Вот этот тест падает только на CI из-за timezone. Всё это — самые дорогие по времени открытия заново.
Незавершённые решения. Иногда думаешь над подходом и приходится остановиться на полуслове. Заметка фиксирует, на чём остановился — следующая сессия начинается оттуда.
Мы находимся в раннем периоде human-agent коллаборации, и большая часть friction идёт от stateless природы агентских сессий. Каждый разговор начинается холодным стартом. Но работа не происходит в изолированных разговорах. Работа непрерывна, она строится на себе, у неё есть история.
Pantry — моя попытка дать агентам стабильную, приватную, поисковую память, которой я владею и которую контролирую. Не cloud-сервис. Не ещё одна подписка. Просто бинарник и Markdown-файлы на моём компьютере.
Агенты теперь помнят. Звучит как мелочь. Это не мелочь.
Pantry — open source. Go, без runtime-зависимостей, маленький бинарник. Найти его и инструкции по настройке можно в репозитории.
Если вы когда-нибудь тратили двадцать минут, заново объясняя архитектуру агенту — попробуйте.