Официальные Codex SDK дают программный интерфейс для запуска задач из TypeScript/JavaScript и Python. Они нужны там, где shell-команды codex exec уже недостаточно: когда надо держать thread, продолжать разговор через несколько ходов и встраивать финальный результат в сервис. Если exec - это агент как звено конвейера, то SDK - это агент как встроенная библиотека, которой управляет ваш код: он создаёт поток, ведёт его и потребляет результат программно.
Ключевые понятия SDK - thread и turn. Thread - это разговор, который живёт между вызовами; turn - один ход внутри него. Такая модель нужна именно для многошаговой работы: вы запускаете задачу, получаете результат, продолжаете тот же thread следующим запросом, сохраняя контекст. Разовый exec этого не даёт - он завершается и забывает; SDK, наоборот, позволяет построить сервис, где агент ведёт связную работу через несколько обращений, как настоящий диалог.
Полезно один раз увидеть TypeScript-интеграцию целиком. Ниже - установка пакета и минимальный код: создать клиента, стартовать thread, выполнить run с запросом на исследование репозитория без правок. Результат приходит в код как значение, которое можно разобрать и использовать дальше. Это и есть смысл SDK: агент встроен в ваш процесс, и вы работаете с его выводом как с обычным результатом асинхронного вызова, а не парсите текст из stdout.
Python-интеграция устроена симметрично, но с явной моделью sandbox. Ниже - установка пакета и код через контекстный менеджер: создать клиента, стартовать thread с sandbox=Sandbox.read_only, выполнить run. Обратите внимание на read_only прямо в старте потока - это та же дисциплина границ, что и в CLI, но выраженная в коде. SDK не отменяет sandbox и permissions: они задаются программно, и задавать их узко здесь так же важно, как и в интерактивной работе.
Границы в SDK задают явно, потому что некому подтверждать на лету. Как и в exec, программный запуск неинтерактивен: sandbox, permissions и режим подтверждения определяют в коде до запуска, а не по ходу. Read-only для исследовательской задачи, узкий доступ для правящей - это выражают параметрами старта потока. Соблазн "дать SDK полный доступ, чтобы не мешал" здесь так же опасен, как отключение sandbox в CLI: программный интерфейс не снимает ответственности за границы.
Обработка результата в SDK - это код, а не чтение глазами, и в этом его сила. Финальный результат приходит как значение, которое сервис может проверить, разобрать по схеме, сохранить, передать дальше. Structured output здесь особенно уместен: сервису нужны данные заданной формы, а не свободный текст. Именно поэтому SDK выбирают, когда агента встраивают в продукт: вывод становится частью программы, с ним работают как с любым другим результатом вызова внешней системы.
Смысл SDK - превратить агента в управляемый компонент сервиса с явными границами и машинным выводом. Thread и turn дают непрерывность, sandbox и permissions - контроль, structured output - потребимый результат. Это верхний уровень той же лестницы, что начинается с интерактива и проходит через exec: от разговора к конвейеру и дальше к встроенному компоненту. И на каждой ступени действует один принцип - границы задают осознанно, а результат проверяют, а не принимают на веру.
Типичные провалы вокруг SDK предсказуемы. Взять SDK там, где хватило бы разового exec, и усложнить без нужды. Дать потоку полный доступ вместо узкого sandbox в параметрах старта. Разбирать свободный текст вместо structured output, встраивая результат в сервис. И забыть, что программный запуск неинтерактивен, понадеявшись на подтверждение по ходу. Берите SDK для многошаговой встроенной работы, задавайте sandbox и permissions в коде, используйте структурированный вывод и проверяйте результат программно.
// npm install @openai/codex-sdk
import { Codex } from "@openai/codex-sdk";
const codex = new Codex();
const thread = codex.startThread();
const result = await thread.run(
"Inspect the repository and return the three highest-risk modules. Do not edit files."
);
// result - значение для сервиса: проверить, разобрать по схеме, сохранить# pip install openai-codex
# from openai_codex import Codex, Sandbox
# with Codex() as codex:
# thread = codex.thread_start(sandbox=Sandbox.read_only)
# result = thread.run("Inspect the repository and return the highest-risk modules.")
# sandbox=read_only прямо в старте потока - границы задаются в коде, до запуска