A space can now map the tiers fast, standard and code to connected models,
including several models served by one OpenAI-compatible router endpoint
(one credential, many model ids). A bot can ask for a tier, and a single
run_subagent call can ask for one. A tier with no model mapped falls back
to the usual model choice, so nothing breaks before tiers are set up.
- db: SpaceModelTier repo (list, find, set or clear); tier mappings are
copied into a new space like model and voice preferences; createBot
carries a tier, so duplicates keep it and spawned bots inherit it.
- contracts/api: models.tiers.list and models.tiers.set;
models.probeOpenAiCompatible can list a connected server's models by
credential id with its stored address and key; bots.update accepts
modelTier and keeps a pinned model and a tier mutually exclusive, so a
model picked on a surface that knows no tiers (mobile) is never silently
overridden. Thinking-level validation follows the tier's model. AI
consent status discloses tier models; desktop local settings allow the
tier procedures.
- adapters: selectConfiguredModel runs a mapped tier ahead of the pinned
model and the space default; the executor resolves bot tiers for runs
and model lookups, and helper tiers through resolveModelTier.
run_subagent takes model_tier; an explicit model wins over it.
- web: a collapsed Tiers section in model settings (shown once a model is
connected) and mapped tiers as choices in the bot Model select.
- docs: tiers in self-host model setup.
- tests: resolution order and fallbacks (selection, executor, Pi helper),
repo, API and contract units, authorization and offline Pi Postgres
suites, and a model-tiers web E2E spec.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
Non-owner shared-space members could read the space memory provider id
and internal endpoint origin via aiConsent/status, bypassing the owner-only
policy that draft PR #46 applies to memory/providerConfig.
Owners still see full provider disclosure; members get a generic Space
memory recipient when a provider is configured, without loading settings.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>