|
1 | | -import { providerIdentifiers, retiredProviderIdentifiers, type ProviderSettings } from "@roo-code/types" |
2 | | - |
3 | 1 | import { DEFAULT_CONTEXT_WINDOW, getContextWindow } from "../context-window.js" |
4 | 2 |
|
5 | 3 | describe("getContextWindow", () => { |
6 | | - it.each([ |
7 | | - [providerIdentifiers.openrouter, "openRouterModelId"], |
8 | | - [providerIdentifiers.ollama, "ollamaModelId"], |
9 | | - [providerIdentifiers.lmstudio, "lmStudioModelId"], |
10 | | - [providerIdentifiers.openai, "openAiModelId"], |
11 | | - [providerIdentifiers.requesty, "requestyModelId"], |
12 | | - [providerIdentifiers.unbound, "unboundModelId"], |
13 | | - [providerIdentifiers.litellm, "litellmModelId"], |
14 | | - [providerIdentifiers.vercelAiGateway, "vercelAiGatewayModelId"], |
15 | | - [providerIdentifiers.opencodeGo, "opencodeGoModelId"], |
16 | | - [providerIdentifiers.kenari, "kenariModelId"], |
17 | | - [providerIdentifiers.ioIntelligence, "ioIntelligenceModelId"], |
18 | | - [providerIdentifiers.nanogpt, "nanoGptModelId"], |
19 | | - [providerIdentifiers.zooGateway, "zooGatewayModelId"], |
20 | | - ] as const)("uses the provider-specific model field for %s", (provider, modelField) => { |
21 | | - const config = { apiProvider: provider, [modelField]: "selected-model" } as ProviderSettings |
22 | | - const routerModels = { [provider]: { "selected-model": { contextWindow: 123_456 } } } |
23 | | - |
24 | | - expect(getContextWindow(routerModels, config)).toBe(123_456) |
| 4 | + it.each([1, 32_000, 200_000, 1_048_576])("returns the window reported by the extension (%d)", (contextWindow) => { |
| 5 | + expect(getContextWindow(contextWindow)).toBe(contextWindow) |
25 | 6 | }) |
26 | 7 |
|
27 | 8 | it.each([ |
28 | | - providerIdentifiers.anthropic, |
29 | | - providerIdentifiers.bedrock, |
30 | | - providerIdentifiers.deepseek, |
31 | | - providerIdentifiers.fireworks, |
32 | | - providerIdentifiers.gemini, |
33 | | - providerIdentifiers.mistral, |
34 | | - providerIdentifiers.openaiNative, |
35 | | - providerIdentifiers.vertex, |
36 | | - providerIdentifiers.xai, |
37 | | - ] as const)("uses the shared apiModelId field for %s", (provider) => { |
38 | | - const config: ProviderSettings = { apiProvider: provider, apiModelId: "selected-model" } |
39 | | - const routerModels = { [provider]: { "selected-model": { contextWindow: 64_000 } } } |
40 | | - |
41 | | - expect(getContextWindow(routerModels, config)).toBe(64_000) |
42 | | - }) |
43 | | - |
44 | | - it("ignores another provider's model field", () => { |
45 | | - const config: ProviderSettings = { |
46 | | - apiProvider: providerIdentifiers.ollama, |
47 | | - openRouterModelId: "openrouter-model", |
48 | | - ollamaModelId: "ollama-model", |
49 | | - } |
50 | | - const routerModels = { |
51 | | - [providerIdentifiers.ollama]: { "ollama-model": { contextWindow: 32_000 } }, |
52 | | - } |
53 | | - |
54 | | - expect(getContextWindow(routerModels, config)).toBe(32_000) |
55 | | - }) |
56 | | - |
57 | | - describe("VS Code LM", () => { |
58 | | - const provider = providerIdentifiers.vscodeLm |
59 | | - const routerModels = { [provider]: { "selected-model": { contextWindow: 123_456 } } } |
60 | | - |
61 | | - it("takes the model from the saved selector", () => { |
62 | | - const config: ProviderSettings = { |
63 | | - apiProvider: provider, |
64 | | - vsCodeLmModelSelector: { vendor: "copilot", id: "selected-model" }, |
65 | | - } |
66 | | - |
67 | | - expect(getContextWindow(routerModels, config)).toBe(123_456) |
68 | | - }) |
69 | | - |
70 | | - it("ignores apiModelId, which the selector replaces", () => { |
71 | | - const config: ProviderSettings = { |
72 | | - apiProvider: provider, |
73 | | - apiModelId: "other-model", |
74 | | - vsCodeLmModelSelector: { vendor: "copilot", id: "selected-model" }, |
75 | | - } |
76 | | - |
77 | | - expect(getContextWindow(routerModels, config)).toBe(123_456) |
78 | | - }) |
79 | | - }) |
80 | | - |
81 | | - describe("GitHub Copilot", () => { |
82 | | - const provider = providerIdentifiers.githubCopilot |
83 | | - const routerModels = { [provider]: { "selected-model": { contextWindow: 123_456 } } } |
84 | | - |
85 | | - it("takes the model from the saved selector, where Copilot keeps it", () => { |
86 | | - const config: ProviderSettings = { |
87 | | - apiProvider: provider, |
88 | | - vsCodeLmModelSelector: { vendor: "copilot", id: "selected-model" }, |
89 | | - } |
90 | | - |
91 | | - expect(getContextWindow(routerModels, config)).toBe(123_456) |
92 | | - }) |
93 | | - |
94 | | - it("ignores apiModelId, which Copilot profiles do not use", () => { |
95 | | - const config: ProviderSettings = { |
96 | | - apiProvider: provider, |
97 | | - apiModelId: "other-model", |
98 | | - vsCodeLmModelSelector: { vendor: "copilot", id: "selected-model" }, |
99 | | - } |
100 | | - |
101 | | - expect(getContextWindow(routerModels, config)).toBe(123_456) |
102 | | - }) |
103 | | - |
104 | | - it.each([ |
105 | | - ["no selector", undefined], |
106 | | - ["a selector that names a family but no id", { vendor: "copilot", family: "gpt-5.5" }], |
107 | | - ])("returns the default for %s", (_label, vsCodeLmModelSelector) => { |
108 | | - const config: ProviderSettings = { apiProvider: provider, vsCodeLmModelSelector } |
109 | | - |
110 | | - expect(getContextWindow(routerModels, config)).toBe(DEFAULT_CONTEXT_WINDOW) |
111 | | - }) |
112 | | - |
113 | | - it("returns the default when the selected model is not in the list", () => { |
114 | | - const config: ProviderSettings = { |
115 | | - apiProvider: provider, |
116 | | - vsCodeLmModelSelector: { vendor: "copilot", id: "unlisted-model" }, |
117 | | - } |
118 | | - |
119 | | - expect(getContextWindow(routerModels, config)).toBe(DEFAULT_CONTEXT_WINDOW) |
120 | | - }) |
121 | | - }) |
122 | | - |
123 | | - it("returns the default when the selected model is unavailable", () => { |
124 | | - const routerModels = { [providerIdentifiers.openrouter]: { "other-model": { contextWindow: 1_000 } } } |
125 | | - const config: ProviderSettings = { |
126 | | - apiProvider: providerIdentifiers.openrouter, |
127 | | - openRouterModelId: "missing-model", |
128 | | - } |
129 | | - |
130 | | - expect(getContextWindow(routerModels, config)).toBe(DEFAULT_CONTEXT_WINDOW) |
131 | | - }) |
132 | | - |
133 | | - it("returns the default when no provider is selected", () => { |
134 | | - expect(getContextWindow({}, {})).toBe(DEFAULT_CONTEXT_WINDOW) |
135 | | - }) |
136 | | - |
137 | | - it("returns the default when router models are unavailable for a retired provider", () => { |
138 | | - const config: ProviderSettings = { |
139 | | - apiProvider: retiredProviderIdentifiers.groq, |
140 | | - apiModelId: "selected-model", |
141 | | - } |
142 | | - |
143 | | - expect(getContextWindow({}, config)).toBe(DEFAULT_CONTEXT_WINDOW) |
144 | | - }) |
145 | | - |
146 | | - it("resolves the model for a retired provider instead of throwing", () => { |
147 | | - const config: ProviderSettings = { |
148 | | - apiProvider: retiredProviderIdentifiers.groq, |
149 | | - apiModelId: "selected-model", |
150 | | - } |
151 | | - const routerModels = { [retiredProviderIdentifiers.groq]: { "selected-model": { contextWindow: 48_000 } } } |
152 | | - |
153 | | - expect(getContextWindow(routerModels, config)).toBe(48_000) |
154 | | - }) |
155 | | - |
156 | | - it("returns the default when router models or configuration is missing", () => { |
157 | | - expect(getContextWindow(null, { apiProvider: providerIdentifiers.anthropic })).toBe(DEFAULT_CONTEXT_WINDOW) |
158 | | - expect(getContextWindow({}, null)).toBe(DEFAULT_CONTEXT_WINDOW) |
| 9 | + ["undefined", undefined], |
| 10 | + ["null", null], |
| 11 | + ["zero", 0], |
| 12 | + ["negative", -1], |
| 13 | + ["NaN", Number.NaN], |
| 14 | + ])("returns the default when the reported window is %s", (_label, contextWindow) => { |
| 15 | + expect(getContextWindow(contextWindow)).toBe(DEFAULT_CONTEXT_WINDOW) |
159 | 16 | }) |
160 | 17 | }) |
0 commit comments