2023-04-01 12:49:20 -04:00
|
|
|
import React from 'react';
|
2023-04-05 02:46:22 +08:00
|
|
|
import { useRecoilValue } from 'recoil';
|
2023-03-31 13:12:06 -04:00
|
|
|
import TextareaAutosize from 'react-textarea-autosize';
|
2023-04-05 03:07:46 +08:00
|
|
|
import SelectDropdown from '../../ui/SelectDropdown';
|
2023-03-31 13:12:06 -04:00
|
|
|
import { Input } from '~/components/ui/Input.tsx';
|
|
|
|
|
import { Label } from '~/components/ui/Label.tsx';
|
|
|
|
|
import { Slider } from '~/components/ui/Slider.tsx';
|
2023-04-03 16:29:02 -04:00
|
|
|
// import { InputNumber } from '../../ui/InputNumber';
|
2023-03-31 16:08:52 -04:00
|
|
|
import OptionHover from './OptionHover';
|
style(Settings.jsx): remove unnecessary line break
style(Settings.jsx): add text-sm class to Label components
style(Settings.jsx): add flex, h-10, max-h-10, w-full, resize-none, px-3, py-2, focus:ring-0, focus:ring-offset-0, focus:ring-opacity-0, focus:outline-none classes to Input component
2023-03-31 21:45:29 -04:00
|
|
|
import { HoverCard, HoverCardTrigger } from '~/components/ui/HoverCard.tsx';
|
2023-03-31 13:12:06 -04:00
|
|
|
import { cn } from '~/utils/';
|
|
|
|
|
const defaultTextProps =
|
2023-04-02 04:40:13 +08:00
|
|
|
'rounded-md border border-gray-200 focus:border-slate-400 focus:bg-gray-50 bg-transparent text-sm shadow-[0_0_10px_rgba(0,0,0,0.05)] outline-none placeholder:text-gray-400 focus:outline-none focus:ring-gray-400 focus:ring-opacity-20 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-500 dark:bg-gray-700 focus:dark:bg-gray-600 dark:text-gray-50 dark:shadow-[0_0_15px_rgba(0,0,0,0.10)] dark:focus:border-gray-400 dark:focus:outline-none dark:focus:ring-0 dark:focus:ring-gray-400 dark:focus:ring-offset-0';
|
2023-03-31 13:12:06 -04:00
|
|
|
|
2023-03-31 16:08:52 -04:00
|
|
|
const optionText =
|
2023-04-01 14:33:26 +08:00
|
|
|
'p-0 shadow-none text-right pr-1 h-8 border-transparent focus:ring-[#10a37f] focus:ring-offset-0 focus:ring-opacity-100 hover:bg-gray-800/10 dark:hover:bg-white/10 focus:bg-gray-800/10 dark:focus:bg-white/10 transition-colors';
|
2023-03-31 13:12:06 -04:00
|
|
|
|
2023-04-05 02:46:22 +08:00
|
|
|
import store from '~/store';
|
|
|
|
|
|
2023-04-01 23:27:44 +08:00
|
|
|
function Settings(props) {
|
2023-04-04 13:11:59 +08:00
|
|
|
const { readonly, model, chatGptLabel, promptPrefix, temperature, topP, freqP, presP, setOption } = props;
|
|
|
|
|
|
2023-04-05 02:46:22 +08:00
|
|
|
const endpointsConfig = useRecoilValue(store.endpointsConfig);
|
|
|
|
|
|
2023-04-04 13:11:59 +08:00
|
|
|
const setModel = setOption('model');
|
|
|
|
|
const setChatGptLabel = setOption('chatGptLabel');
|
|
|
|
|
const setPromptPrefix = setOption('promptPrefix');
|
|
|
|
|
const setTemperature = setOption('temperature');
|
|
|
|
|
const setTopP = setOption('top_p');
|
|
|
|
|
const setFreqP = setOption('presence_penalty');
|
|
|
|
|
const setPresP = setOption('frequency_penalty');
|
2023-04-01 23:27:44 +08:00
|
|
|
|
2023-04-05 02:46:22 +08:00
|
|
|
const models = endpointsConfig?.['openAI']?.['availableModels'] || [];
|
|
|
|
|
|
2023-03-31 13:12:06 -04:00
|
|
|
return (
|
2023-03-31 18:38:58 -04:00
|
|
|
<>
|
2023-04-01 23:27:44 +08:00
|
|
|
<div className="grid gap-6 sm:grid-cols-2">
|
2023-04-01 14:33:26 +08:00
|
|
|
<div className="col-span-1 flex flex-col items-center justify-start gap-6">
|
|
|
|
|
<div className="grid w-full items-center gap-2">
|
2023-04-05 03:07:46 +08:00
|
|
|
<SelectDropdown
|
|
|
|
|
value={model}
|
2023-04-05 02:46:22 +08:00
|
|
|
setValue={setModel}
|
|
|
|
|
availableValues={models}
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-02 04:15:07 +08:00
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
'flex w-full resize-none focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
|
|
|
|
|
)}
|
|
|
|
|
containerClassName="flex w-full resize-none"
|
2023-04-02 00:57:27 +08:00
|
|
|
/>
|
2023-04-01 12:49:20 -04:00
|
|
|
{/* <Label
|
2023-04-01 14:33:26 +08:00
|
|
|
htmlFor="model"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
|
|
|
|
Model
|
|
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="model"
|
|
|
|
|
value={model}
|
|
|
|
|
// ref={inputRef}
|
|
|
|
|
onChange={e => setModel(e.target.value)}
|
|
|
|
|
placeholder="Set a custom name for ChatGPT"
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
'flex h-10 max-h-10 w-full resize-none px-3 py-2 focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
|
|
|
|
|
)}
|
2023-04-01 12:49:20 -04:00
|
|
|
/> */}
|
2023-04-01 14:33:26 +08:00
|
|
|
</div>
|
|
|
|
|
<div className="grid w-full items-center gap-2">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="chatGptLabel"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
2023-04-01 23:45:19 +08:00
|
|
|
Custom Name <small className="opacity-40">(default: blank)</small>
|
2023-04-01 14:33:26 +08:00
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="chatGptLabel"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 23:45:19 +08:00
|
|
|
value={chatGptLabel || ''}
|
2023-04-01 14:33:26 +08:00
|
|
|
// ref={inputRef}
|
2023-04-01 23:45:19 +08:00
|
|
|
onChange={e => setChatGptLabel(e.target.value || null)}
|
2023-04-01 14:33:26 +08:00
|
|
|
placeholder="Set a custom name for ChatGPT"
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
'flex h-10 max-h-10 w-full resize-none px-3 py-2 focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="grid w-full items-center gap-2">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="promptPrefix"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
2023-04-01 23:45:19 +08:00
|
|
|
Prompt Prefix <small className="opacity-40">(default: blank)</small>
|
2023-04-01 14:33:26 +08:00
|
|
|
</Label>
|
|
|
|
|
<TextareaAutosize
|
|
|
|
|
id="promptPrefix"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 23:45:19 +08:00
|
|
|
value={promptPrefix || ''}
|
|
|
|
|
onChange={e => setPromptPrefix(e.target.value || null)}
|
2023-04-01 14:33:26 +08:00
|
|
|
placeholder="Set custom instructions. Defaults to: 'You are ChatGPT, a large language model trained by OpenAI.'"
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
'flex max-h-[300px] min-h-[100px] w-full resize-none px-3 py-2 '
|
|
|
|
|
)}
|
|
|
|
|
// onFocus={() => {
|
|
|
|
|
// textareaRef.current.classList.remove('max-h-10');
|
|
|
|
|
// textareaRef.current.classList.add('max-h-52');
|
|
|
|
|
// }}
|
|
|
|
|
// onBlur={() => {
|
|
|
|
|
// textareaRef.current.classList.remove('max-h-52');
|
|
|
|
|
// textareaRef.current.classList.add('max-h-10');
|
|
|
|
|
// }}
|
|
|
|
|
// ref={textareaRef}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2023-03-31 18:38:58 -04:00
|
|
|
</div>
|
2023-04-01 14:33:26 +08:00
|
|
|
<div className="col-span-1 flex flex-col items-center justify-start gap-6">
|
|
|
|
|
<HoverCard>
|
|
|
|
|
<HoverCardTrigger className="grid w-full items-center gap-2">
|
|
|
|
|
<div className="flex justify-between">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="chatGptLabel"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
2023-04-01 23:45:19 +08:00
|
|
|
Temperature <small className="opacity-40">(default: 1)</small>
|
2023-04-01 14:33:26 +08:00
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="temp-int"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled
|
2023-04-01 14:33:26 +08:00
|
|
|
value={temperature}
|
|
|
|
|
onChange={e => setTemperature(e.target.value)}
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
cn(optionText, 'h-auto w-12 border-0 group-hover/temp:border-gray-200')
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Slider
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 14:33:26 +08:00
|
|
|
value={[temperature]}
|
2023-04-01 23:45:19 +08:00
|
|
|
onValueChange={value => setTemperature(value[0])}
|
2023-04-01 14:33:26 +08:00
|
|
|
max={2}
|
|
|
|
|
min={0}
|
|
|
|
|
step={0.01}
|
|
|
|
|
className="flex h-4 w-full"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCardTrigger>
|
|
|
|
|
<OptionHover
|
|
|
|
|
type="temp"
|
|
|
|
|
side="left"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCard>
|
|
|
|
|
|
2023-04-01 23:27:44 +08:00
|
|
|
{/* <HoverCard>
|
2023-04-01 14:33:26 +08:00
|
|
|
<HoverCardTrigger className="grid w-full items-center gap-2">
|
|
|
|
|
<div className="flex justify-between">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="chatGptLabel"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
|
|
|
|
Max tokens
|
|
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="max-tokens-int"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled
|
2023-04-01 14:33:26 +08:00
|
|
|
value={maxTokens}
|
|
|
|
|
onChange={e => setMaxTokens(e.target.value)}
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
cn(optionText, 'h-auto w-12 border-0 group-hover/temp:border-gray-200')
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Slider
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 14:33:26 +08:00
|
|
|
value={[maxTokens]}
|
2023-04-01 23:45:19 +08:00
|
|
|
onValueChange={value => setMaxTokens(value[0])}
|
2023-04-01 14:33:26 +08:00
|
|
|
max={2048} // should be dynamic to the currently selected model
|
|
|
|
|
min={1}
|
|
|
|
|
step={1}
|
|
|
|
|
className="flex h-4 w-full"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCardTrigger>
|
|
|
|
|
<OptionHover
|
|
|
|
|
type="max"
|
|
|
|
|
side="left"
|
|
|
|
|
/>
|
2023-04-01 23:27:44 +08:00
|
|
|
</HoverCard> */}
|
2023-04-01 14:33:26 +08:00
|
|
|
|
|
|
|
|
<HoverCard>
|
|
|
|
|
<HoverCardTrigger className="grid w-full items-center gap-2">
|
|
|
|
|
<div className="flex justify-between">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="chatGptLabel"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
2023-04-01 23:45:19 +08:00
|
|
|
Top P <small className="opacity-40">(default: 1)</small>
|
2023-04-01 14:33:26 +08:00
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="top-p-int"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled
|
2023-04-01 14:33:26 +08:00
|
|
|
value={topP}
|
|
|
|
|
onChange={e => setTopP(e.target.value)}
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
cn(optionText, 'h-auto w-12 border-0 group-hover/temp:border-gray-200')
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Slider
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 14:33:26 +08:00
|
|
|
value={[topP]}
|
2023-04-01 23:45:19 +08:00
|
|
|
onValueChange={value => setTopP(value[0])}
|
2023-04-01 14:33:26 +08:00
|
|
|
max={1}
|
|
|
|
|
min={0}
|
|
|
|
|
step={0.01}
|
|
|
|
|
className="flex h-4 w-full"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCardTrigger>
|
|
|
|
|
<OptionHover
|
|
|
|
|
type="topp"
|
|
|
|
|
side="left"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCard>
|
|
|
|
|
|
|
|
|
|
<HoverCard>
|
|
|
|
|
<HoverCardTrigger className="grid w-full items-center gap-2">
|
|
|
|
|
<div className="flex justify-between">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="chatGptLabel"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
2023-04-01 23:45:19 +08:00
|
|
|
Frequency Penalty <small className="opacity-40">(default: 0)</small>
|
2023-04-01 14:33:26 +08:00
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="freq-penalty-int"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled
|
2023-04-01 14:33:26 +08:00
|
|
|
value={freqP}
|
|
|
|
|
onChange={e => setFreqP(e.target.value)}
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
cn(optionText, 'h-auto w-12 border-0 group-hover/temp:border-gray-200')
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Slider
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 14:33:26 +08:00
|
|
|
value={[freqP]}
|
2023-04-01 23:45:19 +08:00
|
|
|
onValueChange={value => setFreqP(value[0])}
|
2023-04-01 14:33:26 +08:00
|
|
|
max={2}
|
|
|
|
|
min={-2}
|
|
|
|
|
step={0.01}
|
|
|
|
|
className="flex h-4 w-full"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCardTrigger>
|
|
|
|
|
<OptionHover
|
|
|
|
|
type="freq"
|
|
|
|
|
side="left"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCard>
|
|
|
|
|
|
|
|
|
|
<HoverCard>
|
|
|
|
|
<HoverCardTrigger className="grid w-full items-center gap-2">
|
|
|
|
|
<div className="flex justify-between">
|
|
|
|
|
<Label
|
|
|
|
|
htmlFor="chatGptLabel"
|
|
|
|
|
className="text-left text-sm font-medium"
|
|
|
|
|
>
|
2023-04-01 23:45:19 +08:00
|
|
|
Presence Penalty <small className="opacity-40">(default: 0)</small>
|
2023-04-01 14:33:26 +08:00
|
|
|
</Label>
|
|
|
|
|
<Input
|
|
|
|
|
id="pres-penalty-int"
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled
|
2023-04-01 14:33:26 +08:00
|
|
|
value={presP}
|
|
|
|
|
onChange={e => setPresP(e.target.value)}
|
|
|
|
|
className={cn(
|
|
|
|
|
defaultTextProps,
|
|
|
|
|
cn(optionText, 'h-auto w-12 border-0 group-hover/temp:border-gray-200')
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Slider
|
2023-04-04 01:12:14 +08:00
|
|
|
disabled={readonly}
|
2023-04-01 14:33:26 +08:00
|
|
|
value={[presP]}
|
2023-04-01 23:45:19 +08:00
|
|
|
onValueChange={value => setPresP(value[0])}
|
2023-04-01 14:33:26 +08:00
|
|
|
max={2}
|
|
|
|
|
min={-2}
|
|
|
|
|
step={0.01}
|
|
|
|
|
className="flex h-4 w-full"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCardTrigger>
|
|
|
|
|
<OptionHover
|
|
|
|
|
type="pres"
|
|
|
|
|
side="left"
|
|
|
|
|
/>
|
|
|
|
|
</HoverCard>
|
2023-03-31 13:12:06 -04:00
|
|
|
</div>
|
2023-03-31 18:38:58 -04:00
|
|
|
</div>
|
|
|
|
|
</>
|
2023-03-31 13:12:06 -04:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Settings;
|