Helpers on another model, chosen by logic rather than by the model

A helper still runs on the chat's own model by default. Other models are
designated per main model -- offered to it, or by hand only -- by the
instance or, with helpers.designate, by a person. subagent_run gains a
model argument whose enum is exactly the candidates that passed two
checks: capacity (a model that serves one request at a time cannot be
its own helper; a connection that holds one model at a time cannot serve
a helper on another of its models) and the model rules. A helper on
another model takes that model's own effort and data group. The composer
gains a Helpers picker; the model page, the connection form and Settings
gain their switches and lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-29 17:37:53 +00:00
co-authored by Claude Opus 5.5
parent c27fe47d4d
commit 216e3a20d1
24 changed files with 1385 additions and 48 deletions
+6
View File
@@ -324,6 +324,12 @@ def build_client():
owner = db.query(User).first()
db.add(Note(owner_id=owner.id, title="A note at home", body="x", data_group_id="default"))
db.add(Note(owner_id=owner.id, title="A hosted note", body="x", data_group_id="hosted"))
# A rule and a designation, so the rules page, the matrix and the
# model page's Helpers card render with something in them.
from lembas.db.models import HelperDesignation, TalkRule
db.add(TalkRule(from_model="gemma4-moe", to_model="qwen3-coder", effect="deny"))
db.add(HelperDesignation(main_model="gemma4-moe", helper_model="qwen3-coder"))
local = db.query(Connection).filter_by(name="local").first()
db.add(
Chat(