Custom connections are gone: the CLI talks to the LLeMbas server it is logged in to

LLeMbas CLI 2.0 is LLeMbas-server-specific (CLI rule 2). Removed: the
anthropic, gemini, ollama and responses clients, context discovery and
llama-swap unloading (discover.ts), the Connection schema with its dialect,
auth, key_cmd, discover, unload_url and one_model_at_a_time, the model
`fallback` (it only ever moved to another server), effort_map and cache, and
the multi-connection refs. Kept: openai-chat, http, sse, think, effort,
tokens and all of src/lembas.

- connections.yaml holds the login (`type: webui`, as lembas login writes
  it). A custom entry from 1.x is read past with a warning that says how to
  log in, so an old file still starts; with several logins left, the latest
  is used and the others named.
- A model's ref is the id the server serves it under; the older forms
  (`<login>/<id>`, `<login>/<model>`) still resolve and config.yaml is
  rewritten once. Without a login there is no model, and the error (and the
  first-run screen, now the sign-in alone) says `lembas login <address>`.
- A login to another server signs this machine out of the previous one.
- The window is the server's word (no discovery); a capacity group comes
  from the server's `capacity.group` alone; embeddings use the server's
  /v1/embeddings.
- `lembas models` lists the server's models; install.sh's starter files, the
  README and the JSON schemas say the same.

Tests: every fixture is a login now (the fake server lists models, answers
other GETs with 404, and can hand one model to another script, as a server
with several backends); the dialect suites and the cross-connection tests are
gone with their code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HomerandClaude Opus 5.5 committed 2026-10-27 21:00:05 +00:00
1 parent f20e8c4307
commit 28ff205ed0
80 files changed
+587 -2575

No files matched your search

+14 -16
View File
@@ -25,14 +25,16 @@ test("draft-07, described, and no string held to a format ({env:} stands in for
const props = (schemas.config as any).properties
expect(props.mode.enum).toEqual(["manual", "edit", "auto", "plan"])
expect(props.small_model.description).toContain("session titles")
const kinds = (schemas.connections as any).properties.connections.additionalProperties.anyOf
expect(kinds[0].properties.type.const ?? kinds[0].properties.type.enum[0]).toBe("webui")
expect(kinds[1].properties.base_url.description).toContain("Where the API is")
// 2.0: the login is the only kind of entry.
const login = (schemas.connections as any).properties.connections.additionalProperties
expect(login.properties.type.const ?? login.properties.type.enum[0]).toBe("webui")
expect(login.properties.url.description).toContain("The instance's address")
expect(login.properties.dialect).toBeUndefined()
})
const goodConfig = `
model: local/qwen3
small_model: local/tiny
model: llama/qwen3
small_model: llama/tiny
titles: prompt
mode: edit
icons: plain
@@ -59,19 +61,14 @@ mcp:
`
const goodConnections = `
connections:
local:
dialect: openai-chat
base_url: "{env:LLM_URL}"
example:
type: webui
url: https://ai.example.org
api_key: "{file:~/.config/lembas/lembas/example.key}"
tls: { ca: ~/ca.crt }
quirks: { stream_usage: off }
models:
qwen3: { context: 131072, max_output: 65536, efforts: [low, high], effort: low, vision: true }
anthropic:
dialect: anthropic
base_url: https://api.anthropic.com
api_key: "{env:ANTHROPIC_API_KEY}"
models:
claude: { effort_map: { low: 4000, high: 32000 }, cache: true }
llama/qwen3: { context: 131072, max_output: 65536, efforts: [low, high], effort: low, vision: true }
`
test("what the loader accepts, the schema accepts", () => {
@@ -94,7 +91,8 @@ test("…and what it refuses, the schema marks", () => {
expect(Config.safeParse(bad).success).toBe(false)
expect(checkConfig(bad)).toBe(false)
}
for (const bad of [{ connections: { x: { dialect: "openai", base_url: "http://h/v1" } } }, { connections: { x: { dialect: "anthropic" } } }, { connections: { x: { dialect: "anthropic", base_url: "u", models: { m: { context: -1 } } } } }]) {
// A custom connection (1.x): the loader reads past it with a warning, and the schema marks it.
for (const bad of [{ connections: { x: { dialect: "openai-chat", base_url: "http://h/v1" } } }, { connections: { x: { type: "webui" } } }, { connections: { x: { type: "webui", url: "https://h", models: { m: { context: -1 } } } } }, { connections: { x: { type: "webui", url: "https://h", key_cmd: "pass x" } } }]) {
expect(checkConnections(bad)).toBe(false)
}
})