fix(ui): fix metadata parsing of older images

The metadata parsing was overly strict, not taking into account the shape of old metadata. Relaxed the schemas.

Also fixed a misspelling.
This commit is contained in:
psychedelicious 2023-09-01 16:55:00 +10:00
parent 6f6d920686
commit 89b724d222
6 changed files with 44 additions and 26 deletions

View File

@ -72,10 +72,10 @@ class CoreMetadata(BaseModelExcludeNull):
) )
refiner_steps: Optional[int] = Field(default=None, description="The number of steps used for the refiner") refiner_steps: Optional[int] = Field(default=None, description="The number of steps used for the refiner")
refiner_scheduler: Optional[str] = Field(default=None, description="The scheduler used for the refiner") refiner_scheduler: Optional[str] = Field(default=None, description="The scheduler used for the refiner")
refiner_positive_aesthetic_store: Optional[float] = Field( refiner_positive_aesthetic_score: Optional[float] = Field(
default=None, description="The aesthetic score used for the refiner" default=None, description="The aesthetic score used for the refiner"
) )
refiner_negative_aesthetic_store: Optional[float] = Field( refiner_negative_aesthetic_score: Optional[float] = Field(
default=None, description="The aesthetic score used for the refiner" default=None, description="The aesthetic score used for the refiner"
) )
refiner_start: Optional[float] = Field(default=None, description="The start value used for refiner denoising") refiner_start: Optional[float] = Field(default=None, description="The start value used for refiner denoising")
@ -160,11 +160,11 @@ class MetadataAccumulatorInvocation(BaseInvocation):
default=None, default=None,
description="The scheduler used for the refiner", description="The scheduler used for the refiner",
) )
refiner_positive_aesthetic_store: Optional[float] = InputField( refiner_positive_aesthetic_score: Optional[float] = InputField(
default=None, default=None,
description="The aesthetic score used for the refiner", description="The aesthetic score used for the refiner",
) )
refiner_negative_aesthetic_store: Optional[float] = InputField( refiner_negative_aesthetic_score: Optional[float] = InputField(
default=None, default=None,
description="The aesthetic score used for the refiner", description="The aesthetic score used for the refiner",
) )

View File

@ -101,13 +101,15 @@ const ImageMetadataActions = (props: Props) => {
onClick={handleRecallSeed} onClick={handleRecallSeed}
/> />
)} )}
{metadata.model !== undefined && metadata.model !== null && ( {metadata.model !== undefined &&
<ImageMetadataItem metadata.model !== null &&
label="Model" metadata.model.model_name && (
value={metadata.model.model_name} <ImageMetadataItem
onClick={handleRecallModel} label="Model"
/> value={metadata.model.model_name}
)} onClick={handleRecallModel}
/>
)}
{metadata.width && ( {metadata.width && (
<ImageMetadataItem <ImageMetadataItem
label="Width" label="Width"

View File

@ -1,7 +1,9 @@
import { import {
SchedulerParam, SchedulerParam,
zBaseModel, zBaseModel,
zMainModel,
zMainOrOnnxModel, zMainOrOnnxModel,
zOnnxModel,
zSDXLRefinerModel, zSDXLRefinerModel,
zScheduler, zScheduler,
} from 'features/parameters/types/parameterSchemas'; } from 'features/parameters/types/parameterSchemas';
@ -769,12 +771,14 @@ export const zCoreMetadata = z
steps: z.number().int().nullish(), steps: z.number().int().nullish(),
scheduler: z.string().nullish(), scheduler: z.string().nullish(),
clip_skip: z.number().int().nullish(), clip_skip: z.number().int().nullish(),
model: zMainOrOnnxModel.nullish(), model: z
controlnets: z.array(zControlField).nullish(), .union([zMainModel.deepPartial(), zOnnxModel.deepPartial()])
.nullish(),
controlnets: z.array(zControlField.deepPartial()).nullish(),
loras: z loras: z
.array( .array(
z.object({ z.object({
lora: zLoRAModelField, lora: zLoRAModelField.deepPartial(),
weight: z.number(), weight: z.number(),
}) })
) )
@ -784,15 +788,15 @@ export const zCoreMetadata = z
init_image: z.string().nullish(), init_image: z.string().nullish(),
positive_style_prompt: z.string().nullish(), positive_style_prompt: z.string().nullish(),
negative_style_prompt: z.string().nullish(), negative_style_prompt: z.string().nullish(),
refiner_model: zSDXLRefinerModel.nullish(), refiner_model: zSDXLRefinerModel.deepPartial().nullish(),
refiner_cfg_scale: z.number().nullish(), refiner_cfg_scale: z.number().nullish(),
refiner_steps: z.number().int().nullish(), refiner_steps: z.number().int().nullish(),
refiner_scheduler: z.string().nullish(), refiner_scheduler: z.string().nullish(),
refiner_positive_aesthetic_store: z.number().nullish(), refiner_positive_aesthetic_score: z.number().nullish(),
refiner_negative_aesthetic_store: z.number().nullish(), refiner_negative_aesthetic_score: z.number().nullish(),
refiner_start: z.number().nullish(), refiner_start: z.number().nullish(),
}) })
.catchall(z.record(z.any())); .passthrough();
export type CoreMetadata = z.infer<typeof zCoreMetadata>; export type CoreMetadata = z.infer<typeof zCoreMetadata>;

