per-session models: every session owns its model + thinking level from birth
The reported bug (2026-09-28): every chat ran glm-5.3-flash regardless of any pick, while composer and settings UIs agreed with each other and lied about the run. Root cause: a fossil default-settings record (settings.json chat section, frozen pre-slots-wave) was stamped verbatim into every new chat at birth by the new-session flow, and resolveConversationSpec prefers the per-chat record over the strong slot forever. Owner redesign — models are per session, always; the strong slot is the new-session default: - POST /api/chats stamps the newborn verbatim from the strong slot (model + thinking level); no client settings PUT on create anymore - the composer control is dual-bound: in-session it reads/writes the session's own record (GET /api/chats/:id, PUT .../settings); on the draft surfaces it binds the strong slot (picking there = changing the default) - thinking levels follow the identical mechanics (confirmed by owner) - the zombie default-settings system dies whole: useDefaultSettings, /api/settings/defaults, src/store/default-settings.ts, the chat section of UserSettings (sanitizer strips fossil copies), the legacy default-settings.json fold, and DEFAULT_SETTINGS_FILE - catalogDefaultsFor collapses to the strong slot alone - thinking display for a legacy unstamped session resolves exactly like the engine (session ?? strong ?? model ladder) Tests: new chat-birth-stamp suite pins the stamp, the unconfigured boot, the unset level, and the copy-not-live-view regression; defaults pins rewritten strong-only; legacy-migration suite deleted.
This commit is contained in:
@@ -24,7 +24,6 @@ describe("resolveSettings", () => {
|
||||
it("null record (first boot): non-model knobs land on factory defaults; every model view is EMPTY", () => {
|
||||
const eff = resolveSettings(null);
|
||||
assert.deepEqual(eff.general, { autoUpdate: true });
|
||||
assert.deepEqual(eff.chat, {}); // BYOK: no default model, ever
|
||||
assert.deepEqual(eff.agent.tools, {});
|
||||
assert.deepEqual(eff.agent.prompts, {});
|
||||
assert.deepEqual(eff.agent.search, {});
|
||||
@@ -51,7 +50,6 @@ describe("resolveSettings", () => {
|
||||
const record: UserSettings = {
|
||||
version: 1,
|
||||
general: { autoUpdate: false },
|
||||
chat: { thinkingLevel: "high" },
|
||||
agent: {
|
||||
models: { researcher: { model: { provider: "openrouter", id: "qwen/qwen3.8-flash" } } },
|
||||
tools: { research: false },
|
||||
@@ -63,7 +61,6 @@ describe("resolveSettings", () => {
|
||||
};
|
||||
const eff = resolveSettings(record);
|
||||
assert.equal(eff.general.autoUpdate, false);
|
||||
assert.deepEqual(eff.chat, { thinkingLevel: "high" });
|
||||
assert.deepEqual(eff.agent.models.researcher, {
|
||||
provider: "openrouter",
|
||||
id: "qwen/qwen3.8-flash",
|
||||
|
||||
Reference in New Issue
Block a user