1
0
Fork 0

add experimental params to client-side state

This commit is contained in:
Sean Sube 2024-02-17 12:28:29 -06:00
parent 6f35b57e6e
commit 6c3e02aa44
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
11 changed files with 258 additions and 99 deletions

View File

@ -3,41 +3,28 @@ import { mustDefault, mustExist } from '@apextoaster/js-utils';
import { Checkbox, FormControlLabel, Stack, TextField } from '@mui/material';
import { useTranslation } from 'react-i18next';
import * as React from 'react';
import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
import { useStore } from 'zustand';
import { STALE_TIME, STANDARD_SPACING } from '../../constants.js';
import { NumericField } from '../input/NumericField.js';
import { QueryList } from '../input/QueryList.js';
import { ClientContext } from '../../state/full.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;
}
import { ClientContext, OnnxState, StateContext } from '../../state/full.js';
import { ExperimentalParams } from '../../types/params.js';
export interface ExperimentalControlProps {
selectExperimental(state: OnnxState): ExperimentalParams;
setExperimental(params: Record<string, unknown>): void;
}
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 [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 filters = useQuery(['filters'], async () => client.filters(), {
@ -50,58 +37,66 @@ export function ExperimentalControl(props: ExperimentalControlProps) {
label={t('experimental.latent_symmetry.label')}
control={
<Checkbox
checked={state.latent_symmetry}
checked={experimental.latentSymmetry.enabled}
value='check'
onChange={(event) => {
setState({
...state,
latent_symmetry: state.latent_symmetry === false,
setExperimental({
latentSymmetry: {
...experimental.latentSymmetry,
enabled: experimental.latentSymmetry.enabled === false,
},
});
}}
/>}
/>
<NumericField
decimal
disabled={state.latent_symmetry === false}
disabled={experimental.latentSymmetry.enabled === false}
label={t('experimental.latent_symmetry.gradient_start')}
min={0}
max={0.5}
step={0.01}
value={state.latent_symmetry_gradient_start}
value={experimental.latentSymmetry.gradientStart}
onChange={(latent_symmetry_gradient_start) => {
setState({
...state,
latent_symmetry_gradient_start,
setExperimental({
latentSymmetry: {
...experimental.latentSymmetry,
gradientStart: latent_symmetry_gradient_start,
},
});
}}
/>
<NumericField
decimal
disabled={state.latent_symmetry === false}
disabled={experimental.latentSymmetry.enabled === false}
label={t('experimental.latent_symmetry.gradient_end')}
min={0}
max={0.5}
step={0.01}
value={state.latent_symmetry_gradient_end}
value={experimental.latentSymmetry.gradientEnd}
onChange={(latent_symmetry_gradient_end) => {
setState({
...state,
latent_symmetry_gradient_end,
setExperimental({
latentSymmetry: {
...experimental.latentSymmetry,
gradientEnd: latent_symmetry_gradient_end,
},
});
}}
/>
<NumericField
decimal
disabled={state.latent_symmetry === false}
disabled={experimental.latentSymmetry.enabled === false}
label={t('experimental.latent_symmetry.line_of_symmetry')}
min={0}
max={1}
step={0.01}
value={state.latent_symmetry_line_of_symmetry}
value={experimental.latentSymmetry.lineOfSymmetry}
onChange={(latent_symmetry_line_of_symmetry) => {
setState({
...state,
latent_symmetry_line_of_symmetry,
setExperimental({
latentSymmetry: {
...experimental.latentSymmetry,
lineOfSymmetry: latent_symmetry_line_of_symmetry,
},
});
}}
/>
@ -111,18 +106,20 @@ export function ExperimentalControl(props: ExperimentalControlProps) {
label={t('experimental.prompt_editing.label')}
control={
<Checkbox
checked={state.prompt_editing}
checked={experimental.promptEditing.enabled}
value='check'
onChange={(event) => {
setState({
...state,
prompt_editing: state.prompt_editing === false,
setExperimental({
promptEditing: {
...experimental.promptEditing,
enabled: experimental.promptEditing.enabled === false,
},
});
}}
/>}
/>
<QueryList
disabled={state.prompt_editing === false}
disabled={experimental.promptEditing.enabled === false}
id='prompt_filters'
labelKey='model.prompt'
name={t('experimental.prompt_editing.filter')}
@ -130,35 +127,41 @@ export function ExperimentalControl(props: ExperimentalControlProps) {
result: filters,
selector: (f) => f.prompt,
}}
value={mustDefault(state.prompt_filter, '')}
value={mustDefault(experimental.promptEditing.filter, '')}
onChange={(prompt_filter) => {
setState({
...state,
prompt_filter,
setExperimental({
promptEditing: {
...experimental.promptEditing,
filter: prompt_filter,
},
});
}}
/>
<TextField
disabled={state.prompt_editing === false}
disabled={experimental.promptEditing.enabled === false}
label={t('experimental.prompt_editing.remove_tokens')}
variant='outlined'
value={state.remove_tokens}
value={experimental.promptEditing.removeTokens}
onChange={(event) => {
setState({
...state,
remove_tokens: event.target.value,
setExperimental({
promptEditing: {
...experimental.promptEditing,
removeTokens: event.target.value,
},
});
}}
/>
<TextField
disabled={state.prompt_editing === false}
disabled={experimental.promptEditing.enabled === false}
label={t('experimental.prompt_editing.add_suffix')}
variant='outlined'
value={state.add_suffix}
value={experimental.promptEditing.addSuffix}
onChange={(event) => {
setState({
...state,
add_suffix: event.target.value,
setExperimental({
promptEditing: {
...experimental.promptEditing,
addSuffix: event.target.value,
},
});
}}
/>

View File

@ -11,7 +11,7 @@ import { IMAGE_FILTER, STALE_TIME, STANDARD_SPACING } from '../../constants.js';
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
import { TabState } from '../../state/types.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 { HighresControl } from '../control/HighresControl.js';
import { ImageControl } from '../control/ImageControl.js';
@ -51,7 +51,7 @@ export function Img2Img() {
});
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 model = useStore(store, selectModel);
@ -141,10 +141,7 @@ export function Img2Img() {
</Stack>
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
<ExperimentalControl setExperimental={(props) => {
// eslint-disable-next-line no-console
console.log('setting experimental props', props);
}} />
<ExperimentalControl selectExperimental={selectExperimental} setExperimental={setExperimental} />
<Button
disabled={doesExist(source) === false}
variant='contained'
@ -166,6 +163,8 @@ export function selectActions(state: OnnxState) {
setModel: state.setImg2ImgModel,
// eslint-disable-next-line @typescript-eslint/unbound-method
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 {
return state.img2imgUpscale;
}
export function selectExperimental(state: OnnxState): ExperimentalParams {
return state.img2imgExperimental;
}

View File

@ -11,7 +11,7 @@ import { IMAGE_FILTER, STALE_TIME, STANDARD_SPACING } from '../../constants.js';
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
import { TabState } from '../../state/types.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 { HighresControl } from '../control/HighresControl.js';
import { ImageControl } from '../control/ImageControl.js';
@ -69,7 +69,7 @@ export function Inpaint() {
}
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 model = useStore(store, selectModel);
const brush = useStore(store, selectBrush);
@ -223,10 +223,7 @@ export function Inpaint() {
<OutpaintControl />
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
<ExperimentalControl setExperimental={(props) => {
// eslint-disable-next-line no-console
console.log('setting experimental props', props);
}} />
<ExperimentalControl selectExperimental={selectExperimental} setExperimental={setExperimental} />
<Button
disabled={preventInpaint()}
variant='contained'
@ -244,6 +241,8 @@ export function selectActions(state: OnnxState) {
// eslint-disable-next-line @typescript-eslint/unbound-method
setBrush: state.setInpaintBrush,
// eslint-disable-next-line @typescript-eslint/unbound-method
setExperimental: state.setInpaintExperimental,
// eslint-disable-next-line @typescript-eslint/unbound-method
setHighres: state.setInpaintHighres,
// eslint-disable-next-line @typescript-eslint/unbound-method
setModel: state.setInpaintModel,
@ -285,3 +284,7 @@ export function selectHighres(state: OnnxState): HighresParams {
export function selectUpscale(state: OnnxState): UpscaleParams {
return state.inpaintUpscale;
}
export function selectExperimental(state: OnnxState): ExperimentalParams {
return state.inpaintExperimental;
}

View File

@ -12,7 +12,7 @@ import { STANDARD_SPACING } from '../../constants.js';
import { ClientContext, ConfigContext, OnnxState, StateContext } from '../../state/full.js';
import { TabState } from '../../state/types.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 { HighresControl } from '../control/HighresControl.js';
import { ImageControl } from '../control/ImageControl.js';
@ -84,7 +84,7 @@ export function Txt2Img() {
});
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 { t } = useTranslation();
@ -106,10 +106,7 @@ export function Txt2Img() {
<SizeControl />
<HighresControl selectHighres={selectHighres} setHighres={setHighres} />
<UpscaleControl selectUpscale={selectUpscale} setUpscale={setUpscale} />
<ExperimentalControl setExperimental={(props) => {
// eslint-disable-next-line no-console
console.log('setting experimental props', props);
}} />
<ExperimentalControl selectExperimental={selectExperimental} setExperimental={setExperimental} />
<VariableControl selectGrid={selectVariable} setGrid={setVariable} />
<Button
variant='contained'
@ -124,6 +121,8 @@ export function selectActions(state: OnnxState) {
// eslint-disable-next-line @typescript-eslint/unbound-method
pushHistory: state.pushHistory,
// eslint-disable-next-line @typescript-eslint/unbound-method
setExperimental: state.setTxt2ImgExperimental,
// eslint-disable-next-line @typescript-eslint/unbound-method
setHighres: state.setTxt2ImgHighres,
// eslint-disable-next-line @typescript-eslint/unbound-method
setModel: state.setTxt2ImgModel,
@ -162,3 +161,7 @@ export function selectUpscale(state: OnnxState): UpscaleParams {
export function selectVariable(state: OnnxState): PipelineGrid {
return state.txt2imgVariable;
}
export function selectExperimental(state: OnnxState): ExperimentalParams {
return state.txt2imgExperimental;
}

View File

@ -2,6 +2,7 @@ import { doesExist, Maybe } from '@apextoaster/js-utils';
import { merge } from 'lodash';
import {
ExperimentalParams,
HighresParams,
Img2ImgParams,
InpaintParams,
@ -69,7 +70,8 @@ export type ServerParams = ConfigRanges<Required<
ModelParams &
OutpaintParams &
UpscaleParams &
HighresParams
HighresParams &
ExperimentalParams
>> & {
motd?: Record<string, string>;
version: string;

View File

@ -22,6 +22,7 @@ import { Txt2ImgSlice, createTxt2ImgSlice } from './txt2img.js';
import { UpscaleSlice, createUpscaleSlice } from './upscale.js';
import {
BaseImgParams,
ExperimentalParams,
HighresParams,
ModelParams,
UpscaleParams,
@ -125,6 +126,20 @@ export function createStateSlices(server: ServerParams) {
scale: server.scale.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 = {
enabled: false,
columns: {
@ -141,13 +156,13 @@ export function createStateSlices(server: ServerParams) {
createBlendSlice: createBlendSlice(defaultModel, defaultUpscale),
createDefaultSlice: createDefaultSlice(defaultParams),
createHistorySlice: createHistorySlice(),
createImg2ImgSlice: createImg2ImgSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale),
createInpaintSlice: createInpaintSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale),
createImg2ImgSlice: createImg2ImgSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale, defaultExperimental),
createInpaintSlice: createInpaintSlice(server, defaultParams, defaultHighres, defaultModel, defaultUpscale, defaultExperimental),
createModelSlice: createModelSlice(),
createProfileSlice: createProfileSlice(),
createResetSlice: createResetSlice(),
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),
};
}

View File

@ -2,6 +2,7 @@
import { ServerParams } from '../config.js';
import {
BaseImgParams,
ExperimentalParams,
HighresParams,
Img2ImgParams,
ModelParams,
@ -14,6 +15,7 @@ export interface Img2ImgSlice {
img2imgModel: ModelParams;
img2imgHighres: HighresParams;
img2imgUpscale: UpscaleParams;
img2imgExperimental: ExperimentalParams;
resetImg2Img(): void;
@ -21,6 +23,7 @@ export interface Img2ImgSlice {
setImg2ImgModel(params: Partial<ModelParams>): void;
setImg2ImgHighres(params: Partial<HighresParams>): void;
setImg2ImgUpscale(params: Partial<UpscaleParams>): void;
setImg2ImgExperimental(params: Partial<ExperimentalParams>): void;
}
// eslint-disable-next-line max-params
@ -29,7 +32,8 @@ export function createImg2ImgSlice<TState extends Img2ImgSlice>(
defaultParams: Required<BaseImgParams>,
defaultHighres: HighresParams,
defaultModel: ModelParams,
defaultUpscale: UpscaleParams
defaultUpscale: UpscaleParams,
defaultExperimental: ExperimentalParams,
): Slice<TState, Img2ImgSlice> {
return (set) => ({
img2img: {
@ -49,6 +53,9 @@ export function createImg2ImgSlice<TState extends Img2ImgSlice>(
img2imgUpscale: {
...defaultUpscale,
},
img2imgExperimental: {
...defaultExperimental,
},
resetImg2Img() {
set({
img2img: {
@ -93,6 +100,13 @@ export function createImg2ImgSlice<TState extends Img2ImgSlice>(
},
} as Partial<TState>));
},
setImg2ImgExperimental(params) {
set((prev) => ({
img2imgExperimental: {
...prev.img2imgExperimental,
...params,
},
} as Partial<TState>));
},
});
}

View File

@ -3,6 +3,7 @@ import { DEFAULT_BRUSH } from '../constants.js';
import {
BaseImgParams,
BrushParams,
ExperimentalParams,
HighresParams,
InpaintParams,
ModelParams,
@ -16,6 +17,7 @@ export interface InpaintSlice {
inpaintModel: ModelParams;
inpaintHighres: HighresParams;
inpaintUpscale: UpscaleParams;
inpaintExperimental: ExperimentalParams;
outpaint: OutpaintPixels;
resetInpaint(): void;
@ -25,6 +27,7 @@ export interface InpaintSlice {
setInpaintModel(params: Partial<ModelParams>): void;
setInpaintHighres(params: Partial<HighresParams>): void;
setInpaintUpscale(params: Partial<UpscaleParams>): void;
setInpaintExperimental(params: Partial<ExperimentalParams>): void;
setOutpaint(pixels: Partial<OutpaintPixels>): void;
}
@ -35,6 +38,7 @@ export function createInpaintSlice<TState extends InpaintSlice>(
defaultHighres: HighresParams,
defaultModel: ModelParams,
defaultUpscale: UpscaleParams,
defaultExperimental: ExperimentalParams,
): Slice<TState, InpaintSlice> {
return (set) => ({
inpaint: {
@ -61,6 +65,9 @@ export function createInpaintSlice<TState extends InpaintSlice>(
inpaintUpscale: {
...defaultUpscale,
},
inpaintExperimental: {
...defaultExperimental
},
outpaint: {
enabled: false,
left: server.left.default,
@ -124,6 +131,14 @@ export function createInpaintSlice<TState extends InpaintSlice>(
},
} as Partial<TState>));
},
setInpaintExperimental(params) {
set((prev) => ({
inpaintExperimental: {
...prev.inpaintExperimental,
...params,
},
} as Partial<TState>));
},
setOutpaint(pixels) {
set((prev) => ({
outpaint: {

View File

@ -9,6 +9,28 @@ import { Txt2ImgSlice } from '../txt2img.js';
import { UpscaleSlice } from '../upscale.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
export const V7 = 7;
@ -17,7 +39,7 @@ export type BaseImgParamsV7<T extends BaseImgParams> = Omit<T, AddedKeysV11> & {
tile: number;
};
export type OnnxStateV7 = Omit<OnnxState, 'img2img' | 'txt2img'> & {
export type OnnxStateV7 = Omit<OnnxState, 'img2img' | 'txt2img' | 'inpaint' | 'upscale'> & {
img2img: BaseImgParamsV7<Img2ImgSlice['img2img']>;
inpaint: BaseImgParamsV7<InpaintSlice['inpaint']>;
txt2img: BaseImgParamsV7<Txt2ImgSlice['txt2img']>;
@ -25,17 +47,8 @@ export type OnnxStateV7 = Omit<OnnxState, 'img2img' | 'txt2img'> & {
};
// #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
export type PreviousState = OnnxStateV7;
export type PreviousState = OnnxStateV7 | OnnxStateV11;
// always the latest version
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 {
logger.info('applying state migrations from version %s to version %s', version, STATE_VERSION);
let migrated = previousState;
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);
}
return migrated as CurrentState;
}
export function migrateV7ToV11(params: ServerParams, previousState: PreviousState): CurrentState {
export function migrateV7ToV11(params: ServerParams, previousState: OnnxStateV7): CurrentState {
// add any missing keys
const result: CurrentState = {
...params,
@ -100,3 +119,55 @@ export function migrateV7ToV11(params: ServerParams, previousState: PreviousStat
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;
}

View File

@ -2,6 +2,7 @@ import { PipelineGrid } from '../client/utils.js';
import { ServerParams } from '../config.js';
import {
BaseImgParams,
ExperimentalParams,
HighresParams,
ModelParams,
Txt2ImgParams,
@ -15,6 +16,7 @@ export interface Txt2ImgSlice {
txt2imgHighres: HighresParams;
txt2imgUpscale: UpscaleParams;
txt2imgVariable: PipelineGrid;
txt2imgExperimental: ExperimentalParams;
resetTxt2Img(): void;
@ -23,6 +25,7 @@ export interface Txt2ImgSlice {
setTxt2ImgHighres(params: Partial<HighresParams>): void;
setTxt2ImgUpscale(params: Partial<UpscaleParams>): void;
setTxt2ImgVariable(params: Partial<PipelineGrid>): void;
setTxt2ImgExperimental(params: Partial<ExperimentalParams>): void;
}
// eslint-disable-next-line max-params
@ -32,6 +35,7 @@ export function createTxt2ImgSlice<TState extends Txt2ImgSlice>(
defaultHighres: HighresParams,
defaultModel: ModelParams,
defaultUpscale: UpscaleParams,
defaultExperimental: ExperimentalParams,
defaultGrid: PipelineGrid,
): Slice<TState, Txt2ImgSlice> {
return (set) => ({
@ -52,6 +56,9 @@ export function createTxt2ImgSlice<TState extends Txt2ImgSlice>(
txt2imgVariable: {
...defaultGrid,
},
txt2imgExperimental: {
...defaultExperimental,
},
setTxt2Img(params) {
set((prev) => ({
txt2img: {
@ -92,6 +99,14 @@ export function createTxt2ImgSlice<TState extends Txt2ImgSlice>(
},
} as Partial<TState>));
},
setTxt2ImgExperimental(params) {
set((prev) => ({
txt2imgExperimental: {
...prev.txt2imgExperimental,
...params,
},
} as Partial<TState>));
},
resetTxt2Img() {
set({
txt2img: {

View File

@ -164,3 +164,18 @@ export interface HighresParams {
highresSteps: number;
highresStrength: number;
}
export interface ExperimentalParams {
latentSymmetry: {
enabled: boolean;
gradientStart: number;
gradientEnd: number;
lineOfSymmetry: number;
};
promptEditing: {
enabled: boolean;
filter: string;
removeTokens: string;
addSuffix: string;
};
}