move huggingface provider into the new schema

This commit is contained in:
celestial-vault
2025-07-18 13:25:48 -07:00
parent 74243ebc8b
commit 7bf9c3138c
11 changed files with 95 additions and 39 deletions
+4 -2
View File
@@ -229,8 +229,6 @@ message ModelsApiConfiguration {
optional string cline_account_id = 58;
optional string groq_api_key = 59;
optional string hugging_face_api_key = 60;
optional string hugging_face_model_id = 61;
optional OpenRouterModelInfo hugging_face_model_info = 62;
// Plan mode configurations
optional ApiProvider plan_mode_api_provider = 100;
@@ -255,6 +253,8 @@ message ModelsApiConfiguration {
optional string plan_mode_sap_ai_core_model_id = 119;
optional string plan_mode_groq_model_id = 120;
optional OpenRouterModelInfo plan_mode_groq_model_info = 121;
optional string plan_mode_hugging_face_model_id = 122;
optional OpenRouterModelInfo plan_mode_hugging_face_model_info = 123;
// Act mode configurations
optional ApiProvider act_mode_api_provider = 200;
@@ -279,6 +279,8 @@ message ModelsApiConfiguration {
optional string act_mode_sap_ai_core_model_id = 219;
optional string act_mode_groq_model_id = 220;
optional OpenRouterModelInfo act_mode_groq_model_info = 221;
optional string act_mode_hugging_face_model_id = 222;
optional OpenRouterModelInfo act_mode_hugging_face_model_info = 223;
repeated string favorited_model_ids = 300;
}
+3 -1
View File
@@ -217,7 +217,9 @@ function createHandlerForProvider(
case "huggingface":
return new HuggingFaceHandler({
huggingFaceApiKey: options.huggingFaceApiKey,
apiModelId: options.apiModelId,
huggingFaceModelId: mode === "plan" ? options.planModeHuggingFaceModelId : options.actModeHuggingFaceModelId,
huggingFaceModelInfo:
mode === "plan" ? options.planModeHuggingFaceModelInfo : options.actModeHuggingFaceModelInfo,
})
case "nebius":
return new NebiusHandler({
+3 -2
View File
@@ -9,7 +9,8 @@ import { ApiStream } from "../transform/stream"
interface HuggingFaceHandlerOptions {
huggingFaceApiKey?: string
apiModelId?: string
huggingFaceModelId?: string
huggingFaceModelInfo?: ModelInfo
}
export class HuggingFaceHandler implements ApiHandler {
@@ -115,7 +116,7 @@ export class HuggingFaceHandler implements ApiHandler {
return this.cachedModel
}
const modelId = this.options.apiModelId
const modelId = this.options.huggingFaceModelId
// List all available models for debugging
const availableModels = Object.keys(huggingFaceModels)
+4 -2
View File
@@ -85,8 +85,6 @@ export type GlobalStateKey =
// Settings around plan/act and ephemeral model configuration
| "chatSettings"
| "mode"
| "huggingFaceModelId"
| "huggingFaceModelInfo"
// Plan mode configurations
| "planModeApiProvider"
| "planModeApiModelId"
@@ -110,6 +108,8 @@ export type GlobalStateKey =
| "planModeSapAiCoreModelId"
| "planModeGroqModelId"
| "planModeGroqModelInfo"
| "planModeHuggingFaceModelId"
| "planModeHuggingFaceModelInfo"
// Act mode configurations
| "actModeApiProvider"
| "actModeApiModelId"
@@ -133,5 +133,7 @@ export type GlobalStateKey =
| "actModeSapAiCoreModelId"
| "actModeGroqModelId"
| "actModeGroqModelInfo"
| "actModeHuggingFaceModelId"
| "actModeHuggingFaceModelInfo"
export type LocalStateKey = "localClineRulesToggles" | "localCursorRulesToggles" | "localWindsurfRulesToggles" | "workflowToggles"
+18 -10
View File
@@ -277,8 +277,6 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
const [
chatSettings,
currentMode,
huggingFaceModelId,
huggingFaceModelInfo,
// Plan mode configurations
planModeApiProvider,
planModeApiModelId,
@@ -302,6 +300,8 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
planModeSapAiCoreModelId,
planModeGroqModelId,
planModeGroqModelInfo,
planModeHuggingFaceModelId,
planModeHuggingFaceModelInfo,
// Act mode configurations
actModeApiProvider,
actModeApiModelId,
@@ -325,11 +325,11 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
actModeSapAiCoreModelId,
actModeGroqModelId,
actModeGroqModelInfo,
actModeHuggingFaceModelId,
actModeHuggingFaceModelInfo,
] = await Promise.all([
getGlobalState(context, "chatSettings") as Promise<StoredChatSettings | undefined>,
getGlobalState(context, "mode") as Promise<Mode | undefined>,
getGlobalState(context, "huggingFaceModelId") as Promise<string | undefined>,
getGlobalState(context, "huggingFaceModelInfo") as Promise<ModelInfo | undefined>,
// Plan mode configurations
getGlobalState(context, "planModeApiProvider") as Promise<ApiProvider | undefined>,
getGlobalState(context, "planModeApiModelId") as Promise<string | undefined>,
@@ -353,6 +353,8 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
getGlobalState(context, "planModeSapAiCoreModelId") as Promise<string | undefined>,
getGlobalState(context, "planModeGroqModelId") as Promise<string | undefined>,
getGlobalState(context, "planModeGroqModelInfo") as Promise<ModelInfo | undefined>,
getGlobalState(context, "planModeHuggingFaceModelId") as Promise<string | undefined>,
getGlobalState(context, "planModeHuggingFaceModelInfo") as Promise<ModelInfo | undefined>,
// Act mode configurations
getGlobalState(context, "actModeApiProvider") as Promise<ApiProvider | undefined>,
getGlobalState(context, "actModeApiModelId") as Promise<string | undefined>,
@@ -376,6 +378,8 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
getGlobalState(context, "actModeSapAiCoreModelId") as Promise<string | undefined>,
getGlobalState(context, "actModeGroqModelId") as Promise<string | undefined>,
getGlobalState(context, "actModeGroqModelInfo") as Promise<ModelInfo | undefined>,
getGlobalState(context, "actModeHuggingFaceModelId") as Promise<string | undefined>,
getGlobalState(context, "actModeHuggingFaceModelInfo") as Promise<ModelInfo | undefined>,
])
const processingStart = performance.now()
@@ -476,8 +480,6 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
sapAiCoreTokenUrl,
sapAiResourceGroup,
huggingFaceApiKey,
huggingFaceModelId,
huggingFaceModelInfo,
// Plan mode configurations
planModeApiProvider: planModeApiProvider || apiProvider,
planModeApiModelId,
@@ -501,6 +503,8 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) {
planModeSapAiCoreModelId,
planModeGroqModelId,
planModeGroqModelInfo,
planModeHuggingFaceModelId,
planModeHuggingFaceModelInfo,
// Act mode configurations
actModeApiProvider: actModeApiProvider || apiProvider,
actModeApiModelId,
@@ -613,8 +617,6 @@ export async function updateApiConfiguration(context: vscode.ExtensionContext, a
sapAiResourceGroup,
claudeCodePath,
huggingFaceApiKey,
huggingFaceModelId,
huggingFaceModelInfo,
// Plan mode configurations
planModeApiProvider,
planModeApiModelId,
@@ -638,6 +640,8 @@ export async function updateApiConfiguration(context: vscode.ExtensionContext, a
planModeSapAiCoreModelId,
planModeGroqModelId,
planModeGroqModelInfo,
planModeHuggingFaceModelId,
planModeHuggingFaceModelInfo,
// Act mode configurations
actModeApiProvider,
actModeApiModelId,
@@ -661,12 +665,12 @@ export async function updateApiConfiguration(context: vscode.ExtensionContext, a
actModeSapAiCoreModelId,
actModeGroqModelId,
actModeGroqModelInfo,
actModeHuggingFaceModelId,
actModeHuggingFaceModelInfo,
} = apiConfiguration
// OPTIMIZED: Batch all global state updates into 2 operations instead of 47
const batchedGlobalUpdates = {
huggingFaceModelId,
huggingFaceModelInfo,
// Plan mode configuration updates
planModeApiProvider,
planModeApiModelId,
@@ -690,6 +694,8 @@ export async function updateApiConfiguration(context: vscode.ExtensionContext, a
planModeSapAiCoreModelId,
planModeGroqModelId,
planModeGroqModelInfo,
planModeHuggingFaceModelId,
planModeHuggingFaceModelInfo,
// Act mode configuration updates
actModeApiProvider,
@@ -714,6 +720,8 @@ export async function updateApiConfiguration(context: vscode.ExtensionContext, a
actModeSapAiCoreModelId,
actModeGroqModelId,
actModeGroqModelInfo,
actModeHuggingFaceModelId,
actModeHuggingFaceModelInfo,
// Global state updates (27 keys)
awsRegion,
+4 -2
View File
@@ -79,8 +79,6 @@ export interface ApiHandlerOptions {
moonshotApiLine?: string
moonshotApiKey?: string
huggingFaceApiKey?: string
huggingFaceModelId?: string
huggingFaceModelInfo?: ModelInfo
nebiusApiKey?: string
asksageApiUrl?: string
asksageApiKey?: string
@@ -117,6 +115,8 @@ export interface ApiHandlerOptions {
planModeSapAiCoreModelId?: string
planModeGroqModelId?: string
planModeGroqModelInfo?: ModelInfo
planModeHuggingFaceModelId?: string
planModeHuggingFaceModelInfo?: ModelInfo
// Act mode configurations
actModeApiModelId?: string
@@ -140,6 +140,8 @@ export interface ApiHandlerOptions {
actModeSapAiCoreModelId?: string
actModeGroqModelId?: string
actModeGroqModelInfo?: ModelInfo
actModeHuggingFaceModelId?: string
actModeHuggingFaceModelInfo?: ModelInfo
}
export type ApiConfiguration = ApiHandlerOptions & {
@@ -365,8 +365,6 @@ export function convertApiConfigurationToProto(config: ApiConfiguration): ProtoA
moonshotApiLine: config.moonshotApiLine,
moonshotApiKey: config.moonshotApiKey,
huggingFaceApiKey: config.huggingFaceApiKey,
huggingFaceModelId: config.huggingFaceModelId,
huggingFaceModelInfo: convertModelInfoToProtoOpenRouter(config.huggingFaceModelInfo),
nebiusApiKey: config.nebiusApiKey,
asksageApiUrl: config.asksageApiUrl,
asksageApiKey: config.asksageApiKey,
@@ -403,6 +401,8 @@ export function convertApiConfigurationToProto(config: ApiConfiguration): ProtoA
planModeFireworksModelId: config.planModeFireworksModelId,
planModeGroqModelId: config.planModeGroqModelId,
planModeGroqModelInfo: convertModelInfoToProtoOpenRouter(config.planModeGroqModelInfo),
planModeHuggingFaceModelId: config.planModeHuggingFaceModelId,
planModeHuggingFaceModelInfo: convertModelInfoToProtoOpenRouter(config.planModeHuggingFaceModelInfo),
planModeSapAiCoreModelId: config.planModeSapAiCoreModelId,
// Act mode configurations
@@ -427,6 +427,8 @@ export function convertApiConfigurationToProto(config: ApiConfiguration): ProtoA
actModeFireworksModelId: config.actModeFireworksModelId,
actModeGroqModelId: config.actModeGroqModelId,
actModeGroqModelInfo: convertModelInfoToProtoOpenRouter(config.actModeGroqModelInfo),
actModeHuggingFaceModelId: config.actModeHuggingFaceModelId,
actModeHuggingFaceModelInfo: convertModelInfoToProtoOpenRouter(config.actModeHuggingFaceModelInfo),
actModeSapAiCoreModelId: config.actModeSapAiCoreModelId,
// Favorited model IDs
@@ -484,8 +486,6 @@ export function convertProtoToApiConfiguration(protoConfig: ProtoApiConfiguratio
moonshotApiLine: protoConfig.moonshotApiLine,
moonshotApiKey: protoConfig.moonshotApiKey,
huggingFaceApiKey: protoConfig.huggingFaceApiKey,
huggingFaceModelId: protoConfig.huggingFaceModelId,
huggingFaceModelInfo: convertProtoToModelInfo(protoConfig.huggingFaceModelInfo),
nebiusApiKey: protoConfig.nebiusApiKey,
asksageApiUrl: protoConfig.asksageApiUrl,
asksageApiKey: protoConfig.asksageApiKey,
@@ -525,6 +525,8 @@ export function convertProtoToApiConfiguration(protoConfig: ProtoApiConfiguratio
planModeFireworksModelId: protoConfig.planModeFireworksModelId,
planModeGroqModelId: protoConfig.planModeGroqModelId,
planModeGroqModelInfo: convertProtoToModelInfo(protoConfig.planModeGroqModelInfo),
planModeHuggingFaceModelId: protoConfig.planModeHuggingFaceModelId,
planModeHuggingFaceModelInfo: convertProtoToModelInfo(protoConfig.planModeHuggingFaceModelInfo),
planModeSapAiCoreModelId: protoConfig.planModeSapAiCoreModelId,
// Act mode configurations
@@ -550,6 +552,8 @@ export function convertProtoToApiConfiguration(protoConfig: ProtoApiConfiguratio
actModeFireworksModelId: protoConfig.actModeFireworksModelId,
actModeGroqModelId: protoConfig.actModeGroqModelId,
actModeGroqModelInfo: convertProtoToModelInfo(protoConfig.actModeGroqModelInfo),
actModeHuggingFaceModelId: protoConfig.actModeHuggingFaceModelId,
actModeHuggingFaceModelInfo: convertProtoToModelInfo(protoConfig.actModeHuggingFaceModelInfo),
actModeSapAiCoreModelId: protoConfig.actModeSapAiCoreModelId,
// Favorited model IDs
@@ -261,7 +261,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
)}
{apiConfiguration && selectedProvider === "huggingface" && (
<HuggingFaceProvider showModelOptions={showModelOptions} isPopup={isPopup} />
<HuggingFaceProvider showModelOptions={showModelOptions} isPopup={isPopup} currentMode={currentMode} />
)}
{apiConfiguration && selectedProvider === "nebius" && (
@@ -4,21 +4,24 @@ import Fuse from "fuse.js"
import React, { KeyboardEvent, useEffect, useMemo, useRef, useState } from "react"
import { useMount } from "react-use"
import { huggingFaceDefaultModelId, huggingFaceModels } from "@shared/api"
import { Mode } from "@shared/ChatSettings"
import { useExtensionState } from "../../context/ExtensionStateContext"
import { ModelsServiceClient } from "../../services/grpc-client"
import { highlight } from "../history/HistoryView"
import { ModelInfoView } from "./common/ModelInfoView"
import { normalizeApiConfiguration } from "./utils/providerUtils"
import { normalizeApiConfiguration, getModeSpecificFields } from "./utils/providerUtils"
import { useApiConfigurationHandlers } from "./utils/useApiConfigurationHandlers"
export interface HuggingFaceModelPickerProps {
isPopup?: boolean
currentMode: Mode
}
const HuggingFaceModelPicker: React.FC<HuggingFaceModelPickerProps> = ({ isPopup }) => {
const HuggingFaceModelPicker: React.FC<HuggingFaceModelPickerProps> = ({ isPopup, currentMode }) => {
const { apiConfiguration, huggingFaceModels: dynamicModels, setHuggingFaceModels } = useExtensionState()
const { handleFieldsChange } = useApiConfigurationHandlers()
const [searchTerm, setSearchTerm] = useState(apiConfiguration?.huggingFaceModelId || huggingFaceDefaultModelId)
const { handleModeFieldsChange } = useApiConfigurationHandlers()
const modeFields = getModeSpecificFields(apiConfiguration, currentMode)
const [searchTerm, setSearchTerm] = useState(modeFields.huggingFaceModelId || huggingFaceDefaultModelId)
const [isDropdownVisible, setIsDropdownVisible] = useState(false)
const [selectedIndex, setSelectedIndex] = useState(-1)
const dropdownRef = useRef<HTMLDivElement>(null)
@@ -27,16 +30,25 @@ const HuggingFaceModelPicker: React.FC<HuggingFaceModelPickerProps> = ({ isPopup
const handleModelChange = (newModelId: string) => {
const allModels = { ...huggingFaceModels, ...dynamicModels }
handleFieldsChange({
huggingFaceModelId: newModelId,
huggingFaceModelInfo: allModels[newModelId as keyof typeof allModels],
})
const modelInfo = allModels[newModelId as keyof typeof allModels]
handleModeFieldsChange(
{
huggingFaceModelId: { plan: "planModeHuggingFaceModelId", act: "actModeHuggingFaceModelId" },
huggingFaceModelInfo: { plan: "planModeHuggingFaceModelInfo", act: "actModeHuggingFaceModelInfo" },
},
{
huggingFaceModelId: newModelId,
huggingFaceModelInfo: modelInfo,
},
currentMode,
)
setSearchTerm(newModelId)
}
const { selectedModelId, selectedModelInfo } = useMemo(() => {
return normalizeApiConfiguration(apiConfiguration)
}, [apiConfiguration])
return normalizeApiConfiguration(apiConfiguration, currentMode)
}, [apiConfiguration, currentMode])
useMount(() => {
ModelsServiceClient.refreshHuggingFaceModels(EmptyRequest.create({}))
@@ -1,4 +1,5 @@
import { huggingFaceModels } from "@shared/api"
import { Mode } from "@shared/ChatSettings"
import { DebouncedTextField } from "../common/DebouncedTextField"
import { ModelSelector } from "../common/ModelSelector"
import { ModelInfoView } from "../common/ModelInfoView"
@@ -13,17 +14,18 @@ import { HuggingFaceModelPicker } from "../HuggingFaceModelPicker"
interface HuggingFaceProviderProps {
showModelOptions: boolean
isPopup?: boolean
currentMode: Mode
}
/**
* The Hugging Face provider configuration component
*/
export const HuggingFaceProvider = ({ showModelOptions, isPopup }: HuggingFaceProviderProps) => {
export const HuggingFaceProvider = ({ showModelOptions, isPopup, currentMode }: HuggingFaceProviderProps) => {
const { apiConfiguration } = useExtensionState()
const { handleFieldChange } = useApiConfigurationHandlers()
// Get the normalized configuration
const { selectedModelId, selectedModelInfo } = normalizeApiConfiguration(apiConfiguration)
const { selectedModelId, selectedModelInfo } = normalizeApiConfiguration(apiConfiguration, currentMode)
return (
<div>
@@ -50,7 +52,7 @@ export const HuggingFaceProvider = ({ showModelOptions, isPopup }: HuggingFacePr
{showModelOptions && (
<>
<HuggingFaceModelPicker isPopup={isPopup} />
<HuggingFaceModelPicker isPopup={isPopup} currentMode={currentMode} />
</>
)}
</div>
@@ -219,10 +219,18 @@ export function normalizeApiConfiguration(
case "moonshot":
return getProviderData(moonshotModels, moonshotDefaultModelId)
case "huggingface":
const huggingFaceModelId =
currentMode === "plan"
? apiConfiguration?.planModeHuggingFaceModelId
: apiConfiguration?.actModeHuggingFaceModelId
const huggingFaceModelInfo =
currentMode === "plan"
? apiConfiguration?.planModeHuggingFaceModelInfo
: apiConfiguration?.actModeHuggingFaceModelInfo
return {
selectedProvider: provider,
selectedModelId: apiConfiguration?.huggingFaceModelId || huggingFaceDefaultModelId,
selectedModelInfo: apiConfiguration?.huggingFaceModelInfo || huggingFaceModels[huggingFaceDefaultModelId],
selectedModelId: huggingFaceModelId || huggingFaceDefaultModelId,
selectedModelInfo: huggingFaceModelInfo || huggingFaceModels[huggingFaceDefaultModelId],
}
case "nebius":
return getProviderData(nebiusModels, nebiusDefaultModelId)
@@ -270,6 +278,7 @@ export function getModeSpecificFields(apiConfiguration: ApiConfiguration | undef
openAiModelId: undefined,
openRouterModelId: undefined,
groqModelId: undefined,
huggingFaceModelId: undefined,
// Model info objects
openAiModelInfo: undefined,
@@ -277,6 +286,7 @@ export function getModeSpecificFields(apiConfiguration: ApiConfiguration | undef
openRouterModelInfo: undefined,
requestyModelInfo: undefined,
groqModelInfo: undefined,
huggingFaceModelInfo: undefined,
vsCodeLmModelSelector: undefined,
// AWS Bedrock fields
@@ -305,6 +315,8 @@ export function getModeSpecificFields(apiConfiguration: ApiConfiguration | undef
openRouterModelId:
mode === "plan" ? apiConfiguration.planModeOpenRouterModelId : apiConfiguration.actModeOpenRouterModelId,
groqModelId: mode === "plan" ? apiConfiguration.planModeGroqModelId : apiConfiguration.actModeGroqModelId,
huggingFaceModelId:
mode === "plan" ? apiConfiguration.planModeHuggingFaceModelId : apiConfiguration.actModeHuggingFaceModelId,
// Model info objects
openAiModelInfo: mode === "plan" ? apiConfiguration.planModeOpenAiModelInfo : apiConfiguration.actModeOpenAiModelInfo,
@@ -314,6 +326,8 @@ export function getModeSpecificFields(apiConfiguration: ApiConfiguration | undef
requestyModelInfo:
mode === "plan" ? apiConfiguration.planModeRequestyModelInfo : apiConfiguration.actModeRequestyModelInfo,
groqModelInfo: mode === "plan" ? apiConfiguration.planModeGroqModelInfo : apiConfiguration.actModeGroqModelInfo,
huggingFaceModelInfo:
mode === "plan" ? apiConfiguration.planModeHuggingFaceModelInfo : apiConfiguration.actModeHuggingFaceModelInfo,
vsCodeLmModelSelector:
mode === "plan" ? apiConfiguration.planModeVsCodeLmModelSelector : apiConfiguration.actModeVsCodeLmModelSelector,
@@ -414,6 +428,13 @@ export async function syncModeConfigurations(
updates.actModeGroqModelInfo = sourceFields.groqModelInfo
break
case "huggingface":
updates.planModeHuggingFaceModelId = sourceFields.huggingFaceModelId
updates.actModeHuggingFaceModelId = sourceFields.huggingFaceModelId
updates.planModeHuggingFaceModelInfo = sourceFields.huggingFaceModelInfo
updates.actModeHuggingFaceModelInfo = sourceFields.huggingFaceModelInfo
break
case "together":
updates.planModeTogetherModelId = sourceFields.togetherModelId
updates.actModeTogetherModelId = sourceFields.togetherModelId