LLM · embedding · VLMAsk Metnos with a request like this example:
“Show me where I can change the model and reasoning budget for the
wise tier.”
Metnos guides you to the administration page in the web chat:
Settings > System > Models. If you ask from
Telegram, the Tutor can explain the path, but the page opens in the web chat.
Its internal address is /admin/virt, and it requires administrator
access.
The runtime does not bind its components to a model name. Each component asks for a logical role; the effective configuration maps that role to a provider, model, endpoint, and related parameters. The Models page shows this mapping and lets an administrator change it without changing the code of the components that use it.
/admin/virt.The page opens in viewing mode. Reload configuration reads the file and renders the current state again; it does not save changes or restart models. Page edits are separate between LLM and VLM; embedding remains view-only and is never rewritten from the UI.
This is administrative configuration for the Metnos instance run by that system account. It is not a personal preference of an individual conversation user.
A consumer states what it needs, not which product or model must satisfy the
request. Resolution goes through three public entry points in
runtime/virt:
| Family | Roles | Interface | Result |
|---|---|---|---|
| language model | fast.micro, fast.procedural, fast.fidelity, middle, wise, creative, frontier |
virt.get_llm(role, level=...) |
a language-model provider resolved by the tier router |
| embedding | text, image |
virt.get_embedder(role) |
a provider that produces vectors for the requested modality |
| vision-language | default |
virt.get_vlm(role) |
the effective VLM specification, not an already loaded model |
The LLM tier names express the caller's intent. They do not by themselves
certify the quality of the concrete model: the administrator decides which
provider and model satisfy each role. A partial LLM file overrides only the
roles it contains; omitted fast, middle, and wise bindings use
their initial values. Fast levels inherit the fast binding and may
be overridden in [fast.level.micro],
[fast.level.procedural], or [fast.level.fidelity].
When creative is absent, its physical binding is mapped to
wise while retaining the creative policy.
frontier is optional, and callers that request it must handle its
possible unavailability.
from virt import get_embedder, get_llm, get_vlm
text_encoder = get_embedder("text")
planner = get_llm("wise")
translator = get_llm("fast", level="fidelity")
vision_spec = get_vlm("default")
Virtualization therefore separates two decisions: the component selects a role; the instance configuration selects the backend. Changing a binding among providers already supported by the runtime does not require changes to executors or the planner. Adding a provider type unknown to the runtime still requires an implementation.
For each family, the page presents:
think,
temperature, and reasoning_budget when present;Generation-policy values are the tier's effective values, resolved from the configuration file and initial values. Operations select a tier and do not keep a second decoding profile. Output ceilings, deadlines, grammars, and tool schemas remain operation-level structural constraints.
Passwords, tokens, keys, credentials, and sensitive URL parts are not shown. They are also excluded from fields submitted by the form. Secrets already present in the document are preserved during a save, but they are managed through the protected credential flow or the service environment, not from this page.
Reading the page neither instantiates providers nor loads models: it builds a bounded, secret-free projection of the resolved configuration.
For LLM and VLM, after you press Edit, Metnos exposes only visible scalar values whose type it can preserve. Sensitive fields and values that cannot be edited remain read-only. On save, the runtime:
0600 permissions;An invalid configuration does not replace the previous file. After a valid save, no reinstall, recompilation, or server restart is required: subsequent calls resolve the new values. A turn already in progress finishes with the resources it has already acquired.
Restore defaults operates on LLM or VLM and asks for confirmation. It writes the initial values supplied by the installed Metnos version. It does not automatically select an old personal configuration or reconstruct choices made during an earlier installation.
Before restoring, Metnos retains a private copy of the current file when the
file exists. Copies made by saves and restores are stored below
$METNOS_USER_STATE/virt-config-history/<family>/; with default
paths, the root is ~/.local/state/metnos/virt-config-history/. The
page does not expose a historical-version picker: recovering one specific copy
is a separate administration operation.
The page always shows the effective path, which is more reliable than a path remembered from another installation. Unless overridden, the documents belong to the system account that runs Metnos.
| Family | File-resolution order |
|---|---|
| LLM | METNOS_LLM_TIERS_CONFIG; then
$METNOS_USER_CONFIG/llm_tiers.toml when it exists; finally the
legacy <install_root>/workspace/.config/llm_tiers.toml |
| embedding | METNOS_EMBEDDING_TIERS_CONFIG; otherwise
$METNOS_USER_CONFIG/embedding_tiers.toml |
| VLM | METNOS_VLM_TIERS_CONFIG; otherwise
$METNOS_USER_CONFIG/vlm_tiers.toml |
$METNOS_USER_CONFIG is normally
~/.config/metnos. If a file does not exist, the runtime uses the
initial values from the installed version and the page says so. If a document
cannot be read or fails validation, the page reports an invalid state and
distinguishes any fallback values from a valid configuration.
| Family | Operational boundary |
|---|---|
| LLM | The router creates the provider declared by the tier. Supported bindings may target a local endpoint or a remote service; credentials and service availability remain separate requirements. |
| embedding | The initial values use local, in-process providers. Changing the backend is a
dedicated administrative migration, not a page control; read-only executors that declare local
computation use get_local_embedder() instead and do not acquire
network authority because of that setting. |
| VLM | get_vlm() returns the specification. Startup is separate and
lazy: ensure_vlm_up() checks /health, may attempt the
configured VLM script once per process, and returns false if the
service does not become available. The caller chooses the fallback. |
Virtualization centralizes backend selection; it does not turn a remote endpoint into a local resource, nor does it grant an executor network access, credentials, or additional capabilities by itself.
Every production call selects a logical workload. The router resolves it to
a tier and, for fast, to its level. A component may define
operation-specific requirements such as max_tokens, a timeout, or
an output grammar; it does not select a provider, model, or endpoint, and it does
not retain a second generation profile. The instance configuration is therefore
the sole owner of each tier's effective values.
| Area | Tier | Reason for the role |
|---|---|---|
| Routing and intent extraction | fast.micro | Short, structured classification. |
| Proposals, planning, and synthesis | wise | Comparing alternatives and articulated generation. |
| Normalization, checks, and procedural administration | fast.procedural | Structured transformations and judgments. |
| Translation, grounded composition, semantic verification | fast.fidelity | High-context fidelity without divergent decoding. |
| Grammar-constrained planning | fast.fidelity | Exact high-context output; the grammar remains an operation constraint. |
| Telos and divergent editorial generation | creative | Creative, comparative proposals. |
| Alignment | fast.procedural | It produces a structured estimate of fit to telos. |
| Explicit external escalation | frontier | Maximum configured capability, invoked intentionally. |
A tier may point to a local or remote service and may be changed by an administrator. Changing it changes subsequent calls in every row that uses it; the person configuring tiers must therefore assess capability, cost, privacy, and availability.
runtime/virt/__init__.py — facades and initial embedding
and VLM values;runtime/llm_router.py — LLM tiers, bindings, aliases, and
inference policy;runtime/llm_workloads.py — declarative registry mapping
each production workload to one logical tier;runtime/virt/configuration.py — effective projection,
provenance, and secret redaction;runtime/virt/config_editor.py — validated editing,
atomic writes, recovery copies, and restore behavior.For the full web-chat map, see the interface navigation guide. To understand how executable components consume these roles, continue with the executor guide or return to the Architecture guide.