aigc-pipeline
AIGC 接口批量驱动 + 飞书审核工作流(图片生成 → 飞书推送 → 审核 → 视频 → 百度网盘)
按用户的 8 步流程串联:
- 读
generation_tasks.json - 按
image_prompt_b+all_reference_images_d生成图片 - 按命名规则保存到本地(
{片段名}-{日期}-{署名}/{片段名}-{日期}-(N).png) - 推送到飞书群
@审核员(interactive 卡片 + 文件名列表) - 审核员把不合格图片移到
<out_dir>/rejected/子目录 - 程序检测
rejected/触发补生成(最多 N 轮),重推全量 - 通过图片 +
video_prompt_f生成视频(一图一视频) - 视频按命名规则存储 + 推送飞书
目录
安装
方式一:从 whl 安装(推荐集成方)
pip install aigc_pipeline-0.1.4-py3-none-any.whl
方式二:从源码开发安装(推荐开发方)
git clone <repo>
cd aigc-pipeline
pip install -e ".[dev]"
方式三:从 PyPI(发布后)
pip install aigc-pipeline
快速开始
1. 安装
参见上一节。
2. 准备 config.toml
最小可工作的配置(运行 examples/ 或 README 章节时把下面的字段填好):
[server]
base_url = "http://your-aigc-server" # AIGC 服务地址
[auth]
username = "D-39JLlay" # 登录账号
password = "39JLlay"
[paths]
output_dir = "./outputs" # 产物输出根目录
db_path = "./aigc_pipeline.db" # SQLite 状态库
token_file = "./token.txt" # 登录 token 缓存
attachments_dir = "./attachments" # ad-hoc 单文件模式的素材目录
[task]
mode = "image" # image | video
model_image = "auto-image"
model_video = "auto-video"
aspect_ratio = "9:16" # 9:16 / 1:1 / 16:9 ...
image_size = "2K" # 1K / 2K / 4K
batch_mode = "manual" # manual | folder | table
[review]
review_timeout_hours = 72 # 超时 → abandoned
max_retry = 3 # rejected 重生上限
[feishu]
webhook_url = "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
reviewer_user_ids = ["ou_xxx", "ou_yyy"]
dry_run = true # true=只 log 不真发
[baidu]
access_token = "" # 接入时填
share_expires_days = 7
[poll]
interval_seconds = 5 # 轮询 AIGC server 的间隔
timeout_seconds = 600 # 单 batch 超时
[users]
# 账号→中文署名映射(命名规则依赖)
"D-39JLlay" = "姜"
"D-39haitong" = "haitong"
3. 最小可运行示例
3.1 命令行(5 秒上手)
# 顺序模式(默认,单进程)
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json
# 并发模式(多进程 × 线程,推荐 3000+ task/天)
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json \
--parallel --max-processes 8
# Dry-run(不真发飞书)
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json --skip-feishu
3.2 Python facade(嵌入业务代码,推荐)
from aigc_pipeline import AIGCPipeline
pipe = AIGCPipeline.from_config("./config.toml")
# 跑批(生成 image + 写 state)
summary = pipe.run_from_json(
json_path="./tasks.json",
output_dir="./outputs",
parallel=True, # ← 并发模式(多进程)
max_processes=8,
)
# 查产物
pending = pipe.get_pending_reviews()
for p in pending:
print(f"待审批: {p['target_type']} {p['target_id']} file={p['file_path']}")
# 审批通过
pipe.submit_review_by_token(
review_token=pending[0]["review_token"],
decision="approved",
comment="构图可以",
)
# 触发视频生成(支持并发)
pipe.generate_pending_videos(parallel=True, max_processes=4)
4. 三种使用方式
4.1 CLI 跑批
# 顺序模式(默认)
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json
# 并发模式(推荐 3000+ task/天)
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json \
--parallel --max-processes 8
# 指定输出目录
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json \
--output-dir ./my_out
# Dry-run(不真发飞书)
aigc-pipeline --config ./config.toml --tasks-json ./tasks.json --skip-feishu
# 跑单张图(ad-hoc)
aigc-pipeline --config ./config.toml --mode image
4.2 Python facade(推荐)
from aigc_pipeline import AIGCPipeline
pipe = AIGCPipeline.from_config("./config.toml")
# ─────────── 跑批 ──────────
pipe.run_from_json(
json_path="./tasks.json",
output_dir="./outputs",
parallel=True, # 多进程并发
max_processes=8,
)
# ─────────── 视频生成(approved images → video) ──────────
pipe.generate_pending_videos(parallel=True, max_processes=4)
# ─────────── 百度网盘(approved videos → shared) ──────────
pipe.process_approved_videos()
# ─────────── 审批 ──────────
pending = pipe.get_pending_reviews()
for p in pending:
pipe.submit_review_by_token(
review_token=p["review_token"],
decision="approved",
)
# ─────────── 巡查超时 ──────────
abandoned = pipe.run_dispatcher()
# {abandoned_images, abandoned_videos, count}
# ─────────── 查 task 全状态 ──────────
status = pipe.get_task_status("rec_xxx")
# {task, images[{...image, videos}]}
4.3 并发模式对比
| task 量 / 天 | 推荐模式 | 进程数 |
|---|---|---|
| < 3,000 | 顺序模式(默认) | — |
| 3,000 ~ 30,000 | 并发模式 | --max-processes 8 |
| 30,000 ~ 100,000 | 并发 + 多机 | 16/机 |
| > 100,000 | 升级到 Dramatiq + RabbitMQ | — |
# 硬上限 16 (image) / 8 (video),可调
aigc-pipeline --parallel --max-processes 8 --tasks-json ./tasks.json
5. 审批工作流(重点)
整套工作流核心是 state 驱动 + 外部程序审阅:
┌─────────────────────────────────────────────────────┐
│ state-driven 全自动流程 │
└─────────────────────────────────────────────────────┘
│
▼
run_from_json() ← 你跑:批量生成 image
│
▼ 状态机自动推进
image.pending_review ← 待审批
│
▼ get_pending_reviews()
外部程序定时拉 ← 你集成:UI/邮件/IM 推给客户
│
▼ submit_review_by_token(token, "approved")
image.approved → 自动触发 video 生成
│
▼ generate_pending_videos(parallel=True)
video.pending_review
│
▼ submit_review_by_token(token, "approved")
video.approved → 自动触发百度网盘
│
▼ process_approved_videos()
video.shared + share_url
│
▼
image/video/task → completed
完整 8 步集成示例
from aigc_pipeline import AIGCPipeline
pipe = AIGCPipeline.from_config("./config.toml")
# ──── Step 1: 跑批(生成 image + 写 state) ────
pipe.run_from_json(
json_path="./tasks.json",
parallel=True, # ← 多进程并发
max_processes=8,
)
# ──── Step 2: 定时轮询拉取待审批(cron 触发) ────
pending = pipe.get_pending_reviews()
# pending = [
# {"target_type": "image", "target_id": "img_001",
# "record_id": "rec_xxx", "review_token": "abcdef...",
# "file_path": ".../玉湖公园-1-8.28-(1).png",
# "retry_count": 0},
# {"target_type": "video", ...},
# ]
# ──── Step 3: 推给客户(你自己接 UI/邮件/IM) ────
for p in pending:
notify_client(p) # 占位:调你自己的通道
# ──── Step 4: 客户审完,外部程序把决策回传 ────
result = pipe.submit_review_by_token(
review_token=pending[0]["review_token"],
decision="approved", # 或 "rejected"
comment="构图可以",
)
# result: {image_id, decision, new_status, retry_count, next_action}
# ──── Step 5: 触发视频生成(支持并发) ────
pipe.generate_pending_videos(parallel=True, max_processes=4)
# ──── Step 6: 视频审批通过后调百度网盘 ────
result = pipe.process_approved_videos()
# 空壳(NotImplementedError)→ skipped;接入后 → shared + share_url
# ──── Step 7: 定时巡查超时(推荐每 10 分钟跑一次) ────
abandoned = pipe.run_dispatcher()
# {abandoned_images, abandoned_videos, count}
# ──── Step 8: 查询全状态 ────
status = pipe.get_task_status("rec_xxx")
# {task, images[{...image, videos}]}
极简审批入口
客户端只要拿到 token 就能审批,无需知道 image_id / video_id:
# 客户点 "通过" 后,外部程序调一行
pipe.submit_review_by_token(
review_token="abcdef1234...", # 客户系统从 URL/邮件中拿到
decision="approved",
)
6. 命名规范
日期格式
3.27(月份 / 日期都不带前导 0)
通用素材
| 类型 | 格式 | 示例 |
|---|---|---|
| 文件夹 | {片段名}-{日期}-{负责同学} |
安保人群-3.27-张三 |
| 文件 | {片段名}-{日期}-({序号}).{ext} |
安保人群-3.27-(1).png |
门店素材
| 类型 | 格式 | 示例 |
|---|---|---|
| 文件夹 | {片段名}-{门店编号}-{日期}-{负责同学} |
安保人群-130014WL-3.27-张三 |
| 文件 | {片段名}-{门店编号}-{日期}-({序号}).{ext} |
安保人群-130014WL-3.27-(1).png |
视频产物
视频目录 = 图片目录 + _video 后缀:
outputs/
├── 玉湖公园-1-8.28-姜/ # image 目录
│ ├── 玉湖公园-1-8.28-(1).png
│ └── 玉湖公园-1-8.28-(2).png
└── 玉湖公园-1-8.28-姜_video/ # video 目录(同一规则 + _video)
├── 玉湖公园-1-8.28-(1).mp4
└── 玉湖公园-1-8.28-(2).mp4
通用 vs 门店的判定
- 由 JSON 的
category字段判断(门店素材/门店/store任一关键词) - 门店素材的
segment_name第一段是门店编号(如130014WL-玉湖公园)
批量命名技巧(飞书审核员)
Ctrl+A全选F2进入命名模式- 给其中一个素材命名:
安保人群-工厂直销店-3.27- - 系统会按规则自动补全编号
完整生命周期(Phase 4)
下面是本包支持的端到端流程,以客户审批为主轴:
+-------------------+ +--------------------+ +-------------------+
| 1. 读 generation_ | | 3. 客户审批 | | 5. 视频生成 |
| tasks.json | | | | |
+-------------------+ +--------------------+ +-------------------+
| | |
v | v
+-------------------+ | +-------------------+
| 2. 创建 image | | | 6. 视频审批 |
| 记录 (generating)| | | (pending_review) |
| 并发跑 core.run | | +-------------------+
+-------------------+ | |
| | v
v | +-------------------+
+-------------------+ | | 7. 百度网盘上传 |
| image pending_ | | | + create_share |
| review | | +-------------------+
+-------------------+ | |
| | v
+----------------------+ +-------------------+
| | 8. video.shared |
+------------>+ + image.completed |
| + task.completed |
+-------------------+
状态机一览
| 对象 | 状态转换 |
|---|---|
| image | generating → pending_review → (approved|rejected) → (generating[重试]) | abandoned |
| video | pending → generating → pending_review → (approved|rejected) → (generating[重试]) | abandoned → uploaded → shared |
| task | pending → generating → reviewing → completed | abandoned |
决策路由
| 决策 | 路由 |
|---|---|
| image approved | → 触发 video 生成(调 generate_pending_videos) |
| image rejected | retry < 3 → 回到 generating 重生;>= 3 → abandoned |
| video approved | → 触发百度网盘上传(调 process_approved_videos) |
| video rejected | retry < 3 → 回到 generating(用同 image重生);>= 3 → abandoned |
| pending 超时 | dispatcher 巡查 → abandoned |
项目结构
src/aigc_pipeline/
├── __init__.py # 公开 API 出口
├── __main__.py # python -m aigc_pipeline
├── cli.py # CLI 入口(argparse)
├── config.py # AppConfig + load_config (TOML)
├── core.py # AIGC 底层:upload/submit/poll/download
├── aigc_client.py # AIGCClient(统一 base_url + TokenAuth + 401/402 refresh)
├── naming.py # 命名规则 + NamingCtx
├── feishu.py # 飞书 webhook 推送
├── workflow.py # 老工作流(DEPRECATED)+ write_pre/post_state
├── runner.py # AIGCRunner:image/video 统一引擎
├── parallel.py # 并发执行(run_tasks_parallel / run_videos_parallel)
├── dispatcher.py # 超时巡查
├── pipeline.py # AIGCPipeline(facade)
├── data/
│ └── state.py # SQLite StateStore(tasks / images / videos)
└── baidu_uploader.py # 百度网盘(空壳)
开发
# 安装 dev 依赖
pip install -e ".[dev]"
# 跑测试
pytest # 当前 199 个测试
# 加新测试
tests/test_<feature>.py
# 构建 whl + sdist
python -m build
# 产出文件
ls dist/
# aigc_pipeline-0.1.4-py3-none-any.whl
# aigc_pipeline-0.1.4.tar.gz
调试 httpx 内部日志
默认 httpx logger 已被设为 WARNING(不打印 AIGC server IP)。调试时手动打开:
import logging
logging.getLogger("httpx").setLevel(logging.INFO)
License
MIT
进阶文档
- docs/ARCHITECTURE.md — 架构改造设计文档(从单进程到 10万 task/天的演进路线)
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
aigc_pipeline-0.1.19.tar.gz
(112.5 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aigc_pipeline-0.1.19.tar.gz.
File metadata
- Download URL: aigc_pipeline-0.1.19.tar.gz
- Upload date:
- Size: 112.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3111b8df3f3ffd9a3a371c464961ee43e3e13a532fb2a409660a2db917ea1d3e
|
|
| MD5 |
118bd6985fc3b866dab53aa8f73b41aa
|
|
| BLAKE2b-256 |
c4d572ba2a1c86b6bcd46330b8c3e8b60d673632060d350a92ff6555b6ca7f3b
|
File details
Details for the file aigc_pipeline-0.1.19-py3-none-any.whl.
File metadata
- Download URL: aigc_pipeline-0.1.19-py3-none-any.whl
- Upload date:
- Size: 78.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55202500e80aebd73fd827b8e03f3bde7d709afa0d5eacc65d62fea82475d058
|
|
| MD5 |
4f98b5120b37b80b4d0c610d7a3a334e
|
|
| BLAKE2b-256 |
4c66d4d642536826933839d64aa93920c35d202087fa3e40bfeaee53c96c7ce8
|