Перейти к содержанию

OpenAI

OpenAI выпустила официальный CLI для своего API

5 мин чтения

Текст написан ИИ-моделью по источникам, на которые ведут ссылки, и сверен с ними второй моделью. Как мы работаем

Изображение: github.com

У REST API OpenAI появился официальный консольный клиент: 21 октября компания открыла репозиторий openai-cli на GitHub под лицензией Apache 2.0. Он ставится через Homebrew командой brew install openai/tools/openai или через go install. Для второго варианта нужен Go 1.26 или новее, бинарник попадает в $HOME/go/bin, и если шелл его не находит, этот каталог надо добавить в PATH.

Для каких задач нужен клиент, OpenAI объясняет в документации: для работы, которая укладывается в терминал. Это генерация локальных файлов вроде картинок и речи, выгрузка структурированных данных в JSONL, Responses с файлами, computer use и веб-контекстом, создание проектов и API-ключей через Admin API. Задачи, где нужно суждение (изучить код, отладить, сделать ревью), там же советуют отдавать субагентам.

Ресурс, подресурс, команда

Синтаксис повторяет устройство самого API: openai <resource> [subresource...] <command> [flags...]. Запрос к модели выглядит как openai responses create --input "Say this is a test" --model gpt-5.5, ключ берётся из OPENAI_API_KEY. Админским эндпоинтам нужен отдельный ключ в OPENAI_ADMIN_KEY. Пример из README: отчёт по использованию организации openai admin organization usage completions с границами периода в Unix-времени и шагом агрегации 1d. Какой из двух ключей отправить, по документации, решает слой SDK в зависимости от вызываемого эндпоинта. Старая запись через двоеточия, openai admin:organization:usage completions, по-прежнему работает.

Справке не нужны ни ключ, ни сеть. openai без аргументов показывает группы команд по задачам с описаниями, --help или -h есть у любой команды, а openai help setup проводит через безопасный ввод ключа. Старое написание help --all печатает инструкцию по миграции и полную страницу справки.

Успешный ответ с JSON по умолчанию выводится читаемым текстом, в том числе в пайпах. Скрипт, который разбирает данные, должен явно попросить --format json или --format jsonl, так что привычная для консольных утилит логика, при которой вывод в пайп сам становится машинным, здесь уже не сработает. Всего форматов восемь: auto, text, explore, json, jsonl, pretty, raw и yaml. Флаг --transform вытаскивает данные по пути в синтаксисе GJSON, компактном языке запросов к JSON. Брать текст ответа из output[0] документация не советует: в выводе Responses перед сообщением ассистента могут стоять другие элементы, например reasoning. Сообщение надёжнее выбирать по типу: --transform 'output.#(type=="message").content.0.text'.

Для файлов появились короткие команды: openai files upload с обязательным --purpose, files get для метаданных и files download с --output или перенаправлением в файл. При загрузке путь пишется как есть, без @. Прежние create, retrieve и content со своими флагами остались.

Картинки сохраняются сами

openai images generate --prompt "A tiny orange robot" сразу кладёт результат в ~/Downloads/gpt-images/ и печатает пути к файлам, и в пайпах тоже. Без явно указанной модели CLI берёт gpt-image-2.5-sunburst. Другую модель задаёт --model с точным ID, имя файла задаёт --name, каталог задаёт --output-dir, и этот каталог должен уже существовать. Существующие файлы CLI не перезаписывает. С --format json он возвращает данные API, ничего не сохраняя и не применяя свой пресет. images edit тоже сохраняет новые результаты, а исходники не трогает.

images create-variation убрали совсем: вариацию теперь делают через images edit с моделью GPT Image и промптом. Сохранённую картинку можно снова показать без запроса к API командой openai images preview. openai images inline on или off запоминает, выводить ли новые картинки прямо в терминале, а флаг --inline у отдельной команды перекрывает эту настройку.

