/install takes a reader from three bare Ubuntu machines to a first answer: what each machine needs and the commands that check it, the release fetched and its checksum checked, the eight setup screens, the system's state and the console, and a first request with a key from the account page. Every screen is from an install of v0.14.9 on three fresh VMs, recorded with tmux and kept as terminal frames: the page shows them as text, and plays a session back when asked, fetching it compressed from /install/cast/. The administrator's password and the API key were masked before the recording was kept, and a test fails if either shape reaches the page. /about gains what llmgw now does beyond routing, and its install steps are today's: the setup screens and node add, not onboard-node.sh and a model file, with a link into the guide. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
136 lines
13 KiB
JSON
136 lines
13 KiB
JSON
{
|
|
"about.meta.description": "llmgw serves models on your own GPUs behind one OpenAI-compatible API.",
|
|
"about.home_label": "llmgw home",
|
|
"about.nav.label": "Sections",
|
|
"about.nav.what": "What it does",
|
|
"about.nav.fabrics": "Fabrics",
|
|
"about.nav.install": "Install",
|
|
"about.nav.proxy": "Reverse proxy",
|
|
"about.nav.download": "Download",
|
|
"about.nav.source": "Source",
|
|
"about.nav.gateway": "This gateway",
|
|
"about.hero.eyebrow": "Self-hosted LLM gateway · %s",
|
|
"about.hero.title": "One endpoint in front of <em>your own GPUs</em>.",
|
|
"about.hero.lede": "llmgw runs vLLM, SGLang and llama.cpp across your servers and serves them behind one OpenAI-compatible API. It knows which GPUs share an NVLink domain or an InfiniBand fabric, and a model split across machines never straddles two.",
|
|
"about.hero.download": "Download",
|
|
"about.hero.guide": "Install guide",
|
|
"about.hero.oneline_label": "Set up a control plane",
|
|
"about.copy": "Copy",
|
|
"about.copied": "Copied",
|
|
"about.selected": "Selected",
|
|
"about.schem.title": "Clients reach one llmgw address. llmgw places a model's shards on GPUs inside one fabric at a time.",
|
|
"about.schem.editor": "editor agent",
|
|
"about.schem.caption": "A replica spanning nodes goes into one NVLink domain if one has room, otherwise onto one InfiniBand fabric. Two fabrics that cannot see each other are never bridged: the all-reduce would hang.",
|
|
"about.what.title": "What it does",
|
|
"about.what.intro": "One static binary. It runs as the control plane, as the agent on every GPU node, and as the weights mirror.",
|
|
"about.what.api.title": "OpenAI API, your hardware",
|
|
"about.what.api.text": "Point any OpenAI client at it. Only the base URL changes. Streaming, tool calls, <code>/v1/models</code> and <code>/v1/responses</code> work as your client expects.",
|
|
"about.what.placement.title": "Placement that knows the fabric",
|
|
"about.what.placement.text": "Agents report GPU class, memory, NVLink peers and InfiniBand ports. Replicas go where they fit, including ones larger than one machine, on the GPUs with the most NVLink pairs.",
|
|
"about.what.ondemand.title": "Models load when asked for",
|
|
"about.what.ondemand.text": "Keep more models in the catalog than your GPUs hold. The first request starts one, the chat page shows it loading, and it stops again after the idle timeout.",
|
|
"about.what.keys.title": "Keys, budgets, rate limits",
|
|
"about.what.keys.text": "Organisations, teams and projects, each with limits. Priority bands decide who waits when the cluster is full. Managers see their organisation's spend; people see their own.",
|
|
"about.what.editors.title": "Editors connect from the account page",
|
|
"about.what.editors.text": "Continue, Codex or Cline from the account page: a key, and the configuration filled in or a one-line command that writes it. Claude Code and OpenCode work with the same key, over the Anthropic and OpenAI APIs.",
|
|
"about.what.chat.title": "A chat page for quick questions",
|
|
"about.what.chat.text": "Markdown and maths rendered, stop mid-reply, tokens per second and time to first token, a system prompt and a temperature. The gateway keeps no conversations.",
|
|
"about.what.mirror.title": "A mirror you browse",
|
|
"about.what.mirror.text": "Explore what is trending on Hugging Face, read a model card under its row, and download once for the whole cluster. Only what your nodes can run is shown by default.",
|
|
"about.what.engines.title": "Nodes install their own engines",
|
|
"about.what.engines.text": "llama.cpp on every node; vLLM on every GPU node that can run it, from PyPI with every file hash-checked. A node that cannot run it says why.",
|
|
"about.what.upgrades.title": "Upgrades that keep models running",
|
|
"about.what.upgrades.text": "Upgrade the control plane, then the agents. A restarted agent adopts the engines it was running instead of reloading them, so replicas stay up throughout.",
|
|
"about.what.dashboard.title": "A dashboard with nothing to set up",
|
|
"about.what.dashboard.text": "<code>/admin</code> shows capacity per GPU class, CPU and memory per node, who is using what, each node's page and logs. It fits a phone. Prometheus is optional.",
|
|
"about.fabrics.title": "InfiniBand and NVLink, several of each",
|
|
"about.fabrics.intro": "A site may have independent InfiniBand fabrics, eight-GPU HGX boards and NVL72 racks side by side. llmgw tells them apart by what the adapters report, not by what a config file calls them.",
|
|
"about.fabrics.guide": "Fabrics and NVLink guide",
|
|
"about.fabrics.order_label": "Where a replica spanning nodes is placed, in order",
|
|
"about.fabrics.nvlink.title": "One NVLink domain",
|
|
"about.fabrics.nvlink.text": "NVL72 or NVLink Switch. Every card joined, IMEX up. Shards get <code>NCCL_MNNVL_ENABLE=1</code>.",
|
|
"about.fabrics.ib.title": "One InfiniBand or RoCE fabric",
|
|
"about.fabrics.ib.text": "Nodes under one leaf first, nodes with a degraded cable last.",
|
|
"about.fabrics.never.title": "Never across two",
|
|
"about.fabrics.never.text": "Two fabrics given one name are placed as two, and the cluster page says so.",
|
|
"about.fabrics.doctor": "Check a node in one command",
|
|
"about.fabrics.doctor_label": "Example output of llmgw doctor",
|
|
"about.fabrics.sm.title": "Subnet managers, watched",
|
|
"about.fabrics.sm.text": "Master, priority, standbys and failovers per fabric. A fabric with no standby is flagged. llmgw does not run one.",
|
|
"about.fabrics.map.title": "A map of each fabric",
|
|
"about.fabrics.map.text": "<code>/admin/fabrics</code> draws switches in tiers, cables coloured by rate, degraded ones in red, and live traffic on your adapters.",
|
|
"about.fabrics.racks.title": "NVLink domains as racks",
|
|
"about.fabrics.racks.text": "<code>/admin/nvlink</code> shows which trays are joined, whose IMEX is down, which link runs degraded.",
|
|
"about.fabrics.ports.title": "Ports re-read every heartbeat",
|
|
"about.fabrics.ports.text": "A port that goes down takes its fabric off the node within seconds. Counters and rates are exported to Prometheus.",
|
|
"about.install.title": "From nothing to a first request",
|
|
"about.install.intro": "Three machines for high availability, or one. Ubuntu, Debian or RHEL 10; llmgw installs its engines, Python and CUDA itself.",
|
|
"about.install.guide": "<a href=\"%s\">The install guide</a> shows every step on the screens of a real install, recorded.",
|
|
"about.install.binary.title": "Put the binary on every machine",
|
|
"about.install.binary.text": "Static, no dependencies, the same file everywhere.",
|
|
"about.install.server.title": "Run the setup screens",
|
|
"about.install.server.text": "With nothing installed, <code>sudo llmgw</code> opens the setup: one machine or three, what to install, the other machines' logins. It checks every machine first, shows the plan, and installs. From a script, <code>llmgw server init</code> does the same.",
|
|
"about.install.node.title": "Add GPU nodes",
|
|
"about.install.node.text": "From the control plane, over SSH. The node gets llmgw, is checked by <code>llmgw doctor</code>, receives its certificate and starts its agent; it installs its engines by itself.",
|
|
"about.install.node.output_label": "Example output of llmgw ctl nodes",
|
|
"about.install.model.title": "Add a model and send a request",
|
|
"about.install.model.text": "From <code>/admin/mirror</code>, what your nodes can run, downloaded once for the cluster; or by name. If it does not place, <code>llmgw ctl explain-placement</code> says why.",
|
|
"about.proxy.title": "Behind a reverse proxy",
|
|
"about.proxy.intro": "Port 8080 is plain HTTP. Put it behind Caddy or nginx with a public certificate. Only 8080 goes through the proxy: agents reach 7443 directly, because it is mutual TLS with the cluster's own authority.",
|
|
"about.proxy.loopback": "Bind llmgw to loopback when the proxy is on the same machine: <code>listen: \"127.0.0.1:8080\"</code>.",
|
|
"about.proxy.caddy": "Obtains and renews its own certificate. Replace <code>llm.example.com</code>.",
|
|
"about.proxy.nginx": "Certificate from <code>certbot --nginx</code>. Works on nginx 1.18 and later.",
|
|
"about.proxy.stream.title": "Streams are not buffered",
|
|
"about.proxy.stream.text": "Tokens reach the client as they are generated, not in one burst at the end.",
|
|
"about.proxy.timeout.title": "The read timeout outlasts the model",
|
|
"about.proxy.timeout.text": "nginx's 60-second default turns a slow first token into a 504.",
|
|
"about.proxy.headers.title": "Forwarded headers are set, not passed on",
|
|
"about.proxy.headers.text": "llmgw marks session cookies Secure from <code>X-Forwarded-Proto</code> and shows <code>X-Forwarded-Host</code> as the base URL.",
|
|
"about.proxy.body.title": "Body limit matches the router",
|
|
"about.proxy.body.text": "32 MiB, so an oversized request is refused before it is uploaded.",
|
|
"about.download.title": "Download",
|
|
"about.download.intro": "Built by CI from the tag and checked against <code>checksums.txt</code>. Every release is on the <a href=\"https://gitea.mynodes.xyz/ilker/llmgw/releases\">releases page</a> with its changelog.",
|
|
"about.download.released": "Released %s",
|
|
"about.download.col.for": "For",
|
|
"about.download.col.file": "File",
|
|
"about.download.col.notes": "Notes",
|
|
"about.download.static_any": "Static. Runs on any libc.",
|
|
"about.download.static": "Static.",
|
|
"about.download.nvml": "Sees NVLink topology through NVML. For PCIe boxes with NVLink bridges. Needs the driver.",
|
|
"about.download.mac_arm": "macOS Apple silicon",
|
|
"about.download.mac_note": "For <code>llmgw ctl</code> and trying it on a laptop.",
|
|
"about.download.proxy_note": "Reverse proxy for port 8080.",
|
|
"about.download.checksums": "Checksums",
|
|
"about.download.checksums_note": "SHA-256 of every file above.",
|
|
"about.download.dev": "This is a development build (%s). Take a release from the <a href=\"https://gitea.mynodes.xyz/ilker/llmgw/releases\">releases page</a>, where every file is listed with its checksum.",
|
|
"about.status.title": "Where it stands",
|
|
"about.status.intro": "Pre-1.0: configuration formats may change between minor versions. This is what has run on real hardware, and what has not yet.",
|
|
"about.status.proven": "Run on real clusters",
|
|
"about.status.proven.single": "Single-node replicas on real GPUs and on CPU",
|
|
"about.status.proven.ondemand": "On-demand loading and idle shutdown",
|
|
"about.status.proven.keys": "Keys, budgets, rate limits and priority bands",
|
|
"about.status.proven.upgrades": "Rolling upgrades with no dropped replicas",
|
|
"about.status.proven.stores": "SQLite and PostgreSQL stores",
|
|
"about.status.proven.chat": "Chat, editor setup and the Responses API against a six-node test cluster",
|
|
"about.status.open": "Not yet proven",
|
|
"about.status.open.fabrics": "InfiniBand and NVLink on a real site: written and tested against the real output of <code>sminfo</code>, <code>ibnetdiscover</code> and <code>nvidia-smi</code>, but not yet run on the hardware. Run <code>llmgw doctor --json</code> on a few nodes first.",
|
|
"about.status.open.planes": "Two control planes over long periods",
|
|
"about.status.open.weights": "The model mirror on one machine: the last single point in a high-availability install",
|
|
"about.footer.changelog": "Changelog",
|
|
"about.footer.reference": "Configuration reference",
|
|
"about.what.knowledge.title": "Answers from your documents",
|
|
"about.what.knowledge.text": "People add PDF, Office and mail from their own machines with <code>llmgw-kb</code>; only text and vectors are sent. Each organisation, team and project sees only its own collections, down to the database row.",
|
|
"about.what.guard.title": "Guardrails on every request",
|
|
"about.what.guard.text": "Personal data, secrets, prompt injection and deny patterns, with a judge model on CPUs. Policies observe or enforce, per organisation, team or project; an answer nobody could check is refused.",
|
|
"about.what.signin.title": "Sign-in your company already has",
|
|
"about.what.signin.text": "Entra ID, Active Directory or any OIDC provider; users and groups by SCIM; staff roles, and an audit log of every change.",
|
|
"about.what.ha.title": "High availability from the first install",
|
|
"about.what.ha.text": "Three machines: each can run the gateway, PostgreSQL under Patroni keeps the store on two, etcd votes on all three. Setup builds it; losing any one machine loses nothing.",
|
|
"about.what.media.title": "Pictures and 3D models too",
|
|
"about.what.media.text": "ComfyUI on the same cards: pictures and meshes as jobs, queued, followed and returned as files, each carrying the licence it was made under.",
|
|
"about.install.cta": "Every step, with its screens",
|
|
"about.status.proven.ha": "Three-machine high availability built by the setup screens; a lost store primary cost no requests",
|
|
"about.status.proven.signin": "Sign-in with Active Directory, tried against a Samba domain controller, and with OIDC",
|
|
"about.status.proven.kb": "Knowledge bases of over 100,000 passages, answered from with their sources"
|
|
}
|