



























@@ -1347,6 +1347,89 @@ describe("buildStatusMessage", () => {
13471347expect(normalizeTestText(text)).toContain("Model: google-antigravity/claude-sonnet-4-6");
13481348});
134913491350+it("warns when the session-selected model differs from the configured default", () => {
1351+const text = buildStatusMessage({
1352+agent: {
1353+model: "zhipu/glm-4.5-air",
1354+},
1355+configuredDefaultModelLabel: "zhipu/glm-4.5-air",
1356+sessionEntry: {
1357+sessionId: "pinned-session",
1358+updatedAt: 0,
1359+providerOverride: "deepseek",
1360+modelOverride: "deepseek-v4-flash",
1361+modelOverrideSource: "user",
1362+},
1363+sessionKey: "agent:main:main",
1364+sessionScope: "per-sender",
1365+queue: { mode: "collect", depth: 0 },
1366+modelAuth: "api-key",
1367+});
1368+1369+const normalized = normalizeTestText(text);
1370+expect(normalized).toContain("Configured default: zhipu/glm-4.5-air");
1371+expect(normalized).toContain("Session selected: deepseek/deepseek-v4-flash");
1372+expect(normalized).toContain("Reason: session override");
1373+expect(normalized).toContain(
1374+"This session is pinned to deepseek/deepseek-v4-flash; config primary zhipu/glm-4.5-air will apply to new/unpinned sessions.",
1375+);
1376+expect(normalized).toContain("Clear with: /model zhipu/glm-4.5-air or /reset");
1377+expect(normalized).toContain(
1378+"Docs: https://docs.openclaw.ai/concepts/models#selection-source-and-fallback-behavior",
1379+);
1380+});
1381+1382+it("does not warn when only the last runtime model differs from the configured default", () => {
1383+const text = buildStatusMessage({
1384+agent: {
1385+model: "zhipu/glm-4.5-air",
1386+},
1387+configuredDefaultModelLabel: "zhipu/glm-4.5-air",
1388+sessionEntry: {
1389+sessionId: "runtime-snapshot-only",
1390+updatedAt: 0,
1391+modelProvider: "deepseek",
1392+model: "deepseek-v4-flash",
1393+},
1394+sessionKey: "agent:main:main",
1395+sessionScope: "per-sender",
1396+queue: { mode: "collect", depth: 0 },
1397+modelAuth: "api-key",
1398+});
1399+1400+const normalized = normalizeTestText(text);
1401+expect(normalized).toContain("Model: zhipu/glm-4.5-air");
1402+expect(normalized).not.toContain("Configured default:");
1403+expect(normalized).not.toContain("Reason: session override");
1404+});
1405+1406+it("does not label auto fallback model overrides as pinned selections", () => {
1407+const text = buildStatusMessage({
1408+agent: {
1409+model: "zhipu/glm-4.5-air",
1410+},
1411+configuredDefaultModelLabel: "zhipu/glm-4.5-air",
1412+sessionEntry: {
1413+sessionId: "auto-fallback",
1414+updatedAt: 0,
1415+providerOverride: "deepseek",
1416+modelOverride: "deepseek-v4-flash",
1417+modelOverrideSource: "auto",
1418+modelOverrideFallbackOriginProvider: "zhipu",
1419+modelOverrideFallbackOriginModel: "glm-4.5-air",
1420+},
1421+sessionKey: "agent:main:main",
1422+sessionScope: "per-sender",
1423+queue: { mode: "collect", depth: 0 },
1424+modelAuth: "api-key",
1425+});
1426+1427+const normalized = normalizeTestText(text);
1428+expect(normalized).toContain("Model: deepseek/deepseek-v4-flash");
1429+expect(normalized).not.toContain("Configured default:");
1430+expect(normalized).not.toContain("Reason: session override");
1431+});
1432+13501433it("handles missing agent config gracefully", () => {
13511434const text = buildStatusMessage({
13521435agent: {},
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。