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 { 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,
|
||||
},
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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>));
|
||||
},
|
||||
});
|
||||
|
||||
}
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue