Hugging Face выпустила funes: локальную память для кодовых ИИ-агентов

Hugging Face выпустила funes, инструмент, который даёт кодовым ИИ-агентам собственную постоянную память. Отправная точка авторов: агент и так оставляет за собой плотный след решений, что искал, что пробовал, где ошибся, почему сменил подход, но журнал сессии остаётся немым архивом: если между решением и вопросом легло десять тысяч ходов, ответ на вопрос вроде «почему мы отказались от потокового парсера» обычным текстовым поиском не найти. funes не создаёт новый источник данных, а превращает то, что агент и так уже написал в собственных логах, в индексированную и извлекаемую память.
Инструмент работает с четырьмя агентами, Claude Code, Codex, pi и Hermes, и распространяется как один бинарник: устанавливается одной командой curl с официального сервера Hugging Face, бэкенд по умолчанию не тянет за собой ML-рантайм, а эмбеддинг и реранкинг считаются локально, на машине пользователя. Команда funes add claude (вместо claude можно подставить codex, pi или hermes) строит первый индекс, добавляет агенту инструменты recall и get и ставит автоматику, которая индексирует каждый завершённый ход. Индексирование инкрементальное: новый запуск добавляет только новые ходы, а не пересчитывает историю заново, а более старое и глубокое содержимое доиндексируется отдельными ограниченными шагами.
Дальше агент обращается к памяти сам: когда задача касается прошлого решения, обоснования или находки, он вызывает recall внутри разговора и называет сессию, из которой взял ответ. recall возвращает не пересказ, а исходный текст с точным происхождением, какой агент, когда, в какой сессии и на каком ходу это было сказано, а к каждому результату прилагается команда get, открывающая этот ход целиком вместе с окружающим контекстом. Под капотом один и тот же детерминированный конвейер разбирает журнал любого из четырёх агентов в одинаковую структуру «ход-блок», режет её на куски, считает эмбеддинги закреплённой локальной моделью и пишет в локальный Lance-датасет; сам запрос сочетает векторный поиск и BM25, сливает их ранжирования, дореранжирует кросс-энкодером, довешивает по свежести и подтягивает соседние куски. Такое устройство даёт три свойства: единая память сразу для всех четырёх агентов, recall видит историю любого из них и всегда называет, кто оставил след; необработанные данные не теряются, любой результат ведёт назад к исходному ходу, а не к чужому пересказу; и recall локален по умолчанию, ни аккаунт, ни Hub не обязательны, а обрабатывать сессии для индексирования на стороннем сервере не нужно.
Память можно и расшарить: команда вида funes add codex acme/funes-memory привязывает её к датасету на Hugging Face, приватному по умолчанию и принадлежащему пользователю. С этого момента funes индексирует каждый ход локально, а публикует изменения на границах сессий; тот же привязанный агент, запущенный на другой машине, подхватывает уже накопленную память. Перед тем как что-либо попадает на Hub, данные дважды проходят чистку от секретов: один раз при индексировании и ещё раз при публикации, когда каждый кусок повторно сканируется и всё похожее на пароль или ключ придерживается. Чтение чужой опубликованной памяти кэширует файлы датасета локально, так что повторные («тёплые») запросы идут с локальной скоростью, а права доступа, версии и раздача, те же механизмы, что Hub уже даёт любому другому датасету: расшаренная память не превращается в отдельный сервис-аккаунт и не арендуется через API.
Задать разовый вопрос без установки интеграции можно командой funes ask, она читает локальную память по умолчанию либо чужую опубликованную через флаг --memory: авторы, например, сами выложили память разработки funes и предлагают спросить у неё, почему funes устроен именно так, не заводя собственной. funes ask находит подходящие фрагменты, передаёт их агенту и возвращает обоснованный ответ со ссылкой на источник; если подходящих фрагментов не находится, агент честно говорит об этом, а не придумывает ответ, и в отличие от funes add эта команда ничего не устанавливает и не меняет в постоянных настройках агента.
Общая память не привязана к конкретному агенту или модели: задачу можно начать в Claude Code, через неделю продолжить в Codex, и второй агент восстановит рассуждения первого, а промежуточный шаг можно сделать в pi, на локальной модели или через роутер Hugging Face. Авторы называют три сценария применения: между своими машинами, привязал одного агента к одной памяти, и история доступна с любого хоста; в команде, агент нового участника получает доступ к месяцам решений уже в первый день, включая тупиковые ветки и обоснования, которые не попали ни в один pull request; и вокруг open-source проекта, мейнтейнер публикует сессии, стоящие за релизом, и это превращается в подобие CLAUDE.md, который хранит историю «почему проект устроен именно так» и не требует, чтобы кто-то вручную его переписывал; прочитать такую публичную память может кто угодно через флаг --memory.
Отдельно авторы сравнили recall с двумя другими способами перенести контекст в новую сессию, сжатием (тем, что по умолчанию делает большинство агентов) и письменной передаточной запиской, на двух задачах, ответ на которые нельзя восстановить без знания предыстории сессии. Сжатие оказалось единственным из трёх методов, чей результат разошёлся между задачами: на одной ответ был получен, на другой, нет, потому что пересказ смял важные для ответа детали. recall возвращает сами фрагменты, а не их пересказ, поэтому находке не нужно пережить сжатие; на обеих задачах он вышел дешевле остальных двух способов, в 8 раз дешевле записки на первой задаче и в 4 раза дешевле на второй.
Ключевые факты
- funes, один бинарник, который даёт собственную память четырём кодовым агентам, Claude Code, Codex, pi и Hermes, и по умолчанию работает полностью локально: эмбеддинг и реранкинг считает сама машина, без обязательного аккаунта или обращения к Hub.
- Команда funes add claude (или codex/pi/hermes) сразу строит первый индекс и дальше довешивает только новые ходы, индексирование инкрементальное, а старое и более глубокое содержимое доиндексируется ограниченными шагами.
- Команда recall возвращает не пересказ, а исходный текст с точным происхождением, какой агент, когда, в какой сессии и на каком ходу; конвейер поиска сочетает векторный поиск, BM25, кросс-энкодер-реранк и довес по свежести.
- Память можно опубликовать в приватный по умолчанию датасет на Hugging Face (funes add codex acme/funes-memory), тогда она следует за пользователем между машинами и доступна команде; перед публикацией данные дважды чистятся от секретов.
- На бенчмарке из двух задач recall оказался дешевле письменной передаточной записки, в 8 раз на одной задаче и в 4 раза на другой, тогда как сжатие контекста дало ответ лишь на одной задаче из двух.
Почему это важно
Кодовый агент и так генерирует по ходу работы плотный след решений, что искал, что пробовал, где споткнулся, почему сменил курс, но журнал сессии остаётся немым архивом: вопрос вроде «почему мы отказались от потокового парсера» не восстановить простым поиском по тексту, если между решением и вопросом легло десять тысяч ходов. funes не придумывает новый источник данных, а превращает то, что агент и так уже написал в собственных логах, в индексированную память, к которой он сам может обратиться посреди работы, без того, чтобы пользователь вручную вспоминал и пересказывал прошлую сессию.
Кому это важно
В первую очередь, тем, кто работает с одним из четырёх поддержанных агентов: Claude Code, Codex, pi или Hermes. Полезно разработчику, который переключается между несколькими своими машинами и хочет, чтобы агент помнил прошлые решения на любой из них; команде, где агент нового участника должен за первый же день получить доступ к месяцам решений и тупиковым веткам, не попавшим ни в один pull request; и мейнтейнеру open-source проекта, который может опубликовать сессии, стоящие за релизом, и превратить их в подобие CLAUDE.md с историей «почему так», доступное любому через флаг --memory.
Как это применить
Установка, один бинарник через официальный скрипт Hugging Face; backend по умолчанию не тянет ML-рантайм, эмбеддинг и реранкинг считаются локально. Команда funes add claude (вместо claude, codex, pi или hermes) строит первый индекс, даёт агенту инструменты recall и get и ставит автоматику, которая индексирует каждый завершённый ход; дальше агент сам обращается к recall, когда задача касается прошлого решения, и называет сессию, из которой взят ответ, а команда get открывает этот ход целиком с окружающим контекстом. Задать разовый вопрос без установки интеграции можно командой funes ask, по умолчанию она читает локальную память, а флагом --memory можно указать чужую опубликованную. Чтобы память следовала за пользователем между машинами или была доступна команде, её нужно привязать к датасету на Hugging Face: funes add codex acme/funes-memory публикует текущую память (приватную по умолчанию) и дальше держит её актуальной, индексируя каждый ход локально и публикуя изменения на границах сессий.
Можно ли доверять
Источник, блог на домене Hugging Face (huggingface.co/blog), а код инструмента лежит в открытом репозитории github.com/huggingface/funes: адрес и репозиторий указывают на Hugging Face, хотя сам текст написан от лица безымянного «мы» и нигде прямо не называет ни компанию, ни конкретного автора. Технические утверждения расписаны конкретно и проверяемо: устройство конвейера поиска (векторный поиск и BM25, кросс-энкодер-реранк, довес по свежести), двойная чистка секретов перед публикацией. Слабое место, количественный аргумент: выигрыш в 8 и 4 раза над письменной передаточной запиской получен всего на двух задачах бенчмарка, которые пост никак не называет и не описывает, ни домен, ни абсолютные цифры стоимости или времени не приведены, только это относительное сравнение, а значит масштаб выигрыша нельзя перепроверить независимо от слов авторов. Не указаны и дата или номер версии релиза, упомянутый более ранний пост датирован лишь «раньше в этом году».
Риски и подводные камни
Список поддержанных агентов пока закрытый, Claude Code, Codex, pi и Hermes, и вся практическая польза инструмента для конкретного человека или команды зависит от того, есть ли среди них нужный. При первом подключении старое и более глубокое содержимое сессий индексируется не сразу, а доиндексируется ограниченными шагами, так что сразу после установки recall может не дотянуться до самых давних решений. Стоит расшарить память, и она перестаёт быть только локальным файлом на диске: даже приватный по умолчанию датасет уходит на инфраструктуру Hugging Face, а что именно ловит и что пропускает двухступенчатый сканер секретов, сам пост не расписывает и отсылает к отдельному документу SECURITY.md. И сам бенчмарк recall против передаточной записки и сжатия контекста, это всего две задачи без описания домена, а не широкая проверка на разнообразных сценариях: выигрыш в 8 и 4 раза не обязательно переносится на любую другую задачу или на агентов, которые в бенчмарке не участвовали.
«Мыслить, значит забывать различия, обобщать, абстрагироваться.»
— Хорхе Луис Борхес, рассказ «Funes the Memorious» (букв. «Фунес памятливый»), цитата приведена в посте как эпиграф