diffusion-prompt-embedder 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. diffusion_prompt_embedder-0.3.0/.github/workflows/publish.yml +29 -0
  2. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/.vscode/settings.json +4 -4
  3. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/PKG-INFO +1 -1
  4. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/README.zh-CN.md +119 -119
  5. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/pyproject.toml +104 -104
  6. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/src/diffusion_prompt_embedder/__init__.py +1 -1
  7. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/src/diffusion_prompt_embedder/clip/__init__.py +13 -13
  8. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/src/diffusion_prompt_embedder/clip/tokenization.py +123 -123
  9. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/src/diffusion_prompt_embedder/core/__init__.py +23 -23
  10. diffusion_prompt_embedder-0.3.0/src/diffusion_prompt_embedder/core/embedding.py +102 -0
  11. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/src/diffusion_prompt_embedder/core/parser.py +178 -178
  12. diffusion_prompt_embedder-0.3.0/src/diffusion_prompt_embedder/core/sd15/__init__.py +7 -0
  13. diffusion_prompt_embedder-0.3.0/src/diffusion_prompt_embedder/core/sd15/get_embeddings_sd15.py +124 -0
  14. diffusion_prompt_embedder-0.3.0/src/diffusion_prompt_embedder/core/sd15/get_embeddings_sd15_batch.py +114 -0
  15. diffusion_prompt_embedder-0.3.0/tests/test_clip_skip_layout.py +106 -0
  16. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/tests/test_prompt_parser.py +236 -235
  17. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/uv.lock +491 -491
  18. diffusion_prompt_embedder-0.2.0/src/diffusion_prompt_embedder/core/embedding.py +0 -309
  19. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/.gitignore +0 -0
  20. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/.python-version +0 -0
  21. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/README.md +0 -0
  22. {diffusion_prompt_embedder-0.2.0 → diffusion_prompt_embedder-0.3.0}/src/diffusion_prompt_embedder/py.typed +0 -0
