212 lines
6.1 KiB
TypeScript
212 lines
6.1 KiB
TypeScript
import { ListItem } from "@/app/components/List";
|
|
import {
|
|
ModalConfigValidator,
|
|
ModelConfig,
|
|
useAppConfig,
|
|
} from "@/app/store/config";
|
|
import { useAllModels } from "@/app/utils/hooks";
|
|
import Locale from "@/app/locales";
|
|
import Select from "@/app/components/Select";
|
|
import SlideRange from "@/app/components/SlideRange";
|
|
import Switch from "@/app/components/Switch";
|
|
import Input from "@/app/components/Input";
|
|
|
|
export default function ModelSetting(props: {
|
|
modelConfig: ModelConfig;
|
|
updateConfig: (updater: (config: ModelConfig) => void) => void;
|
|
}) {
|
|
const allModels = useAllModels();
|
|
const { isMobileScreen } = useAppConfig();
|
|
|
|
return (
|
|
<>
|
|
<ListItem title={Locale.Settings.Model}>
|
|
<Select
|
|
value={props.modelConfig.model}
|
|
options={allModels
|
|
.filter((v) => v.available)
|
|
.map((v) => ({
|
|
value: v.name,
|
|
label: `${v.displayName}(${v.provider?.providerName})`,
|
|
}))}
|
|
onSelect={(e) => {
|
|
props.updateConfig(
|
|
(config) => (config.model = ModalConfigValidator.model(e)),
|
|
);
|
|
}}
|
|
/>
|
|
</ListItem>
|
|
<ListItem
|
|
title={Locale.Settings.Temperature.Title}
|
|
subTitle={Locale.Settings.Temperature.SubTitle}
|
|
>
|
|
<SlideRange
|
|
value={props.modelConfig.temperature}
|
|
range={{
|
|
start: 0,
|
|
stroke: 1,
|
|
}}
|
|
step={0.1}
|
|
onSlide={(e) => {
|
|
props.updateConfig(
|
|
(config) =>
|
|
(config.temperature = ModalConfigValidator.temperature(e)),
|
|
);
|
|
}}
|
|
></SlideRange>
|
|
</ListItem>
|
|
<ListItem
|
|
title={Locale.Settings.TopP.Title}
|
|
subTitle={Locale.Settings.TopP.SubTitle}
|
|
>
|
|
<SlideRange
|
|
value={props.modelConfig.top_p ?? 1}
|
|
range={{
|
|
start: 0,
|
|
stroke: 1,
|
|
}}
|
|
step={0.1}
|
|
onSlide={(e) => {
|
|
props.updateConfig(
|
|
(config) => (config.top_p = ModalConfigValidator.top_p(e)),
|
|
);
|
|
}}
|
|
></SlideRange>
|
|
</ListItem>
|
|
<ListItem
|
|
title={Locale.Settings.MaxTokens.Title}
|
|
subTitle={Locale.Settings.MaxTokens.SubTitle}
|
|
>
|
|
<Input
|
|
type="number"
|
|
min={1024}
|
|
max={512000}
|
|
value={props.modelConfig.max_tokens}
|
|
onChange={(e) =>
|
|
props.updateConfig(
|
|
(config) =>
|
|
(config.max_tokens = ModalConfigValidator.max_tokens(e)),
|
|
)
|
|
}
|
|
></Input>
|
|
</ListItem>
|
|
|
|
{props.modelConfig.model.startsWith("gemini") ? null : (
|
|
<>
|
|
<ListItem
|
|
title={Locale.Settings.PresencePenalty.Title}
|
|
subTitle={Locale.Settings.PresencePenalty.SubTitle}
|
|
>
|
|
<SlideRange
|
|
value={props.modelConfig.presence_penalty}
|
|
range={{
|
|
start: -2,
|
|
stroke: 4,
|
|
}}
|
|
step={0.1}
|
|
onSlide={(e) => {
|
|
props.updateConfig(
|
|
(config) =>
|
|
(config.presence_penalty =
|
|
ModalConfigValidator.presence_penalty(e)),
|
|
);
|
|
}}
|
|
></SlideRange>
|
|
</ListItem>
|
|
|
|
<ListItem
|
|
title={Locale.Settings.FrequencyPenalty.Title}
|
|
subTitle={Locale.Settings.FrequencyPenalty.SubTitle}
|
|
>
|
|
<SlideRange
|
|
value={props.modelConfig.frequency_penalty}
|
|
range={{
|
|
start: -2,
|
|
stroke: 4,
|
|
}}
|
|
step={0.1}
|
|
onSlide={(e) => {
|
|
props.updateConfig(
|
|
(config) =>
|
|
(config.frequency_penalty =
|
|
ModalConfigValidator.frequency_penalty(e)),
|
|
);
|
|
}}
|
|
></SlideRange>
|
|
</ListItem>
|
|
|
|
<ListItem
|
|
title={Locale.Settings.InjectSystemPrompts.Title}
|
|
subTitle={Locale.Settings.InjectSystemPrompts.SubTitle}
|
|
>
|
|
<Switch
|
|
value={props.modelConfig.enableInjectSystemPrompts}
|
|
onChange={(e) =>
|
|
props.updateConfig(
|
|
(config) => (config.enableInjectSystemPrompts = e),
|
|
)
|
|
}
|
|
/>
|
|
</ListItem>
|
|
|
|
<ListItem
|
|
title={Locale.Settings.InputTemplate.Title}
|
|
subTitle={Locale.Settings.InputTemplate.SubTitle}
|
|
nextline={isMobileScreen}
|
|
>
|
|
<Input
|
|
type="text"
|
|
value={props.modelConfig.template}
|
|
onChange={(e = "") =>
|
|
props.updateConfig((config) => (config.template = e))
|
|
}
|
|
className="text-center"
|
|
></Input>
|
|
</ListItem>
|
|
</>
|
|
)}
|
|
<ListItem
|
|
title={Locale.Settings.HistoryCount.Title}
|
|
subTitle={Locale.Settings.HistoryCount.SubTitle}
|
|
>
|
|
<SlideRange
|
|
value={props.modelConfig.historyMessageCount}
|
|
range={{
|
|
start: 0,
|
|
stroke: 64,
|
|
}}
|
|
step={1}
|
|
onSlide={(e) => {
|
|
props.updateConfig((config) => (config.historyMessageCount = e));
|
|
}}
|
|
></SlideRange>
|
|
</ListItem>
|
|
|
|
<ListItem
|
|
title={Locale.Settings.CompressThreshold.Title}
|
|
subTitle={Locale.Settings.CompressThreshold.SubTitle}
|
|
>
|
|
<Input
|
|
type="number"
|
|
min={500}
|
|
max={4000}
|
|
value={props.modelConfig.compressMessageLengthThreshold}
|
|
onChange={(e) =>
|
|
props.updateConfig(
|
|
(config) => (config.compressMessageLengthThreshold = e),
|
|
)
|
|
}
|
|
></Input>
|
|
</ListItem>
|
|
<ListItem title={Locale.Memory.Title} subTitle={Locale.Memory.Send}>
|
|
<Switch
|
|
value={props.modelConfig.sendMemory}
|
|
onChange={(e) =>
|
|
props.updateConfig((config) => (config.sendMemory = e))
|
|
}
|
|
/>
|
|
</ListItem>
|
|
</>
|
|
);
|
|
}
|