add experimental params to client-side state
This commit is contained in:
parent
6f35b57e6e
commit
6c3e02aa44
|
@ -3,41 +3,28 @@ import { mustDefault, mustExist } from '@apextoaster/js-utils';
|
||||||
import { Checkbox, FormControlLabel, Stack, TextField } from '@mui/material';
|
import { Checkbox, FormControlLabel, Stack, TextField } from '@mui/material';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useState } from 'react';
|
|
||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
import { useStore } from 'zustand';
|
||||||
|
|
||||||
import { STALE_TIME, STANDARD_SPACING } from '../../constants.js';
|
import { STALE_TIME, STANDARD_SPACING } from '../../constants.js';
|
||||||
import { NumericField } from '../input/NumericField.js';
|
import { NumericField } from '../input/NumericField.js';
|
||||||
import { QueryList } from '../input/QueryList.js';
|
import { QueryList } from '../input/QueryList.js';
|
||||||
import { ClientContext } from '../../state/full.js';
|
import { ClientContext, OnnxState, StateContext } from '../../state/full.js';
|
||||||
|
import { ExperimentalParams } from '../../types/params.js';
|
||||||
export interface ExperimentalParams {
|
|
||||||
latent_symmetry: boolean;
|
|
||||||
latent_symmetry_gradient_start: number;
|
|
||||||
latent_symmetry_gradient_end: number;
|
|
||||||
latent_symmetry_line_of_symmetry: number;
|
|
||||||
prompt_editing: boolean;
|
|
||||||
prompt_filter: string;
|
|
||||||
remove_tokens: string;
|
|
||||||
add_suffix: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ExperimentalControlProps {
|
export interface ExperimentalControlProps {
|
||||||
|
selectExperimental(state: OnnxState): ExperimentalParams;
|
||||||
setExperimental(params: Record<string, unknown>): void;
|
setExperimental(params: Record<string, unknown>): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ExperimentalControl(props: ExperimentalControlProps) {
|
export function ExperimentalControl(props: ExperimentalControlProps) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
|
const { selectExperimental, setExperimental } = props;
|
||||||
|
|
||||||
|
const store = mustExist(React.useContext(StateContext));
|
||||||
|
const experimental = useStore(store, selectExperimental);
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [state, setState] = useState<ExperimentalParams>({
|
|
||||||
latent_symmetry: false,
|
|
||||||
latent_symmetry_gradient_start: 0.1,
|
|
||||||
latent_symmetry_gradient_end: 0.3,
|
|
||||||
latent_symmetry_line_of_symmetry: 0.5,
|
|
||||||
prompt_editing: false,
|
|
||||||
prompt_filter: '',
|
|
||||||
remove_tokens: '',
|
|
||||||
add_suffix: '',
|
|
||||||
});
|
|
||||||
|
|
||||||
const client = mustExist(React.useContext(ClientContext));
|
const client = mustExist(React.useContext(ClientContext));
|
||||||
const filters = useQuery(['filters'], async () => client.filters(), {
|
const filters = useQuery(['filters'], async () => client.filters(), {
|
||||||
|
@ -50,58 +37,66 @@ export function ExperimentalControl(props: ExperimentalControlProps) {
|
||||||
label={t('experimental.latent_symmetry.label')}
|
label={t('experimental.latent_symmetry.label')}
|
||||||
control={
|
control={
|
||||||
<Checkbox
|
<Checkbox
|
||||||
checked={state.latent_symmetry}
|
checked={experimental.latentSymmetry.enabled}
|
||||||
value='check'
|
value='check'
|
||||||
onChange={(event) => {
|
onChange={(event) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
latentSymmetry: {
|
||||||
latent_symmetry: state.latent_symmetry === false,
|
...experimental.latentSymmetry,
|
||||||
|
enabled: experimental.latentSymmetry.enabled === false,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>}
|
/>}
|
||||||
/>
|
/>
|
||||||
<NumericField
|
<NumericField
|
||||||
decimal
|
decimal
|
||||||
disabled={state.latent_symmetry === false}
|
disabled={experimental.latentSymmetry.enabled === false}
|
||||||
label={t('experimental.latent_symmetry.gradient_start')}
|
label={t('experimental.latent_symmetry.gradient_start')}
|
||||||
min={0}
|
min={0}
|
||||||
max={0.5}
|
max={0.5}
|
||||||
step={0.01}
|
step={0.01}
|
||||||
value={state.latent_symmetry_gradient_start}
|
value={experimental.latentSymmetry.gradientStart}
|
||||||
onChange={(latent_symmetry_gradient_start) => {
|
onChange={(latent_symmetry_gradient_start) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
latentSymmetry: {
|
||||||
latent_symmetry_gradient_start,
|
...experimental.latentSymmetry,
|
||||||
|
gradientStart: latent_symmetry_gradient_start,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<NumericField
|
<NumericField
|
||||||
decimal
|
decimal
|
||||||
disabled={state.latent_symmetry === false}
|
disabled={experimental.latentSymmetry.enabled === false}
|
||||||
label={t('experimental.latent_symmetry.gradient_end')}
|
label={t('experimental.latent_symmetry.gradient_end')}
|
||||||
min={0}
|
min={0}
|
||||||
max={0.5}
|
max={0.5}
|
||||||
step={0.01}
|
step={0.01}
|
||||||
value={state.latent_symmetry_gradient_end}
|
value={experimental.latentSymmetry.gradientEnd}
|
||||||
onChange={(latent_symmetry_gradient_end) => {
|
onChange={(latent_symmetry_gradient_end) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
latentSymmetry: {
|
||||||
latent_symmetry_gradient_end,
|
...experimental.latentSymmetry,
|
||||||
|
gradientEnd: latent_symmetry_gradient_end,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<NumericField
|
<NumericField
|
||||||
decimal
|
decimal
|
||||||
disabled={state.latent_symmetry === false}
|
disabled={experimental.latentSymmetry.enabled === false}
|
||||||
label={t('experimental.latent_symmetry.line_of_symmetry')}
|
label={t('experimental.latent_symmetry.line_of_symmetry')}
|
||||||
min={0}
|
min={0}
|
||||||
max={1}
|
max={1}
|
||||||
step={0.01}
|
step={0.01}
|
||||||
value={state.latent_symmetry_line_of_symmetry}
|
value={experimental.latentSymmetry.lineOfSymmetry}
|
||||||
onChange={(latent_symmetry_line_of_symmetry) => {
|
onChange={(latent_symmetry_line_of_symmetry) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
latentSymmetry: {
|
||||||
latent_symmetry_line_of_symmetry,
|
...experimental.latentSymmetry,
|
||||||
|
lineOfSymmetry: latent_symmetry_line_of_symmetry,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
@ -111,18 +106,20 @@ export function ExperimentalControl(props: ExperimentalControlProps) {
|
||||||
label={t('experimental.prompt_editing.label')}
|
label={t('experimental.prompt_editing.label')}
|
||||||
control={
|
control={
|
||||||
<Checkbox
|
<Checkbox
|
||||||
checked={state.prompt_editing}
|
checked={experimental.promptEditing.enabled}
|
||||||
value='check'
|
value='check'
|
||||||
onChange={(event) => {
|
onChange={(event) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
promptEditing: {
|
||||||
prompt_editing: state.prompt_editing === false,
|
...experimental.promptEditing,
|
||||||
|
enabled: experimental.promptEditing.enabled === false,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>}
|
/>}
|
||||||
/>
|
/>
|
||||||
<QueryList
|
<QueryList
|
||||||
disabled={state.prompt_editing === false}
|
disabled={experimental.promptEditing.enabled === false}
|
||||||
id='prompt_filters'
|
id='prompt_filters'
|
||||||
labelKey='model.prompt'
|
labelKey='model.prompt'
|
||||||
name={t('experimental.prompt_editing.filter')}
|
name={t('experimental.prompt_editing.filter')}
|
||||||
|
@ -130,35 +127,41 @@ export function ExperimentalControl(props: ExperimentalControlProps) {
|
||||||
result: filters,
|
result: filters,
|
||||||
selector: (f) => f.prompt,
|
selector: (f) => f.prompt,
|
||||||
}}
|
}}
|
||||||
value={mustDefault(state.prompt_filter, '')}
|
value={mustDefault(experimental.promptEditing.filter, '')}
|
||||||
onChange={(prompt_filter) => {
|
onChange={(prompt_filter) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
promptEditing: {
|
||||||
prompt_filter,
|
...experimental.promptEditing,
|
||||||
|
filter: prompt_filter,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<TextField
|
<TextField
|
||||||
disabled={state.prompt_editing === false}
|
disabled={experimental.promptEditing.enabled === false}
|
||||||
label={t('experimental.prompt_editing.remove_tokens')}
|
label={t('experimental.prompt_editing.remove_tokens')}
|
||||||
variant='outlined'
|
variant='outlined'
|
||||||
value={state.remove_tokens}
|
value={experimental.promptEditing.removeTokens}
|
||||||
onChange={(event) => {
|
onChange={(event) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
promptEditing: {
|
||||||
remove_tokens: event.target.value,
|
...experimental.promptEditing,
|
||||||
|
removeTokens: event.target.value,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<TextField
|
<TextField
|
||||||
disabled={state.prompt_editing === false}
|
disabled={experimental.promptEditing.enabled === false}
|
||||||
label={t('experimental.prompt_editing.add_suffix')}
|
label={t('experimental.prompt_editing.add_suffix')}
|
||||||
variant='outlined'
|
variant='outlined'
|
||||||
value={state.add_suffix}
|
value={experimental.promptEditing.addSuffix}
|
||||||
onChange={(event) => {
|
onChange={(event) => {
|
||||||
setState({
|
setExperimental({
|
||||||
...state,
|
promptEditing: {
|
||||||
add_suffix: event.target.value,
|
...experimental.promptEditing,
|
||||||
|
addSuffix: event.target.value,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { IMAGE_FILTER, STALE_TIME, STANDARD_SPACING } from '../../constants.js';
|
||||||
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
|
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
|
||||||
import { TabState } from '../../state/types.js';
|
import { TabState } from '../../state/types.js';
|
||||||
import { JobType } from '../../types/api-v2.js';
|
import { JobType } from '../../types/api-v2.js';
|
||||||
import { HighresParams, Img2ImgParams, ModelParams, UpscaleParams } from '../../types/params.js';
|
import { ExperimentalParams, HighresParams, Img2ImgParams, ModelParams, UpscaleParams } from '../../types/params.js';
|
||||||
import { Profiles } from '../Profiles.js';
|
import { Profiles } from '../Profiles.js';
|
||||||
import { HighresControl } from '../control/HighresControl.js';
|
import { HighresControl } from '../control/HighresControl.js';
|
||||||
import { ImageControl } from '../control/ImageControl.js';
|
import { ImageControl } from '../control/ImageControl.js';
|
||||||
|
@ -51,7 +51,7 @@ export function Img2Img() {
|
||||||
});
|
});
|
||||||
|
|
||||||
const store = mustExist(useContext(StateContext));
|
const store = mustExist(useContext(StateContext));
|
||||||
const { pushHistory, setHighres, setImg2Img, setModel, setUpscale } = useStore(store, selectActions, shallow);
|
const { pushHistory, setHighres, setImg2Img, setModel, setUpscale, setExperimental } = useStore(store, selectActions, shallow);
|
||||||
const { loopback, source, sourceFilter, strength } = useStore(store, selectReactParams, shallow);
|
const { loopback, source, sourceFilter, strength } = useStore(store, selectReactParams, shallow);
|
||||||
const model = useStore(store, selectModel);
|
const model = useStore(store, selectModel);
|
||||||
|
|
||||||
|
@ -141,10 +141,7 @@ export function Img2Img() {
|
||||||
</Stack>
|
</Stack>
|
||||||
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
|
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
|
||||||
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
|
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
|
||||||
<ExperimentalControl setExperimental={(props) => {
|
<ExperimentalControl selectExperimental={selectExperimental} setExperimental={setExperimental} />
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log('setting experimental props', props);
|
|
||||||
}} />
|
|
||||||
<Button
|
<Button
|
||||||
disabled={doesExist(source) === false}
|
disabled={doesExist(source) === false}
|
||||||
variant='contained'
|
variant='contained'
|
||||||
|
@ -166,6 +163,8 @@ export function selectActions(state: OnnxState) {
|
||||||
setModel: state.setImg2ImgModel,
|
setModel: state.setImg2ImgModel,
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
setUpscale: state.setImg2ImgUpscale,
|
setUpscale: state.setImg2ImgUpscale,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
|
setExperimental: state.setImg2ImgExperimental,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,3 +192,7 @@ export function selectHighres(state: OnnxState): HighresParams {
|
||||||
export function selectUpscale(state: OnnxState): UpscaleParams {
|
export function selectUpscale(state: OnnxState): UpscaleParams {
|
||||||
return state.img2imgUpscale;
|
return state.img2imgUpscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function selectExperimental(state: OnnxState): ExperimentalParams {
|
||||||
|
return state.img2imgExperimental;
|
||||||
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { IMAGE_FILTER, STALE_TIME, STANDARD_SPACING } from '../../constants.js';
|
||||||
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
|
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
|
||||||
import { TabState } from '../../state/types.js';
|
import { TabState } from '../../state/types.js';
|
||||||
import { JobType } from '../../types/api-v2.js';
|
import { JobType } from '../../types/api-v2.js';
|
||||||
import { BrushParams, HighresParams, InpaintParams, ModelParams, UpscaleParams } from '../../types/params.js';
|
import { BrushParams, ExperimentalParams, HighresParams, InpaintParams, ModelParams, UpscaleParams } from '../../types/params.js';
|
||||||
import { Profiles } from '../Profiles.js';
|
import { Profiles } from '../Profiles.js';
|
||||||
import { HighresControl } from '../control/HighresControl.js';
|
import { HighresControl } from '../control/HighresControl.js';
|
||||||
import { ImageControl } from '../control/ImageControl.js';
|
import { ImageControl } from '../control/ImageControl.js';
|
||||||
|
@ -69,7 +69,7 @@ export function Inpaint() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const store = mustExist(useContext(StateContext));
|
const store = mustExist(useContext(StateContext));
|
||||||
const { pushHistory, setBrush, setHighres, setModel, setInpaint, setUpscale } = useStore(store, selectActions, shallow);
|
const { pushHistory, setBrush, setHighres, setModel, setInpaint, setUpscale, setExperimental } = useStore(store, selectActions, shallow);
|
||||||
const { source, mask, strength, noise, filter, tileOrder, fillColor } = useStore(store, selectReactParams, shallow);
|
const { source, mask, strength, noise, filter, tileOrder, fillColor } = useStore(store, selectReactParams, shallow);
|
||||||
const model = useStore(store, selectModel);
|
const model = useStore(store, selectModel);
|
||||||
const brush = useStore(store, selectBrush);
|
const brush = useStore(store, selectBrush);
|
||||||
|
@ -223,10 +223,7 @@ export function Inpaint() {
|
||||||
<OutpaintControl />
|
<OutpaintControl />
|
||||||
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
|
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
|
||||||
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
|
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
|
||||||
<ExperimentalControl setExperimental={(props) => {
|
<ExperimentalControl selectExperimental={selectExperimental} setExperimental={setExperimental} />
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log('setting experimental props', props);
|
|
||||||
}} />
|
|
||||||
<Button
|
<Button
|
||||||
disabled={preventInpaint()}
|
disabled={preventInpaint()}
|
||||||
variant='contained'
|
variant='contained'
|
||||||
|
@ -244,6 +241,8 @@ export function selectActions(state: OnnxState) {
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
setBrush: state.setInpaintBrush,
|
setBrush: state.setInpaintBrush,
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
|
setExperimental: state.setInpaintExperimental,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
setHighres: state.setInpaintHighres,
|
setHighres: state.setInpaintHighres,
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
setModel: state.setInpaintModel,
|
setModel: state.setInpaintModel,
|
||||||
|
@ -285,3 +284,7 @@ export function selectHighres(state: OnnxState): HighresParams {
|
||||||
export function selectUpscale(state: OnnxState): UpscaleParams {
|
export function selectUpscale(state: OnnxState): UpscaleParams {
|
||||||
return state.inpaintUpscale;
|
return state.inpaintUpscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function selectExperimental(state: OnnxState): ExperimentalParams {
|
||||||
|
return state.inpaintExperimental;
|
||||||
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { STANDARD_SPACING } from '../../constants.js';
|
||||||
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
|
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
|
||||||
import { TabState } from '../../state/types.js';
|
import { TabState } from '../../state/types.js';
|
||||||
import { JobType } from '../../types/api-v2.js';
|
import { JobType } from '../../types/api-v2.js';
|
||||||
import { HighresParams, ModelParams, Txt2ImgParams, UpscaleParams } from '../../types/params.js';
|
import { ExperimentalParams, HighresParams, ModelParams, Txt2ImgParams, UpscaleParams } from '../../types/params.js';
|
||||||
import { Profiles } from '../Profiles.js';
|
import { Profiles } from '../Profiles.js';
|
||||||
import { HighresControl } from '../control/HighresControl.js';
|
import { HighresControl } from '../control/HighresControl.js';
|
||||||
import { ImageControl } from '../control/ImageControl.js';
|
import { ImageControl } from '../control/ImageControl.js';
|
||||||
|
@ -84,7 +84,7 @@ export function Txt2Img() {
|
||||||
});
|
});
|
||||||
|
|
||||||
const store = mustExist(useContext(StateContext));
|
const store = mustExist(useContext(StateContext));
|
||||||
const { pushHistory, setHighres, setModel, setParams, setUpscale, setVariable } = useStore(store, selectActions, shallow);
|
const { pushHistory, setHighres, setModel, setParams, setUpscale, setVariable, setExperimental } = useStore(store, selectActions, shallow);
|
||||||
const model = useStore(store, selectModel);
|
const model = useStore(store, selectModel);
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
@ -106,10 +106,7 @@ export function Txt2Img() {
|
||||||
<SizeControl />
|
<SizeControl />
|
||||||
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
|
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
|
||||||
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
|
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
|
||||||
<ExperimentalControl setExperimental={(props) => {
|
<ExperimentalControl selectExperimental={selectExperimental} setExperimental={setExperimental} />
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log('setting experimental props', props);
|
|
||||||
}} />
|
|
||||||
<VariableControl selectGrid={selectVariable} setGrid={setVariable} />
|
<VariableControl selectGrid={selectVariable} setGrid={setVariable} />
|
||||||
<Button
|
<Button
|
||||||
variant='contained'
|
variant='contained'
|
||||||
|
@ -124,6 +121,8 @@ export function selectActions(state: OnnxState) {
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
pushHistory: state.pushHistory,
|
pushHistory: state.pushHistory,
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
|
setExperimental: state.setTxt2ImgExperimental,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
setHighres: state.setTxt2ImgHighres,
|
setHighres: state.setTxt2ImgHighres,
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
setModel: state.setTxt2ImgModel,
|
setModel: state.setTxt2ImgModel,
|
||||||
|
@ -162,3 +161,7 @@ export function selectUpscale(state: OnnxState): UpscaleParams {
|
||||||
export function selectVariable(state: OnnxState): PipelineGrid {
|
export function selectVariable(state: OnnxState): PipelineGrid {
|
||||||
return state.txt2imgVariable;
|
return state.txt2imgVariable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function selectExperimental(state: OnnxState): ExperimentalParams {
|
||||||
|
return state.txt2imgExperimental;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { doesExist, Maybe } from '@apextoaster/js-utils';
|
||||||
import { merge } from 'lodash';
|
import { merge } from 'lodash';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
ExperimentalParams,
|
||||||
HighresParams,
|
HighresParams,
|
||||||
Img2ImgParams,
|
Img2ImgParams,
|
||||||
InpaintParams,
|
InpaintParams,
|
||||||
|
@ -69,7 +70,8 @@ export type ServerParams = ConfigRanges<Required<
|
||||||
ModelParams &
|
ModelParams &
|
||||||
OutpaintParams &
|
OutpaintParams &
|
||||||
UpscaleParams &
|
UpscaleParams &
|
||||||
HighresParams
|
HighresParams &
|
||||||
|
ExperimentalParams
|
||||||
>> & {
|
>> & {
|
||||||
motd?: Record<string, string>;
|
motd?: Record<string, string>;
|
||||||
version: string;
|
version: string;
|
||||||
|
|
|
@ -22,6 +22,7 @@ import { Txt2ImgSlice, createTxt2ImgSlice } from './txt2img.js';
|
||||||
import { UpscaleSlice, createUpscaleSlice } from './upscale.js';
|
import { UpscaleSlice, createUpscaleSlice } from './upscale.js';
|
||||||
import {
|
import {
|
||||||
BaseImgParams,
|
BaseImgParams,
|
||||||
|
ExperimentalParams,
|
||||||
HighresParams,
|
HighresParams,
|
||||||
ModelParams,
|
ModelParams,
|
||||||
UpscaleParams,
|
UpscaleParams,
|
||||||
|
@ -125,6 +126,20 @@ export function createStateSlices(server: ServerParams) {
|
||||||
scale: server.scale.default,
|
scale: server.scale.default,
|
||||||
upscaleOrder: server.upscaleOrder.default,
|
upscaleOrder: server.upscaleOrder.default,
|
||||||
};
|
};
|
||||||
|
const defaultExperimental: ExperimentalParams = {
|
||||||
|
promptEditing: {
|
||||||
|
enabled: false,
|
||||||
|
filter: '',
|
||||||
|
addSuffix : '',
|
||||||
|
removeTokens: '',
|
||||||
|
},
|
||||||
|
latentSymmetry: {
|
||||||
|
enabled: false,
|
||||||
|
gradientStart: 0,
|
||||||
|
gradientEnd: 0,
|
||||||
|
lineOfSymmetry: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
const defaultGrid: PipelineGrid = {
|
const defaultGrid: PipelineGrid = {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
columns: {
|
columns: {
|
||||||
|
@ -141,13 +156,13 @@ export function createStateSlices(server: ServerParams) {
|
||||||
createBlendSlice: createBlendSlice(defaultModel, defaultUpscale),
|
createBlendSlice: createBlendSlice(defaultModel, defaultUpscale),
|
||||||
createDefaultSlice: createDefaultSlice(defaultParams),
|
createDefaultSlice: createDefaultSlice(defaultParams),
|
||||||
createHistorySlice: createHistorySlice(),
|
createHistorySlice: createHistorySlice(),
|
||||||
createImg2ImgSlice: createImg2ImgSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale),
|
createImg2ImgSlice: createImg2ImgSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale, defaultExperimental),
|
||||||
createInpaintSlice: createInpaintSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale),
|
createInpaintSlice: createInpaintSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale, defaultExperimental),
|
||||||
createModelSlice: createModelSlice(),
|
createModelSlice: createModelSlice(),
|
||||||
createProfileSlice: createProfileSlice(),
|
createProfileSlice: createProfileSlice(),
|
||||||
createResetSlice: createResetSlice(),
|
createResetSlice: createResetSlice(),
|
||||||
createSettingsSlice: createSettingsSlice(),
|
createSettingsSlice: createSettingsSlice(),
|
||||||
createTxt2ImgSlice: createTxt2ImgSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale, defaultGrid),
|
createTxt2ImgSlice: createTxt2ImgSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale, defaultExperimental, defaultGrid),
|
||||||
createUpscaleSlice: createUpscaleSlice(defaultParams, defaultHighres, defaultModel, defaultUpscale),
|
createUpscaleSlice: createUpscaleSlice(defaultParams, defaultHighres, defaultModel, defaultUpscale),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import { ServerParams } from '../config.js';
|
import { ServerParams } from '../config.js';
|
||||||
import {
|
import {
|
||||||
BaseImgParams,
|
BaseImgParams,
|
||||||
|
ExperimentalParams,
|
||||||
HighresParams,
|
HighresParams,
|
||||||
Img2ImgParams,
|
Img2ImgParams,
|
||||||
ModelParams,
|
ModelParams,
|
||||||
|
@ -14,6 +15,7 @@ export interface Img2ImgSlice {
|
||||||
img2imgModel: ModelParams;
|
img2imgModel: ModelParams;
|
||||||
img2imgHighres: HighresParams;
|
img2imgHighres: HighresParams;
|
||||||
img2imgUpscale: UpscaleParams;
|
img2imgUpscale: UpscaleParams;
|
||||||
|
img2imgExperimental: ExperimentalParams;
|
||||||
|
|
||||||
resetImg2Img(): void;
|
resetImg2Img(): void;
|
||||||
|
|
||||||
|
@ -21,6 +23,7 @@ export interface Img2ImgSlice {
|
||||||
setImg2ImgModel(params: Partial<ModelParams>): void;
|
setImg2ImgModel(params: Partial<ModelParams>): void;
|
||||||
setImg2ImgHighres(params: Partial<HighresParams>): void;
|
setImg2ImgHighres(params: Partial<HighresParams>): void;
|
||||||
setImg2ImgUpscale(params: Partial<UpscaleParams>): void;
|
setImg2ImgUpscale(params: Partial<UpscaleParams>): void;
|
||||||
|
setImg2ImgExperimental(params: Partial<ExperimentalParams>): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line max-params
|
// eslint-disable-next-line max-params
|
||||||
|
@ -29,7 +32,8 @@ export function createImg2ImgSlice<TState extends Img2ImgSlice>(
|
||||||
defaultParams: Required<BaseImgParams>,
|
defaultParams: Required<BaseImgParams>,
|
||||||
defaultHighres: HighresParams,
|
defaultHighres: HighresParams,
|
||||||
defaultModel: ModelParams,
|
defaultModel: ModelParams,
|
||||||
defaultUpscale: UpscaleParams
|
defaultUpscale: UpscaleParams,
|
||||||
|
defaultExperimental: ExperimentalParams,
|
||||||
): Slice<TState, Img2ImgSlice> {
|
): Slice<TState, Img2ImgSlice> {
|
||||||
return (set) => ({
|
return (set) => ({
|
||||||
img2img: {
|
img2img: {
|
||||||
|
@ -49,6 +53,9 @@ export function createImg2ImgSlice<TState extends Img2ImgSlice>(
|
||||||
img2imgUpscale: {
|
img2imgUpscale: {
|
||||||
...defaultUpscale,
|
...defaultUpscale,
|
||||||
},
|
},
|
||||||
|
img2imgExperimental: {
|
||||||
|
...defaultExperimental,
|
||||||
|
},
|
||||||
resetImg2Img() {
|
resetImg2Img() {
|
||||||
set({
|
set({
|
||||||
img2img: {
|
img2img: {
|
||||||
|
@ -93,6 +100,13 @@ export function createImg2ImgSlice<TState extends Img2ImgSlice>(
|
||||||
},
|
},
|
||||||
} as Partial<TState>));
|
} as Partial<TState>));
|
||||||
},
|
},
|
||||||
|
setImg2ImgExperimental(params) {
|
||||||
|
set((prev) => ({
|
||||||
|
img2imgExperimental: {
|
||||||
|
...prev.img2imgExperimental,
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
} as Partial<TState>));
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { DEFAULT_BRUSH } from '../constants.js';
|
||||||
import {
|
import {
|
||||||
BaseImgParams,
|
BaseImgParams,
|
||||||
BrushParams,
|
BrushParams,
|
||||||
|
ExperimentalParams,
|
||||||
HighresParams,
|
HighresParams,
|
||||||
InpaintParams,
|
InpaintParams,
|
||||||
ModelParams,
|
ModelParams,
|
||||||
|
@ -16,6 +17,7 @@ export interface InpaintSlice {
|
||||||
inpaintModel: ModelParams;
|
inpaintModel: ModelParams;
|
||||||
inpaintHighres: HighresParams;
|
inpaintHighres: HighresParams;
|
||||||
inpaintUpscale: UpscaleParams;
|
inpaintUpscale: UpscaleParams;
|
||||||
|
inpaintExperimental: ExperimentalParams;
|
||||||
outpaint: OutpaintPixels;
|
outpaint: OutpaintPixels;
|
||||||
|
|
||||||
resetInpaint(): void;
|
resetInpaint(): void;
|
||||||
|
@ -25,6 +27,7 @@ export interface InpaintSlice {
|
||||||
setInpaintModel(params: Partial<ModelParams>): void;
|
setInpaintModel(params: Partial<ModelParams>): void;
|
||||||
setInpaintHighres(params: Partial<HighresParams>): void;
|
setInpaintHighres(params: Partial<HighresParams>): void;
|
||||||
setInpaintUpscale(params: Partial<UpscaleParams>): void;
|
setInpaintUpscale(params: Partial<UpscaleParams>): void;
|
||||||
|
setInpaintExperimental(params: Partial<ExperimentalParams>): void;
|
||||||
setOutpaint(pixels: Partial<OutpaintPixels>): void;
|
setOutpaint(pixels: Partial<OutpaintPixels>): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +38,7 @@ export function createInpaintSlice<TState extends InpaintSlice>(
|
||||||
defaultHighres: HighresParams,
|
defaultHighres: HighresParams,
|
||||||
defaultModel: ModelParams,
|
defaultModel: ModelParams,
|
||||||
defaultUpscale: UpscaleParams,
|
defaultUpscale: UpscaleParams,
|
||||||
|
defaultExperimental: ExperimentalParams,
|
||||||
): Slice<TState, InpaintSlice> {
|
): Slice<TState, InpaintSlice> {
|
||||||
return (set) => ({
|
return (set) => ({
|
||||||
inpaint: {
|
inpaint: {
|
||||||
|
@ -61,6 +65,9 @@ export function createInpaintSlice<TState extends InpaintSlice>(
|
||||||
inpaintUpscale: {
|
inpaintUpscale: {
|
||||||
...defaultUpscale,
|
...defaultUpscale,
|
||||||
},
|
},
|
||||||
|
inpaintExperimental: {
|
||||||
|
...defaultExperimental
|
||||||
|
},
|
||||||
outpaint: {
|
outpaint: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
left: server.left.default,
|
left: server.left.default,
|
||||||
|
@ -124,6 +131,14 @@ export function createInpaintSlice<TState extends InpaintSlice>(
|
||||||
},
|
},
|
||||||
} as Partial<TState>));
|
} as Partial<TState>));
|
||||||
},
|
},
|
||||||
|
setInpaintExperimental(params) {
|
||||||
|
set((prev) => ({
|
||||||
|
inpaintExperimental: {
|
||||||
|
...prev.inpaintExperimental,
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
} as Partial<TState>));
|
||||||
|
},
|
||||||
setOutpaint(pixels) {
|
setOutpaint(pixels) {
|
||||||
set((prev) => ({
|
set((prev) => ({
|
||||||
outpaint: {
|
outpaint: {
|
||||||
|
|
|
@ -9,6 +9,28 @@ import { Txt2ImgSlice } from '../txt2img.js';
|
||||||
import { UpscaleSlice } from '../upscale.js';
|
import { UpscaleSlice } from '../upscale.js';
|
||||||
import { DEFAULT_PROFILES } from '../profile.js';
|
import { DEFAULT_PROFILES } from '../profile.js';
|
||||||
|
|
||||||
|
// #region V13
|
||||||
|
export const V13 = 13;
|
||||||
|
|
||||||
|
export const REMOVED_KEYS_V13 = [] as const;
|
||||||
|
|
||||||
|
export type RemovedKeysV13 = typeof REMOVED_KEYS_V13[number];
|
||||||
|
|
||||||
|
export type AddedKeysV13 = 'txt2imgExperimental' | 'img2imgExperimental' | 'inpaintExperimental';
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region V11
|
||||||
|
export const V11 = 11;
|
||||||
|
|
||||||
|
export const REMOVED_KEYS_V11 = ['tile', 'overlap'] as const;
|
||||||
|
|
||||||
|
export type RemovedKeysV11 = typeof REMOVED_KEYS_V11[number];
|
||||||
|
|
||||||
|
export type AddedKeysV11 = 'unet_tile' | 'unet_overlap' | 'vae_tile' | 'vae_overlap';
|
||||||
|
|
||||||
|
export type OnnxStateV11 = Omit<OnnxState, AddedKeysV13>;
|
||||||
|
// #endregion
|
||||||
|
|
||||||
// #region V7
|
// #region V7
|
||||||
export const V7 = 7;
|
export const V7 = 7;
|
||||||
|
|
||||||
|
@ -17,7 +39,7 @@ export type BaseImgParamsV7<T extends BaseImgParams> = Omit<T, AddedKeysV11> & {
|
||||||
tile: number;
|
tile: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type OnnxStateV7 = Omit<OnnxState, 'img2img' | 'txt2img'> & {
|
export type OnnxStateV7 = Omit<OnnxState, 'img2img' | 'txt2img' | 'inpaint' | 'upscale'> & {
|
||||||
img2img: BaseImgParamsV7<Img2ImgSlice['img2img']>;
|
img2img: BaseImgParamsV7<Img2ImgSlice['img2img']>;
|
||||||
inpaint: BaseImgParamsV7<InpaintSlice['inpaint']>;
|
inpaint: BaseImgParamsV7<InpaintSlice['inpaint']>;
|
||||||
txt2img: BaseImgParamsV7<Txt2ImgSlice['txt2img']>;
|
txt2img: BaseImgParamsV7<Txt2ImgSlice['txt2img']>;
|
||||||
|
@ -25,17 +47,8 @@ export type OnnxStateV7 = Omit<OnnxState, 'img2img' | 'txt2img'> & {
|
||||||
};
|
};
|
||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
// #region V11
|
|
||||||
export const REMOVED_KEYS_V11 = ['tile', 'overlap'] as const;
|
|
||||||
|
|
||||||
export type RemovedKeysV11 = typeof REMOVED_KEYS_V11[number];
|
|
||||||
|
|
||||||
// TODO: can the compiler calculate this?
|
|
||||||
export type AddedKeysV11 = 'unet_tile' | 'unet_overlap' | 'vae_tile' | 'vae_overlap';
|
|
||||||
// #endregion
|
|
||||||
|
|
||||||
// add versions to this list as they are replaced
|
// add versions to this list as they are replaced
|
||||||
export type PreviousState = OnnxStateV7;
|
export type PreviousState = OnnxStateV7 | OnnxStateV11;
|
||||||
|
|
||||||
// always the latest version
|
// always the latest version
|
||||||
export type CurrentState = OnnxState;
|
export type CurrentState = OnnxState;
|
||||||
|
@ -46,14 +59,20 @@ export type UnknownState = PreviousState | CurrentState;
|
||||||
export function applyStateMigrations(params: ServerParams, previousState: UnknownState, version: number, logger: Logger): OnnxState {
|
export function applyStateMigrations(params: ServerParams, previousState: UnknownState, version: number, logger: Logger): OnnxState {
|
||||||
logger.info('applying state migrations from version %s to version %s', version, STATE_VERSION);
|
logger.info('applying state migrations from version %s to version %s', version, STATE_VERSION);
|
||||||
|
|
||||||
|
let migrated = previousState;
|
||||||
|
|
||||||
if (version <= V7) {
|
if (version <= V7) {
|
||||||
return migrateV7ToV11(params, previousState as PreviousState);
|
migrated = migrateV7ToV11(params, migrated as OnnxStateV7);
|
||||||
}
|
}
|
||||||
|
|
||||||
return previousState as CurrentState;
|
if (version <= V11) {
|
||||||
|
migrated = migrateV11ToV13(params, migrated as OnnxStateV11);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function migrateV7ToV11(params: ServerParams, previousState: PreviousState): CurrentState {
|
return migrated as CurrentState;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function migrateV7ToV11(params: ServerParams, previousState: OnnxStateV7): CurrentState {
|
||||||
// add any missing keys
|
// add any missing keys
|
||||||
const result: CurrentState = {
|
const result: CurrentState = {
|
||||||
...params,
|
...params,
|
||||||
|
@ -100,3 +119,55 @@ export function migrateV7ToV11(params: ServerParams, previousState: PreviousStat
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function migrateV11ToV13(params: ServerParams, previousState: OnnxStateV11): CurrentState {
|
||||||
|
// add any missing keys
|
||||||
|
const result: CurrentState = {
|
||||||
|
...params,
|
||||||
|
...previousState,
|
||||||
|
txt2imgExperimental: {
|
||||||
|
latentSymmetry: {
|
||||||
|
enabled: false,
|
||||||
|
gradientStart: 0,
|
||||||
|
gradientEnd: 0,
|
||||||
|
lineOfSymmetry: 0,
|
||||||
|
},
|
||||||
|
promptEditing: {
|
||||||
|
enabled: false,
|
||||||
|
filter: '',
|
||||||
|
addSuffix: '',
|
||||||
|
removeTokens: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
img2imgExperimental: {
|
||||||
|
latentSymmetry: {
|
||||||
|
enabled: false,
|
||||||
|
gradientStart: 0,
|
||||||
|
gradientEnd: 0,
|
||||||
|
lineOfSymmetry: 0,
|
||||||
|
},
|
||||||
|
promptEditing: {
|
||||||
|
enabled: false,
|
||||||
|
filter: '',
|
||||||
|
addSuffix: '',
|
||||||
|
removeTokens: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
inpaintExperimental: {
|
||||||
|
latentSymmetry: {
|
||||||
|
enabled: false,
|
||||||
|
gradientStart: 0,
|
||||||
|
gradientEnd: 0,
|
||||||
|
lineOfSymmetry: 0,
|
||||||
|
},
|
||||||
|
promptEditing: {
|
||||||
|
enabled: false,
|
||||||
|
filter: '',
|
||||||
|
addSuffix: '',
|
||||||
|
removeTokens: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { PipelineGrid } from '../client/utils.js';
|
||||||
import { ServerParams } from '../config.js';
|
import { ServerParams } from '../config.js';
|
||||||
import {
|
import {
|
||||||
BaseImgParams,
|
BaseImgParams,
|
||||||
|
ExperimentalParams,
|
||||||
HighresParams,
|
HighresParams,
|
||||||
ModelParams,
|
ModelParams,
|
||||||
Txt2ImgParams,
|
Txt2ImgParams,
|
||||||
|
@ -15,6 +16,7 @@ export interface Txt2ImgSlice {
|
||||||
txt2imgHighres: HighresParams;
|
txt2imgHighres: HighresParams;
|
||||||
txt2imgUpscale: UpscaleParams;
|
txt2imgUpscale: UpscaleParams;
|
||||||
txt2imgVariable: PipelineGrid;
|
txt2imgVariable: PipelineGrid;
|
||||||
|
txt2imgExperimental: ExperimentalParams;
|
||||||
|
|
||||||
resetTxt2Img(): void;
|
resetTxt2Img(): void;
|
||||||
|
|
||||||
|
@ -23,6 +25,7 @@ export interface Txt2ImgSlice {
|
||||||
setTxt2ImgHighres(params: Partial<HighresParams>): void;
|
setTxt2ImgHighres(params: Partial<HighresParams>): void;
|
||||||
setTxt2ImgUpscale(params: Partial<UpscaleParams>): void;
|
setTxt2ImgUpscale(params: Partial<UpscaleParams>): void;
|
||||||
setTxt2ImgVariable(params: Partial<PipelineGrid>): void;
|
setTxt2ImgVariable(params: Partial<PipelineGrid>): void;
|
||||||
|
setTxt2ImgExperimental(params: Partial<ExperimentalParams>): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line max-params
|
// eslint-disable-next-line max-params
|
||||||
|
@ -32,6 +35,7 @@ export function createTxt2ImgSlice<TState extends Txt2ImgSlice>(
|
||||||
defaultHighres: HighresParams,
|
defaultHighres: HighresParams,
|
||||||
defaultModel: ModelParams,
|
defaultModel: ModelParams,
|
||||||
defaultUpscale: UpscaleParams,
|
defaultUpscale: UpscaleParams,
|
||||||
|
defaultExperimental: ExperimentalParams,
|
||||||
defaultGrid: PipelineGrid,
|
defaultGrid: PipelineGrid,
|
||||||
): Slice<TState, Txt2ImgSlice> {
|
): Slice<TState, Txt2ImgSlice> {
|
||||||
return (set) => ({
|
return (set) => ({
|
||||||
|
@ -52,6 +56,9 @@ export function createTxt2ImgSlice<TState extends Txt2ImgSlice>(
|
||||||
txt2imgVariable: {
|
txt2imgVariable: {
|
||||||
...defaultGrid,
|
...defaultGrid,
|
||||||
},
|
},
|
||||||
|
txt2imgExperimental: {
|
||||||
|
...defaultExperimental,
|
||||||
|
},
|
||||||
setTxt2Img(params) {
|
setTxt2Img(params) {
|
||||||
set((prev) => ({
|
set((prev) => ({
|
||||||
txt2img: {
|
txt2img: {
|
||||||
|
@ -92,6 +99,14 @@ export function createTxt2ImgSlice<TState extends Txt2ImgSlice>(
|
||||||
},
|
},
|
||||||
} as Partial<TState>));
|
} as Partial<TState>));
|
||||||
},
|
},
|
||||||
|
setTxt2ImgExperimental(params) {
|
||||||
|
set((prev) => ({
|
||||||
|
txt2imgExperimental: {
|
||||||
|
...prev.txt2imgExperimental,
|
||||||
|
...params,
|
||||||
|
},
|
||||||
|
} as Partial<TState>));
|
||||||
|
},
|
||||||
resetTxt2Img() {
|
resetTxt2Img() {
|
||||||
set({
|
set({
|
||||||
txt2img: {
|
txt2img: {
|
||||||
|
|
|
@ -164,3 +164,18 @@ export interface HighresParams {
|
||||||
highresSteps: number;
|
highresSteps: number;
|
||||||
highresStrength: number;
|
highresStrength: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ExperimentalParams {
|
||||||
|
latentSymmetry: {
|
||||||
|
enabled: boolean;
|
||||||
|
gradientStart: number;
|
||||||
|
gradientEnd: number;
|
||||||
|
lineOfSymmetry: number;
|
||||||
|
};
|
||||||
|
promptEditing: {
|
||||||
|
enabled: boolean;
|
||||||
|
filter: string;
|
||||||
|
removeTokens: string;
|
||||||
|
addSuffix: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue