Эта заметка вдохновлена статьейЯ заменил Google на 50 строк Python. Через месяц я забыл, как пишется tar -xzf. В какой-то момент, в очередной раз после нажатия Alt+Tab для переключения в браузер, чтобы быстро найти какой-то линуксовый однострочник, я понял, что хватит это терпеть, и полез искать упомянутую статью. Перечитав её и прошерстив комментарии, я понял, что некоторые нужные мне вещи сделаны не совсем так, как хотелось бы, поэтому пошёл пилить свой велосипед. Итак, представляю вамsemantic-terminal:
- Ставится через pip:pip install semantic-terminal
- Unix-style утилитаsem, которая прокидывает аргументы в LLM с промтом: “Сделей однострочник”
- Опционально предоставляет подробное описание однострочника на языке запроса
- Опциональная утилитаsem-run, запускающая сгенерированную команду с сохранением в истории терминала
- Задержка генерации меньше 1с при условии … кхм хм … стабильного интернета
Работаю я в основном в Linux, терминал - один из основных инструментов, но всё-таки по большей части этоls,mkdir,cd,git,grep,htop,ssh, ну и, может, ещё с десяток команд. Все возможные параметры/опции я не помню и, если честно, не хочу/не могу помнить. В общем-то, для этого принято в каждой такой утилите иметь опцию--help, которая расскажет и подскажет. К сожалению, даже с--helpвсё ещё остаётся большой пласт того, что можно делать с системой. Уверен, что есть люди, которые знают большинство недр Unix-подобных систем, но я не из таких. Долгое время, в случаях, когда я не помню, как сделать что-то в терминале, я просто открываю Google и ищу нужный однострочник. С появлением терминалов типа Claude Code или OpenCode появилась возможность делать то же самое прямо в терминале и, надо сказать, я этим активно пользуюсь (и я точно не один такой). Но всё же обычным терминалом я всё ещё пользуюсь много и не собираюсь от него полностью отказываться в пользу AI-терминалов, поэтому хочется unix-style-команду, которая выполняла бы поход в Google / SO, тем более понятно, что это сделать несложно.
Почему не взял готовое?
Решение от автора статьиЯ заменил Google на 50 строк Python. Через месяц я забыл, как пишется tar -xzfхорошее, но лично мне показалось недооформленным. Упомянутые в комментариях альтернативы (+ то, что нашёл сам) – это в основном какие-то более общие решения в контексте AI-терминалов, а мне хотелось именно unix-style: команду, которая делает ровно одну вещь.
Что получилось?
Итак, со всем этим я открыл ноутбук, начал кодить, запустил AI-терминал, описал задачу и пошёл пить чай под тупые видосы с YouTube, периодически сверяясь с тем, что происходит. В итоге имеем питоновский пакетsemantic-terminal: ставится через pip и предоставляет одну командуsem, вот её суть:
Под капотом простая идея: при запуске в режиме генерации просто скармливаем описание в LLM с указанием “Сделай однострочную команду”, остальное – для удобства.
Две ключевых особенности
В целом, 50-строчный скрипт мне импонировал: минималистичный, только то, что нужно. Но всё-таки у него были две существенные для меня проблемы и одна незначительная. Начну с последней: лично я не люблю интерактивность и предпочёл сделать интерфейс в виде двух режимов: генерация и выполнение. А теперь по существенным проблемам.
Первая заключается в том, что сгенерированная команда выполняется в дочернем процессе, и внутри Python с этим ничего не сделать. В результате выполненная команда не попадает в историю терминала и, соответственно, мы не можем её быстро воспроизвести или найти в истории. Чтобы это обойти, добавил обвязку на bash/powershellsem-run, которую можно опционально поставить черезsem-setup.
Вторая проблема заключается в том, что кроме самой команды иногда хочется и разобраться – поэтому добавил режим--verbose, который генерирует не только команду, но и её объяснение. Тут сразу есть приятный бонус: большинство современных LLM мультиязычны, поэтому легко из коробки получить описание на том же языке, на котором был сделан запрос. Тестировал на русском, английском, китайском и испанском.
Быстрый старт
Устанавливаем из PyPI
Первым делом нужно сконфигурировать LLM. Самое простое (и быстрое), что я пока нашёл – регистрируем бесплатный аккаунт Groqhttps://console.groq.com, берём API-ключ и запускаем
после чего вставляем ключ от аккаунта. Полную конфигурацию смотрите в README. Если хочется сохранять в истории терминала запущенные команды, то запускаем
И используемsem-runдля выполнения команд, а неsem -r/sem !. По сути всё, теперь мы готовы!
Пример будет один, но с разными опциями: “sem show last 10 commits”. Во-первых, вариант с использованиемsem !
Как видите, в историиsem !. А вот вариант сsem-run:
Ну и, соответственно, примеры из репозитория. На русском:
На китайском:
И на испанском:
И отдельно отмечу, что всё это дело работает довольно шустро (модельllama-3.3-70b-versatile, хост Groq, РКН ничего активно не тестирует), демо смонтировано без изменения скорости и склеек между выполнением команды и получением результата.
В общем, забирайте на здоровье! Если зашло, не забудьте заапвоатить статью и поставить звёздочку репозиторию, это сделает автора очень счастливым!