--- title: Agent Model Management summary: How to inspect, authenticate, and switch TerraFin's hosted agent models from the CLI. read_when: - You want the model-management layer TerraFin adapted from OpenClaw's provider UX - You want to use Gemini or GitHub Copilot without editing env vars by hand - You need to understand how saved model/auth state interacts with runtime env vars --- # Agent Model Management TerraFin's hosted assistant now supports a small built-in model manager through the `terrafin-agent models ...` CLI. This layer exists for the same reason it does in OpenClaw: the provider runtime is much more usable when people can inspect models, save credentials, and switch defaults without editing `.env` every time. ## Attribution The following parts of TerraFin's model-management UX were inspired by OpenClaw: - canonical `provider/model` refs - the `models list/current/use/auth ...` command shape - the GitHub Copilot device-login flow and local auth workflow The following parts are TerraFin-specific: - the saved state format in `.terrafin/agent-models.json` - runtime resolution order between env vars, saved state, and legacy OpenAI config - how the chosen model binds into TerraFin's hosted runtime, session metadata, widget, and FastAPI routes Implementation lives in TerraFin's own code: - `src/TerraFin/agent/models/management.py` (public surface: `list_provider_catalog()`, `get_provider_catalog(provider_id)` — do not reach into the private `_PROVIDER_CATALOG` dict) - `src/TerraFin/agent/models/runtime.py` - `src/TerraFin/agent/models/providers/github_copilot.py` - `src/TerraFin/agent/models/providers/google.py` - `src/TerraFin/agent/models/providers/openai.py` The old top-level paths (`agent/model_management.py`, `agent/model_runtime.py`, `agent/providers/*`) remain as compatibility shims that re-export the new locations. ## What it manages The model manager currently handles three providers: - `openai/*` - `google/*` - `github-copilot/*` It saves state to `.terrafin/agent-models.json` by default. Override that path with `TERRAFIN_AGENT_MODELS_PATH` when you want a different location. ## Resolution order When TerraFin resolves the hosted runtime model, it uses this precedence: 1. `TERRAFIN_AGENT_MODEL_REF` 2. saved CLI state from `.terrafin/agent-models.json` 3. legacy `TERRAFIN_OPENAI_MODEL` 4. built-in default `openai/gpt-4.1-mini` Provider credentials follow the same pattern: 1. provider env vars such as `OPENAI_API_KEY`, `GEMINI_API_KEY`, or `COPILOT_GITHUB_TOKEN` 2. saved CLI credentials in `.terrafin/agent-models.json` That means env vars still win when both are present. ## Common commands List providers: ```bash terrafin-agent models list ``` List providers and featured model refs: ```bash terrafin-agent models list --all ``` Show the model TerraFin would use if the hosted runtime started now: ```bash terrafin-agent models current ``` Switch the saved default model: ```bash terrafin-agent models use google/gemini-3.1-pro-preview terrafin-agent models use github-copilot/gpt-4o ``` Show provider auth status: ```bash terrafin-agent models auth status terrafin-agent models auth status --provider github-copilot ``` ## GitHub Copilot login The convenience command is: ```bash terrafin-agent models auth login-github-copilot --set-default ``` This now follows the OpenClaw-style GitHub device flow. TerraFin requests a GitHub device code, shows you the verification URL and one-time code, waits for authorization, then saves the resulting GitHub token locally for later Copilot token exchange. You can still provide the token directly in non-interactive shells: ```bash terrafin-agent models auth login-github-copilot \ --token ghu_your_token_here \ --set-default \ --yes ``` The generic provider form is also available: ```bash terrafin-agent models auth login --provider github-copilot --method device --set-default terrafin-agent models auth login --provider google terrafin-agent models auth login --provider openai ``` For GitHub Copilot, `--method auto` is the default on the generic command. That means: - with `--token`, TerraFin saves the token directly - without `--token`, TerraFin runs the device-login flow The device-login flow requires an interactive TTY. Use the token path in CI or headless scripts. TerraFin stores the GitHub login token in `.terrafin/agent-models.json`, then exchanges it server-side for a short-lived Copilot API token when runtime requests execute. The exchanged Copilot token cache remains separate in `.terrafin/credentials/github-copilot.token.json`. ## Running server note If TerraFin's FastAPI server is already running, restart it after changing the saved default model or saved credentials: ```bash cd src/TerraFin/interface python server.py restart ``` The CLI updates the saved state immediately, but a running hosted runtime keeps its provider clients and default model selection in memory until restart. ## When to still use env vars Env vars are still the right choice when: - you are deploying TerraFin in CI, Docker, or a hosted environment - secrets should come from an operator-managed secret store - you want explicit per-process overrides For local development and day-to-day switching, `terrafin-agent models ...` is usually the easier path.