Model Catalog
Ethos ships a remote model catalog so new models become available without upgrading the CLI. The catalog is a static JSON file published alongside the documentation site.
Published URL
https://ethos-agent.ai/api/model-catalog.json
JSON Schema
interface ModelCatalogManifest {
version: number; // Always 1
updatedAt: string; // ISO-8601 timestamp
providers: {
[providerId: string]: {
models: Array<{
id: string; // Model identifier (e.g. "claude-sonnet-4-6")
label: string; // Display label for the picker
contextWindow: number; // Max context in tokens
default?: boolean; // Default model for this provider
}>;
};
};
}
The catalog ships exactly three provider keys: anthropic, openai-compat, azure.
Three-level Fallback
The CLI resolves models in order:
- Remote — fetches the published URL (8s timeout)
- Cache —
~/.ethos/cache/model-catalog.json(24h TTL by default) - Bundled — the snapshot compiled into the CLI binary
A fresh install with no internet still works (bundled fallback). Network failures are silent — one log line at warn level.
Configuration
In ~/.ethos/config.yaml:
modelCatalog.enabled: true
modelCatalog.url: https://ethos-agent.ai/api/model-catalog.json
modelCatalog.ttlHours: 24
modelCatalog.providers.anthropic.url: https://internal.example.com/anthropic.json
| Key | Default | Description |
|---|---|---|
modelCatalog.enabled | true | Set to false to disable remote fetch entirely |
modelCatalog.url | Official URL | Override the catalog URL |
modelCatalog.ttlHours | 24 | Cache time-to-live in hours |
modelCatalog.providers.<id>.url | — | Per-provider URL override |
Adding a New Model
- Edit
packages/wiring/src/model-catalog.ts— add the entry toMODEL_CATALOG - Open a PR to
main - On merge, CI runs
pnpm build:model-catalog, Docusaurus deploys, and the JSON is live - Existing CLIs pick it up within 24 hours (or on next cache expiry)
Private Catalog for Operators
Organizations can host their own catalog JSON at an internal URL:
modelCatalog.url: https://internal.corp.example.com/model-catalog.json
The JSON must conform to the same schema. Per-provider overrides let you mix sources:
modelCatalog.providers.anthropic.url: https://internal.corp.example.com/anthropic-only.json
Cache Location
~/.ethos/cache/model-catalog.json — managed via the Storage abstraction. Delete it to force a re-fetch on next CLI start.
Source
packages/wiring/src/model-catalog.ts— the in-memoryMODEL_CATALOGconst that ships bundled with the CLI.packages/wiring/scripts/build-model-catalog.ts— build script that emits the published JSON from that const.