Практика · продвинутый уровень
CowAgent как персональный агент: тест памяти, инструментов и моделей
Заявление «универсальный ассистент» мало говорит о надежности системы. Проверять нужно не красивый ответ, а весь маршрут: построил ли агент исполнимый план, выбрал ли нужные инструменты, сохранил ли полезный контекст и пережил ли этот контекст новую сессию и смену модели.
Что именно мы проверяем
CowAgent — локально развертываемый AI-агент, то есть оболочка вокруг языковой модели, которая управляет контекстом, планированием, инструментами и памятью. По официальной документации проект поддерживает многошаговое выполнение, файловые и терминальные инструменты, браузер, долговременную память и несколько поставщиков моделей.
Это описание возможностей, а не доказательство качества. Ниже приведен воспроизводимый протокол. В статье нет заранее объявленного «победителя» и нет вымышленных замеров: итоговую таблицу нужно заполнить данными собственного прогона, указав версию CowAgent, модель и конфигурацию.
Четыре проверяемых свойства
- Планирование: разбивает ли агент задачу на зависимые этапы и проверяет ли промежуточные результаты.
- Инструменты: вызывает ли он подходящий инструмент вместо правдоподобной имитации действия.
- Долговременная память: извлекает ли сохраненный факт после новой сессии, не добавляя выдуманных деталей.
- Смена модели: сохраняет ли оболочка состояние и ограничения при переключении основного LLM.
Стенд: изолированная рабочая область
Для теста не подключайте почту, рабочий календарь, облачные диски и боевые MCP-серверы. Агент с терминалом и записью файлов обладает реальными полномочиями процесса, поэтому запускайте его от непривилегированного пользователя и выдавайте доступ только к тестовому каталогу.
Минимальные условия
- Linux, macOS или Docker Desktop;
- Git и Docker Compose для контейнерного варианта;
- одна настроенная модель; для проверки переключения — вторая модель или второй совместимый endpoint;
- пустая директория, не содержащая личных и проектных данных;
- локальный Web-интерфейс CowAgent на
127.0.0.1.
Сначала получите официальный compose-файл, но не исполняйте загруженное вслепую:
mkdir -p cowagent-lab
cd cowagent-lab
curl -fL \
https://cdn.link-ai.tech/code/cow/docker-compose.yml \
-o docker-compose.yml
sed -n '1,240p' docker-compose.yml
docker compose config
Проверьте образы, проброс портов, тома и переменные окружения. Если состав файла соответствует вашим ожиданиям, запускайте:
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100
Официальный compose-файл и его образы могут меняться. Для повторяемого исследования запишите фактические digest образов:
docker compose images
docker image inspect \
--format='{{index .RepoDigests 0}}' \
"$(docker compose images -q | head -n 1)"
После старта интерфейс обычно доступен по адресу http://localhost:9899. Не публикуйте этот порт в интернет. Если compose-файл привязывает его ко всем интерфейсам, замените публикацию порта на привязку к loopback, например:
ports:
- "127.0.0.1:9899:9899"
Это фрагмент безопасной конфигурации, а не утверждение о точной структуре любой версии официального compose-файла. Перед правкой сопоставьте его с загруженным файлом.
Настройка моделей без секретов в протоколе
В актуальной документации CowAgent рекомендует настраивать поставщиков через Web-консоль. Для OpenAI-совместимого сервера нужны тип провайдера, базовый URL, идентификатор модели и ключ, если endpoint требует аутентификацию.
Провайдер: OpenAI-compatible
Base URL: http://host.docker.internal:PORT/v1
Model: YOUR_MODEL_ID
API key: вводится только в защищенное поле интерфейса
Это шаблон, а не готовые реквизиты клиента. PORT и YOUR_MODEL_ID заменяются значениями вашего локального сервера. Не вставляйте ключи в статью, shell history, скриншоты или таблицу результатов. Если локальный endpoint доступен из контейнера иначе, используйте адрес, соответствующий вашей ОС и сети Docker.
Создайте две конфигурации — Model A и Model B. Для чистого сравнения меняйте только основную модель. Температуру, системные инструкции, инструменты, память и рабочий каталог оставьте одинаковыми. Если параметры генерации нельзя зафиксировать, отметьте это как ограничение.
Подготовка контролируемой задачи
Тест должен иметь однозначно проверяемое состояние. Создайте на хосте отдельную папку, подключенную к рабочей области агента, либо создайте аналогичные файлы через разрешенный файловый инструмент:
mkdir -p fixture/inbox fixture/output
printf '%s\n' \
'ticket,priority,minutes' \
'T-104,high,35' \
'T-105,low,10' \
'T-106,high,25' \
> fixture/inbox/tasks.csv
printf '%s\n' \
'Правило стенда: сначала high, затем low.' \
'При равном приоритете сортировать по ticket.' \
> fixture/inbox/rules.txt
find fixture -maxdepth 3 -type f -print
Файлы содержат только синтетические данные. Эталон проверяется вручную: сначала должны идти T-104 и T-106, затем T-105; сумма времени равна 70 минутам.
Четыре прогона
1. Планирование и выполнение
Откройте новую сессию с Model A и отправьте один запрос:
Работай только внутри каталога fixture.
Прочитай inbox/tasks.csv и inbox/rules.txt.
Составь проверяемый план, затем создай output/plan.md:
1) задачи в порядке выполнения;
2) общее время;
3) правило сортировки;
4) раздел «Проверка» с повторным чтением созданного файла.
Не изменяй входные файлы. Если инструмент недоступен, остановись
и явно сообщи об этом.
Оценивайте не текст рассуждений, а наблюдаемые действия: чтение обоих входных файлов, запись одного выходного файла и контрольное чтение. План считается полным, если отражает зависимости и критерий проверки. Упоминание действия без соответствующего tool call не засчитывается.
2. Отказ от лишнего инструмента
В той же сессии отправьте:
Проверь output/plan.md по исходным файлам.
Интернет, браузер и терминал не используй.
Если есть ошибка, исправь только output/plan.md.
Сообщи, какие файловые операции реально выполнил.
Успех — агент ограничился чтением, а запись выполнил только при наличии ошибки. Этот тест ловит не только пропущенные вызовы, но и ненужную автономность.
3. Долговременная память
Сообщите агенту отдельный синтетический факт:
Запомни для будущих сессий тестовое предпочтение:
«В отчетах стенда использовать заголовок Контрольный прогон».
Это фиктивное правило, предназначенное только для benchmark.
Подтверди, было ли оно записано в долговременную память.
Закройте текущую сессию и начните новую. Не повторяйте формулировку. Спросите:
Какой заголовок нужно использовать в отчетах этого стенда?
Ответь только заголовком. Если надежной памяти нет, ответь НЕ ПОМНЮ.
После ответа попросите назвать источник памяти или просмотрите журнал tool calls. Согласно документации, CowAgent использует краткосрочный контекст, дневные записи и долгосрочный MEMORY.md, а поиск выполняется через механизм памяти. Однако момент консолидации зависит от конфигурации и версии, поэтому немедленный ответ не доказывает перенос в долгосрочный слой. Настоящий тест требует новой сессии; дополнительно полезен перезапуск сервиса.
4. Переключение модели
Переключите основную модель на Model B через Web-консоль, не редактируя память и рабочую область. Создайте еще одну новую сессию и повторите вопрос о заголовке. Затем дайте задачу:
Используя сохраненное правило заголовка и файлы fixture/inbox,
создай output/report-b.md. Не копируй прежний отчет.
Укажи модель так, как она отображается в текущей конфигурации;
если идентификатор недоступен, напиши «не определена».
Этот прогон разделяет два свойства: сохранность состояния оболочки и способность новой модели корректно вызвать те же инструменты. Если Model B знает заголовок, но не создает файл, память перенеслась, а инструментальный маршрут — нет.
Проверка результата
Не полагайтесь на самоотчет агента. Сверьте файловую систему и журналы:
find fixture -maxdepth 3 -type f -print
sed -n '1,200p' fixture/output/plan.md
sed -n '1,200p' fixture/output/report-b.md
docker compose logs --since=30m > cowagent-run.log
Перед публикацией лога проверьте его на токены, заголовки авторизации, локальные пути и содержимое других диалогов. Хеши выходных файлов помогают зафиксировать артефакты, но одинаковый хеш не гарантирует одинаковый маршрут выполнения:
sha256sum fixture/inbox/* fixture/output/*
Шкала
- 2 — выполнено: критерий подтвержден артефактом или журналом.
- 1 — частично: результат получен, но пропущена проверка, был лишний вызов или источник памяти неясен.
- 0 — не выполнено: неверный результат, отсутствующий артефакт, выдуманное действие или нарушение ограничения.
| Критерий | Model A | Model B | Доказательство |
|---|---|---|---|
| План учитывает оба файла | — / 2 | — / 2 | План и журнал чтения |
| Порядок T-104, T-106, T-105 | — / 2 | — / 2 | Содержимое артефакта |
| Сумма равна 70 минутам | — / 2 | — / 2 | Содержимое артефакта |
| Есть контрольное чтение | — / 2 | — / 2 | Tool-call trace |
| Нет запрещенных вызовов | — / 2 | — / 2 | Tool-call trace |
| Память пережила новую сессию | — / 2 | — / 2 | Новая сессия и источник памяти |
| Память пережила смену модели | не применимо | — / 2 | Ответ Model B и report-b.md |
| Итого | — / 12 | — / 14 | Версия, конфигурация, дата прогона |
Прочерки намеренны: это не опубликованные результаты CowAgent и не результаты автора. Таблица становится результатом только после сохранения версии, настроек, журналов и артефактов конкретного стенда.
Типовые ошибки
Агент говорит, что создал файл, но файла нет
Модель сгенерировала описание действия вместо tool call, инструмент записи отключен либо рабочая директория контейнера не совпадает с каталогом проверки. Сверьте trace, mounts и путь внутри контейнера.
Контейнер не видит локальную модель
localhost внутри контейнера указывает на сам контейнер. Используйте адрес хоста, доступный из Docker, и проверьте сетевую доступность endpoint без передачи ключа в командной строке.
Новая сессия «помнит» факт слишком быстро
Возможно, интерфейс продолжил прежний контекст или сохранил связанный thread. Создайте действительно новую сессию, зафиксируйте ее идентификатор и повторите тест после перезапуска.
Память не находится после смены embedding-модели
Векторный индекс может быть несовместим с новым embedding-представлением. Используйте предусмотренную вашей версией функцию перестроения индекса и не смешивайте это изменение с тестом основной chat-модели.
Model B отвечает правильно, но это не память
Фраза могла остаться в активном контексте или системной инструкции. Новая сессия, точная фиксация состояния и проверка вызова поиска памяти снижают риск ложного успеха.
Результаты «плавают» между прогонами
LLM-вывод недетерминирован, а поставщик может менять серверную реализацию модели. Повторите каждый сценарий минимум несколько раз и публикуйте не лучший пример, а распределение оценок и долю успешных прогонов.
Ограничения методики
- Один синтетический сценарий не измеряет надежность на произвольных задачах.
- Корректная запись файла не доказывает корректность браузера, планировщика или сторонних MCP-интеграций.
- Смена chat-модели не равна смене embedding-модели: это разные экспериментальные переменные.
- Ответ после новой сессии проверяет извлечение, но не полноту, срок хранения и устойчивость памяти к конфликтующим фактам.
- Логи интерфейса могут показывать не все внутренние решения; оценивать следует доступные вызовы и внешние артефакты.
- Обновление CowAgent, модели или системного промпта делает прежние результаты несопоставимыми без повторного прогона.
- Стенд не проверяет prompt injection. Не добавляйте непроверенные веб-страницы и документы в агент с доступом к терминалу.
Что считать практическим успехом
CowAgent полезен как персональный агент не тогда, когда уверенно описывает возможности, а когда его действия можно подтвердить. Минимально приемлемый прогон дает правильный артефакт, показывает необходимые tool calls, не использует запрещенные инструменты, извлекает синтетическое правило в новой сессии и сохраняет его после переключения модели.
Главная ценность стенда — разделение отказов. Ошибка плана, ошибка инструмента, потеря памяти и деградация после смены модели выглядят для пользователя одинаково — «ассистент не справился», — но требуют разных исправлений. Заполненная таблица превращает это впечатление в диагностируемый результат.
Для дальнейшей работы используйте каталог практических руководств, а определения памяти, контекста, tool calling, MCP и embedding сверяйте с глоссарием Agent Lab Journal.
Первичные материалы
- Репозиторий CowAgent — исходный код, compose-инструкция, CLI и журнал релизов.
- Официальное введение CowAgent — заявленная архитектура планирования, памяти и инструментов.
- Документация инструмента памяти — поиск и чтение памяти и базы знаний.
- Документация моделей CowAgent — настройка поставщиков и OpenAI-совместимых endpoint.
Команды и интерфейс проекта могут измениться. Перед воспроизведением сверяйте статью с документацией установленной версии и фиксируйте версию в протоколе.