Первый подходящий интерактивный запуск openai тихо записывает Tab-сочетания для выбора картинок в будущие сессии Bash, zsh и fish, заработают они в новом терминале. Требования и способ отказаться описаны в отдельном разделе README. В PowerShell автодополнение остаётся обычным, а выбор открывается по Enter после openai images generate. Само автодополнение теперь подсказывает темы справки и пути к файлам, но после обновления скрипт дополнения надо перезагрузить, иначе останется старое поведение.

Где стоят предохранители

В JSON-значениях префикс @ читает локальный файл: --arg @abe.jpg подставит его содержимое. Такие ссылки работают и внутри JSON или YAML, переданных через stdin. Тип файла CLI определяет сам: текст уходит строкой, бинарные данные кодируются в base64, а задать способ явно можно через @file:// и @data://. Для JSON из недоверенного источника README предлагает включать OPENAI_UNTRUSTED_STDIN=1. В этом режиме @-ссылки из stdin в телах запросов, заголовках и параметрах считаются обычным текстом, а файлы для загрузки передаются только явными флагами. Строку, которая сама начинается с @, экранируют обратной косой чертой: '\@abe'.

Заголовки через --header или -H передаются буквально: запятые и двоеточия сохраняются, @ не читает файлы, при повторе имени побеждает последнее значение. Заголовки с секретами README советует класть в OPENAI_CUSTOM_HEADERS (по одной паре Name: Value на строку) и выставлять эту переменную через менеджер секретов, чтобы значения не попадали в аргументы команды и историю шелла. В отладочных логах значения заголовков маскируются, но сам --debug пишет тела запросов и ответов, и делиться такими логами README не рекомендует.

Ошибки по умолчанию уходят в stderr короткими сводками, без отклонённых значений и URL запроса. Полный ответ API с ошибкой выдаёт --format-error json, и в нём может оказаться чувствительная информация от сервера. --base-url требует HTTPS везде, кроме localhost и loopback-адресов вроде 127.0.0.1 и ::1, и то же правило действует для OPENAI_BASE_URL. По документации, так клиент можно направить и на другой совместимый endpoint, например на развёртывание с другим набором моделей или только с частью API.

Поддержка mTLS, взаимной TLS-аутентификации, при которой сертификат предъявляет и клиент, пока в бете и подключается через программу OpenAI. Сертификат и ключ передаются отдельными PEM-файлами, а адрес https://mtls.api.openai.com/v1 надо прописать вручную: сам CLI его не выбирает. HTTP- и SOCKS-прокси работают, HTTPS-прокси CLI отклоняет, чтобы клиентский сертификат не оказался в TLS-рукопожатии с самим прокси.

Старый openai в PATH

У тех, кто давно пишет на Python, имя команды может быть уже занято. В документации OpenAI предупреждает, что старые версии Python SDK тоже ставили команду openai. Если такой пакет остался в системе, шелл может находить устаревший бинарник, который ведёт себя не так, как написано в гайде. Чистых установок это не касается. Новый клиент написан на Go поверх Go SDK: скрипт ./scripts/link подключает для разработки другую версию openai-go, из репозитория по ветке, тегу или коммиту либо из локальной копии.

Баг-репорты и запросы новых функций принимают через GitHub issues, а с кодом строже. «Пул-реквесты принимаются только от участников репозитория, от остальных мы их не принимаем», - сказано в README.

Инструменты разработчикаразбор

Порт TypeScript на Rust от Cloudflare: до 8 раз быстрее 7.0

В Owner.com компилятор TypeScript на Go съедал 19 ГиБ памяти на проверку типов, и ИИ-агентам было тесно работать параллельно. Порт компилятора на Rust, который там написали сами агенты, теперь развивает Cloudflare. Вы бы доверили агентам переписать компилятор целиком или держали бы их на мелких правках?

Пока никто не написал. Будьте первым.

Присоединяйтесь к разговору

Войдите, чтобы оставить комментарий. Он появится после модерации.