img-cli 0.1.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.
- img_cli-0.1.0/.github/workflows/publish.yml +47 -0
- img_cli-0.1.0/.gitignore +64 -0
- img_cli-0.1.0/LICENSE +21 -0
- img_cli-0.1.0/PKG-INFO +139 -0
- img_cli-0.1.0/README.md +125 -0
- img_cli-0.1.0/assets/poster.png +0 -0
- img_cli-0.1.0/pyproject.toml +58 -0
- img_cli-0.1.0/skills/img-cli/SKILL.md +173 -0
- img_cli-0.1.0/src/img_cli/__init__.py +13 -0
- img_cli-0.1.0/src/img_cli/_version.py +24 -0
- img_cli-0.1.0/src/img_cli/cli.py +264 -0
- img_cli-0.1.0/src/img_cli/client.py +189 -0
- img_cli-0.1.0/src/img_cli/config.py +71 -0
- img_cli-0.1.0/src/img_cli/image_utils.py +159 -0
- img_cli-0.1.0/src/img_cli/logger.py +90 -0
- img_cli-0.1.0/tests/__init__.py +1 -0
- img_cli-0.1.0/tests/conftest.py +51 -0
- img_cli-0.1.0/tests/test_cli.py +200 -0
- img_cli-0.1.0/tests/test_client.py +122 -0
- img_cli-0.1.0/tests/test_config.py +69 -0
- img_cli-0.1.0/tests/test_image_utils.py +97 -0
- img_cli-0.1.0/tests/test_logger.py +78 -0
- img_cli-0.1.0/uv.lock +763 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build-and-publish:
|
|
10
|
+
name: Build package and publish to PyPI
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
environment:
|
|
13
|
+
name: pypi
|
|
14
|
+
url: https://pypi.org/p/img-cli
|
|
15
|
+
permissions:
|
|
16
|
+
id-token: write # Required for PyPI Trusted Publishing (OIDC)
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
with:
|
|
23
|
+
fetch-depth: 0 # Fetch all history and tags for hatch-vcs dynamic versioning
|
|
24
|
+
|
|
25
|
+
- name: Install uv
|
|
26
|
+
uses: astral-sh/setup-uv@v5
|
|
27
|
+
with:
|
|
28
|
+
enable-cache: true
|
|
29
|
+
|
|
30
|
+
- name: Set up Python
|
|
31
|
+
uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version-file: "pyproject.toml"
|
|
34
|
+
|
|
35
|
+
- name: Run tests
|
|
36
|
+
run: |
|
|
37
|
+
uv run pytest -v
|
|
38
|
+
|
|
39
|
+
- name: Build package
|
|
40
|
+
run: |
|
|
41
|
+
uv build
|
|
42
|
+
|
|
43
|
+
- name: Publish to PyPI
|
|
44
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
45
|
+
with:
|
|
46
|
+
packages-dir: dist/
|
|
47
|
+
skip-existing: true
|
img_cli-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
src/img_cli/_version.py
|
|
29
|
+
|
|
30
|
+
# Virtual Environments
|
|
31
|
+
.venv/
|
|
32
|
+
env/
|
|
33
|
+
venv/
|
|
34
|
+
ENV/
|
|
35
|
+
env.bak/
|
|
36
|
+
venv.bak/
|
|
37
|
+
|
|
38
|
+
# Testing and coverage
|
|
39
|
+
.cache
|
|
40
|
+
.pytest_cache/
|
|
41
|
+
.coverage
|
|
42
|
+
.coverage.*
|
|
43
|
+
htmlcov/
|
|
44
|
+
nosetests.xml
|
|
45
|
+
coverage.xml
|
|
46
|
+
*.cover
|
|
47
|
+
*.py,cover
|
|
48
|
+
.hypothesis/
|
|
49
|
+
|
|
50
|
+
# IDE & Editor files
|
|
51
|
+
.idea/
|
|
52
|
+
.vscode/
|
|
53
|
+
*.swp
|
|
54
|
+
*.swo
|
|
55
|
+
*~
|
|
56
|
+
|
|
57
|
+
# Operating System files
|
|
58
|
+
.DS_Store
|
|
59
|
+
.DS_Store?
|
|
60
|
+
._*
|
|
61
|
+
.Spotlight-V100
|
|
62
|
+
.Trashes
|
|
63
|
+
ehthumbs.db
|
|
64
|
+
Thumbs.db
|
img_cli-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 8DE4732A
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
img_cli-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: img-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: CLI tool for OpenAI-compatible Image Generation and Editing
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Requires-Dist: click>=8.1.7
|
|
8
|
+
Requires-Dist: httpx>=0.27.0
|
|
9
|
+
Requires-Dist: openai>=1.50.0
|
|
10
|
+
Requires-Dist: pillow>=10.2.0
|
|
11
|
+
Requires-Dist: pydantic>=2.6.0
|
|
12
|
+
Requires-Dist: rich>=13.7.0
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
|
|
15
|
+
# img-cli
|
|
16
|
+
|
|
17
|
+
命令行图片生成与编辑工具,基于 Python + uv 开发,封装 OpenAI 兼容的 Images API(文生图 `generate` 与图生图编辑 `edit`)。
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<img src="assets/poster.png" alt="img-cli Poster" width="600" />
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 特性
|
|
26
|
+
|
|
27
|
+
- 🚀 **简单易用**:一行命令完成图片生成和图片编辑。
|
|
28
|
+
- 🔑 **灵活认证**:支持 `~/.img_gen/auth.json` 配置文件及环境变量。
|
|
29
|
+
- 📝 **审计日志**:自动在 `~/.img_gen/img.log` 记录每次请求详情(JSON Lines 格式)。
|
|
30
|
+
- 🖼️ **格式与尺寸自适应**:支持 PNG / JPEG / WEBP,自动进行 RGBA 蒙版和格式转换。
|
|
31
|
+
- 🌐 **网络与本地图片支持**:编辑模式下原图和蒙版均支持本地路径(含 `~`)及 HTTP/HTTPS URL。
|
|
32
|
+
- 🤖 **Agent 友好**:清晰的标准输出与结构化错误码,便于自动化工作流接入。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 安装与环境准备
|
|
37
|
+
|
|
38
|
+
### 通过 PyPI 安装
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 使用 uv 工具安装(推荐)
|
|
42
|
+
uv tool install img-cli
|
|
43
|
+
|
|
44
|
+
# 或通过 pip 安装
|
|
45
|
+
pip install img-cli
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 本地开发与运行
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 1. 运行测试 / 调试
|
|
52
|
+
uv run img-cli --help
|
|
53
|
+
|
|
54
|
+
# 2. 从源码安装 CLI
|
|
55
|
+
uv tool install .
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 认证配置
|
|
61
|
+
|
|
62
|
+
首次使用前,请创建配置文件 `~/.img_gen/auth.json`:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
mkdir -p ~/.img_gen
|
|
66
|
+
echo '{"api_key":"sk-xxx","api_base":"https://api.openai.com/v1"}' > ~/.img_gen/auth.json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
也可通过环境变量传入:
|
|
70
|
+
- `OPENAI_API_KEY`(或 `IMG_GEN_API_KEY`)
|
|
71
|
+
- `OPENAI_BASE_URL`(或 `OPENAI_API_BASE` / `IMG_GEN_API_BASE`)
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 快速使用
|
|
76
|
+
|
|
77
|
+
### 1. 文生图 (generate)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 基础生成(默认模型 gpt-image-2,保存至当前目录)
|
|
81
|
+
img-cli generate "一只戴墨镜的猫坐在沙滩上"
|
|
82
|
+
|
|
83
|
+
# 指定模型、尺寸与输出目录
|
|
84
|
+
img-cli generate "a futuristic city at sunset" -m dall-e-3 -s 1792x1024 -q hd -o ~/Desktop
|
|
85
|
+
|
|
86
|
+
# 指定输出格式为 JPEG
|
|
87
|
+
img-cli generate "产品白底宣传图,极简风格" -m gpt-image-1 -q high --format jpeg -o ./output
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 2. 图片编辑 (edit)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# 本地图片全图编辑
|
|
94
|
+
img-cli edit "给猫戴上一顶红色圣诞帽" --image ./cat.png -o ./output
|
|
95
|
+
|
|
96
|
+
# 网络图片直接编辑
|
|
97
|
+
img-cli edit "替换背景为星空" --image https://example.com/photo.jpg -o ./output
|
|
98
|
+
|
|
99
|
+
# 带蒙版的局部编辑(蒙版透明区域为待修改区域)
|
|
100
|
+
img-cli edit "用一朵玫瑰替换这里" --image ./photo.png --mask ./mask.png -o ./output
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 命令参数参考
|
|
106
|
+
|
|
107
|
+
### `img-cli generate <prompt>`
|
|
108
|
+
|
|
109
|
+
| 参数 | 默认值 | 说明 |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `prompt` | 必填 | 提示词(支持中文与英文) |
|
|
112
|
+
| `-m`, `--model` | `gpt-image-2` | 模型名称(如 `gpt-image-2`, `dall-e-3`, `gpt-image-1`) |
|
|
113
|
+
| `-s`, `--size` | `1024x1024` | 尺寸(如 `1024x1024`, `1536x1024`, `1024x1536`, `auto`) |
|
|
114
|
+
| `-q`, `--quality` | 无 | 质量(`low` / `medium` / `high` / `auto` / `standard` / `hd`) |
|
|
115
|
+
| `-n`, `--n` | `1` | 生成张数 |
|
|
116
|
+
| `-o`, `--output` | `.` | 图片输出目录 |
|
|
117
|
+
| `--format` | `png` | 输出格式:`png` / `jpeg` / `webp` |
|
|
118
|
+
|
|
119
|
+
### `img-cli edit <prompt>`
|
|
120
|
+
|
|
121
|
+
| 参数 | 默认值 | 说明 |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| `prompt` | 必填 | 修改描述 |
|
|
124
|
+
| `-i`, `--image` | 必填 | 原图:本地路径或 HTTP/HTTPS URL |
|
|
125
|
+
| `--mask` | 无 | 蒙版:本地路径或 URL(PNG 透明区域待修改) |
|
|
126
|
+
| `-m`, `--model` | `gpt-image-2` | 模型名称 |
|
|
127
|
+
| `-s`, `--size` | `auto` | 尺寸 |
|
|
128
|
+
| `-q`, `--quality` | `auto` | 质量 |
|
|
129
|
+
| `-n`, `--n` | `1` | 生成张数 |
|
|
130
|
+
| `-o`, `--output` | `.` | 图片输出目录 |
|
|
131
|
+
| `--format` | `png` | 输出格式:`png` / `jpeg` / `webp` |
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 运行测试
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
uv run pytest -v
|
|
139
|
+
```
|
img_cli-0.1.0/README.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# img-cli
|
|
2
|
+
|
|
3
|
+
命令行图片生成与编辑工具,基于 Python + uv 开发,封装 OpenAI 兼容的 Images API(文生图 `generate` 与图生图编辑 `edit`)。
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="assets/poster.png" alt="img-cli Poster" width="600" />
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 特性
|
|
12
|
+
|
|
13
|
+
- 🚀 **简单易用**:一行命令完成图片生成和图片编辑。
|
|
14
|
+
- 🔑 **灵活认证**:支持 `~/.img_gen/auth.json` 配置文件及环境变量。
|
|
15
|
+
- 📝 **审计日志**:自动在 `~/.img_gen/img.log` 记录每次请求详情(JSON Lines 格式)。
|
|
16
|
+
- 🖼️ **格式与尺寸自适应**:支持 PNG / JPEG / WEBP,自动进行 RGBA 蒙版和格式转换。
|
|
17
|
+
- 🌐 **网络与本地图片支持**:编辑模式下原图和蒙版均支持本地路径(含 `~`)及 HTTP/HTTPS URL。
|
|
18
|
+
- 🤖 **Agent 友好**:清晰的标准输出与结构化错误码,便于自动化工作流接入。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 安装与环境准备
|
|
23
|
+
|
|
24
|
+
### 通过 PyPI 安装
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 使用 uv 工具安装(推荐)
|
|
28
|
+
uv tool install img-cli
|
|
29
|
+
|
|
30
|
+
# 或通过 pip 安装
|
|
31
|
+
pip install img-cli
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 本地开发与运行
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 1. 运行测试 / 调试
|
|
38
|
+
uv run img-cli --help
|
|
39
|
+
|
|
40
|
+
# 2. 从源码安装 CLI
|
|
41
|
+
uv tool install .
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 认证配置
|
|
47
|
+
|
|
48
|
+
首次使用前,请创建配置文件 `~/.img_gen/auth.json`:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
mkdir -p ~/.img_gen
|
|
52
|
+
echo '{"api_key":"sk-xxx","api_base":"https://api.openai.com/v1"}' > ~/.img_gen/auth.json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
也可通过环境变量传入:
|
|
56
|
+
- `OPENAI_API_KEY`(或 `IMG_GEN_API_KEY`)
|
|
57
|
+
- `OPENAI_BASE_URL`(或 `OPENAI_API_BASE` / `IMG_GEN_API_BASE`)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 快速使用
|
|
62
|
+
|
|
63
|
+
### 1. 文生图 (generate)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# 基础生成(默认模型 gpt-image-2,保存至当前目录)
|
|
67
|
+
img-cli generate "一只戴墨镜的猫坐在沙滩上"
|
|
68
|
+
|
|
69
|
+
# 指定模型、尺寸与输出目录
|
|
70
|
+
img-cli generate "a futuristic city at sunset" -m dall-e-3 -s 1792x1024 -q hd -o ~/Desktop
|
|
71
|
+
|
|
72
|
+
# 指定输出格式为 JPEG
|
|
73
|
+
img-cli generate "产品白底宣传图,极简风格" -m gpt-image-1 -q high --format jpeg -o ./output
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2. 图片编辑 (edit)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 本地图片全图编辑
|
|
80
|
+
img-cli edit "给猫戴上一顶红色圣诞帽" --image ./cat.png -o ./output
|
|
81
|
+
|
|
82
|
+
# 网络图片直接编辑
|
|
83
|
+
img-cli edit "替换背景为星空" --image https://example.com/photo.jpg -o ./output
|
|
84
|
+
|
|
85
|
+
# 带蒙版的局部编辑(蒙版透明区域为待修改区域)
|
|
86
|
+
img-cli edit "用一朵玫瑰替换这里" --image ./photo.png --mask ./mask.png -o ./output
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 命令参数参考
|
|
92
|
+
|
|
93
|
+
### `img-cli generate <prompt>`
|
|
94
|
+
|
|
95
|
+
| 参数 | 默认值 | 说明 |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `prompt` | 必填 | 提示词(支持中文与英文) |
|
|
98
|
+
| `-m`, `--model` | `gpt-image-2` | 模型名称(如 `gpt-image-2`, `dall-e-3`, `gpt-image-1`) |
|
|
99
|
+
| `-s`, `--size` | `1024x1024` | 尺寸(如 `1024x1024`, `1536x1024`, `1024x1536`, `auto`) |
|
|
100
|
+
| `-q`, `--quality` | 无 | 质量(`low` / `medium` / `high` / `auto` / `standard` / `hd`) |
|
|
101
|
+
| `-n`, `--n` | `1` | 生成张数 |
|
|
102
|
+
| `-o`, `--output` | `.` | 图片输出目录 |
|
|
103
|
+
| `--format` | `png` | 输出格式:`png` / `jpeg` / `webp` |
|
|
104
|
+
|
|
105
|
+
### `img-cli edit <prompt>`
|
|
106
|
+
|
|
107
|
+
| 参数 | 默认值 | 说明 |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| `prompt` | 必填 | 修改描述 |
|
|
110
|
+
| `-i`, `--image` | 必填 | 原图:本地路径或 HTTP/HTTPS URL |
|
|
111
|
+
| `--mask` | 无 | 蒙版:本地路径或 URL(PNG 透明区域待修改) |
|
|
112
|
+
| `-m`, `--model` | `gpt-image-2` | 模型名称 |
|
|
113
|
+
| `-s`, `--size` | `auto` | 尺寸 |
|
|
114
|
+
| `-q`, `--quality` | `auto` | 质量 |
|
|
115
|
+
| `-n`, `--n` | `1` | 生成张数 |
|
|
116
|
+
| `-o`, `--output` | `.` | 图片输出目录 |
|
|
117
|
+
| `--format` | `png` | 输出格式:`png` / `jpeg` / `webp` |
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 运行测试
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
uv run pytest -v
|
|
125
|
+
```
|
|
Binary file
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "img-cli"
|
|
3
|
+
dynamic = ["version"]
|
|
4
|
+
description = "CLI tool for OpenAI-compatible Image Generation and Editing"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
dependencies = [
|
|
8
|
+
"click>=8.1.7",
|
|
9
|
+
"httpx>=0.27.0",
|
|
10
|
+
"openai>=1.50.0",
|
|
11
|
+
"pillow>=10.2.0",
|
|
12
|
+
"rich>=13.7.0",
|
|
13
|
+
"pydantic>=2.6.0",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[project.scripts]
|
|
17
|
+
img-cli = "img_cli.cli:main"
|
|
18
|
+
|
|
19
|
+
[build-system]
|
|
20
|
+
requires = ["hatchling", "hatch-vcs"]
|
|
21
|
+
build-backend = "hatchling.build"
|
|
22
|
+
|
|
23
|
+
[tool.hatch.version]
|
|
24
|
+
source = "vcs"
|
|
25
|
+
|
|
26
|
+
[tool.hatch.build.hooks.vcs]
|
|
27
|
+
version-file = "src/img_cli/_version.py"
|
|
28
|
+
|
|
29
|
+
[dependency-groups]
|
|
30
|
+
dev = [
|
|
31
|
+
"pytest>=8.0.0",
|
|
32
|
+
"pytest-mock>=3.14.0",
|
|
33
|
+
"respx>=0.21.0",
|
|
34
|
+
"ruff>=0.9.0",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[tool.ruff]
|
|
38
|
+
line-length = 100
|
|
39
|
+
target-version = "py310"
|
|
40
|
+
|
|
41
|
+
[tool.ruff.lint]
|
|
42
|
+
select = [
|
|
43
|
+
"E", # pycodestyle errors
|
|
44
|
+
"W", # pycodestyle warnings
|
|
45
|
+
"F", # pyflakes
|
|
46
|
+
"I", # isort
|
|
47
|
+
"UP", # pyupgrade
|
|
48
|
+
"B", # flake8-bugbear
|
|
49
|
+
"C4", # flake8-comprehensions
|
|
50
|
+
"RUF", # ruff-specific rules
|
|
51
|
+
]
|
|
52
|
+
ignore = [
|
|
53
|
+
"E501", # line too long (handled by formatter)
|
|
54
|
+
"B008", # do not perform function calls in argument defaults (click options)
|
|
55
|
+
"RUF001", # ambiguous unicode characters in Chinese strings
|
|
56
|
+
"RUF002", # ambiguous unicode characters in docstrings
|
|
57
|
+
"RUF003", # ambiguous unicode characters in comments
|
|
58
|
+
]
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: img-cli
|
|
3
|
+
description: 当用户需要生成图片、创建图片、用文字描述画图、修改图片、编辑图片、给图片加元素、替换图片背景时使用本技能,包括"生成图片"、"画一张"、"文生图"、"改图"、"编辑图片"、"img-cli"、"image generation"、"image edit"等请求。
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash(img-cli generate *)
|
|
6
|
+
- Bash(img-cli edit *)
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 图片生成与编辑(img-cli)
|
|
10
|
+
|
|
11
|
+
通过 `img-cli` 调用 OpenAI Images API 生成或编辑图片。
|
|
12
|
+
|
|
13
|
+
## 安装说明
|
|
14
|
+
|
|
15
|
+
使用 `uv`(推荐)或 `pip` 进行安装:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# 使用 uv 工具安装(推荐)
|
|
19
|
+
uv tool install img-cli
|
|
20
|
+
|
|
21
|
+
# 或通过 pip 安装
|
|
22
|
+
pip install img-cli
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
> **认证说明:** 所有命令需要 `~/.img_gen/auth.json` 中配置 `api_key` 和 `api_base`。
|
|
26
|
+
> 若报错"未找到认证文件",请创建该文件:
|
|
27
|
+
> ```bash
|
|
28
|
+
> mkdir -p ~/.img_gen
|
|
29
|
+
> echo '{"api_key":"sk-xxx","api_base":"https://api.openai.com/v1"}' > ~/.img_gen/auth.json
|
|
30
|
+
> ```
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 命令总览
|
|
35
|
+
|
|
36
|
+
| 命令 | 说明 |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `img-cli generate <prompt>` | 文字描述生成图片 |
|
|
39
|
+
| `img-cli edit <prompt>` | 根据描述修改已有图片 |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 命令参考
|
|
44
|
+
|
|
45
|
+
### `img-cli generate`
|
|
46
|
+
|
|
47
|
+
根据文字描述生成图片。
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
img-cli generate <prompt> [OPTIONS]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
| 参数 | 默认值 | 说明 |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `prompt` | 必填 | 图片描述,支持中文和英文 |
|
|
56
|
+
| `--model` / `-m` | `gpt-image-2` | 模型(目前仅支持 `gpt-image-2`) |
|
|
57
|
+
| `--size` / `-s` | `1024x1024` | 尺寸,见下方支持列表 |
|
|
58
|
+
| `--quality` / `-q` | 无 | 质量,见下方支持列表 |
|
|
59
|
+
| `--n` / `-n` | `1` | 生成数量(`dall-e-3` 固定为 1) |
|
|
60
|
+
| `--output` / `-o` | `.`(当前目录) | 输出目录 |
|
|
61
|
+
| `--format` | `png` | 输出格式:`png` / `jpeg` / `webp`(仅 `gpt-image-1` 有效) |
|
|
62
|
+
|
|
63
|
+
**gpt-image-2 支持的尺寸:** `1024x1024` / `1536x1024` / `1024x1536` / `auto`
|
|
64
|
+
|
|
65
|
+
**gpt-image-2 支持的 quality:** `low` / `medium` / `high` / `auto`
|
|
66
|
+
|
|
67
|
+
**示例:**
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# 使用默认模型(dall-e-3)生成
|
|
71
|
+
img-cli generate "一只戴墨镜的猫坐在沙滩上" --output ~/Desktop
|
|
72
|
+
|
|
73
|
+
# 生成横版高清图
|
|
74
|
+
img-cli generate "a futuristic city at sunset" -m dall-e-3 -s 1792x1024 -q hd -o ~/Desktop
|
|
75
|
+
|
|
76
|
+
# 使用 gpt-image-1 生成高质量图片
|
|
77
|
+
img-cli generate "产品白底宣传图,简洁风格" -m gpt-image-1 -q high -o ~/Desktop
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
### `img-cli edit`
|
|
83
|
+
|
|
84
|
+
根据文字描述修改已有图片。支持本地文件路径和网络图片 URL。
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
img-cli edit <prompt> --image <路径或URL> [OPTIONS]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
| 参数 | 默认值 | 说明 |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| `prompt` | 必填 | 修改描述 |
|
|
93
|
+
| `--image` / `-i` | 必填 | 原图:本地文件路径或 HTTP URL |
|
|
94
|
+
| `--mask` | 无 | 蒙版图(PNG,透明区域为待编辑区域):本地路径或 URL |
|
|
95
|
+
| `--model` / `-m` | `gpt-image-2` | 模型(目前仅支持 `gpt-image-2`) |
|
|
96
|
+
| `--size` / `-s` | `auto` | 尺寸 |
|
|
97
|
+
| `--quality` / `-q` | `auto` | 质量(仅 `gpt-image-1`) |
|
|
98
|
+
| `--n` / `-n` | `1` | 生成数量 |
|
|
99
|
+
| `--output` / `-o` | `.`(当前目录) | 输出目录 |
|
|
100
|
+
| `--format` | `png` | 输出格式(仅 `gpt-image-1`) |
|
|
101
|
+
|
|
102
|
+
**关于蒙版(mask):**
|
|
103
|
+
- 蒙版为 PNG 格式,尺寸必须与原图相同
|
|
104
|
+
- **透明区域(alpha=0)** = 需要编辑的区域
|
|
105
|
+
- **不透明区域** = 保持原样的区域
|
|
106
|
+
- 不传 mask 时,模型自动判断需要修改的区域
|
|
107
|
+
|
|
108
|
+
**示例:**
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# 修改本地图片(全图编辑)
|
|
112
|
+
img-cli edit "给猫戴上一顶帽子" --image ~/Desktop/cat.png --output ~/Desktop
|
|
113
|
+
|
|
114
|
+
# 修改网络图片
|
|
115
|
+
img-cli edit "替换背景为星空" --image https://example.com/photo.jpg -o ~/Desktop
|
|
116
|
+
|
|
117
|
+
# 带蒙版的精确编辑(只修改透明区域)
|
|
118
|
+
img-cli edit "用一朵玫瑰替换这里" --image ~/photo.png --mask ~/mask.png -o ~/Desktop
|
|
119
|
+
|
|
120
|
+
# 使用 dall-e-2 编辑(低成本场景)
|
|
121
|
+
img-cli edit "remove the background" --image ~/item.png -m dall-e-2 -o ~/Desktop
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 标准使用流程
|
|
127
|
+
|
|
128
|
+
### 场景一:文字生成图片
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# 1. 直接生成,保存到当前目录
|
|
132
|
+
img-cli generate "一只在雪地里奔跑的柴犬,卡通风格"
|
|
133
|
+
|
|
134
|
+
# 2. 指定输出目录和更高质量
|
|
135
|
+
img-cli generate "一只在雪地里奔跑的柴犬,卡通风格" -q hd -o ~/Desktop/output
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 场景二:修改已有图片
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# 1. 先确认图片路径可访问
|
|
142
|
+
ls ~/Desktop/photo.png # 本地文件
|
|
143
|
+
|
|
144
|
+
# 2. 执行编辑
|
|
145
|
+
img-cli edit "将背景替换为办公室环境" --image ~/Desktop/photo.png -o ~/Desktop/output
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 场景三:网络图片直接编辑
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# 直接传入图片 URL,无需手动下载
|
|
152
|
+
img-cli edit "添加一个太阳" --image https://example.com/landscape.jpg -o ~/Desktop
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 输出说明
|
|
158
|
+
|
|
159
|
+
- 生成的图片保存到 `--output` 指定目录,文件名格式为 `img_<时间戳>_<序号>.<格式>`
|
|
160
|
+
- 每次调用在 `~/.img_gen/img.log` 写入审计记录(JSON Lines 格式)
|
|
161
|
+
- `dall-e-3` 会输出 **修订后的 prompt**(模型对原始描述的优化版本)
|
|
162
|
+
- 输出耗时可能较长比如3-4分钟
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 常见问题
|
|
167
|
+
|
|
168
|
+
| 问题 | 原因 | 解决方式 |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| "未找到认证文件" | `~/.img_gen/auth.json` 不存在 | 按提示创建配置文件 |
|
|
171
|
+
| `dall-e-3` 只能生成 1 张 | API 限制,`n` 固定为 1 | 多次执行命令 |
|
|
172
|
+
| 图片 URL 下载超时 | 网络问题或 URL 失效 | 先手动下载为本地文件再使用 |
|
|
173
|
+
| "invalid size" 错误 | 尺寸与模型不匹配 | 参考上方模型能力对比表 |
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""img-cli: CLI tool for OpenAI-compatible Image Generation and Editing."""
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
from img_cli._version import __version__, __version_tuple__
|
|
5
|
+
except ImportError:
|
|
6
|
+
try:
|
|
7
|
+
from importlib.metadata import version
|
|
8
|
+
|
|
9
|
+
__version__ = version("img-cli")
|
|
10
|
+
__version_tuple__ = (0, 0, 0)
|
|
11
|
+
except Exception:
|
|
12
|
+
__version__ = "0.0.0.dev0"
|
|
13
|
+
__version_tuple__ = (0, 0, 0, "dev0")
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# file generated by vcs-versioning
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"__version__",
|
|
7
|
+
"__version_tuple__",
|
|
8
|
+
"version",
|
|
9
|
+
"version_tuple",
|
|
10
|
+
"__commit_id__",
|
|
11
|
+
"commit_id",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
version: str
|
|
15
|
+
__version__: str
|
|
16
|
+
__version_tuple__: tuple[int | str, ...]
|
|
17
|
+
version_tuple: tuple[int | str, ...]
|
|
18
|
+
commit_id: str | None
|
|
19
|
+
__commit_id__: str | None
|
|
20
|
+
|
|
21
|
+
__version__ = version = '0.1.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 0)
|
|
23
|
+
|
|
24
|
+
__commit_id__ = commit_id = None
|