Codex CLI — Configuration with OmniRoute
Complete guide for using the Codex CLI pointed at OmniRoute as an OpenAI-compatible backend.
Ready-to-paste config.toml
Replace <YOUR_HOST> and <YOUR_KEY> with your values:
# ~/.codex/config.toml
model = "cx/gpt-5.5"
model_provider = "omniroute"
model_reasoning_effort = "xhigh"
model_context_window = 400000
model_auto_compact_token_limit = 350000
tool_output_token_limit = 32768 # history storage cap per tool call
[model_providers.omniroute]
name = "OmniRoute"
base_url = "http://<YOUR_HOST>:20128/v1"
env_key = "OMNIROUTE_API_KEY"
requires_openai_auth = false
wire_api = "responses"# ~/.bashrc or ~/.zshrc — actual key value, never in config.toml
export OMNIROUTE_API_KEY="<YOUR_KEY>"Common host options
Access URL Local network http://192.168.0.1:20128/v1Tailscale http://100.x.x.x:20128/v1Loopback http://localhost:20128/v1
wire_api = "responses" — why it works for all models
Codex CLI deprecated wire_api = "chat" (Chat Completions) in February 2026 and now requires wire_api = "responses" (OpenAI Responses API). Setting wire_api = "chat" causes an immediate startup crash since v0.138.
DeepSeek, GLM, Kimi and others only expose a Chat Completions endpoint — not the Responses API. If you pointed Codex directly at them, it would fail.
OmniRoute solves this transparently:
Codex CLI
→ wire_api = "responses"
→ POST /v1/responses (OmniRoute)
→ OmniRoute Responses ↔ Chat Completions transformer
→ POST /chat/completions (DeepSeek / Mistral / GLM / Kimi / any provider)You never need a separate translation proxy when using OmniRoute. All models use wire_api = "responses" — OmniRoute handles the rest.
wire_apiis the default — the field defaults to"responses"and can be omitted entirely fromconfig.toml. Only ever set it explicitly if you're documenting intent.
Context window and compaction
Token configuration fields
| Field | Description |
|---|---|
model_context_window | Total token budget for the active model. Set to the model's advertised limit. |
model_auto_compact_token_limit | Threshold that triggers automatic history compaction. Maximum: 90% of model_context_window — values above 90% are silently ignored. |
tool_output_token_limit | Cap on tokens stored per tool call output in history. Prevents a single large tool response from filling the window. This is not the max output — it is a history storage cap. |
compact_prompt | Inline override for the system prompt used during compaction (v0.138+). |
Note on
model_max_output_tokens: This field is not part of the Codex CLI config schema (absent from the Codex Rust codebase). It is silently ignored if set. Do not rely on it — usetool_output_token_limitto control how much tool output is stored in history.
Context windows by model
| Model | OmniRoute ID | Context window | auto_compact | tool_output_limit |
|---|---|---|---|---|
| GPT-5.5 | cx/gpt-5.5 | 400k reliable (1M max) | 350,000 | 32,768 |
| Kimi K2.7 (thinking) | kmc/kimi-k2.7 | 131,072 | 112,000 | 32,768 |
| Kimi K2.6 | kmc/kimi-k2.6 | 131,072 | 112,000 | 32,768 |
| GLM-5.2 / 5.2-max (thinking) | glm/glm-5.2 | 131,072 | 112,000 | 32,768 |
| MiMo V2.5 Pro (thinking) | opencode-go/mimo-v2.5-pro | 131,072 | 112,000 | 32,768 |
| Qwen 3.7 Plus (thinking) | opencode-go/qwen3.7-plus | 32,768 | 28,000 | 16,384 |
| DeepSeek V4 Pro (OllamaCloud) | ollamacloud/deepseek-v4-pro | 131,072 | 112,000 | 32,768 |
| DeepSeek V4 Pro | ds/deepseek-v4-pro | 1,000,000 | 900,000 | 65,536 |
| MiMo V2.5 | opencode-go/mimo-v2.5 | 131,072 | 112,000 | 32,768 |
| Gemma 4 31B (OllamaCloud) | ollamacloud/gemma4:31b | 32,768 | 28,000 | 16,384 |
| Nemotron 3 Super (OllamaCloud) | ollamacloud/nemotron-3-super | 32,768 | 28,000 | 16,384 |
| GPT-OSS 20B (OllamaCloud) | ollamacloud/gpt-oss:20b | 32,768 | 28,000 | 16,384 |
| DeepSeek V4 Flash (OllamaCloud) | ollamacloud/deepseek-v4-flash | 65,536 | 56,000 | 16,384 |
| Gemini 3 Flash Preview (OllamaCloud) | ollamacloud/gemini-3-flash-preview | 1,000,000 | 850,000 | 32,768 |
| GLM-5 Turbo | glm/glm-5-turbo | 131,072 | 112,000 | 16,384 |
| GLM-4.7 Flash | glm/glm-4.7-flash | 131,072 | 112,000 | 16,384 |
| Mistral Large Latest | mistral/mistral-large-latest | 262,144 | 220,000 | 16,384 |
Compaction formula:
effective_window = model_context_window - min(tool_output_token_limit, 20000). Values above 20k do not change the compaction trigger.
Rule of thumb: set
model_auto_compact_token_limitto 85–88% ofmodel_context_window. Never go above 90% — silently ignored.
Model prefix: cx/
All Codex models in OmniRoute use the cx/ prefix:
| Codex CLI name | OmniRoute model |
|---|---|
cx/gpt-5.5 | GPT-5.5 standard |
cx/gpt-5.4 | GPT-5.4 standard |
cx/gpt-5.4-mini | GPT-5.4 mini |
cx/gpt-5.1-codex-mini | GPT-5.1 Codex mini |
Other providers use their own prefix (kmc/, glm/, ds/, ollamacloud/, opencode-go/, mistral/) — the prefix matches the OmniRoute provider alias.
Reasoning Effort
Controls how much the model "thinks" before responding.
| Value | Use for |
|---|---|
none | No reasoning — direct response |
low | Trivial tasks (rename, format) |
medium | Server default when not specified |
high | Intermediate tasks (refactoring, debug) |
xhigh | Architecture, deep analysis, complex problems |
# Per invocation override
codex -c model_reasoning_effort=low "rename variable x to count"
codex -c model_reasoning_effort=xhigh "design the auth module"Profiles — named configurations per model/workflow
Profiles let you switch model + context window with a single flag. Each profile is a flat
~/.codex/<name>.config.toml that overlays on top of the base config.toml.
Naming rule (Codex CLI v0.137+): file must be
~/.codex/<name>.config.toml— noprofile-prefix. The CLI resolves-p kimi-k27→~/.codex/kimi-k27.config.toml. If the file is not found, the default applies silently.
codex --profile kimi-k27 "analyze 10k lines of this codebase"
codex -p glm52 "architecture review"
codex --profile deepseek-flash "rename variable" # fast, cheapEffort profiles (same model, different effort)
codex -p low # cx/gpt-5.5, effort=low
codex -p medium # cx/gpt-5.5, effort=medium
codex -p high # cx/gpt-5.5, effort=high
codex -p xhigh # cx/gpt-5.5, effort=xhigh (default)
codex -p chat # cx/gpt-5.5, no effort set (server default)Thinking models (alto pensamento) — xhigh + detailed summary
| Profile | Model | Context | Use for |
|---|---|---|---|
kimi-k27 | kmc/kimi-k2.7 | 128k | Best thinking quality (Kimi) |
glm52 | glm/glm-5.2 | 128k | GLM thinking |
glm52max | glm/glm-5.2-max | 128k | GLM thinking max |
mimo-pro | opencode-go/mimo-v2.5-pro | 128k | MiMo thinking |
qwen37plus | opencode-go/qwen3.7-plus | 32k | Qwen thinking |
Good models (bons) — high effort
| Profile | Model | Context | Use for |
|---|---|---|---|
kimi-k26 | kmc/kimi-k2.6 | 128k | General purpose (Kimi) |
deepseek-pro | ollamacloud/deepseek-v4-pro | 128k | DeepSeek Pro via OllamaCloud |
deepseek | ds/deepseek-v4-pro | 1M | DeepSeek Pro direct, huge context |
mimo | opencode-go/mimo-v2.5 | 128k | MiMo general |
Simple models (simples) — no reasoning effort
| Profile | Model | Context | Use for |
|---|---|---|---|
gemma4 | ollamacloud/gemma4:31b | 32k | Cost-effective, capable |
nemotron | ollamacloud/nemotron-3-super | 32k | NVIDIA Nemotron |
gptoss | ollamacloud/gpt-oss:20b | 32k | Open-source GPT |
Fast models — low effort
| Profile | Model | Context | Use for |
|---|---|---|---|
deepseek-flash | ollamacloud/deepseek-v4-flash | 64k | Quick tasks |
gemini-flash | ollamacloud/gemini-3-flash-preview | 1M | Very fast, huge context |
glm5turbo | glm/glm-5-turbo | 128k | GLM Turbo |
glm47flash | glm/glm-4.7-flash | 128k | GLM Flash |
mistral | mistral/mistral-large-latest | 256k | Mistral Large |
Quick decision table
| Task | Recommended profile |
|---|---|
| Rename, format, boilerplate | --profile deepseek-flash or -p low |
| Explain, light review | -p chat or -p gemini-flash |
| Debug, moderate refactor | -p medium or -p kimi-k26 |
| New feature, complex tests | -p high or -p mimo |
| Architecture, deep analysis | -p kimi-k27 or -p glm52 or -p xhigh |
| Codebase analysis (needs 1M ctx) | --profile deepseek or --profile gemini-flash |
| Maximum thinking quality | -p glm52max or -p mimo-pro |
| Cost-conscious | -p gemma4 or -p gptoss |
Generating profiles automatically with omniroute setup-codex
If you run OmniRoute on a VPS, you can auto-generate profile files from the live model catalog:
# From a VPS (uses local OmniRoute on port 20128)
omniroute setup-codex
# From any machine — point at your VPS
omniroute setup-codex --remote http://100.x.x.x:20128 --api-key sk-xxx
# Preview without writing files
omniroute setup-codex --remote http://100.x.x.x:20128 --dry-run
# Only generate GLM and Kimi profiles
omniroute setup-codex --only glm,kimi
# Write to a custom directory
omniroute setup-codex --codex-home /path/to/.codexThe command fetches /v1/models, uses tuned profiles for known models, falls back to catalog metadata for other compatible text models, and writes ~/.codex/<name>.config.toml for each. Idempotent — safe to re-run.
OmniRoute can also auto-sync these same profile files after a successful provider model discovery/import changes the live catalog. This is opt-in and off by default: toggle it from the CLI Code dashboard ("CLI profile auto-sync" → Codex), or set OMNIROUTE_AUTO_SYNC_CODEX_PROFILES=true (it also honors CLI_ALLOW_CONFIG_WRITES, on by default). When enabled it only writes separate ~/.codex/*.config.toml profile files; it never changes the active/default ~/.codex/config.toml, Codex-lb settings, auth, or provider selection.
Launching Codex with omniroute launch-codex
Health-checks your OmniRoute instance before launching Codex:
# Launch against local OmniRoute (default port 20128)
omniroute launch-codex
# Launch with a specific profile
omniroute launch-codex --profile kimi-k27
# Launch against a remote VPS
omniroute launch-codex --remote http://100.x.x.x:20128/v1 --api-key sk-xxx
# Pass extra args to codex
omniroute launch-codex --profile glm52 -- --yolo "fix this bug"New Codex CLI features (v0.138–v0.141)
| Version | Feature |
|---|---|
| v0.138 | Desktop app handoff (/app), v2 personal access tokens, --profile as the exclusive profile selector (legacy in-file [profiles] tables crash on startup) |
| v0.139 | web_search = "live" — native web search from code mode; oneOf/allOf in MCP tool schemas; codex doctor env diagnostics |
| v0.140 | /usage token view in-session; /import from Claude Code sessions; codex delete <SESSION_ID> subcommand; Amazon Bedrock auth via aws object in provider config |
| v0.141 | E2E encrypted Noise relay for remote executors; SQLite WAL fix; P-521 TLS support |
New config.toml fields (post-v0.137)
# Native web search (v0.139)
web_search = "live" # "disabled" | "cached" | "live"
# Separate developer system prompt (v0.138)
developer_instructions = "Always prefer functional style."
# Custom compaction prompt
compact_prompt = "Summarise the above as bullet points."
# Route /review to a cheaper model
review_model = "glm/glm-5-turbo"
# OpenAI service tier
service_tier = "fast" # "fast" | "flex"New [model_providers.<id>] fields
[model_providers.omniroute]
base_url = "http://100.x.x.x:20128/v1"
env_key = "OMNIROUTE_API_KEY"
requires_openai_auth = false
# Static extra headers on every request
[model_providers.omniroute.http_headers]
"X-Custom-Header" = "value"
# Headers read from env vars
[model_providers.omniroute.env_http_headers]
"X-Trace-Id" = "TRACE_ID"
# Extra URL query params (useful for Azure api-version)
[model_providers.omniroute.query_params]
"api-version" = "2024-12-01-preview"Amazon Bedrock auth (v0.140)
[model_providers.bedrock]
base_url = "https://bedrock-runtime.us-east-1.amazonaws.com"
[model_providers.bedrock.aws]
profile = "default" # ~/.aws/credentials profile
region = "us-east-1"Multiple servers
[model_providers.omniroute-main]
base_url = "http://192.168.0.1:20128/v1"
env_key = "OMNIROUTE_API_KEY"
[model_providers.omniroute-tailscale]
base_url = "http://100.x.x.x:20128/v1"
env_key = "OMNIROUTE_API_KEY"Claude Code — equivalent configuration
Codex CLI (config.toml) | Claude Code (env var) | Effect |
|---|---|---|
tool_output_token_limit = 32768 | (not directly exposed) | Per-tool history cap |
model_context_window = 400000 | (determined by the model) | Context window |
| — | CLAUDE_CODE_MAX_OUTPUT_TOKENS=65536 | Max tokens per response |
# ~/.bashrc — Claude Code token cap
export CLAUDE_CODE_MAX_OUTPUT_TOKENS=65536Quick reference — CLI flags
| Flag | Short | Effect |
|---|---|---|
--model <id> | -m | Overrides model for this invocation |
--profile <name> | -p | Loads ~/.codex/<name>.config.toml |
--config key=value | -c | Overrides any config.toml field (repeatable) |
--enable <feature> | — | Force-enables a feature flag |
--disable <feature> | — | Force-disables a feature flag |
--search | — | Enable live web search for this invocation |
New in v0.140:
codex delete <SESSION_ID> # delete a session
codex delete <SESSION_ID> --force # skip confirmation
codex debug models --bundled # list bundled model catalog as JSONInside an interactive session:
| Command | Effect |
|---|---|
/model | Opens the model picker |
/usage | Shows token usage for this session (v0.140) |
/app | Hands off to the desktop app (v0.138) |
/import | Import a Claude Code session (v0.140) |
/help | Lists all slash commands |
Troubleshooting
Error: wire_api = "chat" is no longer supported
Remove wire_api = "chat" from your config. Set wire_api = "responses" or omit the field (defaults to "responses" since v0.138).
Error: model not found
Verify the model exists in OmniRoute with the correct prefix. Use omniroute models list or open /dashboard/providers/<provider>.
Authentication error
Confirm OMNIROUTE_API_KEY is exported: echo $OMNIROUTE_API_KEY.
Connection refused
Verify OmniRoute is running and the base_url host/port is correct for your network (local vs Tailscale vs VPS).
Session crashes near context limit
Set model_context_window and model_auto_compact_token_limit explicitly. See the context window table above.
Compaction fires too late
Lower model_auto_compact_token_limit to 80–85% of the window. Never set above 90%.
Profile not loading (-p <name> silently ignored)
Confirm the file exists at ~/.codex/<name>.config.toml (no profile- prefix). Run ls ~/.codex/*.config.toml.