So I’ve been switching between using the CLI1 for coding and the Codex Mac app for everything else. I’m a Codex guy myself, but if you use Claude I will not judge, nor make any load bearing puns. For now.
Anyways, since the great unification of July 2026, I’ve found the Codex app to be a jumbled mess of threads and chats and projects and whatnot, to the point where I’m using chatgpt.com just to be able to focus on a thread. I am definitely not using it for coding, although it happily displays any and all threads I’ve started across a myriad of projects, making them…challenging to follow and understand.
Also, I like to switch to using OpenAI models deployed in Azure every now and then when tokens are low or when working on something private-er. And, to do this with Codex app you need to set a key in its config.toml, restart it, lose the “official openai” threads you had, get new “local” ones, etc. Annoying. In the CLI it’s just codex -c model_provider="azure" :/.
At the same time, I had access to JetBrains’ attempt at maintaining an edge in the dev tooling space, Air. Something lighter, more colorful, where copy/paste mostly works as God intended, where I can scroll back upwards on previous threads with no fear, something sane (as compared to the CLI).
Plus, it supports custom agents via ACP, sooooo I used this to set up a separate Codex Azure agent for my Azure deployments. And..it works. It’s quite pleasant. Some things are annoying2, but not enough to stop using it. Here’s how I did it.
Set up
This is all done using the Add custom agents feature by the way, so start off by choosing it right after choosing a New Task. It will open up an acp.json file that you can edit, stored under ~/Library/Application Support/JetBrains/Air.
Now, this all assumes you’ve gone ahead and added an azure configuration for Codex, as mentioned in my previous post. Note that Air will need access to the API key environment variable from your env_key setting.
The easy way (which I don’t recommend), is putting in something like:
{
"agent_servers": {
"Codex Custom": {
"command": "npx",
"args": [
"-y",
"@agentclientprotocol/codex-acp"
],
"env": {
"MODEL_PROVIDER": "azure"
}
}
}
}
The reason I don’t like this, is that I’ve become very wary of supply chain security issues and try to avoid very hard getting the latest and greatest version of anything, until someone has the chance to look at it and make sure it’s not compromised. npx -y @agentclientprotocol/codex-acp will happily run the latest version so that’s a no no for me.
Now, one could do something like this of course, and pin the codex-acp version. But this will not guarantee immutable dependencies :/
{
"agent_servers": {
"Codex Azure": {
"command": "npx",
"args": [
"--yes",
"@agentclientprotocol/codex-acp@2.2.2"
],
"env": {
"MODEL_PROVIDER": "azure"
}
}
}
}
So, just because I like to make things hard for myself, I saved the entire package on my disk, in a dedicated directory.
mkdir -p ~/.local/share/codex-acp
cd ~/.local/share/codex-acp
npm init -y
npm install --save-exact @agentclientprotocol/codex-acp@2.2.2
So now I run something like this.
{
"agent_servers": {
"Codex Azure": {
"command": "/Users/<YOU>/.local/share/codex-acp/node_modules/.bin/codex-acp",
"args": [],
"env": {
"MODEL_PROVIDER": "azure"
}
}
}
}
And it works, I now have access to the Codex Azure set up right from the Air UI.

Notes
- The default model and its reasoning effort are set via
~/.codex/config.toml. While you can change the model, I haven’t found a way to change the effort. I wasn’t even sure of what value Air was using for effort when using custom agents (the effort selector is missing for them at this time), but a quick look at the day’s sessions under~/.codex/sessions/confirmed this.
model = "gpt-6-sol"
model_reasoning_effort = "xhigh"
- Air will list supported models even if you haven’t deployed them in Azure. For any model you pick, its Azure deployment name needs to match the Codex model ID (for example,
gpt-6-solfor “6 Sol”).