diff --git a/example/generate_image_test_samplers.py b/example/generate_image_test_samplers.py index d211cb3..6f0746f 100644 --- a/example/generate_image_test_samplers.py +++ b/example/generate_image_test_samplers.py @@ -12,7 +12,7 @@ from pathlib import Path from example.boilerplate import API -from novelai_api.ImagePreset import ImageModel, ImagePreset, ImageResolution, ImageSampler, UCPreset +from novelai_api.ImagePreset import ImageModel, ImagePreset, ImageSampler, UCPreset from novelai_api.NovelAIError import NovelAIError @@ -23,22 +23,13 @@ async def main(): async with API() as api_handler: api = api_handler.api - model = ImageModel.Anime_v3 + model = ImageModel.Furry_v3 preset = ImagePreset.from_default_config(model) - preset.resolution = ImageResolution.Normal_Portrait_v3 - preset.seed = 1796796669 - preset.scale = 5 - preset.uc_preset = UCPreset.Preset_None - preset.uc = "{{{worst quality, low quality, bad fingers}}}," - - preset.quality_toggle = False - - prompt = ( - "1girl, smile to viewer, sunny day, frilly white dress, lens flare, sunrays, " - "{{detailed fingers, bold outline}}, best quality, amazing quality, very aesthetic, absurdres" - ) - samplers = [ImageSampler.ddim] + preset.uc_preset = UCPreset.Preset_Light + + prompt = "1girl" + samplers = list(ImageSampler) for sampler in samplers: preset.sampler = sampler diff --git a/novelai_api/ImagePreset.py b/novelai_api/ImagePreset.py index 04864e5..3389607 100644 --- a/novelai_api/ImagePreset.py +++ b/novelai_api/ImagePreset.py @@ -30,6 +30,8 @@ class ImageModel(enum.Enum): Anime_v3 = "nai-diffusion-3" Inpainting_Anime_v3 = "nai-diffusion-3-inpainting" + Furry_v3 = "nai-diffusion-furry-3" + Inpainting_Furry_v3 = "nai-diffusion-furry-3-inpainting" class ControlNetModel(enum.Enum): @@ -186,6 +188,16 @@ class ImagePreset: UCPreset.Preset_Light: "nsfw, lowres, jpeg artifacts, worst quality, watermark, blurry, very displeasing", UCPreset.Preset_None: "lowres", }, + ImageModel.Furry_v3: { + UCPreset.Preset_Heavy: "nsfw, {{worst quality}}, [displeasing], {unusual pupils}, guide lines, " + "{{unfinished}}, {bad}, url, artist name, {{tall image}}, mosaic, {sketch page}, comic panel, " + "impact (font), [dated], {logo}, ych, {what}, {where is your god now}, {distorted text}, repeated text, " + "{floating head}, {1994}, {widescreen}, absolutely everyone, sequence, {compression artifacts}, " + "hard translated, {cropped}, {commissioner name}, unknown text, high contrast", + UCPreset.Preset_Light: "{worst quality}, guide lines, unfinished, bad, url, tall image, widescreen, " + "compression artifacts, unknown text", + UCPreset.Preset_None: "lowres", + }, } # inpainting presets are the same as the normal ones @@ -337,6 +349,14 @@ def from_v3_config(cls): return cls.from_file(Path(__file__).parent / "image_presets" / "presets_v3" / "default.preset") + @classmethod + def from_v3_furry_config(cls): + """ + Create a new ImagePreset with the default settings from the v3 furry config + """ + + return cls.from_file(Path(__file__).parent / "image_presets" / "presets_v3" / "default_furry.preset") + @classmethod def from_default_config(cls, model: ImageModel) -> "ImagePreset": """ @@ -358,6 +378,8 @@ def from_default_config(cls, model: ImageModel) -> "ImagePreset": return cls.from_v2_config() elif model in (ImageModel.Anime_v3, ImageModel.Inpainting_Anime_v3): return cls.from_v3_config() + elif model in (ImageModel.Furry_v3, ImageModel.Inpainting_Furry_v3): + return cls.from_v3_furry_config() def __setitem__(self, key: str, value: Any): if key not in self._TYPE_MAPPING: diff --git a/novelai_api/_high_level.py b/novelai_api/_high_level.py index 8452955..f095b24 100644 --- a/novelai_api/_high_level.py +++ b/novelai_api/_high_level.py @@ -495,7 +495,12 @@ async def generate_image( prompt = f"masterpiece, best quality, {prompt}" elif model is ImageModel.Anime_v2: prompt = f"very aesthetic, best quality, absurdres, {prompt}" - elif model in (ImageModel.Anime_v3, ImageModel.Inpainting_Anime_v3): + elif model in ( + ImageModel.Anime_v3, + ImageModel.Inpainting_Anime_v3, + ImageModel.Furry_v3, + ImageModel.Inpainting_Furry_v3, + ): prompt = f"{prompt}, best quality, amazing quality, very aesthetic, absurdres" async for e in self._parent.low_level.generate_image(prompt, model, action, settings): diff --git a/novelai_api/image_presets/presets_v3/default_furry.preset b/novelai_api/image_presets/presets_v3/default_furry.preset new file mode 100644 index 0000000..edf5a4f --- /dev/null +++ b/novelai_api/image_presets/presets_v3/default_furry.preset @@ -0,0 +1,26 @@ +{ + "resolution": "Normal_Portrait_v3", + "scale": 6.2, + "sampler": "k_euler_ancestral", + "steps": 28, + "n_samples": 1, + "strength": 0.7, + "noise": 0, + "uc_preset": "Preset_Heavy", + "quality_toggle": true, + "auto_smea": true, + "smea": false, + "smea_dyn": false, + "decrisper": false, + "controlnet_strength": 1, + "legacy": false, + "add_original_image": true, + "uncond_scale": 1, + "cfg_rescale": 0, + "noise_schedule": "native", + "legacy_v3_extend": false, + "params_version": 1, + + "seed": 0, + "uc": "" +} diff --git a/pyproject.toml b/pyproject.toml index 2ede849..4beaa49 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ jsonschema = "^4.21.1" tokenizers = "^0.15.1" ftfy = "^6.1.3" regex = "^2023.12.25" -sentencepiece = "^0.1.98" +sentencepiece = "^0.2.0" poetry = "^1.7.1" # msgpack = "^1.0.5" diff --git a/tests/api/test_imagegen_samplers.py b/tests/api/test_imagegen_samplers.py index e1ebc44..3bb1927 100644 --- a/tests/api/test_imagegen_samplers.py +++ b/tests/api/test_imagegen_samplers.py @@ -19,6 +19,7 @@ models.remove(ImageModel.Inpainting_Anime_Curated) models.remove(ImageModel.Inpainting_Furry) models.remove(ImageModel.Inpainting_Anime_v3) +models.remove(ImageModel.Inpainting_Furry_v3) samplers = list(ImageSampler) model_samplers = list(itertools.product(models, samplers))