Providers

All detected sources are enabled by default. Toggle individual sources from page 2 Providers in the dashboard, or restrict one invocation with --source.

bash
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:

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.

json
{
  "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:

json
{
  "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.