IKORG
English

← Практика · 1 сентября 2026

Как рисовать картинки из терминала по подписке ChatGPT

Codex умеет генерировать изображения, но прячет их в песочнице. Разбираем скрипт, который запускает генерацию в фоне и забирает готовый PNG в проект.

5 минут чтенияинструменты

Продолжение заметки про GPT в Claude Code: вход уже настроен, подписка уже оплачена — оказывается, ею же можно рисовать. Отдельный сервис генерации картинок не нужен.

Полезно, когда нужна не иллюстрация уровня арт-дирекции, а рабочая картинка: обложка статьи, иконка, фон, заглушка в макет. У меня так рисуются обложки к статьям и логотипы для черновиков лендингов.

В чём подвох

Codex CLI умеет вызывать генератор изображений. Но кладёт результат внутрь своей песочницы — в ~/.codex/generated_images/<id сессии>/, а не туда, где вы работаете. Попросить его «сохрани файл в проект» бесполезно: на обычном пользовательском аккаунте у него нет прав на сетевые namespace, и его собственный шелл падает с bwrap: loopback: Failed RTM_NEWADDR.

Хорошая новость: картинка при этом уже на диске. Её надо просто забрать самим.

Скрипт

Кладём в ~/.local/bin/gpt-image:

#!/usr/bin/env bash
set -euo pipefail
export PATH="$HOME/.local/node/bin:$PATH"

OUT="картинка-$(date +%H%M%S).png"; IN=""; BG=0; WAIT=""
while [ $# -gt 0 ]; do
  case "$1" in
    -o) OUT="$2"; shift 2;;
    -i) IN="$2"; shift 2;;        # исходная картинка для правки
    --bg) BG=1; shift;;           # запустить в фоне
    --wait) WAIT="$2"; shift 2;;  # забрать результат фоновой генерации
    *) break;;
  esac
done

забрать() {  # $1 — лог запуска
  local id png
  id="$(grep -o 'session id: [0-9a-f-]\{36\}' "$1" | head -1 | awk '{print $3}')"
  [ -z "$id" ] && { echo "в логе нет id сессии: $1" >&2; return 1; }
  png="$(ls -t "$HOME/.codex/generated_images/$id/"*.png 2>/dev/null | head -1)"
  [ -z "$png" ] && { echo "картинка не найдена" >&2; return 1; }
  cp "$png" "$OUT"; echo "$OUT"
}

if [ -n "$WAIT" ]; then забрать "$WAIT"; exit $?; fi

LOG="$(mktemp -d)/log.txt"
ЗАДАНИЕ="Нарисуй изображение по описанию. Не запускай команды и не пытайся сохранять файлы.
Описание: $*"

пуск() {
  if [ -n "$IN" ]; then
    printf '%s' "$ЗАДАНИЕ" | codex exec -s read-only --skip-git-repo-check -i "$IN" - >"$LOG" 2>&1
  else
    printf '%s' "$ЗАДАНИЕ" | codex exec -s read-only --skip-git-repo-check - >"$LOG" 2>&1
  fi
}

if [ "$BG" = 1 ]; then
  ( пуск ) >/dev/null 2>&1 &
  echo "GPT_IMAGE_LOG: $LOG"
  echo "готово через 1–3 минуты; забрать: gpt-image --wait $LOG -o $OUT"
else
  пуск; забрать "$LOG"
fi
chmod +x ~/.local/bin/gpt-image

Как пользоваться

# просто нарисовать
gpt-image -o лого.png "логотип строительной фирмы, жёлтая каска, плоский стиль, без текста"

# поправить готовую картинку
gpt-image -i было.png -o стало.png "поставь на сплошной тёмно-синий фон"

# в фоне (в диалоге с Claude так надёжнее — не упрётесь в таймаут)
gpt-image --bg -o обложка.png "тёмно-синий фон, семь светящихся карточек по кругу"
gpt-image --wait /tmp/tmp.XXXX/log.txt -o обложка.png

Генерация занимает от сорока секунд до трёх минут. Поэтому режим --bg не роскошь: инструмент запуска команд в Claude Code обычно отваливается по таймауту раньше, чем картинка будет готова.

Что важно знать заранее

Задание передаётся через stdin, а не аргументом. У codex exec флаг -i многозначный и «съедает» позиционный текст: получите No prompt provided via stdin и минуту потерянного времени.

Фраза «не запускай команды» в задании экономит минуту. Иначе агент честно попытается сохранить файл, упрётся в песочницу и потратит время на объяснения, почему не смог.

Скачивать картинки из интернета он не умеет — только рисовать. Песочница без сети.

Точность к описанию средняя. Просите «плоский вектор на синем» — можете получить объёмный объект на прозрачном. Спорить в первом запросе дороже, чем довести вторым: -i результат.png "убери объём, сделай плоскую заливку".

Текст на картинке лучше не заказывать. Буквы генератор врёт — особенно кириллицу. Если нужны подписи, надёжнее нарисовать фон генератором, а текст положить сверху в SVG или CSS.

Склад растёт. ~/.codex/generated_images копит все картинки всех запусков. Раз в неделю чистите — на маленьком диске это заметно:

find ~/.codex/generated_images -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +

Когда этого хватает, а когда нет

Хватает: фоны, абстракции, иконки, обложки статей, черновые логотипы, заглушки в макете. То есть всё, где нужна «картинка по смыслу», а не выверенный фирменный стиль.

Не хватает: точные схемы, интерфейсы, что-либо с текстом, повторяемый персонаж в одном стиле. Схемы честнее рисовать кодом — SVG из скрипта и предсказуем, и правится за секунду.