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 "System" 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 ;
}