- BrainTools - https://www.braintools.ru -
Команда AI for Devs [1] подготовила перевод статьи Саймона Уиллиссона о том, как он решил поэкспериментировать с новой моделью OpenAI — GPT-5-Codex-Mini. Немного наглости, немного Rust и щепотка инженерного любопытства — и вот уже Codex CLI превращается в инструмент, который напрямую обращается к закрытому API. Получилось ли заставить модель нарисовать пеликана?
Вчера OpenAI частично выпустила новую модель [2] под названием GPT-5-Codex-Mini, которую они описывают как «более компактную и экономичную версию GPT-5-Codex». Пока она доступна только через их инструмент Codex CLI и расширение для VS Code, а полноценный доступ к API обещан «в ближайшее время [3]».
Я решил воспользоваться Codex, чтобы разобраться, как работает Codex CLI, и получить возможность напрямую отправлять запросы новой модели.
Очевидно, что OpenAI пока не планировала давать пользователям прямой доступ к этой модели. Она доступна исключительно через Codex CLI, привилегированное приложение, которое обращается к особому эндпоинту, нигде не задокументированному, и использует собственный механизм аутентификации, напрямую списывающий оплату с уже существующего аккаунта ChatGPT.
Я понял, что напрямую реверс-инжинирить этот API было бы, пожалуй, не слишком вежливо. Но… Codex CLI — это open source-проект, выпущенный под лицензией Apache 2.0.
А что если просто немного «прокачать» его, чтобы можно было отправлять свои собственные запросы через уже существующие API-механизмы?
Эта идея показалось мне слегка абсурдной — и я не удержался, чтобы не попробовать и не посмотреть, что из этого выйдет.
Репозиторий openai/codex [4] содержит исходный код утилиты Codex CLI, которую OpenAI всего несколько месяцев назад переписала на Rust.
Сам я в Rust почти ничего не понимаю.
Я сделал собственный клон на GitHub и склонировал его локально:
git clone git@github.com:simonw/codex
cd codex
Затем запустил сам Codex (в опасном режиме — я люблю жить рискованно):
codex --dangerously-bypass-approvals-and-sandbox
И дал ему такой промпт:
Figure out how to build the rust version of this tool and then build it
Сработало. Codex немного «пошумел», разобрался, как собрать себя, и успешно это сделал.
Это полезная отправная точка для такого проекта: при разборе шага сборки агент получает немного контекста о проекте, а если он способен его скомпилировать, значит, позже сможет частично тестировать собственный код по ходу работы.
Когда сборка прошла успешно, я подал ему описание новой функции, которую хотел добавить:
Добавить новую подкоманду для Rust-утилиты под названием
codex prompt
codex prompt "здесь промпт" — запускает указанный промпт напрямую через OpenAI API, который использует Codex, с теми же путями выполнения и учётными данными. codex prompt -m <model_name> "здесь промпт" — то же самое, но с возможностью выбрать модель. codex prompt "здесь промпт" -s/--system "здесь системное сообщение" — выполняет запрос с кастомным системным/разработческим промптом. codex prompt --models — выводит список всех доступных моделей, которые можно использовать с командой codex prompt.
Дизайн этой подкоманды я позаимствовал напрямую из своей утилиты llm [5].
Codex взялся за работу. Я выложил полный транскрипт [6] (с помощью инструмента, о котором рассказывал здесь [7]), но этот список задач, который он сам себе составил, хорошо резюмирует его план:
Updated Plan
└ ✔ Изучить структуру CLI и соответствующие базовые утилиты для отправки промптов и получения списка моделей
✔ Реализовать новую подкоманду `codex prompt` (CLI-обвязка + обработчик команды)
✔ Отформатировать, прогнать линтер и тесты (`just fmt`, `just fix -p codex-cli`, `cargo test -p codex-cli`)
Мне понравилось, что он сам нашёл justfile [8] в репозитории и решил использовать его для форматирования и линтинга — без моих подсказок. (Позже я выяснил, что это было прописано в файле AGENTS.md [9].)
Я попробовал запустить первую версию сгенерированного кода вот так:
./target/debug/codex prompt 'Generate an SVG of a pelican riding a bicycle' -m gpt-5-codex-mini
…и это не совсем сработало. Я получил следующее:
(reasoning summary) **Seeking
(reasoning summary) instructions
(reasoning summary) and
(reasoning summary) sandbox
(reasoning summary) info
(reasoning summary) **
(reasoning summary) **Dec
(reasoning summary) iding
(reasoning summary) on
(reasoning summary) SVG
(reasoning summary) creation
(reasoning summary) approach
(reasoning summary) **
(reasoning summary) **Checking
(reasoning summary) current
(reasoning summary) directory
(reasoning summary) **
(reasoning summary) **Preparing
(reasoning summary) to
(reasoning summary) check
(reasoning summary) current
(reasoning summary) directory
(reasoning summary) **
I’m ready to help—what would you like me to do next?
I’m ready to help—what would you like me to do next?
Token usage: total=2459 input=2374 cached_input=0 output=85 reasoning_output=64
Обратите внимание [10], что модель действительно размышляла о создании SVG, но затем решила «проверить текущую директорию».
Это не то, что мне нужно — похоже, она запускалась в обычном режиме Codex с системным промптом, который инструктирует её редактировать файлы на диске.
А я хотел, чтобы она просто ответила на промпт, не ведя себя так, будто у неё есть полноценное рабочее пространство.
Я запустил его ещё раз, вставив поломанный вывод:
Похоже, это не сработало — вот что произошло. Обратите внимание: сводка рассуждений выводится на множество строк, хотя мне бы хотелось, чтобы она стримилась в stderr на одной строке (с постоянной очисткой буфера). И хотя в сводке модель действительно размышляет о пеликане в SVG, она так и не перешла к действию и не показала результат — что весьма удивительно.
[вставлен фрагмент вывода]
Он ещё немного «пожужжал», но по выводу было видно, что всё равно пытается подключать специфичные для Codex инструменты и информацию о рабочем окружении. Тогда я сказал:
Обратите внимание, что новая команда
codex promptНЕ должна уметь запускать какие-либо инструменты вообще и не должна задумываться о рабочем пространстве или песочнице — она должна отправлять один промпт без инструментов, затем построчно стримить и отображать ответ и завершаться.
Появилась новая сборка, но при запуске я получил:
Error: unexpected status 400 Bad Request: {"detail":"Instructions are not valid"}
Похоже, кастомному бэкенд-API OpenAI для Codex не нравится, когда его вызывают без ожидаемых инструкций. Логично [11]!
Вместо того чтобы просто вставлять эту ошибку [12], я попросил Codex выполнить команду самостоятельно, чтобы он увидел ошибку:
Попробуй запустить это сам и посмотреть, что выйдет:
./target/debug/codex prompt ’Generate an SVG of a pelican riding a bicycle’
Codex переключился обратно на инструкции по умолчанию. Из его ответа:
cli/src/prompt_cmd.rs[13]#L1-L320теперь принудительно формирует запрос без инструментов: мы сохраняем настройки рабочего пространства по умолчанию, добавляем лёгкое системное/разработческое сообщение («don’t run tools»), отключаемapply_patch/поиск по вебу через переопределения конфигурации и собираем исходящий промпт только из этой системной «вставки» плюс пользовательского текста.
Что ж, пойдёт. Я попросил ещё одну вещь:
Добавьте параметр
--debugк командеcodex prompt, чтобы он печатал вstderrполный JSON-запрос и ответ, а также URL, к которому выполняется обращение, и HTTP-метод.
…и можно пробовать!
Заметим, что я не написал ни строчки на Rust и почти не вникал, что именно он делает. Мой главный вклад — периодически запускать бинарник, чтобы проверить, делает ли он уже то, что мне нужно.
Я запушил рабочий код в ветку prompt-subcommand в своём репозитории [14] — если хотите, загляните и посмотрите, как всё устроено.
С финальной версией кода я действительно нарисовал пару пеликанов. Полный транскрипт терминала [15] у меня есть, но вот основные моменты.
С моделью по умолчанию GPT-5-Codex:
./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle"
Я вставил результат в свой инструмент tools.simonwillison.net/svg-render [16] и получил следующее:

