ai_service/scripts/run_pipline.md
2025-06-09 16:08:14 +08:00

5.7 KiB
Raw Blame History

自动执行流程说明文档

本流程通过多个脚本与配置文件协作,自动生成海报的排版、文案、图像并输出 PSD 文件,最终通过 API 提供服务。


一、自动执行流程的步骤

步骤 1: 配置加载

目标:加载必要的配置信息(如 API 密钥、字体规则、Prompt 模板)。

涉及文件

  • .env:加载 DeepSeek API 密钥等环境变量。
  • configs/fonts.yaml:加载字体与配色规则。
  • configs/prompts.json:加载图像生成 Prompt 模板。

过程

  • 使用 dotenv 加载 .env 中的 DEEPSEEK_API_KEY
  • 使用 yamljson 库加载 fonts.yamlprompts.json

输出:配置对象(字典或类),供后续步骤使用。


步骤 2: 排版生成

目标:使用 LLM 生成海报的排版结构Vue 组件)。

涉及文件

  • scripts/generate_layout.py:调用 DeepSeek API 生成 Vue 组件代码。

过程

  • 调用 generate_layout.py 中的 generate_vue_code 函数。
  • 传入从 prompts.json 动态读取的 Prompt结合字体规则生成 Vue 代码。

输出Vue 组件代码,保存为 outputs/generated_code.vue


步骤 3: 文案生成

目标:生成海报文案内容(标题、副标题、活动描述等)。

涉及文件

  • scripts/generate_text.py:调用 LLM 生成文案。

过程

  • 调用脚本生成端午节相关文案(如“端午安康”、“包粽子比赛”)。
  • 文案可按 prompts.json 中模板动态调整。

输出:文案内容(字符串或字典),供后续步骤使用。


步骤 4: 图像生成

目标:使用 ComfyUI 生成海报图层。

涉及文件

  • comfyui_flows/layer_generation.json:定义图层生成流程。
  • scripts/generate_images.py:调用 ComfyUI API 生成图层。
  • images/:存储背景、前景、文字图层。

过程

  • 运行 generate_images.py,加载 layer_generation.json
  • 根据排版与文案生成:
    • background.png
    • foreground.png
    • text_overlay.png

输出:图像文件保存到 images/ 目录。


步骤 5: 合成海报

目标:将图层合成为最终海报。

涉及文件

  • scripts/compose_poster.py:合成图层脚本。
  • outputs/final_poster.png:合成结果。

过程

  • 读取 generated_code.vue 中的排版位置信息。
  • 使用 image_utils.py 对图层进行合成。

输出final_poster.png


步骤 6: 导出 PSD 文件

目标:导出 PSD 文件以便后期修改。

涉及文件

  • scripts/export_psd.pyPSD 导出脚本。
  • outputs/final_poster.psd:导出的 PSD 文件。

过程

  • final_poster.png 转换为 PSD。
  • 保留图层信息。

输出final_poster.psd


步骤 7: 提供前端接口

目标:将结果通过 API 提供给前端调用。

涉及文件

  • run_pipeline.py:协调整体流程并定义 API 接口。

过程

  • 使用 FastAPIFlask 创建端点(如 /generate_poster)。
  • 接收前端请求,依次调用上述所有步骤。
  • 返回最终文件的 URL 或文件流。

输出HTTP 响应,包含 final_poster.png 链接或文件流。


二、如何实现自动执行流程

环境准备

  • 依赖安装:确保 requirements.txt 包含以下依赖:

    • openai
    • python-dotenv
    • PyYAML
    • requests(用于 ComfyUI API 调用)
    • Pillow(图像处理)
    • psd-toolsPSD 导出)
  • API 密钥配置:在 .env 文件中添加以下字段:

    DEEPSEEK_API_KEY=your_api_key
    COMFYUI_API_KEY=your_comfyui_key
    
    
import os
from dotenv import load_dotenv
from scripts.generate_layout import generate_vue_code
from scripts.generate_text import generate_text  # 假设存在
from scripts.generate_images import generate_images  # 假设存在
from scripts.compose_poster import compose_poster  # 假设存在
from scripts.export_psd import export_psd  # 假设存在
import yaml
import json
from fastapi import FastAPI, HTTPException
from fastapi.responses import FileResponse

# 加载环境变量和配置
load_dotenv()
app = FastAPI()

with open("configs/fonts.yaml", "r", encoding="utf-8") as f:
    fonts_config = yaml.safe_load(f)
with open("configs/prompts.json", "r", encoding="utf-8") as f:
    prompts_config = json.load(f)

# 一键执行流程
def run_pipeline():
    try:
        # 步骤 1: 排版生成
        layout_code = generate_vue_code()
        with open("../outputs/generated_code.vue", "w", encoding="utf-8") as f:
            f.write(layout_code)

        # 步骤 2: 文案生成
        text_content = generate_text(prompts_config.get("text_prompt", ""))

        # 步骤 3: 图像生成
        generate_images(
            workflow_path="comfyui_flows/layer_generation.json",
            text_content=text_content,
            output_dir="images/"
        )

        # 步骤 4: 合成海报
        compose_poster(
            layout_path="../outputs/generated_code.vue",
            image_dir="images/",
            output_path="../outputs/final_poster.png"
        )

        # 步骤 5: 导出 PSD
        export_psd(
            input_path="../outputs/final_poster.png",
            output_path="../outputs/final_poster.psd"
        )

        return "../outputs/final_poster.png"
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# API 端点
@app.get("/generate_poster")
async def generate_poster():
    output_path = run_pipeline()
    return FileResponse(output_path, media_type="image/png")

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)