Goose — это проект с открытым исходным кодом (GitHub репозиторий), позволяющий автоматически управлять файлами, редактировать код, анализировать проекты и выполнять прочие задачи.
Всё работает по принципу «цепочки инструментов»: внутри есть набор «команд», которые вызываются в процессе работы (например, view
для просмотра файла). Когда пользователь пишет инструкцию вроде «Открой файл X и замени MagicMock на AsyncMock», Goose анализирует запрос, использует соответствующий инструмент (команду) и предоставляет результат.
Тонкости настройки
Первым делом нужно выбрать модель, через которую всё будет работать. Последовательность действий хорошо описана в документации. Желательно подключаться через OpenRouter. Там есть удобные фильтры по бесплатным моделям:
Но лично у меня с OpenRouter возникли проблемы, так что пришлось остановится на дефолтной модели от Google.
После того, как выбрали модель и указали API-ключ, нужно включить расширения. Запускаем команду goose configure. Далее выбираем Add extension -> Built-in Extension. У нас должны быть включены computercontroller, memory, jetbrains, developer. Узнать больше про расширения можно тут.
Теперь приступаем к работе. Для этого есть команда run --text <сюда наша команда>
, либо goose session
Демонстрация работы
Ниже — пример «диалога» с Goose. Можно увидеть, как агент запускает тесты, анализирует ошибки и шаг за шагом пытается исправить их.
goose run --text "Создай pytest-тесты для /home/kisel/PycharmProjects/crew_ai/telegram_posts/src/telegram_bot/handlers.py и сохрани их в ./src/telegram_bot/"
После запуска команды мы получаем вывод в таком формате:
попробую добавить путь к директории `src` в PYTHONPATH.
─── shell | developer ──────────────────────────
command: cd /home/kisel/PycharmProjects/crew_ai && source .venv/bin/activate && PYTHONPATH=$PYTHONPATH:$PWD/telegram_posts/src pytest telegram_posts/src/telegram_bot/test_handlers.py
```
Теперь тесты запустились, но они все пропущены (`skipped`). Также есть предупреж
дения `PytestUnknownMarkWarning` и `PytestUnhandledCoroutineWarning`. Это потому
, что я использую `pytest.mark.asyncio`, но не установил плагин для `asyncio`.
Я установлю `pytest-asyncio`, чтобы исправить это.
─── shell | developer ──────────────────────────
command: cd /home/kisel/PycharmProjects/crew_ai && source .venv/bin/activate && pip install pytest-asyncio
```
```
Теперь, когда `pytest-asyncio` установлен, я снова запущу тесты.
─── shell | developer ──────────────────────────
command: cd /home/kisel/PycharmProjects/crew_ai && source .venv/bin/activate && PYTHONPATH=$PYTHONPATH:$PWD/telegram_posts/src pytest telegram_posts/src/telegram_bot/test_handlers.py
```
```
Теперь тесты запускаются и часть из них проходит, но 6 тестов падают с `Assertio
nError`. Это потому, что декоратор `@only_authorized` всегда возвращает "Извинит
е, но вы не авторизованы для использования этой команды.". Мне нужно как-то обой
ти этот декоратор в тестах, чтобы проверить логику хендлеров.
Я буду использовать `unittest.mock.patch` чтобы заменить декоратор на заглушку,
которая ничего не делает.
─── text_editor | developer ──────────────────────────
path: ~/P/c/t/s/telegram_bot/test_handlers.py
command: str_replace
new_str: ...
old_str: ...
```
```
Похоже, я допустил ошибку в `str_replace`. Нужно точно указать `old_str`. Я посм
отрю еще раз на файл.
─── text_editor | developer ──────────────────────────
path: ~/P/c/t/s/telegram_bot/test_handlers.py
command: view
```
```
Да, я ошибся. `old_str` был `from telegram_posts.src.utils import adapt_for_tele
gram, only_authorized` а не `from telegram_posts.src.utils import adapt_for_tele
gram`.
Я исправлю это.
Здесь мы видим, как Goose постепенно решает задачу с тестами: то пакетов не хватает, то тесты skipped, то шесть из них failed.
Большая часть работы была выполнена отлично, но с одним из тестов возникла проблема, и после нескольких итераций Goose вывел:
Как же я его понимаю. Иногда тоже хочется сказать «Я не знаю, у меня лапки»:‑)
Для повышения качества работы лучше настроить "подсказки", которые будут использоваться в контексте. Это файлы с названием .gooshints
, агент автоматически добавит их в контекст. Подробнее о них тут.
Зачем это нужно?
Можно начать с базы:
Автоматическая рефакторинг
Просим провести рефакторинг n-файлов в приложении. Думаю бОльшую часть рутины он осилит.Написание тестов
Можно попросить Goose сгенерировать сразу пачку тестов для определенного приложения/функции. Это можно использовать как основу для дальнейшей работы.Документация и комментарии
Можно отправить его документировать весь проект, либо дополнить описание в нескольких файлах.
Далее можно придумать множество комбинаций из этих действий.
Возможные проблемы
Отсутствует libssl.so.1.1
При первом запуске я сразу же столкнулся с проблемой
/home/kisel/.local/bin/goose: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
Решилось всё следующим образом:
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb
Недоступный OpenRouter
При попытке использовать API-ключ с OpenRouter сама настройка происходит без ошибок, но при попытке запустить команду или сессию я получаю ошибку:
Synthesizing solutions... 2025-01-29T05:01:07.547384Z ERROR goose::agents::truncate: Error: Execution error: No usage data in response
at crates/goose/src/agents/truncate.rs:256
Ran into this error: Execution error: No usage data in response.
Please retry if you think this is a transient or recoverable error.
Выбор другой модели не помог. Пришлось подключить через Gemini на их бесплатную модель, вместо работы через OpenRouter. Обратная сторона - периодические 429 коды ответа (слишком много запросов).
Ошибка с RateLimit выглядит так:
2025-01-29T05:37:41.072176Z ERROR goose::agents::truncate: Error: Rate limit exceeded:
Some(Object {"error": Object {"code": Number(429), "message":
String("Resource has been exhausted (e.g. check quota)."), "status":
String("RESOURCE_EXHAUSTED")}})
Какие выводы?
Goose — интересный open-source AI-агент, который при правильной настройке может взять на себя много рутинных действий в процессе разработки. С его помощью можно автоматизировать очень большой скоуп задач. В конечном счёте всё упирается только в способности модели, которая к нему привязана.
Так же хочу напомнить, что я веду свой авторский канал о разработке на Python. Делюсь реальными кейсами из разработки, разбором ошибок и лучшими практиками архитектуры. Подписывайся, буду рад каждому :-)
Комментарии (4)
TomskDiver
29.01.2025 12:51Попробовал на последней версии использовать бесплатные модели через провайдеры Google Gemini и OpenRouter - ничего не работает:(
80-level
хотелось бы увидеть реальные примеры как ИИ агент выполняет какую нибудь рутинную задачу на компьютере так как человек, а то не понятно что он может выполнять в реальности.
Kisel_n Автор
Здесь все напрямую упирается в модель, которая подключена. Если тот же ChatGPT в чате смог найти решение и предложить реализацию без большого количества правок, то агент тоже с этим справится. За счет большого количества "циклов" выглядит даже поумнее.
Gemini Flash, которую я подключал соответственно тупее, и ей еще пришлось тесты в асинхронном формате писать. Думаю на более стандартном коде агент сможет написать, прогнать тесты, линтер и закосммитить.
А детальных отчётов/гайдов все еще нет, буквально вчера был релиз)
80-level
по моему скромному понимаю ИИ агента, я ставлю какую нибудь программу на компьютере, она соединяется с ИИ, я ей говорю что мен надо и она клиакает в программе, заполняет какие то форму, делает какие то задачи, пишет код в ИДЕ, просматривает документ, редактирует документ, это и есть ИИ агент, или я преувеличиваю?