Providers
All detected sources are enabled by default. Toggle individual sources from page
2 Providers in the dashboard, or restrict one invocation with
--source.
jcx --source opencode,crabcode,hermes models
jcx --source copilot doctor
jcx --source ocx serve
Supported values include auto, opencode, crabcode,
ocx, hermes, copilot, antigravity,
and joocode.
OpenCode and CrabCode
Joocode reads the OpenCode provider configuration and combines it with each
client's own credential store. CrabCode reuses the same provider file but keeps a
separate auth store, so both can expose the same provider with different credentials
(crabcode/provider/model).
OpenCodex / OCX
Joocode reads the OpenCodex config directory (~/.opencodex or
$OPENCODEX_HOME) directly. Models use ocx/provider/model and
requests go through the local OCX proxy, so OCX stays authoritative for OAuth refresh,
API-key pools, routing, and account failover.
OCX OpenCode profiles
Global OpenCode profiles under $XDG_CONFIG_HOME/opencode/profiles/*/opencode.jsonc
are discovered and exposed as ocx-PROFILE/provider/model.
Hermes Agent
Joocode reads ~/.hermes/config.yaml (or $HERMES_HOME/config.yaml)
plus ~/.hermes/.env. Models become hermes/provider/model.
GitHub Copilot
Joocode checks COPILOT_GITHUB_TOKEN, GH_TOKEN, GITHUB_TOKEN,
Copilot macOS Keychain entries, Copilot's plaintext fallback, and gh auth token.
The account's live model catalog is exposed as copilot/model; exchanged tokens
remain in memory only.
Custom providers
Press n on page 2 Providers to add an OpenAI-compatible
provider. Joocode requests GET /models, saves the provider, and reloads the
catalog. The file lives at ~/.config/joocode/providers.json:
[
{
"name": "openrouter",
"base_url": "https://openrouter.ai/api/v1",
"api_key": "...",
"models": ["anthropic/claude-sonnet-4"]
}
] Override the path with JOOCODE_PROVIDERS=/custom/providers.json.
Interactive combos
Press c on page 2 Providers to open the Combo Builder and
choose Failover, Weighted round-robin, or
Lowest latency. The virtual model appears as combo/name.
{
"combos": [
{
"name": "coding",
"models": [
"crabcode/clip/claude-sonnet-4.6",
"opencode/openrouter/gpt-5.5"
]
}
]
} Joocode retries transient failures on each candidate and moves to the next model for authentication, rate-limit, capacity, timeout, or transport failures. Invalid requests do not fail over. Weighted round-robin preserves failover to other candidates:
{
"combos": [
{
"name": "balanced",
"strategy": "weighted-round-robin",
"models": [
{ "model": "crabcode/clip/claude-sonnet-4.6", "weight": 3 },
{ "model": "opencode/openrouter/gpt-5.5", "weight": 1 }
]
}
]
} Override the file with JOOCODE_COMBOS=/custom/combos.json.