- BrainTools - https://www.braintools.ru -

Реверс-инжиниринг Codex CLI или как я заставил GPT-5-Codex-Mini нарисовать пеликана

Команда 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-механизмы?

Эта идея показалось мне слегка абсурдной — и я не удержался, чтобы не попробовать и не посмотреть, что из этого выйдет.

Codex CLI написан на Rust

Репозиторий 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] и получил следующее:

Реверс-инжиниринг Codex CLI или как я заставил GPT-5-Codex-Mini нарисовать пеликана - 1

Потом я запустил то же для GPT-5:

./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle" -m gpt-5
Реверс-инжиниринг Codex CLI или как я заставил GPT-5-Codex-Mini нарисовать пеликана - 2

И момент истины… GPT-5 Codex Mini!

./target/debug/codex prompt "Generate an SVG of a pelican riding a bicycle" -m gpt-5-codex-mini
Реверс-инжиниринг Codex CLI или как я заставил GPT-5-Codex-Mini нарисовать пеликана - 3

Не думаю, что добавлю эту модель в свой набор инструментов для рисования SVG в обозримом будущем.

Бонус: параметр –debug

Я попросил 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 в разработке

Реверс-инжиниринг Codex CLI или как я заставил GPT-5-Codex-Mini нарисовать пеликана - 4

Друзья! Эту статью подготовила команда ТГК «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

www.BrainTools.ru

Rambler's Top100