Skip to content

Codex/OpenAI CLI Example ​

Use the official @openai/codex npm package to call OpenAI/Codex-like models in OpenSandbox.

Start OpenSandbox server [local] ​

Pre-pull the code-interpreter image (includes Node.js):

shell
docker pull sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/code-interpreter:v1.1.0

# use docker hub
# docker pull opensandbox/code-interpreter:v1.1.0

Start the local OpenSandbox server, logs will be visible in the terminal:

shell
uv pip install opensandbox-server
opensandbox-server init-config ~/.sandbox.toml --example docker
opensandbox-server

Create and Access the Codex Sandbox ​

shell
# Install OpenSandbox package
uv pip install opensandbox

# Run the example (requires SANDBOX_DOMAIN / SANDBOX_API_KEY / OPENAI_API_KEY)
uv run python examples/codex-cli/main.py

The script installs the Codex CLI (npm install -g @openai/codex@latest) at runtime (Node.js is already in the code-interpreter image), then executes a simple request codex exec "Compute 1+1 and return JSON with keys result and reasoning." --skip-git-repo-check. Auth is passed via OPENAI_API_KEY; you can override endpoint/model with OPENAI_BASE_URL / OPENAI_MODEL.

Multi-Turn Sessions: Resume a Previous Run ​

Each codex exec run is a session. For pipelines that need a follow-up turn (review → fix, plan → implement), resume the session instead of starting over with a fresh context.

Turn 1 — run with --json and capture the session id. --json turns stdout into a JSON Lines (JSONL) event stream; the first event, thread.started, carries the thread_id, which is the session id that codex exec resume accepts:

shell
codex exec --json "Remember this for later: my favorite sandbox number is 42." --skip-git-repo-check
json
{"type": "thread.started", "thread_id": "0199a213-81c0-7800-8aa1-bbab2a035a53"}

Turn 2 — resume that session with a follow-up prompt; the model recalls the context of the previous turns, so the reply is 42:

shell
codex exec resume "0199a213-81c0-7800-8aa1-bbab2a035a53" "What is my favorite sandbox number? Reply with just the number." --skip-git-repo-check

TIP

codex exec resume --last "..." continues the most recent session from the current working directory — convenient for quick two-stage pipelines. The example script captures the explicit id instead, which stays correct when several sessions interleave.

If you only need the final message for a downstream step, -o <path> / --output-last-message <path> writes it to a file, and --output-schema <file> validates the final response against a JSON Schema.

Sandbox and Approval Modes ​

Codex applies its own sandbox policy to model-generated shell commands; these flags control it inside the OpenSandbox container:

  • --sandbox workspace-write (or -s workspace-write) lets model-generated commands write inside the workspace — the usual choice for autonomous runs.
  • --sandbox read-only keeps the run strictly read-only.
  • -a never / --ask-for-approval never never pauses for human approval, so a non-interactive run cannot block on a person.
  • --dangerously-bypass-approvals-and-sandbox (alias --yolo) runs every command without approvals or sandboxing. The Codex CLI documents it as safe only "inside an externally hardened environment" — in OpenSandbox terms, that means a sandbox running a hardened runtime (gVisor, Kata), not the default runc; see Secure Container Runtimes.

WARNING

--full-auto is deprecated — prefer --sandbox workspace-write; Codex prints a warning when the old flag is used.

Environment Variables ​

VariableDefaultDescription
SANDBOX_DOMAINlocalhost:8080Sandbox service address
SANDBOX_API_KEY(optional for local)API key if your server requires authentication
SANDBOX_IMAGEsandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/code-interpreter:v1.1.0Sandbox image to use
OPENAI_API_KEY(required)Your OpenAI API key
OPENAI_BASE_URLhttps://api.openai.com/v1OpenAI API endpoint
OPENAI_MODELgpt-4o-miniModel to use

References ​

Released under the Apache 2.0 License.