Files
LLeMbas-CLI/schema/connections.schema.json
T
HomerandClaude Opus 5.5 28ff205ed0 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>
2026-10-27 21:00:05 +00:00

229 lines
8.6 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"connections": {
"default": {},
"description": "The LLeMbas server this machine is logged in to, as `lembas login` writes it: its address and this machine's token. Its models come from it at every start.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "webui",
"description": "A LLeMbas instance: its models, their settings, its voice and its web search."
},
"url": {
"type": "string",
"description": "The instance's address, e.g. https://ai.example.org (no /v1)."
},
"api_key": {
"description": "This machine's token, as login wrote it: {file:~/.config/lembas/lembas/<name>.key}.",
"type": "string"
},
"tls": {
"description": "For an instance behind a private CA: `ca`, the PEM file that signed its certificate.",
"type": "object",
"properties": {
"ca": {
"type": "string"
},
"insecure": {
"type": "boolean"
}
},
"additionalProperties": false
},
"timeout": {
"description": "Seconds of silence allowed in a reply, as for any connection (default 600).",
"type": "number",
"exclusiveMinimum": 0
},
"quirks": {
"description": "Server oddities; auto is right almost always.",
"type": "object",
"properties": {
"stream_usage": {
"description": "Ask for token usage in the stream (stream_options); auto learns when a server refuses it.",
"type": "string",
"enum": [
"auto",
"on",
"off"
]
},
"prompt_progress": {
"description": "Ask how far the server is through reading the prompt (llama.cpp's return_progress), shown while it reads; auto learns when a server refuses it, and one that ignores it shows nothing.",
"type": "string",
"enum": [
"auto",
"on",
"off"
]
},
"think_tags": {
"description": "<think>…</think> in a reply is taken as reasoning; off leaves it as text.",
"type": "string",
"enum": [
"auto",
"on",
"off"
]
},
"max_tokens_field": {
"description": "OpenAI reasoning models refuse `max_tokens`; most local servers only know it.",
"type": "string",
"enum": [
"max_tokens",
"max_completion_tokens"
]
}
},
"additionalProperties": false
},
"models": {
"description": "Only to change what the instance says about a model, here: each entry goes over the instance's. Usually absent.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"name": {
"description": "A display name; the id is what is sent.",
"type": "string"
},
"family": {
"description": "Picks the prompt overlay: anthropic | gpt | gemini | local. Guessed from the id when absent.",
"type": "string"
},
"context": {
"description": "Total context window in tokens. 0 / absent = unknown: no percentage, no auto-compaction.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"max_output": {
"description": "Max tokens per reply.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"temperature": {
"description": "Sampling temperature; absent = the server's default.",
"type": "number",
"minimum": 0,
"maximum": 2
},
"top_p": {
"description": "Nucleus sampling; absent = the server's default.",
"type": "number",
"minimum": 0,
"maximum": 1
},
"efforts": {
"description": "The model's own effort vocabulary, in offering order.",
"type": "array",
"items": {
"type": "string",
"enum": [
"minimal",
"low",
"medium",
"high",
"xhigh",
"max"
]
}
},
"effort": {
"description": "Default effort; `off` sends none.",
"anyOf": [
{
"type": "string",
"enum": [
"minimal",
"low",
"medium",
"high",
"xhigh",
"max"
]
},
{
"type": "string",
"const": "off"
}
]
},
"effort_style": {
"description": "Where the effort goes in a request: top-level, in chat_template_kwargs, or both (the default: llama.cpp drops top-level).",
"type": "string",
"enum": [
"top",
"kwargs",
"both"
]
},
"vision": {
"description": "The model reads images: @image files, pasted paths and view_image.",
"type": "boolean"
},
"tools": {
"description": "false: a model without tool calls — it can only talk.",
"type": "boolean"
},
"headers": {
"description": "Extra HTTP headers for this model's requests.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"body": {
"description": "Merged into every request body for this model.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"notes": {
"description": "What this model is good at, in a line: the model in use is told which others there are, for handing work over (task) or switching.",
"type": "string",
"maxLength": 300
},
"single_session": {
"description": "The server serves one request at a time: a subagent on this same model would take its only slot and push the session's cached prompt out, so it is refused.",
"type": "boolean"
},
"group": {
"description": "Models sharing one GPU server that holds one model at a time (llama-swap), as the LLeMbas server says (capacity.group): a subagent on another model of the same group would unload this one, so it is refused.",
"type": "string"
}
},
"additionalProperties": false
}
}
},
"required": [
"type",
"url"
],
"additionalProperties": false
}
}
},
"additionalProperties": false,
"title": "LLeMbas CLI connections.yaml",
"description": "~/.config/lembas/connections.yaml: the LLeMbas server this machine is logged in to, as lembas login writes it. Global only."
}