Skip to content

Commit 6f8782c

Browse files
committed
refactor(webview): extract provider settings migration
1 parent 7749187 commit 6f8782c

19 files changed

Lines changed: 295 additions & 181 deletions

webview-ui/src/components/settings/providers/Kenari.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
type OrganizationAllowList,
77
type RouterModels,
88
kenariDefaultModelId,
9-
providerIdentifiers,
109
} from "@roo-code/types"
1110

1211
import { useAppTranslation } from "@src/i18n/TranslationContext"
@@ -70,7 +69,7 @@ export const Kenari = ({
7069
apiConfiguration={apiConfiguration}
7170
setApiConfigurationField={setApiConfigurationField}
7271
defaultModelId={kenariDefaultModelId}
73-
models={routerModels?.[providerIdentifiers.kenari] ?? {}}
72+
models={routerModels?.["kenari"] ?? {}}
7473
modelIdKey="kenariModelId"
7574
serviceName="Kenari"
7675
serviceUrl="https://kenari.id/docs"

webview-ui/src/components/settings/providers/KimiCode.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
type KimiCodeAuthMethod,
88
type ModelRecord,
99
type ProviderSettings,
10-
providerIdentifiers,
1110
} from "@roo-code/types"
1211

1312
import { useAppTranslation } from "@src/i18n/TranslationContext"
@@ -38,10 +37,10 @@ export const KimiCode = ({
3837
const { t } = useAppTranslation()
3938
const authMethod = apiConfiguration.kimiCodeAuthMethod ?? "oauth"
4039
const { data, refetch, isFetching } = useRouterModels({
41-
provider: providerIdentifiers.kimiCode,
40+
provider: "kimi-code",
4241
enabled: authMethod === "oauth" ? kimiCodeIsAuthenticated : !!apiConfiguration.kimiCodeApiKey,
4342
})
44-
const discoveredModels = data?.[providerIdentifiers.kimiCode]
43+
const discoveredModels = data?.["kimi-code"]
4544
const models: ModelRecord =
4645
discoveredModels && Object.keys(discoveredModels).length > 0 ? discoveredModels : kimiCodeModels
4746

@@ -53,7 +52,7 @@ export const KimiCode = ({
5352
vscode.postMessage({
5453
type: "requestRouterModels",
5554
values: {
56-
provider: providerIdentifiers.kimiCode,
55+
provider: "kimi-code",
5756
refresh: true,
5857
kimiCodeAuthMethod: authMethod,
5958
kimiCodeApiKey: apiConfiguration.kimiCodeApiKey,

webview-ui/src/components/settings/providers/LiteLLM.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
type OrganizationAllowList,
88
type ExtensionMessage,
99
litellmDefaultModelId,
10-
providerIdentifiers,
1110
} from "@roo-code/types"
1211

1312
import { RouterName } from "@roo/api"
@@ -47,7 +46,7 @@ export const LiteLLM = ({
4746
const message = event.data
4847
if (message.type === "singleRouterModelFetchResponse" && !message.success) {
4948
const providerName = message.values?.provider as RouterName
50-
if (providerName === providerIdentifiers.litellm) {
49+
if (providerName === "litellm") {
5150
litellmErrorJustReceived.current = true
5251
setRefreshStatus("error")
5352
setRefreshError(message.error)
@@ -58,11 +57,12 @@ export const LiteLLM = ({
5857
if (refreshStatus === "loading") {
5958
if (!litellmErrorJustReceived.current) {
6059
setRefreshStatus("success")
61-
// Refresh the provider-scoped cache used by useSelectedModel and the shared cache used by
62-
// ApiOptions. Target both exact keys rather than the bare ["routerModels"] prefix, which
63-
// would needlessly invalidate every other provider's query too.
64-
queryClient.invalidateQueries({ queryKey: ["routerModels", providerIdentifiers.litellm] })
65-
queryClient.invalidateQueries({ queryKey: ["routerModels", "all"] })
60+
// Invalidate only the LiteLLM router-models query so useSelectedModel
61+
// picks up the refreshed list. useSelectedModel reads LiteLLM under the
62+
// compound key ["routerModels", "litellm"] (see useRouterModels), so we
63+
// target that exact key rather than the bare ["routerModels"] prefix,
64+
// which would needlessly invalidate every other provider's query too.
65+
queryClient.invalidateQueries({ queryKey: ["routerModels", "litellm"] })
6666
}
6767
// If litellmErrorJustReceived.current is true, status is already (or will be) "error".
6868
}

webview-ui/src/components/settings/providers/Moonshot.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@ import { useCallback, useState, useEffect, useRef } from "react"
22
import { VSCodeTextField, VSCodeDropdown, VSCodeOption } from "@vscode/webview-ui-toolkit/react"
33
import { useQueryClient } from "@tanstack/react-query"
44

5-
import {
6-
type ProviderSettings,
7-
type ExtensionMessage,
8-
moonshotDefaultModelId,
9-
providerIdentifiers,
10-
} from "@roo-code/types"
5+
import type { ProviderSettings, ExtensionMessage } from "@roo-code/types"
6+
import { moonshotDefaultModelId } from "@roo-code/types"
117

128
import { RouterName } from "@roo/api"
139

@@ -18,6 +14,7 @@ import { vscode } from "@src/utils/vscode"
1814
import { Button } from "@src/components/ui"
1915
import { ModelPicker } from "../ModelPicker"
2016
import { handleModelChangeSideEffects } from "../utils/providerModelConfig"
17+
import type { ProviderName } from "@roo-code/types"
2118

2219
import { inputEventTransform } from "../transforms"
2320

@@ -40,7 +37,7 @@ export const Moonshot = ({ apiConfiguration, setApiConfigurationField, simplifyS
4037
const message = event.data
4138
if (message.type === "singleRouterModelFetchResponse" && !message.success) {
4239
const providerName = message.values?.provider as RouterName
43-
if (providerName === providerIdentifiers.moonshot && refreshStatus === "loading") {
40+
if (providerName === "moonshot" && refreshStatus === "loading") {
4441
moonshotErrorJustReceived.current = true
4542
setRefreshStatus("error")
4643
setRefreshError(message.error)
@@ -141,7 +138,7 @@ export const Moonshot = ({ apiConfiguration, setApiConfigurationField, simplifyS
141138
serviceUrl="https://platform.moonshot.ai"
142139
simplifySettings={simplifySettings}
143140
onModelChange={(modelId) =>
144-
handleModelChangeSideEffects(providerIdentifiers.moonshot, modelId, setApiConfigurationField)
141+
handleModelChangeSideEffects("moonshot" as ProviderName, modelId, setApiConfigurationField)
145142
}
146143
/>
147144
<Button

webview-ui/src/components/settings/providers/OpenAICodex.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import React from "react"
22

3-
import { type ProviderSettings, openAiCodexDefaultModelId, openAiCodexModels } from "@roo-code/types"
3+
import {
4+
OPEN_AI_CODEX_SERVICE_TIER_KEY,
5+
type ProviderSettings,
6+
openAiCodexDefaultModelId,
7+
openAiCodexModels,
8+
} from "@roo-code/types"
49

510
import { useAppTranslation } from "@src/i18n/TranslationContext"
611
import { Button } from "@src/components/ui"
712
import { vscode } from "@src/utils/vscode"
813

914
import { ModelPicker } from "../ModelPicker"
1015
import { OpenAICodexRateLimitDashboard } from "./OpenAICodexRateLimitDashboard"
16+
import { OpenAICodexSpeedSelector } from "./OpenAICodexSpeedSelector"
1117

1218
interface OpenAICodexProps {
1319
apiConfiguration: ProviderSettings
@@ -66,6 +72,11 @@ export const OpenAICodex: React.FC<OpenAICodexProps> = ({
6672
simplifySettings={simplifySettings}
6773
hidePricing
6874
/>
75+
76+
<OpenAICodexSpeedSelector
77+
value={apiConfiguration[OPEN_AI_CODEX_SERVICE_TIER_KEY]}
78+
onValueChange={(value) => setApiConfigurationField(OPEN_AI_CODEX_SERVICE_TIER_KEY, value)}
79+
/>
6980
</div>
7081
)
7182
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from "react"
2+
3+
import {
4+
OpenAiCodexServiceTier,
5+
type OpenAiCodexServiceTier as OpenAiCodexServiceTierValue,
6+
} from "@roo-code/types/model"
7+
8+
import { useAppTranslation } from "@src/i18n/TranslationContext"
9+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, StandardTooltip } from "@src/components/ui"
10+
11+
interface OpenAICodexSpeedSelectorProps {
12+
value?: OpenAiCodexServiceTierValue
13+
onValueChange: (value: OpenAiCodexServiceTierValue) => void
14+
}
15+
16+
export const OpenAICodexSpeedSelector: React.FC<OpenAICodexSpeedSelectorProps> = ({ value, onValueChange }) => {
17+
const { t } = useAppTranslation()
18+
const selectId = React.useId()
19+
20+
return (
21+
<div className="flex flex-col gap-1" data-testid="openai-codex-service-tier">
22+
<div className="flex items-center gap-1">
23+
<label htmlFor={selectId} className="block font-medium">
24+
{t("settings:openAiCodexSpeed.label")}
25+
</label>
26+
<StandardTooltip content={t("settings:openAiCodexSpeed.tooltip")}>
27+
<i className="codicon codicon-info text-vscode-descriptionForeground text-xs" />
28+
</StandardTooltip>
29+
</div>
30+
<Select value={value ?? OpenAiCodexServiceTier.Default} onValueChange={onValueChange}>
31+
<SelectTrigger id={selectId} className="w-full">
32+
<SelectValue placeholder={t("settings:common.select")} />
33+
</SelectTrigger>
34+
<SelectContent>
35+
<SelectItem value={OpenAiCodexServiceTier.Default}>
36+
{t("settings:openAiCodexSpeed.standard")}
37+
</SelectItem>
38+
<SelectItem value={OpenAiCodexServiceTier.Priority}>
39+
{t("settings:openAiCodexSpeed.fast")}
40+
</SelectItem>
41+
</SelectContent>
42+
</Select>
43+
</div>
44+
)
45+
}

webview-ui/src/components/settings/providers/OpenCodeGo.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
type RouterModels,
88
type ExtensionMessage,
99
opencodeGoDefaultModelId,
10-
providerIdentifiers,
1110
} from "@roo-code/types"
1211

1312
import type { RouterName } from "@roo/api"
@@ -47,7 +46,7 @@ export const OpenCodeGo = ({
4746
const message = event.data
4847
if (message.type === "singleRouterModelFetchResponse" && !message.success) {
4948
const providerName = message.values?.provider as RouterName
50-
if (providerName === providerIdentifiers.opencodeGo) {
49+
if (providerName === "opencode-go") {
5150
errorJustReceived.current = true
5251
setRefreshStatus("error")
5352
setRefreshError(message.error)
@@ -84,11 +83,7 @@ export const OpenCodeGo = ({
8483
setRefreshError(undefined)
8584
vscode.postMessage({
8685
type: "requestRouterModels",
87-
values: {
88-
provider: providerIdentifiers.opencodeGo,
89-
refresh: true,
90-
opencodeGoApiKey: apiConfiguration.opencodeGoApiKey,
91-
},
86+
values: { provider: "opencode-go", refresh: true, opencodeGoApiKey: apiConfiguration.opencodeGoApiKey },
9287
})
9388
}, [apiConfiguration.opencodeGoApiKey])
9489

@@ -141,7 +136,7 @@ export const OpenCodeGo = ({
141136
apiConfiguration={apiConfiguration}
142137
setApiConfigurationField={setApiConfigurationField}
143138
defaultModelId={opencodeGoDefaultModelId}
144-
models={routerModels?.[providerIdentifiers.opencodeGo] ?? {}}
139+
models={routerModels?.["opencode-go"] ?? {}}
145140
modelIdKey="opencodeGoModelId"
146141
serviceName="Opencode Go"
147142
serviceUrl="https://opencode.ai/docs/go/"

webview-ui/src/components/settings/providers/Poe.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
type OrganizationAllowList,
88
type ExtensionMessage,
99
poeDefaultModelId,
10-
providerIdentifiers,
10+
type ProviderName,
1111
} from "@roo-code/types"
1212

1313
import { RouterName } from "@roo/api"
@@ -49,7 +49,7 @@ export const Poe = ({
4949
const message = event.data
5050
if (message.type === "singleRouterModelFetchResponse" && !message.success) {
5151
const providerName = message.values?.provider as RouterName
52-
if (providerName === providerIdentifiers.poe) {
52+
if (providerName === "poe") {
5353
poeErrorJustReceived.current = true
5454
setRefreshStatus("error")
5555
setRefreshError(message.error)
@@ -158,7 +158,7 @@ export const Poe = ({
158158
errorMessage={modelValidationError}
159159
simplifySettings={simplifySettings}
160160
onModelChange={(modelId) =>
161-
handleModelChangeSideEffects(providerIdentifiers.poe, modelId, setApiConfigurationField)
161+
handleModelChangeSideEffects("poe" as ProviderName, modelId, setApiConfigurationField)
162162
}
163163
/>
164164
</>

webview-ui/src/components/settings/providers/Requesty.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
type OrganizationAllowList,
77
type RouterModels,
88
requestyDefaultModelId,
9-
providerIdentifiers,
109
} from "@roo-code/types"
1110

1211
import { vscode } from "@src/utils/vscode"
@@ -60,7 +59,7 @@ export const Requesty = ({
6059
)
6160

6261
const getApiKeyUrl = () => {
63-
const callbackUrl = getCallbackUrl(providerIdentifiers.requesty, uriScheme)
62+
const callbackUrl = getCallbackUrl("requesty", uriScheme)
6463
const baseUrl = toRequestyServiceUrl(apiConfiguration.requestyBaseUrl, "app")
6564

6665
const authUrl = new URL(`oauth/authorize?callback_url=${callbackUrl}`, baseUrl)
@@ -130,10 +129,7 @@ export const Requesty = ({
130129
<Button
131130
variant="outline"
132131
onClick={() => {
133-
vscode.postMessage({
134-
type: "requestRouterModels",
135-
values: { provider: providerIdentifiers.requesty, refresh: true },
136-
})
132+
vscode.postMessage({ type: "requestRouterModels", values: { provider: "requesty", refresh: true } })
137133
}}>
138134
<div className="flex items-center gap-2">
139135
<span className="codicon codicon-refresh" />

webview-ui/src/components/settings/providers/Unbound.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
type OrganizationAllowList,
77
type RouterModels,
88
unboundDefaultModelId,
9-
providerIdentifiers,
109
} from "@roo-code/types"
1110

1211
import { vscode } from "@src/utils/vscode"
@@ -78,10 +77,7 @@ export const Unbound = ({
7877
<Button
7978
variant="outline"
8079
onClick={() => {
81-
vscode.postMessage({
82-
type: "requestRouterModels",
83-
values: { provider: providerIdentifiers.unbound, refresh: true },
84-
})
80+
vscode.postMessage({ type: "requestRouterModels", values: { provider: "unbound", refresh: true } })
8581
}}>
8682
<div className="flex items-center gap-2">
8783
<span className="codicon codicon-refresh" />

0 commit comments

Comments
 (0)