UNPKG

sd-parsers

Version:

A library to read metadata from images created by Stable Diffusion

77 lines 3.08 kB
"use strict"; 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