← Практика · 1 сентября 2026
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 из скрипта и предсказуем, и правится за секунду.