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>
64 lines
2.1 KiB
Go
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))
|
|
}
|
|
}
|