В мире разработки программного обеспечения, особенно в сфере искусственного интеллекта, стабильность инструментов кажется чем-то само собой разумеющимся. Мы привыкли, что если команда выпустила обновление, оно должно работать «из коробки». Однако недавний инцидент с релизом версии 0.32.1 популярной утилиты командной строки llm от Саймона Уиллисона (Simon Willison) наглядно показал, насколько хрупкой может быть эта уверенность. Проблема, которая на первый взгляд кажется технической мелочью, затрагивает фундаментальные аспекты управления зависимостями в Python и демонстрирует, как изменения в низкоуровневых библиотеках могут парализовать работу высокоуровневых приложений.
Суть инцидента заключается в том, что свежие установки пакета llm перестали функционировать после того, как библиотека OpenAI Python (openai) отказалась от использования библиотеки httpx. Утилита llm, в свою очередь, зависела от этой библиотеки, но устанавливала её не напрямую, а через транзитивную зависимость от самого пакета openai. Когда разработчики OpenAI изменили внутреннюю архитектуру своего клиента, утилита llm потеряла необходимый компонент, что привело к краху при запуске. Это классический пример «сломанной сборки» в распределённой экосистеме.
В данной статье мы подробно разберем, что именно произошло, почему транзитивные зависимости являются источником таких уязвимостей, как было решено проблему в краткосрочной перспективе (через пинг версии) и что нас ждет в ближайшем будущем с выходом версии 0.33.0. Мы также рассмотрим контекст развития экосистемы Python для работы с LLM и почему такие инциденты становятся нормой в эпоху быстрого роста AI-инструментов.
01Природа проблемы: Транзитивные зависимости и «хрупкий базовый класс»
Чтобы понять масштаб проблемы, необходимо заглянуть под капот того, как Python управляет пакетами. Когда вы устанавливаете пакет через pip, вы указываете только те зависимости, которые используете напрямую. Однако этот пакет, в свою очередь, может зависеть от других библиотек. Эти «зависимости второго порядка» называются транзитивными.
В случае с утилитой llm, разработчики не указывали httpx в явном виде в файле pyproject.toml или setup.py. Они полагались на то, что пакет openai сам установит httpx как часть своего окружения. Это стандартная практика, которая упрощает жизнь разработчикам, позволяя не дублировать списки зависимостей. Однако она создает скрытую связь: если openai перестает использовать httpx или заменяет его на другую библиотеку (например, httpx2 или собственный HTTP-клиент), транзитивная зависимость разрывается.
Инцидент произошел потому, что библиотека openai провела рефакторинг своего HTTP-слоя. Вероятно, это было сделано для повышения производительности, снижения размера пакета или устранения уязвимостей безопасности в старых версиях httpx. Для разработчиков OpenAI это было внутренним улучшением. Для пользователей llm, которые просто хотели выполнить команду в терминале, это стало критическим сбоем. Команда переставала запускаться с ошибкой импорта или отсутствия модуля, что делало инструмент бесполезным до выхода патча.
Этот случай ярко иллюстрирует проблему, известную как «хрупкий базовый класс» (fragile base class problem), но примененную к уровню зависимостей. Изменение в базовом компоненте (библиотеке OpenAI) ломает производные компоненты (утилиту LLM), даже если публичный API этих компонентов не менялся. Пользователь llm не должен знать, использует ли OpenAI httpx или что-то иное. Он ожидает, что интерфейс командной строки будет работать стабильно.

02Краткосрочное решение: Пинг версий как «костыль»
Реакция сообщества и разработчиков на инцидент была быстрой. Был выпущен релиз llm 0.32.1, который исправляет проблему. Однако способ исправления интересен с точки зрения инженерной этики и практик управления зависимостями. Вместо того чтобы немедленно переписывать код утилиты, разработчики применили тактику «пинга» (pinning) версии.
Пинг версии означает жесткую фиксацию версии зависимого пакета. В данном случае, в конфигурацию llm было добавлено требование openai<3. Это говорит менеджеру пакетов (pip): «Устанавливай любую версию библиотеки OpenAI, которая меньше третьей.major версии». Поскольку переход на версию 3.0, вероятно, включал в себя удаление httpx, ограничение версией ниже 3.0 гарантирует, что пользователь получит старую, стабильную версию библиотеки OpenAI, которая все еще использует httpx.
[project]
name = "llm"
version = "0.32.1"
dependencies = [
"openai<3",
"httpx",
# другие зависимости...
]Хотя этот метод эффективно восстанавливает работоспособность инструмента, он имеет существенные недостатки. Во-первых, пользователи llm лишаются преимуществ новых версий библиотеки OpenAI. Если в версии 3.0 были исправлены критические баги, улучшена скорость работы или добавлены новые функции, пользователи llm не смогут их использовать, пока не выйдет новая версия утилиты. Во-вторых, это создает «технический долг». Со временем разница между «старой» стабильной версией OpenAI и «новой» версией LLM может стать слишком большой, и миграция станет болезненной и сложной.
Пинг версий — это временное решение, «пластырь», который позволяет системе дышать, пока не будет проведено более глубокое хирургическое вмешательство. В данном случае он позволил сохранить доверие пользователей, которые не хотели разбираться с проблемами установки, но он не решает корневую причину проблемы.
03Долгосрочное решение: Переход на httpx2
Разработчики утилиты llm не планировали оставаться в режиме «костыля» надолго. В анонсе указано, что скоро выйдет версия 0.33, которая полностью переключится с httpx на httpx2. Это важное архитектурное изменение, которое требует переписывания части кода, отвечающего за сетевые запросы.
Что такое httpx2? В контексте экосистемы Python, httpx является одним из самых популярных современных HTTP-клиентов, предлагающим асинхронный интерфейс и поддержку HTTP/2. Версия 2.0 (или httpx2 в терминологии источника) обычно подразумевает крупное обновление с потенциально ломающими изменениями (breaking changes) в API. Переход на него означает, что разработчики llm должны адаптировать свои вызовы к новому интерфейсу.