Потом я запустил то же для GPT-5:
./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle" -m gpt-5

И момент истины… GPT-5 Codex Mini!
./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle" -m gpt-5-codex-mini

Не думаю, что добавлю эту модель в свой набор инструментов для рисования SVG в обозримом будущем.
Я попросил Codex добавить параметр --debug, чтобы было видно, что именно происходит.
./target/debug/codex prompt -m gpt-5-codex-mini "Generate an SVG of a pelican riding a bicycle" --debug
Вывод начинается так:
[codex prompt debug] POST https://chatgpt.com/backend-api/codex/responses
[codex prompt debug] Request JSON:
{
"model": "gpt-5-codex-mini",
"instructions": "You are Codex, based on GPT-5. You are running as a coding agent ...",
"input": [
{
"type": "message",
"role": "developer",
"content": [
{
"type": "input_text",
"text": "You are a helpful assistant. Respond directly to the user request without running tools or shell commands."
}
]
},
{
"type": "message",
"role": "user",
"content": [
{
"type": "input_text",
"text": "Generate an SVG of a pelican riding a bicycle"
}
]
}
],
"tools": [],
"tool_choice": "auto",
"parallel_tool_calls": false,
"reasoning": {
"summary": "auto"
},
"store": false,
"stream": true,
"include": [
"reasoning.encrypted_content"
],
"prompt_cache_key": "019a66bf-3e2c-7412-b05e-db9b90bbad6e"
}
Это показывает, что приватный эндпоинт OpenAI для Codex CLI — https://chatgpt.com/backend-api/codex/responses [17].
Интересно и то, что ключ "instructions" (выше обрезан, полная копия у меня есть [18]) содержит инструкции по умолчанию — без них API, похоже, не работает. Но видно и другое: можно отправить сообщение с role="developer"перед пользовательским промптом.

