00:00:00Один из самых простых способов сделать ваших ИИ-агентов мощнее — это просто предоставить им
00:00:03доступ к bash, но это может быть довольно сложно. Вам нужна настоящая оболочка, файловая система,
00:00:09серверы и контейнеры — в общем, целая инфраструктура... по крайней мере, так было раньше.
00:00:13Но что, если я скажу, что есть способ проще? Вы можете использовать реализацию bash
00:00:18на TypeScript. Я знаю, это звучит безумно, но поверьте, это очень круто,
00:00:22и это даже может сэкономить вам деньги. Сейчас покажу как.
00:00:30Это новый пакет под названием justbash, и в файле readme сказано: «Симулируемая
00:00:34среда bash с виртуальной файловой системой в оперативной памяти, написанная на TypeScript. Это
00:00:38разработано для ИИ-агентов, которым нужна безопасная, изолированная среда bash».
00:00:42Но прежде чем я покажу, как связать это с вашими агентами, чтобы расширить их
00:00:45возможности, я хочу продемонстрировать простой код, чтобы вы понимали контекст,
00:00:48как это работает. Здесь я запускаю новую среду bash из пакета justbash,
00:00:53и внутри неё мы можем выполнять bash-команды. Мы используем env.exec, и здесь я просто
00:00:57запускаю команду echo hello и указываю, что хочу сохранить это в файл
00:01:01greeting.txt. Затем на следующей строке я снова вызываю exec в той же среде,
00:01:06чтобы прочитать этот файл greeting.txt. И, как видите, мы можем вывести в лог
00:01:10стандартный вывод результата, код завершения, а также переменные окружения.
00:01:14Когда я запускаю это, видно, что файл успешно записан и прочитан.
00:01:18Мы получаем код завершения 0 и переменные окружения в нашей симулируемой
00:01:22оболочке bash. Но важно помнить: как я уже сказал, это лишь симуляция,
00:01:26буквально версия команд bash, переписанная на TypeScript.
00:01:30Она не привязана к реальной оболочке, она просто преобразует команду,
00:01:34которую мы даем, в TypeScript и исполняет её. Так что файл greeting.txt
00:01:39не существует в реальной файловой системе — это виртуальная система в памяти, хотя
00:01:44есть варианты, если вы захотите подключить настоящую. Если упростить,
00:01:47то библиотека просто берет bash-команду, которую мы пишем в функции exec,
00:01:51и превращает её в JavaScript-функцию, которую затем запускает. Это значит,
00:01:55что реальный shell не нужен, и мы можем увидеть это в коде. Когда я пишу echo
00:01:59внутри exec, на самом деле запускается эта JS-функция, и мы видим логику
00:02:03для парсинга флагов команды echo из bash и их преобразования в JavaScript,
00:02:08после чего просто выводится текст, который мы указали после echo. И вы видите,
00:02:11что в итоге возвращается объект со стандартным выводом в формате JS,
00:02:15стандартной ошибкой и кодом завершения. И если вы думаете, что она
00:02:19не справится с основами bash, посмотрите на этот список поддерживаемых
00:02:23команд — их очень много: cat, copy, awk,
00:02:27base64, продвинутые инструменты вроде jq, python 3 и sqlite, и даже
00:02:33сетевые запросы через curl. Вы даже можете настроить белый список для безопасности.
00:02:36Также поддерживаются функции оболочки: конвейеры, перенаправления, цепочки команд —
00:02:41здесь есть практически всё, что дает базовый bash. Как видите,
00:02:45пакет отличный и функциональный, но вы наверняка всё ещё задаетесь вопросом,
00:02:48зачем нужна реализация bash на TypeScript, как она поможет агентам и сэкономит деньги.
00:02:53Чтобы ответить на это, давайте разберем один сценарий в простом чат-приложении.
00:02:57Допустим, в этом чате я хочу обсудить вот этот JSON-файл. В нём
00:03:02огромное количество записей, и я хочу попросить ИИ извлечь
00:03:06из него данные или провести анализ по определённым полям. Как видите,
00:03:11файл просто гигантский. Один из самых простых, но в корне неверных способов —
00:03:15это вставить всё содержимое файла прямо в промпт. Здесь
00:03:19я использую AI SDK и модель GPT-4o. Если мы запустим этого агента и
00:03:24попросим его найти конкретную запись, ассистент ответит,
00:03:28и я подтверждаю, что ответ верный, так как большие модели неплохо ищут «иголку» в контексте.
00:03:33Но проблема в том, что это съело 133 000 токенов, и всё начнет
00:03:39разваливаться, если задать более сложные вопросы, например, о манипуляции данными
00:03:43или фильтрации по диапазонам. Опять же, это явно плохой подход.
00:03:48Другой вариант, который вы могли пробовать, — это RAG
00:03:51или предоставление агенту песочницы для запуска bash и обработки данных,
00:03:56но проблема в том, что для этого требуется много инфраструктуры.
00:04:00Вместо этого давайте просто симулируем всё через justbash. С помощью AI SDK можно
00:04:05использовать пакет bash-tool, построенный на базе justbash. Это
00:04:09позволяет нам в API-эндпоинте чата создать новый инструмент bash и передать
00:04:13любые файлы в нашу симулируемую среду. В моем случае я передаю тот самый
00:04:17огромный JSON-файл. Затем я настраиваю место назначения,
00:04:21куда попадут файлы — в данном случае в симулируемую директорию /workspace.
00:04:26После этого в потоке данных (stream) из AI SDK нам нужно лишь
00:04:31подключить bashTool. Также я добавил
00:04:34инструкции для агента из папки node_modules. Это простые
00:04:39инструкции из пакета, которые помогают ИИ понять, как правильно
00:04:42использовать этот инструмент. С такой простой настройкой, если мы попросим
00:04:46ассистента извлечь ту же информацию из JSON, вместо того чтобы тратить
00:04:50свой контекст на поиск данных в огромном массиве, он просто
00:04:54выполнит bash-команды в нашей симулируемой среде TypeScript.
00:04:58В данном случае он сначала попробовал jq, но, похоже, возникла ошибка, поэтому
00:05:02следом он запустил команду head, чтобы увидеть структуру файла. Поняв
00:05:06формат, он составил верный запрос jq и дал ответ. Да, мы получили
00:05:10тот же результат, и, возможно, это заняло чуть больше времени, но главное —
00:05:15посмотрите: это заняло всего 6 000 входных токенов против 133 000.
00:05:19Это гораздо более эффективный метод работы с большим контекстом,
00:05:24и это не единственное преимущество. Всё становится интереснее, когда вы
00:05:28задаете сложные вопросы. Например: «Сколько записей в диапазоне
00:05:33от 1000 до 2500 имеют статус active: true?». Агент
00:05:37просто запускает bash-команду и мгновенно выдает ответ. Если бы вы
00:05:41попробовали это с первым методом, это заняло бы уйму контекста, и,
00:05:45скорее всего, ИИ просто угадал бы ответ. С justbash всё будет точнее,
00:05:49так как вы фактически даете агенту полный доступ к bash,
00:05:53хотя технически это не так. Это честная, бесплатная и полезная функция,
00:05:57которая делает агентов мощнее без всякой лишней инфраструктуры.
00:06:01И это мне очень нравится. Надеюсь, я показал хотя бы один крутой кейс,
00:06:05но их гораздо больше: тут работают Python, SQL и curl.
00:06:10А при желании это можно привязать и к реальной файловой системе.
00:06:14Пишите в комментариях, что думаете о justbash, подписывайтесь,
00:06:18и до встречи в новых видео!