Этот шаг имеет несколько преимуществ. Во-первых, он устраняет зависимость от поведения библиотеки OpenAI. Теперь llm будет напрямую управлять своим HTTP-клиентом. Если OpenAI снова изменит свой внутренний стек, это не повлияет на llm, так как llm будет использовать свой собственный экземпляр httpx2 для коммуникации с API. Во-вторых, httpx2, вероятно, предлагает лучшую производительность или безопасность, что улучшит работу утилиты в целом.
Однако переход на новую major-версию библиотеки всегда несет риски. Могут возникнуть несовместимости с другими зависимостями, которые все еще используют старую версию httpx. Менеджеру пакетов Python (pip) придется разрешать конфликты версий, что иногда приводит к установке нескольких версий одной библиотеки, что увеличивает размер окружения и может вызывать ошибки времени выполнения.
04Контекст: Эволюция CLI-инструментов для LLM
Утилита llm занимает особое место в экосистеме работы с большими языковыми моделями (LLM). Она предоставляет простой, удобный интерфейс командной строки для взаимодействия с различными моделями, включая OpenAI, Anthropic, локальные модели через Ollama и другие. Для многих разработчиков, исследователей и энтузиастов AI, терминал остается основным рабочим пространством. Быстрый вызов модели, проверка вывода, пайплайнинг данных — все это делается через llm.
Популярность таких инструментов, как llm, растет вместе с интересом к AI. Однако эта популярность создает давление. Пользователи ожидают стабильности, как в коммерческих продуктах, но инструменты часто разрабатываются энтузиастами или небольшими командами. Инцидент с httpx показывает, что даже при хорошем управлении проектом, внешние факторы (изменения в сторонних библиотеках) могут нарушить работу.
Кроме того, этот случай подчеркивает важность локального запуска и контроля над инструментами. В отличие от облачных сервисов, где провайдер гарантирует доступность, локальные CLI-инструменты требуют от пользователя понимания того, как они устроены. Когда что-то ломается, пользователь должен уметь прочитать ошибку, понять, что это проблема зависимости, и, возможно, вручную установить нужную версию пакета. Это барьер входа для новичков, но цена свободы и контроля.
05Уроки для разработчиков и пользователей
Инцидент с llm 0.32.1 несет несколько важных уроков для всех участников экосистемы Python и AI.

Для разработчиков инструментов:
- Избегайте скрытых зависимостей. Если ваш инструмент зависит от конкретной библиотеки, указывайте её явно, даже если она поставляется через другой пакет. Это дает вам контроль над версионированием.
- Тестируйте обновления зависимостей. Автоматизируйте тестирование ваших инструментов против последних версий ключевых зависимостей (таких как
openai,httpx,transformers). CI/CD пайплайны должны ловить такие поломки до релиза. - Будьте готовы к миграции. Быстрый переход на новые версии библиотек (как
httpx2) может быть болезненным, но необходим для долгосрочной стабильности.
Для пользователей:
- Читайте логи. Ошибки установки часто содержат подсказки о том, какая зависимость вызвала проблему. В данном случае ошибка указала бы на отсутствие
httpx. - Используйте виртуальные окружения. Это изолирует ваши проекты и позволяет экспериментировать с разными версиями библиотек без риска сломать другие инструменты.
- Следите за обновлениями. Сообщества разработчиков (такие как блог Саймона Уиллисона) часто первыми сообщают о подобных проблемах и способах их обхода.
06Что это значит на практике
Для рядового пользователя, который просто хочет использовать AI через командную строку, этот инцидент означает одно: инструменты все еще находятся в стадии бурного роста и нестабильности. Нельзя ожидать, что все будет работать идеально с первого раза. Однако, благодаря быстрому реагированию разработчиков, проблема была решена за считанные дни.
На практике это означает, что при установке llm или подобных инструментов, вам следует быть готовым к тому, что могут потребоваться ручные вмешательства. Например, если вы видите ошибку, связанную с отсутствующей библиотекой, попробуйте установить её вручную: pip install httpx. Или, если вы хотите использовать последние функции OpenAI, возможно, придется подождать выхода новой версии llm (0.33), которая будет совместима с новыми версиями API.
Также это подчеркивает важность выбора надежных инструментов. llm от Саймона Уиллисона демонстрирует высокий уровень ответственности перед сообществом, быстро выпуская патчи. Это делает его более надежным выбором по сравнению с менее поддерживаемыми аналогами. В долгосрочной перспективе, переход на httpx2 сделает инструмент более устойчивым к будущим изменениям в экосистеме OpenAI.
В конечном итоге, этот случай — не трагедия, а учебный урок. Он показывает, что разработка AI-инструментов — это не только написание кода для работы с моделями, но и сложная инженерная работа по управлению зависимостями в быстро меняющейся среде. И пока сообщество активно участвует в решении таких проблем, экосистема Python для AI будет становиться только сильнее и стабильнее.
Источник: Simon Willison ↗
