Skip to content

Commit 43d6a50

Browse files
authored
Merge pull request #2113 from Kilo-Org/christiaan/model-selector
Fix modelselector for qwen-code and others
2 parents af6d0a0 + e468863 commit 43d6a50

File tree

3 files changed

+138
-9
lines changed

3 files changed

+138
-9
lines changed

.changeset/eight-coats-cover.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"kilo-code": patch
3+
---
4+
5+
The model selector below the chat now shows the correct model list for Qwen Code and some other providers
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { ModelInfo, ProviderName, providerNames } from "@roo-code/types"
2+
import { RouterModels } from "@roo/api"
3+
import { getModelsByProvider } from "../useProviderModels"
4+
5+
describe("getModelsByProvider", () => {
6+
it("returns models for all providers", () => {
7+
const testModel: ModelInfo = {
8+
maxTokens: 4096,
9+
contextWindow: 8192,
10+
supportsImages: false,
11+
supportsPromptCache: false,
12+
inputPrice: 0.1,
13+
outputPrice: 0.2,
14+
description: "Test model",
15+
}
16+
17+
const routerModels: RouterModels = {
18+
openrouter: { "test-model": testModel },
19+
requesty: { "test-model": testModel },
20+
glama: { "test-model": testModel },
21+
unbound: { "test-model": testModel },
22+
litellm: { "test-model": testModel },
23+
"kilocode-openrouter": { "test-model": testModel },
24+
ollama: { "test-model": testModel },
25+
lmstudio: { "test-model": testModel },
26+
"io-intelligence": { "test-model": testModel },
27+
}
28+
29+
const exceptions = [
30+
"fake-ai", // don't know what this is
31+
"huggingface", // don't know what this is
32+
"human-relay", // no models
33+
"openai", // not implemented
34+
"roo", // don't care
35+
"virtual-quota-fallback", // no models
36+
"zai", // has weird mainland/international distiction
37+
]
38+
39+
const providersWithoutModels = providerNames
40+
.map(
41+
(provider) =>
42+
[
43+
provider,
44+
getModelsByProvider({
45+
provider,
46+
routerModels,
47+
kilocodeDefaultModel: "test-default-model",
48+
}),
49+
] satisfies [ProviderName, ReturnType<typeof getModelsByProvider>],
50+
)
51+
.filter((provider) => exceptions.indexOf(provider[0]) < 0 && Object.values(provider[1].models).length === 0)
52+
.map((provider) => provider[0])
53+
54+
expect(providersWithoutModels).toStrictEqual([])
55+
})
56+
})

webview-ui/src/components/kilocode/hooks/useProviderModels.ts

Lines changed: 77 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,32 @@ import {
2828
glamaDefaultModelId,
2929
unboundDefaultModelId,
3030
litellmDefaultModelId,
31+
qwenCodeModels,
32+
qwenCodeDefaultModelId,
33+
geminiCliModels,
34+
claudeCodeModels,
35+
claudeCodeDefaultModelId,
36+
doubaoModels,
37+
doubaoDefaultModelId,
38+
fireworksModels,
39+
fireworksDefaultModelId,
40+
ioIntelligenceDefaultModelId,
41+
moonshotModels,
42+
moonshotDefaultModelId,
43+
sambaNovaModels,
44+
sambaNovaDefaultModelId,
3145
} from "@roo-code/types"
3246
import { cerebrasModels, cerebrasDefaultModelId } from "@roo/api"
3347
import type { ModelRecord, RouterModels } from "@roo/api"
3448
import { useRouterModels } from "../../ui/hooks/useRouterModels"
35-
import { useExtensionState } from "@/context/ExtensionStateContext" // kilocode_change
49+
import { useExtensionState } from "@/context/ExtensionStateContext"
3650

3751
const FALLBACK_MODELS = {
3852
models: anthropicModels,
3953
defaultModel: anthropicDefaultModelId,
4054
}
4155

42-
const getModelsByProvider = ({
56+
export const getModelsByProvider = ({
4357
provider,
4458
routerModels,
4559
kilocodeDefaultModel,
@@ -147,16 +161,14 @@ const getModelsByProvider = ({
147161
}
148162
}
149163
case "ollama": {
150-
// Only custom models
151164
return {
152-
models: {},
165+
models: routerModels.ollama,
153166
defaultModel: "",
154167
}
155168
}
156169
case "lmstudio": {
157-
// Only custom models
158170
return {
159-
models: {},
171+
models: routerModels.lmstudio,
160172
defaultModel: "",
161173
}
162174
}
@@ -172,16 +184,72 @@ const getModelsByProvider = ({
172184
defaultModel: kilocodeDefaultModel,
173185
}
174186
}
175-
default: {
176-
return FALLBACK_MODELS
187+
case "claude-code": {
188+
return {
189+
models: claudeCodeModels,
190+
defaultModel: claudeCodeDefaultModelId,
191+
}
192+
}
193+
case "qwen-code": {
194+
return {
195+
models: qwenCodeModels,
196+
defaultModel: qwenCodeDefaultModelId,
197+
}
198+
}
199+
case "gemini-cli": {
200+
return {
201+
models: geminiCliModels,
202+
defaultModel: geminiDefaultModelId,
203+
}
204+
}
205+
case "anthropic": {
206+
return {
207+
models: anthropicModels,
208+
defaultModel: anthropicDefaultModelId,
209+
}
210+
}
211+
case "doubao": {
212+
return {
213+
models: doubaoModels,
214+
defaultModel: doubaoDefaultModelId,
215+
}
177216
}
217+
case "fireworks": {
218+
return {
219+
models: fireworksModels,
220+
defaultModel: fireworksDefaultModelId,
221+
}
222+
}
223+
case "io-intelligence": {
224+
return {
225+
models: routerModels["io-intelligence"],
226+
defaultModel: ioIntelligenceDefaultModelId,
227+
}
228+
}
229+
case "moonshot": {
230+
return {
231+
models: moonshotModels,
232+
defaultModel: moonshotDefaultModelId,
233+
}
234+
}
235+
case "sambanova": {
236+
return {
237+
models: sambaNovaModels,
238+
defaultModel: sambaNovaDefaultModelId,
239+
}
240+
}
241+
default:
242+
return {
243+
models: {},
244+
defaultModel: "",
245+
}
178246
}
179247
}
180248

181249
export const useProviderModels = (apiConfiguration?: ProviderSettings) => {
182250
const provider = apiConfiguration?.apiProvider || "anthropic"
183251

184-
const { kilocodeDefaultModel } = useExtensionState() // kilocode_change
252+
const { kilocodeDefaultModel } = useExtensionState()
185253

186254
const routerModels = useRouterModels({
187255
openRouterBaseUrl: apiConfiguration?.openRouterBaseUrl,

0 commit comments

Comments
 (0)