
Coskey
Model switching and key management for ChatGPT.app
Switch models in ChatGPT.app / Codex.app freely and smoothly.
v0.14.3 · macOS 13+ · Windows 10+

Why Coskey
None of this should be this hard
If you have ever wrestled with this kind of configuration, Coskey exists for you.
Pain
The usual way
Coskey
Third-party model setup is complex, and only one model fits
Hand-edit ~/.codex/config.toml — fiddly and easy to get wrong
Enter the provider and key in the GUI, never touching a config file
ChatGPT.app shows only “Custom”, with no way to list several models
The model picker has no third-party entries
Third-party entries sit next to the official models, what you pick is what runs, and you can switch mid-session
Context window capped at 272K
Third-party windows are fixed at whatever default you get
Configure window sizes freely: every app model sets its own window and generation parameters, so one upstream model can be offered at several sizes
Switching providers leaves historical sessions unable to open
Start a new session and leave the historical one behind
A global default plus per-session pinning switches seamlessly across providers; existing sessions can be adopted
Three paths to get going
Plug it in, then pick it in the app
Screenshots are taken from the Coskey interface and from ChatGPT.app running for real.
Connect a provider and its models
One Base URL from an OpenAI-compatible endpoint plus one API key, stored in four steps. The key only ever goes to the system keychain.
- 1
Add a provider
Click a preset (DeepSeek, 千问, 智谱, Kimi, MiniMax) to fill in the first three fields, leaving only the API key; or type all four yourself. Saving writes the key straight to the system keychain — no config file, no logs.
- 2
The card is ready
The provider card appears immediately with a keychain check mark. You can also time the Base URL to see whether it responds and how fast.
- 3
Import models from upstream
Click “Import models…”: Coskey pulls the upstream /models list with that provider's key. Search and multi-select as you like — searching only filters the view, it never drops your selection.
- 4
Protocol detected automatically
Each model is probed for /responses: native endpoints pass through untouched, chat/completions-only endpoints go through the local translation layer (each model row can also re-probe its protocol). The models are now in the catalogue — but not yet in the picker.
Map them, size the window, pick them in the app
One row on the “Model mapping” page equals one entry in the ChatGPT.app picker: which upstream model it targets and how large its window is.
- 1
Create a mapping
Pick the target upstream model. The core name and group id decide what the entry is called in the picker; models without a mapping never show up in the app.
- 2
Add a user catalog entry
The kernel matches windows by name. “+ User catalog” creates an entry named after the id prefix, where you set both the default window and its upper bound.
- 3
Drag the window to size
Effective window = min(injected value, cap) × 95%, computed for you in the form. The id and display name gain the window suffix automatically, so the same model can appear at several sizes.
- 4
Let it take effect, then pick it
Mappings and display names apply immediately, and the ChatGPT.app picker list refreshes within about 5 minutes (restarting is faster); user catalog entries need an app restart. Your entries then appear next to the official models, and switching mid-session works too.
Set the model catalogue up once
Since 0.6.0 the model catalogue is the control room for the whole catalog system: one switch unlocks the window cap, and three tabs manage entries, the official base and catalog templates.
- 1
Turn catalog mode on
“Catalog enhancement (catalog mode)” decides whether the kernel reads the cache Coskey generates at startup: it unlocks windows past 272K, sets the prompt and request shape of third-party models, and applies the official-base overrides — with zero writes to ~/.codex.
- 2
User catalog: give a model its window
One row = one slug plus one catalog template as its base, storing only the window and capability parameters. “+ User catalog” on the mapping page is the same form, and the window section matches the entry right away.
- 3
Catalog templates: updates and versions
Common templates (DeepSeek, 千问, GLM, Kimi, MiniMax) are built in: install new ones, update, switch versions (including rolling back), or preview the prompt before installing.
After that, switching is just picking a model in the app. See the full steps in the docs.
Nothing left out
Switching, done thoroughly
Beyond the paths, these details decide whether it holds up over time.
Disable what you do not need
Official models can be kept out of the picker, and your own mappings can be paused: mapping, default and pinned references all stay, ready to re-enable.
Global default plus session pinning
Sessions you never switched follow the default model; picking another one in the picker pins only that session, leaving the others alone.
Adopt existing sessions
Sessions created before you installed Coskey are visible too, and can be adopted or handed back; uninstalling restores their original provider.
Upstream protocol adaptation
Native Responses endpoints pass through; chat/completions-only endpoints are translated locally, streaming and tool calls included.
Several providers at once
Each provider keeps its own Base URL and key, and mappings point wherever you like — switching across providers does not disturb the session.
No configuration surgery
The app is never modified and ~/.codex is never written to; one click disables Coskey and returns stock behaviour.
End-to-end health check
The app, kernel, wrapper, keychain and relay port are checked item by item, and each result comes with a verdict.
Docs
Instructions in the order you need them
Every step comes with a screenshot — install it and follow along.
Download
Download Coskey
Open the app after installing and the guide walks you through the rest.
Install, configuration and troubleshooting live inInstall and first run·FAQ
Feedback
Hit a snag? Tell us here
Found a bug or have an idea? Open an issue in the release repository — mirrored on GitHub and Gitee, pick whichever is handier.