























11// Status message tests cover status message formatting and persistence.
2-import { describe, expect, it } from "vitest";
2+import { afterEach, describe, expect, it } from "vitest";
3+import { testing as cliBackendsTesting } from "../agents/cli-backends.js";
4+import type { ModelDefinitionConfig } from "../config/types.models.js";
35import { formatFastModeLabel } from "./status-labels.js";
6+import { buildStatusMessage } from "./status-message.js";
7+8+function statusTestModel(id: string, name: string, contextWindow: number): ModelDefinitionConfig {
9+return {
10+ id,
11+ name,
12+reasoning: false,
13+input: ["text"],
14+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
15+ contextWindow,
16+maxTokens: 8_192,
17+};
18+}
19+20+afterEach(() => {
21+cliBackendsTesting.resetDepsForTest();
22+});
423524describe("formatFastModeLabel", () => {
625it("shows fast mode when enabled", () => {
@@ -11,3 +30,112 @@ describe("formatFastModeLabel", () => {
1130expect(formatFastModeLabel(false)).toBe("Fast: off");
1231});
1332});
33+34+describe("buildStatusMessage context window", () => {
35+it("ignores stale runtime context after a manual session model switch", () => {
36+const text = buildStatusMessage({
37+config: {
38+models: {
39+providers: {
40+"ollama-cloud": {
41+baseUrl: "https://ollama.com",
42+models: [
43+statusTestModel("deepseek-v4-pro", "DeepSeek V4 Pro", 1_000_000),
44+statusTestModel("glm-5.1", "GLM 5.1", 200_000),
45+],
46+},
47+},
48+},
49+},
50+agent: {
51+model: "ollama-cloud/deepseek-v4-pro",
52+contextTokens: 1_000_000,
53+},
54+configuredDefaultModelLabel: "ollama-cloud/deepseek-v4-pro",
55+explicitConfiguredContextTokens: 1_000_000,
56+runtimeContextTokens: 1_000_000,
57+sessionEntry: {
58+sessionId: "manual-switch-stale-runtime",
59+updatedAt: 0,
60+providerOverride: "ollama-cloud",
61+modelOverride: "glm-5.1",
62+modelOverrideSource: "user",
63+modelProvider: "ollama-cloud",
64+model: "deepseek-v4-pro",
65+totalTokens: 128_393,
66+totalTokensFresh: true,
67+},
68+sessionKey: "agent:main:telegram:direct:584667058",
69+sessionScope: "per-sender",
70+queue: { mode: "steer", depth: 0 },
71+modelAuth: "api-key",
72+});
73+74+expect(text).toContain("Session selected: ollama-cloud/glm-5.1");
75+expect(text).toContain("Context: 128k/200k");
76+expect(text).not.toContain("Context: 128k/1.0m");
77+});
78+79+it("keeps trusted runtime context for config-backed runtime aliases", () => {
80+cliBackendsTesting.setDepsForTest({
81+resolvePluginSetupCliBackend: ({ backend }) =>
82+backend === "claude-cli"
83+ ? {
84+pluginId: "anthropic",
85+backend: {
86+id: "claude-cli",
87+modelProvider: "anthropic",
88+config: { command: "claude" },
89+bundleMcp: false,
90+},
91+}
92+ : undefined,
93+resolvePluginSetupRegistry: () => {
94+throw new Error("setup registry should not load for a targeted runtime alias");
95+},
96+resolveRuntimeCliBackends: () => [],
97+});
98+99+const text = buildStatusMessage({
100+config: {
101+agents: {
102+defaults: {
103+cliBackends: {
104+"claude-cli": { command: "claude" },
105+},
106+},
107+},
108+models: {
109+providers: {
110+anthropic: {
111+baseUrl: "https://api.anthropic.com",
112+models: [statusTestModel("claude-haiku-4-5", "Claude Haiku 4.5", 200_000)],
113+},
114+},
115+},
116+},
117+agent: {
118+model: "anthropic/claude-haiku-4-5",
119+contextTokens: 200_000,
120+},
121+runtimeContextTokens: 1_000_000,
122+sessionEntry: {
123+sessionId: "runtime-alias-context",
124+updatedAt: 0,
125+modelProvider: "claude-cli",
126+model: "claude-haiku-4-5",
127+totalTokens: 36_000,
128+totalTokensFresh: true,
129+},
130+sessionKey: "agent:main:main",
131+sessionScope: "per-sender",
132+queue: { mode: "collect", depth: 0 },
133+modelAuth: "oauth",
134+activeModelAuth: "oauth",
135+});
136+137+expect(text).toContain("Model: anthropic/claude-haiku-4-5");
138+expect(text).toContain("Context: 36k/1.0m");
139+expect(text).not.toContain("Context: 36k/200k");
140+});
141+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。