chat-with-gpt/app/src/components/settings/options.tsx

89 lines
4.7 KiB
TypeScript
Raw Normal View History

2023-03-10 22:00:37 +00:00
import SettingsTab from "./tab";
import SettingsOption from "./option";
import { Button, Slider, Textarea } from "@mantine/core";
import { useCallback, useMemo } from "react";
2023-03-15 20:13:14 +00:00
import { defaultSystemPrompt, defaultModel } from "../../openai";
2023-03-10 22:00:37 +00:00
import { useAppDispatch, useAppSelector } from "../../store";
2023-03-15 20:13:14 +00:00
import { resetModel, setModel, selectModel, resetSystemPrompt, selectSystemPrompt, selectTemperature, setSystemPrompt, setTemperature } from "../../store/parameters";
2023-03-10 22:00:37 +00:00
import { selectSettingsOption } from "../../store/settings-ui";
2023-03-14 11:00:40 +00:00
import { FormattedMessage, useIntl } from "react-intl";
2023-03-10 22:00:37 +00:00
export default function GenerationOptionsTab(props: any) {
2023-03-14 11:00:40 +00:00
const intl = useIntl();
2023-03-10 22:00:37 +00:00
const option = useAppSelector(selectSettingsOption);
const initialSystemPrompt = useAppSelector(selectSystemPrompt);
2023-03-15 20:13:14 +00:00
const model = useAppSelector(selectModel);
2023-03-10 22:00:37 +00:00
const temperature = useAppSelector(selectTemperature);
const dispatch = useAppDispatch();
const onSystemPromptChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => dispatch(setSystemPrompt(event.target.value)), [dispatch]);
2023-03-15 20:13:14 +00:00
const onModelChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => dispatch(setModel(event.target.value)), [dispatch]);
2023-03-10 22:00:37 +00:00
const onResetSystemPrompt = useCallback(() => dispatch(resetSystemPrompt()), [dispatch]);
2023-03-15 20:13:14 +00:00
const onResetModel = useCallback(() => dispatch(resetModel()), [dispatch]);
2023-03-10 22:00:37 +00:00
const onTemperatureChange = useCallback((value: number) => dispatch(setTemperature(value)), [dispatch]);
2023-03-15 20:13:14 +00:00
const resettableSystemPromopt = initialSystemPrompt
2023-03-10 22:00:37 +00:00
&& (initialSystemPrompt?.trim() !== defaultSystemPrompt.trim());
2023-03-15 20:13:14 +00:00
const resettableModel = model
&& (model?.trim() !== defaultModel.trim());
2023-03-10 22:00:37 +00:00
const systemPromptOption = useMemo(() => (
2023-03-14 11:00:40 +00:00
<SettingsOption heading={intl.formatMessage({ defaultMessage: "System Prompt" })}
focused={option === 'system-prompt'}>
2023-03-10 22:00:37 +00:00
<Textarea
value={initialSystemPrompt || defaultSystemPrompt}
onChange={onSystemPromptChange}
minRows={5}
maxRows={10}
autosize />
<p style={{ marginBottom: '0.7rem' }}>
2023-03-14 11:00:40 +00:00
<FormattedMessage defaultMessage="The System Prompt is shown to ChatGPT by the &quot;System&quot; before your first message. The <code>'{{ datetime }}'</code> tag is automatically replaced by the current date and time."
values={{ code: chunk => <code style={{ whiteSpace: 'nowrap' }}>{chunk}</code> }} />
2023-03-10 22:00:37 +00:00
</p>
2023-03-15 20:13:14 +00:00
{resettableSystemPromopt && <Button size="xs" compact variant="light" onClick={onResetSystemPrompt}>
<FormattedMessage defaultMessage="Reset to default" />
</Button>}
</SettingsOption>
), [option, initialSystemPrompt, resettableSystemPromopt, onSystemPromptChange, onResetSystemPrompt]);
const modelOption = useMemo(() => (
<SettingsOption heading={intl.formatMessage({ defaultMessage: "Model" })}
focused={option === 'model'}>
<Textarea
value={model || defaultModel}
onChange={onModelChange}
minRows={1}
maxRows={1}
autosize />
<p style={{ marginBottom: '0.7rem' }}>
2023-03-15 20:22:48 +00:00
<FormattedMessage defaultMessage="The model name. You can find model names here: https://platform.openai.com/docs/models/overview"
2023-03-15 20:13:14 +00:00
values={{ code: chunk => <code style={{ whiteSpace: 'nowrap' }}>{chunk}</code> }} />
</p>
{resettableModel && <Button size="xs" compact variant="light" onClick={onResetModel}>
2023-03-14 11:00:40 +00:00
<FormattedMessage defaultMessage="Reset to default" />
2023-03-10 22:00:37 +00:00
</Button>}
</SettingsOption>
2023-03-15 20:13:14 +00:00
), [option, model, resettableModel, onModelChange, onResetModel]);
2023-03-10 22:00:37 +00:00
const temperatureOption = useMemo(() => (
2023-03-14 11:00:40 +00:00
<SettingsOption heading={intl.formatMessage({ defaultMessage: "Temperature: {temperature, number, ::.0}", }, { temperature })}
focused={option === 'temperature'}>
2023-03-10 22:00:37 +00:00
<Slider value={temperature} onChange={onTemperatureChange} step={0.1} min={0} max={1} precision={3} />
2023-03-14 11:00:40 +00:00
<p>
<FormattedMessage defaultMessage="The temperature parameter controls the randomness of the AI's responses. Lower values will make the AI more predictable, while higher values will make it more creative." />
</p>
2023-03-10 22:00:37 +00:00
</SettingsOption>
), [temperature, option, onTemperatureChange]);
const elem = useMemo(() => (
<SettingsTab name="options">
{systemPromptOption}
2023-03-15 20:13:14 +00:00
{modelOption}
2023-03-10 22:00:37 +00:00
{temperatureOption}
</SettingsTab>
2023-03-15 20:13:14 +00:00
), [systemPromptOption, modelOption, temperatureOption]);
2023-03-10 22:00:37 +00:00
return elem;
}