Skip to content

Codex CLI

My setup in the console prints this with your own route in it. See Set up your coding tool. This page explains what it prints.

Codex is configured by a file, ~/.codex/config.toml. Add this beside whatever is already there:

# Panorama: the model here is a route name.
model = "standard"
model_provider = "panorama"
model_context_window = 200000
model_max_output_tokens = 64000
[model_providers.panorama]
name = "Panorama"
base_url = "https://panorama.your-company.internal/v1"
env_key = "PANORAMA_TOKEN"
wire_api = "responses"

Then start Codex with your token in the variable that file names:

Terminal window
export PANORAMA_TOKEN=pnt_...
codex
  • model is a route name, never a model id.
  • model_context_window and model_max_output_tokens belong to the route you chose, which is why My setup prints one block per route. If it leaves them out, your route’s model has no recorded window. Do not invent one.
  • wire_api = "responses": Codex speaks OpenAI’s Responses API and nothing else.

When your administrator has turned on web search, the block My setup prints ends with one more table:

[mcp_servers.panorama]
url = "https://panorama.your-company.internal/mcp"
bearer_token_env_var = "PANORAMA_TOKEN"

It gives Codex a web_search tool, served by Panorama, and reads the token from the same variable as the provider entry.

My setup lists only the routes whose model speaks the Responses API, and shows one route selector, not two. If the list is empty, your deployment has no such route yet. An administrator needs the bedrock-mantle model provider turned on and a route on one of its models.

A Claude route is served over the Anthropic Messages API, so Codex cannot use it. Asking for one returns a 400 that names the endpoint it is served on.

Panorama keeps no request or response body anywhere, and asks the same of the provider. Each of these is refused with a 400 that says why:

You send Why it is refused
store: true A stored response is your prompt and its answer kept on the provider’s side. store is forced to false.
previous_response_id It continues a stored response, and there are none.
background: true Background responses are stored ones.
a service_tier other than the default Requests are priced at the standard rate, so another tier would be billed wrongly.

None of this changes how Codex behaves. It resends the conversation each turn when there is no server-side storage, which is what it does anyway.

It lasts 30 days and nothing renews it. Mint a new one on My setup and update PANORAMA_TOKEN. Codex has no way to fetch a credential on demand, so a session that outlives its token needs a new shell.

This manual is licensed underCC BY 4.0. Code samples in it are part of Panorama, licensed under theGNU AGPL v3.0 only.