ImageSorcery 06 - MVP
Это серия постов от идеи ImageSorcery до 100+ звёзд на гитхабе и ~100 ежедневных установок с PyPi.
ImageSorcery 01 - Как я свой open source вайбкодил
ImageSorcery 02 - Превращение ImageWizard в ImageSorcery
ImageSorcery 03 - шаг за шагом: PoC, Initial commit
ImageSorcery 04 - README.MD
ImageSorcery 05 - автотесты; просто покажи ему примерПо результатам предыдущих приседаний с ИИ у нас на руках прототипы
detect
,crop
иget_metainfo
- функций на python, которые понадобятся ИИ агенту чтобы выполнить задачу вроде “вырежи здание на этом фото”. Также у нас уже есть git репозиторий с работающим MCP сервером подключенным в Cline. С полным покрытием одного единственного toolhello_world
тестами формата e2e на pytest. И линтер rufus.
Приступаю к тулзам. По одной за шаг. С покрытием тестами и актуализацией README. От самой простой get_metainfo
к самой сложной detect
. Благо есть работающие реализации от PoC, которые нужны были как пример и подстраховка.
“Изучи @README.MD и следуй правилам работы с кодом от туда. Прочитай код
hello_world
tool и тесты на него. Прочитай код прототипаget_metainfo/crop/detect
. Реализуй соответствующий tool. Напиши тесты. Актуализируй README. Не завершай задачу пока все тесты не пройдут, а также линтер.”
С реализацией проблем конечно уже не было, вот с тестами detect снова пришлось повозиться. Лентяй Gemini flash решил, что если detect
tool запускается и возвращает хоть что-то - этого уже достаточно. Пришлось гонять его и в хвост и в гриву чтобы были написаны позитивные и негативные сценарии и прочие едж кейсы.
Каждый отдельный тул разумеется коммитил.
Где-то в процессе обнаружил что тесты на объявление tool могут быть также достаточно подробными. И самое главное - результаты crop
(сохранение файла) оказывается есть в /tmp/pytest/
. Это означало что я могу проверять тесты, которые работают с изображениями, а не слепо доверять их коду и статусу passed. Это меня в будущем много раз выручит. Например, когда при реализации blur
для теста генерировался полностью черный квадрат и после выполнения blur контрольный пиксель проверялся на соответствие цвета заблюренному черному - черному 🤦. С точки зрения алгоритма всё идеально - не прикопаешься 😅 А я глядя на два одинаковых черных квадрата ржал в голосину. Пришлось заставить его тестировать на шахматке.

Шаг выполнен ✅
Теперь у меня был MCP сервер, который позволял подключенному к нему MCP клиенту вроде Cline выполнить заветное “вырежи с этого фото собаку”. Был ведь? ...
В дев сборке всё работало. Но если я хотел публиковать это как MVP, мне нужно было убедиться, что те, кто найдут его на просторах гитхаба, смогут им воспользоваться. В будущем мне понадобится опубликовать пакет на pypi, но на данном этапе нужно было убедиться что хотя бы через клонирование репозитория всё заведётся.
Я удалил MCP из Cline, склонировал репу в новую директорию и попросил Cline доустановить, подключить и проверить.
🫠 Разумеется ничего не заработало в этом моем стейдже.
Оказывается модели Ultralytics не качаются по неведомой мне причине, когда MCP запущен как процесс(?). Пока я писал прототипы, и запускал detect как отдельный python скрипт, а не как модуль в составе сервера, все нужные мне модели скачались и могли переиспользоваться в последующем. А чистая установка доступа к ним не имела и всё падало.
Такую нетривиальную проблему конечно же не смогли решить никакие ИИ, но день плотного дебага и глубоких обсуждений с Gemini и параллельно Claude (на всякий случай. По факту ничего такого, чего не знал Gemini он не сказал) привёл меня к реализации –post-installation
режима и архитектурному решению с выделением отдельно от tools директории scripts, куда попали скрипты установки и скачивания моделей.
Теперь ImageSorcery была готова к публикации как MVP!
P.S. если кто-то знает как обойти проблему со скачиванием моделей в рантайме - дайте знать. Я бы очень хотел найти альтернативные решения.