From 7bf9c3138c3346f773592673d6c353c409249911 Mon Sep 17 00:00:00 2001 From: celestial-vault Date: Fri, 18 Jul 2025 13:25:48 -0700 Subject: [PATCH] move huggingface provider into the new schema --- proto/models.proto | 6 ++-- src/api/index.ts | 4 ++- src/api/providers/huggingface.ts | 5 +-- src/core/storage/state-keys.ts | 6 ++-- src/core/storage/state.ts | 28 ++++++++++------ src/shared/api.ts | 6 ++-- .../models/api-configuration-conversion.ts | 12 ++++--- .../src/components/settings/ApiOptions.tsx | 2 +- .../settings/HuggingFaceModelPicker.tsx | 32 +++++++++++++------ .../providers/HuggingFaceProvider.tsx | 8 +++-- .../settings/utils/providerUtils.ts | 25 +++++++++++++-- 11 files changed, 95 insertions(+), 39 deletions(-) diff --git a/proto/models.proto b/proto/models.proto index 2fad82eea2..737db25b4c 100644 --- a/proto/models.proto +++ b/proto/models.proto @@ -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; } diff --git a/src/api/index.ts b/src/api/index.ts index 44d68e9133..a428472965 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -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({ diff --git a/src/api/providers/huggingface.ts b/src/api/providers/huggingface.ts index 9cb6c51dd7..f91dea7c76 100644 --- a/src/api/providers/huggingface.ts +++ b/src/api/providers/huggingface.ts @@ -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) diff --git a/src/core/storage/state-keys.ts b/src/core/storage/state-keys.ts index e584cf7e8a..56338abc16 100644 --- a/src/core/storage/state-keys.ts +++ b/src/core/storage/state-keys.ts @@ -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" diff --git a/src/core/storage/state.ts b/src/core/storage/state.ts index 68eec62a7e..12d8a1500e 100644 --- a/src/core/storage/state.ts +++ b/src/core/storage/state.ts @@ -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, getGlobalState(context, "mode") as Promise, - getGlobalState(context, "huggingFaceModelId") as Promise, - getGlobalState(context, "huggingFaceModelInfo") as Promise, // Plan mode configurations getGlobalState(context, "planModeApiProvider") as Promise, getGlobalState(context, "planModeApiModelId") as Promise, @@ -353,6 +353,8 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) { getGlobalState(context, "planModeSapAiCoreModelId") as Promise, getGlobalState(context, "planModeGroqModelId") as Promise, getGlobalState(context, "planModeGroqModelInfo") as Promise, + getGlobalState(context, "planModeHuggingFaceModelId") as Promise, + getGlobalState(context, "planModeHuggingFaceModelInfo") as Promise, // Act mode configurations getGlobalState(context, "actModeApiProvider") as Promise, getGlobalState(context, "actModeApiModelId") as Promise, @@ -376,6 +378,8 @@ export async function getAllExtensionState(context: vscode.ExtensionContext) { getGlobalState(context, "actModeSapAiCoreModelId") as Promise, getGlobalState(context, "actModeGroqModelId") as Promise, getGlobalState(context, "actModeGroqModelInfo") as Promise, + getGlobalState(context, "actModeHuggingFaceModelId") as Promise, + getGlobalState(context, "actModeHuggingFaceModelInfo") as Promise, ]) 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, diff --git a/src/shared/api.ts b/src/shared/api.ts index b7dabec8ea..0de0d34deb 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -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 & { diff --git a/src/shared/proto-conversions/models/api-configuration-conversion.ts b/src/shared/proto-conversions/models/api-configuration-conversion.ts index 36364a5081..60760df84c 100644 --- a/src/shared/proto-conversions/models/api-configuration-conversion.ts +++ b/src/shared/proto-conversions/models/api-configuration-conversion.ts @@ -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 diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 6a2c505521..ed32f4f80c 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -261,7 +261,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is )} {apiConfiguration && selectedProvider === "huggingface" && ( - + )} {apiConfiguration && selectedProvider === "nebius" && ( diff --git a/webview-ui/src/components/settings/HuggingFaceModelPicker.tsx b/webview-ui/src/components/settings/HuggingFaceModelPicker.tsx index 5b05c2b4bf..f529a48a42 100644 --- a/webview-ui/src/components/settings/HuggingFaceModelPicker.tsx +++ b/webview-ui/src/components/settings/HuggingFaceModelPicker.tsx @@ -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 = ({ isPopup }) => { +const HuggingFaceModelPicker: React.FC = ({ 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(null) @@ -27,16 +30,25 @@ const HuggingFaceModelPicker: React.FC = ({ 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({})) diff --git a/webview-ui/src/components/settings/providers/HuggingFaceProvider.tsx b/webview-ui/src/components/settings/providers/HuggingFaceProvider.tsx index a4e03042c1..9a954cdcc0 100644 --- a/webview-ui/src/components/settings/providers/HuggingFaceProvider.tsx +++ b/webview-ui/src/components/settings/providers/HuggingFaceProvider.tsx @@ -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 (
@@ -50,7 +52,7 @@ export const HuggingFaceProvider = ({ showModelOptions, isPopup }: HuggingFacePr {showModelOptions && ( <> - + )}
diff --git a/webview-ui/src/components/settings/utils/providerUtils.ts b/webview-ui/src/components/settings/utils/providerUtils.ts index 85a4141cc0..aaf3f568c5 100644 --- a/webview-ui/src/components/settings/utils/providerUtils.ts +++ b/webview-ui/src/components/settings/utils/providerUtils.ts @@ -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