Skip to main content

LLM backends: API key vs subscription CLI

LLM configuration is data, persisted in MongoDB and editable from the Admin UI — not baked into env. Two scopes:

  • Per agent — each agent document carries its own backend/provider/model (Agents → edit → Model & backend).
  • System-wide — the planner, summarizer, and embeddings read from the settings document (Admin UI → Settings → LLM defaults), with a default endpoint plus optional per-role overrides. The NEXUS_PLANNER_* / NEXUS_EMBED_MODEL env vars are only seed fallbacks used until the settings document is saved once.

You can mix backends freely. Two families exist:

BackendAuthUse when
openai-api, anthropic-apiAPI key (per-token billing)you have provider API keys
claude-code-cli, codex-clia subscription login persisted on a volumeyou pay a monthly Claude/Codex plan and want to use it instead of API billing

Both are first-class and always available; pick per agent.

How CLI (subscription) backends work

The claude and codex CLIs are baked into the agent base image. They are not logged in at build time — credentials are supplied at runtime from a small PersistentVolumeClaim that you populate once with an interactive login:

  • CLAUDE_CONFIG_DIR=/creds/claude
  • CODEX_HOME=/creds/codex

The creds PVC is mounted (read-write) into every agent run pod, so each run reuses the same subscription login. No API key is needed for CLI agents.

One-time login (agent runs)

A long-lived nexus-agent-login pod mounts the same creds volume. Log in through it:

# Open an interactive shell in the login pod
kubectl -n nexus-agents exec -it deploy/nexus-agent-login -- bash

# Claude Code (subscription / Max plan): launch it and run the /login command
claude
# › /login → pick "Subscription", approve in your browser

# OpenAI Codex
codex login

Both print a URL + device code; open it in your browser and approve. Codex's OAuth uses a localhost callback — if it doesn't complete inside the pod, port-forward it during login:

kubectl -n nexus-agents port-forward deploy/nexus-agent-login 1455:1455

Credentials land on the PVC (/creds) and persist across pod restarts and image upgrades. To re-auth, just run the login command again.

Enable/disable and size the volume via Helm values:

agentCreds:
enabled: true # set false to run purely on API keys
pvcName: nexus-agent-creds
storageClass: microk8s-hostpath
size: 1Gi

The planner / summarizer

The control-plane worker also makes a few LLM calls (goal → task decomposition, HISTORY compaction). Configure these in Settings → LLM defaults (the default endpoint, or the Planner / Summarizer overrides). The worker.plannerBackend Helm value is just the seed fallback before anything is saved:

worker:
plannerBackend: openai-api # seed only; Admin UI Settings takes over once saved
  • For an API backend, the worker uses OPENAI_API_KEY / ANTHROPIC_API_KEY from its secret.
  • For a CLI backend, the worker image includes the CLIs (WITH_CLI=1) and needs its own creds volume — PVCs are namespace-scoped, so this is separate from the agent creds. Enable it and log in once:
plannerCreds:
enabled: true
pvcName: nexus-planner-creds
storageClass: microk8s-hostpath
size: 1Gi
kubectl -n nexus exec -it deploy/nexus-planner-login -- bash
# then: `claude` → /login, and/or `codex login`

If neither an API key nor a CLI backend is available, the planner and compaction loops simply idle (the rest of the system keeps running).

Running fully on subscriptions (no API key)

  1. Set agents' backend to claude-code-cli or codex-cli in the Admin UI.
  2. agentCreds.enabled: true, then log in via nexus-agent-login.
  3. In Settings → LLM defaults, set the default (or Planner/Summarizer overrides) to a CLI backend, plannerCreds.enabled: true, then log in via nexus-planner-login.