diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx
index 8c2f382db6..594cd2fd5f 100644
--- a/webview-ui/src/components/settings/ApiOptions.tsx
+++ b/webview-ui/src/components/settings/ApiOptions.tsx
@@ -38,18 +38,14 @@ import { ExtensionMessage } from "../../../../src/shared/ExtensionMessage"
import { vscode } from "../../utils/vscode"
import VSCodeButtonLink from "../common/VSCodeButtonLink"
-import { OpenRouterModelPicker } from "./OpenRouterModelPicker"
-import OpenAiModelPicker from "./OpenAiModelPicker"
-import { GlamaModelPicker } from "./GlamaModelPicker"
-import { UnboundModelPicker } from "./UnboundModelPicker"
import { ModelInfoView } from "./ModelInfoView"
import { DROPDOWN_Z_INDEX } from "./styles"
-import { RequestyModelPicker } from "./RequestyModelPicker"
+import { ModelPicker } from "./ModelPicker"
import { TemperatureControl } from "./TemperatureControl"
interface ApiOptionsProps {
uriScheme: string | undefined
- apiConfiguration: ApiConfiguration | undefined
+ apiConfiguration: ApiConfiguration
setApiConfigurationField: (field: K, value: ApiConfiguration[K]) => void
apiErrorMessage?: string
modelIdErrorMessage?: string
@@ -67,6 +63,20 @@ const ApiOptions = ({
const [ollamaModels, setOllamaModels] = useState([])
const [lmStudioModels, setLmStudioModels] = useState([])
const [vsCodeLmModels, setVsCodeLmModels] = useState([])
+ const [openRouterModels, setOpenRouterModels] = useState>({
+ [openRouterDefaultModelId]: openRouterDefaultModelInfo,
+ })
+ const [glamaModels, setGlamaModels] = useState>({
+ [glamaDefaultModelId]: glamaDefaultModelInfo,
+ })
+ const [unboundModels, setUnboundModels] = useState>({
+ [unboundDefaultModelId]: unboundDefaultModelInfo,
+ })
+ const [requestyModels, setRequestyModels] = useState>({
+ [requestyDefaultModelId]: requestyDefaultModelInfo,
+ })
+ const [openAiModels, setOpenAiModels] = useState | null>(null)
+
const [anthropicBaseUrlSelected, setAnthropicBaseUrlSelected] = useState(!!apiConfiguration?.anthropicBaseUrl)
const [azureApiVersionSelected, setAzureApiVersionSelected] = useState(!!apiConfiguration?.azureApiVersion)
const [openRouterBaseUrlSelected, setOpenRouterBaseUrlSelected] = useState(!!apiConfiguration?.openRouterBaseUrl)
@@ -104,24 +114,93 @@ const ApiOptions = ({
vscode.postMessage({ type: "requestLmStudioModels", text: apiConfiguration?.lmStudioBaseUrl })
} else if (selectedProvider === "vscode-lm") {
vscode.postMessage({ type: "requestVsCodeLmModels" })
+ } else if (selectedProvider === "openai") {
+ vscode.postMessage({
+ type: "refreshOpenAiModels",
+ values: {
+ baseUrl: apiConfiguration?.openAiBaseUrl,
+ apiKey: apiConfiguration?.openAiApiKey,
+ },
+ })
+ } else if (selectedProvider === "openrouter") {
+ vscode.postMessage({ type: "refreshOpenRouterModels", values: {} })
+ } else if (selectedProvider === "glama") {
+ vscode.postMessage({ type: "refreshGlamaModels", values: {} })
+ } else if (selectedProvider === "requesty") {
+ vscode.postMessage({
+ type: "refreshRequestyModels",
+ values: {
+ apiKey: apiConfiguration?.requestyApiKey,
+ },
+ })
}
},
250,
- [selectedProvider, apiConfiguration?.ollamaBaseUrl, apiConfiguration?.lmStudioBaseUrl],
+ [
+ selectedProvider,
+ apiConfiguration?.ollamaBaseUrl,
+ apiConfiguration?.lmStudioBaseUrl,
+ apiConfiguration?.openAiBaseUrl,
+ apiConfiguration?.openAiApiKey,
+ apiConfiguration?.requestyApiKey,
+ ],
)
const handleMessage = useCallback((event: MessageEvent) => {
const message: ExtensionMessage = event.data
-
- if (message.type === "ollamaModels" && Array.isArray(message.ollamaModels)) {
- const newModels = message.ollamaModels
- setOllamaModels(newModels)
- } else if (message.type === "lmStudioModels" && Array.isArray(message.lmStudioModels)) {
- const newModels = message.lmStudioModels
- setLmStudioModels(newModels)
- } else if (message.type === "vsCodeLmModels" && Array.isArray(message.vsCodeLmModels)) {
- const newModels = message.vsCodeLmModels
- setVsCodeLmModels(newModels)
+ switch (message.type) {
+ case "ollamaModels":
+ {
+ const newModels = message.ollamaModels ?? []
+ setOllamaModels(newModels)
+ }
+ break
+ case "lmStudioModels":
+ {
+ const newModels = message.lmStudioModels ?? []
+ setLmStudioModels(newModels)
+ }
+ break
+ case "vsCodeLmModels":
+ {
+ const newModels = message.vsCodeLmModels ?? []
+ setVsCodeLmModels(newModels)
+ }
+ break
+ case "glamaModels": {
+ const updatedModels = message.glamaModels ?? {}
+ setGlamaModels({
+ [glamaDefaultModelId]: glamaDefaultModelInfo, // in case the extension sent a model list without the default model
+ ...updatedModels,
+ })
+ break
+ }
+ case "openRouterModels": {
+ const updatedModels = message.openRouterModels ?? {}
+ setOpenRouterModels({
+ [openRouterDefaultModelId]: openRouterDefaultModelInfo, // in case the extension sent a model list without the default model
+ ...updatedModels,
+ })
+ break
+ }
+ case "openAiModels": {
+ const updatedModels = message.openAiModels ?? []
+ setOpenAiModels(Object.fromEntries(updatedModels.map((item) => [item, openAiModelInfoSaneDefaults])))
+ break
+ }
+ case "unboundModels": {
+ const updatedModels = message.unboundModels ?? {}
+ setUnboundModels(updatedModels)
+ break
+ }
+ case "requestyModels": {
+ const updatedModels = message.requestyModels ?? {}
+ setRequestyModels({
+ [requestyDefaultModelId]: requestyDefaultModelInfo, // in case the extension sent a model list without the default model
+ ...updatedModels,
+ })
+ break
+ }
}
}, [])
@@ -616,7 +695,17 @@ const ApiOptions = ({
placeholder="Enter API Key...">
API Key
-
+
{
+ onInput={handleInputChange("openAiCustomModelInfo", (e) => {
const value = parseInt((e.target as HTMLInputElement).value)
return {
...(apiConfiguration?.openAiCustomModelInfo ||
@@ -751,7 +840,7 @@ const ApiOptions = ({
})(),
}}
title="Total number of tokens (input + output) the model can process in a single request"
- onChange={handleInputChange("openAiCustomModelInfo", (e) => {
+ onInput={handleInputChange("openAiCustomModelInfo", (e) => {
const value = (e.target as HTMLInputElement).value
const parsed = parseInt(value)
return {
@@ -897,7 +986,7 @@ const ApiOptions = ({
: "var(--vscode-errorForeground)"
})(),
}}
- onChange={handleInputChange("openAiCustomModelInfo", (e) => {
+ onInput={handleInputChange("openAiCustomModelInfo", (e) => {
const value = (e.target as HTMLInputElement).value
const parsed = parseInt(value)
return {
@@ -942,7 +1031,7 @@ const ApiOptions = ({
: "var(--vscode-errorForeground)"
})(),
}}
- onChange={handleInputChange("openAiCustomModelInfo", (e) => {
+ onInput={handleInputChange("openAiCustomModelInfo", (e) => {
const value = (e.target as HTMLInputElement).value
const parsed = parseInt(value)
return {
@@ -1011,6 +1100,7 @@ const ApiOptions = ({
placeholder={"e.g. meta-llama-3.1-8b-instruct"}>
Model ID
+
{lmStudioModels.length > 0 && (
This key is stored locally and only used to make API requests from this extension.
-
+
)}
@@ -1236,9 +1337,49 @@ const ApiOptions = ({
)}
- {selectedProvider === "glama" && }
- {selectedProvider === "openrouter" && }
- {selectedProvider === "requesty" && }
+ {selectedProvider === "glama" && (
+
+ )}
+
+ {selectedProvider === "openrouter" && (
+
+ )}
+ {selectedProvider === "requesty" && (
+
+ )}
{selectedProvider !== "glama" &&
selectedProvider !== "openrouter" &&
@@ -1260,7 +1401,6 @@ const ApiOptions = ({
{selectedProvider === "deepseek" && createDropdown(deepSeekModels)}
{selectedProvider === "mistral" && createDropdown(mistralModels)}
-
(
-
-)
diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx
index b21b37ef0f..8fd6d82daa 100644
--- a/webview-ui/src/components/settings/ModelPicker.tsx
+++ b/webview-ui/src/components/settings/ModelPicker.tsx
@@ -1,185 +1,90 @@
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
-import debounce from "debounce"
-import { useMemo, useState, useCallback, useEffect, useRef } from "react"
-import { useMount } from "react-use"
-import { CaretSortIcon, CheckIcon } from "@radix-ui/react-icons"
+import { useMemo, useState, useCallback, useEffect } from "react"
-import { cn } from "@/lib/utils"
-import {
- Button,
- Command,
- CommandEmpty,
- CommandGroup,
- CommandInput,
- CommandItem,
- CommandList,
- Popover,
- PopoverContent,
- PopoverTrigger,
-} from "@/components/ui"
-
-import { useExtensionState } from "../../context/ExtensionStateContext"
-import { vscode } from "../../utils/vscode"
import { normalizeApiConfiguration } from "./ApiOptions"
import { ModelInfoView } from "./ModelInfoView"
+import { ApiConfiguration, ModelInfo } from "../../../../src/shared/api"
+import { Combobox, ComboboxContent, ComboboxEmpty, ComboboxInput, ComboboxItem } from "../ui/combobox"
-type ModelProvider = "glama" | "openRouter" | "unbound" | "requesty" | "openAi"
+type ExtractType = NonNullable<
+ { [K in keyof ApiConfiguration]: Required[K] extends T ? K : never }[keyof ApiConfiguration]
+>
-type ModelKeys = `${T}Models`
-type ConfigKeys = `${T}ModelId`
-type InfoKeys = `${T}ModelInfo`
-type RefreshMessageType = `refresh${Capitalize}Models`
-
-interface ModelPickerProps {
- defaultModelId: string
- modelsKey: ModelKeys
- configKey: ConfigKeys
- infoKey: InfoKeys
- refreshMessageType: RefreshMessageType
- refreshValues?: Record
+type ModelIdKeys = NonNullable<
+ { [K in keyof ApiConfiguration]: K extends `${string}ModelId` ? K : never }[keyof ApiConfiguration]
+>
+declare module "react" {
+ interface CSSProperties {
+ // Allow CSS variables
+ [key: `--${string}`]: string | number
+ }
+}
+interface ModelPickerProps {
+ defaultModelId?: string
+ models: Record | null
+ modelIdKey: ModelIdKeys
+ modelInfoKey: ExtractType
serviceName: string
serviceUrl: string
recommendedModel: string
- allowCustomModel?: boolean
+ apiConfiguration: ApiConfiguration
+ setApiConfigurationField: (field: K, value: ApiConfiguration[K]) => void
+ defaultModelInfo?: ModelInfo
}
export const ModelPicker = ({
defaultModelId,
- modelsKey,
- configKey,
- infoKey,
- refreshMessageType,
- refreshValues,
+ models,
+ modelIdKey,
+ modelInfoKey,
serviceName,
serviceUrl,
recommendedModel,
- allowCustomModel = false,
+ apiConfiguration,
+ setApiConfigurationField,
+ defaultModelInfo,
}: 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)
- const prevRefreshValuesRef = useRef | undefined>()
- const { apiConfiguration, [modelsKey]: models, onUpdateApiConfig, setApiConfiguration } = useExtensionState()
-
- const modelIds = useMemo(
- () => (Array.isArray(models) ? models : Object.keys(models)).sort((a, b) => a.localeCompare(b)),
- [models],
- )
+ const modelIds = useMemo(() => Object.keys(models ?? {}).sort((a, b) => a.localeCompare(b)), [models])
const { selectedModelId, selectedModelInfo } = useMemo(
() => normalizeApiConfiguration(apiConfiguration),
[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)
- ? { id: modelId } // For OpenAI models which are just strings
- : models[modelId] // For other models that have full info objects
- const apiConfig = { ...apiConfiguration, [configKey]: modelId, [infoKey]: modelInfo }
- setApiConfiguration(apiConfig)
- onUpdateApiConfig(apiConfig)
- setValue(modelId)
- setOpen(false)
+ const modelInfo = models?.[modelId]
+ setApiConfigurationField(modelIdKey, modelId)
+ setApiConfigurationField(modelInfoKey, modelInfo ?? defaultModelInfo)
},
- [apiConfiguration, configKey, infoKey, models, onUpdateApiConfig, setApiConfiguration],
+ [modelIdKey, modelInfoKey, models, setApiConfigurationField, defaultModelInfo],
)
-
- const debouncedRefreshModels = useMemo(() => {
- return debounce(() => {
- const message = refreshValues
- ? { type: refreshMessageType, values: refreshValues }
- : { type: refreshMessageType }
- vscode.postMessage(message)
- }, 100)
- }, [refreshMessageType, refreshValues])
-
- useMount(() => {
- debouncedRefreshModels()
- return () => debouncedRefreshModels.clear()
- })
-
useEffect(() => {
- if (!refreshValues) {
- prevRefreshValuesRef.current = undefined
- return
+ if (apiConfiguration[modelIdKey] == null && defaultModelId) {
+ onSelect(defaultModelId)
}
-
- // Check if all values in refreshValues are truthy
- if (Object.values(refreshValues).some((value) => !value)) {
- prevRefreshValuesRef.current = undefined
- return
- }
-
- // Compare with previous values
- const prevValues = prevRefreshValuesRef.current
- if (prevValues && JSON.stringify(prevValues) === JSON.stringify(refreshValues)) {
- return
- }
-
- prevRefreshValuesRef.current = refreshValues
- debouncedRefreshModels()
- }, [debouncedRefreshModels, refreshValues])
-
- useEffect(() => setValue(selectedModelId), [selectedModelId])
+ }, [apiConfiguration, defaultModelId, modelIdKey, onSelect])
return (
<>
Model
-
-
-
-
-
-
-
-
- No model found.
-
- {modelIds.map((model) => (
-
- {model}
-
-
- ))}
-
- {allowCustomModel && (
-
- {
- setIsCustomModel(true)
- setOpen(false)
- }}>
- + Add custom model
-
-
- )}
-
-
-
-
+
+
+
+ No model found.
+ {modelIds.map((model) => (
+
+ {model}
+
+ ))}
+
+
+
{selectedModelId && selectedModelInfo && (
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
deleted file mode 100644
index 040da1d421..0000000000
--- a/webview-ui/src/components/settings/OpenAiModelPicker.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from "react"
-import { useExtensionState } from "../../context/ExtensionStateContext"
-import { ModelPicker } from "./ModelPicker"
-
-const OpenAiModelPicker: React.FC = () => {
- const { apiConfiguration } = useExtensionState()
-
- return (
-
- )
-}
-
-export default OpenAiModelPicker
diff --git a/webview-ui/src/components/settings/OpenRouterModelPicker.tsx b/webview-ui/src/components/settings/OpenRouterModelPicker.tsx
deleted file mode 100644
index c773478e54..0000000000
--- a/webview-ui/src/components/settings/OpenRouterModelPicker.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ModelPicker } from "./ModelPicker"
-import { openRouterDefaultModelId } from "../../../../src/shared/api"
-
-export const OpenRouterModelPicker = () => (
-
-)
diff --git a/webview-ui/src/components/settings/RequestyModelPicker.tsx b/webview-ui/src/components/settings/RequestyModelPicker.tsx
deleted file mode 100644
index c65067068a..0000000000
--- a/webview-ui/src/components/settings/RequestyModelPicker.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { ModelPicker } from "./ModelPicker"
-import { requestyDefaultModelId } from "../../../../src/shared/api"
-import { useExtensionState } from "@/context/ExtensionStateContext"
-
-export const RequestyModelPicker = () => {
- const { apiConfiguration } = useExtensionState()
- return (
-
- )
-}
diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx
index 761e856521..75ba11107c 100644
--- a/webview-ui/src/components/settings/SettingsView.tsx
+++ b/webview-ui/src/components/settings/SettingsView.tsx
@@ -1,4 +1,4 @@
-import { forwardRef, memo, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react"
+import { forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"
import { VSCodeButton, VSCodeCheckbox, VSCodeLink, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"
import { Dropdown, type DropdownOption } from "vscrui"
@@ -45,7 +45,6 @@ const SettingsView = forwardRef(({ onDone },
// TODO: Reduce WebviewMessage/ExtensionState complexity
const { currentApiConfigName } = extensionState
const {
- apiConfiguration,
alwaysAllowReadOnly,
allowedCommands,
alwaysAllowBrowser,
@@ -69,6 +68,9 @@ const SettingsView = forwardRef(({ onDone },
terminalOutputLineLimit,
writeDelayMs,
} = cachedState
+
+ //Make sure apiConfiguration is initialized and managed by SettingsView
+ const apiConfiguration = useMemo(() => cachedState.apiConfiguration ?? {}, [cachedState.apiConfiguration])
useEffect(() => {
// Update only when currentApiConfigName is changed
diff --git a/webview-ui/src/components/settings/UnboundModelPicker.tsx b/webview-ui/src/components/settings/UnboundModelPicker.tsx
deleted file mode 100644
index 4901884f1e..0000000000
--- a/webview-ui/src/components/settings/UnboundModelPicker.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { ModelPicker } from "./ModelPicker"
-import { unboundDefaultModelId } from "../../../../src/shared/api"
-
-export const UnboundModelPicker = () => (
-
-)
diff --git a/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx b/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx
index 4e7c67c187..49d60c55c4 100644
--- a/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx
+++ b/webview-ui/src/components/settings/__tests__/ModelPicker.test.tsx
@@ -3,7 +3,6 @@
import { screen, fireEvent, render } from "@testing-library/react"
import { act } from "react"
import { ModelPicker } from "../ModelPicker"
-import { useExtensionState } from "../../../context/ExtensionStateContext"
jest.mock("../../../context/ExtensionStateContext", () => ({
useExtensionState: jest.fn(),
@@ -20,36 +19,40 @@ global.ResizeObserver = MockResizeObserver
Element.prototype.scrollIntoView = jest.fn()
describe("ModelPicker", () => {
- const mockOnUpdateApiConfig = jest.fn()
- const mockSetApiConfiguration = jest.fn()
-
+ const mockSetApiConfigurationField = jest.fn()
+ const modelInfo = {
+ maxTokens: 8192,
+ contextWindow: 200_000,
+ supportsImages: true,
+ supportsComputerUse: true,
+ supportsPromptCache: true,
+ inputPrice: 3.0,
+ outputPrice: 15.0,
+ cacheWritesPrice: 3.75,
+ cacheReadsPrice: 0.3,
+ }
+ const mockModels = {
+ model1: { name: "Model 1", description: "Test model 1", ...modelInfo },
+ model2: { name: "Model 2", description: "Test model 2", ...modelInfo },
+ }
const defaultProps = {
+ apiConfiguration: {},
defaultModelId: "model1",
- modelsKey: "glamaModels" as const,
- configKey: "glamaModelId" as const,
- infoKey: "glamaModelInfo" as const,
- refreshMessageType: "refreshGlamaModels" as const,
+ defaultModelInfo: modelInfo,
+ modelIdKey: "glamaModelId" as const,
+ modelInfoKey: "glamaModelInfo" as const,
serviceName: "Test Service",
serviceUrl: "https://test.service",
recommendedModel: "recommended-model",
- }
-
- const mockModels = {
- model1: { name: "Model 1", description: "Test model 1" },
- model2: { name: "Model 2", description: "Test model 2" },
+ models: mockModels,
+ setApiConfigurationField: mockSetApiConfigurationField,
}
beforeEach(() => {
jest.clearAllMocks()
- ;(useExtensionState as jest.Mock).mockReturnValue({
- apiConfiguration: {},
- setApiConfiguration: mockSetApiConfiguration,
- glamaModels: mockModels,
- onUpdateApiConfig: mockOnUpdateApiConfig,
- })
})
- it("calls onUpdateApiConfig when a model is selected", async () => {
+ it("calls setApiConfigurationField when a model is selected", async () => {
await act(async () => {
render()
})
@@ -67,20 +70,12 @@ describe("ModelPicker", () => {
await act(async () => {
// Find and click the model item by its value.
- const modelItem = screen.getByRole("option", { name: "model2" })
- fireEvent.click(modelItem)
+ const modelItem = screen.getByTestId("model-input")
+ fireEvent.input(modelItem, { target: { value: "model2" } })
})
// Verify the API config was updated.
- expect(mockSetApiConfiguration).toHaveBeenCalledWith({
- glamaModelId: "model2",
- glamaModelInfo: mockModels["model2"],
- })
-
- // Verify onUpdateApiConfig was called with the new config.
- expect(mockOnUpdateApiConfig).toHaveBeenCalledWith({
- glamaModelId: "model2",
- glamaModelInfo: mockModels["model2"],
- })
+ expect(mockSetApiConfigurationField).toHaveBeenCalledWith(defaultProps.modelIdKey, "model2")
+ expect(mockSetApiConfigurationField).toHaveBeenCalledWith(defaultProps.modelInfoKey, mockModels.model2)
})
})
diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts
index 19b13e2c6c..97c702637c 100644
--- a/webview-ui/src/utils/validate.ts
+++ b/webview-ui/src/utils/validate.ts
@@ -1,9 +1,4 @@
-import {
- ApiConfiguration,
- glamaDefaultModelId,
- openRouterDefaultModelId,
- unboundDefaultModelId,
-} from "../../../src/shared/api"
+import { ApiConfiguration } from "../../../src/shared/api"
import { ModelInfo } from "../../../src/shared/api"
export function validateApiConfiguration(apiConfiguration?: ApiConfiguration): string | undefined {
if (apiConfiguration) {
@@ -86,7 +81,7 @@ export function validateModelId(
if (apiConfiguration) {
switch (apiConfiguration.apiProvider) {
case "glama":
- const glamaModelId = apiConfiguration.glamaModelId || glamaDefaultModelId // in case the user hasn't changed the model id, it will be undefined by default
+ const glamaModelId = apiConfiguration.glamaModelId
if (!glamaModelId) {
return "You must provide a model ID."
}
@@ -96,7 +91,7 @@ export function validateModelId(
}
break
case "openrouter":
- const modelId = apiConfiguration.openRouterModelId || openRouterDefaultModelId // in case the user hasn't changed the model id, it will be undefined by default
+ const modelId = apiConfiguration.openRouterModelId
if (!modelId) {
return "You must provide a model ID."
}
@@ -106,7 +101,7 @@ export function validateModelId(
}
break
case "unbound":
- const unboundModelId = apiConfiguration.unboundModelId || unboundDefaultModelId
+ const unboundModelId = apiConfiguration.unboundModelId
if (!unboundModelId) {
return "You must provide a model ID."
}