diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index be8e5291df..68b2f8081e 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -946,6 +946,28 @@ export const webviewMessageHandler = async ( } break } + case "requestRequestyModels": { + // Specific handler for Requesty models only. + const { apiConfiguration: requestyApiConfiguration } = await provider.getState() + try { + const requestyOptions = { + provider: "requesty" as const, + baseUrl: requestyApiConfiguration.requestyBaseUrl, + apiKey: requestyApiConfiguration.requestyApiKey, + } + + // Flush cache and refresh to ensure fresh models. + await flushModels(requestyOptions, true) + + const requestyModels = await getModels(requestyOptions) + + provider.postMessageToWebview({ type: "requestyModels", requestyModels: requestyModels }) + } catch (error) { + // Silently fail - user may not have configured Requesty yet + console.debug("Requesty models fetch failed:", error) + } + break + } case "requestLmStudioModels": { // Specific handler for LM Studio models only. const { apiConfiguration: lmStudioApiConfig } = await provider.getState() diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 093485fa3e..c4807610a8 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -82,6 +82,7 @@ export interface ExtensionMessage { | "lmStudioModels" | "vsCodeLmModels" | "huggingFaceModels" + | "requestyModels" | "vsCodeLmApiAvailable" | "updatePrompt" | "systemPrompt" @@ -184,6 +185,7 @@ export interface ExtensionMessage { } }> }> + requestyModels?: ModelRecord mcpServers?: McpServer[] commits?: GitCommit[] listApiConfig?: ProviderSettingsEntry[] diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 6c87815994..72b54086ee 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -63,6 +63,7 @@ export interface WebviewMessage { | "requestRooCreditBalance" | "requestVsCodeLmModels" | "requestHuggingFaceModels" + | "requestRequestyModels" | "openImage" | "saveImage" | "openFile" diff --git a/webview-ui/src/components/settings/providers/Requesty.tsx b/webview-ui/src/components/settings/providers/Requesty.tsx index 0285dbaed0..140741189b 100644 --- a/webview-ui/src/components/settings/providers/Requesty.tsx +++ b/webview-ui/src/components/settings/providers/Requesty.tsx @@ -3,7 +3,7 @@ import { VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/reac import { type ProviderSettings, type OrganizationAllowList, requestyDefaultModelId } from "@roo-code/types" -import type { RouterModels } from "@roo/api" +import type { ModelRecord, RouterModels } from "@roo/api" import { vscode } from "@src/utils/vscode" import { useAppTranslation } from "@src/i18n/TranslationContext" @@ -14,6 +14,8 @@ import { ModelPicker } from "../ModelPicker" import { RequestyBalanceDisplay } from "./RequestyBalanceDisplay" import { getCallbackUrl } from "@/oauth/urls" import { toRequestyServiceUrl } from "@roo/utils/requesty" +import { useEvent } from "react-use" +import { ExtensionMessage } from "@roo/ExtensionMessage" type RequestyProps = { apiConfiguration: ProviderSettings @@ -29,7 +31,6 @@ type RequestyProps = { export const Requesty = ({ apiConfiguration, setApiConfigurationField, - routerModels, refetchRouterModels, organizationAllowList, modelValidationError, @@ -38,6 +39,8 @@ export const Requesty = ({ }: RequestyProps) => { const { t } = useAppTranslation() + const [requestyModels, setRequestyModels] = useState({}) + const [requestyEndpointSelected, setRequestyEndpointSelected] = useState(!!apiConfiguration.requestyBaseUrl) // This ensures that the "Use custom URL" checkbox is hidden when the user deletes the URL. @@ -65,6 +68,25 @@ export const Requesty = ({ return authUrl.toString() } + const onMessage = useCallback((event: MessageEvent) => { + const message: ExtensionMessage = event.data + + if (message.type !== "requestyModels") { + return + } + + const newModels = message.requestyModels ?? {} + setRequestyModels(newModels) + }, []) + + useEvent("message", onMessage) + + // Refresh models on mount + useEffect(() => { + // Request fresh models - the handler now flushes cache automatically + vscode.postMessage({ type: "requestRequestyModels" }) + }, []) + return ( <> { - vscode.postMessage({ type: "flushRouterModels", text: "requesty" }) + vscode.postMessage({ type: "requestRequestyModels" }) refetchRouterModels() }}>
@@ -139,7 +161,7 @@ export const Requesty = ({ apiConfiguration={apiConfiguration} setApiConfigurationField={setApiConfigurationField} defaultModelId={requestyDefaultModelId} - models={routerModels?.requesty ?? {}} + models={requestyModels} modelIdKey="requestyModelId" serviceName="Requesty" serviceUrl="https://requesty.ai"