Repository: LlmKira/novelai-python (language: python)

Issue:
Measure prompt length
https://github.com/NovelAI/novelai-tokenizer


Discussion / hints:

Fix patch:
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 0000000..4027252
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,15 @@
+# Contributing Guidelines
+
+Pull requests, bug reports, and all other forms of contribution are welcomed and highly encouraged! :octocat:
+
+## 📝 Overview
+
+- `src/novelai_python/utils` should only contain **utility** functions **for** other modules. Tool **interfaces** are
+  not allowed to be placed in this directory.
+
+## 📦 Branching
+
+- `main` is the default branch.
+- `dev` is the development branch.
+
+We work on the `dev` branch and create pull requests to merge into `main`.
diff --git a/NOTICE.MD b/NOTICE.MD
index 5773a72..62837e7 100755
--- a/NOTICE.MD
+++ b/NOTICE.MD
@@ -4,4 +4,7 @@
 
 The MIT license applies to the files in:
 
-    file: "src/novelai_python/sdk/ai/generate_image.py" from https://github.com/HanaokaYuzu/NovelAI-API
\ No newline at end of file
+    file: "src/novelai_python/sdk/ai/generate_image.py" from https://github.com/HanaokaYuzu/NovelAI-API
+    file: "src/novelai_python/tokenizer/novelai.model" from https://github.com/NovelAI/novelai-tokenizer
+    file: "src/novelai_python/tokenizer/novelai_v2.model from https://github.com/NovelAI/novelai-tokenizer
+    file: "src/novelai_python/tool/image_metadata/lsb_injector.py" from https://github.com/NovelAI/novelai-image-metadata
\ No newline at end of file
diff --git a/README.md b/README.md
index ce9a9cc..36d0961 100755
--- a/README.md
+++ b/README.md
@@ -1,18 +1,19 @@
-![banner](./playground/repo-banner-zip.png)
+![banner](https://github.com/LlmKira/novelai-python/blob/dev/playground/banner-raw.png?raw=true)
 
 ---
 
 [![PyPI version](https://badge.fury.io/py/novelai-python.svg)](https://badge.fury.io/py/novelai-python)
 [![Downloads](https://pepy.tech/badge/novelai_python)](https://pepy.tech/project/novelai_python)
 
-✨ Novelai api python sdk with Pydantic
+✨ NovelAI api python sdk with Pydantic
 
-The goal of this repository is to use Pydantic to build legitimate requests to access the Novelai API service.
+The goal of this repository is to use Pydantic to build legitimate requests to access the NovelAI API service.
 
 ### Roadmap 🚧
 
-- [x] utils.NovelAiMetadata
-- [x] utils.random_prompt
+- [x] tool.random_prompt
+- [x] tool.paint_mask
+- [x] tool.image_metadata
 - [x] /ai/generate-image
 - [x] /user/subscription
 - [x] /user/login
@@ -32,7 +33,7 @@ pip install novelai-python
 ```
 
 More examples can be found in the [playground](https://github.com/LlmKira/novelai-python/tree/main/playground)
-directory.
+directory, read code as documentation.
 
 ```python
 import asyncio
@@ -82,7 +83,7 @@ loop.run_until_complete(main())
 #### Random Prompt
 
 ```python
-from novelai_python.utils.random_prompt import RandomPromptGenerator
+from novelai_python.tool.random_prompt import RandomPromptGenerator
 
 s = RandomPromptGenerator(nsfw_enabled=False).random_prompt()
 print(s)
diff --git a/pdm.lock b/pdm.lock
index cec077d..7dc89df 100755
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
 groups = ["default", "dev", "testing"]
 strategy = ["cross_platform", "inherit_metadata"]
 lock_version = "4.4.1"
-content_hash = "sha256:5fc3571d83c68c12f732e371eaa12f154c8d71625917bca1ba385ce54c9a8f3c"
+content_hash = "sha256:69f52033eaae16d9d6099870b9b315bce185e465112d73eeb14ffbab651e9563"
 
 [[package]]
 name = "annotated-types"
@@ -894,6 +894,28 @@ files = [
     {file = "pydantic_settings-2.2.1.tar.gz", hash = "sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed"},
 ]
 
+[[package]]
+name = "pynacl"
+version = "1.5.0"
+requires_python = ">=3.6"
+summary = "Python binding to the Networking and Cryptography (NaCl) library"
+groups = ["default"]
+dependencies = [
+    "cffi>=1.4.1",
+]
+files = [
+    {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"},
+    {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"},
+    {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"},
+]
+
 [[package]]
 name = "pytest"
 version = "8.0.2"
@@ -997,6 +1019,55 @@ files = [
     {file = "safer-4.12.3.tar.gz", hash = "sha256:264eb65b2c4efa324099054015a07917cd7b31ae03f8f04471696b474890c9c1"},
 ]
 
+[[package]]
+name = "sentencepiece"
+version = "0.2.0"
+summary = "SentencePiece python wrapper"
+groups = ["default"]
+files = [
+    {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:188779e1298a1c8b8253c7d3ad729cb0a9891e5cef5e5d07ce4592c54869e227"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bed9cf85b296fa2b76fc2547b9cbb691a523864cebaee86304c43a7b4cb1b452"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7b67e724bead13f18db6e1d10b6bbdc454af574d70efbb36f27d90387be1ca3"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fde4b08cfe237be4484c6c7c2e2c75fb862cfeab6bd5449ce4caeafd97b767a"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c378492056202d1c48a4979650981635fd97875a00eabb1f00c6a236b013b5e"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1380ce6540a368de2ef6d7e6ba14ba8f3258df650d39ba7d833b79ee68a52040"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-win32.whl", hash = "sha256:a1151d6a6dd4b43e552394aed0edfe9292820272f0194bd56c7c1660a0c06c3d"},
+    {file = "sentencepiece-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:d490142b0521ef22bc1085f061d922a2a6666175bb6b42e588ff95c0db6819b2"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17982700c4f6dbb55fa3594f3d7e5dd1c8659a274af3738e33c987d2a27c9d5c"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c867012c0e8bcd5bdad0f791609101cb5c66acb303ab3270218d6debc68a65e"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd6071249c74f779c5b27183295b9202f8dedb68034e716784364443879eaa6"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f90c55a65013cbb8f4d7aab0599bf925cde4adc67ae43a0d323677b5a1c6cb"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b293734059ef656dcd65be62ff771507bea8fed0a711b6733976e1ed3add4553"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e58b47f933aca74c6a60a79dcb21d5b9e47416256c795c2d58d55cec27f9551d"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-win32.whl", hash = "sha256:c581258cf346b327c62c4f1cebd32691826306f6a41d8c4bec43b010dee08e75"},
+    {file = "sentencepiece-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0993dbc665f4113017892f1b87c3904a44d0640eda510abcacdfb07f74286d36"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea5f536e32ea8ec96086ee00d7a4a131ce583a1b18d130711707c10e69601cb2"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0cb51f53b6aae3c36bafe41e86167c71af8370a039f542c43b0cce5ef24a68c"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3212121805afc58d8b00ab4e7dd1f8f76c203ddb9dc94aa4079618a31cf5da0f"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3149e3066c2a75e0d68a43eb632d7ae728c7925b517f4c05c40f6f7280ce08"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632f3594d3e7ac8b367bca204cb3fd05a01d5b21455acd097ea4c0e30e2f63d7"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f295105c6bdbb05bd5e1b0cafbd78ff95036f5d3641e7949455a3f4e5e7c3109"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-win32.whl", hash = "sha256:fb89f811e5efd18bab141afc3fea3de141c3f69f3fe9e898f710ae7fe3aab251"},
+    {file = "sentencepiece-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a673a72aab81fef5ebe755c6e0cc60087d1f3a4700835d40537183c1703a45f"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20813a68d4c221b1849c62c30e1281ea81687894d894b8d4a0f4677d9311e0f5"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:926ef920ae2e8182db31d3f5d081ada57804e3e1d3a8c4ef8b117f9d9fb5a945"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89f65f69636b7e9c015b79dff9c9985a9bc7d19ded6f79ef9f1ec920fdd73ecf"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f67eae0dbe6f2d7d6ba50a354623d787c99965f068b81e145d53240198021b0"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98501e075f35dd1a1d5a20f65be26839fcb1938752ec61539af008a5aa6f510b"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d1d2cc4882e8d6a1adf9d5927d7716f80617fc693385661caff21888972269"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-win32.whl", hash = "sha256:b99a308a2e5e569031ab164b74e6fab0b6f37dfb493c32f7816225f4d411a6dd"},
+    {file = "sentencepiece-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:cdb701eec783d3ec86b7cd4c763adad8eaf6b46db37ee1c36e5e6c44b3fe1b5f"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1e0f9c4d0a6b0af59b613175f019916e28ade076e21242fd5be24340d8a2f64a"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:298f21cc1366eb60311aedba3169d30f885c363ddbf44214b0a587d2908141ad"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f1ec95aa1e5dab11f37ac7eff190493fd87770f7a8b81ebc9dd768d1a3c8704"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b06b70af54daa4b4904cbb90b4eb6d35c9f3252fdc86c9c32d5afd4d30118d8"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e37bac44dd6603388cb598c64ff7a76e41ca774646f21c23aadfbf5a2228ab"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0461324897735512a32d222e3d886e24ad6a499761952b6bda2a9ee6e4313ea5"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-win32.whl", hash = "sha256:38aed822fb76435fa1f12185f10465a94ab9e51d5e8a9159e9a540ce926f0ffd"},
+    {file = "sentencepiece-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:d8cf876516548b5a1d6ac4745d8b554f5c07891d55da557925e5c13ff0b4e6ad"},
+    {file = "sentencepiece-0.2.0.tar.gz", hash = "sha256:a52c19171daaf2e697dc6cbe67684e0fa341b1248966f6aebb541de654d15843"},
+]
+
 [[package]]
 name = "setuptools"
 version = "69.1.1"
diff --git a/playground/banner-raw.png b/playground/banner-raw.png
new file mode 100644
index 0000000..705e400
Binary files /dev/null and b/playground/banner-raw.png differ
diff --git a/playground/image_metadata/read_image.py b/playground/image_metadata/read_image.py
new file mode 100644
index 0000000..ae9f74e
--- /dev/null
+++ b/playground/image_metadata/read_image.py
@@ -0,0 +1,27 @@
+from pathlib import Path
+
+from PIL import Image
+import json
+from io import BytesIO
+from loguru import logger
+
+image_io = Path(__file__).parent.joinpath("sample-0316.png")
+with Image.open(image_io) as img:
+    title = img.info.get("Title", None)
+    prompt = img.info.get("Description", None)
+    comment = img.info.get("Comment", None)
+    assert isinstance(comment, str), ValueError("Comment Empty")
+    try:
+        comment = json.loads(comment)
+    except Exception as e:
+        logger.debug(e)
+        comment = {}
+print(title)
+print(prompt)
+print(comment)
+
+"""
+AI generated image
+ silvery white, best quality, amazing quality, very aesthetic, absurdres
+{'prompt': ' silvery white, best quality, amazing quality, very aesthetic, absurdres', 'steps': 28, 'height': 128, 'width': 128, 'scale': 10.0, 'uncond_scale': 1.0, 'cfg_rescale': 0.38, 'seed': 1148692016, 'n_samples': 1, 'hide_debug_overlay': False, 'noise_schedule': 'native', 'legacy_v3_extend': False, 'reference_information_extracted': 0.87, 'reference_strength': 1.0, 'sampler': 'k_euler', 'controlnet_strength': 1.0, 'controlnet_model': None, 'dynamic_thresholding': False, 'dynamic_thresholding_percentile': 0.999, 'dynamic_thresholding_mimic_scale': 10.0, 'sm': True, 'sm_dyn': True, 'skip_cfg_below_sigma': 0.0, 'lora_unet_weights': None, 'lora_clip_weights': None, 'uc': 'nsfw, lowres, {bad}, error, fewer, extra, missing, worst quality, jpeg artifacts, bad quality, watermark, unfinished, displeasing, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract], small', 'request_type': 'PromptGenerateRequest', 'signed_hash': 'GmLfTgQTOI4WRcTloiSmenArH/Y8szJdVJ1DW18yeqYPkqw3o1zellB4xCQFYle+0tuF9KVP8RkHiDNbQXr0DA=='}
+"""
diff --git a/playground/image_metadata/read_lsb.py b/playground/image_metadata/read_lsb.py
new file mode 100644
index 0000000..8d0bc24
--- /dev/null
+++ b/playground/image_metadata/read_lsb.py
@@ -0,0 +1,12 @@
+import os
+from pathlib import Path
+
+from novelai_python.tool.image_metadata.lsb_extractor import ImageDataExtractor
+
+image = Path(__file__).parent.joinpath("sample-0316.png")
+try:
+    data = ImageDataExtractor().extract_data(image)
+except ValueError:
+    raise LookupError("Cant find a MetaData")
+
+print(data)
diff --git a/playground/image_metadata/read_nai_tag.py b/playground/image_metadata/read_nai_tag.py
new file mode 100644
index 0000000..291fa1e
--- /dev/null
+++ b/playground/image_metadata/read_nai_tag.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# @Time    : 2024/2/8 下午4:57
+# @Author  : sudoskys
+# @File    : read_nai_tag.py
+
+import os
+from pathlib import Path
+
+from novelai_python.tool.image_metadata import ImageMetadata
+
+image = Path(__file__).parent.joinpath("sample-0316.png")
+try:
+    meta = ImageMetadata.load_image(image)
+except ValueError:
+    raise LookupError("Cant find a MetaData")
+
+print(meta.Title)
+print(meta.Description)
+print(meta.Comment)
diff --git a/playground/image_metadata/sample-0316.png b/playground/image_metadata/sample-0316.png
new file mode 100644
index 0000000..104e5fc
Binary files /dev/null and b/playground/image_metadata/sample-0316.png differ
diff --git a/playground/image_metadata/verify.py b/playground/image_metadata/verify.py
new file mode 100644
index 0000000..1b44012
--- /dev/null
+++ b/playground/image_metadata/verify.py
@@ -0,0 +1,14 @@
+import os
+from pathlib import Path
+
+from PIL import Image
+
+from novelai_python.tool.image_metadata import ImageMetadata
+
+image = Path(__file__).parent.joinpath("sample-0316.png")
+try:
+    verify = ImageMetadata.verify_image_is_novelai(Image.open(image))
+except ValueError:
+    raise LookupError("Cant find a MetaData")
+
+print(f"It is a NovelAI image: {verify}")
diff --git a/playground/queue_select.py b/playground/other/queue_select.py
old mode 100755
new mode 100644
similarity index 96%
rename from playground/queue_select.py
rename to playground/other/queue_select.py
index 08282ca..1f70350
--- a/playground/queue_select.py
+++ b/playground/other/queue_select.py
@@ -2,7 +2,7 @@
 # @Time    : 2024/2/11 下午12:29
 # @Author  : sudoskys
 # @File    : queue_select.py
-# @Software: PyCharm
+
 from novelai_python.utils.useful import QueSelect
 
 ####
diff --git a/playground/mask/__init__.py b/playground/paint_mask/__init__.py
old mode 100755
new mode 100644
similarity index 90%
rename from playground/mask/__init__.py
rename to playground/paint_mask/__init__.py
index 0a16f62..09e3d7c
--- a/playground/mask/__init__.py
+++ b/playground/paint_mask/__init__.py
@@ -3,7 +3,7 @@
 # @Author  : sudoskys
 # @File    : __init__.py.py
 # @Software: PyCharm
-from novelai_python.utils.useful import create_mask_from_sketch
+from novelai_python.tool.paint_mask import create_mask_from_sketch
 
 with open('sk.jpg', 'rb') as f:
     sk_bytes = f.read()
diff --git a/playground/prompt_factory_exp/gen.py b/playground/prompt_factory_exp/gen.py
deleted file mode 100644
index a5aa7bf..0000000
--- a/playground/prompt_factory_exp/gen.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from novelai_python.utils.prompt_factory import Generator, DataSelector
-
-gens = Generator(pool=[
-
-]
-    , class_sample=5, tag_sample=1, tag_piece=0,
-)
-print(gens.generate_pool())
-ori, cle = gens.generate(enable_nsfw=False, enable_illustrator=True)
-print(ori, cle)
-print(", ".join(cle))
diff --git a/playground/prompt_factory_exp/loader.py b/playground/prompt_factory_exp/loader.py
deleted file mode 100644
index 5b14baa..0000000
--- a/playground/prompt_factory_exp/loader.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from novelai_python.utils.prompt_factory import Loader, DataSelector
-
-data = Loader(source=DataSelector.ACTION)
-tag = data.random_tag(sub_type=DataSelector.ACTION.FOOD, n=1000)
-print(tag)
-print(data.attributes)
diff --git a/playground/random_prompt.py b/playground/random_prompt.py
index 40b124a..cf0239d 100755
--- a/playground/random_prompt.py
+++ b/playground/random_prompt.py
@@ -4,7 +4,7 @@
 # @File    : random_prompt.py
 # @Software: PyCharm
 
-from novelai_python.utils.random_prompt import RandomPromptGenerator
+from novelai_python.tool.random_prompt import RandomPromptGenerator
 
 gen = RandomPromptGenerator(nsfw_enabled=True)
 print(gen.get_weighted_choice([[1, 35], [2, 20], [3, 7]], []))
diff --git a/playground/read_nai_tag.py b/playground/read_nai_tag.py
deleted file mode 100755
index b927630..0000000
--- a/playground/read_nai_tag.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-# @Time    : 2024/2/8 下午4:57
-# @Author  : sudoskys
-# @File    : read_nai_tag.py
-# @Software: PyCharm
-import os
-
-from novelai_python.utils import NovelAiMetadata
-
-if not os.path.exists("generate_image.png"):
-    raise FileNotFoundError("generate_image.png not found,pls run generate_image.py first")
-try:
-    meta = NovelAiMetadata.build_from_img(image_io="generate_image.png")  # OR BytesIO(data)
-except ValueError:
-    raise LookupError("Cant find a MetaData")
-
-print(meta.title)
-print(meta.description)
-print(meta.comment)
diff --git a/playground/repo-banner-zip.png b/playground/repo-banner-zip.png
deleted file mode 100644
index bcee56b..0000000
Binary files a/playground/repo-banner-zip.png and /dev/null differ
diff --git a/playground/tokenizer/usage.py b/playground/tokenizer/usage.py
new file mode 100644
index 0000000..fe4b6bb
--- /dev/null
+++ b/playground/tokenizer/usage.py
@@ -0,0 +1,8 @@
+from novelai_python.tokenizer import TokenizerUtil
+
+tokenizer_util = TokenizerUtil(TokenizerUtil.MODEL_V2_PATH)
+text = "The quick brown fox jumps over the goblin."
+token_id = tokenizer_util.encode(text)
+print("Token IDs:", token_id)
+decoded_text = tokenizer_util.decode(token_id)
+print("Decoded text:", decoded_text)
diff --git a/playground/vibe_inpaint.py b/playground/vibe_inpaint.py
index 8b32bcb..18d4075 100644
--- a/playground/vibe_inpaint.py
+++ b/playground/vibe_inpaint.py
@@ -9,7 +9,7 @@
 from novelai_python import GenerateImageInfer, ImageGenerateResp, JwtCredential
 from novelai_python.sdk.ai.generate_image import Action, Sampler, Model
 from novelai_python.utils.useful import enum_to_list
-from novelai_python.utils.useful import create_mask_from_sketch
+from novelai_python.tool.paint_mask import create_mask_from_sketch
 
 with open('static_image.png', 'rb') as f:
     ori_bytes = f.read()
diff --git a/pyproject.toml b/pyproject.toml
index 393aa0f..ecf858f 100755
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
 [project]
 name = "novelai-python"
-version = "0.3.8"
-description = "Novelai Python Binding With Pydantic"
+version = "0.4.0"
+description = "NovelAI Python Binding With Pydantic"
 authors = [
     { name = "sudoskys", email = "coldlando@hotmail.com" },
 ]
@@ -21,6 +21,8 @@ dependencies = [
     "opencv-python>=4.8.1.78",
     "fake-useragent>=1.4.0",
     "tenacity>=8.2.3",
+    "sentencepiece>=0.2.0",
+    "pynacl>=1.5.0",
 ]
 requires-python = ">=3.8"
 readme = "README.md"
diff --git a/src/novelai_python/__init__.py b/src/novelai_python/__init__.py
index d02793c..02dc1fe 100755
--- a/src/novelai_python/__init__.py
+++ b/src/novelai_python/__init__.py
@@ -1,8 +1,7 @@
 # -*- coding: utf-8 -*-
 # @Time    : 2023/11/18 上午12:18
 # @Author  : sudoskys
-# @File    : __init__.py.py
-# @Software: PyCharm
+# @File    : __init__.py
 
 from ._exceptions import (
     NovelAiError,
diff --git a/src/novelai_python/_exceptions.py b/src/novelai_python/_exceptions.py
index 6ab2b16..831808d 100755
--- a/src/novelai_python/_exceptions.py
+++ b/src/novelai_python/_exceptions.py
@@ -2,8 +2,8 @@
 # @Time    : 2024/1/26 上午10:55
 # @Author  : sudoskys
 # @File    : _exceptions.py
-# @Software: PyCharm
-from typing import Any, Optional, Union, Dict
+
+from typing import Any, Union, Dict
 
 
 class NovelAiError(Exception):
@@ -11,7 +11,6 @@ class NovelAiError(Exception):
     NovelAiError is the base exception for all novelai_python errors.
     """
     message: str
-    exception: Optional[Exception] = None
 
     def __init__(self, message: str) -> None:
         self.message = message
@@ -42,10 +41,15 @@ class APIError(NovelAiError):
     APIError is raised when the API returns an error.
     """
     request: Any
-    code: Optional[str] = None
+    code: Union[str, None] = None
     response: Union[Dict[str, Any], str] = None
 
-    def __init__(self, message: str, request: Any, response: Union[Dict[str, Any], str], code: Optional[str]) -> None:
+    def __init__(self,
+                 message: str,
+                 request: Any,
+                 response: Union[Dict[str, Any], str],
+                 code: Union[str, None]
+                 ) -> None:
         super().__init__(message)
         self.request = request
         self.response = response
diff --git a/src/novelai_python/sdk/ai/generate_image/__init__.py b/src/novelai_python/sdk/ai/generate_image/__init__.py
index d95d5f8..0f7f28e 100755
--- a/src/novelai_python/sdk/ai/generate_image/__init__.py
+++ b/src/novelai_python/sdk/ai/generate_image/__init__.py
@@ -26,12 +26,12 @@
 from ...._exceptions import APIError, AuthError, ConcurrentGenerationError, SessionHttpError
 from ...._response.ai.generate_image import ImageGenerateResp
 from ....credential import CredentialBase
-from ....utils import try_jsonfy, NovelAiMetadata
+from ....utils import try_jsonfy
 from PIL import Image
 
 
 class GenerateImageInfer(ApiBaseModel):
-    _endpoint: Optional[str] = PrivateAttr("https://image.novelai.net")
+    _endpoint: str = PrivateAttr("https://image.novelai.net")
 
     class Params(BaseModel):
         add_original_image: Optional[bool] = Field(True, description="Overlay Original Image")
@@ -523,13 +523,11 @@ async def request(self,
                       session: Union[AsyncSession, "CredentialBase"],
                       *,
                       override_headers: Optional[dict] = None,
-                      remove_sign: bool = False
                       ) -> ImageGenerateResp:
         """
         生成图片
-        :param override_headers:
+        :param override_headers: the headers to override
         :param session:  session
-        :param remove_sign:  移除追踪信息
         :return:
         """
         # Data Build
@@ -610,10 +608,6 @@ async def request(self,
                     )
                 for filename in file_list:
                     data = zip_file.read(filename)
-                    if remove_sign:
-                        data = NovelAiMetadata.rehash(BytesIO(data), remove_stealth=True)
-                        if not isinstance(data, bytes):
-                            data = data.getvalue()
                     unzip_content.append((filename, data))
             return ImageGenerateResp(
                 meta=ImageGenerateResp.RequestParams(
diff --git a/src/novelai_python/sdk/ai/generate_image/suggest_tags.py b/src/novelai_python/sdk/ai/generate_image/suggest_tags.py
index 84fc8b5..7ffd069 100755
--- a/src/novelai_python/sdk/ai/generate_image/suggest_tags.py
+++ b/src/novelai_python/sdk/ai/generate_image/suggest_tags.py
@@ -21,7 +21,7 @@
 
 
 class SuggestTags(ApiBaseModel):
-    _endpoint: Optional[str] = PrivateAttr("https://api.novelai.net")
+    _endpoint: str = PrivateAttr("https://api.novelai.net")
     model: Model = Model.NAI_DIFFUSION_3
     prompt: str = "landscape"
 
diff --git a/src/novelai_python/sdk/ai/upscale.py b/src/novelai_python/sdk/ai/upscale.py
index 1b36724..ed9debf 100755
--- a/src/novelai_python/sdk/ai/upscale.py
+++ b/src/novelai_python/sdk/ai/upscale.py
@@ -21,11 +21,11 @@
 from ..._exceptions import APIError, AuthError, SessionHttpError
 from ..._response.ai.upscale import UpscaleResp
 from ...credential import CredentialBase
-from ...utils import try_jsonfy, NovelAiMetadata
+from ...utils import try_jsonfy
 
 
 class Upscale(ApiBaseModel):
-    _endpoint: Optional[str] = PrivateAttr("https://api.novelai.net")
+    _endpoint: str = PrivateAttr("https://api.novelai.net")
     image: Union[str, bytes]  # base64
     width: Optional[int] = None
     height: Optional[int] = None
@@ -97,14 +97,12 @@ async def necessary_headers(self, request_data) -> dict:
     async def request(self,
                       session: Union[AsyncSession, "CredentialBase"],
                       *,
-                      override_headers: Optional[dict] = None,
-                      remove_sign: bool = False
+                      override_headers: Optional[dict] = None
                       ) -> UpscaleResp:
         """
         生成图片
         :param override_headers:
         :param session:  session
-        :param remove_sign:  移除追踪信息
         :return:
         """
         # Data Build
@@ -182,13 +180,6 @@ async def request(self,
                     )
                 for filename in file_list:
                     data = zip_file.read(filename)
-                    if remove_sign:
-                        try:
-                            data = NovelAiMetadata.rehash(BytesIO(data), remove_stealth=True)
-                            if not isinstance(data, bytes):
-                                data = data.getvalue()
-                        except Exception as e:
-                            logger.exception(f"SdkWarn:Remove sign error: {e}")
                     unzip_content.append((filename, data))
             return UpscaleResp(
                 meta=UpscaleResp.RequestParams(
diff --git a/src/novelai_python/sdk/user/login.py b/src/novelai_python/sdk/user/login.py
index f0dfc33..b066a8d 100755
--- a/src/novelai_python/sdk/user/login.py
+++ b/src/novelai_python/sdk/user/login.py
@@ -20,7 +20,7 @@
 
 
 class Login(ApiBaseModel):
-    _endpoint: Optional[str] = PrivateAttr("https://api.novelai.net")
+    _endpoint: str = PrivateAttr("https://api.novelai.net")
     _session: Optional[AsyncSession] = PrivateAttr(None)
     key: str = Field(..., description="User's key")
 
diff --git a/src/novelai_python/sdk/user/subscription.py b/src/novelai_python/sdk/user/subscription.py
index d1e893b..8ac8999 100755
--- a/src/novelai_python/sdk/user/subscription.py
+++ b/src/novelai_python/sdk/user/subscription.py
@@ -20,7 +20,7 @@
 
 
 class Subscription(ApiBaseModel):
-    _endpoint: Optional[str] = PrivateAttr("https://api.novelai.net")
+    _endpoint: str = PrivateAttr("https://api.novelai.net")
 
     @property
     def base_url(self):
diff --git a/src/novelai_python/server.py b/src/novelai_python/server.py
index 94c7faf..8361724 100755
--- a/src/novelai_python/server.py
+++ b/src/novelai_python/server.py
@@ -2,7 +2,7 @@
 # @Time    : 2024/1/30 下午11:05
 # @Author  : sudoskys
 # @File    : server.py
-# @Software: PyCharm
+
 import io
 import sys
 import zipfile
diff --git a/src/novelai_python/tokenizer/__init__.py b/src/novelai_python/tokenizer/__init__.py
new file mode 100644
index 0000000..b32a921
--- /dev/null
+++ b/src/novelai_python/tokenizer/__init__.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+import pathlib
+from typing import List
+
+import sentencepiece as spm
+
+
+class TokenizerUtil:
+    MODEL_V1_PATH = pathlib.Path(__file__).parent.joinpath("novelai.model").absolute().as_posix()
+    MODEL_V2_PATH = pathlib.Path(__file__).parent.joinpath("novelai_v2.model").absolute().as_posix()
+
+    def __init__(self, model_path):
+        self.tokenizer = spm.SentencePieceProcessor(model_file=model_path)  # noqa 401
+
+    def encode(self, raw_text, readable: bool = False):
+        if readable:
+            return self.tokenizer.encode(raw_text, out_type=str)  # noqa 401
+        return self.tokenizer.encode(raw_text)  # noqa 401
+
+    def decode(self, token_ids: List[int]):
+        return self.tokenizer.decode(token_ids)  # noqa 401
+
+
+if __name__ == "__main__":
+    tokenizer_util = TokenizerUtil(TokenizerUtil.MODEL_V1_PATH)
+    text = "The quick brown fox jumps over the goblin."
+    token_id = tokenizer_util.encode(text)
+    print("Token IDs:", token_id)
+    decoded_text = tokenizer_util.decode(token_id)
+    print("Decoded text:", decoded_text)
diff --git a/src/novelai_python/tokenizer/novelai.model b/src/novelai_python/tokenizer/novelai.model
new file mode 100644
index 0000000..b95958a
Binary files /dev/null and b/src/novelai_python/tokenizer/novelai.model differ
diff --git a/src/novelai_python/tokenizer/novelai_v2.model b/src/novelai_python/tokenizer/novelai_v2.model
new file mode 100644
index 0000000..ec24531
Binary files /dev/null and b/src/novelai_python/tokenizer/novelai_v2.model differ
diff --git a/src/novelai_python/tool/__init__.py b/src/novelai_python/tool/__init__.py
new file mode 100644
index 0000000..40a96af
--- /dev/null
+++ b/src/novelai_python/tool/__init__.py
@@ -0,0 +1,1 @@
+# -*- coding: utf-8 -*-
diff --git a/src/novelai_python/tool/image_metadata/__init__.py b/src/novelai_python/tool/image_metadata/__init__.py
new file mode 100644
index 0000000..9dd8ed9
--- /dev/null
+++ b/src/novelai_python/tool/image_metadata/__init__.py
@@ -0,0 +1,160 @@
+# -*- coding: utf-8 -*-
+import base64
+import json
+from io import BytesIO
+from pathlib import Path
+from typing import Union
+
+import numpy as np
+from PIL import Image
+from PIL.PngImagePlugin import PngInfo
+from loguru import logger
+from nacl.encoding import Base64Encoder
+from nacl.signing import VerifyKey
+from pydantic import BaseModel, ConfigDict
+
+from .lsb_extractor import ImageLsbDataExtractor
+
+
+class ImageMetadata(BaseModel):
+    """
+    ImageMetadata is a class that represents the metadata of a NovelAI generated image.
+    """
+
+    class CommentModel(BaseModel):
+        prompt: str
+        steps: int = None
+        height: int = None
+        width: int = None
+        scale: float = None
+        uncond_scale: float = None
+        cfg_rescale: float = None
+        seed: int = None
+        n_samples: int = None
+        hide_debug_overlay: bool = None
+        noise_schedule: str = None
+        legacy_v3_extend: bool = None
+        reference_information_extracted: float = None
+        reference_strength: float = None
+        sampler: str = None
+        controlnet_strength: float = None
+        controlnet_model: Union[None, str] = None
+        dynamic_thresholding: bool = None
+        dynamic_thresholding_percentile: float = None
+        dynamic_thresholding_mimic_scale: float = None
+        sm: bool = None
+        sm_dyn: bool = None
+        skip_cfg_below_sigma: float = None
+        lora_unet_weights: Union[None, str] = None
+        lora_clip_weights: Union[None, str] = None
+        uc: str = None
+        request_type: str = None
+        signed_hash: str = None
+        model_config = ConfigDict(extra="allow")
+
+        @property
+        def negative_prompt(self):
+            return self.uc
+
+    Title: str = "AI generated image"
+    Software: str = "NovelAI"
+    Source: str = None
+    Description: str
+    Comment: CommentModel
+    """
+    AI generated image
+    silvery white, best quality, amazing quality, very aesthetic, absurdres
+    {'prompt': 'silvery white, best quality, amazing quality, very aesthetic, absurdres', 'steps': 28, 'height': 128, 'width': 128, 'scale': 10.0, 'uncond_scale': 1.0, 'cfg_rescale': 0.38, 'seed': 1148692016, 'n_samples': 1, 'hide_debug_overlay': False, 'noise_schedule': 'native', 'legacy_v3_extend': False, 'reference_information_extracted': 0.87, 'reference_strength': 1.0, 'sampler': 'k_euler', 'controlnet_strength': 1.0, 'controlnet_model': None, 'dynamic_thresholding': False, 'dynamic_thresholding_percentile': 0.999, 'dynamic_thresholding_mimic_scale': 10.0, 'sm': True, 'sm_dyn': True, 'skip_cfg_below_sigma': 0.0, 'lora_unet_weights': None, 'lora_clip_weights': None, 'uc': 'nsfw, lowres, {bad}, error, fewer, extra, missing, worst quality, jpeg artifacts, bad quality, watermark, unfinished, displeasing, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract], small', 'request_type': 'PromptGenerateRequest', 'signed_hash': 'GmLfTgQTOI4WRcTloiSmenArH/Y8szJdVJ1DW18yeqYPkqw3o1zellB4xCQFYle+0tuF9KVP8RkHiDNbQXr0DA=='}
+    """
+    model_config = ConfigDict(extra="allow")
+
+    @property
+    def jsonfy(self):
+        return {"Title": self.title, "Description": self.description, "Comment": self.comment.model_dump()}
+
+    @staticmethod
+    def reset_alpha(input_img: BytesIO) -> BytesIO:
+        image = Image.open(input_img).convert('RGBA')
+        data = np.array(image)
+        data[..., 3] = 254
+        new_image = Image.fromarray(data, 'RGBA')
+        _new_img_io = BytesIO()
+        new_image.save(_new_img_io, format="PNG")
+        return _new_img_io
+
+    def write_out(self,
+                  img_io: BytesIO,
+                  *,
+                  remove_lsb: bool = False
+                  ):
+        if remove_lsb:
+            img_io = self.reset_alpha(img_io)
+        with Image.open(img_io) as img:
+            metadata = PngInfo()
+            for k, v in self.jsonfy.items():
+                if isinstance(v, dict):
+                    v = json.dumps(v)
+                metadata.add_text(k, v)
+            _new_img = BytesIO()
+            # Save original image with metadata
+            img.save(_new_img, format="PNG", pnginfo=metadata, optimize=False, compress_level=0)
+        return _new_img
+
+    @classmethod
+    def load_image(cls,
+                   image_io: Union[str, bytes, Path, BytesIO]
+                   ):
+        """
+        Load image and extract metadata using LSB/Metadata
+        :param image_io:
+        :return:
+        """
+        try:
+            image_data = ImageLsbDataExtractor().extract_data(image_io)
+            model = cls(**image_data)
+        except Exception as e:
+            logger.debug(f"Error trying extracting data in LSB: {e}")
+        else:
+            print(model)
+            return model
+        with Image.open(image_io) as img:
+            title = img.info.get("Title", None)
+            prompt = img.info.get("Description", None)
+            comment = img.info.get("Comment", None)
+            assert isinstance(comment, str), ValueError("Comment Empty")
+            try:
+                comment = json.loads(comment)
+            except Exception as e:
+                logger.debug(f"Error loading comment: {e}")
+                comment = {}
+            return cls(Title=title, Description=prompt, Comment=cls.CommentModel(**comment))
+
+    @staticmethod
+    def verify_image_is_novelai(
+            image: Union[Image.Image, np.ndarray],
+            verify_key_hex: str = "Y2JcQAOhLwzwSDUJPNgL04nS0Tbqm7cSRc4xk0vRMic="
+    ) -> bool:
+        # MIT:https://github.com/NovelAI/novelai-image-metadata/blob/main/nai_sig.py
+        if isinstance(image, Image.Image):
+            image = np.array(image)
+        metadata = ImageLsbDataExtractor().extract_data(image)
+
+        if metadata is None:
+            raise RuntimeError("No metadata found in image")
+        if "Comment" not in metadata:
+            raise RuntimeError("Comment not in metadata")
+        comment = metadata["Comment"]
+        if "signed_hash" not in comment:
+            raise RuntimeError("signed_hash not in comment")
+        signed_hash = comment["signed_hash"].encode("utf-8")
+        signed_hash = base64.b64decode(signed_hash)
+        del comment["signed_hash"]
+        verify_key_hex = verify_key_hex.encode("utf-8")
+        verify_key = VerifyKey(verify_key_hex, encoder=Base64Encoder)
+        image_and_comment = image[:, :, :3].tobytes() + json.dumps(comment).encode("utf-8")
+        try:
+            verify_key.verify(image_and_comment, signed_hash)
+        except Exception as e:
+            logger.trace(e)
+            return False
+        return True
diff --git a/src/novelai_python/tool/image_metadata/lsb_extractor.py b/src/novelai_python/tool/image_metadata/lsb_extractor.py
new file mode 100644
index 0000000..d48f3f1
--- /dev/null
+++ b/src/novelai_python/tool/image_metadata/lsb_extractor.py
@@ -0,0 +1,100 @@
+# MIT: https://github.com/NovelAI/novelai-image-metadata/blob/main/nai_meta.py
+from io import BytesIO
+from pathlib import Path
+from typing import Union
+
+from PIL import Image
+import numpy as np
+import gzip
+import json
+
+
+class LSBExtractor(object):
+    def __init__(self, data):
+        self.data = data
+        self.rows, self.cols, self.dim = data.shape
+        self.bits = 0
+        self.byte = 0
+        self.row = 0
+        self.col = 0
+
+    def _extract_next_bit(self):
+        if self.row < self.rows and self.col < self.cols:
+            bit = self.data[self.row, self.col, self.dim - 1] & 1
+            self.bits += 1
+            self.byte <<= 1
+            self.byte |= bit
+            self.row += 1
+            if self.row == self.rows:
+                self.row = 0
+                self.col += 1
+
+    def get_one_byte(self):
+        while self.bits < 8:
+            self._extract_next_bit()
+        byte = bytearray([self.byte])
+        self.bits = 0
+        self.byte = 0
+        return byte
+
+    def get_next_n_bytes(self, n):
+        bytes_list = bytearray()
+        for _ in range(n):
+            byte = self.get_one_byte()
+            if not byte:
+                break
+            bytes_list.extend(byte)
+        return bytes_list
+
+    def read_32bit_integer(self):
+        bytes_list = self.get_next_n_bytes(4)
+        if len(bytes_list) == 4:
+            integer_value = int.from_bytes(bytes_list, byteorder='big')
+            return integer_value
+        else:
+            return None
+
+
+class ImageLsbDataExtractor(object):
+    def __init__(self):
+        self.magic = "stealth_pngcomp"
+
+    def extract_data(self, image: Union[str, bytes, Path, BytesIO, np.ndarray]) -> dict:
+        try:
+            if isinstance(image, Image.Image):
+                image = np.array(image)
+            elif isinstance(image, (str, bytes, Path, BytesIO)):
+                img = Image.open(image)
+                image = np.array(img)
+
+            if not (image.shape[-1] == 4 and len(image.shape) == 3):
+                raise AssertionError('image format error')
+
+            reader = LSBExtractor(image)
+
+            read_magic = reader.get_next_n_bytes(len(self.magic)).decode("utf-8")
+            if not (self.magic == read_magic):
+                raise AssertionError('magic number mismatch')
+
+            read_len = reader.read_32bit_integer() // 8
+            json_data = reader.get_next_n_bytes(read_len)
+
+            json_data = json.loads(gzip.decompress(json_data).decode("utf-8"))
+            if "Comment" in json_data:
+                json_data["Comment"] = json.loads(json_data["Comment"])
+            return json_data
+        except FileNotFoundError:
+            # 无法找到文件
+            raise Exception(f"The file {image} does not exist.")
+
+        except json.JSONDecodeError as e:
+            # 无法解析JSON数据
+            raise Exception(f"Failed to decode JSON data from image: {image}. Error: {str(e)}")
+
+        except AssertionError as err:
+            # 魔数不匹配
+            raise Exception(f"Failed to extract data from image: {image}. Error: {str(err)}")
+
+        except Exception as e:
+            # 从图像中提取数据时发生意外错误
+            raise Exception(f"Unexpected error happened when extracting data from image: {image}. Error: {str(e)}")
diff --git a/src/novelai_python/tool/image_metadata/lsb_injector.py b/src/novelai_python/tool/image_metadata/lsb_injector.py
new file mode 100644
index 0000000..fe7622c
--- /dev/null
+++ b/src/novelai_python/tool/image_metadata/lsb_injector.py
@@ -0,0 +1,71 @@
+# MIT: https://github.com/NovelAI/novelai-image-metadata/blob/main/nai_meta_writer.py
+import json
+import gzip
+import numpy as np
+from PIL import Image
+from PIL.PngImagePlugin import PngInfo
+
+
+class LSBInjector:
+    def __init__(self, data):
+        self.data = data
+        self.rows, self.cols, self.dim = data.shape
+        self.bits = 0
+        self.byte = 0
+        self.row = 0
+        self.col = 0
+
+    def put_byte(self, byte):
+        for i in range(8):
+            bit = (byte & 0x80) >> 7
+            self.data[self.row, self.col, self.dim - 1] &= 0xfe
+            self.data[self.row, self.col, self.dim - 1] |= bit
+            self.row += 1
+            if self.row == self.rows:
+                self.row = 0
+                self.col += 1
+                assert self.col < self.cols
+            byte <<= 1
+
+    def put_32bit_integer(self, integer_value):
+        bytes_list = integer_value.to_bytes(4, byteorder='big')
+        for byte in bytes_list:
+            self.put_byte(byte)
+
+    def put_bytes(self, bytes_list):
+        for byte in bytes_list:
+            self.put_byte(byte)
+
+    def put_string(self, string):
+        self.put_bytes(string.encode('utf-8'))
+
+
+def serialize_metadata(metadata: PngInfo) -> bytes:
+    # Extract metadata from PNG chunks
+    data = {
+        k: v
+        for k, v in [
+            data[1]
+            .decode("latin-1" if data[0] == b"tEXt" else "utf-8")
+            .split("\x00" if data[0] == b"tEXt" else "\x00\x00\x00\x00\x00")
+            for data in metadata.chunks
+            if data[0] == b"tEXt" or data[0] == b"iTXt"
+        ]
+    }
+    # Save space by getting rid of reduntant metadata (Title is static)
+    if "Title" in data:
+        del data["Title"]
+    # Encode and compress data using gzip
+    data_encoded = json.dumps(data)
+    return gzip.compress(bytes(data_encoded, "utf-8"))
+
+
+def inject_data(image: Image.Image, data: PngInfo) -> Image.Image:
+    image = image.convert('RGBA')
+    pixels = np.array(image)
+    injector = LSBInjector(pixels)
+    injector.put_string("stealth_pngcomp")
+    data = serialize_metadata(data)
+    injector.put_32bit_integer(len(data) * 8)
+    injector.put_bytes(data)
+    return Image.fromarray(injector.data)
diff --git a/src/novelai_python/tool/paint_mask/__init__.py b/src/novelai_python/tool/paint_mask/__init__.py
new file mode 100644
index 0000000..641c744
--- /dev/null
+++ b/src/novelai_python/tool/paint_mask/__init__.py
@@ -0,0 +1,75 @@
+import cv2 as cv
+import numpy as np
+
+
+def create_mask_from_sketch(original_img_bytes: bytes,
+                            sketch_img_bytes: bytes,
+                            min_block_size: int = 15,
+                            jagged_edges: bool = True,
+                            output_format: str = '.png'
+                            ) -> bytes:
+    """
+    Function to create a mask from original and sketch images input as bytes. Returns BytesIO object.
+
+    :param original_img_bytes:  Bytes corresponding to the original image.
+    :param sketch_img_bytes:  Bytes corresponding to the sketch image.
+    :param min_block_size:  The minimum size of the pixel blocks. Default is 1, i.e., no pixelation.
+    :param jagged_edges:  If set to True, the edges of the resulting mask will be more jagged.
+    :param output_format:  Format of the output image. Defaults to '.png'. It could also be '.jpg'
+    :return:  bytes corresponding to the resultant mask
+    """
+
+    # Load images
+    ori_img = cv.imdecode(np.frombuffer(original_img_bytes, np.uint8), cv.IMREAD_COLOR)
+    sketch_img = cv.imdecode(np.frombuffer(sketch_img_bytes, np.uint8), cv.IMREAD_COLOR)
+
+    # Check if images have the same size
+    if ori_img.shape != sketch_img.shape:
+        raise ValueError("Images must have the same size.")
+
+    # Calculate difference between the original and sketch images
+    diff_img = cv.absdiff(ori_img, sketch_img)
+
+    # Convert the difference image to grayscale
+    diff_gray = cv.cvtColor(diff_img, cv.COLOR_BGR2GRAY)
+
+    # Threshold to create the mask
+    _, thresh = cv.threshold(diff_gray, 10, 255, cv.THRESH_BINARY)
+
+    # Create bigger kernel for morphological operations
+    if jagged_edges:
+        # Use a bigger kernel for dilation to create larger 'step' effect at the edges
+        kernel = np.ones((7, 7), np.uint8)
+    else:
+        kernel = np.ones((3, 3), np.uint8)
+
+    # Perform morphological opening to remove small noise
+    opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)
+
+    # Perform morphological dilation
+    dilation = cv.dilate(opening, kernel, iterations=2)
+
+    # Perform morphological closing to connect separated areas
+    closing = cv.morphologyEx(dilation, cv.MORPH_CLOSE, kernel, iterations=3)
+
+    # Further remove noise with a Gaussian filter
+    smooth = cv.GaussianBlur(closing, (5, 5), 0)
+
+    if min_block_size > 1:
+        # Resize to smaller image, then resize back to original size to create a pixelated effect
+        small = cv.resize(smooth, (smooth.shape[1] // min_block_size, smooth.shape[0] // min_block_size),
+                          interpolation=cv.INTER_LINEAR)
+        smooth = cv.resize(small, (smooth.shape[1], smooth.shape[0]), interpolation=cv.INTER_NEAREST)
+
+    if jagged_edges:
+        # Apply additional thresholding to create sharper, jagged edges
+        _, smooth = cv.threshold(smooth, 128, 255, cv.THRESH_BINARY)
+
+    # Convert image to BytesIO object
+    is_success, buffer = cv.imencode(output_format, smooth)
+    if is_success:
+        output_io = buffer.tobytes()
+    else:
+        raise ValueError("Error during conversion of image to BytesIO object")
+
+    return output_io
diff --git a/src/novelai_python/utils/random_prompt/__init__.py b/src/novelai_python/tool/random_prompt/__init__.py
old mode 100755
new mode 100644
similarity index 99%
rename from src/novelai_python/utils/random_prompt/__init__.py
rename to src/novelai_python/tool/random_prompt/__init__.py
index 21f1ecb..751b3f1
--- a/src/novelai_python/utils/random_prompt/__init__.py
+++ b/src/novelai_python/tool/random_prompt/__init__.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 import random
 from typing import List
 
diff --git a/src/novelai_python/utils/random_prompt/tag.py b/src/novelai_python/tool/random_prompt/tag.py
old mode 100755
new mode 100644
similarity index 100%
rename from src/novelai_python/utils/random_prompt/tag.py
rename to src/novelai_python/tool/random_prompt/tag.py
diff --git a/src/novelai_python/utils/random_prompt/tag_character.py b/src/novelai_python/tool/random_prompt/tag_character.py
old mode 100755
new mode 100644
similarity index 100%
rename from src/novelai_python/utils/random_prompt/tag_character.py
rename to src/novelai_python/tool/random_prompt/tag_character.py
diff --git a/src/novelai_python/utils/random_prompt/tag_nsfw.py b/src/novelai_python/tool/random_prompt/tag_nsfw.py
old mode 100755
new mode 100644
similarity index 100%
rename from src/novelai_python/utils/random_prompt/tag_nsfw.py
rename to src/novelai_python/tool/random_prompt/tag_nsfw.py
diff --git a/src/novelai_python/utils/__init__.py b/src/novelai_python/utils/__init__.py
index b55b5b8..e86085f 100755
--- a/src/novelai_python/utils/__init__.py
+++ b/src/novelai_python/utils/__init__.py
@@ -6,24 +6,8 @@
 import io
 import json
 from typing import Union
-
 from loguru import logger
-
 from .encode import encode_access_key  # noqa 401
-from .hash import NovelAiMetadata
-
-
-def png_info_reset(img: Union[str, io.BytesIO],
-                   *,
-                   remove_stealth: bool = False):
-    """
-    reset png info hash value
-    :param remove_stealth: LCB
-    :param img: BytesIO 对象
-    :return: 
-    """
-    _fixed = NovelAiMetadata.rehash(img_io=img, remove_stealth=remove_stealth)
-    return _fixed
 
 
 def try_jsonfy(obj: Union[str, dict, list, tuple]):
@@ -34,6 +18,6 @@ def try_jsonfy(obj: Union[str, dict, list, tuple]):
     """
     try:
         return json.loads(obj)
-    except Exception:
+    except Exception as e:
         logger.error(f"Decode Error {obj}")
         return f"Decode Error {type(obj)}"
diff --git a/src/novelai_python/utils/encode.py b/src/novelai_python/utils/encode.py
index ca8ad04..2c8fa49 100755
--- a/src/novelai_python/utils/encode.py
+++ b/src/novelai_python/utils/encode.py
@@ -35,3 +35,37 @@ def encode_access_key(username: str, password: str) -> str:
     hashed = urlsafe_b64encode(raw).decode()
 
     return hashed[:64]
+
+
+import base64
+import hashlib
+import hmac
+import json
+from io import BytesIO
+from typing import Union
+
+import numpy as np
+from PIL import Image
+from PIL.PngImagePlugin import PngInfo
+from loguru import logger
+from pydantic import BaseModel
+
+
+def sign_message(message, key):
+    # 使用 HMAC 算法对消息进行哈希签名
+    hmac_digest = hmac.new(key.encode(), message.encode(), hashlib.sha256).digest()
+    signed_hash = base64.b64encode(hmac_digest).decode()
+    return signed_hash
+
+
+def encode_base64(data):
+    byte_data = data.encode("UTF-8")
+    encoded_data = base64.b64encode(byte_data)
+    return encoded_data.decode("UTF-8")
+
+
+# 解码
+def decode_base64(encoded_data):
+    byte_data = encoded_data.encode('UTF-8')
+    decoded_data = base64.b64decode(byte_data)
+    return decoded_data.decode("UTF-8")
diff --git a/src/novelai_python/utils/hash.py b/src/novelai_python/utils/hash.py
deleted file mode 100755
index 8068eb4..0000000
--- a/src/novelai_python/utils/hash.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# -*- coding: utf-8 -*-
-# @Time    : 2024/1/23 上午9:22
-# @Author  : sudoskys
-# @File    : hash.py
-# @Software: PyCharm
-import base64
-import hashlib
-import hmac
-import json
-from io import BytesIO
-from typing import Union
-
-import numpy as np
-from PIL import Image
-from PIL.PngImagePlugin import PngInfo
-from loguru import logger
-from pydantic import BaseModel
-
-
-def sign_message(message, key):
-    # 使用 HMAC 算法对消息进行哈希签名
-    hmac_digest = hmac.new(key.encode(), message.encode(), hashlib.sha256).digest()
-    signed_hash = base64.b64encode(hmac_digest).decode()
-    return signed_hash
-
-
-class NovelAiMetadata(BaseModel):
-    title: str = "AI generated image"
-    description: str
-    comment: Union[dict, str] = {}
-    """
-    {'prompt': 'very very aesthetic, absurdres', 'steps': 28, 'height': 1216, 'width': 832, 'scale': 6.0, 'uncond_scale': 1.0, 'cfg_rescale': 0.0, 'seed': 121910159, 'n_samples': 1, 'hide_debug_overlay': False, 'noise_schedule': 'native', 'legacy_v3_extend': False, 'sampler': 'k_euler', 'controlnet_strength': 1.0, 'controlnet_model': None, 'dynamic_thresholding': False, 'dynamic_thresholding_percentile': 0.999, 'dynamic_thresholding_mimic_scale': 10.0, 'sm': False, 'sm_dyn': False, 'skip_cfg_below_sigma': 0.0, 'lora_unet_weights': None, 'lora_clip_weights': None, 'uc': ', lowres, {bad}, error, fewer, extra, missing, worst quality, jpeg artifacts, bad quality, watermark, unfinished, displeasing, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract], bad anatomy, bad hands, @_@, mismatched pupils, heart-shaped pupils, glowing eyes, nsfw, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry', 'request_type': 'PromptGenerateRequest', 'signed_hash': '11111='}
-    """
-
-    @property
-    def metadata(self):
-        if isinstance(self.comment, dict):
-            _comment = json.dumps(self.comment)
-        return {"Title": self.title, "Description": self.description, "Comment": self.comment}
-
-    @staticmethod
-    def rehash(img_io, remove_stealth: bool = False):
-        cls = NovelAiMetadata.build_from_img(img_io)
-        cls.comment["signed_hash"] = sign_message(json.dumps(cls.description), "novalai-client")
-        _new_img_io = cls.write_out(img_io=img_io, remove_stealth=remove_stealth)
-        return _new_img_io
-
-    @staticmethod
-    def remove_stealth_info(img_io):
-        image = Image.open(img_io).convert('RGBA')
-        data = np.array(image)
-        data[..., 3] = 254
-        new_image = Image.fromarray(data, 'RGBA')
-        _new_img_io = BytesIO()
-        new_image.save(_new_img_io, format="PNG")
-        return _new_img_io
-
-    def write_out(self, img_io: BytesIO, *, remove_stealth: bool = False):
-        with Image.open(img_io) as img:
-            if remove_stealth:
-                img = img.convert('RGBA')
-                data = np.array(img)
-                data[..., 3] = 254
-                img = Image.fromarray(data, 'RGBA')
-            metadata = PngInfo()
-            for k, v in self.metadata.items():
-                if isinstance(v, dict):
-                    v = json.dumps(v)
-                metadata.add_text(k, v)
-            _new_img = BytesIO()
-            img.save(_new_img, format="PNG", pnginfo=metadata, quality=95, optimize=False)
-        return _new_img
-
-    @classmethod
-    def build_from_img(cls, image_io):
-        with Image.open(image_io) as img:
-            title = img.info.get("Title", "Empty")
-            if title != 'AI generated image':
-                raise ValueError("Not a NaiPic")
-            prompt = img.info.get("Description")
-            comment = img.info.get("Comment", None)
-            assert isinstance(comment, str), ValueError("Comment Empty")
-            try:
-                comment = json.loads(comment)
-            except Exception as e:
-                logger.debug(e)
-                comment = {}
-        return cls(title=title, description=prompt, comment=comment)
-
-    @classmethod
-    def build_from_param(cls, prompt, neg_prompt, **kwargs):
-        _comment = {"uc": neg_prompt}
-        _comment.update(kwargs)
-        return cls(title="AI generated image", description=prompt, comment=_comment)
-
-
-# 编码
-def encode_base64(data):
-    # 使用UTF-8将字符串转为字节对象
-    byte_data = data.encode("UTF-8")
-    # 使用base64编码
-    encoded_data = base64.b64encode(byte_data)
-    return encoded_data.decode("UTF-8")  # 再次使用UTF-8将字节对象转为字符串
-
-
-# 解码
-def decode_base64(encoded_data):
-    # 使用UTF-8将字符串转为字节对象
-    byte_data = encoded_data.encode('UTF-8')
-    # 使用base64解码
-    decoded_data = base64.b64decode(byte_data)
-    return decoded_data.decode("UTF-8")  # 再次使用UTF-8将字节对象转为字符串
-
-
-def decode_image(img: Union[str, BytesIO], output_path: str):
-    """
-    Find LCB
-    :param img:
-    :param output_path:
-    :return:
-    """
-    encoded_image = Image.open(img)
-    red_channel = encoded_image.split()[3]
-    x_size = encoded_image.size[0]
-    y_size = encoded_image.size[1]
-    decoded_image = Image.new("RGB", encoded_image.size)
-    pixels = decoded_image.load()
-    for i in range(x_size):
-        for j in range(y_size):
-            if i < 7:  # the left 7 columns
-                r = red_channel.getpixel((i, j))
-                if r > 254:  # above the threshold
-                    pixels[i, j] = (0, 0, 0)  # black
-                else:
-                    pixels[i, j] = (255, 255, 255)  # white
-            else:
-                pixels[i, j] = (255, 255, 255)  # default to white for right part of image
-    decoded_image.save(output_path)
diff --git a/src/novelai_python/utils/prompt_factory/__init__.py b/src/novelai_python/utils/prompt_factory/__init__.py
deleted file mode 100644
index a53eef2..0000000
--- a/src/novelai_python/utils/prompt_factory/__init__.py
+++ /dev/null
@@ -1,1035 +0,0 @@
-# -*- coding: utf-8 -*-
-# @Time    : 2024/2/10 下午1:50
-# @Author  : sudoskys
-# @File    : __init__.py.py
-# @Software: PyCharm
-import json
-import pathlib
-import random
-from dataclasses import dataclass
-from typing import Type, List
-
-from pydantic import BaseModel, field_validator, ConfigDict
-
-from .cell import Accessories
-from .cell import Action
-from .cell import Art_Style
-from .cell import Background
-from .cell import Body
-from .cell import Character_Design
-from .cell import Clothing
-from .cell import Composition
-from .cell import Environment
-from .cell import Expression
-from .cell import Face
-from .cell import Illustrator
-from .cell import Scene
-from .cell import r18
-from .cell.cell_schema import BaseCell
-from .schema import singleton
-
-data_dir = pathlib.Path(__file__).parent.joinpath('cell/raw')
-if not data_dir.exists():
-    raise FileNotFoundError("Prompt Factory Data directory not found.")
-_data_map = {}
-
-
-@dataclass(frozen=True, order=True)
-class DataSelector(object):
-    """
-    选择器
-    """
-    R18 = r18.R18Type()
-    """R18"""
-    ILLUSTRATOR = Illustrator.IllustratorType()
-    """画师"""
-    CHARACTER_DESIGN = Character_Design.Character_DesignType()
-    """角色设计"""
-    ACCESSORIES = Accessories.AccessoryType()
-    """配饰"""
-    CLOTHING = Clothing.ClothingType()
-    """服装"""
-    BODY = Body.BodyType()
-    """身体"""
-    FACE = Face.FaceType()
-    """脸"""
-    EXPRESSION = Expression.ExpressionType()
-    """表情"""
-    BACKGROUND = Background.BackgroundType()
-    """背景"""
-    ART_STYLE = Art_Style.Art_StyleType()
-    """艺术风格"""
-    SCENE = Scene.SceneType()
-    """场景"""
-    ENVIRONMENT = Environment.EnvironmentType()
-    """环境"""
-    ACTION = Action.ActionType()
-    """动作"""
-    COMPOSITION = Composition.CompositionType()
-    """构图"""
-
-
-class Loader(BaseModel):
-    source: BaseCell
-    model_config = ConfigDict(arbitrary_types_allowed=True)
-
-    @property
-    def attributes(self):
-        return self.source.get_values()
-
-    @property
-    def data(self):
-
-        if _data_map.get(self.source.source(), None) is None:
-            with open(data_dir.joinpath(self.source.source()), "r", encoding="utf-8") as f:
-                _data_map[self.source.source()] = json.load(f)
-        return _data_map[self.source.source()]
-
-    @field_validator("source")
-    def check_file_exist(cls, v: BaseCell):
-        """
-        检查文件是否存在
-        :param v:
-        :return:
-        """
-        if not data_dir.joinpath(v.source()).exists():
-            raise FileNotFoundError(f"Prompt Factory Data file not found: {v.source()}")
-        return v
-
-    @staticmethod
-    def refine_tag(tag: str):
-        """
-        如果存在 // 则取前面的，并 strip
-        :param tag:
-        :return:
-        """
-        if "//" in tag:
-            return tag.split("//")[0].strip()
-        return tag.strip()
-
-    def random_tag(self, sub_type: str, n: int = 1):
-        """
-        随机选择 n 个标签
-        :param sub_type: 子类型
-        :param n: 选择的数量
-        :return:
-        """
-        _sub_data = self.data.get(sub_type, None)
-        if _sub_data is None:
-            raise KeyError(f"Sub type {sub_type} not found in {self.source}")
-        assert isinstance(_sub_data, dict), f"Sub type {sub_type} not a dict"
-        if n > len(_sub_data.keys()):
-            n = len(_sub_data.keys())
-        random_key = random.sample(list(_sub_data.keys()), n)
-        _pair = []
-        for k in random_key:
-            _pair.append((_sub_data[k], self.refine_tag(k)))
-        return _pair
-
-
-class Generator(BaseModel):
-    """
-    生成器
-    """
-    pool: List[BaseCell]
-    class_sample: int = 1
-    """类型选择数"""
-    class_piece: int = 1
-    """浮动量"""
-    tag_sample: int = 1
-    """标签选择数"""
-    tag_piece: int = 3
-    """浮动量"""
-    model_config = ConfigDict(arbitrary_types_allowed=True)
-
-    @staticmethod
-    def build_loader(source: BaseCell):
-        return Loader(source=source)
-
-    def generate_pool(self):
-        """
-        遍历 Pool 中的类型，然后随机选择大类，然后随机选择标签，最后返回元组
-        :return:
-        """
-        _tag = []
-        for crs in self.pool:
-            _loader = self.build_loader(crs)
-            # 从类型中随机选择大类
-            class_sample_num = self.class_sample + random.randint(-self.class_piece, self.class_piece)
-            class_sample_num = 1 if class_sample_num < 1 else class_sample_num
-            class_sample_num = len(_loader.attributes) if class_sample_num > len(
-                _loader.attributes) else class_sample_num
-            _class = random.sample(_loader.attributes, class_sample_num)
-            for c in _class:
-                tag_sample_num = self.tag_sample + random.randint(-self.tag_piece, self.tag_piece)
-                tag_sample_num = 1 if tag_sample_num < 1 else tag_sample_num
-                _tags = _loader.random_tag(sub_type=c, n=tag_sample_num)
-                _tag.extend(_tags)
-        return _tag
-
-    @staticmethod
-    def random_tag(top_type: BaseCell, sub_type: str, n: int = 1):
-        """
-        随机选择 n 个标签
-        :param top_type: 类型
-        :param sub_type: 子类型
-        :param n: 选择的数量
-        :return:
-        """
-        _loader = Loader(source=top_type)
-        return _loader.random_tag(sub_type=sub_type, n=n)
-
-    @staticmethod
-    def random_weighted(choices: List[tuple], return_list: bool = True):
-        """
-        随机加权选择
-        :param choices: 选择
-        :param return_list: 是否返回列表
-        :return:
-        """
-        # 提取值与权重
-        values, weights = zip(*choices)
-        # 根据权重随机选择
-        random_choice = random.choices(values, weights)
-        if return_list:
-            return random_choice
-        else:
-            return random_choice[0]
-
-    @staticmethod
-    def check_list_empty(types: List):
-        """
-        检查列表是否含有 Str
-        :param types:
-        :return:
-        """
-        _all_none = True
-        for t in types:
-            if t is not None:
-                _all_none = False
-                break
-        return _all_none
-
-    @staticmethod
-    def enhance_tag(tag: str, n: int = 0):
-        """
-        增强标签，给标签加上 {}
-        :param n:  加强度
-        :param tag:  标签
-        :return:
-        """
-        return "{" * n + tag + "}" * n
-
-    def generate(self,
-                 enable_nsfw: bool = False,
-                 enable_illustrator: bool = False,
-                 ):
-        """
-        生成
-        :param enable_nsfw: 是否启用 r18
-        :param enable_illustrator: 是否启用画师
-        :return:
-        """
-        _tag = []
-        # 条件组
-        gender = self.random_weighted([("boy", 20), ("girl", 80)], return_list=False)
-        num_of_characters = self.random_weighted([(1, 60), (2, 30), (3, 10)], return_list=False)
-        # 视线
-        COMPOSITION_IF = []
-        THEME_AND_AREA = [
-            (DataSelector.COMPOSITION.THEME, 20),
-            (DataSelector.COMPOSITION.REGION, 20),
-            (DataSelector.COMPOSITION.ANGLE, 20),
-            (DataSelector.COMPOSITION.DISTANCE, 20),
-            (None, 120)
-        ]
-        SIGHTLINE_AND_FOCUS = [
-            (DataSelector.COMPOSITION.CHARACTER_SIGHTLINE, 20),
-            (DataSelector.COMPOSITION.FOCUS, 20),
-            (DataSelector.COMPOSITION.PERSPECTIVE, 20),
-            (DataSelector.COMPOSITION.PERSPECTIVE_VISION, 20),
-            (DataSelector.COMPOSITION.BACKGROUND_RELATIONSHIP, 20),
-            (None, 120)
-        ]
-        NATURAL_ELEMENTS = [
-            (DataSelector.COMPOSITION.LEAF, 15),
-            (DataSelector.COMPOSITION.SKY, 15),
-            (DataSelector.COMPOSITION.SUN_MOON, 15),
-            (DataSelector.COMPOSITION.FIRE_AND_EXPLOSION, 15),
-            (DataSelector.COMPOSITION.SMOKE, 15),
-            (DataSelector.COMPOSITION.NATURAL_PHENOMENON, 15),
-            (DataSelector.COMPOSITION.FLOWER, 15),
-            (None, 95)
-        ]
-        DESIGN_ELEMENTS = [
-            (DataSelector.COMPOSITION.DESIGN_ELEMENT, 30),
-            (DataSelector.COMPOSITION.COMPOSITION, 30),
-            (DataSelector.COMPOSITION.FANTASY, 30),
-            (None, 110)
-        ]
-        OTHER_ELEMENTS = [
-            (DataSelector.COMPOSITION.OTHER, 30),
-            (DataSelector.COMPOSITION.INSECT, 30),
-            (DataSelector.COMPOSITION.PAPER, 30),
-            (None, 110)
-        ]
-        COMPOSITION_IF.extend(
-            self.random_weighted(
-                THEME_AND_AREA
-            )
-        )
-        COMPOSITION_IF.extend(
-            self.random_weighted(
-                SIGHTLINE_AND_FOCUS
-            )
-        )
-        if self.check_list_empty(COMPOSITION_IF):
-            if random.random() > 0.5:
-                COMPOSITION_IF.extend(
-                    self.random_weighted(
-                        NATURAL_ELEMENTS
-                    )
-                )
-            else:
-                COMPOSITION_IF.extend(
-                    self.random_weighted(
-                        DESIGN_ELEMENTS
-                    )
-                )
-            COMPOSITION_IF.extend(
-                self.random_weighted(
-                    OTHER_ELEMENTS
-                )
-            )
-        SCENE_IF = []
-        TIME_AND_ENVIRONMENT = [
-            (DataSelector.SCENE.DAYTIME, 25),
-            (DataSelector.SCENE.SEASONS, 25),
-            (DataSelector.SCENE.OTHER_SCENES, 25),
-            (None, 125)
-        ]
-        VISUAL_RENDERING = [
-            (DataSelector.SCENE.LIGHT, 25),
-            (DataSelector.SCENE.SHADOW, 25),
-            (DataSelector.SCENE.COLOR_STYLE, 25),
-            (DataSelector.SCENE.FILTER, 25),
-            (None, 100)
-        ]
-        SCENE_DECORATIONS = [
-            (DataSelector.SCENE.SCENE_ELEMENTS, 20),
-            (DataSelector.SCENE.SCENE_ENHANCEMENT, 20),
-            (DataSelector.SCENE.LINE, 20),
-            (DataSelector.SCENE.BUBBLE, 20),
-            (DataSelector.SCENE.MUSIC_NOTES, 20),
-            (None, 100)
-        ]
-        SPECIAL_CATEGORIES = [
-            (DataSelector.SCENE.ILLUSTRATIONS_AND_CG, 20),
-            (DataSelector.SCENE.ANIMATION, 20),
-            (DataSelector.SCENE.HOLIDAY, 20),
-            (DataSelector.SCENE.COVERS_AND_BOOKS, 20),
-            (DataSelector.SCENE.COMICS, 20),
-            (None, 100)
-        ]
-        OTHER = [
-            (DataSelector.SCENE.OTHER_SYMBOLS, 30),
-            (DataSelector.SCENE.FUNCTION, 30),
-            (DataSelector.SCENE.SETTINGS, 30),
-            (None, 110)
-        ]
-        SCENE_IF.extend(
-            self.random_weighted(
-                SPECIAL_CATEGORIES
-            )
-        )
-        if self.check_list_empty(SCENE_IF):
-            SCENE_IF.extend(
-                self.random_weighted(
-                    TIME_AND_ENVIRONMENT
-                )
-            )
-        SCENE_IF.extend(
-            self.random_weighted(
-                VISUAL_RENDERING
-            )
-        )
-        if random.random() > 0.5:
-            SCENE_IF.extend(
-                self.random_weighted(
-                    SCENE_DECORATIONS
-                )
-            )
-        if random.random() > 0.5:
-            SCENE_IF.extend(
-                self.random_weighted(
-                    OTHER
-                )
-            )
-        ENVIRONMENT_IF = []
-        BUILDINGS_AND_FACILITIES = [
-            (DataSelector.ENVIRONMENT.ARCHITECTURE, 20),
-            (DataSelector.ENVIRONMENT.ARCHITECTURAL_STYLE, 20),
-            (DataSelector.ENVIRONMENT.OFFICE, 20),
-            (DataSelector.ENVIRONMENT.HOME, 20),
-            (DataSelector.ENVIRONMENT.ENTERTAINMENT_ACCOMMODATION, 20),
-            (DataSelector.ENVIRONMENT.SHOPPING, 20),
-            (DataSelector.ENVIRONMENT.CATERING, 20),
-            (DataSelector.ENVIRONMENT.FACILITY, 20),
-            (DataSelector.ENVIRONMENT.MUNICIPAL, 20),
-            (DataSelector.ENVIRONMENT.INDUSTRY, 20),
-            (DataSelector.ENVIRONMENT.MILITARY, 20),
-            (DataSelector.ENVIRONMENT.CAMPUS, 20),
-            (DataSelector.ENVIRONMENT.SPORTS_FIELD, 20),
-            (DataSelector.ENVIRONMENT.AMUSEMENT_FACILITIES, 20),
-            (None, 700)
-        ]
-        NATURAL_ENVIRONMENT = [
-            (DataSelector.ENVIRONMENT.NATURAL_LANDSCAPE, 25),
-            (DataSelector.ENVIRONMENT.NATURAL_ENVIRONMENT, 25),
-            (DataSelector.ENVIRONMENT.TREE, 25),
-            (DataSelector.ENVIRONMENT.FLOWER, 25),
-            (DataSelector.ENVIRONMENT.GRASS, 25),
-            (DataSelector.ENVIRONMENT.SHRUB, 25),
-            (DataSelector.ENVIRONMENT.FRUIT, 25),
-            (DataSelector.ENVIRONMENT.VINE, 25),
-            (None, 300)
-        ]
-        ANIMAL_ELEMENTS = [
-            (DataSelector.ENVIRONMENT.SMALL_TERRESTRIAL_MAMMAL, 15),
-            (DataSelector.ENVIRONMENT.MEDIUM_TERRESTRIAL_MAMMAL, 15),
-            (DataSelector.ENVIRONMENT.LARGE_TERRESTRIAL_MAMMAL, 15),
-            (DataSelector.ENVIRONMENT.AQUATIC, 15),
-            (DataSelector.ENVIRONMENT.MARINE_MAMMAL, 15),
-            (DataSelector.ENVIRONMENT.ARTHROPOD, 15),
-            (DataSelector.ENVIRONMENT.BIRD, 15),
-            (DataSelector.ENVIRONMENT.REPTILIAN_AMPHIBIAN, 15),
-            (DataSelector.ENVIRONMENT.DINOSAUR, 15),
-            (DataSelector.ENVIRONMENT.MAGICAL_BEAST_SPECIES, 15),
-            (None, 400)
-        ]
-        TRANSPORTATION = [
-            (DataSelector.ENVIRONMENT.TRANSPORTATION, 50),
-            (DataSelector.ENVIRONMENT.VEHICLE, 50),
-            (None, 200)
-        ]
-        OTHER = [
-            (DataSelector.ENVIRONMENT.OTHER, 20),
-            (DataSelector.ENVIRONMENT.THEME, 20),
-            (DataSelector.ENVIRONMENT.SITE, 20),
-            (DataSelector.ENVIRONMENT.OUTDOOR, 20),
-            (DataSelector.ENVIRONMENT.INDOOR_OTHER, 20),
-            (DataSelector.ENVIRONMENT.OUTDOOR_OTHER, 20),
-            (None, 200)
-        ]
-
-        ENVIRONMENT_IF.extend(
-            self.random_weighted(
-                BUILDINGS_AND_FACILITIES
-            )
-        )
-        if self.check_list_empty(ENVIRONMENT_IF):
-            ENVIRONMENT_IF.extend(
-                self.random_weighted(
-                    NATURAL_ENVIRONMENT
-                )
-            )
-            ENVIRONMENT_IF.extend(
-                self.random_weighted(
-                    ANIMAL_ELEMENTS
-                )
-            )
-        else:
-            ENVIRONMENT_IF.extend(
-                self.random_weighted(
-                    TRANSPORTATION
-                )
-            )
-        ENVIRONMENT_IF.extend(
-            self.random_weighted(
-                OTHER
-            )
-        )
-        BACKGROUND_IF = []
-        BACKGROUND_IF.extend(
-            self.random_weighted(
-                [
-                    (DataSelector.BACKGROUND.PHYSICAL_BACKGROUND, 15),
-                    (DataSelector.BACKGROUND.PATTERN_BACKGROUND, 20),
-                    (DataSelector.BACKGROUND.SIMPLE_COLOR_BACKGROUND, 50),
-                    (None, 80),
-                ]
-            )
-        )
-        if self.check_list_empty(BACKGROUND_IF):
-            BACKGROUND_IF.extend(
-                self.random_weighted(
-                    [
-                        (DataSelector.BACKGROUND.NATURE, 25),
-                        (DataSelector.BACKGROUND.FANTASY, 15),
-                        (DataSelector.BACKGROUND.INSTRUMENT, 15),
-                        (DataSelector.BACKGROUND.OUTDOOR_FACILITY, 10),
-                        (DataSelector.BACKGROUND.FURNITURE, 10),
-                        (DataSelector.BACKGROUND.TOOLS, 5),
-                        (DataSelector.BACKGROUND.DECORATIONS, 30),
-                        (DataSelector.BACKGROUND.APPLIANCE, 12),
-                        (DataSelector.BACKGROUND.VEHICLE, 20),
-                        (None, 100),
-                    ]
-                )
-            )
-        R18_IF = []
-        if enable_nsfw:
-            R18_IF.extend(
-                self.random_weighted(
-                    [
-                        (DataSelector.R18.TAG_17_9, 100),
-                    ]
-                )
-            )
-            R18_IF.extend(
-                self.random_weighted(
-                    [
-                        (DataSelector.R18.TAG_17_9, 100),
-                    ]
-                )
-            )
-        ACTION_IF = []
-        BODY_POSTURES = [
-            (DataSelector.ACTION.HANDSTAND, 15),
-            (DataSelector.ACTION.LEANING, 15),
-            (DataSelector.ACTION.SITTING, 15),
-            (DataSelector.ACTION.STANDING, 15),
-            (DataSelector.ACTION.HEAD_POSTURE, 15),
-            (DataSelector.ACTION.HAND_POSITION, 15),
-            (DataSelector.ACTION.FINGER_POSTURE, 15),
-            (DataSelector.ACTION.ARM_POSTURE, 15),
-            (DataSelector.ACTION.BREAST_POSTURE, 15),
-            (DataSelector.ACTION.LEG_POSTURE, 15),
-            (DataSelector.ACTION.PRONE_POSTURE, 15),
-            (DataSelector.ACTION.KNEELING, 15),
-            (DataSelector.ACTION.LYING, 15),
-            (None, 115)
-        ]
-        ACTIVITIES_AND_SPORTS = [
-            (DataSelector.ACTION.ENTERTAINMENT, 25),
-            (DataSelector.ACTION.SPORT, 25),
-            (DataSelector.ACTION.BATTLE, 25),
-            (DataSelector.ACTION.DAILY_USE, 25),
-            (DataSelector.ACTION.MOVEMENT, 25),
-            (None, 175)
-        ]
-        DAILY_ACCESSORIES = [
-            (DataSelector.ACTION.DIGITAL, 30),
-            (DataSelector.ACTION.STATIONERY, 30),
-            (DataSelector.ACTION.DAILY_USE, 30),
-            (DataSelector.ACTION.DESK_CASE, 30),
-            (DataSelector.ACTION.TOY, 30),
-            (None, 150)
-        ]
-        CLOTHING_AND_HAIRSTYLE = [
-            (DataSelector.ACTION.CLOTHES_INTERACTION, 50),
-            (DataSelector.ACTION.HAIR_INTERACTION, 50),
-            (DataSelector.ACTION.DRESSING, 50),
-            (None, 150)
-        ]
-        SPECIAL_CATEGORIES = [
-            (DataSelector.ACTION.OTHER_INTERACTION, 20),
-            (DataSelector.ACTION.BATTLE, 20),
-            (DataSelector.ACTION.MAGIC, 20),
-            (DataSelector.ACTION.MUSIC, 20),
-            (DataSelector.ACTION.FOOD, 20),
-            (None, 500)
-        ]
-        OTHER = [
-            (DataSelector.ACTION.OTHER_POSTURE, 50),
-            (DataSelector.ACTION.OTHER1, 50),
-            (None, 200)
-        ]
-        ACTION_IF.extend(
-            self.random_weighted(
-                SPECIAL_CATEGORIES
-            )
-        )
-        if self.check_list_empty(ACTION_IF):
-            ACTION_IF.extend(
-                self.random_weighted(
-                    ACTIVITIES_AND_SPORTS
-                )
-            )
-        if self.check_list_empty(ACTION_IF):
-            ACTION_IF.extend(
-                self.random_weighted(
-                    DAILY_ACCESSORIES
-                )
-            )
-        ACTION_IF.extend(
-            self.random_weighted(
-                CLOTHING_AND_HAIRSTYLE
-            )
-        )
-        ACTION_IF.extend(
-            self.random_weighted(
-                OTHER
-            )
-        )
-        if num_of_characters > 1:
-            ACTION_IF.extend(
-                self.random_weighted(
-                    [
-                        (DataSelector.ACTION.DOUBLE_POSTURE, 10),
-                        (None, 15),
-                    ]
-                )
-            )
-        else:
-            ACTION_IF.extend(
-                self.random_weighted(
-                    BODY_POSTURES
-                )
-            )
-        ART_STYLE_IF = []
-        ART_STYLE_IF.extend(
-            self.random_weighted(
-                [
-                    (DataSelector.ART_STYLE.TRADITIONAL_MATERIALS, 20),
-                    (DataSelector.ART_STYLE.ARTWORK, 5),
-                    (DataSelector.ART_STYLE.OTHER_STYLES, 15),
-                    (DataSelector.ART_STYLE.ERA_STYLE, 3),
-                    (DataSelector.ART_STYLE.GENRE, 10),
-                    (DataSelector.ART_STYLE.ARTIST, 3),
-                    (None, 200),
-                ]
-            )
-        )
-        ILLUSTRATOR_IF = []
-        if enable_illustrator:
-            ILLUSTRATOR_IF.extend(
-                self.random_weighted(
-                    [
-                        (DataSelector.ILLUSTRATOR.PAINTER, 100),
-                    ]
-                )
-            )
-        CHARACTER_DESIGN_IF = []
-        CHARACTER_DESIGN_IF.extend(
-            self.random_weighted(
-                [
-                    (DataSelector.CHARACTER_DESIGN.FANTASY_JOB, 20),
-                    (DataSelector.CHARACTER_DESIGN.REALISTIC_JOB, 20),
-                    (DataSelector.CHARACTER_DESIGN.NON_HUMAN, 20),
-                    (DataSelector.CHARACTER_DESIGN.NON_HUMAN_SPECIES, 20),
-                    (DataSelector.CHARACTER_DESIGN.MACHINERY, 20),
-                    (DataSelector.CHARACTER_DESIGN.OTHER, 5),
-                    (None, 150),
-                ]
-            )
-        )
-        CHARACTER_DESIGN_IF.extend(
-            self.random_weighted(
-                [
-                    (DataSelector.CHARACTER_DESIGN.AGE, 15),
-                    (DataSelector.CHARACTER_DESIGN.SKIN, 5),
-                    (DataSelector.CHARACTER_DESIGN.PERSONALITY, 30),
-                    (None, 70),
-                ]
-            )
-        )
-        ACCESSORIES_IF = []
-        DAILY_ACCESSORIES = [
-            (DataSelector.ACCESSORIES.HEAD, 20),
-            (DataSelector.ACCESSORIES.EAR_DECORATIONS, 20),
-            (DataSelector.ACCESSORIES.GLOVES, 15),
-            (DataSelector.ACCESSORIES.ARM_WRIST, 20),
-            (DataSelector.ACCESSORIES.WAIST, 15),
-            (DataSelector.ACCESSORIES.LEG_FOOT, 15),
-            (DataSelector.ACCESSORIES.NECK_DECORATIONS, 20),
-            (None, 25)
-        ]
-        SPECIAL_OCCASION_ACCESSORIES = [
-            (DataSelector.ACCESSORIES.THEME_DECORATIONS, 15),
-            (DataSelector.ACCESSORIES.INSTRUMENTS, 15),
-            (DataSelector.ACCESSORIES.SPORTS, 15),
-            (DataSelector.ACCESSORIES.OTHER1, 15),
-            (DataSelector.ACCESSORIES.OTHER2, 15),
-            (DataSelector.ACCESSORIES.OTHER3, 15),
-            (None, 70)
-        ]
-        KITCHEN_ACCESSORIES = [
-            (DataSelector.ACCESSORIES.KITCHENWARE, 15),
-            (DataSelector.ACCESSORIES.TABLEWARE, 15),
-            (DataSelector.ACCESSORIES.FOOD, 15),
-            (DataSelector.ACCESSORIES.SOUP_AND_DRINKS, 15),
-            (DataSelector.ACCESSORIES.CONDIMENTS_AND_SAUCE, 15),
-            (DataSelector.ACCESSORIES.MEAT_POULTRY_AND_EGGS, 10),
-            (DataSelector.ACCESSORIES.FISH_AND_SEAFOOD, 10),
-            (DataSelector.ACCESSORIES.DESSERTS, 10),
-            (None, 45)
-        ]
-        OTHER_ACCESSORIES = [
-            (DataSelector.ACCESSORIES.WEAPONS, 10),
-            (DataSelector.ACCESSORIES.TOYS, 10),
-            (DataSelector.ACCESSORIES.DIGITAL, 10),
-            (DataSelector.ACCESSORIES.STATIONERY, 10),
-            (DataSelector.ACCESSORIES.MATERIALS, 10),
-            (DataSelector.ACCESSORIES.OTHER4, 10),
-            (None, 140)
-        ]
-        ACCESSORIES_IF.extend(
-            self.random_weighted(
-                SPECIAL_OCCASION_ACCESSORIES
-            )
-        )
-        if self.check_list_empty(ACCESSORIES_IF):
-            ACCESSORIES_IF.extend(
-                self.random_weighted(
-                    DAILY_ACCESSORIES
-                )
-            )
-        if self.check_list_empty(ACCESSORIES_IF):
-            ACCESSORIES_IF.extend(
-                self.random_weighted(
-                    KITCHEN_ACCESSORIES
-                )
-            )
-        ACCESSORIES_IF.extend(
-            self.random_weighted(
-                OTHER_ACCESSORIES
-            )
-        )
-        CLOTHING_IF = []
-        SPECIAL_OCCASION_CLOTHING = [
-            (DataSelector.CLOTHING.HOLIDAY, 12),
-            (DataSelector.CLOTHING.JOB_COSPLAY, 12),
-            (DataSelector.CLOTHING.RACE_COSPLAY, 12),
-            (DataSelector.CLOTHING.SPORTS, 12),
-            (None, 152)
-        ]
-        TOP_CLOTHING = [
-            (DataSelector.CLOTHING.TOP, 15),
-            (DataSelector.CLOTHING.UNDERWEAR, 15),
-            (DataSelector.CLOTHING.JACKET, 15),
-            (DataSelector.CLOTHING.SWEATER, 15),
-            (DataSelector.CLOTHING.SHIRT, 15),
-            (DataSelector.CLOTHING.HOODIE, 15),
-            (DataSelector.CLOTHING.COAT, 15),
-            (DataSelector.CLOTHING.VEST, 15),
-            (None, 120)
-        ]
-        BOTTOM_CLOTHING = [
-            (DataSelector.CLOTHING.BOTTOM, 15),
-            (DataSelector.CLOTHING.PANTIES, 15),
-            (DataSelector.CLOTHING.SOCK, 15),
-            (DataSelector.CLOTHING.PANTS, 15),
-            (DataSelector.CLOTHING.SKIRT, 15),
-            (None, 120)
-        ]
-        FULLBODY_CLOTHING = [
-            (DataSelector.CLOTHING.OVERALL, 20),
-            (DataSelector.CLOTHING.SWIMSUIT, 20),
-            (DataSelector.CLOTHING.BIKINI, 20),
-            (DataSelector.CLOTHING.KIMONO, 20),
-            (DataSelector.CLOTHING.DRESS, 20),
-            (DataSelector.CLOTHING.HAN_CLOTHING, 20),
-            (DataSelector.CLOTHING.LOLITA, 15),
-            (DataSelector.CLOTHING.UNIFORM, 15),
-            (None, 50)
-        ]
-        SHOE_CLOTHING = [
-            (DataSelector.CLOTHING.SHOES, 20),
-            (None, 180)
-        ]
-        CLOTHING_IF.extend(
-            self.random_weighted(
-                SPECIAL_OCCASION_CLOTHING
-            )
-        )
-        if self.check_list_empty(COMPOSITION_IF):
-            CLOTHING_IF.extend(
-                self.random_weighted(
-                    TOP_CLOTHING
-                )
-            )
-            CLOTHING_IF.extend(
-                self.random_weighted(
-                    BOTTOM_CLOTHING
-                )
-            )
-            if self.check_list_empty(CLOTHING_IF):
-                CLOTHING_IF.extend(
-                    self.random_weighted(
-                        FULLBODY_CLOTHING
-                    )
-                )
-        CLOTHING_IF.extend(
-            self.random_weighted(
-                SHOE_CLOTHING
-            )
-        )
-        BODY_IF = []
-        HEAD_HAIRSTYLE = [
-            (DataSelector.BODY.SIDE_HAIR, 15),
-            (DataSelector.BODY.BANGS, 15),
-            (DataSelector.BODY.HAIR_BUN, 15),
-            (DataSelector.BODY.OVERALL_HAIRSTYLE, 20),
-            (DataSelector.BODY.SPECIAL_EARS, 15),
-            (DataSelector.BODY.HORN, 10),
-            (DataSelector.BODY.BRAID, 15),
-            (DataSelector.BODY.PONYTAIL, 15),
-            (None, 100)
-        ]
-        HAIR_FEATURES = [
-            (DataSelector.BODY.HAIR_QUALITY, 20),
-            (DataSelector.BODY.HAIR_VOLUME, 20),
-            (DataSelector.BODY.LENGTH, 20),
-            (DataSelector.BODY.COLOR, 20),
-            (None, 200)
-        ]
-        BODY_FEATURES = [
-            (DataSelector.BODY.HAND, 20),
-            (DataSelector.BODY.SHOULDER, 20),
-            (DataSelector.BODY.CHEST, 20),
-            (DataSelector.BODY.WAIST, 20),
-            (DataSelector.BODY.ABDOMEN, 20),
-            (DataSelector.BODY.HIP, 20),
-            (DataSelector.BODY.LEG, 20),
-            (DataSelector.BODY.FOOT, 20),
-            (None, 100)
-        ]
-        DECORATIONS_AND_SPECIAL_FEATURES = [
-            (DataSelector.BODY.OTHER, 20),
-            (DataSelector.BODY.OTHER_DECORATIONS, 20),
-            (DataSelector.BODY.ANIMAL_EARS, 20),
-            (DataSelector.BODY.PATTERN, 20),
-            (DataSelector.BODY.NECK_BACK, 20),
-            (None, 100)
-        ]
-        BODY_IF.extend(
-            self.random_weighted(
-                HEAD_HAIRSTYLE
-            )
-        )
-        if not self.check_list_empty(BODY_IF):
-            BODY_IF.extend(
-                self.random_weighted(
-                    HAIR_FEATURES
-                )
-            )
-        BODY_IF.extend(
-            self.random_weighted(
-                BODY_FEATURES
-            )
-        )
-        if not self.check_list_empty(BODY_IF):
-            BODY_IF.extend(
-                self.random_weighted(
-                    DECORATIONS_AND_SPECIAL_FEATURES
-                )
-            )
-
-        FACE_IF = []
-        PRIMARY_FACE_FEATURES = [
-            (DataSelector.FACE.EYEBROWS, 15),
-            (DataSelector.FACE.EYE_REGION, 15),
-            (DataSelector.FACE.PUPIL_SHAPE, 15),
-            (DataSelector.FACE.MOUTH, 15),
-            (None, 140)
-        ]
-        DECORATIONS_AND_COLOR = [
-            (DataSelector.FACE.EMBELLISHMENT, 15),
-            (DataSelector.FACE.COLOR, 15),
-            (DataSelector.FACE.EYE_DECORATION, 15),
-            (None, 155)
-        ]
-        OTHER_FEATURES = [
-            (DataSelector.FACE.FOREHEAD, 15),
-            (DataSelector.FACE.OVERALL, 15),
-            (DataSelector.FACE.OTHER, 15),
-            (None, 155)
-        ]
-        FACE_IF.extend(
-            self.random_weighted(
-                PRIMARY_FACE_FEATURES
-            )
-        )
-        if not self.check_list_empty(FACE_IF):
-            FACE_IF.extend(
-                self.random_weighted(
-                    DECORATIONS_AND_COLOR
-                )
-            )
-        FACE_IF.extend(
-            self.random_weighted(
-                OTHER_FEATURES
-            )
-        )
-        EXPRESSION_IF = []
-        BASIC_EXPRESSIONS = [
-            (DataSelector.EXPRESSION.JOY, 15),
-            (DataSelector.EXPRESSION.SADNESS, 15),
-            (DataSelector.EXPRESSION.ANGER, 15),
-            (DataSelector.EXPRESSION.SURPRISE, 15),
-            (DataSelector.EXPRESSION.PANIC, 15),
-            (DataSelector.EXPRESSION.TIRED, 15),
-            (DataSelector.EXPRESSION.SHY, 15),
-            (None, 200)
-        ]
-        EYE_AND_MOUTH_EXPRESSIONS = [
-            (DataSelector.EXPRESSION.EYE, 50),
-            (DataSelector.EXPRESSION.MOUTH, 50),
-            (None, 100)
-        ]
-        EXPRESSION_IF.extend(
-            self.random_weighted(
-                BASIC_EXPRESSIONS
-            )
-        )
-        EXPRESSION_IF.extend(
-            self.random_weighted(
-                EYE_AND_MOUTH_EXPRESSIONS
-            )
-        )
-        COMPOSITION_IF = [i for i in COMPOSITION_IF if i is not None]
-        SCENE_IF = [i for i in SCENE_IF if i is not None]
-        ENVIRONMENT_IF = [i for i in ENVIRONMENT_IF if i is not None]
-        BACKGROUND_IF = [i for i in BACKGROUND_IF if i is not None]
-        R18_IF = [i for i in R18_IF if i is not None]
-        ACTION_IF = [i for i in ACTION_IF if i is not None]
-        ART_STYLE_IF = [i for i in ART_STYLE_IF if i is not None]
-        ILLUSTRATOR_IF = [i for i in ILLUSTRATOR_IF if i is not None]
-        CHARACTER_DESIGN_IF = [i for i in CHARACTER_DESIGN_IF if i is not None]
-        ACCESSORIES_IF = [i for i in ACCESSORIES_IF if i is not None]
-        CLOTHING_IF = [i for i in CLOTHING_IF if i is not None]
-        BODY_IF = [i for i in BODY_IF if i is not None]
-        FACE_IF = [i for i in FACE_IF if i is not None]
-        EXPRESSION_IF = [i for i in EXPRESSION_IF if i is not None]
-
-        ALL_IF = [
-            *COMPOSITION_IF, *SCENE_IF, *ENVIRONMENT_IF, *BACKGROUND_IF, *R18_IF, *ACTION_IF, *ART_STYLE_IF,
-            *ILLUSTRATOR_IF, *CHARACTER_DESIGN_IF, *ACCESSORIES_IF, *CLOTHING_IF, *BODY_IF, *FACE_IF,
-            *EXPRESSION_IF
-        ]
-        # 逻辑组
-        if num_of_characters == 1:
-            _tag.append(f"{num_of_characters}{gender}")
-        else:
-            _tag.append(f"{num_of_characters}{gender}s")
-        if enable_nsfw:
-            _tag.append("nsfw")
-        if DataSelector.COMPOSITION in self.pool or len(self.pool) == 0:
-            for if_sub in COMPOSITION_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.COMPOSITION,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.SCENE in self.pool or len(self.pool) == 0:
-            for if_sub in SCENE_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.SCENE,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.ENVIRONMENT in self.pool or len(self.pool) == 0:
-            for if_sub in ENVIRONMENT_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.ENVIRONMENT,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.BACKGROUND in self.pool or len(self.pool) == 0:
-            for if_sub in BACKGROUND_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.BACKGROUND,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.R18 in self.pool or len(self.pool) == 0:
-            for if_sub in R18_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.R18,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.ACTION in self.pool or len(self.pool) == 0:
-            for if_sub in ACTION_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.ACTION,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.ART_STYLE in self.pool or len(self.pool) == 0:
-            for if_sub in ART_STYLE_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.ART_STYLE,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.ILLUSTRATOR in self.pool or len(self.pool) == 0:
-            for if_sub in ILLUSTRATOR_IF:
-                tags = self.random_tag(
-                    top_type=DataSelector.ILLUSTRATOR,
-                    sub_type=if_sub,
-                    n=1
-                )
-                for tag in tags:
-                    if isinstance(tag, tuple):
-                        _tag.append(("{" + self.enhance_tag(tag[0]) + "}", tag[1]))
-                    elif isinstance(tag, str):
-                        _tag.append(self.enhance_tag(tag))
-        if DataSelector.CHARACTER_DESIGN in self.pool or len(self.pool) == 0:
-            for if_sub in CHARACTER_DESIGN_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.CHARACTER_DESIGN,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.ACCESSORIES in self.pool or len(self.pool) == 0:
-            for if_sub in ACCESSORIES_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.ACCESSORIES,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.CLOTHING in self.pool or len(self.pool) == 0:
-            for if_sub in CLOTHING_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.CLOTHING,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.BODY in self.pool or len(self.pool) == 0:
-            for if_sub in BODY_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.BODY,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.FACE in self.pool or len(self.pool) == 0:
-            for if_sub in FACE_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.FACE,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.EXPRESSION in self.pool or len(self.pool) == 0:
-            for if_sub in EXPRESSION_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.EXPRESSION,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        if DataSelector.COMPOSITION in self.pool or len(self.pool) == 0:
-            for if_sub in COMPOSITION_IF:
-                _tag.extend(self.random_tag(
-                    top_type=DataSelector.COMPOSITION,
-                    sub_type=if_sub,
-                    n=1
-                ))
-        _cleaned_tag = []
-        # 遍历tag,将其中的tuple,提取第一个元素
-        for i, t in enumerate(_tag):
-            if isinstance(t, tuple):
-                _cleaned_tag.append(t[0])
-            else:
-                _cleaned_tag.append(t)
-        return _tag, _cleaned_tag
diff --git a/src/novelai_python/utils/prompt_factory/cell/Accessories.py b/src/novelai_python/utils/prompt_factory/cell/Accessories.py
deleted file mode 100644
index fc3a6cc..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Accessories.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# -*- coding: utf-8 -*-
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-import pathlib
-
-_Accessories = ['主题发饰', '乐器', '体育', '其他', '其他1', '其他2', '其他3', '厨具', '头顶', '容器', '尾巴', '工具',
-                '手套', '数码', '文具', '日用', '材料', '武器', '汤和饮料', '玩具', '甜点', '翅膀', '耳饰', '肉禽蛋',
-                '胸部', '脸部', '腕臂', '腰部', '腿脚', '调味料和酱汁', '颈饰', '食物', '餐具', '鱼和海鲜']
-
-
-@dataclass(frozen=True, order=True)
-class AccessoryType(BaseCell):
-    def source(self):
-        data = pathlib.Path(__file__).parent.joinpath("raw/Accessories.json")  # 获取当前文件夹下的raw文件夹中的Accessories.json文件
-        return data
-
-    THEME_DECORATIONS = '主题发饰'
-    INSTRUMENTS = '乐器'
-    SPORTS = '体育'
-    OTHER1 = '其他'
-    OTHER2 = '其他1'
-    OTHER3 = '其他2'
-    OTHER4 = '其他3'
-    KITCHENWARE = '厨具'
-    HEAD = '头顶'
-    CONTAINER = '容器'
-    TAIL = '尾巴'
-    TOOLS = '工具'
-    GLOVES = '手套'
-    DIGITAL = '数码'
-    STATIONERY = '文具'
-    DAILY_USE = '日用'
-    MATERIALS = '材料'
-    WEAPONS = '武器'
-    SOUP_AND_DRINKS = '汤和饮料'
-    TOYS = '玩具'
-    DESSERTS = '甜点'
-    WINGS = '翅膀'
-    EAR_DECORATIONS = '耳饰'
-    MEAT_POULTRY_AND_EGGS = '肉禽蛋'
-    CHEST = '胸部'
-    FACE = '脸部'
-    ARM_WRIST = '腕臂'
-    WAIST = '腰部'
-    LEG_FOOT = '腿脚'
-    CONDIMENTS_AND_SAUCE = '调味料和酱汁'
-    NECK_DECORATIONS = '颈饰'
-    FOOD = '食物'
-    TABLEWARE = '餐具'
-    FISH_AND_SEAFOOD = '鱼和海鲜'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Action.py b/src/novelai_python/utils/prompt_factory/cell/Action.py
deleted file mode 100644
index 93f77f4..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Action.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Action = ['互动', '体育运动', '倒立', '倾靠', '其他1', '其他互动', '其他姿势', '双人姿势', '坐姿', '头发互动',
-           '头部姿势', '娱乐', '室内日常', '战斗', '户外', '手位置', '手指姿势', '手臂姿势', '指向', '数码', '文具',
-           '日用', '桌案', '植物', '武器', '沐浴', '活动', '玩具', '移动', '穿脱衣', '站姿', '胸部姿势', '腿部姿势',
-           '艺术', '衣服互动', '趴姿', '跪姿', '躺姿', '造型', '音乐', '食物', '魔幻']
-
-
-@dataclass(frozen=True, order=True)
-class ActionType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Action.json')
-        return data
-
-    INTERACTION = '互动'
-    SPORT = '体育运动'
-    HANDSTAND = '倒立'
-    LEANING = '倾靠'
-    OTHER1 = '其他1'
-    OTHER_INTERACTION = '其他互动'
-    OTHER_POSTURE = '其他姿势'
-    DOUBLE_POSTURE = '双人姿势'
-    SITTING = '坐姿'
-    HAIR_INTERACTION = '头发互动'
-    HEAD_POSTURE = '头部姿势'
-    ENTERTAINMENT = '娱乐'
-    INDOOR_DAILY = '室内日常'
-    BATTLE = '战斗'
-    OUTDOOR = '户外'
-    HAND_POSITION = '手位置'
-    FINGER_POSTURE = '手指姿势'
-    ARM_POSTURE = '手臂姿势'
-    POINTING = '指向'
-    DIGITAL = '数码'
-    STATIONERY = '文具'
-    DAILY_USE = '日用'
-    DESK_CASE = '桌案'
-    PLANT = '植物'
-    WEAPON = '武器'
-    BATHING = '沐浴'
-    ACTIVITY = '活动'
-    TOY = '玩具'
-    MOVEMENT = '移动'
-    DRESSING = '穿脱衣'
-    STANDING = '站姿'
-    BREAST_POSTURE = '胸部姿势'
-    LEG_POSTURE = '腿部姿势'
-    ART = '艺术'
-    CLOTHES_INTERACTION = '衣服互动'
-    PRONE_POSTURE = '趴姿'
-    KNEELING = '跪姿'
-    LYING = '躺姿'
-    STYLING = '造型'
-    MUSIC = '音乐'
-    FOOD = '食物'
-    MAGIC = '魔幻'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Art_Style.py b/src/novelai_python/utils/prompt_factory/cell/Art_Style.py
deleted file mode 100644
index 10539db..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Art_Style.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Art_style = ['传统材质', '作品', '其他风格', '年代风', '流派', '艺术家']
-
-
-@dataclass(frozen=True, order=True)
-class Art_StyleType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Art_Style.json')
-        return data
-
-    TRADITIONAL_MATERIALS = '传统材质'
-    ARTWORK = '作品'
-    OTHER_STYLES = '其他风格'
-    ERA_STYLE = '年代风'
-    GENRE = '流派'
-    ARTIST = '艺术家'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Background.py b/src/novelai_python/utils/prompt_factory/cell/Background.py
deleted file mode 100644
index 50e6e75..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Background.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Background = ['乐器', '图案背景', '实物背景', '室外设施', '家具', '工具', '幻想系', '摆设', '电器', '简单色背景',
-               '自然物', '装修', '载具']
-
-
-@dataclass(frozen=True, order=True)
-class BackgroundType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Background.json')
-        return data
-
-    INSTRUMENT = '乐器'
-    PATTERN_BACKGROUND = '图案背景'
-    PHYSICAL_BACKGROUND = '实物背景'
-    OUTDOOR_FACILITY = '室外设施'
-    FURNITURE = '家具'
-    TOOLS = '工具'
-    FANTASY = '幻想系'
-    DECORATIONS = '摆设'
-    APPLIANCE = '电器'
-    SIMPLE_COLOR_BACKGROUND = '简单色背景'
-    NATURE = '自然物'
-    DECORATION = '装修'
-    VEHICLE = '载具'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Body.py b/src/novelai_python/utils/prompt_factory/cell/Body.py
deleted file mode 100644
index b428cc6..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Body.py
+++ /dev/null
@@ -1,40 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Body = ['侧发', '其他', '其他装饰', '兽耳', '刘海', '发质', '发量', '发髻', '手', '整体发型', '特殊耳', '肩', '胸',
-         '腰部', '腹部', '腿部', '臀部', '花纹', '角', '足部', '辫子', '长度', '颈背', '颜色', '马尾']
-
-
-@dataclass(frozen=True, order=True)
-class BodyType(BaseCell):
-    def source(self):
-        data = pathlib.Path(__file__).parent.joinpath('raw/Body.json')
-        return data
-
-    SIDE_HAIR = '侧发'
-    OTHER = '其他'
-    OTHER_DECORATIONS = '其他装饰'
-    ANIMAL_EARS = '兽耳'
-    BANGS = '刘海'
-    HAIR_QUALITY = '发质'
-    HAIR_VOLUME = '发量'
-    HAIR_BUN = '发髻'
-    HAND = '手'
-    OVERALL_HAIRSTYLE = '整体发型'
-    SPECIAL_EARS = '特殊耳'
-    SHOULDER = '肩'
-    CHEST = '胸'
-    WAIST = '腰部'
-    ABDOMEN = '腹部'
-    LEG = '腿部'
-    HIP = '臀部'
-    PATTERN = '花纹'
-    HORN = '角'
-    FOOT = '足部'
-    BRAID = '辫子'
-    LENGTH = '长度'
-    NECK_BACK = '颈背'
-    COLOR = '颜色'
-    PONYTAIL = '马尾'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Character_Design.py b/src/novelai_python/utils/prompt_factory/cell/Character_Design.py
deleted file mode 100644
index 79684e3..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Character_Design.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-
-from .cell_schema import BaseCell
-
-_Character_design = ['人外', '人物关系', '其他', '年龄', '幻想系职业', '性格', '机设', '现实系职业', '皮肤', '组成',
-                     '非人']
-
-
-@dataclass(frozen=True, order=True)
-class Character_DesignType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Character_Design.json')
-        return data
-
-    NON_HUMAN = '人外'
-    CHARACTER_RELATIONSHIP = '人物关系'
-    OTHER = '其他'
-    AGE = '年龄'
-    FANTASY_JOB = '幻想系职业'
-    PERSONALITY = '性格'
-    MACHINERY = '机设'
-    REALISTIC_JOB = '现实系职业'
-    SKIN = '皮肤'
-    COMPOSITION = '组成'
-    NON_HUMAN_SPECIES = '非人'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Clothing.py b/src/novelai_python/utils/prompt_factory/cell/Clothing.py
deleted file mode 100644
index e3227e1..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Clothing.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Clothing = ['上衣', '下装', '中古系', '仪式', '兜帽', '其他', '其他种类', '内衣', '内衬', '内裤', '制服', '卫衣',
-             '吊带', '和服', '大衣', '头部', '夹克', '居家', '开口', '情趣', '扣式',
-             '披风兜帽', '整体', '服装纹样', '未来系', '比基尼', '毛衣', '汉服', '泳衣', '洛丽塔', '现代系', '种族cos',
-             '紧身衣', '职业cos', '背心', '节日', '衬衫', '袖子', '袜子', '装饰', '裙子', '裤子', '运动系', '连衣裙',
-             '雨衣', '非衣服当衣服', '鞋子', '领子']
-
-
-@dataclass(frozen=True, order=True)
-class ClothingType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Clothing.json')
-        return data
-
-    TOP = '上衣'
-    BOTTOM = '下装'
-    MEDIEVAL = '中古系'
-    CEREMONIAL = '仪式'
-    HOOD = '兜帽'
-    OTHER = '其他'
-    OTHER_TYPES = '其他种类'
-    UNDERWEAR = '内衣'
-    LINING = '内衬'
-    PANTIES = '内裤'
-    UNIFORM = '制服'
-    HOODIE = '卫衣'
-    SUSPENDERS = '吊带'
-    KIMONO = '和服'
-    COAT = '大衣'
-    HEAD = '头部'
-    JACKET = '夹克'
-    HOME_CLOTHES = '居家'
-    OPEN_CLOTHING = '开口'
-    SEXY = '情趣'
-    BUTTON_CLOTHING = '扣式'
-    CAPED_HOOD = '披风兜帽'
-    OVERALL = '整体'
-    CLOTHING_PATTERN = '服装纹样'
-    FUTURE = '未来系'
-    BIKINI = '比基尼'
-    SWEATER = '毛衣'
-    HAN_CLOTHING = '汉服'
-    SWIMSUIT = '泳衣'
-    LOLITA = '洛丽塔'
-    MODERN = '现代系'
-    RACE_COSPLAY = '种族cos'
-    TIGHT_FITTING = '紧身衣'
-    JOB_COSPLAY = '职业cos'
-    VEST = '背心'
-    HOLIDAY = '节日'
-    SHIRT = '衬衫'
-    SLEEVE = '袖子'
-    SOCK = '袜子'
-    DECORATION = '装饰'
-    SKIRT = '裙子'
-    PANTS = '裤子'
-    SPORTS = '运动系'
-    DRESS = '连衣裙'
-    RAINCOAT = '雨衣'
-    NON_CLOTHING_AS_CLOTHING = '非衣服当衣服'
-    SHOES = '鞋子'
-    COLLAR = '领子'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Composition.py b/src/novelai_python/utils/prompt_factory/cell/Composition.py
deleted file mode 100644
index f8c13d1..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Composition.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Composition = ['主题', '人物视线', '其他', '区域', '叶', '地平线', '天空', '日月', '昆虫', '构成', '火焰和爆炸', '烟',
-                '焦点', '纸', '背景关系', '自然现象', '花', '视角', '角度', '设计元素', '远近', '透视', '魔幻']
-
-
-@dataclass(frozen=True, order=True)
-class CompositionType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Composition.json')
-        return data
-
-    THEME = '主题'
-    CHARACTER_SIGHTLINE = '人物视线'
-    OTHER = '其他'
-    REGION = '区域'
-    LEAF = '叶'
-    HORIZON = '地平线'
-    SKY = '天空'
-    SUN_MOON = '日月'
-    INSECT = '昆虫'
-    COMPOSITION = '构成'
-    FIRE_AND_EXPLOSION = '火焰和爆炸'
-    SMOKE = '烟'
-    FOCUS = '焦点'
-    PAPER = '纸'
-    BACKGROUND_RELATIONSHIP = '背景关系'
-    NATURAL_PHENOMENON = '自然现象'
-    FLOWER = '花'
-    PERSPECTIVE = '视角'
-    ANGLE = '角度'
-    DESIGN_ELEMENT = '设计元素'
-    DISTANCE = '远近'
-    PERSPECTIVE_VISION = '透视'
-    FANTASY = '魔幻'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Environment.py b/src/novelai_python/utils/prompt_factory/cell/Environment.py
deleted file mode 100644
index 327644a..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Environment.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Environment = ['中型陆地哺乳', '主题', '交通', '交通工具', '人造景观', '其他', '军事', '办公', '园林', '场地',
-                '大型陆地哺乳', '太空', '娱乐旅宿', '室内其他', '室外其他', '家居', '小型陆地哺乳', '屋外', '工业',
-                '市政', '市镇', '幻兽种', '建筑', '建筑风格', '恐龙', '果实', '树木', '校园', '水产', '海洋哺乳',
-                '游乐设施', '灌木', '爬行两栖', '自然景观', '自然环境', '节肢', '花', '草', '藤类', '设施', '购物',
-                '运动场', '餐饮', '鸟类']
-
-
-@dataclass(frozen=True, order=True)
-class EnvironmentType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Environment.json')
-        return data
-
-    MEDIUM_TERRESTRIAL_MAMMAL = '中型陆地哺乳'
-    THEME = '主题'
-    TRANSPORTATION = '交通'
-    VEHICLE = '交通工具'
-    MAN_MADE_SCENERY = '人造景观'
-    OTHER = '其他'
-    MILITARY = '军事'
-    OFFICE = '办公'
-    GARDEN = '园林'
-    SITE = '场地'
-    LARGE_TERRESTRIAL_MAMMAL = '大型陆地哺乳'
-    SPACE = '太空'
-    ENTERTAINMENT_ACCOMMODATION = '娱乐旅宿'
-    INDOOR_OTHER = '室内其他'
-    OUTDOOR_OTHER = '室外其他'
-    HOME = '家居'
-    SMALL_TERRESTRIAL_MAMMAL = '小型陆地哺乳'
-    OUTDOOR = '屋外'
-    INDUSTRY = '工业'
-    MUNICIPAL = '市政'
-    TOWN = '市镇'
-    MAGICAL_BEAST_SPECIES = '幻兽种'
-    ARCHITECTURE = '建筑'
-    ARCHITECTURAL_STYLE = '建筑风格'
-    DINOSAUR = '恐龙'
-    FRUIT = '果实'
-    TREE = '树木'
-    CAMPUS = '校园'
-    AQUATIC = '水产'
-    MARINE_MAMMAL = '海洋哺乳'
-    AMUSEMENT_FACILITIES = '游乐设施'
-    SHRUB = '灌木'
-    REPTILIAN_AMPHIBIAN = '爬行两栖'
-    NATURAL_LANDSCAPE = '自然景观'
-    NATURAL_ENVIRONMENT = '自然环境'
-    ARTHROPOD = '节肢'
-    FLOWER = '花'
-    GRASS = '草'
-    VINE = '藤类'
-    FACILITY = '设施'
-    SHOPPING = '购物'
-    SPORTS_FIELD = '运动场'
-    CATERING = '餐饮'
-    BIRD = '鸟类'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Expression.py b/src/novelai_python/utils/prompt_factory/cell/Expression.py
deleted file mode 100644
index a91d4ca..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Expression.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Expression = ['其他', '哀', '喜', '嘴', '怒', '惊', '慌', '眼', '累', '羞']
-
-
-@dataclass(frozen=True, order=True)
-class ExpressionType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Expression.json')
-        return data
-
-    OTHER = '其他'
-    SADNESS = '哀'
-    JOY = '喜'
-    MOUTH = '嘴'
-    ANGER = '怒'
-    SURPRISE = '惊'
-    PANIC = '慌'
-    EYE = '眼'
-    TIRED = '累'
-    SHY = '羞'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Face.py b/src/novelai_python/utils/prompt_factory/cell/Face.py
deleted file mode 100644
index 7f75d58..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Face.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Face = ['修饰', '其他', '嘴巴', '整体', '眉毛', '眼部', '眼部装饰', '瞳孔形状', '颜色', '额头']
-
-
-@dataclass(frozen=True, order=True)
-class FaceType(BaseCell):
-    def source(self):
-        # 获取当前文件夹下的raw文件夹中的json文件
-        data = pathlib.Path(__file__).parent.joinpath('raw/Face.json')
-        return data
-
-    EMBELLISHMENT = '修饰'
-    OTHER = '其他'
-    MOUTH = '嘴巴'
-    OVERALL = '整体'
-    EYEBROWS = '眉毛'
-    EYE_REGION = '眼部'
-    EYE_DECORATION = '眼部装饰'
-    PUPIL_SHAPE = '瞳孔形状'
-    COLOR = '颜色'
-    FOREHEAD = '额头'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Illustrator.py b/src/novelai_python/utils/prompt_factory/cell/Illustrator.py
deleted file mode 100644
index d1f57f5..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Illustrator.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Illustrator = ['画师']
-
-
-@dataclass(frozen=True, order=True)
-class IllustratorType(BaseCell):
-    def source(self):
-        data = pathlib.Path(__file__).parent.joinpath('raw/Illustrator.json')
-        return data
-
-    PAINTER = '画师'
diff --git a/src/novelai_python/utils/prompt_factory/cell/Scene.py b/src/novelai_python/utils/prompt_factory/cell/Scene.py
deleted file mode 100644
index fae12b8..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/Scene.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_Scene = ['一天', '光', '其他画面', '其他符号', '功能', '动画', '四季', '封面和书本', '影', '插画和CG', '气泡', '滤镜',
-          '漫画', '画面元素', '画面增强', '线条', '节日', '设定', '音符', '颜色风格']
-
-
-@dataclass(frozen=True, order=True)
-class SceneType(BaseCell):
-    def source(self):
-        data = pathlib.Path(__file__).parent.joinpath('raw/Scene.json')
-        return data
-
-    DAYTIME = '一天'
-    LIGHT = '光'
-    OTHER_SCENES = '其他画面'
-    OTHER_SYMBOLS = '其他符号'
-    FUNCTION = '功能'
-    ANIMATION = '动画'
-    SEASONS = '四季'
-    COVERS_AND_BOOKS = '封面和书本'
-    SHADOW = '影'
-    ILLUSTRATIONS_AND_CG = '插画和CG'
-    BUBBLE = '气泡'
-    FILTER = '滤镜'
-    COMICS = '漫画'
-    SCENE_ELEMENTS = '画面元素'
-    SCENE_ENHANCEMENT = '画面增强'
-    LINE = '线条'
-    HOLIDAY = '节日'
-    SETTINGS = '设定'
-    MUSIC_NOTES = '音符'
-    COLOR_STYLE = '颜色风格'
diff --git a/src/novelai_python/utils/prompt_factory/cell/__init__.py b/src/novelai_python/utils/prompt_factory/cell/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/novelai_python/utils/prompt_factory/cell/cell_schema.py b/src/novelai_python/utils/prompt_factory/cell/cell_schema.py
deleted file mode 100644
index e4af9a3..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/cell_schema.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import inspect
-from abc import abstractmethod
-
-
-class BaseCell(object):
-
-    @abstractmethod
-    def source(self):
-        raise NotImplementedError
-
-    @classmethod
-    def attributes(cls):
-        return [attr for attr in dir(cls) if attr.isupper()]
-
-    @classmethod
-    def get_values(cls):
-        # 获取类中所有的大写属性的值
-        return [value for name, value in inspect.getmembers(cls) if name.isupper()]
diff --git a/src/novelai_python/utils/prompt_factory/cell/r18.py b/src/novelai_python/utils/prompt_factory/cell/r18.py
deleted file mode 100644
index 36d2f89..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/r18.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-import pathlib
-from dataclasses import dataclass
-from .cell_schema import BaseCell
-
-_R18 = ['17.9tag']
-
-
-@dataclass(frozen=True, order=True)
-class R18Type(BaseCell):
-    def source(self):
-        data = pathlib.Path(__file__).parent.joinpath('raw/r18.json')
-        return data
-
-    TAG_17_9 = '17.9tag'
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Accessories.json b/src/novelai_python/utils/prompt_factory/cell/raw/Accessories.json
deleted file mode 100644
index a6dd462..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Accessories.json
+++ /dev/null
@@ -1,758 +0,0 @@
-{
-  "主题发饰": {
-    "X发饰": "x hair ornament",
-    "三叶草发饰": "clover hair ornament",
-    "兔子头饰": "bunny hair ornament",
-    "南瓜发饰": "pumpkin hair ornament",
-    "发饰": "hair ornament",
-    "心形发饰": "heart hair ornament",
-    "星星发饰": "star hair ornament",
-    "月牙发饰": "crescent hair ornament",
-    "树叶发饰": "leaf hair ornament",
-    "猫头饰": "cat hair ornament",
-    "羽毛发饰": "feather hair ornament",
-    "翅膀发饰": "wing hair ornament",
-    "胡萝卜发饰": "carrot hair ornament",
-    "蛇发饰": "snake hair ornament",
-    "蝙蝠发饰": "bat hair ornament",
-    "蝴蝶发饰": "butterfly hair ornament",
-    "锚发饰": "anchor hair ornament",
-    "雪花头饰": "snowflake hair ornament",
-    "青蛙发饰": "frog hair ornament",
-    "音符发饰": "musical note hair ornament",
-    "食物主题发饰": "food-themed hair ornament",
-    "骨发饰": "bone hair ornament",
-    "骷髅发饰": "skull hair ornament",
-    "鱼形发饰": "fish hair ornament"
-  },
-  "乐器": {
-    "乐器": "instrument",
-    "吉他": "guitar",
-    "大提琴": "cello",
-    "麦克风": "microphone"
-  },
-  "体育": {
-    "冲浪板": "surfboard",
-    "扑克": "playing card",
-    "棋子": "chess piece",
-    "沙滩球": "beachball",
-    "泳圈": "innertube",
-    "球": "ball",
-    "篮球": "basketball",
-    "网球": "tennis",
-    "足球": "football",
-    "鱼竿": "fishing rod"
-  },
-  "其他": {
-    "(AI语)黏糊糊的食物": "cha throres",
-    "一顿饭": "meal",
-    "儿童餐": "okosama lunch",
-    "午餐": "lunch",
-    "早餐": "breakfast",
-    "晚餐": "dinner",
-    "盛宴": "feast",
-    "食物": "food"
-  },
-  "其他1": {
-    "三角小旗": "pennant",
-    "珍珠": "pearl",
-    "花束": "bouquet"
-  },
-  "其他2": {
-    "发卡": "hairpin",
-    "发夹": "hairclip",
-    "发带": "hair tie",
-    "发束": "hair scrunchie",
-    "发珠": "hair beads",
-    "发箍": "color?:hairband",
-    "发髻套": "bun cover",
-    "多个蝴蝶结": "multiple hair bows",
-    "头上铃铛": "hair bell",
-    "头纱": "veil",
-    "头饰": "headwear",
-    "头饰花": "hair flower",
-    "头饰蝴蝶结": "hair bow",
-    "女仆头饰": "maid headdress",
-    "扎发绒球": "hair bobbles",
-    "新娘头纱": "bridal veil",
-    "洛丽塔发箍": "lolita hairband",
-    "簪子": "kanzashi",
-    "花环": "head wreath",
-    "蓝牙耳机头饰": "hairpods",
-    "蝴蝶结发箍": "bow hairband"
-  },
-  "其他3": {
-    "丝带": "silk",
-    "创可贴": "bandaid",
-    "宝石": "gemstone",
-    "徽章": "badge",
-    "格子蝴蝶结": "plaid bow",
-    "流苏": "tassel",
-    "缎带": "color?:ribbon",
-    "花饰": "flower trim",
-    "蓬莱玉枝": "jeweled branch of hourai",
-    "蝴蝶结": "color?:bow",
-    "钻石": "diamond"
-  },
-  "厨具": {
-    "锅铲": "spatula"
-  },
-  "头顶": {
-    "光环": "halo",
-    "机械式光环": "mechanical halo"
-  },
-  "容器": {
-    "万圣节桶": "halloween bucket",
-    "奶瓶": "milk bottle",
-    "木桶": "wooden bucket",
-    "桶": "pail",
-    "水瓶": "water bottle",
-    "瓶子": "bottle",
-    "篮子": "basket",
-    "麻袋": "sack"
-  },
-  "尾巴": {
-    "兔尾": "bunny tail",
-    "尾巴": "color?:tail",
-    "恶魔尾巴": "demon tail",
-    "松鼠尾": "squirrel tail",
-    "浣熊尾": "raccoon tail",
-    "牛尾": "cow tail",
-    "狐狸尾": "fox tail",
-    "狗尾": "dog tail",
-    "狼尾": "wolf tail",
-    "猫尾": "cat tail",
-    "老虎尾": "tiger tail",
-    "马尾巴": "horse tail",
-    "鼠尾": "mouse tail",
-    "龙尾": "dragon tail"
-  },
-  "工具": {
-    "剪刀": "scissors",
-    "斧头": "axe",
-    "短斧": "hatchet",
-    "锤子": "hammer"
-  },
-  "手套": {
-    "乳胶手套": "latex gloves",
-    "手套": "color?:gloves",
-    "无指手套": "fingerless gloves",
-    "猫爪": "cat paws",
-    "猫猫手套": "paw gloves",
-    "肘部手套": "elbow gloves"
-  },
-  "数码": {
-    "iPod": "ipod",
-    "任天堂3ds": "nintendo 3ds",
-    "任天堂ds": "nintendo ds",
-    "喇叭": "megaphone",
-    "平板电脑": "tablet pc",
-    "手机": "cellphone",
-    "手柄": "controller",
-    "掌上游戏机": "handheld game console",
-    "数据线": "cable",
-    "智能手机": "smartphone",
-    "电话": "phone",
-    "相机": "camera",
-    "磁带盒": "cassette",
-    "笔记本电脑": "laptop"
-  },
-  "文具": {
-    "乐谱": "sheet music",
-    "书堆": "book stack",
-    "书本": "book",
-    "信": "letter",
-    "日历": "calendar",
-    "明信片": "postcard",
-    "活动铅笔": "mechanical pencil",
-    "画笔": "paintbrush",
-    "笔": "pen",
-    "笔记本": "notebook",
-    "素描本": "sketchbook",
-    "纸张": "paper",
-    "铅笔": "pencil"
-  },
-  "日用": {
-    "书包": "school bag",
-    "乳液瓶子": "lotion bottle",
-    "伞": "color?:umbrella",
-    "包": "bag",
-    "单肩包": "shoulder bag",
-    "团子抱枕": "dumpling hug pillow",
-    "团扇": "uchiwa",
-    "太阳伞": "parasol",
-    "奖杯": "trophy",
-    "手杖": "cane",
-    "手表": "wristwatch",
-    "折扇": "folding fan",
-    "挎包": "satchel",
-    "枕头": "pillow",
-    "水管": "hose",
-    "沙滩伞": "beach umbrella",
-    "油纸伞": "oil-paper umbrella",
-    "洒水壶": "watering can",
-    "硬币": "coin",
-    "礼物盒": "gift box",
-    "糖果手杖": "candy cane",
-    "纸扇": "paper fan",
-    "背包": "backpack",
-    "荷叶边枕头": "frilled pillow",
-    "身体乳": "lotion",
-    "透明伞": "transparent umbrella",
-    "钥匙": "key",
-    "钱": "money",
-    "香烟": "cigarette"
-  },
-  "材料": {
-    "凝胶": "gelatin",
-    "奶油": "cream",
-    "奶黄": "custard",
-    "巴伐利亚奶油": "bavarois",
-    "打发的奶油": "whipped cream",
-    "焦糖": "caramel",
-    "红豆馅": "red bean paste",
-    "面包屑": "crumbs",
-    "面包皮": "bread crust",
-    "面团": "dough",
-    "面粉": "flour",
-    "黄油": "butter"
-  },
-  "武器": {
-    "AK47": "ak 47",
-    "三叉枪": "trident",
-    "军舰": "warship",
-    "刀鞘": "scabbard",
-    "剑": "sword",
-    "加农炮": "cannon",
-    "匕首": "dagger",
-    "圣剑": "holy sword",
-    "大尺寸武器": "huge weapon",
-    "大镰": "scythe",
-    "导弹": "missile",
-    "手雷": "antitank grenade",
-    "枪": "gun",
-    "武器": "weapon",
-    "武器(复)": "weapons",
-    "武士刀": "katana",
-    "汤普森冲锋枪": "thompson submachine gun",
-    "激光剑": "energy saber",
-    "激光枪": "laser rifle",
-    "炮台": "turret",
-    "炸弹": "bomb",
-    "狙击步枪": "sniper rifle",
-    "科技武器": "scientific and technological weapons",
-    "箭": "arrow",
-    "航空母舰": "aircraft carrier",
-    "鞭": "whip",
-    "马克沁机枪": "maxim machine gun",
-    "马鞭": "riding crop",
-    "魔剑": "shadowbane",
-    "魔杖": "wand",
-    "魔法剑": "magic sword"
-  },
-  "汤和饮料": {
-    "七喜": "7up",
-    "伏特加": "vodka",
-    "伯爵红茶": "earl grey tea",
-    "养乐多": "yakult",
-    "冰茶": "iced tea",
-    "可口可乐": "coca-cola",
-    "可尔必思": "calpis",
-    "味噌汤": "miso soup",
-    "咖啡": "coffee",
-    "咖啡拉花": "latte art",
-    "咖啡豆": "coffee beans",
-    "啤酒": "beer",
-    "奶昔": "milkshake",
-    "奶茶": "milk tea",
-    "威士忌": "whiskey",
-    "巧克力牛奶": "chocolate milk",
-    "开菲尔": "kefir",
-    "拿铁咖啡": "cafe au lait",
-    "无酒精啤酒": "non-alcoholic beer",
-    "日本酒": "sake",
-    "星巴克": "starbucks",
-    "果汁": "juice",
-    "柠檬汽水": "lemonade",
-    "根汁啤酒": "root beer",
-    "橙汁": "orange juice",
-    "汤": "soup",
-    "汽水罐": "soda can",
-    "波子汽水": "ramune",
-    "激浪": "mountain dew",
-    "热带饮料": "tropical drink",
-    "牛奶": "milk",
-    "牛奶周转桶": "milk churn",
-    "玛格丽塔": "margarita",
-    "珍珠奶茶": "bubble tea",
-    "甘酒": "amazake",
-    "百事可乐": "pepsi",
-    "盒装牛奶": "milk carton",
-    "红茶": "black tea",
-    "红酒": "wine",
-    "绿茶": "green tea",
-    "罐装咖啡": "canned coffee",
-    "胡椒博士": "dr pepper",
-    "芬达": "fanta",
-    "苏打": "soda",
-    "茶": "tea",
-    "草药茶": "herbal tea",
-    "草莓牛奶": "strawberry milk",
-    "蒲公英咖啡": "dandelion coffee",
-    "薄荷茶": "spear mint tea",
-    "达吉岭茶": "darjeeling tea",
-    "酒": "liquor",
-    "酒精": "alcohol",
-    "酸奶": "yogurt",
-    "香槟酒": "champagne",
-    "鸡尾酒": "cocktail",
-    "龙舌兰酒": "tequila"
-  },
-  "玩具": {
-    "兔子玩偶": "stuffed bunny",
-    "动物玩偶": "stuffed animal",
-    "小风车": "pinwheel",
-    "橡皮鸭": "rubber duck",
-    "水枪": "water gun",
-    "玩偶": "stuffed toy",
-    "玩具": "toys"
-  },
-  "甜点": {
-    "MM巧克力": "m&m's",
-    "country ma'am糕点": "country ma'am",
-    "乳酪蛋糕": "cheesecake",
-    "仙贝": "senbei",
-    "冰棒": "popsicle",
-    "冰沙": "slushie",
-    "冰淇淋": "ice cream",
-    "冰淇淋三明治": "ice cream sandwich",
-    "冰淇淋脆片": "wafer",
-    "分层蛋糕": "cake slice",
-    "刨冰": "shaved ice",
-    "千层蛋糕": "layer cake",
-    "千层酥": "mille-feuille",
-    "华夫饼": "waffle",
-    "华夫饼蛋筒": "waffle cone",
-    "双球冰淇淋": "double scoop",
-    "口香糖": "chewing gum",
-    "口香糖球": "gumball",
-    "可丽饼": "crepe",
-    "和果子": "wagashi",
-    "品客": "pringles",
-    "团子": "dango",
-    "圣代": "sundae",
-    "圣诞蛋糕": "christmas cake",
-    "多力兹": "doritos",
-    "大福": "daifuku",
-    "夹心饼干": "sandwich cookie",
-    "奇巧巧克力": "kitkat",
-    "奥利奥": "oreo",
-    "妙脆角": "bugles",
-    "姜饼人": "gingerbread man",
-    "姜饼屋": "gingerbread house",
-    "姜饼饼干": "gingerbread cookie",
-    "巧克力": "chocolate",
-    "巧克力喷泉": "chocolate fountain",
-    "巧克力女爵": "chocolate marquise",
-    "巧克力片饼干": "chocolate chip cookie",
-    "巧克力甜甜圈": "chocolate doughnut",
-    "巧克力蛋": "creme egg",
-    "巧克力蛋糕": "chocolate cake",
-    "布丁": "pudding",
-    "布朗尼巧克力": "brownie",
-    "心形巧克力": "heart-shaped chocolate",
-    "挞": "tart",
-    "提拉米苏": "tiramisu",
-    "旋涡棒棒糖": "swirl lollipop",
-    "月饼": "mooncake",
-    "松饼": "muffin",
-    "棉花糖": "cotton candy",
-    "棋盘花纹的饼干": "checkerboard cookie",
-    "棒棒糖": "lollipop",
-    "樱花麻薯": "sakura mochi",
-    "歌剧院蛋糕": "opera cake",
-    "水果挞": "fruit tart",
-    "法式布丁": "pudding a la mode",
-    "泡芙": "cream puff",
-    "熔岩巧克力蛋糕": "fondant au chocolat",
-    "爆米花": "popcorn",
-    "瑞士卷": "swiss roll",
-    "甜甜圈": "doughnut",
-    "生日蛋糕": "birthday cake",
-    "生果子": "namagashi",
-    "白巧克力": "white chocolate",
-    "百奇饼干": "pocky",
-    "皮纳塔": "pinata",
-    "磅蛋糕": "pound cake",
-    "糕点": "pastry",
-    "糖果": "candy",
-    "糖果包装": "candy wrapper",
-    "糖果豆": "jelly bean",
-    "糖果零食": "candy snack",
-    "糖苹果": "candy apple",
-    "糖霜": "icing",
-    "红丝绒蛋糕": "red velvet cake",
-    "红豆包": "anpan",
-    "纸杯蛋糕": "cupcake",
-    "肉桂卷": "cinnamon roll",
-    "芭菲": "parfait",
-    "苹果派": "apple pie",
-    "草莓大福": "ichigo daifuku",
-    "草莓奶油海绵蛋糕": "strawberry shortcake",
-    "草莓挞": "strawberry tart",
-    "草莓瑞士卷": "strawberry swiss roll",
-    "草莓芭菲": "strawberry parfait",
-    "蓝莓挞": "blueberry tart",
-    "薯片": "chips",
-    "蛋卷冰淇淋": "ice cream cone",
-    "蛋糕": "cake",
-    "螺旋脊状甜甜圈": "french cruller",
-    "软冰淇淋": "soft serve",
-    "酥皮甜甜圈": "old-fashioned doughnut",
-    "铜锣烧": "dorayaki",
-    "闪电泡芙": "eclair",
-    "饼干": "biscuit",
-    "馅饼": "pie",
-    "香烟糖果": "cigarette candy",
-    "香蕉冰淇淋": "banana split",
-    "马卡龙": "macaron",
-    "鲷鱼烧": "taiyaki",
-    "鸣门卷": "narutomaki",
-    "麻薯": "mochi",
-    "黑森林蛋糕": "black forest cake"
-  },
-  "翅膀": {
-    "低位翅膀": "low wings",
-    "假翅膀": "fake wings",
-    "冰纹理翅膀": "ice crystal texture wings",
-    "分离的翅膀": "detached wings",
-    "天使翅膀": "feathered wings",
-    "头上翅膀": "head wings",
-    "妖精翅膀": "fairy wings",
-    "恶魔翅膀": "demon wings",
-    "翅膀": "color?:wings",
-    "蝙蝠翅膀": "bat wings",
-    "蝴蝶翅膀": "butterfly wings",
-    "迷你翅膀": "mini wings",
-    "龙翅膀": "dragon wings"
-  },
-  "耳饰": {
-    "后脑带的耳机": "behind-the-head headphones",
-    "心形耳饰": "heart earrings",
-    "月牙耳饰": "crescent earrings",
-    "水晶耳饰": "crystal earrings",
-    "猫耳耳机": "cat ear headphones",
-    "耳机": "headphones",
-    "耳机(带话筒)": "headset",
-    "耳环": "hoop earrings",
-    "耳饰": "earrings"
-  },
-  "肉禽蛋": {
-    "圆柱形带骨肉": "boned meat",
-    "培根": "bacon",
-    "水煮蛋": "hardboiled egg",
-    "火腿": "ham",
-    "火鸡": "turkey",
-    "炒鸡蛋": "scrambled egg",
-    "炸鸡": "fried chicken",
-    "烤肉串": "kebab",
-    "烤鸡肉串": "yakitori",
-    "煎蛋卷": "omelet",
-    "牛排": "steak",
-    "猪肉": "pork",
-    "皮蛋": "century egg",
-    "章鱼状香肠": "tako-san wiener",
-    "肉": "meat",
-    "肉丸": "meatball",
-    "蛋": "egg",
-    "蛋黄": "egg yolk",
-    "香肠": "sausage",
-    "鸡块": "chicken nuggets"
-  },
-  "胸部": {
-    "胸部宝石": "chest jewel",
-    "胸部束缚": "breast bondage",
-    "胸针": "brooch"
-  },
-  "脸部": {
-    "VR头显": "head mounted display",
-    "下半无框眼镜": "over-rim eyewear",
-    "医用口罩": "surgical mask",
-    "单眼绷带": "bandage over one eye",
-    "口罩": "mouth mask",
-    "天狗面具": "tengu mask",
-    "太阳镜": "sunglasses",
-    "头上面具": "mask on head",
-    "带眼镜的": "bespectacled",
-    "心形眼镜": "heart-shaped eyewear",
-    "护目镜": "goggles",
-    "护目镜在头上": "goggles on head",
-    "摘下的面具": "mask removed",
-    "无框眼镜": "rimless eyewear",
-    "狐狸面具": "fox mask",
-    "眼罩": "blindfold",
-    "眼罩(独眼)": "eyepatch",
-    "眼镜": "glasses",
-    "眼镜在头上": "eyewear on head",
-    "脸绷带": "bandage on face",
-    "蒙上的眼": "covered eyes",
-    "防毒面具": "gas mask",
-    "面具": "mask",
-    "面纱": "mouth veil"
-  },
-  "腕臂": {
-    "宽手铐": "shackles",
-    "手枷": "cuffs",
-    "手铐": "handcuffs",
-    "手镯": "bangle",
-    "护腕": "bracer",
-    "珠子手链": "bead bracelet",
-    "腕带": "wristband",
-    "腕饰": "wrist cuffs",
-    "臂环": "arm belt",
-    "臂章": "color?:armband",
-    "花手镯": "flower bracelet"
-  },
-  "腰部": {
-    "搭扣": "buckles",
-    "武装带": "sam browne belt",
-    "腰带": "belt",
-    "饰带": "sash"
-  },
-  "腿脚": {
-    "大腿带": "thigh strap",
-    "绑脚": "bound legs",
-    "脚环": "anklet",
-    "腿上创可贴": "bandaid on leg",
-    "腿带": "leg belt",
-    "腿部系带": "ankle lace-up",
-    "腿部花边环": "leg garter"
-  },
-  "调味料和酱汁": {
-    "八角": "star anise",
-    "咖喱": "curry",
-    "巧克力酱": "chocolate syrup",
-    "拌饭素": "furikake",
-    "撒盐瓶子": "salt shaker",
-    "方糖": "sugar cube",
-    "果酱": "jam",
-    "橘子酱": "marmalade",
-    "炼乳": "condensed milk",
-    "番茄酱": "ketchup",
-    "盐": "salt",
-    "肉桂": "cinnamon",
-    "胡椒瓶": "pepper shaker",
-    "芥末": "wasabi",
-    "花生酱": "peanut butter",
-    "草莓酱": "strawberry ketchup",
-    "蛋黄酱": "mayonnaise",
-    "蜂蜜": "honey",
-    "辣酱": "hot sauce",
-    "酱油": "soy sauce"
-  },
-  "颈饰": {
-    "围巾": "scarf",
-    "心锁": "heart lock",
-    "拉丁十字架": "latin cross",
-    "格子领带": "plaid necktie",
-    "狗牌": "dog tags",
-    "狗项圈": "dog collar",
-    "珠子项链": "bead necklace",
-    "脖子挂口哨": "whistle around neck",
-    "脖子挂耳机": "headphones around neck",
-    "铃铛": "bell",
-    "锁链": "chains",
-    "锚形项圈": "anchor choker",
-    "项圈": "collar",
-    "项链": "necklace",
-    "领巾": "color?:neckerchief",
-    "领带": "necktie",
-    "领结": "color?:bowtie",
-    "颈带": "neck ribbon",
-    "颈饰": "choker"
-  },
-  "食物": {
-    "noppo面包": "noppo bread",
-    "三明治": "sandwich",
-    "乌冬面": "udon",
-    "什锦煎饼": "okonomiyaki",
-    "便当": "bento",
-    "关东煮": "oden",
-    "加帕里包": "japari bun",
-    "包子": "baozi",
-    "十字包": "hot cross bun",
-    "千层面": "lasagne",
-    "吐司": "toast",
-    "咖喱饭": "curry rice",
-    "塔可": "taco",
-    "寿司": "sushi",
-    "寿司卷": "a sushi roll",
-    "寿喜烧": "sukiyaki",
-    "恩巴纳达": "empanada",
-    "意大利面": "spaghetti",
-    "披萨": "pizza",
-    "披萨片": "pizza slice",
-    "披萨盒": "pizza box",
-    "拉面": "ramen",
-    "日式烩年糕": "zouni soup",
-    "日式猪排饭": "katsudon",
-    "杯面": "cup ramen",
-    "汉堡包": "cheeseburger",
-    "汤圆": "tang yuan",
-    "法式吐司": "french toast",
-    "法棍": "baguette",
-    "火锅": "nabe",
-    "炒面": "yakisoba",
-    "炒饭": "fried rice",
-    "烤饼": "scone",
-    "热狗": "hot dog",
-    "煎饼": "pancake",
-    "煎饼堆": "pancake stack",
-    "牛井": "gyuudon",
-    "玉米热狗": "corn dog",
-    "生蛋盖饭": "tamagokake gohan",
-    "稀饭": "rice porridge",
-    "米饭": "rice",
-    "粽子": "zongzi",
-    "罐头食品": "canned food",
-    "羊角面包": "croissant",
-    "肉丸意大利面": "spaghetti and meatballs",
-    "肉包": "meatbun",
-    "芝士火锅": "fondue",
-    "荞麦面": "soba",
-    "菠萝包": "melon bread",
-    "蛋包饭": "omurice",
-    "谷物早餐": "cereal",
-    "面包": "bread",
-    "面包包子": "bread bun",
-    "面条": "noodles",
-    "饭团": "onigiri",
-    "饺子": "jiaozi",
-    "馒头": "manjuu",
-    "黑色意大利面": "black spaghetti"
-  },
-  "餐具": {
-    "勺子": "spoon",
-    "午餐盒": "lunchbox",
-    "叉子": "fork",
-    "小碟": "saucer",
-    "托盘": "tray",
-    "日式茶碗": "yunomi",
-    "普通玻璃杯": "tumbler",
-    "杯": "cup",
-    "水杯": "drinking glass",
-    "盘子": "plate",
-    "碗": "bowl",
-    "筷子": "chopsticks",
-    "茶壶": "teapot",
-    "茶杯": "teacup",
-    "酒葫芦": "wine gourd",
-    "长柄勺": "ladle",
-    "马克杯": "mug"
-  },
-  "鱼和海鲜": {
-    "一片橙子": "orange slice",
-    "南瓜": "squash",
-    "卷心菜": "cabbage",
-    "哈密瓜": "canteloupe",
-    "哈瓦那辣椒": "habanero pepper",
-    "土豆": "potato",
-    "圣女果": "cherry tomato",
-    "墨西哥辣椒": "jalapeno pepper",
-    "大葱": "spring onion",
-    "大蒜": "garlic",
-    "天妇罗": "tempura",
-    "奶酪": "cheese",
-    "小吃和小菜": "snack and side dish",
-    "小葡萄干": "currant",
-    "巧克力橙片": "orangette",
-    "巧克力香蕉": "chocolate banana",
-    "扁桃": "almond",
-    "李子": "plum",
-    "板栗": "chestnut",
-    "果盘": "fruit bowl",
-    "柠檬": "lemon",
-    "柠檬片": "lemon slice",
-    "树莓": "raspberry",
-    "桃": "peach",
-    "梅干": "umeboshi",
-    "梨": "pear",
-    "椒盐卷饼": "pretzel",
-    "椰子": "coconut",
-    "樱桃": "cherry",
-    "橘子": "mandarin orange",
-    "橡子": "acorn",
-    "欧芹": "parsley",
-    "水果": "fruit",
-    "水果和坚果": "fruit and nuts",
-    "水果杯": "fruit cup",
-    "沙拉": "salad",
-    "油条": "churro",
-    "泡菜": "pickle",
-    "洋葱": "onion",
-    "洋葱圈": "onion rings",
-    "浆果": "berry",
-    "灯笼椒": "bell pepper",
-    "炙烤鲣鱼片": "katsuo no tataki",
-    "炸丸": "croquette",
-    "炸薯条": "french fries",
-    "烟熏奶酪": "smoked cheese",
-    "烧麦": "shumai",
-    "牛油果": "avocado",
-    "猕猴桃": "kiwi",
-    "猕猴桃切片": "kiwi slice",
-    "玉米": "corn",
-    "瑞士奶酪": "swiss cheese",
-    "瓜": "melon",
-    "生菜": "lettuce",
-    "生鱼片": "sashimi",
-    "番木瓜": "papaya",
-    "番茄": "tomato",
-    "白菜": "bok choy",
-    "石榴": "pomegranate",
-    "章鱼烧": "takoyaki",
-    "红桑子莓": "framboise",
-    "红椒": "red pepper",
-    "红毛丹": "rambutan",
-    "红苹果": "red apple",
-    "红薯": "sweet potato",
-    "胡椒": "pepper",
-    "胡萝卜": "carrot",
-    "芒果": "mango",
-    "芜菁": "turnip",
-    "芦笋": "asparagus",
-    "花生": "peanut",
-    "苹果": "apple",
-    "茄子": "eggplant",
-    "草莓": "strawberry",
-    "荔枝": "lychee",
-    "菜花": "cauliflower",
-    "菠萝": "pineapple",
-    "萝卜": "radish",
-    "葡萄": "grapes",
-    "蓝莓": "blueberry",
-    "蔬菜": "vegetable",
-    "蔬菜和豆类": "vegetables and legumes",
-    "虾天妇罗": "shrimp tempura",
-    "蜜瓜": "honeydew",
-    "西兰花": "broccoli",
-    "西柚": "grapefruit",
-    "西瓜": "watermelon",
-    "豆子": "beans",
-    "豆腐": "tofu",
-    "辣椒": "chili pepper",
-    "青柠片": "lime slice",
-    "青椒": "green pepper",
-    "青苹果": "green apple",
-    "香蕉": "banana",
-    "香蕉片": "banana slice",
-    "香蕉皮": "banana peel",
-    "鱼和薯条": "fish and chips",
-    "鱼糕": "kamaboko",
-    "麻婆豆腐": "mapo tofu",
-    "黄椒": "yellow pepper",
-    "黄瓜": "cucumber",
-    "黄金梨": "nashi pear",
-    "黑莓": "blackberry"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Action.json b/src/novelai_python/utils/prompt_factory/cell/raw/Action.json
deleted file mode 100644
index 1f4b10a..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Action.json
+++ /dev/null
@@ -1,446 +0,0 @@
-{
-  "互动": {
-    "凑CP": "relationshipping",
-    "分享食物": "shared food",
-    "打招呼": "beckoning",
-    "挠痒": "tickling",
-    "说话": "talking",
-    "调情": "flirt",
-    "责备": "scolding",
-    "霸凌": "bullying"
-  },
-  "体育运动": {
-    "体操": "gymnastics",
-    "保龄球": "bowling",
-    "冲浪": "surfing",
-    "无装备潜水": "freediving",
-    "游泳": "swimming",
-    "滑冰": "skating",
-    "滑雪": "skiing",
-    "潜水": "diving",
-    "瑜伽": "yoga",
-    "绳索垂降": "rappelling",
-    "芭蕾": "ballet",
-    "花样滑冰": "figure skating"
-  },
-  "倒立": {
-    "头倒立": "headstand",
-    "手倒立": "handstand",
-    "颠倒的": "upside-down"
-  },
-  "倾靠": {
-    "身体倾斜": "leaning",
-    "身体前倾": "leaning forward",
-    "身体后倾": "leaning back",
-    "靠在一边": "leaning to the side",
-    "靠在物体上": "leaning on object"
-  },
-  "其他1": {
-    "哺乳": "breastfeeding",
-    "园艺": "gardening",
-    "挂十字架": "crucifixion",
-    "杂耍": "juggling",
-    "火中燃烧": "burn oneself in flames",
-    "焊接": "welding",
-    "祈祷": "praying",
-    "要求自我介绍": "ohikaenasutte",
-    "钢管舞": "pole dancing"
-  },
-  "其他互动": {
-    "伸手触及": "reaching",
-    "带着": "carrying",
-    "打结": "tying",
-    "扶眼镜": "adjusting eyewear",
-    "投掷": "pitching",
-    "抱着枕头": "pillow hug",
-    "抱着某物": "object hug",
-    "抱自己腿": "hugging own legs",
-    "拿着长枪": "polearm",
-    "捏着肚子": "belly grab",
-    "揉眼睛": "rubbing eyes",
-    "搅拌": "whisking",
-    "遮住耳朵": "covering ears"
-  },
-  "其他姿势": {
-    "二指敬礼": "two-finger salute",
-    "力量拳头": "power fist",
-    "展示内裤": "presenting panties",
-    "展示腋下": "presenting armpit",
-    "托胸": "breast hold",
-    "托腮": "chin rest",
-    "托颊": "head rest",
-    "抱着我手势": "carry me",
-    "拿着": "holding",
-    "挥手": "waving",
-    "敬礼": "salute",
-    "瓦肯举手礼": "vulcan salute",
-    "皮影戏": "shadow puppet",
-    "耸肩": "shrugging",
-    "遮着裆部": "covering crotch"
-  },
-  "双人姿势": {
-    "(三人)三人用手比心": "heart hands trio",
-    "(不限定双人)击掌": "high five",
-    "(不限定双人)手指隔着衣物摸": "fingering through clothes",
-    "(不限定双人)摸头": "headpat",
-    "(不限定双人)碰拳": "fist bump",
-    "(双人)两人一起比心": "heart hands duo",
-    "(双人)勾指起誓": "pinky swear",
-    "(双人)双手搂着脖子": "arms around neck",
-    "(双人)双手放在对方胸前": "hands on another's breast",
-    "(双人)双手放对方脸上": "hands on another's face",
-    "(双人)双拳挤头": "noogie",
-    "(双人)手在对方胸前": "hand on another's chest",
-    "(双人)手托着对方的下巴": "hand on another's chin",
-    "(双人)手指相扣": "interlocked fingers",
-    "(双人)手接触对方的": "hand on another's",
-    "(双人)手搂着脖子": "arm around neck",
-    "(双人)手摸着对方的脸颊": "hand on another's cheek",
-    "(双人)手放在对方头上": "hand on another's head",
-    "(双人)手放对方手上": "hand on another's hand",
-    "(双人)手放对方肚子上": "hand on another's stomach",
-    "(双人)手放对方肩上": "hand on another's shoulder",
-    "(双人)手放对方脖子": "hand on another's neck",
-    "(双人)手触碰对方的脸": "hand on another's face",
-    "(双人)扳手腕": "arm wrestling",
-    "(双人)抓住手臂": "arm grab",
-    "(双人)抓起对方头发": "grabbing another's hair",
-    "(双人)挽手": "arm hug",
-    "(双人)牵手": "holding hands",
-    "(双人)被对方掀起衣物": "lifted by another",
-    "(双人)轻抚脸颊": "stroking on chin"
-  },
-  "坐姿": {
-    "二郎腿": "figure four sitting",
-    "印度盘腿": "indian style",
-    "坐": "sitting",
-    "坐在地上": "sitting on the ground",
-    "姐坐": "yokozuwari",
-    "正坐": "seiza",
-    "莲花坐": "lotus position",
-    "跨坐": "straddling",
-    "跨坐大腿": "thigh straddling",
-    "靠在靠背上斜着坐": "reclining",
-    "鸭子坐": "wariza"
-  },
-  "头发互动": {
-    "卷头发": "hair twirling",
-    "扎辫子": "bunching hair",
-    "拉头发": "hair pull",
-    "拨头发": "hair flip",
-    "撩头发": "hair tucking",
-    "札头发": "tying hair",
-    "梳头": "hairdressing"
-  },
-  "头部姿势": {
-    "低头": "head down",
-    "头后仰": "head back",
-    "歪头": "head tilt",
-    "脸贴地面": "faceplant"
-  },
-  "娱乐": {
-    "打游戏": "playing game"
-  },
-  "室内日常": {
-    "休憩": "resting",
-    "化妆": "applying makeup",
-    "吃东西": "eating",
-    "喂饭": "feeding",
-    "就餐": "dining",
-    "弄干头发": "drying hair",
-    "打电话": "talking on phone",
-    "梦话": "sleep talking",
-    "洗涤": "washing",
-    "烹饪": "cooking",
-    "看电视": "watching television",
-    "睡觉": "sleeping",
-    "购物": "shopping"
-  },
-  "战斗": {
-    "勾拳": "uppercut",
-    "双持武器": "dual wielding",
-    "开火": "firing",
-    "战斗": "battle",
-    "投掷": "throwing",
-    "拳击": "punching",
-    "拳击运动": "boxing",
-    "斩": "slashing",
-    "狙击": "aiming at viewer",
-    "瞄准": "aiming",
-    "绞杀": "strangling",
-    "脚踢": "kicking",
-    "训练": "training",
-    "跆拳道": "taekwondo",
-    "飞踢": "flying kick"
-  },
-  "户外": {
-    "日光浴": "sunbathing",
-    "烧烤": "grilling",
-    "荡秋千": "swinging",
-    "赏花": "hanami",
-    "远足": "hiking",
-    "遛狗": "dog walking",
-    "钓鱼": "fishing",
-    "闻花": "smelling flower",
-    "露营": "camping"
-  },
-  "手位置": {
-    "单手叉腰": "hand on hip",
-    "双手叉腰": "hands on hips",
-    "双手插兜": "hands in pockets",
-    "双手放脚": "hands on feet",
-    "双手放脸": "hands on own face",
-    "双手放膝盖": "hands on own knees",
-    "双手放臀部": "hands on ass",
-    "手在内裤里": "hand in panties",
-    "手在大腿间": "hand between legs",
-    "手在头发里": "hand in hair",
-    "手插兜": "hand in pocket",
-    "手放下颚": "hand on own chin",
-    "手放前额": "hand on own forehead",
-    "手放嘴上": "hand to own mouth",
-    "手放帽子上": "hand on headwear",
-    "手放耳朵": "hand on ear",
-    "手放肚子": "hand on own stomach",
-    "手放肩上": "hand on own shoulder",
-    "手放胸部": "hand on own chest",
-    "手放脖子": "hand on own neck",
-    "手放脸上": "hand on own face",
-    "手放脸颊": "hand on own cheek",
-    "手放膝盖": "hand on own knee",
-    "手放臀部": "hand on own ass",
-    "手放自己头上": "hand on own head"
-  },
-  "手指姿势": {
-    "V手势": "peace hand",
-    "v在嘴上": "v over mouth",
-    "举起拳头": "raised fist",
-    "九字印": "kuji-in",
-    "伸小拇指": "pinky out",
-    "兰花指": "orchid fingers",
-    "双手比心": "heart hands",
-    "双手相合": "own hands together",
-    "双手相扣": "own hands clasped",
-    "嘘手势": "shushing",
-    "张开双手": "open hands",
-    "张开手": "open hand",
-    "手杯": "cupping hands",
-    "指尖抵指间": "steepled fingers",
-    "指枪": "finger gun",
-    "握拳": "fist",
-    "攥拳": "clenched hands",
-    "比中指": "middle finger",
-    "爪子": "paw pose",
-    "爽手势": "shocker",
-    "狐狸手势": "fox shadow puppet",
-    "猫爪": "cat pose",
-    "用手指比数字": "finger counting",
-    "紧张手势": "fidgeting",
-    "翘大拇指": "thumbs up",
-    "胜利手势": "victory pose",
-    "舔手指": "finger to mouth",
-    "虎爪": "claw pose",
-    "食指抬起": "index finger raised"
-  },
-  "手臂姿势": {
-    "交叉双臂": "crossed arms",
-    "伸出单臂": "outstretched arm",
-    "伸出手": "outstretched hand",
-    "伸直双臂": "outstretched arms",
-    "单抬臂": "arm up",
-    "双手垂放": "arms at sides",
-    "双手托胸": "arms under breasts",
-    "双抬臂": "arms up",
-    "张手": "spread arms",
-    "手交叉于胸前": "arms crossed",
-    "手臂后拉": "arm held back",
-    "手臂在头后": "arms behind head",
-    "手臂在背后": "arms behind back",
-    "手臂摆出心姿势": "heart arms",
-    "托胸": "arm under breasts",
-    "用手支撑住": "arm support",
-    "遮住关键部位的手臂": "convenient arm"
-  },
-  "指向": {
-    "指向": "pointing",
-    "指向上": "pointing up",
-    "指向下": "pointing down",
-    "指向前": "pointing forward",
-    "指向观众": "pointing at viewer"
-  },
-  "数码": {
-    "拿着电话": "holding phone"
-  },
-  "文具": {
-    "打开书": "open book",
-    "拿着书": "holding book",
-    "拿着笔": "holding pen",
-    "拿着铅笔": "holding pencil"
-  },
-  "日用": {
-    "抓着床单": "sheet grab",
-    "拿着伞": "holding umbrella",
-    "拿着托盘": "holding tray",
-    "拿着注射器": "holding syringe",
-    "拿着眼镜": "holding eyewear",
-    "拿着礼物": "holding gift",
-    "挤压瓶子": "squeeze bottle",
-    "提着包": "holding bag",
-    "提着灯笼": "holding lantern",
-    "提着篮子": "holding basket"
-  },
-  "桌案": {
-    "写字": "writing",
-    "学习": "studying",
-    "打字": "typing",
-    "阅读": "reading"
-  },
-  "植物": {
-    "叶子在头上": "leaf on head",
-    "拿着树叶": "holding leaf",
-    "拿着花": "holding flower",
-    "拿着花束": "holding bouquet"
-  },
-  "武器": {
-    "拿着武器": "holding weapon",
-    "拿着箭": "holding arrow",
-    "拿着鞭子": "holding whip"
-  },
-  "沐浴": {
-    "洗澡": "bathing",
-    "淋浴": "showering"
-  },
-  "活动": {
-    "下午茶会": "afternoon tea party",
-    "化妆舞会": "masquerade",
-    "毕业式": "graduation",
-    "派对": "party",
-    "生日聚会": "birthday party",
-    "结婚": "wedding",
-    "茶会": "tea party",
-    "音乐会": "concert"
-  },
-  "玩具": {
-    "抱着玩偶": "doll hug",
-    "拿着水枪": "holding water gun"
-  },
-  "移动": {
-    "划船": "rowing",
-    "奔跑": "running",
-    "竞速": "racing",
-    "走路": "walking",
-    "跳跃": "jumping",
-    "迈步": "stepping",
-    "驾驶": "driving",
-    "骑": "riding",
-    "骑马": "horseback riding"
-  },
-  "穿脱衣": {
-    "拉下内裤": "panty pull",
-    "拉下连衣裤": "leotard pull",
-    "拉开口罩": "mask pull",
-    "拉开和服": "kimono pull",
-    "拉开比基尼": "bikini pull",
-    "拉开泳衣": "swimsuit pull",
-    "拉开胸罩": "bra pull",
-    "拉开衣服": "clothes pull",
-    "拉开裙子": "skirt pull",
-    "脱衣服中": "undressing",
-    "自己拉开": "pulled by self",
-    "解拉链": "unzipping"
-  },
-  "站姿": {
-    "S型曲线站立": "contrapposto",
-    "单脚站立": "standing on one leg",
-    "屈膝礼": "curtsy",
-    "弯腰": "bent over",
-    "站立": "standing"
-  },
-  "胸部姿势": {
-    "两侧挤胸": "breast squeeze",
-    "托胸": "breast lift",
-    "挤压胸部": "breast suppress",
-    "胸压玻璃": "breasts on glass"
-  },
-  "腿部姿势": {
-    "M字腿": "m legs",
-    "二郎腿": "crossed legs",
-    "交叉脚踝": "crossed ankles",
-    "双脚过头": "legs over head",
-    "双腿分开": "legs apart",
-    "双膝向上": "knees up",
-    "双膝并拢脚分开": "knees together feet apart",
-    "展示脚部": "presenting foot",
-    "张开腿": "spread legs",
-    "抬一只脚": "leg lift",
-    "抬双腿": "legs up",
-    "抬腿": "leg up",
-    "挡住关键部位的腿": "convenient leg",
-    "脚悬空": "feet up",
-    "腿部伸展": "outstretched leg",
-    "膝盖顶胸": "knees to chest"
-  },
-  "艺术": {
-    "拍摄": "filming",
-    "拍照": "taking picture",
-    "绘画": "painting",
-    "编织": "knitting"
-  },
-  "衣服互动": {
-    "抓着领带": "necktie grab",
-    "拉下连衣裙下摆": "dress tug",
-    "拉着吊带": "holding strap",
-    "拉起和服": "kimono lift",
-    "拉起自己衣服": "lifted by self",
-    "拉起衣服": "clothes lift",
-    "拉起连衣裙": "dress lift",
-    "拨内裤": "adjusting panties",
-    "捏着帽檐": "hat tip",
-    "提裙": "skirt hold",
-    "整理裤袜": "adjusting legwear",
-    "胸罩拉到胸上方": "bra lift"
-  },
-  "趴姿": {
-    "趴着": "crawling",
-    "趴着翘臀": "top-down bottom-up"
-  },
-  "跪姿": {
-    "单膝跪": "one knee",
-    "跪": "on knees"
-  },
-  "躺姿": {
-    "仰卧": "on back",
-    "侧卧": "lying on side",
-    "躺下": "lying down",
-    "躺着": "lying"
-  },
-  "造型": {
-    "三点着地": "superhero landing",
-    "僵尸姿势": "zombie pose",
-    "兔耳姿势": "bunny pose",
-    "凹造型": "posing",
-    "叉腰向上指": "saturday night fever",
-    "战斗姿势": "fighting stance",
-    "抬高手臂上指": "kamina pose",
-    "拔刀起手式": "battoujutsu stance",
-    "焦糖舞": "caramelldansen",
-    "蝎子姿势": "scorpion pose",
-    "那个姿势": "the pose"
-  },
-  "音乐": {
-    "唱歌": "singing",
-    "录音": "recording",
-    "演奏乐器": "playing instrument",
-    "跳舞": "dancing"
-  },
-  "食物": {
-    "拿着披萨": "holding pizza",
-    "拿着水果": "holding fruit",
-    "拿着糖果": "holding candy",
-    "拿着蔬菜": "holding vegetable",
-    "胸上巧克力": "chocolate on breasts"
-  },
-  "魔幻": {
-    "骑扫帚": "broom riding"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Art_Style.json b/src/novelai_python/utils/prompt_factory/cell/raw/Art_Style.json
deleted file mode 100644
index d64bf77..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Art_Style.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "传统材质": {
-    "丙烯漆料画": "acrylic paint",
-    "书法毛笔": "calligraphy brush",
-    "传统纸画": "traditional media",
-    "墨绘": "sumi-e",
-    "彩铅绘": "watercolor pencil",
-    "水墨": "ink and wash painting",
-    "水彩": "watercolor",
-    "水粉": "guache",
-    "油画": "oil painting",
-    "涂鸦": "child drawing",
-    "炭笔画": "graphite",
-    "签绘风格": "faux traditional media",
-    "粉彩": "pastel colors",
-    "粉色蜡笔": "pastel",
-    "素描": "sketch",
-    "线条画": "lineart",
-    "绘画风格": "drawing",
-    "蘸水笔画风": "fountain pen",
-    "蛋彩画": "tempera",
-    "铅笔画": "pencil sketch lines",
-    "马克笔": "copics"
-  },
-  "作品": {
-    "cygames": "cygames",
-    "p5风格": "persona 5",
-    "偶像大师": "idolmaster",
-    "原神": "genshin impact",
-    "命运石之门": "steins;gate",
-    "塞尔达": "the legend of zelda",
-    "影之诗": "shadowverse",
-    "炼金工房系列": "atelier",
-    "碧蓝幻想风": "granblue fantasy",
-    "碧蓝档案": "blue archive",
-    "碧蓝航线": "azur lane",
-    "紫罗兰的永恒花园": "violet evergarden"
-  },
-  "其他风格": {
-    "8位机风格": "8bit",
-    "OC渲染图": "octane render",
-    "体素图": "voxel art",
-    "像素画": "pixel art",
-    "写实": "realistic",
-    "厚涂": "lmpasto",
-    "复古设计": "vintage",
-    "复古风": "retro",
-    "平涂风格": "flat color",
-    "平面着色": "flat shading",
-    "怀旧": "nostalgic",
-    "扳机风": "promare",
-    "旧时尚": "old-fashioned",
-    "梦幻的": "dreamy",
-    "照片写实": "photo realistic",
-    "网点": "screentones",
-    "草图素描": "roughsketch",
-    "赛璐璐动画": "retro artstyle //老动画"
-  },
-  "年代风": {
-    "1980年代": "1980s",
-    "1990年代": "90's"
-  },
-  "流派": {
-    "印象派": "impressionism",
-    "哥特式": "gothic",
-    "文艺复兴": "renaissance",
-    "新艺术": "art nouveau",
-    "洛可可": "rococo",
-    "浮世绘": "ukiyo-e style"
-  },
-  "艺术家": {
-    "穆夏风格": "mucha style",
-    "莫奈": "claude monet",
-    "透纳": "william turner"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Background.json b/src/novelai_python/utils/prompt_factory/cell/raw/Background.json
deleted file mode 100644
index 1b4bc5a..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Background.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
-  "乐器": {
-    "钢琴": "piano"
-  },
-  "图案背景": {
-    "抽象背景": "abstract background",
-    "方格背景": "checkered background",
-    "旭日纹背景": "sunburst background",
-    "条纹背景": "striped background",
-    "格子呢背景": "plaid background",
-    "网点图背景": "halftone background",
-    "菱形背景": "argyle background",
-    "蜂窝背景": "honeycomb background"
-  },
-  "实物背景": {
-    "放大前景作为背景": "zoom layer",
-    "散景": "bokeh",
-    "星光背景": "sparkle background",
-    "星空背景": "starry background",
-    "树叶背景": "leaf background",
-    "气泡背景": "bubble background",
-    "照片背景": "photo background",
-    "花背景": "floral background"
-  },
-  "室外设施": {
-    "栅栏": "fence",
-    "栏杆": "railing",
-    "电子公告板": "electric scoreboard",
-    "电线杆": "power lines",
-    "电话亭": "phone booth",
-    "秋千": "swing",
-    "自动贩卖机": "vending machine",
-    "路灯": "lamppost",
-    "跳马": "vaulting horse",
-    "铁丝网": "chain-link fence",
-    "锚": "anchor",
-    "长椅": "bench",
-    "霓虹灯标志": "neon signs"
-  },
-  "家具": {
-    "书架": "bookshelf",
-    "书柜": "bookcase",
-    "书桌": "desk",
-    "储物柜": "locker",
-    "入口": "inlet",
-    "办公椅": "office chair",
-    "台球桌": "billiard",
-    "吊床": "hammock",
-    "坐垫": "cushion",
-    "壁橱": "closet",
-    "壁炉": "fireplace",
-    "大门": "gate",
-    "天蓬床": "canopy bed",
-    "床": "bed",
-    "床单": "bed sheet",
-    "床垫": "mattress",
-    "彩色玻璃": "stained glass",
-    "扶手椅": "armchair",
-    "折叠椅": "folding chair",
-    "日本床垫": "futon",
-    "晾衣架": "clothes rack",
-    "桌子": "table",
-    "椅子": "chair",
-    "沙发": "sofa",
-    "沙滩椅": "beach chair",
-    "浴缸": "bathtub",
-    "淋浴喷头": "shower head",
-    "混合控制台": "mixing console",
-    "窗帘": "curtains",
-    "窗户": "window",
-    "衣柜": "wardrobe",
-    "被炉": "kotatsu",
-    "课桌": "school desk",
-    "躺椅": "lounge chair",
-    "轮椅": "wheelchair",
-    "门": "door"
-  },
-  "工具": {
-    "扫帚": "broom"
-  },
-  "幻想系": {
-    "万圣节南瓜": "halloween pumpkin",
-    "坟墓": "grave",
-    "墓石": "tombstone",
-    "头骨": "skull",
-    "杰克南瓜灯": "jack-o'-lantern",
-    "棺": "coffin",
-    "灵体": "spirit",
-    "骨架": "skeleton",
-    "魔法阵": "magic circle"
-  },
-  "摆设": {
-    "堆叠物": "stacking",
-    "巨大的钟": "huge clocks",
-    "心形细绳": "heart of string",
-    "挂旗装饰": "string of flags",
-    "棋盘": "chessboard",
-    "气球": "balloon",
-    "火炬": "torch",
-    "灯笼": "lantern",
-    "玻璃条": "glass strips",
-    "石头灯笼": "stone lantern",
-    "纸灯笼": "paper lantern",
-    "细绳": "string",
-    "花瓶": "vase",
-    "蜡烛": "candle",
-    "钟": "clocks",
-    "风铃": "wind chime"
-  },
-  "电器": {
-    "冰箱": "refrigerator",
-    "机械": "machine",
-    "洗衣机": "washing machine",
-    "电脑": "computer",
-    "电视": "television",
-    "空调": "air conditioner"
-  },
-  "简单色背景": {
-    "多彩背景": "multicolored background",
-    "彩虹背景": "rainbow background",
-    "渐变背景": "gradient background",
-    "简单背景": "simple background",
-    "背景色": "color:background"
-  },
-  "自然物": {
-    "大石头": "huge stone",
-    "岩石": "rock",
-    "巨大石头物体": "monolith",
-    "旋涡": "swirl",
-    "水可见底": "shallow water",
-    "水面": "water",
-    "沙": "sand",
-    "波浪": "waves",
-    "石头": "stone",
-    "碎石": "gravel",
-    "美丽精细的水面": "beautiful detailed water"
-  },
-  "装修": {
-    "地板": "floor",
-    "地毯": "carpet",
-    "墙": "wall",
-    "天花板": "ceiling",
-    "木质地板": "wooden floor",
-    "涂鸦": "graffiti",
-    "瓷砖": "tiles",
-    "瓷砖地面": "tile floor",
-    "瓷砖墙": "tile wall",
-    "砖地面": "brick floor",
-    "砖墙": "brick wall"
-  },
-  "载具": {
-    "摩托车": "motorcycle",
-    "水上工具": "watercraft",
-    "热气球": "hot air balloon",
-    "船": "boat",
-    "飞机": "airplane",
-    "飞行器": "aircraft"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Body.json b/src/novelai_python/utils/prompt_factory/cell/raw/Body.json
deleted file mode 100644
index 5249b41..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Body.json
+++ /dev/null
@@ -1,273 +0,0 @@
-{
-  "侧发": {
-    "侧发后梳": "half updo",
-    "公主卷": "drill hair",
-    "单侧进气口": "single hair intake",
-    "单钻头卷": "side drill",
-    "双钻头卷": "twin drills",
-    "四钻头卷": "quad drills",
-    "垂下的长卷发": "ringlets",
-    "耳前侧发": "sidelocks",
-    "耳后发": "hair behind ear",
-    "进气口(侧发顶部竖起)": "hair intakes"
-  },
-  "其他": {
-    "下垂胸部": "hanging breasts",
-    "中等胸部(C)": "medium breasts",
-    "丰满": "plump // 这个词效果非常猛",
-    "丰满胸部": "perky breasts",
-    "包不住的巨乳": "bursting breasts",
-    "大胸部(D)": "large breasts",
-    "宽胯": "wide hips",
-    "小胸部(B)": "small breasts",
-    "小臀": "flat ass",
-    "尖乳": "pointy breasts",
-    "巨乳(E)": "huge breasts",
-    "怀孕": "pregnant",
-    "有立体感的胸部": "framed breasts",
-    "机械关节": "robot joints",
-    "机械臂": "mechanical arm",
-    "窄腰": "narrow waist",
-    "细腰": "slender waist",
-    "细腿": "slim legs",
-    "肉腿": "thick thigh",
-    "肌肉": "muscle",
-    "肌肉发达": "muscular",
-    "肌肉女": "muscular female",
-    "胖": "fat",
-    "苗条": "skinny",
-    "贫乳(A)": "flat chest",
-    "身体曲线": "curvy",
-    "长脖子": "long neck",
-    "魔乳(F)": "gigantic breasts"
-  },
-  "其他装饰": {
-    "呆毛": "ahoge",
-    "多呆毛(天线)": "antenna hair",
-    "大呆毛": "huge ahoge",
-    "心形呆毛": "heart ahoge",
-    "特殊形状": "special shape",
-    "蝴蝶结状头发": "bow-shaped hair"
-  },
-  "兽耳": {
-    "兔耳": "bunny ears",
-    "兽耳": "kemonomimi mode",
-    "兽耳绒毛": "animal ear fluff",
-    "山羊耳": "goat ears",
-    "松鼠耳": "squirrel ears",
-    "浣熊耳": "raccoon ears",
-    "熊猫耳": "panda ears",
-    "熊耳": "bear ears",
-    "牛耳": "cow ears",
-    "狐耳": "fox ears",
-    "狗耳": "dog ears",
-    "狮耳": "lion ears",
-    "狼耳": "wolf ears",
-    "猪耳": "pig ears",
-    "猫耳": "cat ears",
-    "猴耳": "monkey ears",
-    "羊耳": "sheep ears",
-    "羊驼耳": "alpaca ears",
-    "老鼠耳": "mouse ears",
-    "虎耳": "tiger ears",
-    "蝙蝠耳": "bat ears",
-    "马耳": "horse ears",
-    "鹿耳": "deer ears",
-    "鼬耳": "ferret ears"
-  },
-  "刘海": {
-    "不对称刘海": "asymmetrical bangs",
-    "交错刘海": "crossed bangs",
-    "分刘海": "parted bangs",
-    "刘海": "bangs",
-    "半遮眼": "jitome",
-    "单侧齐刘海": "side blunt bangs",
-    "大背头": "hair slicked back",
-    "扫刘海": "swept bangs",
-    "掀起的刘海": "bangs pinned back",
-    "斜刘海": "diagonal bangs",
-    "朝一个方向的刘海": "side swept bangs",
-    "眼间发": "hair between eyes",
-    "遮单眼刘海": "hair over one eye",
-    "遮眼刘海": "hair over eyes",
-    "长刘海": "long bangs",
-    "齐刘海": "blunt bangs"
-  },
-  "发质": {
-    "刺发": "spiked hair",
-    "卷发": "curly hair",
-    "外卷发": "flipped hair",
-    "波浪发(自然卷)": "wavy hair",
-    "直发": "straight hair"
-  },
-  "发量": {
-    "头发很多": "big hair",
-    "秃头": "bald",
-    "秃头女孩": "bald girl"
-  },
-  "发髻": {
-    "三发髻": "triple bun",
-    "丸子头": "topknot",
-    "侧发髻": "side bun",
-    "单发圈": "single hair ring",
-    "双发髻": "double bun",
-    "发髻/包子头": "hair bun",
-    "发髻辫": "braided bun",
-    "甜甜圈发髻": "doughnut hair bun",
-    "锥形发髻": "cone hair bun",
-    "飞仙髻": "hair rings"
-  },
-  "手": {
-    "手指美甲": "nail polish",
-    "指甲": "nails"
-  },
-  "整体发型": {
-    "公主切": "hime cut",
-    "寸头": "buzz cut",
-    "帽盔头": "undercut",
-    "平头": "crew cut",
-    "波波头": "bob cut",
-    "爆炸头": "afro",
-    "精灵头": "pixie cut",
-    "莫霍克发型": "mohawk",
-    "蓬帕杜发型": "pompadour",
-    "蘑菇头": "bowl cut",
-    "蜂窝头": "beehive hairdo",
-    "超大爆炸头": "huge afro",
-    "鲻鱼头": "mullet"
-  },
-  "特殊耳": {
-    "垂耳": "floppy ears",
-    "尖耳": "pointy ears",
-    "机械耳": "robot ears",
-    "皮卡丘耳": "pikachu ears",
-    "长尖耳": "long pointy ears"
-  },
-  "肩": {
-    "腋": "armpit",
-    "锁骨": "collarbone"
-  },
-  "胸": {
-    "上胸": "upperboob",
-    "下胸": "underboob",
-    "乳沟": "cleavage",
-    "侧乳": "sideboob",
-    "俯身下垂胸部": "sagging breasts",
-    "动态不一胸部": "unaligned breasts",
-    "后乳": "backboob",
-    "大胸肌": "large pectorals",
-    "摇晃的胸部": "bouncing breasts",
-    "摊开的胸部": "breasts apart",
-    "肋骨": "ribs",
-    "胸肌": "chest",
-    "胸部": "breasts",
-    "胸部展开": "breast expansion"
-  },
-  "腰部": {
-    "腰": "waist"
-  },
-  "腹部": {
-    "肚子": "belly",
-    "肚脐": "navel",
-    "腹肌": "abs",
-    "腹部": "stomach",
-    "马甲线": "linea alba"
-  },
-  "腿部": {
-    "大腿": "thighs",
-    "大腿内侧": "inner thigh",
-    "膝盖": "knee",
-    "膝盖内侧": "kneepits"
-  },
-  "臀部": {
-    "翘臀": "buttock",
-    "耻丘": "groin",
-    "股沟": "butt crack",
-    "胯部": "crotch",
-    "腹股沟": "thigh gap",
-    "臀部": "hips",
-    "髋骨": "hipbone"
-  },
-  "花纹": {
-    "心形纹身": "heart tattoo",
-    "泳装晒痕": "tan lines",
-    "流汗": "sweat",
-    "淫纹": "pubic tattoo",
-    "编号纹身": "number tattoo",
-    "腹部纹身": "stomach tattoo",
-    "腿部纹身": "leg tattoo",
-    "连衣裙晒痕": "dress tan lines"
-  },
-  "角": {
-    "山羊角": "goat horns",
-    "恶魔角": "demon horns",
-    "牛角": "cow horns",
-    "角": "color?:horns",
-    "鹿角": "antlers",
-    "龙角": "dragon horns"
-  },
-  "足部": {
-    "内翻足": "pigeon toed",
-    "脚尖": "toe-point",
-    "脚底": "feet soles",
-    "脚趾": "toes",
-    "脚趾美甲": "toenail polish",
-    "足": "feet"
-  },
-  "辫子": {
-    "三股辫": "tri braids",
-    "低双辫": "low twin braids",
-    "低辫长发": "low-braided long hair",
-    "冠型织辫": "crown braid",
-    "刘海辫": "braided bangs",
-    "前辫": "front braid",
-    "单侧辫": "side braid",
-    "单辫": "single braid",
-    "双侧辫": "side braids",
-    "双辫": "twin braids",
-    "四股辫": "quad braids",
-    "多辫": "multiple braids",
-    "法式辫": "french braid",
-    "脏辫": "dreadlocks",
-    "辫子": "braid",
-    "长辫": "long braid"
-  },
-  "长度": {
-    "中等长发": "medium hair",
-    "披肩发": "hair over shoulder",
-    "极长发": "absurdly long hair",
-    "短发": "short hair",
-    "超短发": "very short hair",
-    "超长发": "very long hair",
-    "长发": "long hair"
-  },
-  "颈背": {
-    "肩胛骨": "shoulder blades",
-    "颈": "nape"
-  },
-  "颜色": {
-    "内侧染色": "colored inner hair",
-    "发色": "color:hair",
-    "多彩头发": "multicolored hair",
-    "彩虹发": "rainbow hair",
-    "条纹头发(挑染)": "streaked hair //颜色+ 条纹头发",
-    "渐变发": "gradient hair",
-    "渐变色": "gradient colour",
-    "金发": "blonde hair"
-  },
-  "马尾": {
-    "不对称双马尾": "uneven twintails",
-    "低双马尾": "low twintails",
-    "低马尾": "low ponytail",
-    "侧马尾": "side ponytail",
-    "分开的单马尾": "split ponytail",
-    "双马尾": "twintails",
-    "折叠马尾": "folded ponytail",
-    "短双马尾": "short twintails",
-    "短马尾": "short ponytail",
-    "马尾": "ponytail",
-    "马尾辫": "braided ponytail",
-    "高双马尾": "hair two side up",
-    "高马尾": "hair one side up"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Character_Design.json b/src/novelai_python/utils/prompt_factory/cell/raw/Character_Design.json
deleted file mode 100644
index f5fbf03..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Character_Design.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
-  "人外": {
-    "九尾狐": "kyuubi",
-    "人外娘": "monster girl",
-    "人马": "centaur",
-    "史莱姆娘": "slime musume",
-    "奶牛娘": "cow girl",
-    "妖狐": "kitsune",
-    "娘化植物": "plant girl",
-    "浣熊娘": "raccoon girl",
-    "犬娘": "dog girl",
-    "狐娘": "fox girl",
-    "狼女": "wolf girl",
-    "猫娘": "cat girl",
-    "福瑞": "furry",
-    "美人鱼": "mermaid",
-    "蛇娘": "lamia",
-    "蜘蛛娘": "spider girl",
-    "青蛙娘": "frog girl",
-    "马娘": "horse girl",
-    "鼠娘": "mouse girl",
-    "龙娘": "dragon girl"
-  },
-  "人物关系": {
-    "兄弟姐妹": "siblings",
-    "双胞胎": "twins",
-    "后宫": "harem",
-    "夫妻": "husband and wife",
-    "姐弟/兄妹": "brother and sisiter",
-    "母女": "mother and daughter",
-    "母子": "mother and son",
-    "百合": "yuri",
-    "表亲": "cousins",
-    "身高差": "height difference"
-  },
-  "其他": {
-    "伪娘": "crossdressing"
-  },
-  "年龄": {
-    "儿童": "child",
-    "十几岁": "teenage",
-    "大叔": "bara",
-    "女童": "female child",
-    "小女孩": "petite",
-    "年轻": "young",
-    "幼童": "toddler",
-    "未成年": "underage",
-    "正太": "shota",
-    "熟女": "mature female",
-    "童颜巨乳": "oppai loli",
-    "美少女": "bishoujo",
-    "萝莉": "loli",
-    "青春期的": "adolescent"
-  },
-  "幻想系职业": {
-    "sm女王": "dominatrix",
-    "修女": "nun",
-    "公主": "princess",
-    "女巫": "witch",
-    "女武神": "valkyrie",
-    "女王": "queen",
-    "巫女": "miko",
-    "忍者": "ninja",
-    "性工作者": "prostitute",
-    "武士": "samurai",
-    "死灵术士": "necromancer",
-    "法老": "pharaoh",
-    "海盗": "pirate",
-    "牧师": "priest",
-    "神职人员": "cleric",
-    "美少女战士": "sailor senshi",
-    "角斗士": "gladiator",
-    "魔术师": "magician",
-    "魔法少女": "magical girl"
-  },
-  "性格": {
-    "严肃": "serious",
-    "冷酷": "cool",
-    "小辣妹": "kogal",
-    "清纯": "innocent",
-    "痴女": "female pervert",
-    "色气": "naughty",
-    "辣妹": "gyaru"
-  },
-  "机设": {
-    "半机械人": "cyborg",
-    "机器人": "robot girl",
-    "机娘": "gynoid",
-    "机甲": "mecha",
-    "机设": "mecha design",
-    "类人机器人": "humanoid robot",
-    "超级机器人大战风机设": "super robot wars original generation"
-  },
-  "现实系职业": {
-    "乘务员（火车）": "train attendants",
-    "体操队长": "gym leader",
-    "保镖": "bodyguard",
-    "偶像": "idol",
-    "兔女郎": "bunny girl",
-    "办公室女性": "office lady",
-    "化学家": "chemist",
-    "医生": "doctor",
-    "厨师": "chef",
-    "和风女仆": "wa maid",
-    "啦啦队": "cheerleading",
-    "啦啦队员": "cheerleader",
-    "女乘务员": "stewardess",
-    "女仆": "maid",
-    "女服务员": "waitress",
-    "女警": "policewoman",
-    "建筑工人": "construction worker",
-    "护士": "nurse",
-    "收银员": "cashier",
-    "服务员": "waiter",
-    "机修工": "mechanic",
-    "歌手": "singer",
-    "水手": "sailor",
-    "牧羊人": "shepherd",
-    "猎人": "hunter",
-    "空姐": "flight attendants",
-    "管家": "butler",
-    "老师": "teacher",
-    "自行车运动员": "cyclist",
-    "舞者": "dancer",
-    "艺术体操运动员": "rhythmic gymastics",
-    "芭蕾舞者": "ballerina",
-    "荷官": "croupier",
-    "警察": "police",
-    "赛车女郎": "race queen",
-    "酒保": "bartender",
-    "飞行员": "pilot",
-    "黑客": "hacker"
-  },
-  "皮肤": {
-    "如白色大理石般光泽的皮肤": "white marble glowing skin",
-    "带颜色皮肤": "colored skin",
-    "有光泽皮肤": "shiny skin",
-    "深色皮肤": "deep skin",
-    "白皙皮肤": "white skin",
-    "皮肤色": "color:skin",
-    "苍白皮肤": "pale skin",
-    "褐色皮肤": "brown skin",
-    "黑皮": "black skin"
-  },
-  "组成": {
-    "1个女孩": "1girl",
-    "1个女孩单人": "1girl solo",
-    "1个男孩": "1boy",
-    "2个女孩": "2girls",
-    "2个男孩": "2boys",
-    "3个女孩": "3girls",
-    "3个男孩": "3boys",
-    "4个女孩": "4girls",
-    "4个男孩": "4boys",
-    "5个女孩": "5girls",
-    "5个男孩": "5boys",
-    "6个以上女孩": "6+girls",
-    "6个以上男孩": "6+boys",
-    "人群": "crowd",
-    "单人": "solo",
-    "多个女孩": "multiple girls",
-    "多个男孩": "multiple boys",
-    "女性": "female",
-    "男性": "male"
-  },
-  "非人": {
-    "人偶": "doll",
-    "人狼": "werewolf",
-    "僵尸": "jiangshi",
-    "兽人": "orc",
-    "吸血鬼": "vampire",
-    "哥布林": "goblin",
-    "天使": "angel",
-    "女巨人": "giantess",
-    "女神": "goddess",
-    "小恶魔": "imp",
-    "小精灵": "fairy",
-    "巨人": "giant",
-    "怪物": "monster",
-    "恶魔": "devil",
-    "恶魔女孩": "demon girl",
-    "拉拉肥": "lalafell",
-    "暗精灵": "dark elf",
-    "木乃伊": "mummy",
-    "精灵": "elf",
-    "西式僵尸": "zombie",
-    "迷你女孩": "minigirl",
-    "鬼魂": "ghost",
-    "魅魔": "succubus"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Clothing.json b/src/novelai_python/utils/prompt_factory/cell/raw/Clothing.json
deleted file mode 100644
index 1c62eed..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Clothing.json
+++ /dev/null
@@ -1,514 +0,0 @@
-{
-  "上衣": {
-    "不穿上衣": "topless",
-    "乳晕微露": "areala slip",
-    "吊带和身体有空隙": "strap gap",
-    "敞开衬衫": "open shirt",
-    "肩带滑下": "strap slip",
-    "胸部走光": "breast slip",
-    "袖子往上拉起": "sleeves pushed up",
-    "解开纽扣的衬衫": "unbuttoned shirt",
-    "解开胸罩": "open bra"
-  },
-  "下装": {
-    "不穿下装": "bottomless",
-    "不穿内裤": "no panties",
-    "脱下裙子": "dress removed"
-  },
-  "中古系": {
-    "全装甲": "full armor",
-    "前额护具": "forehead protector",
-    "圣殿骑士团": "knights templar",
-    "带翅膀的头盔": "winged helmet",
-    "战袍": "tabard",
-    "护肘": "elbow pads",
-    "护胫": "greaves",
-    "护臂铠甲": "vambraces",
-    "无袖铠甲罩衣 阵羽织": "surcoat",
-    "日本铠甲": "samurai armor",
-    "肩甲": "pauldrons",
-    "胸甲": "breastplate",
-    "腹甲": "faulds",
-    "金属手套": "gauntlets",
-    "铠甲": "color?:armor",
-    "铠装连衣裙": "armored dress",
-    "骑士铠甲": "knight armor"
-  },
-  "仪式": {
-    "丧服": "funeral dress",
-    "婚纱": "wedding dress"
-  },
-  "兜帽": {
-    "兔耳兜帽": "bunny hood",
-    "兜帽": "hood",
-    "兽耳兜帽": "animal hood",
-    "狼耳兜帽": "wolf hood",
-    "猫耳兜帽": "cat hood",
-    "虎鲸兜帽": "orca hood",
-    "鸟兜帽": "bird hood",
-    "鼠耳兜帽": "mouse hood"
-  },
-  "其他": {
-    "三重冕": "tiara",
-    "东金帽子": "tokin hat",
-    "南瓜帽": "pumpkin hat",
-    "圆顶礼帽": "bowler hat",
-    "圣诞帽": "santa hat",
-    "女巫帽": "witch hat",
-    "巫师帽": "wizard hat",
-    "帽子": "hat",
-    "护士帽": "nurse cap",
-    "摩托头盔": "motorcycle helm",
-    "皇冠": "crown",
-    "箍状头饰": "circlet",
-    "类似警帽": "peaked cap",
-    "贝雷帽": "beret",
-    "软呢帽": "fedora",
-    "迷你礼帽": "mini top hat"
-  },
-  "其他种类": {
-    "私服": "casual",
-    "连衫裤": "jumpsuit",
-    "长袍": "robe"
-  },
-  "内衣": {
-    "乳头创可贴": "bandaids on nipples",
-    "乳贴": "pasties",
-    "兔子乳贴": "rabbit pasties",
-    "印花胸罩": "print bra",
-    "圆斑胸罩": "polka dot bra",
-    "心形乳贴": "heart pasties",
-    "无罩杯胸罩": "cupless bra",
-    "无肩带胸罩": "strapless bra",
-    "星形乳贴": "star pasties",
-    "条纹胸罩": "striped bra",
-    "比基尼上衣": "bikini top",
-    "球形胸罩": "ball bra",
-    "皮带胸罩": "beltbra",
-    "胸罩": "bra",
-    "胸衣": "bustier",
-    "荷叶边胸罩": "frilled bra",
-    "蕾丝胸罩": "lace bra",
-    "蕾丝边胸罩": "lace-trimmed bra",
-    "蝴蝶结胸罩": "bow bra",
-    "褶边胸罩": "ruffled bra",
-    "运动胸罩": "training bra"
-  },
-  "内衬": {
-    "前系带上衣": "front-tie top",
-    "挂胸露腹短上衣": "crop top overhang",
-    "束腰": "girdling",
-    "露腰上衣": "midriff",
-    "露腹短上衣": "crop top"
-  },
-  "内裤": {
-    "丁字裤": "thong",
-    "三角裤": "trefoil",
-    "低腰内裤": "lowleg panties",
-    "内裤": "color?:panties",
-    "尿布": "diaper",
-    "布料少的内裤": "micro panties",
-    "带蝴蝶结的内裤": "bow panties",
-    "开裆内裤": "crotchless panties",
-    "日式丁字裤": "fundoshi",
-    "条纹内裤": "striped panties",
-    "正面印花内裤": "front-print panties",
-    "比基尼泳裤": "bikini bottom",
-    "湿内裤": "wet panties",
-    "灯笼裤": "bloomers",
-    "猫耳造型内裤": "cat ear panties",
-    "系带式内裤": "side-tie panties",
-    "背面印花内裤": "back-print panties",
-    "草莓内裤": "strawberry panties",
-    "蕾丝边内裤": "lace-trimmed panties",
-    "裤袜里的内裤": "panties under pantyhose",
-    "超细丁字裤": "g-string",
-    "高开叉内裤": "highleg panties"
-  },
-  "制服": {
-    "女性西服": "pant suit",
-    "校服": "school uniform",
-    "水手服": "serafuku",
-    "燕尾服": "tailcoat",
-    "西装": "business suit",
-    "黑西装": "black suit"
-  },
-  "卫衣": {
-    "卫衣": "hoodie",
-    "套头衫": "pullover"
-  },
-  "吊带": {
-    "交叉吊带衫": "criss-cross halter",
-    "吊带": "strap",
-    "吊带(裙的)": "suspenders",
-    "挂颈式肩带": "halterneck",
-    "无吊带": "strapless",
-    "背带": "harness",
-    "胸罩肩带": "bra strap"
-  },
-  "和服": {
-    "和服": "japanese clothes",
-    "和服带": "obi",
-    "浴衣": "yukata",
-    "着物": "color?:kimono",
-    "羽织": "haori",
-    "袴": "hakama",
-    "袴裙": "hakama skirt"
-  },
-  "大衣": {
-    "冬装大衣": "winter coat",
-    "大衣": "coat",
-    "毛皮大衣": "fur coat",
-    "白大褂": "lab coat",
-    "粗呢大衣": "duffel coat",
-    "超大毛皮大衣": "fur-trimmed coat",
-    "连帽外套": "hooded coat",
-    "风衣": "windbreaker"
-  },
-  "头部": {
-    "兜帽戴在头上": "hood up"
-  },
-  "夹克": {
-    "夹克": "color?:jacket",
-    "旅行夹克": "safari jacket",
-    "正装夹克": "blazer",
-    "田径夹克": "track jacket",
-    "紧身夹克": "taut jacket",
-    "翻领夹克": "collared jacket",
-    "西装外套": "suit jacket",
-    "西装马甲": "waistcoat",
-    "连帽夹克": "hooded jacket",
-    "连帽运动夹克": "hooded track jacket"
-  },
-  "居家": {
-    "围裙": "apron",
-    "女仆围裙": "maid apron",
-    "性感睡衣": "babydoll",
-    "沙滩巾": "beach towel",
-    "沙滩浴巾": "sarong",
-    "浴巾": "towel",
-    "睡衣": "pajama",
-    "睡袍": "nightgown"
-  },
-  "开口": {
-    "下乳开口": "underboob cutout",
-    "乳沟开口": "cleavage cutout",
-    "侧腰开口": "side cutout",
-    "后背开口": "back cutout",
-    "大腿开口": "thigh cutout",
-    "小腹开口": "stomach cutout",
-    "屁股开口": "ass cutout",
-    "心形开口": "heart cutout",
-    "手臂开口": "arm cutout",
-    "正中间开口": "center opening",
-    "激凸": "rei no himo",
-    "肚脐开口": "navel cutout",
-    "肩膀开口": "shoulder cutout",
-    "胯边开口": "waist cutout",
-    "胸部猫猫开口": "cat cutout",
-    "脚部开口": "leg cutout",
-    "腋下开口": "armpit cutout",
-    "透出乳头": "covered nipples",
-    "透出肚脐": "covered navel",
-    "露双肩": "bare shoulders",
-    "露双臂": "bare arms",
-    "露点衣服": "nippleless clothes",
-    "露肩": "off shoulder",
-    "露胸衣服": "breastless clothes"
-  },
-  "情趣": {
-    "裸体围裙": "naked apron",
-    "裸体工装": "naked overalls",
-    "裸体浴巾": "naked towel",
-    "裸体绑带": "naked bandage"
-  },
-  "扣式": {
-    "纽扣": "buttons"
-  },
-  "披风兜帽": {
-    "双面披风": "two-sided cape",
-    "小披肩": "capelet",
-    "带兜帽披风": "hooded cape",
-    "彩色披风": "multicolored cape",
-    "披风": "cape",
-    "漂起的披风": "floating cape",
-    "裸体披风": "naked cape"
-  },
-  "整体": {
-    "全裸": "completely nude",
-    "撕碎": "torn clothes",
-    "敞开衣服": "open clothes",
-    "敞开连衣裙": "open dress",
-    "敞开长袍": "open robe",
-    "细致的湿衣服": "detailed wet clothes",
-    "衣服湿透": "wet clothes",
-    "裸体": "nude",
-    "透明布料": "see-through",
-    "透明服装": "transparent clothes"
-  },
-  "服装纹样": {
-    "四叶草纹样": "clover print",
-    "奶牛斑点": "cow print",
-    "心形纹样": "heart print",
-    "斑马纹": "zebra print",
-    "星星纹样": "star print",
-    "条纹": "striped",
-    "枫叶纹样": "maple leaf print",
-    "树叶纹样": "leaf print",
-    "格子": "plaid",
-    "格子纹样": "tartan",
-    "点纹": "polka dot",
-    "熊纹": "bear print",
-    "猫猫纹样": "cat print",
-    "玫瑰纹样": "rose print",
-    "皮毛纹样": "animal print",
-    "花朵纹样": "floral print",
-    "草莓纹样": "strawberry print",
-    "虎纹": "tiger print",
-    "蛛网纹样": "spider web print",
-    "蝙蝠纹样": "bat print",
-    "蝴蝶纹样": "butterfly print",
-    "豹纹": "leopard print",
-    "迷彩": "camoflage",
-    "雪花纹样": "snowflake print"
-  },
-  "未来系": {
-    "动力装甲": "power armor",
-    "外骨骼": "exoskeleton",
-    "机甲服": "mecha clothes",
-    "现代士兵": "operator",
-    "生化防护服": "hazmat suit"
-  },
-  "比基尼": {
-    "侧边系带比基尼": "side-tie bikini",
-    "前系带比基尼": "front-tie bikini",
-    "圣诞比基尼": "santa bikini",
-    "微小比基尼": "micro bikini",
-    "无罩杯比基尼": "cupless bikini",
-    "无肩带比基尼": "bandeau",
-    "比基尼": "color?:bikini",
-    "比基尼铠甲": "bikini armor",
-    "系绳比基尼": "string bikini",
-    "紧身比基尼": "taut bikini"
-  },
-  "毛衣": {
-    "处男杀手": "virgin killer sweater",
-    "毛衣": "color?:sweater",
-    "紧身毛衣": "taut sweater",
-    "纹路很明显的毛衣": "aran sweater",
-    "罗纹毛衣": "ribbed sweater",
-    "胸部开口毛衣": "open-chest sweater",
-    "连帽毛衣": "hooded sweater",
-    "露肩毛衣": "off-shoulder sweater",
-    "高领毛衣": "turtleneck sweater"
-  },
-  "汉服": {
-    "唐装(旗袍?)": "fantasy chinese traditional clothes",
-    "旗袍": "china dress",
-    "汉服": "hanfu"
-  },
-  "泳衣": {
-    "学校泳衣": "school swimsuit",
-    "学校竞赛泳衣": "competition school swimsuit",
-    "泳衣": "swimsuit",
-    "竞赛泳衣": "competition swimsuit",
-    "连体泳衣": "one-piece swimsuit"
-  },
-  "洛丽塔": {
-    "和风洛丽塔": "wa lolita",
-    "哥特洛丽塔": "gothic lolita",
-    "洛丽塔": "lolita"
-  },
-  "现代系": {
-    "军装": "military uniform",
-    "军装夹克": "military jacket"
-  },
-  "种族cos": {
-    "吸血鬼装": "vampire costume",
-    "戏服": "costume",
-    "木乃伊装": "mummy costume",
-    "玩偶装": "animal costume",
-    "鬼魂装": "ghost costume"
-  },
-  "紧身衣": {
-    "兔女郎紧身衣": "playboy bunny leotard",
-    "内层紧身衣": "leotard under clothes",
-    "半透紧身衣": "see-through bodysuit",
-    "无肩带紧身衣": "strapless leotard",
-    "紧身衣": "bodysuit",
-    "紧身衣服": "taut clothes",
-    "胶衣": "latex",
-    "贴身紧身衣": "taut bodysuit"
-  },
-  "职业cos": {
-    "修女服": "nun gown",
-    "修道服": "religious habit",
-    "兜帽斗篷": "cape hood",
-    "女仆装": "maid dress",
-    "短祭袍": "tunic",
-    "舞娘服": "harem outfit"
-  },
-  "背心": {
-    "吊带背心": "camisole",
-    "外套背心": "vest",
-    "小款背心": "cropped vest",
-    "平胸背心": "flattop",
-    "承重背心": "load bearing vest",
-    "无肩带背心": "tube top",
-    "紧身背心": "taut vest",
-    "背心": "tank top"
-  },
-  "节日": {
-    "万圣节装": "halloween costume",
-    "圣诞装": "santa"
-  },
-  "衬衫": {
-    "T恤": "t-shirt",
-    "上身体操服": "gym shirt",
-    "女式衬衫": "blouse",
-    "带领女式衬衫": "collared blouse",
-    "带领衬衫": "collared shirt",
-    "开襟衫": "cardigan",
-    "格子衬衫": "checkered shirt",
-    "水手衬衫": "sailor shirt",
-    "湿衬衫": "wet shirt",
-    "短衬衫": "cropped shirt",
-    "礼服衬衫": "dress shirt",
-    "系起的衬衫": "tied shirt",
-    "紧身衬衫": "taut shirt",
-    "荷叶边衬衫": "frilled shirt",
-    "衬衫": "shirt",
-    "过大的衬衫": "oversized shirt",
-    "露肩衫": "off-shoulder shirt"
-  },
-  "袖子": {
-    "分层袖子": "layered sleeves",
-    "分离式袖子": "detached sleeves",
-    "叠起的袖子": "sleeves folded up",
-    "宽袖": "wide sleeves",
-    "插肩袖": "raglan sleeves",
-    "无袖": "sleeveless",
-    "泡泡袖": "puffy sleeves",
-    "短袖": "short sleeves",
-    "荷叶边袖子": "frilled sleeves",
-    "袖子": "sleeves",
-    "过腕袖": "sleeves past wrists",
-    "长袖": "long sleeves",
-    "长过手指的袖": "sleeves past fingers"
-  },
-  "袜子": {
-    "及膝袜": "kneehighs",
-    "吊带袜": "color?:garter belt",
-    "吊袜带": "color?:garter straps",
-    "条纹袜": "striped legwear",
-    "条纹过膝袜": "striped thighhighs",
-    "泡泡袜": "loose socks",
-    "泳衣下连裤袜": "pantyhose under swimsuit",
-    "绑腿连裤袜": "thighband pantyhose",
-    "绝对领域": "zettai ryouiki",
-    "网裤袜": "fishnet pantyhose",
-    "脚踝吊袜带": "ankle garter",
-    "袜子": "color?:legwear",
-    "裤袜": "color?:pantyhose",
-    "裸足": "bare legs",
-    "过膝袜": "color?:thighhighs",
-    "连裤袜加长筒袜": "thighhighs over pantyhose",
-    "连身袜": "bodystocking",
-    "长筒袜加短袜": "socks over thighhighs"
-  },
-  "装饰": {
-    "胸口带花边": "center frills",
-    "荷叶边": "frills",
-    "蕾丝": "lace",
-    "蕾丝边": "lace trim",
-    "褶裥": "gathers"
-  },
-  "裙子": {
-    "下摆": "pelvic curtain",
-    "少女风蛋糕裙": "tiered skirt",
-    "格子裙": "checkered skirt",
-    "正装短裙": "skirt suit",
-    "比基尼裙": "bikini skirt",
-    "牛仔裙": "denim skirt",
-    "百褶裙": "pleated skirt",
-    "紧身裙": "taut skirt",
-    "蛋糕裙": "cake skirt",
-    "裙子": "color?:skirt",
-    "迷你裙": "color?:miniskirt",
-    "铅笔裙": "pencil skirt",
-    "高腰裙": "high waist skirt"
-  },
-  "裤子": {
-    "七分裤": "capri pants",
-    "体操短裤": "gym shorts",
-    "吊带裤": "trousers with suspenders",
-    "热裤": "cutoffs",
-    "牛仔短裤": "denim shorts",
-    "牛仔裤": "jeans",
-    "皮套裤": "chaps",
-    "短裤": "shorts",
-    "紧身短裤": "taut shorts",
-    "紧身裤": "leggings",
-    "紧身长裤": "taut pants",
-    "自行车短裤": "bike shorts"
-  },
-  "运动系": {
-    "体操服": "gym uniform",
-    "排球服": "volleyball uniform",
-    "运动服": "sportswear"
-  },
-  "连衣裙": {
-    "夏日长裙": "summer dress",
-    "太阳裙": "sundress",
-    "无吊带连衣裙": "strapless dress",
-    "无袖连衣裙": "sleeveless dress",
-    "格子连衣裙": "plaid dress",
-    "毛衣连衣裙": "sweater dress",
-    "短连衣裙": "short dress",
-    "紧身连衣裙": "sheath dress",
-    "细致的哥特式束腰连衣裙": "beautiful detailed black gothic empire waist dress",
-    "绕颈连衣裙": "halter dress",
-    "芭蕾连衣裙": "ballet dress",
-    "荷叶边连衣裙": "frilled dress",
-    "蝉翼纱连衣裙": "organdie dress",
-    "连衣裙": "color?:dress",
-    "阿尔卑斯山少女装": "dirndl",
-    "露背连衣裙": "backless dress"
-  },
-  "雨衣": {
-    "普通雨衣": "raincoat",
-    "透明雨衣": "transparent raincoat",
-    "雨披": "poncho"
-  },
-  "非衣服当衣服": {
-    "手带绷带": "bandaged hands",
-    "手臂带绷带": "bandaged arm",
-    "绑着绷带的脚": "bandaged leg",
-    "绷带": "bandages"
-  },
-  "鞋子": {
-    "乐福鞋": "loafers",
-    "交叉系带鞋": "cross-laced footwear",
-    "凉鞋": "sandals",
-    "天狗木屐": "tengu geta",
-    "拖鞋": "slippers",
-    "牛仔靴": "cowboy boots",
-    "玛丽珍鞋": "mary janes",
-    "皮鞋": "leather shoes",
-    "短靴": "ankle boots",
-    "系带靴": "lace-up boots",
-    "膝下靴": "knee boots",
-    "芭蕾拖鞋": "ballet slippers",
-    "赤脚": "barefoot",
-    "过膝长靴": "thigh boots",
-    "运动鞋": "sneakers",
-    "靴子": "boots",
-    "鞋子": "footwear",
-    "高跟鞋": "high heels"
-  },
-  "领子": {
-    "水手领": "sailor collar",
-    "荷叶边衬衫领": "frilled shirt collar",
-    "领子": "neckwear"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Composition.json b/src/novelai_python/utils/prompt_factory/cell/raw/Composition.json
deleted file mode 100644
index 36f6a45..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Composition.json
+++ /dev/null
@@ -1,299 +0,0 @@
-{
-  "主题": {
-    "反乌托邦": "dystopian",
-    "奇幻": "fantasy",
-    "机械风": "machinery",
-    "科学幻想": "science fiction",
-    "蒸汽朋克": "steampunk",
-    "赛博朋克": "cyberpunk"
-  },
-  "人物视线": {
-    "偷窥": "peeping",
-    "向上看": "looking up",
-    "向下看": "looking down",
-    "向侧面瞥": "sideways glance",
-    "向外看": "looking outside",
-    "回头看": "looking back",
-    "看向侧面": "looking to the side",
-    "看向远方": "looking afar",
-    "看着别处": "looking away",
-    "看着前方": "looking ahead",
-    "看着另一人": "looking at another",
-    "看着电话": "looking at phone",
-    "看着观众": "looking at viewer",
-    "非常接近观众": "very close to viewer",
-    "靠近观众": "close to viewer",
-    "面向别处": "facing away",
-    "面对观众": "facing viewer",
-    "面对镜头": "facing the lens"
-  },
-  "其他": {
-    "牛仔镜头": "cowboy shot"
-  },
-  "区域": {
-    "上半身": "upper body",
-    "上半身在画框外": "cropped torso upper body",
-    "下半身": "lower body",
-    "侧面像": "profile",
-    "侧面肖像画": "side profile",
-    "全身": "whole body",
-    "半身像": "bust",
-    "后背": "back",
-    "头部在画框外": "head out of frame",
-    "手臂在画框外": "cropped arms",
-    "正脸": "straight-on",
-    "肩膀在画框外": "cropped shoulders",
-    "脚部在画框外": "feet out of frame",
-    "腿部在画框外": "cropped legs",
-    "自拍": "selfie",
-    "自拍镜": "selfiemirror",
-    "躯干在画框外": "cropped torso"
-  },
-  "叶": {
-    "散落的叶子": "scattered leaves",
-    "枫叶": "maple leaf",
-    "树叶": "leaves",
-    "落叶": "falling leaves",
-    "银杏叶": "ginkgo leaf",
-    "风中叶": "leaves in wind"
-  },
-  "地平线": {
-    "地平线": "horizon",
-    "群山地平线": "mountainous horizon"
-  },
-  "天空": {
-    "五彩斑斓的星轨": "colorful startrails",
-    "夜空": "night sky",
-    "天空": "color?:sky",
-    "天际线": "skyline",
-    "星云": "nebula",
-    "星空": "starry sky",
-    "星轨": "star trail",
-    "极光": "aurora",
-    "流星": "shooting star",
-    "渐变天空": "gradient sky",
-    "烟花": "fireworks",
-    "燃烧的天空": "burning sky",
-    "空中烟火": "aerial fireworks",
-    "美丽精细的天空": "beautiful detailed sky",
-    "超级银河": "hyper galaxy",
-    "银河": "the galaxy"
-  },
-  "日月": {
-    "太阳": "sun",
-    "弦月": "crescent moon",
-    "新月": "new moon",
-    "月亮": "luna",
-    "满月": "full moon",
-    "猩红月亮": "scarlet moon",
-    "红月": "red moon",
-    "蓝月": "blue moon"
-  },
-  "昆虫": {
-    "发光蝴蝶": "glowing butterfly",
-    "天空中的鸟和云": "ptcrowd birds and cloud at sky",
-    "羽毛": "color?:feathers",
-    "自然其他": "nature",
-    "萤火虫": "glowworm",
-    "虫子(实际上蝴蝶)": "bug",
-    "蜜蜂": "bee",
-    "蜻蜓": "dragonfly",
-    "蝴蝶": "butterfly",
-    "金鱼": "goldfish",
-    "飞翔的蝴蝶": "flying butterfly"
-  },
-  "构成": {
-    "一排人": "lineup",
-    "多人柱形特写": "column lineup",
-    "对称旋转": "rotational symmetry",
-    "左右对称": "symmetry",
-    "群像": "group picture",
-    "风景": "scenic view"
-  },
-  "火焰和爆炸": {
-    "余烬": "embers",
-    "战争的火焰": "flames of war",
-    "漂亮的火焰": "good looking flame",
-    "火": "fire",
-    "火星子": "sparks",
-    "火焰漩涡": "flame whirlpool",
-    "熔化": "melting",
-    "燃烧": "burning",
-    "爆裂魔法": "explosion",
-    "精致的火焰": "exquisite flame",
-    "美丽细致的爆炸": "beautiful and detailed explosion",
-    "背后的核爆炸": "nuclear explosion behide",
-    "飞舞的火焰": "flying flames"
-  },
-  "烟": {
-    "硝烟": "smoke of gunpowder",
-    "黑烟": "black smoke"
-  },
-  "焦点": {
-    "偷窥胸罩": "bra peek",
-    "偷窥腋窝": "armpit peek",
-    "内裤镜头": "pantyshot",
-    "只画脸": "face only",
-    "强调两腿之间": "between legs",
-    "强调大腿之间": "between thighs",
-    "强调指间": "between fingers",
-    "强调胸部": "between breasts",
-    "聚焦1个女孩": "1girl solo focus",
-    "聚焦单人": "solo focus",
-    "聚焦女性": "female focus",
-    "聚焦男性": "male focus",
-    "聚焦眼睛": "eyes focus",
-    "聚焦肚脐": "navel focus",
-    "聚焦背部": "back focus",
-    "聚焦胸部": "breast focus",
-    "聚焦脚部": "foot focus",
-    "聚焦脸部": "face focus",
-    "聚焦腋部": "armpit focus",
-    "聚焦臀部": "ass focus",
-    "聚焦髋部": "hip focus"
-  },
-  "纸": {
-    "彩纸屑": "confetti",
-    "折纸": "origami",
-    "碎纸屑": "shredded paper",
-    "纸鹤": "paper crane",
-    "飞溅的彩色碎纸": "flying colored shredded paper"
-  },
-  "背景关系": {
-    "半入水": "partially submerged",
-    "在书桌上": "on desk",
-    "在地上": "on ground",
-    "在床上": "on bed",
-    "在树上": "in tree",
-    "在树下": "under tree",
-    "在水中": "in water",
-    "在沙发上": "on couch",
-    "在空中": "in sky",
-    "在草地上": "on grass",
-    "坐在床上": "sitting on bed",
-    "桥下": "under bridge",
-    "水上行走": "walking on liquid",
-    "泡着脚": "soaking feet",
-    "涉水": "wading",
-    "盖着被子": "under covers",
-    "躺在水中": "lying on water",
-    "躺在湖面上": "lying on the lake",
-    "靠在树边": "against tree",
-    "靠近水边": "near the water edge"
-  },
-  "自然现象": {
-    "中等风速": "medium wind",
-    "中雨": "moderate rain",
-    "中雪": "moderate snow",
-    "云": "cloud",
-    "冰": "ice",
-    "冰晶": "ice crystal",
-    "多云": "cloudy",
-    "大雨": "heavy rain",
-    "小雨": "light rain",
-    "小雪": "minor snow",
-    "尘卷风": "dust tornado",
-    "彩虹": "rainbow",
-    "微风": "breeze",
-    "暴雨": "rainstorm",
-    "暴风雨": "storm",
-    "水滴": "water drop",
-    "液体飞溅": "splashing",
-    "滴水": "dripping",
-    "漂亮精细的雪": "detailed beautiful snow",
-    "潮湿": "wet",
-    "电": "electricity",
-    "积雨云": "cumulonimbus",
-    "精细的冰": "detailed ice",
-    "蒸汽": "steam",
-    "被雪覆盖的": "snow covered",
-    "被风扬起": "windblown",
-    "阴天": "overcast sky",
-    "随机分布的云": "randomly distributed clouds",
-    "雨": "rain",
-    "雨中": "in the rain",
-    "雨天": "rainy days",
-    "雪": "snow",
-    "雪崩": "avalanche",
-    "雪花": "snowflakes",
-    "雷暴": "electrical storm",
-    "雷雨": "thunderstorm",
-    "雾气": "mist",
-    "霜": "frost",
-    "风": "wind",
-    "风吹起": "wind lift",
-    "飓风": "hurricane",
-    "飘着的雪花": "floating snowflake",
-    "飞溅水花": "flying splashes",
-    "飞溅的水": "splashing water",
-    "龙卷风": "tornado"
-  },
-  "花": {
-    "五颜六色的花瓣飞舞": "many colorful petals are flying",
-    "柳絮": "catkins",
-    "水面的花": "flower on liquid",
-    "水面的花瓣": "petals on liquid",
-    "漂浮的樱花": "floating sakura",
-    "玫瑰花瓣": "rose petals",
-    "环绕樱花": "surrounded by floating sakura",
-    "花瓣": "flower petals",
-    "落下的花瓣": "falling petals",
-    "飘在空中的棉絮": "cotton wool floating in the air",
-    "飞舞的花瓣": "flying petals"
-  },
-  "视角": {
-    "主观视角": "pov",
-    "主观视角的手": "pov hands",
-    "低位视角": "from below",
-    "侧下视角": "from the side below",
-    "侧边视角": "from side",
-    "侧面视角": "side view",
-    "正面视角": "front view",
-    "第一人称视角": "first-persion view",
-    "背后视角": "from behind",
-    "衬衫底视角": "upshirt",
-    "裙底视角": "upskirt",
-    "裤底视角": "upshorts",
-    "越桌主观视角": "pov across table",
-    "越裆主观视角": "pov crotch",
-    "高位视角": "from above"
-  },
-  "角度": {
-    "动态镜头": "dynamic angle",
-    "强烈镜头": "intense angle",
-    "戏剧性镜头": "dramatic angle",
-    "斜角镜头": "dutch angle",
-    "电影镜头": "cinematic angle"
-  },
-  "设计元素": {
-    "十字": "cross",
-    "心形": "heart",
-    "星星": "star",
-    "月牙": "crescent"
-  },
-  "远近": {
-    "中景": "mid shot",
-    "全景": "panorama",
-    "宏大的场景": "grand scene",
-    "微距": "macro",
-    "微距摄像": "macro shot",
-    "特写": "close up",
-    "近景": "close shot",
-    "远景": "wide shot",
-    "鸟瞰": "aerial"
-  },
-  "透视": {
-    "广角": "wide-angle",
-    "等轴": "isometric",
-    "远景透视法": "vanishing point",
-    "透视法": "foreshortening",
-    "鱼眼镜头": "fisheye"
-  },
-  "魔幻": {
-    "召唤魔法阵": "summoning",
-    "阴阳": "yin yang",
-    "阴阳球": "yin yang orb",
-    "鬼火": "foolish fire",
-    "魔法": "magical"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Environment.json b/src/novelai_python/utils/prompt_factory/cell/raw/Environment.json
deleted file mode 100644
index 0051c70..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Environment.json
+++ /dev/null
@@ -1,676 +0,0 @@
-{
-  "中型陆地哺乳": {
-    "哈士奇": "siberian husky",
-    "大猩猩": "gorilla",
-    "小熊猫": "lesser panda",
-    "德国牧羊犬": "german shepherd dog",
-    "柯基犬": "corgi",
-    "柴犬": "shiba inu",
-    "树懒": "sloth",
-    "橘猫": "orange cats",
-    "浣熊": "raccoon",
-    "犰狳": "armadillo",
-    "狐狸": "fox",
-    "狒狒": "baboon",
-    "狗": "dog",
-    "狼": "wolf",
-    "猫": "cat",
-    "猴子": "monkey",
-    "红毛猩猩": "oranguta",
-    "缅因猫": "maine coon",
-    "萨摩耶": "samoye",
-    "薮猫": "serval",
-    "虎斑猫": "tabby cat",
-    "袋鼠": "kangaroo",
-    "贵宾犬": "poodle",
-    "边牧犬": "border collie",
-    "金毛寻回犬": "golden retriever",
-    "阿拉斯加雪橇犬": "alaskan malamute",
-    "雪狐": "snow fox",
-    "黑猩猩": "chimpanzee"
-  },
-  "主题": {
-    "人间地狱": "a hell on earth",
-    "末日场景": "doomsday scenes"
-  },
-  "交通": {
-    "主干道": "in main street",
-    "人行横道": "crosswalk",
-    "人行道": "sidewalk",
-    "停车场": "parking lot",
-    "公交车站": "bus stop",
-    "小巷": "alley",
-    "成荫街道": "avenue",
-    "旱坞": "drydock",
-    "木桥": "wooden bridge",
-    "机场": "airfield",
-    "桥": "bridge",
-    "泥路": "dirt road",
-    "渡槽": "aqueduct",
-    "港口": "harbor",
-    "火车站": "train station",
-    "石制人行道": "stone walkway",
-    "码头": "jetty",
-    "绳桥": "rope bridge",
-    "街道": "street",
-    "路口": "intersection",
-    "路径": "path",
-    "路面": "pavement",
-    "运河": "canal",
-    "道路": "road",
-    "铁路": "railway",
-    "铁轨": "railroad tracks",
-    "铁道路口": "railroad crossing",
-    "隧道": "tunnel",
-    "高速公路": "highway"
-  },
-  "交通工具": {
-    "巴士内": "on the bus",
-    "电车内": "train interior",
-    "飞艇": "airship"
-  },
-  "人造景观": {
-    "东京塔": "tokyo tower",
-    "东京天空树": "skytree",
-    "中国庙宇": "chinese temple",
-    "九龙城寨": "kowloon",
-    "伏见稻荷": "fushimi inari",
-    "凉亭": "gazebo",
-    "喷泉": "geyser",
-    "圣托里尼": "santorini",
-    "埃及神庙": "egyptian temple",
-    "埃及金字塔": "egyptian pyramids",
-    "威尼斯": "venice",
-    "希腊神庙": "greek temple",
-    "明石海峡大桥": "akashi kaikyo bridge",
-    "泰姬陵": "taj mahal",
-    "狮身人面像": "great sphinx of giza",
-    "长城": "great wall",
-    "鸟居": "torii"
-  },
-  "其他": {
-    "动物": "animal",
-    "鳞片": "scales"
-  },
-  "军事": {
-    "军事基地": "military base",
-    "军械库": "armory",
-    "战壕": "trench",
-    "掩体": "bunker"
-  },
-  "办公": {
-    "办公室": "office",
-    "工作室": "workshop",
-    "职员休息室": "staff room",
-    "隔间": "cubicle"
-  },
-  "园林": {
-    "中式园林": "chinese garden",
-    "公园": "park",
-    "日式园林": "japanese garden",
-    "欧式园林": "european garden",
-    "温室": "greenhouse",
-    "花园": "garden"
-  },
-  "场地": {
-    "以天空为地面(神tag)": "sky ground",
-    "墓地": "graveyard",
-    "废墟": "rubble ruins",
-    "漂浮平台": "floating platform"
-  },
-  "大型陆地哺乳": {
-    "北极熊": "polar bear",
-    "大象": "elephant",
-    "斑马": "zebra",
-    "河马": "hippo",
-    "熊": "bear",
-    "熊猫": "panda",
-    "牛": "cattle",
-    "犀牛": "rhinoceros",
-    "狮子": "lion",
-    "猛犸": "mammoth",
-    "猪": "pig",
-    "虎": "tiger",
-    "豹": "leopard",
-    "长颈鹿": "giraffe",
-    "马": "horse",
-    "驴": "donkey",
-    "骆驼": "camel",
-    "鹿": "deer",
-    "黑豹": "panther"
-  },
-  "太空": {
-    "卫星": "satellite",
-    "地球": "earth",
-    "太空": "space",
-    "星球": "planet",
-    "空间站": "from space station",
-    "轨道电梯": "space elevator"
-  },
-  "娱乐旅宿": {
-    "剧院": "theater",
-    "夜店": "nightclub",
-    "摔角场": "wrestling ring",
-    "旅馆房间": "hotel room",
-    "日本旅馆": "japanese hotel",
-    "游戏厅": "arcade",
-    "电影院": "movie theater",
-    "电影院里": "in the movie theatre",
-    "竞技场": "arena",
-    "赌场": "casino",
-    "酒店": "hotel",
-    "音乐剧院": "amphitheater"
-  },
-  "室内其他": {
-    "地牢": "dungeon",
-    "室内": "indoors",
-    "监狱": "prison",
-    "监狱房间": "prison cell"
-  },
-  "室外其他": {
-    "室外": "outdoors",
-    "高空": "high altitude"
-  },
-  "家居": {
-    "中式阁楼": "chinese style loft",
-    "传统中式房间": "traditional chinese room",
-    "公寓": "apartment",
-    "卧室": "bedroom",
-    "厕所": "toilet",
-    "厨房": "kitchen",
-    "客厅": "living room",
-    "家里餐厅": "dining room",
-    "杂乱的房间": "messy room",
-    "榻榻米": "tatami",
-    "沙龙": "salon",
-    "浴室": "bathroom"
-  },
-  "小型陆地哺乳": {
-    "仓鼠": "hamster",
-    "兔子": "bunny",
-    "刺猬": "hedgehog",
-    "松鼠": "squirrel",
-    "老鼠": "mouse",
-    "花栗鼠": "chipmunk",
-    "蝙蝠": "bat",
-    "蝙蝠(复)": "bats",
-    "豚鼠": "guinea pig",
-    "雪兔": "snow bunny"
-  },
-  "屋外": {
-    "中庭": "atrium",
-    "屋顶": "rooftop",
-    "泳池": "swimming pool",
-    "泳池边": "poolside",
-    "草坪": "lawn",
-    "车库": "garage",
-    "阳台": "veranda"
-  },
-  "工业": {
-    "发电厂": "powerplant",
-    "工业": "industrial",
-    "工厂": "factory",
-    "核电厂": "nuclear powerplant",
-    "精炼厂": "refinery",
-    "船厂": "shipyard"
-  },
-  "市政": {
-    "医院": "hospital",
-    "博物馆": "museum",
-    "图书馆": "library",
-    "天文台": "observatory",
-    "天文馆": "planetarium",
-    "施工现场": "construction site",
-    "法庭": "courtroom",
-    "研究所": "laboratory",
-    "美术馆": "art gallery"
-  },
-  "市镇": {
-    "城市": "cityscape",
-    "小镇": "town",
-    "市中心": "downtown",
-    "异世界城市": "isekai cityscape",
-    "村庄": "village",
-    "浮动城市": "floating city",
-    "空中城市": "aerial city"
-  },
-  "幻兽种": {
-    "中国龙": "chinese dragon",
-    "克苏鲁": "cthulhu",
-    "凤凰": "phoenix",
-    "史莱姆": "slime",
-    "天狗": "tengu",
-    "宝可梦": "pokemon",
-    "雪人": "yeti",
-    "龙": "dragon"
-  },
-  "建筑": {
-    "冷却塔": "cooling tower",
-    "城堡": "castle",
-    "堆叠的建筑": "buildings stack",
-    "塔": "tower",
-    "大教堂": "cathedral",
-    "守卫塔": "guard tower",
-    "宝塔": "pagoda",
-    "宣礼塔": "minaret",
-    "宫殿": "palace",
-    "寺庙": "temple",
-    "小屋": "shack",
-    "屋敷": "mansion",
-    "巨型结构": "megastructure",
-    "建筑": "architecture",
-    "房子": "house",
-    "控制塔": "control tower",
-    "摩天楼": "skyscrapers",
-    "教堂": "church",
-    "树屋": "treehouse",
-    "浮动城堡": "floating castle",
-    "清真寺": "mosque",
-    "漂浮的宫殿": "floating palaces",
-    "灯塔": "lighthouse",
-    "神社": "shrine",
-    "钟塔": "clock tower",
-    "钟楼": "bell tower",
-    "风车": "windmill",
-    "高跷屋": "stilt house"
-  },
-  "建筑风格": {
-    "东亚风格建筑": "east asian architecture",
-    "东南亚风格建筑": "southeast asian style architecture",
-    "中式古典风格建筑": "chinese classical style architecture",
-    "中式风格建筑": "chinese style architecture",
-    "传统欧式风格建筑": "traditional european style architecture",
-    "古希腊建筑风格": "ancient Greek architectural style",
-    "古罗马建筑风格": "ancient roman architectural style",
-    "后现代主义风格建筑": "postmodernism style architecture",
-    "哥特式风格建筑": "gothic architecture external",
-    "园林风格": "garden style",
-    "地中海风格建筑": "mediterranean style architecture",
-    "巴洛克建筑风格": "baroque architectural style",
-    "希腊罗马风格建筑": "greco-roman architecture",
-    "文艺复兴建筑风格": "renaissance architectural style",
-    "新古典主义建筑风格": "neoclassical architectural style",
-    "日式风格建筑": "japanese style architecture",
-    "木条式建筑风格": "stick architectural style",
-    "概念式风格建筑": "conceptual style architecture",
-    "欧洲中世纪建筑风格": "european medieval architectural style",
-    "洛可可建筑风格": "rococo architectural style",
-    "现代中式风格建筑": "modern chinese style architecture",
-    "现代主义风格建筑": "modernist style architecture",
-    "简欧风格建筑": "simple european style architecture",
-    "美式古典风格建筑": "american classical style architecture",
-    "美式田园风格建筑": "american style pastoral architecture",
-    "美式风格建筑": "american style architecture"
-  },
-  "恐龙": {
-    "甲龙": "ankylosaurus",
-    "翼龙": "pterosaur",
-    "蛇颈龙": "plesiosaur",
-    "霸王龙": "tyrannosaurus rex"
-  },
-  "果实": {
-    "南瓜": "pumpkin"
-  },
-  "树木": {
-    "圣诞树": "chrismas tree",
-    "松树": "pine",
-    "枫树": "maple",
-    "枯树": "bare tree",
-    "柏树": "cypress",
-    "树": "tree",
-    "树叶": "foliage",
-    "树枝": "branch",
-    "树根": "roots",
-    "桦树": "birch",
-    "棕榈叶": "palm leaf",
-    "棕榈树": "palm tree",
-    "榆树": "elm",
-    "榕树": "banyan",
-    "秋天树叶": "autumn leaves",
-    "红杉": "redwood",
-    "银杏": "ginkgo"
-  },
-  "校园": {
-    "体育仓库": "gym storeroom",
-    "储存室": "storage room",
-    "医务室": "infirmary",
-    "厕所隔间": "toilet stall",
-    "学校更衣室": "locker room",
-    "教室": "classroom",
-    "玻璃暖房": "conservatory",
-    "礼堂": "auditorium",
-    "社团活动室": "clubroom",
-    "自助餐厅": "cafeteria",
-    "走廊": "hallway"
-  },
-  "水产": {
-    "寄居蟹": "hermit crab",
-    "小丑鱼": "clownfish",
-    "水母": "jellyfish",
-    "海参": "sea cucumber",
-    "海星": "starfish",
-    "海龟": "sea turtle",
-    "狮子鱼": "lionfish",
-    "珊瑚": "coral",
-    "章鱼": "octopus",
-    "虾": "shrimp",
-    "螃蟹": "crab",
-    "贝壳": "shell",
-    "鱼": "fish",
-    "鱼群": "shoal of fish",
-    "龙虾": "lobster"
-  },
-  "海洋哺乳": {
-    "海豚": "dolphin",
-    "白鲸": "beluga",
-    "蓝鲸": "blue whale",
-    "虎鲸": "killer whale",
-    "角鲸": "narwhal",
-    "鲨鱼": "shark",
-    "鲸鲨": "whale shark"
-  },
-  "游乐设施": {
-    "动物园": "zoo",
-    "摩天轮": "ferris wheel",
-    "旋转木马": "carousel",
-    "水上乐园": "waterpark",
-    "水族馆": "aquarium",
-    "游乐园": "amusement park",
-    "过山车": "roller coaster",
-    "迪士尼乐园": "disney land"
-  },
-  "灌木": {
-    "灌木": "bush",
-    "蔷薇灌木": "rose bush"
-  },
-  "爬行两栖": {
-    "乌龟": "tortoise",
-    "变色龙": "chameleon",
-    "巨蜥": "varanid",
-    "树蛙": "tree frog",
-    "爬行动物": "reptile",
-    "牛蛙": "bullfrog",
-    "红眼树蛙": "red eye tree frog",
-    "蚺": "anaconda",
-    "蛇": "snake",
-    "蛤蟆": "toad",
-    "蜥蜴": "lizard",
-    "蟒": "python",
-    "角蜥": "horned lizard",
-    "青蛙": "frog",
-    "鳄鱼": "crocodile"
-  },
-  "自然景观": {
-    "乌尤尼盐沼": "salar de uyuni",
-    "大峡谷": "grand canyon",
-    "富士山": "fuji mountain",
-    "张家界": "zhangjiajie",
-    "瀑布": "waterfall",
-    "马丘比丘": "machu picchu"
-  },
-  "自然环境": {
-    "丛林": "jungle",
-    "冰川": "glacier",
-    "山丘": "hill",
-    "山脉": "mountain",
-    "岛屿": "island",
-    "悬崖": "cliff",
-    "森林": "forest",
-    "水下": "underwater",
-    "池塘": "pond",
-    "池子": "pool",
-    "沙滩": "beach",
-    "沙漠": "desert",
-    "河流": "river",
-    "洞穴": "cave",
-    "浮岛": "floating island",
-    "海底": "seabed",
-    "海洋": "ocean",
-    "温泉": "onsen",
-    "湖泊": "lake",
-    "湿地": "marsh",
-    "溪流": "stream",
-    "火山": "volcano",
-    "牧场": "pasture",
-    "田园": "rural",
-    "稻田": "rice paddy",
-    "竹林": "bamboo forest",
-    "繁花草甸": "flowers meadows",
-    "自然环境": "nature",
-    "芦苇草原": "pampas glass field",
-    "花床": "flower bed",
-    "花田": "flower field",
-    "草原": "grasslands",
-    "草地": "grass",
-    "荒地": "wasteland",
-    "雪山": "snowy mountain",
-    "风景": "landscape",
-    "高原": "plateau",
-    "高耸的山峰": "a towering mountain peak",
-    "麦田": "wheat field"
-  },
-  "节肢": {
-    "兰花螳螂": "orchid mantis",
-    "狼蛛": "tarantula",
-    "甲虫": "beetle",
-    "苍蝇": "housefly",
-    "蛛网": "spider web",
-    "蜘蛛": "spider",
-    "螳螂": "mantis"
-  },
-  "花": {
-    "一品红": "poinsettia",
-    "一年蓬": "erigeron annuus",
-    "丁香": "lilac",
-    "万寿菊": "tagetes erecta",
-    "三叶草": "trifolium repens",
-    "三色堇": "pansy",
-    "九重葛": "bougainvillea",
-    "亚麻": "flax",
-    "伞花": "grass lily",
-    "倒挂金钟": "fuchsia",
-    "兰花": "orchid",
-    "勿忘我": "myosotis alpestris",
-    "勿忘草": "forget-me-not",
-    "厚萼凌霄": "trumpet creeper",
-    "君子兰": "clivia",
-    "含羞草": "mimosa",
-    "唐菖蒲": "gladiolus",
-    "嘉兰": "gloriosa",
-    "土豆花": "potato flower",
-    "多色玫瑰": "multicolored rose",
-    "大丁草": "gerbera",
-    "大丽花": "dahlia",
-    "大波斯菊": "cosmos",
-    "大王花": "rafflesia",
-    "天竺葵": "geranium",
-    "夹竹桃": "nerium oleander",
-    "委陵菜": "potentilla",
-    "孤挺花": "amaryllis",
-    "小苍兰": "freesia",
-    "山吹": "kerria japonica",
-    "山楂": "hawthorn",
-    "山茶花": "camellia",
-    "川续断": "dipsacaceae",
-    "广玉兰": "magnolia",
-    "康乃磬": "color?:carnation",
-    "异果菊": "dimorphotheca",
-    "彼岸花": "cluster-amaryllis",
-    "文心兰": "oncidium",
-    "旱金莲": "tropaeolum majus",
-    "昙花": "epiphyllum",
-    "曼陀罗": "datura stramonium",
-    "月光花": "moonflower",
-    "木芙蓉": "hibiscus mutabilis",
-    "杜鹃花": "azalea",
-    "染料木": "genista",
-    "桂花": "osmanthus",
-    "桃花": "peach blossoms",
-    "桔梗": "chinese bellflower",
-    "梅花": "plum blossoms",
-    "樱花": "cherry blossoms",
-    "欧洲油菜花": "rapeseed blossoms",
-    "毛地黄": "foxglove",
-    "毛茛": "ranunculus",
-    "水仙": "narcissus",
-    "沼泽金盏花": "marsh marigold",
-    "洋桔梗": "lisianthus",
-    "洋甘菊": "chamomile",
-    "满天星": "gypsophila paniculata",
-    "牡丹": "paeonia suffruticosa",
-    "狗牙花": "tabernaemontana divaricata linnaeus r. brown ex roemer & schultes",
-    "玫瑰": "color?:rose",
-    "番紅花": "crocus",
-    "百合": "lily",
-    "百合水仙": "alstroemeria",
-    "百日菊": "zinnia",
-    "睡莲": "water lily flower",
-    "矢车菊": "cornflower",
-    "石竹": "dianthus",
-    "碧冬茄": "petunia",
-    "秋海棠": "begonia",
-    "粉蝶花": "nemophila",
-    "紫罗兰": "violet",
-    "紫薇": "lagerstroemia indica",
-    "紫阳花": "hydrangea",
-    "繁星花": "pentas",
-    "绣球": "hydrangea macrophylla",
-    "缅栀花": "plumeria",
-    "罂粟": "poppy",
-    "翠雀": "larkspur",
-    "耬斗菜": "columbine",
-    "芍药": "peony",
-    "芙蓉": "hibiscus",
-    "花": "color?:blossoms",
-    "花(复)": "color?:flowers",
-    "花毛茛": "buttercup",
-    "花烛": "anthurium",
-    "花盆": "flower pot",
-    "草莓花": "strawberry blossoms",
-    "荷包牡丹": "bleeding heart",
-    "莲花": "color?:lotus",
-    "菊花": "chrysanthemum morifolium",
-    "葫芦花": "gourd blossom",
-    "蒲公英": "taraxacum mongolicum",
-    "蓟": "thistle",
-    "蔓长春花": "periwinkle",
-    "蕙兰": "cymbidium",
-    "薰衣草": "lavender",
-    "藤花": "wisteria",
-    "藿香蓟": "ageratum conyzoides l.",
-    "蜀葵": "hollyhock",
-    "蝎尾蕉": "heliconia",
-    "蝴蝶兰": "phalaenopsis aphrodite",
-    "西番莲花": "passion flower",
-    "角堇": "viola cornuta",
-    "连翘": "forsythia",
-    "郁金香": "tulip",
-    "金光菊": "rudbeckia",
-    "金木犀": "gold osmanthus",
-    "金鱼草": "snapdragon",
-    "铁筷子": "hellebore",
-    "铁线莲": "clematis",
-    "铃兰": "lily of the valley",
-    "银叶菊": "dusty miller",
-    "银莲花": "anemone",
-    "长寿花": "kalanchoe",
-    "雏菊": "daisy",
-    "雪莲花": "snowdrop",
-    "风信子": "hyacinth",
-    "风蜡花": "wax flower",
-    "风铃草": "bellflower",
-    "马缨丹": "lantana",
-    "马蹄莲": "calla lily",
-    "马醉木": "pieris japonica",
-    "马齿苋": "portulaca",
-    "高山火绒草": "edelweiss",
-    "鸢尾": "iris",
-    "鹤望兰": "bird of paradise flower",
-    "黄槿": "hibiscus tiliaceus",
-    "黑心金光菊": "black-eyed susan",
-    "龙胆": "gentiana"
-  },
-  "草": {
-    "仙人掌": "cactus",
-    "四叶草": "clover",
-    "多肉植物": "succulent",
-    "大麦": "barley",
-    "白鹤芋": "spathiphyllum",
-    "竹子": "bamboo",
-    "蘑菇": "mushroom",
-    "青苔": "moss",
-    "龟背竹": "monstera deliciosa liebm"
-  },
-  "藤类": {
-    "藤类": "vines",
-    "长春藤": "ivy"
-  },
-  "设施": {
-    "仓库": "warehouse",
-    "健身房": "gym",
-    "加油站": "gas station",
-    "大坝": "dam",
-    "机库": "hangar",
-    "谷仓": "barn"
-  },
-  "购物": {
-    "书店": "bookstore",
-    "便利店": "convenience store",
-    "商店": "shop",
-    "市场": "market",
-    "市场摊位": "market stall",
-    "更衣室": "dressing room",
-    "武器商店": "weapon shop",
-    "洗衣店": "laundry",
-    "花店": "flower shop",
-    "药店": "pharmacy",
-    "试衣间": "fitting room",
-    "购物中心": "mall",
-    "超市": "supermarket",
-    "面包店": "bakery"
-  },
-  "运动场": {
-    "体育场": "stadium",
-    "保龄球馆": "bowling alley",
-    "操场": "playground",
-    "滑冰场": "skating rink",
-    "田径场": "track and field",
-    "网球场": "tennis court",
-    "足球场": "soccer field",
-    "跑道": "running track"
-  },
-  "餐饮": {
-    "咖啡馆": "cafe",
-    "居酒屋": "izakaya",
-    "酒吧": "bar",
-    "酒馆": "tavern",
-    "餐厅": "restaurant"
-  },
-  "鸟类": {
-    "丹顶鹤": "red-crowned crane",
-    "企鹅": "penguin",
-    "喜鹊": "magpie",
-    "孔雀": "peacock",
-    "小鸡": "chick",
-    "帝企鹅": "emperor penguin",
-    "海鸥": "seagull",
-    "火烈鸟": "flamingo",
-    "燕子": "swallow",
-    "犀鸟": "hornbill",
-    "猫头鹰": "owl",
-    "白头鹰": "bald eagle",
-    "白鹭": "egret",
-    "金刚鹦鹉": "macaw",
-    "雨燕": "swifts",
-    "雪鸮": "snow owl",
-    "鸟": "bird",
-    "鸡": "chicken",
-    "鸦": "crow",
-    "鸭子": "duck",
-    "鸽子": "dove",
-    "鹅": "goose",
-    "鹦鹉": "parrot",
-    "鹰": "eagle",
-    "麻雀": "sparrow"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Expression.json b/src/novelai_python/utils/prompt_factory/cell/raw/Expression.json
deleted file mode 100644
index aa58f06..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Expression.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "其他": {
-    "伸出舌头": "tongue out",
-    "喷嚏": "sneezing",
-    "困惑": "confused",
-    "情绪异常激动的": "hysterical",
-    "无表情": "expressionless",
-    "狂气": "crazy angry smile",
-    "蔑视": "disdain"
-  },
-  "哀": {
-    "哭": "crying",
-    "哭泣": "sobbing",
-    "哭的撕心裂肺": "tearing up",
-    "沮丧": "depressed",
-    "泪如雨下": "streaming tears",
-    "眼含泪水的": "teary-eyed",
-    "眼泪": "tears",
-    "绝望": "despair"
-  },
-  "喜": {
-    "咧嘴笑": "grin",
-    "大笑": ":d",
-    "微笑": "smile",
-    "沾沾自喜的": "smug",
-    "眉毛翘起": "raised eyebrows",
-    "诱人的微笑": "seductive smile",
-    "邪笑": "smirk",
-    "露齿": "clenched teeth",
-    "顽皮的脸": "naughty face"
-  },
-  "嘴": {
-    "嘴唇微开": "parted lips",
-    "张嘴": "open mouth",
-    "方嘴": "rectangular mouth",
-    "波形嘴": "wavy mouth",
-    "猫嘴": "x3",
-    "闭嘴": "closed mouth"
-  },
-  "怒": {
-    "中皱眉": "glaring",
-    "噘嘴": "pout",
-    "大皱眉": "scowl",
-    "小皱眉": "sulking",
-    "恼火": "annoyed",
-    "愤怒": "furious",
-    "眉毛下垂": "furrowed brow"
-  },
-  "惊": {
-    "吓得变色了": "be frightened and change color",
-    "小尖叫": "shouting",
-    "尖叫": "screaming",
-    "惊恐": "horrified",
-    "惊讶": "surprised"
-  },
-  "慌": {
-    "慌张": "flustered",
-    "慌张出汗": "flying sweatdrops",
-    "紧张": "nervous",
-    "紧张出大量的汗": "sweating profusely"
-  },
-  "眼": {
-    "半闭眼": "half closed eyes",
-    "空洞注视": "blank stare",
-    "闭单眼": "blinking",
-    "闭眼": "closed eyes"
-  },
-  "累": {
-    "哈欠": "yawning",
-    "喝醉的": "drunk",
-    "困倦": "sleepy",
-    "无聊": "bored",
-    "精疲力竭的": "exhausted"
-  },
-  "羞": {
-    "害羞": "shy",
-    "尴尬": "embarrassed",
-    "脸红": "blush"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Face.json b/src/novelai_python/utils/prompt_factory/cell/raw/Face.json
deleted file mode 100644
index a7bdb8e..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Face.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "修饰": {
-    "泪痣": "mole under eye",
-    "浓妆": "makeup",
-    "美人痣": "mole under mouth",
-    "胡须(男)": "facial hair",
-    "脸上疤痕": "scar on cheek",
-    "面纹": "facepaint"
-  },
-  "其他": {
-    "大眼睛": "big eyes",
-    "明亮的眼睛": "bright eyes",
-    "漂亮精细的眼睛": "beautiful detailed eyes",
-    "眼睛反射": "eye reflection",
-    "第三只眼": "third eye"
-  },
-  "嘴巴": {
-    "上牙": "upper teech",
-    "唾液": "saliva",
-    "圆齿": "round teeth",
-    "尖牙": "fangs",
-    "牙齿": "teeth",
-    "舌头": "tongue",
-    "虎牙": "skin fang"
-  },
-  "整体": {
-    "动漫脸": "anime face",
-    "可爱脸": "cute face"
-  },
-  "眉毛": {
-    "头发后的眉毛": "eyebrows visible through hair",
-    "男性俊眉": "v shaped eyebrows",
-    "短眉毛": "short eyebrows",
-    "粗眉毛": "thick eyebrows"
-  },
-  "眼部": {
-    "眼睛疤痕": "scar across eye"
-  },
-  "眼部装饰": {
-    "眼影": "eye shadow"
-  },
-  "瞳孔形状": {
-    "失神眼": "empty eyes",
-    "心形眼": "heart-shaped pupils",
-    "星星眼": "star-shaped pupils",
-    "火焰眼": "fire in eyes",
-    "瞳孔放大": "dilated pupils",
-    "竖瞳": "slit pupils",
-    "符号眼": "symbol-shaped pupils"
-  },
-  "颜色": {
-    "不对称虹膜": "asymmetrical irises",
-    "巩膜色": "color:sclera",
-    "异色瞳": "heterochromia",
-    "彩色瞳": "multicolored eyes",
-    "瞳色": "color:eyes",
-    "虹膜色": "color:pupils"
-  },
-  "额头": {
-    "大额头": "big forehead",
-    "额前宝石": "forehead jewel",
-    "额头记号": "forehead mark"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Illustrator.json b/src/novelai_python/utils/prompt_factory/cell/raw/Illustrator.json
deleted file mode 100644
index 08da32b..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Illustrator.json
+++ /dev/null
@@ -1,139 +0,0 @@
-{
-  "画师": {
-    "Anmi": "artist:anmi",
-    "Ask": "artist:ask(askzy)",
-    "BOW": "artist:bow (bhp)",
-    "HOJI": "artist:hoji(hooooooooji1029)",
-    "Hiten": "artist:hiten_(hitenkei)",
-    "Kidmo": "artist:Kidmo",
-    "LM7": "artist:lm7(op-center)",
-    "MeIoN(铭音)": "artist:meion",
-    "Mika Pikazo": "artist:mika_pikazo",
-    "Rebecca": "rebecca_(keinelove)",
-    "Sheya": "artist:sheya",
-    "TID": "artist:tidsean",
-    "Tiv": "artist:tiv",
-    "Tony": "artist:tony_taka",
-    "TrNyteal": "artist:ciloranko",
-    "akizero": "artist:akizero1510",
-    "binggong_asylum": "artist:binggong_asylum",
-    "butterchalk": "artist:butterchalk",
-    "cui (jidanhaidaitang)": "artist:cui_(jidanhaidaitang)",
-    "cutesexyrobutts": "artist:cutesexyrobutts",
-    "fumio936": "artist:fumio_(rsqkr)",
-    "gweda": "artist:gweda",
-    "hews": "artist:hews",
-    "ke-ta": "artist:ke-ta",
-    "kuzuvine": "artist:kuzuvine",
-    "mamimi": "artist:mamimi(mamamimi)",
-    "mignon": "artist:mignon",
-    "milkychu": "artist:milkychu",
-    "missile228": "artist:missile228",
-    "miv4t": "artist:miv4t",
-    "musashi": "artist:musashi(detks)",
-    "nixeu": "artist:nixeu",
-    "null_(nyanpyoun)": "artist:null_(nyanpyoun)",
-    "potg（ぴおてぐ）": "artist:potg(piotegu)",
-    "refeia": "artist:refeia",
-    "rurudo": "artist:rurudo",
-    "shexyo": "artist:shexyo",
-    "sy4": "artist:sy4",
-    "toi8": "artist:toi8",
-    "tokkyu": "artist:tokkyu",
-    "yago8 pp3": "artist:yago8 pp3",
-    "yuuji_(and)": "artist:yuuji_(and)",
-    "あすてろid": "artist:asteroid_ill",
-    "えびふりゃい": "artist:ebifurya",
-    "おにねこ": "artist:onineko",
-    "かすみ": "artist:kasumi_(skchkko)",
-    "かにビーム": "artist:kani_biimu",
-    "きょくちょ局长": "artist:kyockcho",
-    "くっか": "artist:kukka",
-    "くれりて": "artist:clearite",
-    "しおん": "artist:shion(mirudakemann)",
-    "そふらん": "artist:sofra",
-    "たぬまきんぐ": "artist:ikeuchi_tanuma",
-    "にんげんまめ": "artist:ningen_mame",
-    "はあど": "artist:asakuraf",
-    "ひそな": "artist:hisona_(suaritesumi)",
-    "まるかたけ": "artist:katahira_masashi",
-    "みよ": "artist:miyo_(ranthath)",
-    "みるくぱんだ": "artist:milk_panda",
-    "めいと": "artist:meito_(maze)",
-    "ももこ": "artist:momoko(momopoco)",
-    "よー清水": "artist:you_shimizu",
-    "んも": "artist:nanmokaken",
-    "アボガド6": "artist:avogado6",
-    "カントク": "artist:kantoku",
-    "カーミン@やるせない": "artist:kaamin_(mariarose753)",
-    "ゴンジ": "artist:gomzi",
-    "サインこす": "artist:sincos",
-    "シエラ": "artist:cierra(ra-bit)",
-    "トモセシュンサク": "artist:tomose_shunsaku",
-    "トリダモノ": "artist:toridamono",
-    "ピロ水": "artist:piromizu",
-    "マンドリル": "artist:mandrill",
-    "モ誰": "artist:modare",
-    "七瀬尚": "artist:nanase_nao",
-    "八宝备仁": "artist:happoubi_jin",
-    "冰马hyouuma": "artist:hyouuma",
-    "出水 ぽすか": "artist:demizu_posuka",
-    "加藤拓弐": "artist:ishiyumi",
-    "原子dan": "artist:atdan",
-    "吉成曜": "artist:yoshinari_you",
-    "名前はありません": "artist:nanashi_(nlo)",
-    "威未図@いみず": "artist:imizu_(nitro_unknown)",
-    "室埴 ポコ": "artist:poco(asahi age)",
-    "宮瀬まひろ": "artist:miyase_mahiro",
-    "小日子": "artist:liduke",
-    "嵐月": "artist:creayus",
-    "嶺": "artist:reoen",
-    "巨乳重工": "artist:rhasta",
-    "幻象黑兔": "artist:huanxiang_heitu",
-    "御坂12003": "artist:misaka_12003-gou",
-    "心臓弱眞君": "artist:xinzoruo",
-    "悠萩": "artist:yuuhagi_(amaretto-no-natsu)",
-    "旧都なぎ": "artist:qtonagi",
-    "月代(代アニ)": "artist:tsukishiro_saika",
-    "望月けい": "artist:mochizuki_kei",
-    "村上水軍(BDSM画师)": "artist:murakami_suigun",
-    "東西": "artist:touzai(poppin phl95)",
-    "毛玉牛乳": "artist:kedama_milk",
-    "水叔(as109)": "artist:as109",
-    "水月画师": "artist:namie",
-    "河cy": "artist:kawacy",
-    "海源": "artist:kaigen_1025",
-    "涼": "artist:ryou(ryoutarou)",
-    "焦茶": "artist:cogecha",
-    "煮込らし化": "artist:nikorashi-ka",
-    "王凌(wlop)": "artist:wlop",
-    "甘露樹": "artist:amazuyu_tatsuki",
-    "真·alphonse": "artist:alphonse(white_datura)",
-    "石恵": "artist:ishikei",
-    "米山舞": "artist:yoneyama_mai",
-    "糸麦くん": "artist:itomugi-kun",
-    "紅シャケ": "artist:beni_shake",
-    "紺屋鴉江": "artist:konya_karasue",
-    "老累": "artist:rei(sanbonzakura)",
-    "花かざり": "artist:hana_kazari",
-    "荻pote": "artist:ogipote",
-    "菲奇": "artist:fkey",
-    "藤ちょこ": "artist:fuzichoco",
-    "藤真拓哉": "artist:fujima_takuya",
-    "蘑菇": "artist:rella",
-    "血池地獄": "artist:666pigeon",
-    "赤倉": "artist:akakura",
-    "轟将": "artist:sho_(sho_lwlw)",
-    "遠坂あさぎ": "artist:toosaka_asagi",
-    "金蓮": "artist:kinhasu",
-    "防冻液": "artist:tianliang_duohe_fangdongye",
-    "阿戈魔": "artist:omone_hokoma_agm",
-    "雄一郎": "artist:enkyo_yuuichirou",
-    "音符": "artist:infukun",
-    "鬼针草": "artist:chen_bin",
-    "黒ミヤ": "artist:kuromiya",
-    "팬텀크로": "artist:phantom_ix_row",
-    "ﾌﾞﾚｴﾄﾞﾙ": "blade_(galaxist)",
-    "￦ANKE": "artist:wanke"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/Scene.json b/src/novelai_python/utils/prompt_factory/cell/raw/Scene.json
deleted file mode 100644
index 8d069f2..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/Scene.json
+++ /dev/null
@@ -1,184 +0,0 @@
-{
-  "一天": {
-    "夜间": "night",
-    "日出": "sunrise",
-    "晚上": "evening",
-    "深夜": "late at night",
-    "白天": "day",
-    "落日": "sunset",
-    "黄昏": "dusk",
-    "黄金时段": "golden hour"
-  },
-  "光": {
-    "云隙光": "crepuscular rays",
-    "从上而下的光线": "god light",
-    "侧面光": "sidelight",
-    "傍晚背对阳光": "against backlight at dusk",
-    "光": "light",
-    "光线追踪": "ray tracing",
-    "反射": "reflection",
-    "发光": "glowing",
-    "圣光": "holy light",
-    "太阳光束": "sunbeam",
-    "射线光束": "light rays",
-    "戏剧光": "dramatic lighting",
-    "斑驳的阳光": "dappled sunlight",
-    "明暗对比": "chiaroscuro",
-    "晨光": "morning glory",
-    "最佳照明": "best illumination",
-    "月光": "moonlight",
-    "正面光": "frontlight",
-    "浮动光斑": "floating light spot",
-    "涟漪": "ripples",
-    "漂亮精细的发光": "beautiful detailed glow",
-    "漏光": "light leaks",
-    "电影光照": "cinematic lighting",
-    "精细光照": "detailed lighting",
-    "背光": "backlight",
-    "荧光": "glowing light",
-    "过曝光": "overexposure",
-    "逆光": "backlighting",
-    "镜头光晕": "lens flare",
-    "闪光": "glint",
-    "阳光": "sunlight",
-    "阳光透过树木": "sunlight filtering through trees",
-    "霓虹灯": "neon",
-    "黄金时段照明": "golden hour lighting"
-  },
-  "其他画面": {
-    "手办": "figure",
-    "拼贴画": "collage",
-    "照片": "photo",
-    "纸模": "papercraft",
-    "罪犯照片": "mugshot",
-    "表情展示": "expression chart",
-    "表情差分": "expressions"
-  },
-  "其他符号": {
-    "心跳": "heartbeat"
-  },
-  "功能": {
-    "卡牌": "card",
-    "塔罗牌": "tarot",
-    "抱枕": "dakimakura",
-    "海报": "poster",
-    "苏维埃海报": "soviet poster"
-  },
-  "动画": {
-    "伪截图": "fake screeshot",
-    "动画截图": "anime screecap",
-    "原画": "color trace"
-  },
-  "四季": {
-    "冬": "winter",
-    "夏": "summer",
-    "春": "spring",
-    "春季": "spring season",
-    "秋": "autumn"
-  },
-  "封面和书本": {
-    "书本封面": "book cover",
-    "动漫杂志": "megami magazine",
-    "同人志封面": "doujinshi doujin cover",
-    "封面": "cover page",
-    "杂志封面": "magazine cover",
-    "杂志扫图": "magazine scan",
-    "漫画书": "comic book"
-  },
-  "影": {
-    "强烈阴影": "intense shadows",
-    "影": "shadow",
-    "戏剧阴影": "dramatic shadow",
-    "投下阴影": "drop shadow",
-    "最佳阴影": "best shadow",
-    "有影的": "shady",
-    "树影": "tree shade",
-    "眼部阴影": "shading eyes",
-    "阴影": "shade"
-  },
-  "插画和CG": {
-    "人像": "portrait",
-    "官方图": "official art",
-    "插画": "illustration",
-    "游戏CG": "game cg"
-  },
-  "气泡": {
-    "对话气泡": "speech bubble",
-    "想法气泡": "thought bubble",
-    "气泡害羞": "spoken blush",
-    "气泡心": "spoken heart",
-    "气泡音符": "spoken musical note",
-    "气泡！": "spoken exclamation mark note",
-    "气泡？": "spoken question mark note"
-  },
-  "滤镜": {
-    "hdr": "hdr",
-    "剪影": "silhouette",
-    "景深": "depth of field",
-    "模糊": "blurred picture",
-    "模糊前景": "blurry foreground",
-    "模糊背景": "blurry background",
-    "焦散": "caustic",
-    "色像差": "chromatic aberration",
-    "运动模糊": "motion blur",
-    "锐聚焦": "sharp focus",
-    "高斯模糊": "gaussian blur"
-  },
-  "漫画": {
-    "四格漫画": "4koma",
-    "无声漫画": "silent comic",
-    "漫画": "comic"
-  },
-  "画面元素": {
-    "上下黑边": "letterboxed",
-    "圣光(或烟雾和其他物体)打码": "convenient censoring",
-    "描边": "outline",
-    "无人": "no humans",
-    "边缘": "border"
-  },
-  "画面增强": {
-    "令人惊叹的": "amazing",
-    "更多细节": "high detail",
-    "超详细": "ultra-detailed",
-    "非常详细的8k壁纸": "extremely detailed 8k wallpaper"
-  },
-  "线条": {
-    "运动线": "motion lines",
-    "速度线": "speed lines"
-  },
-  "节日": {
-    "七夕节(日本)": "tanabata",
-    "万圣节": "halloween",
-    "圣诞节": "christmas",
-    "情人节": "valentine",
-    "感恩节": "thanksgiving"
-  },
-  "设定": {
-    "Q版": "chibi",
-    "三视图": "three views",
-    "多视角": "multiple views",
-    "角色设定": "character design",
-    "设定集": "artbook"
-  },
-  "音符": {
-    "八分音符": "eighth note",
-    "四分音符": "quarter note",
-    "音乐": "music",
-    "音符": "musical note"
-  },
-  "颜色风格": {
-    "专色": "spot color",
-    "主题色": "color:theme",
-    "半色调": "halftone",
-    "单色调": "monochrome",
-    "哑光": "muted color",
-    "多种颜色": "multicolored",
-    "有限的调色板": "limited palette",
-    "灰阶": "greyscale",
-    "色彩丰富": "colorful",
-    "苍白颜色": "pale color",
-    "部分上色": "partly colored",
-    "霓虹色彩": "neon palette",
-    "高对比": "high contrast"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/cell/raw/r18.json b/src/novelai_python/utils/prompt_factory/cell/raw/r18.json
deleted file mode 100644
index 88199e1..0000000
--- a/src/novelai_python/utils/prompt_factory/cell/raw/r18.json
+++ /dev/null
@@ -1,161 +0,0 @@
-{
-  "17.9tag": {
-    "3P": "threesome",
-    "69式": "69",
-    "一穴多插": "multiple_insertions",
-    "三穴同插": "triple_penetration",
-    "乱伦": "incest",
-    "乳交": "paizuri",
-    "乳头": "nipples",
-    "乳头穿孔": "nipple_piercing",
-    "乳晕": "areolae",
-    "亚洲": "asian",
-    "人兽": "bestiality",
-    "人工阴道": "artificial_vagina",
-    "传教士体位": "missionary",
-    "假屌": "dildo",
-    "兄弟/姐妹/姐弟/兄妹": "stwincest",
-    "公共场所": "public",
-    "内射": "cum_inside",
-    "内裤挂在一条腿上": "panties_around_one_leg",
-    "分腿捆绑": "spreader_bar",
-    "剃过阴毛的（无毛B）": "shaved_pussy",
-    "前后夹攻": "spitroast",
-    "双性": "futanari",
-    "双穴同插": "double_penetration",
-    "双重入穴": "double_vaginal",
-    "双重爆菊": "double_anal",
-    "发交": "hairjob",
-    "口交": "oral/fellatio",
-    "口塞": "gag",
-    "吃人": "vore",
-    "吃精": "gokkun",
-    "吸乳（中）": "breast_sucking/nipple_suck",
-    "哺乳（大范围）": "lactation",
-    "啦乳头": "nipple_pull",
-    "喂奶(小)": "breast_feeding",
-    "在身上计数": "tally",
-    "坐在脸上": "facesitting",
-    "处女": "virgin",
-    "多P乳交": "multiple_paizuri",
-    "大乳头": "puffy_nipples",
-    "大屁股": "huge_ass",
-    "女上体位": "girl_on_top",
-    "女上反骑": "reverse_cowgirl",
-    "女上正骑": "cowgirl_position",
-    "女体盛": "nyotaimori",
-    "女奸男（逆推）": "femdom",
-    "女性使用假屌": "pegging",
-    "奴隶": "slave",
-    "子宫口": "cervix",
-    "宠物链": "leash",
-    "审核过的/有码": "censored",
-    "宽盆骨": "wide_hips",
-    "射出": "ejaculation",
-    "射在头发上": "cum_on_hair",
-    "射在胸上": "cum_on_breast",
-    "射在食物上": "cum_on_food",
-    "射精": "cum",
-    "将要被强暴": "about_to_be_raped",
-    "小乳头": "small_nipples",
-    "尿尿": "peeing",
-    "屁股": "ass",
-    "屌环": "cock_ring",
-    "巨大插入": "large_insertion",
-    "异物插入": "penetration",
-    "强暴": "rape",
-    "快乐做爱": "happy_sex",
-    "思想操控": "mind_control",
-    "性器摩擦": "grinding",
-    "性爱": "sex",
-    "性骚扰": "molestation",
-    "悬空捆绑": "suspension",
-    "憋尿": "have_to_pee",
-    "截肢": "amputee",
-    "手插入": "fingering",
-    "手爆菊": "anal_fingering",
-    "手腕捆绑": "bound_wrists",
-    "手臂捆绑": "bound_arms",
-    "打屁股": "spanked",
-    "扩口器": "ring_gag",
-    "把头塞入胸": "breast_smother",
-    "拳头插入": "fisting",
-    "拳爆菊": "anal_fisting",
-    "按摩棒": "hitachi_magic_wand",
-    "捆绑": "shibari",
-    "捆绑/奴役": "bondage",
-    "捏乳头": "nipple_tweak",
-    "插入物": "insertion",
-    "插在过膝袜里": "cock_in_thighhigh",
-    "摸乳": "breast_grab",
-    "摸索": "groping",
-    "日本黑妹": "ganguro",
-    "曲膝捆绑": "hogtie",
-    "木马": "wooden_horse",
-    "未审核的/无码": "uncensored",
-    "枷锁": "pillory/stocks",
-    "棍塞": "bitgag",
-    "水中做爱": "underwater_sex",
-    "没逼的": "no_pussy",
-    "深喉": "deepthroat",
-    "潮吹": "female_ejaculation",
-    "灌肠": "enema",
-    "爆菊": "anal",
-    "爱液": "pussy_juice",
-    "狗爬式": "doggystyle",
-    "球塞": "ballgag",
-    "用内裤塞口": "panty_gag",
-    "用布勒住嘴": "cleave_gag",
-    "用手做": "handjob",
-    "用手张开屁股": "spread_ass",
-    "用水果蔬菜": "fruit_insertion",
-    "睾丸/蛋蛋": "testicles",
-    "磨豆腐": "tribadism",
-    "穿孔": "piercing",
-    "穿着衣服做爱": "clothed_sex",
-    "窥阴癖": "voyeurism",
-    "绑缚与调教/支配与臣服/施虐与受虐": "bdsm",
-    "绳子": "rope",
-    "羞耻play": "humiliation",
-    "群P": "group_sex/orgy/teamwork",
-    "肉体变形": "transformation",
-    "肚子胀": "stomach_bulge",
-    "肚脐穿孔": "navel_piercing",
-    "肛吻": "anilingus",
-    "肛珠": "anal_beads",
-    "肥逼": "fat_mons",
-    "胯下捆绑": "crotch_rope",
-    "胯部摩擦": "crotch_rub",
-    "胶带封口": "tapegag",
-    "胸罩拉到胸上方": "bra_lift",
-    "腹部三角带": "mound_of_venus",
-    "腿交": "thigh_sex",
-    "臀交": "buttjob",
-    "自慰": "masturbation",
-    "舔阴": "cunnilingus",
-    "菊花": "anus",
-    "菊花插入物": "anal_insertion",
-    "虐乳头": "nipple_torture",
-    "蛋疼": "tamakeri",
-    "血": "blood",
-    "被发现": "caught",
-    "裸露癖": "exhibitionism",
-    "足交": "footjob",
-    "跨坐式": "leg_lock/upright_straddle",
-    "跳蛋": "vibrator",
-    "跳蛋遥控在过膝袜里": "vibrator_in_thighhighs",
-    "身上有字": "body_writing",
-    "轮奸": "gangbang",
-    "进门被发现": "walk-in",
-    "透视人体内部": "x-ray/cross-section/internal_cumshot",
-    "酒倒在阴部": "wakamezake",
-    "阳具/屌": "penis",
-    "阴户（前者图片远大于后者）": "pussy/vaginal",
-    "阴毛": "pubic_hair",
-    "阴蒂": "clitoris",
-    "隔着衣服自慰": "clothed_masturbation",
-    "青蛙捆绑": "frogtie",
-    "颜射": "facial",
-    "骆驼脚趾逼（俗称馒头逼）": "cameltoe"
-  }
-}
\ No newline at end of file
diff --git a/src/novelai_python/utils/prompt_factory/schema.py b/src/novelai_python/utils/prompt_factory/schema.py
deleted file mode 100644
index ecbacc1..0000000
--- a/src/novelai_python/utils/prompt_factory/schema.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# -*- coding: utf-8 -*-
-# @Time    : 2024/2/10 下午2:13
-# @Author  : sudoskys
-# @File    : schema.py
-# @Software: PyCharm
-import random
-
-from pydantic import BaseModel, Field, ConfigDict
-
-
-class CellContent(BaseModel):
-    """
-    单元
-    """
-    title: str = Field("", title="标题")
-    tags: list = Field([], title="标签")
-
-    model_config = ConfigDict()
-
-    def random_tags(self):
-        """
-        随机标签
-        :return:
-        """
-        return random.choice(self.tags)
-
-
-def singleton(cls):
-    _instance = {}
-
-    def _singleton(*args, **kwargs):
-        if cls not in _instance:
-            _instance[cls] = cls(*args, **kwargs)
-        return _instance[cls]
-
-    return _singleton
diff --git a/src/novelai_python/utils/useful.py b/src/novelai_python/utils/useful.py
index 9160309..5a4a7e2 100755
--- a/src/novelai_python/utils/useful.py
+++ b/src/novelai_python/utils/useful.py
@@ -7,9 +7,6 @@
 import random
 from typing import List, Union
 
-import cv2 as cv
-import numpy as np
-
 
 def enum_to_list(enum_):
     return list(map(lambda x: x.value, enum_._member_map_.values()))
@@ -45,80 +42,3 @@ def get(self, user_id: Union[int, str]) -> str:
         user_used.append(selected)
 
         return selected
-
-
-import cv2 as cv
-import numpy as np
-
-
-def create_mask_from_sketch(original_img_bytes: bytes,
-                            sketch_img_bytes: bytes,
-                            min_block_size: int = 15,
-                            jagged_edges: bool = True,
-                            output_format: str = '.png'
-                            ) -> bytes:
-    """
-    Function to create a mask from original and sketch images input as bytes. Returns BytesIO object.
-
-    :param original_img_bytes:  Bytes corresponding to the original image.
-    :param sketch_img_bytes:  Bytes corresponding to the sketch image.
-    :param min_block_size:  The minimum size of the pixel blocks. Default is 1, i.e., no pixelation.
-    :param jagged_edges:  If set to True, the edges of the resulting mask will be more jagged.
-    :param output_format:  Format of the output image. Defaults to '.png'. It could also be '.jpg'
-    :return:  bytes corresponding to the resultant mask
-    """
-
-    # Load images
-    ori_img = cv.imdecode(np.frombuffer(original_img_bytes, np.uint8), cv.IMREAD_COLOR)
-    sketch_img = cv.imdecode(np.frombuffer(sketch_img_bytes, np.uint8), cv.IMREAD_COLOR)
-
-    # Check if images have the same size
-    if ori_img.shape != sketch_img.shape:
-        raise ValueError("Images must have the same size.")
-
-    # Calculate difference between the original and sketch images
-    diff_img = cv.absdiff(ori_img, sketch_img)
-
-    # Convert the difference image to grayscale
-    diff_gray = cv.cvtColor(diff_img, cv.COLOR_BGR2GRAY)
-
-    # Threshold to create the mask
-    _, thresh = cv.threshold(diff_gray, 10, 255, cv.THRESH_BINARY)
-
-    # Create bigger kernel for morphological operations
-    if jagged_edges:
-        # Use a bigger kernel for dilation to create larger 'step' effect at the edges
-        kernel = np.ones((7, 7), np.uint8)
-    else:
-        kernel = np.ones((3, 3), np.uint8)
-
-    # Perform morphological opening to remove small noise
-    opening = cv.morphologyEx(thresh, cv.MORPH_OPEN, kernel, iterations=2)
-
-    # Perform morphological dilation
-    dilation = cv.dilate(opening, kernel, iterations=2)
-
-    # Perform morphological closing to connect separated areas
-    closing = cv.morphologyEx(dilation, cv.MORPH_CLOSE, kernel, iterations=3)
-
-    # Further remove noise with a Gaussian filter
-    smooth = cv.GaussianBlur(closing, (5, 5), 0)
-
-    if min_block_size > 1:
-        # Resize to smaller image, then resize back to original size to create a pixelated effect
-        small = cv.resize(smooth, (smooth.shape[1] // min_block_size, smooth.shape[0] // min_block_size),
-                          interpolation=cv.INTER_LINEAR)
-        smooth = cv.resize(small, (smooth.shape[1], smooth.shape[0]), interpolation=cv.INTER_NEAREST)
-
-    if jagged_edges:
-        # Apply additional thresholding to create sharper, jagged edges
-        _, smooth = cv.threshold(smooth, 128, 255, cv.THRESH_BINARY)
-
-    # Convert image to BytesIO object
-    is_success, buffer = cv.imencode(output_format, smooth)
-    if is_success:
-        output_io = buffer.tobytes()
-    else:
-        raise ValueError("Error during conversion of image to BytesIO object")
-
-    return output_io


Test patch:
diff --git a/tests/test_random_prompt.py b/tests/test_random_prompt.py
index 5080db5..aa8bfb6 100755
--- a/tests/test_random_prompt.py
+++ b/tests/test_random_prompt.py
@@ -4,7 +4,7 @@
 # @File    : test_random_prompt.py
 # @Software: PyCharm
 
-from src.novelai_python.utils.random_prompt import RandomPromptGenerator
+from novelai_python.tool.random_prompt import RandomPromptGenerator
 
 
 def test_generate_returns_string():