@@ -0,0 +1,29 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: astral-sh/setup-uv@v5
14
+ with:
15
+ enable-cache: true
16
+ - run: uv sync
17
+ - run: uv run ruff check .
18
+ - run: uv run pytest
19
+
20
+ publish:
21
+ needs: test
22
+ runs-on: ubuntu-latest
23
+ permissions:
24
+ id-token: write # PyPI Trusted Publishing (OIDC), no token secret needed
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ - uses: astral-sh/setup-uv@v5
28
+ - run: uv build
29
+ - run: uv publish --trusted-publishing always
@@ -1,5 +1,5 @@
1
- {
2
- "python.testing.pytestArgs": [
3
- "src"
4
- ]
1
+ {
2
+ "python.testing.pytestArgs": [
3
+ "src"
4
+ ]
5
5
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusion-prompt-embedder
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: A Python library for parsing and processing prompts with support for embedding and tokenization.
5
5
  Project-URL: Homepage, https://github.com/jannchie/diffusion-prompt-embedder
6
6
  Project-URL: Bug Tracker, https://github.com/jannchie/diffusion-prompt-embedder/issues
@@ -1,119 +1,119 @@
1
- # Diffusion Prompt Embedder
2
-
3
- [![PyPI version](https://img.shields.io/pypi/v/diffusion-prompt-embedder.svg)](https://pypi.org/project/diffusion-prompt-embedder/)
4
- [![Python Version](https://img.shields.io/pypi/pyversions/diffusion-prompt-embedder.svg)](https://pypi.org/project/diffusion-prompt-embedder/)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
- [![Code Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://github.com/jannchie/diffusion-prompt-embedder)
7
-
8
- 一个专门用于解析和处理带有权重的提示文本的 Python 库,支持嵌入生成和标记化,为 Stable Diffusion 等 AI 模型提供增强的文本处理能力。它兼容 SD Web UI 的权重提示,但不包括调度部分。
9
-
10
- ## 特性
11
-
12
- - 💬 **提示解析**: 解析带有权重标记的文本提示(例如 `a (cat:1.5) in the garden`)
13
- - 🔢 **权重管理**: 支持正向权重 `(text)` 和负向权重 `[text]` 语法
14
- - 📚 **CLIP 集成**: 无缝集成 CLIP 文本模型进行嵌入生成
15
- - 🔄 **批处理支持**: 高效处理多个提示的批处理
16
- - 🪄 **长文本处理**: 支持超出 CLIP 标准上下文长度的长提示
17
-
18
- ## 安装
19
-
20
- 使用 pip 安装基础库:
21
-
22
- ```bash
23
- pip install diffusion-prompt-embedder
24
- ```
25
-
26
- ## 使用示例
27
-
28
- ### 解析带有权重的提示
29
-
30
- ```python
31
- from diffusion_prompt_embedder import parse_prompt_attention
32
-
33
- # 基本解析
34
- result = parse_prompt_attention("a (cat:1.5) in the garden")
35
- print(result) # [['a ', 1.0], ['cat', 1.5], [' in the garden', 1.0]]
36
-
37
- # 使用方括号降低权重
38
- result = parse_prompt_attention("a [cat] in the garden")
39
- print(result) # [['a ', 1.0], ['cat', 0.9090909090909091], [' in the garden', 1.0]]
40
-
41
- # 复杂提示示例
42
- result = parse_prompt_attention("a (((house:1.3)) [on] a (hill:0.5), sun, (((sky))).")
43
- print(result)
44
- ```
45
-
46
- ### 生成 CLIP 嵌入
47
-
48
- ```python
49
- import torch
50
- from transformers import CLIPTokenizer, CLIPTextModel
51
- from prompt_parser import get_embeddings_sd15
52
-
53
- # 初始化 CLIP 模型
54
- tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14")
55
- text_encoder = CLIPTextModel.from_pretrained(
56
- "openai/clip-vit-large-patch14",
57
- torch_dtype=torch.float16
58
- ).to("cuda")
59
-
60
- # 生成嵌入
61
- prompt_embeds, neg_prompt_embeds = get_embeddings_sd15(
62
- tokenizer=tokenizer,
63
- text_encoder=text_encoder,
64
- prompt="a (white:1.2) cat",
65
- neg_prompt="blur, bad quality",
66
- clip_skip=1 # 可选:跳过 CLIP 模型中的层
67
- )
68
-
69
- # 批处理多个提示
70
- from prompt_parser import get_embeddings_sd_15_batch
71
-
72
- batch_embeds = get_embeddings_sd_15_batch(
73
- tokenizer=tokenizer,
74
- text_encoder=text_encoder,
75
- prompts=["a (white:1.2) cat", "a (blue:1.4) dog", "a red bird"]
76
- )
77
- ```
78
-
79
- ## 提示语法
80
-
81
- ### 基本权重语法
82
-
83
- - `(text)` - 将提示的权重提升 1.1 倍
84
- - `(text:1.5)` - 将提示的权重设置为 1.5
85
- - `[text]` - 将提示的权重降低为原来的 1/1.1
86
- - `\( \[ \) \]` - 使用反斜杠转义括号字符
87
-
88
- ### BREAK 语法
89
-
90
- 使用 `BREAK` 关键字在提示中创建断点:
91
-
92
- ```python
93
- result = parse_prompt_attention("text1 BREAK text2")
94
- # 结果: [["text1", 1.0], ["BREAK", -1], ["text2", 1.0]]
95
- ```
96
-
97
- ## 开发
98
-
99
- 克隆仓库并安装开发依赖:
100
-
101
- ```bash
102
- git clone https://github.com/jannchie/diffusion-prompt-parser.git
103
- cd diffusion-prompt-parser
104
- pip install -e ".[dev]"
105
- ```
106
-
107
- 运行测试:
108
-
109
- ```bash
110
- pytest
111
- ```
112
-
113
- ## 许可证
114
-
115
- [MIT](https://opensource.org/licenses/MIT)
116
-
117
- ## 作者
118
-
119
- - Jianqi Pan ([@jannchie](https://github.com/jannchie))
1
+ # Diffusion Prompt Embedder
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/diffusion-prompt-embedder.svg)](https://pypi.org/project/diffusion-prompt-embedder/)
4
+ [![Python Version](https://img.shields.io/pypi/pyversions/diffusion-prompt-embedder.svg)](https://pypi.org/project/diffusion-prompt-embedder/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Code Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://github.com/jannchie/diffusion-prompt-embedder)
7
+
8
+ 一个专门用于解析和处理带有权重的提示文本的 Python 库,支持嵌入生成和标记化,为 Stable Diffusion 等 AI 模型提供增强的文本处理能力。它兼容 SD Web UI 的权重提示,但不包括调度部分。
9
+
10
+ ## 特性
11
+
12
+ - 💬 **提示解析**: 解析带有权重标记的文本提示(例如 `a (cat:1.5) in the garden`)
13
+ - 🔢 **权重管理**: 支持正向权重 `(text)` 和负向权重 `[text]` 语法
14
+ - 📚 **CLIP 集成**: 无缝集成 CLIP 文本模型进行嵌入生成
15
+ - 🔄 **批处理支持**: 高效处理多个提示的批处理
16
+ - 🪄 **长文本处理**: 支持超出 CLIP 标准上下文长度的长提示
17
+
18
+ ## 安装
19
+
20
+ 使用 pip 安装基础库:
21
+
22
+ ```bash
23
+ pip install diffusion-prompt-embedder
24
+ ```
25
+
26
+ ## 使用示例
27
+
28
+ ### 解析带有权重的提示
29
+
30
+ ```python
31
+ from diffusion_prompt_embedder import parse_prompt_attention
32
+
33
+ # 基本解析
34
+ result = parse_prompt_attention("a (cat:1.5) in the garden")
35
+ print(result) # [['a ', 1.0], ['cat', 1.5], [' in the garden', 1.0]]
36
+
37
+ # 使用方括号降低权重
38
+ result = parse_prompt_attention("a [cat] in the garden")
39
+ print(result) # [['a ', 1.0], ['cat', 0.9090909090909091], [' in the garden', 1.0]]
40
+
41
+ # 复杂提示示例
42
+ result = parse_prompt_attention("a (((house:1.3)) [on] a (hill:0.5), sun, (((sky))).")
43
+ print(result)
44
+ ```
45
+
46
+ ### 生成 CLIP 嵌入
47
+
48
+ ```python
49
+ import torch
50
+ from transformers import CLIPTokenizer, CLIPTextModel
51
+ from prompt_parser import get_embeddings_sd15
52
+
53
+ # 初始化 CLIP 模型
54
+ tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14")
55
+ text_encoder = CLIPTextModel.from_pretrained(
56
+ "openai/clip-vit-large-patch14",
57
+ torch_dtype=torch.float16
58
+ ).to("cuda")
59
+
60
+ # 生成嵌入
61
+ prompt_embeds, neg_prompt_embeds = get_embeddings_sd15(
62
+ tokenizer=tokenizer,
63
+ text_encoder=text_encoder,
64
+ prompt="a (white:1.2) cat",
65
+ neg_prompt="blur, bad quality",
66
+ clip_skip=1 # 可选:跳过 CLIP 模型中的层
67
+ )
68
+
69
+ # 批处理多个提示
70
+ from prompt_parser import get_embeddings_sd_15_batch
71
+
72
+ batch_embeds = get_embeddings_sd_15_batch(
73
+ tokenizer=tokenizer,
74
+ text_encoder=text_encoder,
75
+ prompts=["a (white:1.2) cat", "a (blue:1.4) dog", "a red bird"]
76
+ )
77
+ ```
78
+
79
+ ## 提示语法
80
+
81
+ ### 基本权重语法
82
+
83
+ - `(text)` - 将提示的权重提升 1.1 倍
84
+ - `(text:1.5)` - 将提示的权重设置为 1.5
85
+ - `[text]` - 将提示的权重降低为原来的 1/1.1
86
+ - `\( \[ \) \]` - 使用反斜杠转义括号字符
87
+
88
+ ### BREAK 语法
89
+
90
+ 使用 `BREAK` 关键字在提示中创建断点:
91
+
92
+ ```python
93
+ result = parse_prompt_attention("text1 BREAK text2")
94
+ # 结果: [["text1", 1.0], ["BREAK", -1], ["text2", 1.0]]
95
+ ```
96
+
97
+ ## 开发
98
+
99
+ 克隆仓库并安装开发依赖:
100
+
101
+ ```bash
102
+ git clone https://github.com/jannchie/diffusion-prompt-parser.git
103
+ cd diffusion-prompt-parser
104
+ pip install -e ".[dev]"
105
+ ```
106
+
107
+ 运行测试:
108
+
109
+ ```bash
110
+ pytest
111
+ ```
112
+
113
+ ## 许可证
114
+
115
+ [MIT](https://opensource.org/licenses/MIT)
116
+
117
+ ## 作者
118
+
119
+ - Jianqi Pan ([@jannchie](https://github.com/jannchie))
@@ -1,104 +1,104 @@
1
- [project]
2
- name = "diffusion-prompt-embedder"
3
- version = "0.2.0"
4
- description = "A Python library for parsing and processing prompts with support for embedding and tokenization."
5
- readme = "README.md"
6
- authors = [{ name = "Jianqi Pan", email = "jannchie@gmail.com" }]
7
- requires-python = ">=3.10"
8
- license = { text = "MIT" }
9
- keywords = [
10
- "nlp",
11
- "prompt",
12
- "tokenization",
13
- "embedding",
14
- "ai",
15
- "stable diffusion",
16
- ]
17
- classifiers = [
18
- "Development Status :: 4 - Beta",
19
- "Intended Audience :: Developers",
20
- "License :: OSI Approved :: MIT License",
21
- "Programming Language :: Python :: 3",
22
- "Programming Language :: Python :: 3.10",
23
- "Programming Language :: Python :: 3.11",
24
- "Programming Language :: Python :: 3.12",
25
- "Programming Language :: Python :: 3.13",
26
- "Programming Language :: Python :: 3.14",
27
- "Topic :: Scientific/Engineering :: Artificial Intelligence",
28
- ]
29
- dependencies = []
30
-
31
- [project.urls]
32
- "Homepage" = "https://github.com/jannchie/diffusion-prompt-embedder"
33
- "Bug Tracker" = "https://github.com/jannchie/diffusion-prompt-embedder/issues"
34
- "Documentation" = "https://github.com/jannchie/diffusion-prompt-embedder#readme"
35
-
36
- [build-system]
37
- requires = ["hatchling"]
38
- build-backend = "hatchling.build"
39
-
40
- [tool.hatch.build.targets.wheel]
41
- packages = ["src/diffusion_prompt_embedder"]
42
-
43
- [tool.ruff]
44
- line-length = 160
45
- select = ["ALL"]
46
-
47
- ignore = [
48
- "PGH",
49
- "RUF003",
50
- "BLE001",
51
- "ERA001",
52
- "FIX002",
53
- "TD002",
54
- "TD003",
55
- "D",
56
- "PLR2004",
57
- "INP001",
58
- "N812",
59
- "FBT003",
60
- "S311",
61
- "ANN401",
62
- "S105",
63
- ]
64
-
65
- [tool.ruff.per-file-ignores]
66
- "tests/**/*.py" = ["S101"]
67
-
68
- [project.optional-dependencies]
69
- torch = ["torch>=2.0.0"]
70
- transformers = ["transformers>=4.51.3"]
71
- all = ["torch>=2.0.0", "transformers>=4.51.3"]
72
- dev = [
73
- "pytest>=8.3.5",
74
- "pytest-cov>=6.1.1",
75
- "torch>=2.0.0",
76
- "transformers>=4.51.3",
77
- ]
78
-
79
- [dependency-groups]
80
- dev = [
81
- "pytest>=8.3.5",
82
- "pytest-cov>=6.1.1",
83
- "ruff>=0.11.8",
84
- "torch>=2.0.0",
85
- "transformers>=4.51.3",
86
- ]
87
-
88
- [tool.pytest.ini_options]
89
- addopts = "--cov=diffusion_prompt_embedder --cov-report=term --cov-report=xml --tb=short"
90
- testpaths = ["tests"]
91
-
92
- [tool.coverage.run]
93
- source = ["diffusion_prompt_embedder"]
94
- omit = ["*/__pycache__/*", "*/tests/*"]
95
-
96
- [tool.coverage.report]
97
- exclude_lines = [
98
- "pragma: no cover",
99
- "def __repr__",
100
- "raise NotImplementedError",
101
- "if __name__ == .__main__.:",
102
- "pass",
103
- "raise ImportError",
104
- ]
1
+ [project]
2
+ name = "diffusion-prompt-embedder"
3
+ version = "0.3.0"
4
+ description = "A Python library for parsing and processing prompts with support for embedding and tokenization."
5
+ readme = "README.md"
6
+ authors = [{ name = "Jianqi Pan", email = "jannchie@gmail.com" }]
7
+ requires-python = ">=3.10"
8
+ license = { text = "MIT" }
9
+ keywords = [
10
+ "nlp",
11
+ "prompt",
12
+ "tokenization",
13
+ "embedding",
14
+ "ai",
15
+ "stable diffusion",
16
+ ]
17
+ classifiers = [
18
+ "Development Status :: 4 - Beta",
19
+ "Intended Audience :: Developers",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Programming Language :: Python :: 3",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Programming Language :: Python :: 3.14",
27
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
28
+ ]
29
+ dependencies = []
30
+
31
+ [project.urls]
32
+ "Homepage" = "https://github.com/jannchie/diffusion-prompt-embedder"
33
+ "Bug Tracker" = "https://github.com/jannchie/diffusion-prompt-embedder/issues"
34
+ "Documentation" = "https://github.com/jannchie/diffusion-prompt-embedder#readme"
35
+
36
+ [build-system]
37
+ requires = ["hatchling"]
38
+ build-backend = "hatchling.build"
39
+
40
+ [tool.hatch.build.targets.wheel]
41
+ packages = ["src/diffusion_prompt_embedder"]
42
+
43
+ [tool.ruff]
44
+ line-length = 160
45
+ select = ["ALL"]
46
+
47
+ ignore = [
48
+ "PGH",
49
+ "RUF003",
50
+ "BLE001",
51
+ "ERA001",
52
+ "FIX002",
53
+ "TD002",
54
+ "TD003",
55
+ "D",
56
+ "PLR2004",
57
+ "INP001",
58
+ "N812",
59
+ "FBT003",
60
+ "S311",
61
+ "ANN401",
62
+ "S105",
63
+ ]
64
+
65
+ [tool.ruff.per-file-ignores]
66
+ "tests/**/*.py" = ["S101"]
67
+
68
+ [project.optional-dependencies]
69
+ torch = ["torch>=2.0.0"]
70
+ transformers = ["transformers>=4.51.3"]
71
+ all = ["torch>=2.0.0", "transformers>=4.51.3"]
72
+ dev = [
73
+ "pytest>=8.3.5",
74
+ "pytest-cov>=6.1.1",
75
+ "torch>=2.0.0",
76
+ "transformers>=4.51.3",
77
+ ]
78
+
79
+ [dependency-groups]
80
+ dev = [
81
+ "pytest>=8.3.5",
82
+ "pytest-cov>=6.1.1",
83
+ "ruff>=0.11.8",
84
+ "torch>=2.0.0",
85
+ "transformers>=4.51.3",
86
+ ]
87
+
88
+ [tool.pytest.ini_options]
89
+ addopts = "--cov=diffusion_prompt_embedder --cov-report=term --cov-report=xml --tb=short"
90
+ testpaths = ["tests"]
91
+
92
+ [tool.coverage.run]
93
+ source = ["diffusion_prompt_embedder"]
94
+ omit = ["*/__pycache__/*", "*/tests/*"]
95
+
96
+ [tool.coverage.report]
97
+ exclude_lines = [
98
+ "pragma: no cover",
99
+ "def __repr__",
100
+ "raise NotImplementedError",
101
+ "if __name__ == .__main__.:",
102
+ "pass",
103
+ "raise ImportError",
104
+ ]
@@ -7,8 +7,8 @@ tokenizing prompts, and generating embeddings for use with Stable Diffusion mode
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- from diffusion_prompt_embedder.core.embedding import get_embeddings_sd15, get_embeddings_sd15_batch
11
10
  from diffusion_prompt_embedder.core.parser import parse_prompt_attention
11
+ from diffusion_prompt_embedder.core.sd15 import get_embeddings_sd15, get_embeddings_sd15_batch
12
12
 
13
13
  __all__ = [
14
14
  "get_embeddings_sd15",
@@ -1,13 +1,13 @@
1
- """
2
- CLIP model functionality for embedding generation.
3
- """
4
-
5
- from diffusion_prompt_embedder.clip.tokenization import (
6
- get_prompts_tokens_with_weights,
7
- group_tokens_and_weights,
8
- )
9
-
10
- __all__ = [
11
- "get_prompts_tokens_with_weights",
12
- "group_tokens_and_weights",
13
- ]
1
+ """
2
+ CLIP model functionality for embedding generation.
3
+ """
4
+
5
+ from diffusion_prompt_embedder.clip.tokenization import (
6
+ get_prompts_tokens_with_weights,
7
+ group_tokens_and_weights,
8
+ )
9
+
10
+ __all__ = [
11
+ "get_prompts_tokens_with_weights",
12
+ "group_tokens_and_weights",
13
+ ]