From bbc955503641acc507f15b653382cebca35a62d5 Mon Sep 17 00:00:00 2001
From: sam hoang
Date: Tue, 11 Feb 2025 02:08:49 +0700
Subject: [PATCH] feat: add custom model input support to ModelPicker
- Add allowCustomModel prop to control custom model feature
- Implement custom model input dialog with proper VSCode theming
- Enable custom model support in OpenAiModelPicker
- Fix z-index issues with modal dialog
---
.../src/components/settings/ModelPicker.tsx | 51 +++++++++++++++++++
.../components/settings/OpenAiModelPicker.tsx | 1 +
2 files changed, 52 insertions(+)
diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx
index deb1062fdc..b21b37ef0f 100644
--- a/webview-ui/src/components/settings/ModelPicker.tsx
+++ b/webview-ui/src/components/settings/ModelPicker.tsx
@@ -40,6 +40,7 @@ interface ModelPickerProps {
serviceName: string
serviceUrl: string
recommendedModel: string
+ allowCustomModel?: boolean
}
export const ModelPicker = ({
@@ -52,7 +53,10 @@ export const ModelPicker = ({
serviceName,
serviceUrl,
recommendedModel,
+ allowCustomModel = false,
}: ModelPickerProps) => {
+ const [customModelId, setCustomModelId] = useState("")
+ const [isCustomModel, setIsCustomModel] = useState(false)
const [open, setOpen] = useState(false)
const [value, setValue] = useState(defaultModelId)
const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false)
@@ -70,6 +74,20 @@ export const ModelPicker = ({
[apiConfiguration],
)
+ const onSelectCustomModel = useCallback(
+ (modelId: string) => {
+ setCustomModelId(modelId)
+ const modelInfo = { id: modelId }
+ const apiConfig = { ...apiConfiguration, [configKey]: modelId, [infoKey]: modelInfo }
+ setApiConfiguration(apiConfig)
+ onUpdateApiConfig(apiConfig)
+ setValue(modelId)
+ setOpen(false)
+ setIsCustomModel(false)
+ },
+ [apiConfiguration, configKey, infoKey, onUpdateApiConfig, setApiConfiguration],
+ )
+
const onSelect = useCallback(
(modelId: string) => {
const modelInfo = Array.isArray(models)
@@ -147,6 +165,17 @@ export const ModelPicker = ({
))}
+ {allowCustomModel && (
+
+ {
+ setIsCustomModel(true)
+ setOpen(false)
+ }}>
+ + Add custom model
+
+
+ )}
@@ -168,6 +197,28 @@ export const ModelPicker = ({
onSelect(recommendedModel)}>{recommendedModel}.
You can also try searching "free" for no-cost options currently available.
+ {allowCustomModel && isCustomModel && (
+
+
+
Add Custom Model
+
setCustomModelId(e.target.value)}
+ />
+
+
+
+
+
+
+ )}
>
)
}
diff --git a/webview-ui/src/components/settings/OpenAiModelPicker.tsx b/webview-ui/src/components/settings/OpenAiModelPicker.tsx
index 4b987c7cf9..040da1d421 100644
--- a/webview-ui/src/components/settings/OpenAiModelPicker.tsx
+++ b/webview-ui/src/components/settings/OpenAiModelPicker.tsx
@@ -19,6 +19,7 @@ const OpenAiModelPicker: React.FC = () => {
serviceName="OpenAI"
serviceUrl="https://platform.openai.com"
recommendedModel="gpt-4-turbo-preview"
+ allowCustomModel={true}
/>
)
}