View File

@ -1,4 +1,6 @@
import * as png from '@stevebel/png'; import * as png from '@stevebel/png';
import { logger } from 'app/logging/logger';
import { parseify } from 'common/util/serialize';
import { import {
ImageMetadataAndWorkflow, ImageMetadataAndWorkflow,
zCoreMetadata, zCoreMetadata,
@ -18,6 +20,11 @@ export const getMetadataAndWorkflowFromImageBlob = async (
const metadataResult = zCoreMetadata.safeParse(JSON.parse(rawMetadata)); const metadataResult = zCoreMetadata.safeParse(JSON.parse(rawMetadata));
if (metadataResult.success) { if (metadataResult.success) {
data.metadata = metadataResult.data; data.metadata = metadataResult.data;
} else {
logger('system').error(
{ error: parseify(metadataResult.error) },
'Problem reading metadata from image'
);
} }
} }
@ -26,6 +33,11 @@ export const getMetadataAndWorkflowFromImageBlob = async (
const workflowResult = zWorkflow.safeParse(JSON.parse(rawWorkflow)); const workflowResult = zWorkflow.safeParse(JSON.parse(rawWorkflow));
if (workflowResult.success) { if (workflowResult.success) {
data.workflow = workflowResult.data; data.workflow = workflowResult.data;
} else {
logger('system').error(
{ error: parseify(workflowResult.error) },
'Problem reading workflow from image'
);
} }
} }

View File

@ -60,9 +60,9 @@ export const addSDXLRefinerToGraph = (
if (metadataAccumulator) { if (metadataAccumulator) {
metadataAccumulator.refiner_model = refinerModel; metadataAccumulator.refiner_model = refinerModel;
metadataAccumulator.refiner_positive_aesthetic_store = metadataAccumulator.refiner_positive_aesthetic_score =
refinerPositiveAestheticScore; refinerPositiveAestheticScore;
metadataAccumulator.refiner_negative_aesthetic_store = metadataAccumulator.refiner_negative_aesthetic_score =
refinerNegativeAestheticScore; refinerNegativeAestheticScore;
metadataAccumulator.refiner_cfg_scale = refinerCFGScale; metadataAccumulator.refiner_cfg_scale = refinerCFGScale;
metadataAccumulator.refiner_scheduler = refinerScheduler; metadataAccumulator.refiner_scheduler = refinerScheduler;

View File

@ -341,8 +341,8 @@ export const useRecallParameters = () => {
refiner_cfg_scale, refiner_cfg_scale,
refiner_steps, refiner_steps,
refiner_scheduler, refiner_scheduler,
refiner_positive_aesthetic_store, refiner_positive_aesthetic_score,
refiner_negative_aesthetic_store, refiner_negative_aesthetic_score,
refiner_start, refiner_start,
} = metadata; } = metadata;
@ -403,21 +403,21 @@ export const useRecallParameters = () => {
if ( if (
isValidSDXLRefinerPositiveAestheticScore( isValidSDXLRefinerPositiveAestheticScore(
refiner_positive_aesthetic_store refiner_positive_aesthetic_score
) )
) { ) {
dispatch( dispatch(
setRefinerPositiveAestheticScore(refiner_positive_aesthetic_store) setRefinerPositiveAestheticScore(refiner_positive_aesthetic_score)
); );
} }
if ( if (
isValidSDXLRefinerNegativeAestheticScore( isValidSDXLRefinerNegativeAestheticScore(
refiner_negative_aesthetic_store refiner_negative_aesthetic_score
) )
) { ) {
dispatch( dispatch(
setRefinerNegativeAestheticScore(refiner_negative_aesthetic_store) setRefinerNegativeAestheticScore(refiner_negative_aesthetic_score)
); );
} }