Files
Ilker ManapandClaude Opus 5.5 80e0dd252f Document what changed since v0.9.2, and fabrics for the sites that have them
The changelog's unreleased section had stopped at refusing unloadable
weights; it now covers the rest: telling independent fabrics apart,
their subnet managers and maps, NVLink on every build and across nodes,
the multi-node launch fixes and vLLM's new default, doctor, node load,
editors and the Responses API, the chat and mirror pages, a person's own
use, the admin pages, the new metrics, and how to upgrade.

docs/fabrics.md is new, for a site with InfiniBand or NVLink: what
llmgw does with them, what each node and fabric needs first, declaring
fabrics, checking a node with doctor, what the pages and metrics show
and which to alert on, what an engine is given, and where to look when
a replica spanning nodes will not run. It says plainly that none of it
has yet run on such hardware.

install.md, node-onboarding.md, onboarding.md, the README and the
example agent configuration no longer say the portable binary cannot
see NVLink or that a fabric's name cannot be checked, and describe the
account page and connecting an editor.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 10:14:58 +02:00

64 lines
2.1 KiB
Go

package config
import (
"os"
"path/filepath"
"testing"
)
// TestTheDocumentedAgentExampleLoads parses the file shipped in deploy/examples.
//
// It exists because the example was wrong for the entire life of the project
// and nothing noticed. The fabric struct carried no koanf tags, so the `name:`
// key the example documents bound to nothing, and an agent configured exactly
// as instructed refused to start with "fabrics[0]: name is required" — naming
// the key the operator had just written.
//
// Every fabric until then had been configured in a Go test, where the tags do
// not matter. A published example that has never been parsed is a guess.
func TestTheDocumentedAgentExampleLoads(t *testing.T) {
path := filepath.Join("..", "..", "deploy", "examples", "agent.yaml")
if _, err := os.Stat(path); err != nil {
t.Skipf("no example to check: %v", err)
}
cfg, err := LoadAgent(path)
if err != nil {
t.Fatalf("the documented example does not load: %v", err)
}
if len(cfg.Fabrics) == 0 {
t.Fatal("the example documents a fabric and none was parsed")
}
f := cfg.Fabrics[0]
if f.Fabric == "" {
t.Error("the fabric name did not bind")
}
if len(f.HCAs) == 0 {
t.Error("the fabric's adapters did not bind")
}
// The rate is not documented: the agent measures it, as the slowest of
// the fabric's active ports, and a figure written here would be ignored.
// node_id is left to the hostname, so the example need not say it; where
// the control plane is, nothing can find out.
if cfg.Server == "" {
t.Errorf("server=%q", cfg.Server)
}
}
func TestTheDocumentedServerExampleLoads(t *testing.T) {
path := filepath.Join("..", "..", "deploy", "examples", "server.yaml")
if _, err := os.Stat(path); err != nil {
t.Skipf("no example to check: %v", err)
}
cfg, err := Load(path)
if err != nil {
t.Fatalf("the documented example does not load: %v", err)
}
if err := cfg.Validate(); err != nil {
t.Fatalf("the documented example does not validate: %v", err)
}
if cfg.Listen == "" || len(cfg.Models) == 0 {
t.Errorf("listen=%q models=%d", cfg.Listen, len(cfg.Models))
}
}