Skip to content

Commit 58e9aac

Browse files
committed
Fix defaults
1 parent 110bcaf commit 58e9aac

1 file changed

Lines changed: 47 additions & 20 deletions

File tree

webapp/_webapp/src/views/settings/sections/api-key-settings.tsx

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useRef, useState } from "react";
1+
import { useRef, useState, useEffect } from "react";
22
import { Icon } from "@iconify/react";
33
import { Modal } from "../../../components/modal";
44
import { SettingsSectionContainer, SettingsSectionTitle } from "./components";
@@ -104,19 +104,31 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
104104
const { models } = useLanguageModels();
105105
const { settings } = useSettingStore();
106106

107+
var availableModels = models.filter((m) => !Array.from(settings?.customModels || []).some((cm) => cm.slug == m.slug));
108+
var firstAvailable = availableModels[0] ?? { slug: "", name: "" };
109+
107110
const [isEditing, setIsEditing] = useState(isNew);
108111
const [baseUrl, setBaseUrl] = useState(customModel?.baseUrl || "");
109-
const [slug, setSlug] = useState(customModel?.slug || "");
112+
const [slug, setSlug] = useState(customModel?.slug ?? firstAvailable.slug);
110113
const [apiKey, setApiKey] = useState(customModel?.apiKey || "");
111114
const [contextWindow, setContextWindow] = useState<number>(customModel?.contextWindow || 0);
112115
const [maxOutput, setMaxOutput] = useState<number>(customModel?.maxOutput || 0);
113116
const [inputPrice, setInputPrice] = useState<number>(customModel?.inputPrice || 0);
114117
const [outputPrice, setOutputPrice] = useState<number>(customModel?.outputPrice || 0);
115-
const [modelName, setModelName] = useState(isNew ? models[0].name : customModel.name);
118+
const [modelName, setModelName] = useState(isNew ? firstAvailable.name : customModel?.name || "");
116119
const isModelNameEdited = useRef(false);
117120

121+
useEffect(() => {
122+
if (!isNew) return;
123+
const firstAvailable = availableModels[0] ?? { slug: "", name: "" };
124+
if (!isModelNameEdited.current) {
125+
setModelName(firstAvailable.name);
126+
}
127+
setSlug(firstAvailable.slug);
128+
}, [models?.length, settings?.customModels?.length, isNew]);
129+
118130
const baseInputClassName = "hover:cursor-pointer bg-transparent p-1 focus:outline-none";
119-
const nameInputClassName = `${baseInputClassName} text-sm text-default-900 font-medium`;
131+
const nameInputClassName = `${baseInputClassName} text-sm text-default-900 font-medium flex-1 truncate`;
120132
const labelClassName = `${baseInputClassName} text-xs text-default-900 w-auto`;
121133
const detailInputClassName = `${baseInputClassName} text-xs text-default-400 font-normal flex-1`;
122134

@@ -139,9 +151,11 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
139151
);
140152

141153
if (isNew) {
142-
setModelName(models[0].name);
154+
availableModels = availableModels.filter((m) => m.slug != slug);
155+
const next = availableModels[0] ?? { slug: "", name: "" };
156+
setModelName(next.name);
143157
setBaseUrl("");
144-
setSlug("");
158+
setSlug(next.slug);
145159
setApiKey("");
146160
setContextWindow(0);
147161
setMaxOutput(0);
@@ -150,7 +164,6 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
150164
}
151165
};
152166

153-
// TODO: Multiple models per key
154167
return (
155168
<div className="flex flex-col w-full pl-1">
156169
<div className="flex flex-row justify-between">
@@ -167,7 +180,15 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
167180

168181
{isNew ? (
169182
<Tooltip content="Add" placement="bottom" className="noselect" delay={500}>
170-
<button onClick={() => handleOnChange(false)} className="p-1 hover:bg-default-100 rounded">
183+
<button
184+
onClick={() => {
185+
if (availableModels.length > 0) {
186+
handleOnChange(false);
187+
}
188+
}}
189+
className="p-1 hover:bg-default-100 rounded"
190+
disabled={availableModels.length === 0}
191+
>
171192
<Icon icon="tabler:device-floppy" width="16" />
172193
</button>
173194
</Tooltip>
@@ -203,23 +224,29 @@ const CustomModelSection = ({ isNew, onChange, model: customModel }: CustomModel
203224
disabled={!isEditing}
204225
onChange={(e) => {
205226
setSlug(e.target.value);
206-
if (!isModelNameEdited.current) {
227+
if (!isModelNameEdited.current && isNew) {
207228
// Custom name not yet defined, default to the selected model's name
208-
setModelName(models.filter((m) => m.slug == e.target.value)[0].name);
229+
const m = availableModels.find((mo) => mo.slug == e.target.value);
230+
if (m) setModelName(m.name);
209231
}
210232
}}
233+
value={slug}
211234
>
212-
{models
213-
.filter(
214-
(m) =>
215-
(!isNew && m.slug == slug) ||
216-
!Array.from(settings?.customModels || []).some((cm) => cm.slug == m.slug),
217-
)
218-
.map((m) => (
219-
<option selected={slug == m.slug} key={m.slug} value={m.slug}>
220-
{m.slug}
235+
{isNew ? (
236+
availableModels.length > 0 ? (
237+
availableModels.map((m) => (
238+
<option key={m.slug} value={m.slug}>
239+
{m.slug}
240+
</option>
241+
))
242+
) : (
243+
<option disabled value="">
244+
No available models
221245
</option>
222-
))}
246+
)
247+
) : (
248+
<option>{slug}</option>
249+
)}
223250
</select>
224251
</div>
225252

0 commit comments

Comments
 (0)