Skip to main content
Settings are configuration that changes while relay runs. Each section is a typed JSON value stored as one row in Postgres. A write is validated against the section’s type, stored, and reaches every replica through Postgres LISTEN/NOTIFY, usually within about a second, with no restart. A section with no stored value reads as its defaults. Bootstrap configuration that needs a restart (ports, DSNs, the master key) is in Configuration instead.

Reading and writing

PUT replaces the whole value, and the body must carry every field the section’s schema marks required: PUT /api/settings/parsing with {} is refused with 422. Read the section first and send its value back with your change. Who may change a section. Writing needs the update verb on settings. Under RELAY_AUTHZ=single every signed-in user holds it; under rbac only the built-in admin role (or a custom role that grants it) does. Sections marked admin only below additionally require an admin (a user with the admin role, or the admin token) under either mode, because they resolve secrets, delete history, or let an identity provider create accounts. Every write is recorded in the audit log. A stored section that a later release can no longer accept (for example one naming a secret variable outside its prefix) reads as its defaults, with a warning in the log, rather than stopping relay from starting.

Seeding settings from files

At boot, relay reads kind: Setting files from RELAY_SETTINGS_DIR (default <RELAY_CONFIG_DIR>/settings, read recursively) and writes each section that has no stored value yet. A section already in the database is left alone, so a file sets the starting value and the control API stays authoritative afterwards. A file naming an unknown section, failing validation, or holding another kind stops relay at boot.
settings/proxy-mode.yaml
A field a file leaves out takes its zero value (false, 0, empty), not its default. A file may hold several ----separated documents. The Helm chart seeds payload-logging and usage-logging this way from its values (Kubernetes). relay apply and the catalog seed do not write settings.

Sections

inference

parsing

proxy-mode

See Proxy mode.

usage-logging

Admin only. The ClickHouse and Postgres connections come from RELAY_CH_DSN and RELAY_PG_DSN. See Usage.

payload-logging

Admin only. See Payload logging.

otlp-receiver

See OTLP receiver.

audit

Admin only. See Audit log.

auth:oidc

Admin only. Ignored while WYOLET_AUTH_MODE=oidc configures sign-in from the environment. See SSO.

auth:scim

Admin only. See SCIM provisioning.

auth:tokens

Only rotation changes the signing-key references. A PUT that leaves them out keeps the installed ones, and a PUT naming another secret is refused with 400. TTL changes apply to tokens minted afterwards; tokens already minted keep their exp.

catalog-source

Relay writes this section itself. See Pinning a catalog version.

license

Holds a license installed at runtime. Write it with PUT /api/license, which verifies the license first, not through /api/settings. RELAY_LICENSE_FILE and RELAY_LICENSE win over it. See License.

governance

The four sections governance:provider, governance:host, governance:model and governance:policy share one shape: They guard against accidental changes to rows the catalog owns; they are not access control. Every update and delete through the control API, the admin UI and relay apply is judged by the row’s owner:
  • System-owned rows (for example catalog providers and hosts) can be edited or deleted by an admin only, whatever the governance sections say. Teams, groups and roles are system-owned but follow the tenant rule below.
  • Tenant-owned rows (owned by a user, team or project) are always allowed; access control decides who may touch them.
  • Catalog-managed rows (owned by a provider or a host, such as catalog models and host tier policies) consult the governance section of their kind. A kind with no section, such as host-owned pricing, uses the defaults: edit allowed, delete refused. Admins are bound by these sections too.
  • A row the catalog no longer ships (detached) counts as tenant-owned.
A refused operation answers 403 with a message naming the section to change. A delete is also refused while other rows reference the row.