cc-switch
Generate ~/.claude/settings.json from saved provider/model configs —
a small CLI that mirrors the credstore pattern.
Non-secret provider shape lives in ~/.claude/cc-switch.json. API
keys are never stored there — the config keeps the key's name,
and the value is read from credstore at activate time and injected into
the current process environment as ANTHROPIC_AUTH_TOKEN. The
generated settings.json contains no credential line.
Install
cc-switch is a standalone PyPI package — installed independently of slife (installing slife does not bring cc-switch, and vice versa). Both depend on credstore, which is pulled in automatically.
uv tool install cc-switch
# or, in this repo:
uv sync
Commands
cc-switch set <provider-name>
Create or edit a provider. Prompts for:
- Base URL (required)
- API key name — the credstore key holding the secret (required)
- Supported models (optional; comma, space, or semicolon separated)
If the provider already exists this edits it; otherwise it adds it. The models prompt toggles against the provider's current list: a model you type that is already listed is removed, one that isn't is added (symmetric difference). Typing the same list again undoes the change.
cc-switch set deepseek
# Base URL [..]: https://api.deepseek.com/anthropic
# API key name (credstore key): DEEPSEEK_API_KEY
# Supported models (comma separated; toggles against the current list): deepseek-chat,deepseek-reasoner
No secret value is ever asked for or written — store it first with:
credstore set DEEPSEEK_API_KEY
cc-switch activate <provider-name/model-name>
Writes ~/.claude/settings.json with stock Claude Code defaults, and
injects the API key from credstore into the system environment as
ANTHROPIC_AUTH_TOKEN (mirroring credstore inject — registry on
Windows, shell profile on Unix), so a freshly launched Claude Code
session inherits it. The settings file contains no credential.
If the provider's API key is not in credstore, activate fails loudly
with a credstore set <key> hint instead of writing an unusable setup.
cc-switch activate deepseek/deepseek-chat
If the model is omitted and the provider has exactly one model, it is used; if several, you are prompted to pick one.
cc-switch activate <provider-name/model-name> --custom
Like activate, but lets you override every model slot first —
ANTHROPIC_DEFAULT_HAIKU_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL,
ANTHROPIC_DEFAULT_OPUS_MODEL, ANTHROPIC_CLAUDE_CODE_SUBAGENT_MODEL,
ANTHROPIC_MODEL, ANTHROPIC_CLAUDE_CODE_EFFORT_LEVEL — one at a time.
Enter a value to override, or Enter to keep the default. Overrides are
one-shot: they never touch the stored provider config.
cc-switch
With no command, lists every configured provider/model pair, one per line:
deepseek/deepseek-chat
deepseek/deepseek-reasoner
scnet/scnet-1m
cc-switch list
Shows provider metadata (base URL, API key name, models) — one block per provider.
cc-switch remove <provider-name>
Deletes a provider config. Does not touch credstore or settings.json.
Files
| Path | Purpose |
|---|---|
~/.claude/cc-switch.json |
Provider/model shapes (no secrets) |
~/.claude/settings.json |
Generated by activate |
credstore (DEEPSEEK_API_KEY, …) |
The actual API key values |
CC_SWITCH_FILE overrides the config path; the settings path can be
overridden for tests.
Security notes
- The config file holds only metadata — the API key is referenced by name.
activatereads the secret from credstore and injects it into the system environment asANTHROPIC_AUTH_TOKEN(registry on Windows / shell profile on Unix), mirroringcredstore inject; it is never written to settings.json.- On a TTY,
activateprints an activation hint without echoing the secret; when stdout is piped it emits the shell export line foreval. - Restart your shell (or start a new terminal) after activating for the env change to take effect in the current session.
- Secrets are immutable Python
str— cc-switch follows credstore's practice ofdel-ing the reference immediately after use.
Metadata
Release files for cc-switch 0.9.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cc_switch-0.9.8.tar.gz | 21.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cc_switch-0.9.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.4 kB
Release files / cc_switch-0.9.8.tar.gz
| Download URL | cc_switch-0.9.8.tar.gz |
|---|---|
| Size | 21.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f90b68e306accb4f3d1d7463a6408edda5e5a4b11176075bde6ffa21e93db333
|
|
BLAKE2b-256 checksum How to use checksums |
33243659c32ac4c2b97e1471d9da7feea43f6fc3b6b4885c225de7479fdee918
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / cc_switch-0.9.8-py3-none-any.whl
| Download URL | cc_switch-0.9.8-py3-none-any.whl |
|---|---|
| Size | 13.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eb108f45301a1399c0d8664bf9202e340422c8c330e0608e413814aa9ab238f1
|
|
BLAKE2b-256 checksum How to use checksums |
6509e9bc66936d13bf6a6c0e15a40ff10000666e587da9bd8fdc219f1fb81f09
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|