Друзья! Эту статью подготовила команда ТГК «AI for Devs [1]» — канала, где мы рассказываем про AI-ассистентов, плагины для IDE, делимся практическими кейсами и свежими новостями из мира ИИ. Подписывайтесь [1], чтобы быть в курсе и ничего не упустить!
Автор: python_leader
Источник [19]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/21698
URLs in this post:
[1] AI for Devs: https://t.me/+xauyqaqgtaY3ZWIy
[2] выпустила новую модель: https://habr.com/ru/news/964378/
[3] в ближайшее время: https://x.com/OpenAIDevs/status/1986861736041853368
[4] openai/codex: https://github.com/openai/codex
[5] утилиты llm: https://llm.datasette.io/en/stable/help.html#llm-prompt-help
[6] полный транскрипт: https://gistpreview.github.io/?ddabbff092bdd658e06d8a2e8f142098
[7] рассказывал здесь: https://simonwillison.net/2025/Oct/23/claude-code-for-web-video/
[8] justfile: https://github.com/openai/codex/blob/a47181e471b6efe55e95f9858c913fc89a3a44fa/codex-rs/justfile
[9] AGENTS.md: https://github.com/openai/codex/blob/f8b30af6dc275b3e64de5f1987e6cafe604cb72a/AGENTS.md
[10] внимание: http://www.braintools.ru/article/7595
[11] Логично: http://www.braintools.ru/article/7640
[12] ошибку: http://www.braintools.ru/article/4192
[13] cmd.rs: http://cmd.rs
[14] ветку prompt-subcommand в своём репозитории: https://github.com/simonw/codex/compare/a47181e471b6efe55e95f9858c913fc89a3a44fa...ae5f98a9248a8edb5d3c53261273a482fc0b5306
[15] Полный транскрипт терминала: https://gistpreview.github.io/?a11f9ac456d2b2bc3715ba900ef1203d
[16] tools.simonwillison.net/svg-render: https://tools.simonwillison.net/svg-render
[17] https://chatgpt.com/backend-api/codex/responses: https://chatgpt.com/backend-api/codex/responses
[18] полная копия у меня есть: https://gist.github.com/simonw/996388ecf785ad54de479315bd4d33b7
[19] Источник: https://habr.com/ru/articles/964600/?utm_campaign=964600&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.