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:
80 files changed
+587
-2575
No files matched your search
+14
-16
@@ -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)
|
||||
}
|
||||
})
|
||||
|
||||
Reference in new issue
Block a user