Everything in server.yaml that is not one machine's own is now a versioned document in the store (cluster_settings), the same on every control plane. The first start against a store imports the file's cluster keys, with the baseline guard policy when there is none; after that those keys in a file are ignored, with a warning. Each control plane polls the document's version and its own server.yaml's hash. A change is validated and applied: guard live (Gate.Replace), anything else by a graceful restart that systemd brings back, standbys first and the leader 30s later. A version that does not load on a machine is not applied; at start the newest one that loads is used, so a bad edit cannot keep every control plane down. llmgw ctl config show/get/set/unset/edit/history/rollback, the admin API under /api/v1/settings, and the console's Settings screen, which layers the store's document over the machine's file, write it. Commands beside the control plane that read cluster keys (init, node add, server add, backup, upgrade) read the layered configuration; init --bundle writes offline to the store once it holds the settings. A standby that becomes the leader re-reads models, engine choices and facility holds from the store. Retires appendGuardIfMissing: the import does it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
245 lines
14 KiB
JSON
245 lines
14 KiB
JSON
{
|
|
"mirror.title": "Mirror",
|
|
"mirror.heading": "Model mirror",
|
|
"mirror.did_not_answer": "did not answer",
|
|
"mirror.tabs_aria": "Mirror",
|
|
"mirror.tab.held": "Held",
|
|
"mirror.tab.unreachable": "unreachable",
|
|
"mirror.tab.downloading": "%s · %s downloading",
|
|
"mirror.tab.failed": "%s failed",
|
|
"mirror.tab.explore": "Explore Hugging Face",
|
|
"mirror.tab.fetch": "Fetch by URL",
|
|
"mirror.unreachable": "Nothing was read from the mirror, so this page is not a list of what it holds — it is not currently reachable at <code>%s</code>. Check that <code>llmgw-mirror</code> is running there and that its management port is reachable from this machine.",
|
|
|
|
"mirror.col.model": "Model",
|
|
"mirror.col.files": "Files",
|
|
"mirror.col.size": "Size",
|
|
"mirror.col.runs": "Runs",
|
|
"mirror.group.models.one": "%d model · %s",
|
|
"mirror.group.models.other": "%d models · %s",
|
|
"mirror.state.fetching": "downloading",
|
|
"mirror.state.failed": "failed",
|
|
"mirror.group.in_use": "in use",
|
|
"mirror.adapter_title": "a LoRA adapter for %s models: attach it on a model's card",
|
|
"mirror.adapter": "LoRA adapter",
|
|
"mirror.file_sha": "%s · sha256 %s",
|
|
"mirror.files.one": "%d file",
|
|
"mirror.files.other": "%d files",
|
|
"mirror.percent_of": "%d%% of %s",
|
|
"mirror.so_far": "%s so far",
|
|
"mirror.use.as": "as %s",
|
|
"mirror.use.yaml_title": "set in the cluster's settings (llmgw ctl config)",
|
|
"mirror.use.yaml": "%s · yaml",
|
|
"mirror.mode.always": "always on",
|
|
"mirror.mode.ondemand": "on demand",
|
|
"mirror.mode.stopped": "stopped",
|
|
"mirror.use.mode_aria": "How %s runs",
|
|
"mirror.use.set": "<button type=\"submit\" class=\"link\">set</button>",
|
|
"mirror.use.runs_title": "replicas ready / wanted",
|
|
"mirror.use.runs_title_starting": "replicas ready / wanted, + starting",
|
|
"mirror.use.parked": "parked",
|
|
"mirror.use.none_running": "none running",
|
|
"mirror.use.no_room": "no room",
|
|
"mirror.not_served": "not served",
|
|
"mirror.retry": "retry",
|
|
"mirror.copy_address": "copy address",
|
|
"mirror.close": "close",
|
|
"mirror.serve": "serve",
|
|
"mirror.remove_confirm": "Remove %s/%s and every file in it?",
|
|
"mirror.remove_confirm_in_use": "Remove %s/%s and every file in it? It is in use by the catalog.",
|
|
"mirror.remove": "remove",
|
|
"mirror.copy_note": "“copy address” gives what a catalog entry's <code>source</code> should say — the file, or for a version of several files the directory, with its trailing slash. It is rendered rather than assembled by hand because the mirror and the catalog have to spell a file the same way, which is also how this page knows which models use it.",
|
|
"mirror.address_prompt": "Address",
|
|
"mirror.empty": "The mirror is reachable and holds nothing yet. <a href=\"/admin/mirror?tab=fetch\">fetch one by URL</a>.",
|
|
"mirror.empty_explore": "The mirror is reachable and holds nothing yet. <a href=\"/admin/mirror?tab=explore\">Explore Hugging Face</a> for a model, or <a href=\"/admin/mirror?tab=fetch\">fetch one by URL</a>.",
|
|
|
|
"explore.views_aria": "Which models",
|
|
"explore.view.trending": "Trending",
|
|
"explore.view.new": "New this month",
|
|
"explore.view.downloads": "Most downloaded",
|
|
"explore.view.adapters": "LoRA adapters",
|
|
"explore.adapters_for": "LoRA adapters made for <code>%s</code> ·",
|
|
"explore.all_adapters": "all adapters",
|
|
"explore.adapters_any": "LoRA adapters for any model. From a held model's card, <em>find adapters</em> lists those made for it.",
|
|
"explore.adapters_note": "An adapter runs on the model it was made for, and only as a GGUF adapter file; open one to see which of its files are.",
|
|
"explore.task_aria": "Task",
|
|
"explore.task.chat": "Chat",
|
|
"explore.task.embed": "Embeddings",
|
|
"explore.task.any": "Any task",
|
|
"explore.size_aria": "Size",
|
|
"explore.size.any": "Any size",
|
|
"explore.search_placeholder": "Search Hugging Face — qwen coder, gemma, bge…",
|
|
"explore.search_aria": "Search Hugging Face",
|
|
"explore.only_here": "only what these nodes can run",
|
|
"explore.search": "Search",
|
|
"explore.registry_err": "The registry: %s",
|
|
"explore.col.repo": "Repository",
|
|
"explore.col.size": "Size",
|
|
"explore.col.arch": "Architecture",
|
|
"explore.col.context": "Context",
|
|
"explore.col.downloads": "Downloads",
|
|
"explore.col.likes": "Likes",
|
|
"explore.col.updated": "Updated",
|
|
"explore.new": "new",
|
|
"explore.gated": "gated",
|
|
"explore.from": "from %s",
|
|
"explore.age.now": "just now",
|
|
"explore.age.h": "%dh",
|
|
"explore.age.d": "%dd",
|
|
"explore.age.w": "%dw",
|
|
"explore.age.mo": "%dmo",
|
|
"explore.js.loading": "Loading…",
|
|
"explore.js.load_failed": "Could not load it:",
|
|
"explore.js.starting": "Starting…",
|
|
"explore.js.refused": "refused",
|
|
"explore.js.follow": "follow it under Held",
|
|
"explore.js.started": "Started",
|
|
"explore.js.unreachable": "Could not reach the gateway:",
|
|
"explore.hidden.one": "%d more is hidden: their architecture is one the nodes' llama.cpp cannot load.",
|
|
"explore.hidden.other": "%d more are hidden: their architecture is one the nodes' llama.cpp cannot load.",
|
|
"explore.untick": "Untick “only what these nodes can run” to see them.",
|
|
"explore.gated_note": "A gated repository needs its terms accepted with a Hugging Face account, and this browses anonymously — the files will list, and fetching one will fail at the mirror. Download it by hand and put it in the mirror directory, or give the mirror a token.",
|
|
"explore.empty.query_hidden.one": "Nothing matched “%[2]s” that these nodes can run — %[1]d result was hidden for an architecture llama.cpp cannot load.",
|
|
"explore.empty.query_hidden.other": "Nothing matched “%[2]s” that these nodes can run — %[1]d results were hidden for an architecture llama.cpp cannot load.",
|
|
"explore.empty.query": "Nothing matched “%s”.",
|
|
"explore.empty.hidden.one": "Nothing to list that these nodes can run — %d result was hidden for an architecture llama.cpp cannot load.",
|
|
"explore.empty.hidden.other": "Nothing to list that these nodes can run — %d results were hidden for an architecture llama.cpp cannot load.",
|
|
"explore.empty.nothing": "Nothing to list.",
|
|
|
|
"mirror.fetch.intro": "By hand, for anything the search does not reach.",
|
|
"mirror.fetch.source": "Source URL",
|
|
"mirror.fetch.source_example": "https://huggingface.co/…/resolve/main/model.gguf",
|
|
"mirror.fetch.model": "Model",
|
|
"mirror.fetch.model_example": "qwen2.5-coder-7b",
|
|
"mirror.fetch.version": "Version",
|
|
"mirror.fetch.file": "File",
|
|
"mirror.fetch.file_hint": "taken from the URL",
|
|
"mirror.fetch.force": "Fetch anyway",
|
|
"mirror.fetch.force_hint": "even if the nodes' llama.cpp cannot load it",
|
|
"mirror.fetch.start": "Start download",
|
|
"mirror.fetch.note": "The mirror answers as soon as the download is under way, not when it finishes — a model is tens of gigabytes and nothing here holds a connection open for that. The Held tab shows it arriving. A version is never overwritten: fetching into one that exists is refused, so a new build is a new version and the old weights stay where they are.",
|
|
|
|
"card.back": "← back to the list",
|
|
"card.at": "at %s",
|
|
"card.at_code": "at <code>%s</code>",
|
|
"card.from": "from",
|
|
"card.license": "license %s",
|
|
"card.on_registry": "on Hugging Face ↗",
|
|
"card.model_card": "Model card",
|
|
"card.col.what": "What",
|
|
"card.col.size": "Size",
|
|
"card.col.checksum": "Published checksum",
|
|
"card.shards": "%d shards, fetched together",
|
|
"card.companions": "with %d files the engine reads beside them",
|
|
"card.adapter_title": "a LoRA adapter: it runs on a %s model it was made for, not on its own",
|
|
"card.adapter": "LoRA adapter · %s",
|
|
"card.model_arch": "model · %s",
|
|
"card.model": "model",
|
|
"card.cannot_serve": "cannot be served",
|
|
"card.imatrix": "it is an importance matrix for quantising, not a model",
|
|
"card.fetch": "Fetch",
|
|
"card.weights_note": "Only the weights are listed; a repository is mostly a README and a tokenizer. A safetensors set is fetched with the files vLLM reads beside it — config.json, the tokenizer, the shard index — and never with code. Shards of one file are one row and one button — a fifteen-shard model is one decision, not fifteen. Two separate files are two rows because they are usually alternatives: one quantisation or the other, not both.",
|
|
"card.pinned_note": "The source URLs are pinned to <code>%s</code> rather than to a branch, so what arrives is what is listed here even if the branch moves in between — and a single file's checksum above is what the registry publishes, to compare with what the mirror computes once it has it.",
|
|
"card.no_weights": "No weight files in %s.",
|
|
|
|
"mirror.detail.not_in_catalog": "Not in the catalog: nothing runs this version.",
|
|
"mirror.detail.use_serve": "Use <strong>serve</strong> on its row to put it into service.",
|
|
"mirror.detail.ready": "%d of %d ready",
|
|
"mirror.detail.in_all": "%d in all",
|
|
"mirror.detail.does_not_fit": "does not fit",
|
|
"mirror.replica.col.replica": "Replica",
|
|
"mirror.replica.col.node": "Node",
|
|
"mirror.replica.col.state": "State",
|
|
"mirror.replica.col.age": "Age",
|
|
"mirror.replica.col.memory": "Memory",
|
|
"mirror.replica.placing": "placing",
|
|
"mirror.replica.starting": "starting",
|
|
"mirror.replica.ready": "ready",
|
|
"mirror.replica.draining": "draining",
|
|
"mirror.replica.stopped": "stopped",
|
|
"mirror.replica.failed": "failed",
|
|
"mirror.replica.unknown": "unknown",
|
|
"mirror.replica.restart": "restart %s",
|
|
"mirror.restart.queued": "queued",
|
|
"mirror.restart.replacing": "replacing",
|
|
"mirror.restart.in_place": "in place",
|
|
"mirror.replica.cores": "%s cores",
|
|
"mirror.detail.none_running": "No replica runs now.",
|
|
"mirror.detail.none_running_ondemand": "No replica runs now: it starts when somebody asks for it.",
|
|
"mirror.room.at_least": "Room for at least %d more replicas.",
|
|
"mirror.room.more_on": "Room for %d more now, on %s.",
|
|
"mirror.room.more": "Room for %d more now.",
|
|
"mirror.room.none": "No free room for another replica now.",
|
|
"mirror.room.and_preempting": "And %d more by stopping replicas its class outranks: %s.",
|
|
"mirror.room.preempting": "%d by stopping replicas its class outranks: %s.",
|
|
"mirror.room.why_not_more": "Why not more",
|
|
"mirror.room.why_not_another": "Why not another",
|
|
"mirror.adapters.heading": "LoRA adapters",
|
|
"mirror.adapters.find": "find adapters on Hugging Face →",
|
|
"mirror.adapters.asked_as": "Asked for as",
|
|
"mirror.adapters.file": "File",
|
|
"mirror.adapters.scale": "Scale",
|
|
"mirror.adapters.none": "None. A request for an adapter's name is served by this model's replicas with it applied.",
|
|
"mirror.adapters.adapter_file": "Adapter file",
|
|
"mirror.adapters.attach": "Attach",
|
|
"mirror.adapters.no_choice": "No held adapter file for this model's architecture. Fetch one from Hugging Face first.",
|
|
"mirror.detail.declared": "Set in the cluster's settings: change its replicas there, with llmgw ctl config edit.",
|
|
"mirror.form.min": "Always running",
|
|
"mirror.form.max": "Up to, under load",
|
|
"mirror.form.class": "Class",
|
|
"mirror.class.default": "default (%s)",
|
|
"mirror.class.critical": "critical",
|
|
"mirror.class.standard": "standard",
|
|
"mirror.class.opportunistic": "opportunistic",
|
|
"mirror.form.owner": "Owner",
|
|
"mirror.form.shared": "shared",
|
|
"mirror.form.memory": "Memory GB",
|
|
"mirror.form.per_replica": "per replica",
|
|
"mirror.form.cores": "Cores",
|
|
"mirror.form.cores_hint": "per replica, its threads",
|
|
"mirror.form.most_now": "At most %d can always run now.",
|
|
"mirror.form.most_now_preempting": "At most %d can always run now, counting what its class may stop to make room.",
|
|
"mirror.form.note": "0 always running with a higher limit loads it when asked for; 0 and 0 stops it. A replica is added under load when requests wait, and taken away after ten quiet minutes. A higher class may stop replicas of lower ones to make room; memory and cores apply to replicas started after the change.",
|
|
|
|
"mirror.err.source_required": "a source URL is required",
|
|
"mirror.err.not_fetched": "not fetched: %s. Tick \"fetch anyway\" to take it regardless",
|
|
"mirror.err.partly_started": "%d of %d started, then %s: %s",
|
|
"mirror.msg.started": "started downloading %s/%s (%s)",
|
|
"mirror.err.choose_mode": "choose a model and how it should run",
|
|
"mirror.msg.ondemand": "%s now loads when asked for and stops after 15 minutes unused",
|
|
"mirror.msg.stopped": "%s is stopped; its replicas are being taken down",
|
|
"mirror.msg.always": "%s now runs all the time",
|
|
"mirror.msg.removed": "removed %s/%s (%s)",
|
|
"mirror.err.which_model": "which model?",
|
|
"mirror.err.replicas_whole": "replicas are whole numbers",
|
|
"mirror.err.min_over_max": "always running (%d) cannot be more than the most under load (%d)",
|
|
"mirror.err.at_most": "at most %d replicas",
|
|
"mirror.err.declared": "%s is set in the cluster's settings; change it there (llmgw ctl config edit)",
|
|
"mirror.err.no_model": "no model %q",
|
|
"mirror.err.nothing_fits": "nothing more fits",
|
|
"mirror.err.no_room": "%s can always run at most %d now (%d running, room for %d more): %s",
|
|
"mirror.msg.room_for": "there is room for %d now, so it grows past that only if room is made",
|
|
"mirror.msg.will_stop": "to make room, replicas of %s will be stopped",
|
|
"mirror.msg.loads_up_to": "%s loads when asked for, up to %d under load",
|
|
"mirror.msg.runs_n": "%s runs %s",
|
|
"mirror.msg.runs_up_to": "%s runs %d, and up to %d under load",
|
|
"mirror.err.not_from_mirror": "no model %q runs from the mirror",
|
|
"mirror.err.memory_whole": "memory and cores are whole numbers",
|
|
"mirror.msg.reserves": "a replica reserves %d GB and %d cores (running ones keep theirs until restarted)",
|
|
"mirror.msg.is_class": "is %s",
|
|
"mirror.msg.is_shared": "is shared",
|
|
"mirror.msg.counts_against": "counts against %s",
|
|
"mirror.err.partly_set": "%s %s, but not the replicas: %s",
|
|
"mirror.msg.nothing_changed": "%s: nothing changed",
|
|
"mirror.msg.changed": "%s %s",
|
|
"mirror.err.no_adapter": "%s has no adapter %q",
|
|
"mirror.msg.adapter_removed": "%[1]s: adapter %[2]s removed; replicas drop it when restarted (llmgw ctl restart --model %[1]s)",
|
|
"mirror.err.scale": "the scale is a positive number",
|
|
"mirror.err.adapter_name_file": "an adapter needs a name and a file",
|
|
"mirror.err.adapter_unreadable": "the adapter file could not be read: %s",
|
|
"mirror.err.not_adapter": "that file is a model, not a LoRA adapter",
|
|
"mirror.err.wrong_arch": "that adapter is for %s models and %s is %s",
|
|
"mirror.msg.adapter_added": "%[1]s: adapter %[2]s added; ask for it by that name once the replicas are restarted (llmgw ctl restart --model %[1]s)",
|
|
"mirror.err.adapter_op": "add or remove an adapter"
|
|
}
|