sd-parsers
Version:
A library to read metadata from images created by Stable Diffusion
77 lines • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NovelAIParser = void 0;
const parser_1 = require("./parser");
const data_1 = require("../data");
const exceptions_1 = require("../exceptions");
const SAMPLER_PARAMS = ['seed', 'strength', 'noise', 'scale', 'steps'];
const REPLACEMENT_RULES = [];
/**
* Parser for images generated by NovelAI
*/
class NovelAIParser extends parser_1.Parser {
constructor() {
super(...arguments);
this.generator = data_1.Generators.NOVELAI;
}
async parse(parameters) {
let metadata;
let params;
let source;
try {
// Handle different input formats
if (parameters.parameters) {
// Format 1: parameters field contains JSON string or object
if (typeof parameters.parameters === 'string') {
metadata = JSON.parse(parameters.parameters);
}
else {
metadata = parameters.parameters;
}
params = metadata.prompt || '';
source = metadata.source || '';
}
else {
// Format 2: NovelAI standard fields
metadata = JSON.parse(parameters.Comment || '{}');
params = parameters.Description || '';
source = parameters.Source || '';
}
}
catch (error) {
throw new exceptions_1.ParserError(`Error reading parameter values: ${error}`);
}
let samplerName;
try {
samplerName = metadata.sampler;
if (!samplerName) {
throw new Error('Sampler name not found');
}
delete metadata.sampler;
const samplerParams = Object.fromEntries((0, parser_1.popKeys)(SAMPLER_PARAMS, metadata));
const normalizedParams = this.normalizeParameters(samplerParams, REPLACEMENT_RULES);
const prompts = params?.trim() ? [(0, data_1.createPrompt)(params.trim())] : [];
const negativePrompt = metadata.uc;
delete metadata.uc;
const negativePrompts = negativePrompt ? [(0, data_1.createPrompt)(negativePrompt)] : [];
// Extract model from source
let model = undefined;
const modelMatch = source?.match(/^(.*?)\s+([A-Z0-9]+)$/);
if (modelMatch) {
const [, modelName, modelHash] = modelMatch;
model = (0, data_1.createModel)({ name: modelName, hash: modelHash });
}
const sampler = (0, data_1.createSampler)(samplerName, normalizedParams, {
model,
prompts,
negativePrompts
});
return (0, data_1.createPromptInfo)(this.generator, [sampler], metadata, parameters);
}
catch (error) {
throw new exceptions_1.ParserError(`No sampler found: ${error}`);
}
}
}
exports.NovelAIParser = NovelAIParser;
//# sourceMappingURL=novelai.js.map