diff --git a/invokeai/app/invocations/param_easing.py b/invokeai/app/invocations/param_easing.py
index 1ff6261b88e..e79763a35e1 100644
--- a/invokeai/app/invocations/param_easing.py
+++ b/invokeai/app/invocations/param_easing.py
@@ -133,20 +133,19 @@ def invoke(self, context: InvocationContext) -> FloatCollectionOutput:
postlist = list(num_poststeps * [self.post_end_value])
if log_diagnostics:
- logger = InvokeAILogger.getLogger(name="StepParamEasing")
- logger.debug("start_step: " + str(start_step))
- logger.debug("end_step: " + str(end_step))
- logger.debug("num_easing_steps: " + str(num_easing_steps))
- logger.debug("num_presteps: " + str(num_presteps))
- logger.debug("num_poststeps: " + str(num_poststeps))
- logger.debug("prelist size: " + str(len(prelist)))
- logger.debug("postlist size: " + str(len(postlist)))
- logger.debug("prelist: " + str(prelist))
- logger.debug("postlist: " + str(postlist))
+ context.services.logger.debug("start_step: " + str(start_step))
+ context.services.logger.debug("end_step: " + str(end_step))
+ context.services.logger.debug("num_easing_steps: " + str(num_easing_steps))
+ context.services.logger.debug("num_presteps: " + str(num_presteps))
+ context.services.logger.debug("num_poststeps: " + str(num_poststeps))
+ context.services.logger.debug("prelist size: " + str(len(prelist)))
+ context.services.logger.debug("postlist size: " + str(len(postlist)))
+ context.services.logger.debug("prelist: " + str(prelist))
+ context.services.logger.debug("postlist: " + str(postlist))
easing_class = EASING_FUNCTIONS_MAP[self.easing]
if log_diagnostics:
- logger.debug("easing class: " + str(easing_class))
+ context.services.logger.debug("easing class: " + str(easing_class))
easing_list = list()
if self.mirror: # "expected" mirroring
# if number of steps is even, squeeze duration down to (number_of_steps)/2
@@ -156,7 +155,7 @@ def invoke(self, context: InvocationContext) -> FloatCollectionOutput:
# but if even then number_of_steps/2 === ceil(number_of_steps/2), so can just use ceil always
base_easing_duration = int(np.ceil(num_easing_steps/2.0))
- if log_diagnostics: logger.debug("base easing duration: " + str(base_easing_duration))
+ if log_diagnostics: context.services.logger.debug("base easing duration: " + str(base_easing_duration))
even_num_steps = (num_easing_steps % 2 == 0) # even number of steps
easing_function = easing_class(start=self.start_value,
end=self.end_value,
@@ -166,14 +165,14 @@ def invoke(self, context: InvocationContext) -> FloatCollectionOutput:
easing_val = easing_function.ease(step_index)
base_easing_vals.append(easing_val)
if log_diagnostics:
- logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(easing_val))
+ context.services.logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(easing_val))
if even_num_steps:
mirror_easing_vals = list(reversed(base_easing_vals))
else:
mirror_easing_vals = list(reversed(base_easing_vals[0:-1]))
if log_diagnostics:
- logger.debug("base easing vals: " + str(base_easing_vals))
- logger.debug("mirror easing vals: " + str(mirror_easing_vals))
+ context.services.logger.debug("base easing vals: " + str(base_easing_vals))
+ context.services.logger.debug("mirror easing vals: " + str(mirror_easing_vals))
easing_list = base_easing_vals + mirror_easing_vals
# FIXME: add alt_mirror option (alternative to default or mirror), or remove entirely
@@ -206,12 +205,12 @@ def invoke(self, context: InvocationContext) -> FloatCollectionOutput:
step_val = easing_function.ease(step_index)
easing_list.append(step_val)
if log_diagnostics:
- logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(step_val))
+ context.services.logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(step_val))
if log_diagnostics:
- logger.debug("prelist size: " + str(len(prelist)))
- logger.debug("easing_list size: " + str(len(easing_list)))
- logger.debug("postlist size: " + str(len(postlist)))
+ context.services.logger.debug("prelist size: " + str(len(prelist)))
+ context.services.logger.debug("easing_list size: " + str(len(easing_list)))
+ context.services.logger.debug("postlist size: " + str(len(postlist)))
param_list = prelist + easing_list + postlist
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx
index eeaf1b81ecc..1aefecf3e6d 100644
--- a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx
@@ -35,8 +35,8 @@ const ParamDynamicPromptsCollapse = () => {
withSwitch
>
-
+
);
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx
index ab56abaa359..19f02ae3e59 100644
--- a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx
@@ -9,17 +9,18 @@ import { stateSelector } from 'app/store/store';
const selector = createSelector(
stateSelector,
(state) => {
- const { maxPrompts } = state.dynamicPrompts;
+ const { maxPrompts, combinatorial } = state.dynamicPrompts;
const { min, sliderMax, inputMax } =
state.config.sd.dynamicPrompts.maxPrompts;
- return { maxPrompts, min, sliderMax, inputMax };
+ return { maxPrompts, min, sliderMax, inputMax, combinatorial };
},
defaultSelectorOptions
);
const ParamDynamicPromptsMaxPrompts = () => {
- const { maxPrompts, min, sliderMax, inputMax } = useAppSelector(selector);
+ const { maxPrompts, min, sliderMax, inputMax, combinatorial } =
+ useAppSelector(selector);
const dispatch = useAppDispatch();
const handleChange = useCallback(
@@ -36,6 +37,7 @@ const ParamDynamicPromptsMaxPrompts = () => {
return (
{
state.config.sd.iterations;
const { iterations } = state.generation;
const { shouldUseSliders } = state.ui;
- const isDisabled = state.dynamicPrompts.isEnabled;
+ const isDisabled =
+ state.dynamicPrompts.isEnabled && state.dynamicPrompts.combinatorial;
const step = state.hotkeys.shift ? fineStep : coarseStep;
diff --git a/invokeai/frontend/web/src/services/api/types.d.ts b/invokeai/frontend/web/src/services/api/types.d.ts
index a995d9c2989..2a2f90f4344 100644
--- a/invokeai/frontend/web/src/services/api/types.d.ts
+++ b/invokeai/frontend/web/src/services/api/types.d.ts
@@ -4,91 +4,89 @@ import { components } from './schema';
type schemas = components['schemas'];
/**
- * Helper type to extract the invocation type from the schema.
- * Also flags the `type` property as required.
+ * Extracts the schema type from the schema.
*/
-type Invocation = O.Required;
+type S = components['schemas'][T];
/**
- * Types from the API, re-exported from the types generated by `openapi-typescript`.
+ * Extracts the node type from the schema.
+ * Also flags the `type` property as required.
*/
+type N = O.Required<
+ components['schemas'][T],
+ 'type'
+>;
// Images
-export type ImageDTO = schemas['ImageDTO'];
-export type BoardDTO = schemas['BoardDTO'];
-export type BoardChanges = schemas['BoardChanges'];
-export type ImageChanges = schemas['ImageRecordChanges'];
-export type ImageCategory = schemas['ImageCategory'];
-export type ResourceOrigin = schemas['ResourceOrigin'];
-export type ImageField = schemas['ImageField'];
+export type ImageDTO = S<'ImageDTO'>;
+export type BoardDTO = S<'BoardDTO'>;
+export type BoardChanges = S<'BoardChanges'>;
+export type ImageChanges = S<'ImageRecordChanges'>;
+export type ImageCategory = S<'ImageCategory'>;
+export type ResourceOrigin = S<'ResourceOrigin'>;
+export type ImageField = S<'ImageField'>;
export type OffsetPaginatedResults_BoardDTO_ =
- schemas['OffsetPaginatedResults_BoardDTO_'];
+ S<'OffsetPaginatedResults_BoardDTO_'>;
export type OffsetPaginatedResults_ImageDTO_ =
- schemas['OffsetPaginatedResults_ImageDTO_'];
+ S<'OffsetPaginatedResults_ImageDTO_'>;
// Models
-export type ModelType = schemas['ModelType'];
-export type BaseModelType = schemas['BaseModelType'];
-export type PipelineModelField = schemas['PipelineModelField'];
-export type ModelsList = schemas['ModelsList'];
+export type ModelType = S<'ModelType'>;
+export type BaseModelType = S<'BaseModelType'>;
+export type PipelineModelField = S<'PipelineModelField'>;
+export type ModelsList = S<'ModelsList'>;
// Graphs
-export type Graph = schemas['Graph'];
-export type Edge = schemas['Edge'];
-export type GraphExecutionState = schemas['GraphExecutionState'];
+export type Graph = S<'Graph'>;
+export type Edge = S<'Edge'>;
+export type GraphExecutionState = S<'GraphExecutionState'>;
// General nodes
-export type CollectInvocation = Invocation<'CollectInvocation'>;
-export type IterateInvocation = Invocation<'IterateInvocation'>;
-export type RangeInvocation = Invocation<'RangeInvocation'>;
-export type RandomRangeInvocation = Invocation<'RandomRangeInvocation'>;
-export type RangeOfSizeInvocation = Invocation<'RangeOfSizeInvocation'>;
-export type InpaintInvocation = Invocation<'InpaintInvocation'>;
-export type ImageResizeInvocation = Invocation<'ImageResizeInvocation'>;
-export type RandomIntInvocation = Invocation<'RandomIntInvocation'>;
-export type CompelInvocation = Invocation<'CompelInvocation'>;
-export type DynamicPromptInvocation = Invocation<'DynamicPromptInvocation'>;
-export type NoiseInvocation = Invocation<'NoiseInvocation'>;
-export type TextToLatentsInvocation = Invocation<'TextToLatentsInvocation'>;
-export type LatentsToLatentsInvocation =
- Invocation<'LatentsToLatentsInvocation'>;
-export type ImageToLatentsInvocation = Invocation<'ImageToLatentsInvocation'>;
-export type LatentsToImageInvocation = Invocation<'LatentsToImageInvocation'>;
-export type PipelineModelLoaderInvocation =
- Invocation<'PipelineModelLoaderInvocation'>;
+export type CollectInvocation = N<'CollectInvocation'>;
+export type IterateInvocation = N<'IterateInvocation'>;
+export type RangeInvocation = N<'RangeInvocation'>;
+export type RandomRangeInvocation = N<'RandomRangeInvocation'>;
+export type RangeOfSizeInvocation = N<'RangeOfSizeInvocation'>;
+export type InpaintInvocation = N<'InpaintInvocation'>;
+export type ImageResizeInvocation = N<'ImageResizeInvocation'>;
+export type RandomIntInvocation = N<'RandomIntInvocation'>;
+export type CompelInvocation = N<'CompelInvocation'>;
+export type DynamicPromptInvocation = N<'DynamicPromptInvocation'>;
+export type NoiseInvocation = N<'NoiseInvocation'>;
+export type TextToLatentsInvocation = N<'TextToLatentsInvocation'>;
+export type LatentsToLatentsInvocation = N<'LatentsToLatentsInvocation'>;
+export type ImageToLatentsInvocation = N<'ImageToLatentsInvocation'>;
+export type LatentsToImageInvocation = N<'LatentsToImageInvocation'>;
+export type PipelineModelLoaderInvocation = N<'PipelineModelLoaderInvocation'>;
// ControlNet Nodes
-export type ControlNetInvocation = Invocation<'ControlNetInvocation'>;
-export type CannyImageProcessorInvocation =
- Invocation<'CannyImageProcessorInvocation'>;
+export type ControlNetInvocation = N<'ControlNetInvocation'>;
+export type CannyImageProcessorInvocation = N<'CannyImageProcessorInvocation'>;
export type ContentShuffleImageProcessorInvocation =
- Invocation<'ContentShuffleImageProcessorInvocation'>;
-export type HedImageProcessorInvocation =
- Invocation<'HedImageProcessorInvocation'>;
+ N<'ContentShuffleImageProcessorInvocation'>;
+export type HedImageProcessorInvocation = N<'HedImageProcessorInvocation'>;
export type LineartAnimeImageProcessorInvocation =
- Invocation<'LineartAnimeImageProcessorInvocation'>;
+ N<'LineartAnimeImageProcessorInvocation'>;
export type LineartImageProcessorInvocation =
- Invocation<'LineartImageProcessorInvocation'>;
+ N<'LineartImageProcessorInvocation'>;
export type MediapipeFaceProcessorInvocation =
- Invocation<'MediapipeFaceProcessorInvocation'>;
+ N<'MediapipeFaceProcessorInvocation'>;
export type MidasDepthImageProcessorInvocation =
- Invocation<'MidasDepthImageProcessorInvocation'>;
-export type MlsdImageProcessorInvocation =
- Invocation<'MlsdImageProcessorInvocation'>;
+ N<'MidasDepthImageProcessorInvocation'>;
+export type MlsdImageProcessorInvocation = N<'MlsdImageProcessorInvocation'>;
export type NormalbaeImageProcessorInvocation =
- Invocation<'NormalbaeImageProcessorInvocation'>;
+ N<'NormalbaeImageProcessorInvocation'>;
export type OpenposeImageProcessorInvocation =
- Invocation<'OpenposeImageProcessorInvocation'>;
-export type PidiImageProcessorInvocation =
- Invocation<'PidiImageProcessorInvocation'>;
+ N<'OpenposeImageProcessorInvocation'>;
+export type PidiImageProcessorInvocation = N<'PidiImageProcessorInvocation'>;
export type ZoeDepthImageProcessorInvocation =
- Invocation<'ZoeDepthImageProcessorInvocation'>;
+ N<'ZoeDepthImageProcessorInvocation'>;
// Node Outputs
-export type ImageOutput = schemas['ImageOutput'];
-export type MaskOutput = schemas['MaskOutput'];
-export type PromptOutput = schemas['PromptOutput'];
-export type IterateInvocationOutput = schemas['IterateInvocationOutput'];
-export type CollectInvocationOutput = schemas['CollectInvocationOutput'];
-export type LatentsOutput = schemas['LatentsOutput'];
-export type GraphInvocationOutput = schemas['GraphInvocationOutput'];
+export type ImageOutput = S<'ImageOutput'>;
+export type MaskOutput = S<'MaskOutput'>;
+export type PromptOutput = S<'PromptOutput'>;
+export type IterateInvocationOutput = S<'IterateInvocationOutput'>;
+export type CollectInvocationOutput = S<'CollectInvocationOutput'>;
+export type LatentsOutput = S<'LatentsOutput'>;
+export type GraphInvocationOutput = S<'GraphInvocationOutput'>;