1. Making configuration take effect
| Action | When it applies |
|---|---|
| Adding or changing providers, upstream models or mappings (including enabling/disabling) | Immediately: the next request uses the new configuration; the ChatGPT.app picker list refreshes within about 5 minutes (leaving and returning to the window is fastest), or at once after a restart |
| Adding or changing user / system catalog entries (including shown/enabled), catalog templates or the cache | After quitting and reopening ChatGPT.app (the kernel reads the catalog cache once, at startup) |
| Switching the default model in Settings | Immediately: unpinned sessions follow it on their next turn |
| The global switch in Settings | Immediately: off makes the wrapper a plain passthrough |
| The download mirror in Settings | Immediately: update manifests, provider presets and catalog templates all follow it (automatic by default) |
| Adding or editing an API key | The keychain is written on save and read by the relay after an app restart |
Download mirror (Settings): Coskey fetches update manifests, common provider presets and catalog templates from cosk.ai and the two release platforms (GitHub / Gitee). The default, “Automatic”, runs a speed test first and reuses the result for 24 hours; you can also pin GitHub or Gitee, which then goes first (cosk.ai stays as the fallback). Unsure? Hit “Speed test”: both timings are listed, along with which one automatic mode would pick.
2. Choosing and switching models
Reopen ChatGPT.app and click the model name at the bottom right of the input box: the entries you created on the “Model mapping” page are all there, next to the official models.

- New session: pick the target model; pick nothing and it follows the default;
- Changing mid-session: pins only that session, leaving others alone. The timeline gains a “model changed from X to Y” divider showing that later requests used the new model;
- Across providers: works the same way — the local relay routes each request by the model name in it, so entries pointing at different endpoints coexist.
The CLI equivalents:
coskey use qwen/glm-5.3-flash-540K # switch the global default (unpinned sessions, next turn)
coskey use qwen/glm-5.3-flash-540K --thread <id> # pin one session only
coskey unpin <id> # release the pin, follow the global default again
3. Switching mid-session: the model changes, the window does not
The context window is injected once, when a session is created (a new session, a fork, or a cold resume after restarting the app). Changing models mid-session routes replies through the new model while the window keeps its birth value. Measured on a real machine:
-
Start a session on the 640K entry (effective 608K); the input box shows “608k total”:

-
Switch to a 540K entry (effective 513K) in the same session: replies are normal, but the window is still 608k:

-
To apply the new window, fork in ChatGPT.app (“continue from chat”), clone the session, or restart the app and let it cold-resume — the continued session is 513k:

Coskey accounts for this on its side: such sessions are flagged “window pending”.
4. Common questions
| Symptom | Cause / fix |
|---|---|
| A model never shows up in the picker | The picker list is cached and refreshes within about 5 minutes (or at once after a restart); also check that the upstream model has a mapping (the “used by” column on the Providers page is not empty) |
| An upstream model shows an empty “used by” | It is in the catalogue only; add a mapping for it |
| A card says “no key” | The keychain has no key for that provider: edit the provider and enter it again (old values are not echoed) |
| Do I really have to type all four provider fields | Not for the common providers (DeepSeek, 千问, 智谱, Kimi, MiniMax): click one in the preset row and only the API key is left. “More…” pulls a fresh preset list |
| A model is marked “translated” | The upstream lacks /responses, so the local layer converts responses ⇄ chat; on that path images and files are dropped, so reasoning models are better served by native endpoints |
| The window did not change in a live session | Window overrides cannot be updated for a running session (flagged “window pending”); fork, clone or restart the app |
| Asked for 1M, got 608K | Effective window = min(injected value, catalogue cap) × 95%, which the form displays |
| The slider stops at 272K | The id matches no catalogue entry: add a user catalog entry named after its prefix, either on the Model catalogue page or via “+ User catalog” on the mapping page |
| Want a different upstream endpoint | Edit the provider’s Base URL, or change the mapping’s target — neither disturbs the provider |
| A model is not needed for now | Click “Disable” on its mapping row: it leaves the picker while the mapping and pinned references stay, ready to re-enable |
| Want to turn it all off temporarily | Turn off the global switch in Settings; the wrapper becomes a passthrough |
Next: Session management.