[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4514":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":18,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":14,"lastSyncTime":35,"discoverSource":36},4514,"ProductFlow","yuqie6\u002FProductFlow","yuqie6","gpt-image-2 画图工作台 \u002F Self-hosted workbench for AI copy, posters, image sessions, and visual product workflows","https:\u002F\u002Fdraw.devbin.de",null,"Python",186,32,2,1,0,4,12,96,4.56,"MIT License",false,"main",true,[26,27,28,29,30,31],"ai","ecommerce","fastapi","productflow","react","self-hosted","2026-06-12 02:01:02","\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fassets\u002Fproductflow-brand-concept.png\" alt=\"ProductFlow brand concept: product card connected to AI copy and image workflow nodes\" width=\"168\">\n\u003C\u002Fp>\n\n# ProductFlow\n\n[中文](README.md) | [English](README.en.md)\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fdraw.devbin.de\">\u003Cstrong>体验站 \u002F Live Demo\u003C\u002Fstrong>\u003C\u002Fa>\n\u003C\u002Fp>\n\nProductFlow 是面向单人或小团队商家的开源自托管商品素材工作台。核心链路覆盖商品资料、参考图、AI 文案、AI\u002F模板海报、连续生图会话、生成图画廊和可视化工作流。\n\n当前形态为私有单管理员实例。自托管部署需要 PostgreSQL、Redis、后端 API、Dramatiq worker、Web 前端，以及可用的文本\u002F图片模型供应商。\n\n## 功能概览\n\n### 商品\u002F工作台\n\n- 单管理员访问密钥登录，基于 Cookie session 访问后台 API。\n- 商品列表、分页浏览、创建商品、商品详情工作台、受全局开关保护的商品删除；移动端商品列表使用卡片和浮动分页。\n- 节点画布组织商品资料、参考图、文案节点和生图节点。\n- 桌面画布支持滚轮缩放、空白处拖动平移、节点拖拽定位、节点连线、边删除、Ctrl\u002FCmd\u002FShift 多选、Shift 框选。\n- 移动端商品工作台保留画布为主界面，提供浏览、编辑和选择模式；支持单指平移、点选节点、双指缩放、触控拖拽节点、触控创建连线和点按多选。\n- 移动端底部工具栏提供运行工作流、单节点、模板、详情、日志和图库入口，面板内容从底部展开。\n- 完整画布模板用于创建商品；内置节点组模板和用户节点组模板用于工作台内追加流程。\n- 商品原图、参考图、连续生图参考图支持点击选择或拖拽上传，并受 MIME、大小、像素和数量限制保护。\n- 参考图节点是单图槽位；手动上传或上游生图填充会替换当前图，旧素材保留在商品历史\u002F素材列表中。\n- 文案节点支持生成、编辑、确认和历史查看，当前输出是后续生图可直接读取的可编辑结构化文案。\n- 生图节点只负责触发和配置生成；生成结果写入连接的下游参考图节点，并在参考图节点或图库面板预览和下载。\n\n### 文\u002F图生图\n\n- 独立图片会话支持参考图上传、历史基图选择、连续生成、多候选比较和移动端主视图\u002F抽屉\u002F底部面板布局。\n- 移动端文\u002F图生图顶部栏提供会话抽屉、当前会话标题\u002F重命名和历史抽屉；生成状态、当前结果和供应商提示保留在主视图。\n- 会话列表从左侧抽屉打开，可新建、选择和删除会话；分支\u002F候选历史从右侧窄抽屉打开，点击已完成图片会设为当前结果和下一轮基图。\n- 底部快捷条始终提供生成入口；选中已完成结果后，同时提供下载和投至画廊。底部生成面板包含生成设置\u002F高级标签页、商品关联、商品\u002F会话参考图、提示词、尺寸、候选数量和图片工具参数。\n- 运行状态包含排队位置、轻量状态刷新、候选进度、失败原因、取消和重试。\n- 生成图可下载、投至画廊、保存为商品参考图，或设为商品主图参考。\n\n### 画廊\n\n- `\u002Fgallery` 集中保存文\u002F图生图结果。\n- 条目保留来源会话、关联商品、提示词、尺寸、模型和下载入口。\n\n### 配置与运行\n\n- `\u002Fsettings` 支持运行时业务配置覆盖：provider、模型、图片尺寸、图片工具参数、提示词模板、上传限制、全局并发、业务删除开关等。\n- 图片工具参数可控制 Responses `image_generation` tool 的可用字段、质量、输出格式、压缩、背景、审核、action、input fidelity、partial images 和 provider `n` 等高级参数；Responses 后台响应模式默认开启，不支持时会回退同步请求。\n- Secret 字段不回显；配置页由独立 `SETTINGS_ACCESS_TOKEN` 二次解锁。\n- 文案、海报、商品工作流和文\u002F图生图由 Dramatiq + Redis 投递，PostgreSQL 记录状态。\n- API\u002Fworker 启动时恢复未完成文案\u002F海报任务、商品工作流和连续生图任务。\n- 运行中商品工作流和文\u002F图生图只轮询轻量 status，结束后刷新完整详情。\n\n### 产品内帮助\n\n- 顶部导航提供 `\u002Fhelp` 帮助页。\n- 帮助页按真实页面域组织：入门、画布工作台、画廊、文\u002F图生图、配置。\n- 文档页包含左侧分页导航、本页目录、上一页\u002F下一页和本地全文搜索。\n\n### 界面预览\n\n![商品列表示例](images\u002Fpreview1.png)\n\n![商品工作台示例](images\u002Fpreview2.png)\n\n![新建商品示例](images\u002Fpreview3.png)\n\n![图生图面板示例](images\u002Fpreview4.png)\n\n![暗色模式与英文模式示例](images\u002Fpreview5.png)\n\n## 当前边界\n\n暂不提供多用户\u002F多租户、团队权限、支付、托管账号体系、自动投放\u002F自动上架、视频生成、Kubernetes\u002FHelm\u002F发布版容器镜像等生产编排包。仓库内 Docker Compose 自托管路径已可用。\n\n## 产品入口与文档\n\n- 产品内帮助：顶部导航 **帮助**，路由 `\u002Fhelp`\n- 新手操作参考：`docs\u002FUSER_GUIDE.md`\n- 架构说明：`docs\u002FARCHITECTURE.md`\n- 当前架构健康度复审：`docs\u002FARCHITECTURE_HEALTH_REVIEW.md`\n- 路线图：`docs\u002FROADMAP.md`\n- 版本记录：`CHANGELOG.md`\n- 品牌资产：`docs\u002Fassets\u002Fproductflow-brand-concept.png`、`docs\u002Fassets\u002Fproductflow-mark.svg`\n- Web metadata \u002F favicon 资产：`web\u002Fpublic\u002Fproductflow-brand-concept.png`、`web\u002Fpublic\u002Fproductflow-mark.svg`\n\n## 技术栈\n\n- 后端：Python 3.12、FastAPI、SQLAlchemy、Alembic、Dramatiq、Redis、PostgreSQL、Pillow、OpenAI Python SDK。\n- 前端：React 19、Vite、TypeScript、React Router、TanStack Query、Tailwind CSS 4。\n- 本地开发入口：根目录 `justfile`；无 `just` 时可直接执行下文列出的原始命令。\n- 文档：`docs\u002FPRD.md`、`docs\u002FUSER_GUIDE.md`、`docs\u002FARCHITECTURE.md`、`docs\u002FARCHITECTURE_HEALTH_REVIEW.md`、`docs\u002FROADMAP.md`、`CHANGELOG.md`。\n\n## 开源依赖与致谢\n\nProductFlow 的应用代码之外，仓库还保留了一套面向 AI 协作的项目工作流资产。特别感谢**真诚、友善、团结、专业**的 Linuxdo 社区。\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Flinux.do\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLinuxDo-community-1f6feb\" alt=\"LinuxDo\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n- [LinuxDo](https:\u002F\u002Flinux.do)\n\n同时感谢对本仓库结构、开发方式和协作体验影响最大的开源项目。\n\n\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmindfold-ai\u002FTrellis\">\n    \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fmindfold-ai\u002FTrellis\u002Fmain\u002Fassets\u002Ftrellis.png\" alt=\"Trellis\" height=\"32\">\n  \u003C\u002Fa>\n  &nbsp;\n  \u003Ca href=\"https:\u002F\u002Fopenai.com\u002Fcodex\u002F\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FOpenAI%20Codex-AI%20coding-412991?logo=openai&logoColor=white\" alt=\"OpenAI Codex\">\n  \u003C\u002Fa>\n  &nbsp;\n\u003C\u002Fp>\n\n- [Trellis](https:\u002F\u002Fgithub.com\u002Fmindfold-ai\u002FTrellis) 为本项目提供任务工作流、规范沉淀和上下文注入约定；仓库保留 `.trellis\u002Fworkflow.md`、`.trellis\u002Fscripts\u002F` 和 `.trellis\u002Fspec\u002F`，方便贡献者理解需求、实现、检查和收尾方式。\n- [OpenAI Codex](https:\u002F\u002Fopenai.com\u002Fcodex\u002F) \u002F Codex CLI 参与本项目的开发协作流程；仓库中的 `.codex\u002F`、`.agents\u002Fskills\u002F` 和 `AGENTS.md` 用于保存面向 AI coding agent 的项目级指令、hooks、技能和子代理配置。\n\n## 仓库结构\n\n```text\nProductFlow\u002F\n  README.md\n  LICENSE\n  CONTRIBUTING.md\n  SECURITY.md\n  CHANGELOG.md\n  .env.example\n  .env.dev.example\n  docker-compose.yml\n  .dockerignore\n  justfile\n  scripts\u002F\n    release.sh\n    with_dev_env.sh\n  docs\u002F\n    PRD.md\n    PRD.en.md\n    USER_GUIDE.md\n    USER_GUIDE.en.md\n    ARCHITECTURE.md\n    ARCHITECTURE.en.md\n    ARCHITECTURE_HEALTH_REVIEW.md\n    ARCHITECTURE_HEALTH_REVIEW.en.md\n    ROADMAP.md\n    ROADMAP.en.md\n    assets\u002F\n      productflow-brand-concept.png\n      productflow-mark.svg\n  backend\u002F\n    Dockerfile\n    pyproject.toml\n    alembic.ini\n    alembic\u002Fversions\u002F\n    src\u002Fproductflow_backend\u002F\n    tests\u002F\n  web\u002F\n    Dockerfile\n    nginx.conf\n    package.json\n    public\u002F\n      productflow-brand-concept.png\n      productflow-mark.svg\n    src\u002F\n  .trellis\u002F\n    workflow.md\n    scripts\u002F\n    spec\u002F\n```\n\n`.trellis\u002Fspec\u002F`、`.trellis\u002Fworkflow.md` 和 `.trellis\u002Fscripts\u002F` 是项目开发规范和任务工具，保留在仓库中便于贡献者理解约定；`.trellis\u002Ftasks\u002F` 和 `.trellis\u002Fworkspace\u002F` 是本地任务\u002F开发者运行上下文，不应公开跟踪。\n\n## 快速开始：Docker Compose 一键自托管\n\n该路径面向单机自托管部署。默认配置可运行基础流程；配置真实模型供应商、持久化存储和反向代理\u002FHTTPS 后，可作为小规模生产运行的基础方式。宿主机仅需 Docker \u002F Docker Compose，无需安装 Python、`uv`、Node、`pnpm` 或 `just`。Compose 会构建并启动 PostgreSQL、Redis、后端 API、Dramatiq worker 和 Web 静态站点。\n\n### 1. 复制并修改环境变量\n\n```bash\ncp .env.example .env\n```\n\n至少修改以下值：\n\n- `ADMIN_ACCESS_KEY`：登录后台使用的管理员密钥；密钥本身只从环境变量读取，不写入数据库。\n- `SETTINGS_ACCESS_TOKEN`：配置页二次解锁令牌，必须与登录密钥分开。\n- `SESSION_SECRET`：签名 session cookie 的长随机字符串。\n- `POSTGRES_PASSWORD`：PostgreSQL 密码；Compose 会用它拼出容器内的 `DATABASE_URL`。\n\n默认 provider 为 `mock`，`POSTER_GENERATION_MODE=template`，无需真实模型密钥即可完成创建商品、生成文案和模板海报等基础流程。真实模型配置见“模型与供应商配置”。\n\n### 2. 一键构建并启动\n\n```bash\ndocker compose up -d --build\n```\n\n不要在该命令后追加服务名；追加服务名只会启动指定服务。完整自托管栈应一次启动全部服务。\n\nCompose 默认启动：\n\n- PostgreSQL：服务名 `productflow-postgres`，Compose volume `productflow-postgres-data`，宿主机端口 `${POSTGRES_HOST_PORT:-15432}`。\n- Redis：服务名 `productflow-redis`，AOF 持久化 Compose volume `productflow-redis-data`，宿主机端口 `${REDIS_HOST_PORT:-16379}`。\n- 后端 API：服务名 `productflow-backend`，宿主机端口 `${APP_HOST_PORT:-29280}`。\n- Dramatiq worker：服务名 `productflow-worker`，与 API 共享数据库、Redis 和 storage 卷。\n- Web：服务名 `productflow-web`，nginx 静态服务，宿主机端口 `${WEB_PORT:-29281}`。\n\n如端口已被占用，可在 `.env` 中修改 `APP_HOST_PORT`、`WEB_PORT`、`POSTGRES_HOST_PORT` 或 `REDIS_HOST_PORT`，再重新执行 `docker compose up -d --build`。容器内部仍通过服务名互联，无需修改应用内的 `DATABASE_URL` \u002F `REDIS_URL`。\n\n容器内应用会使用 Compose 网络服务名连接依赖：\n\n```text\nDATABASE_URL=postgresql+psycopg:\u002F\u002Fproductflow:\u003CPOSTGRES_PASSWORD>@productflow-postgres:5432\u002Fproductflow\nREDIS_URL=redis:\u002F\u002Fproductflow-redis:6379\u002F0\nSTORAGE_ROOT=\u002Fapp\u002Fstorage\n```\n\n容器运行时 `STORAGE_ROOT` 固定为 `\u002Fapp\u002Fstorage`，不要写入宿主机路径。默认上传和生成文件存入 Docker named volume `productflow-storage`，容器重启后数据保留。\n\n从旧 systemd 生产环境迁移到 Compose 时，如已有生产文件目录（例如 `\u002Fhome\u002Fcot\u002FProductFlow-release\u002Fshared\u002Fstorage`），可在 `.env` 中设置 host-only 变量复用旧文件：\n\n```bash\nSTORAGE_HOST_PATH=\u002Fhome\u002Fcot\u002FProductFlow-release\u002Fshared\u002Fstorage\n```\n\n`STORAGE_HOST_PATH` 仅用于 Compose bind mount 的宿主机路径；API\u002Fworker 容器内仍使用 `STORAGE_ROOT=\u002Fapp\u002Fstorage`。留空或不设置时使用 `productflow-storage` named volume。普通更新不要执行 `docker compose down -v`，也不要为切换 storage 挂载删除 Docker volume；如需回到 named volume，移除 `STORAGE_HOST_PATH` 后重新执行 `docker compose up -d`。\n\n### 3. 数据库迁移\n\n`productflow-backend` 启动命令会先执行：\n\n```bash\nalembic upgrade head\n```\n\n迁移成功后才会启动 `uvicorn`。升级代码后如需手动重跑迁移，执行：\n\n```bash\ndocker compose run --rm productflow-backend alembic upgrade head\n```\n\n### 4. 访问与健康检查\n\n默认端口下可执行：\n\n```bash\ndocker compose ps\ncurl http:\u002F\u002F127.0.0.1:29280\u002Fhealthz\ncurl http:\u002F\u002F127.0.0.1:29281\u002Fapi\u002Fhealthz\n```\n\n如已在 `.env` 中修改端口，请替换为对应值：\n\n```bash\ncurl \"http:\u002F\u002F127.0.0.1:\u003CAPP_HOST_PORT>\u002Fhealthz\"\ncurl \"http:\u002F\u002F127.0.0.1:\u003CWEB_PORT>\u002Fapi\u002Fhealthz\"\n```\n\n预期 API 返回：\n\n```json\n{\"status\":\"ok\"}\n```\n\nWeb 默认入口：`http:\u002F\u002F127.0.0.1:29281`（改过端口时使用 `.env` 中的 `WEB_PORT`）。使用 `.env` 中的 `ADMIN_ACCESS_KEY` 登录。Web 镜像提供 Vite build 后的静态资源，nginx 将同源 `\u002Fapi\u002F*` 请求反向代理到 `productflow-backend:29280`。\n\n### 5. 日志、停止与清理\n\n```bash\ndocker compose logs -f productflow-backend productflow-worker productflow-web\ndocker compose down\n```\n\n停止服务不会删除数据卷。确认需要清空数据库、Redis 和 storage 时再执行：\n\n```bash\ndocker compose down -v\n```\n\n## 本地开发路径\n\n修改代码并使用热重载开发时，使用本地开发路径。\n\n### 1. 准备工具\n\n需要本机已有：\n\n- Python 3.12+\n- `uv`\n- Node.js 20+ 或兼容版本\n- `pnpm`\n- Docker \u002F Docker Compose\n- `just`（可选；下文同时列出原始命令）\n\n### 2. 复制环境变量\n\n```bash\ncp .env.example .env\ncp .env.dev.example .env.dev\ncp web\u002F.env.example web\u002F.env\n```\n\n`.env.example` 的 `DATABASE_URL` \u002F `REDIS_URL` 面向 Compose 容器网络；本地热重载开发命令会通过 `.env.dev` 使用宿主机 `localhost:${POSTGRES_HOST_PORT:-15432}` 和 `localhost:${REDIS_HOST_PORT:-16379}`。至少需要把 `.env` \u002F `.env.dev` 中的这些值改成自己的随机值：\n\n- `ADMIN_ACCESS_KEY`：登录后台使用的管理员密钥；密钥本身只从环境变量读取，不写入数据库。\n- `SETTINGS_ACCESS_TOKEN`：配置页二次解锁令牌，必须与登录密钥分开。\n- `SESSION_SECRET`：签名 session cookie 的长随机字符串。\n- `POSTGRES_PASSWORD`：本地 PostgreSQL 密码，同时保持 `.env.dev` 的 `DATABASE_URL` 中密码一致。\n\n`.env.dev.example` 使用开发端口、Redis DB 1 和 `backend\u002Fstorage-dev`，数据库名与默认 `docker-compose.yml` 保持一致。使用单独开发数据库时，需要先在 PostgreSQL 中创建对应数据库，再调整 `.env.dev` 的 `DATABASE_URL`。本地开发 storage 与生产 Compose 隔离：`just backend-run` \u002F `just backend-worker` 及对应原始命令会读取 `.env.dev` 中的 `STORAGE_ROOT=.\u002Fbackend\u002Fstorage-dev`。避免通过 `source .env` 或生产 `STORAGE_HOST_PATH` 启动开发进程。\n\n### 3. 仅启动开发依赖\n\n本地热重载开发只用 Compose 启动 PostgreSQL 和 Redis；API、worker 和 Web 由下一步的本机命令启动。完整自托管栈使用上文的 `docker compose up -d --build`。\n\n```bash\ndocker compose up -d productflow-postgres productflow-redis\n```\n\n### 4. 安装依赖并迁移数据库\n\n使用 `just`：\n\n```bash\njust backend-install\njust web-install\njust backend-migrate\n```\n\n无 `just` 时：\n\n```bash\nuv sync --directory backend --extra dev\npnpm --dir web install\nbash scripts\u002Fwith_dev_env.sh uv run --directory backend alembic upgrade head\n```\n\n### 5. 启动后端、worker 和前端\n\n开三个终端分别运行。使用 `just`：\n\n```bash\njust backend-run\njust backend-worker\njust web-dev\n```\n\n无 `just` 时：\n\n```bash\nbash scripts\u002Fwith_dev_env.sh bash -lc 'uv run --directory backend uvicorn productflow_backend.main:app --reload --host 0.0.0.0 --port \"${APP_PORT:-29282}\"'\nbash scripts\u002Fwith_dev_env.sh uv run --directory backend dramatiq --processes 2 --threads 4 productflow_backend.workers\nbash scripts\u002Fwith_dev_env.sh bash -lc 'web_port=\"${WEB_PORT:-29283}\"; api_target=\"${VITE_DEV_PROXY_TARGET:-http:\u002F\u002F127.0.0.1:${APP_PORT:-29282}}\"; VITE_API_BASE_URL= VITE_DEV_PROXY_TARGET=\"$api_target\" pnpm --dir web dev -- --host 0.0.0.0 --port \"$web_port\" --strictPort'\n```\n\n默认开发端口来自 `.env.dev.example`：\n\n- API：`http:\u002F\u002Flocalhost:29282`\n- Web：`http:\u002F\u002Flocalhost:29283`\n\n打开 Web 页面后使用 `ADMIN_ACCESS_KEY` 登录。顶部导航提供 **商品\u002F工作台**、**文\u002F图生图**、**画廊**、**帮助** 和 **配置**。\n\n### 6. 开发健康检查\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:29282\u002Fhealthz\n```\n\n预期返回：\n\n```json\n{\"status\":\"ok\"}\n```\n\n## 模型与供应商配置\n\nProductFlow 把文本和图片能力分开配置。基础设施配置（数据库、Redis、session、管理员密钥）仍然只从环境变量读取；业务配置可在前端 `\u002Fsettings` 页面写入数据库并覆盖环境变量默认值。\n\n登录门禁 `admin_access_required` 默认开启。普通工作台和私有 API 需要 `ADMIN_ACCESS_KEY` 登录。二次解锁 `\u002Fsettings` 后可关闭该开关，让普通工作台\u002FAPI 免登录访问。`ADMIN_ACCESS_KEY` 仍必须保留在环境变量中，作为重新开启登录后的管理员入口。`SETTINGS_ACCESS_TOKEN` 始终独立保护配置页读取和写入。\n\n业务整删默认关闭：`DELETION_ENABLED=false` 时商品删除和连续生图会话删除 API 会返回 403，以便体验站保留违规内容溯源证据。工作流节点\u002F连线编辑和参考图删除不受该开关影响。需要清理整条商品或会话数据时，管理员可在 `\u002Fsettings` 显式开启“启用业务删除”，或通过环境默认值开启。\n\n供应商配置：\n\n- 文案和图片供应商在 `\u002Fsettings` 的供应商档案与用途绑定中配置。供应商档案保存 Base URL、API Key 和能力；用途绑定选择文案或图片当前使用的接口与模型。\n- `TEXT_PROVIDER_KIND`、`TEXT_API_KEY`、`TEXT_BASE_URL`、`TEXT_BRIEF_MODEL`、`TEXT_COPY_MODEL`、`IMAGE_PROVIDER_KIND`、`IMAGE_API_KEY`、`IMAGE_BASE_URL`、`IMAGE_GENERATE_MODEL`、`IMAGE_RESPONSES_BACKGROUND_ENABLED`、`IMAGE_IMAGES_QUALITY`、`IMAGE_IMAGES_STYLE` 是升级迁移输入。升级后的首次启动会读取这些值并创建 `provider_profiles` \u002F `provider_bindings`；新配置请在 `\u002Fsettings` 修改。\n- Docker Compose 会把上述 legacy provider 变量传入 backend 和 worker 容器，保证旧 `.env` 中的真实 provider 能参与首次 bootstrap。默认值保持 mock，适合本地开发和无外部 API Key 的部署。\n- 文案用途支持 `mock` 和 `openai`。图片用途支持 `mock`、`openai_responses`、`openai_images`。\n- `openai_responses` 使用 OpenAI Responses `image_generation` 工具，支持参考图输入。ProductFlow 当前的连续生图分支上下文由用户显式选择的基图和参考图决定，不会自动把整段历史图片都传给 provider。\n- `openai_images` 使用 OpenAI Images API 兼容接口，适合直接生成\u002F编辑图片；连续生图由 ProductFlow 显式传入所选基图和参考图，不使用 `previous_response_id`。\n- 图片尺寸默认值仍可通过 `IMAGE_MAIN_IMAGE_SIZE`、`IMAGE_PROMO_POSTER_SIZE` 提供，并可在 `\u002Fsettings` 中覆盖。\n- 高级 tool 参数：`IMAGE_TOOL_ALLOWED_FIELDS` 控制前端可展示、后端可持久化并发送给 provider 的 tool 字段；可选默认值还包括 `IMAGE_TOOL_MODEL`、`IMAGE_TOOL_QUALITY`、`IMAGE_TOOL_OUTPUT_FORMAT`、`IMAGE_TOOL_OUTPUT_COMPRESSION`、`IMAGE_TOOL_BACKGROUND`、`IMAGE_TOOL_MODERATION`、`IMAGE_TOOL_ACTION`、`IMAGE_TOOL_INPUT_FIDELITY`、`IMAGE_TOOL_PARTIAL_IMAGES`、`IMAGE_TOOL_N`。\n\n海报模式：\n\n- `POSTER_GENERATION_MODE=template`：用本地模板\u002FPillow 渲染，不调用图片模型。\n- `POSTER_GENERATION_MODE=generated`：把确认版文案和商品\u002F参考图交给图片 provider 生成海报。\n\n提示词模板：\n\n- `\u002Fsettings` 的提示词分组可覆盖商品理解、文案生成、工作台生图和连续生图模板。\n- 单次需求写在文案\u002F生图节点或文\u002F图生图画面描述里；长期默认行为写入配置页模板。\n\n## 常用命令\n\n| 目的 | 使用 `just` | 无 `just` 时执行 |\n|---|---|---|\n| 安装后端依赖 | `just backend-install` | `uv sync --directory backend --extra dev` |\n| 安装前端依赖 | `just web-install` | `pnpm --dir web install` |\n| 应用开发库迁移 | `just backend-migrate` | `bash scripts\u002Fwith_dev_env.sh uv run --directory backend alembic upgrade head` |\n| 启动开发 API | `just backend-run` | `bash scripts\u002Fwith_dev_env.sh bash -lc 'uv run --directory backend uvicorn productflow_backend.main:app --reload --host 0.0.0.0 --port \"${APP_PORT:-29282}\"'` |\n| 启动 Dramatiq worker | `just backend-worker` | `bash scripts\u002Fwith_dev_env.sh uv run --directory backend dramatiq --processes 2 --threads 4 productflow_backend.workers` |\n| 运行 backend pytest | `just backend-test` | `uv run --directory backend pytest` |\n| 启动 Vite 开发服务器 | `just web-dev` | `bash scripts\u002Fwith_dev_env.sh bash -lc 'web_port=\"${WEB_PORT:-29283}\"; api_target=\"${VITE_DEV_PROXY_TARGET:-http:\u002F\u002F127.0.0.1:${APP_PORT:-29282}}\"; VITE_API_BASE_URL= VITE_DEV_PROXY_TARGET=\"$api_target\" pnpm --dir web dev -- --host 0.0.0.0 --port \"$web_port\" --strictPort'` |\n| 运行前端 lint | 无 just 包装 | `pnpm --dir web lint` |\n| 运行前端单测 | 无 just 包装 | `pnpm --dir web test:run` |\n| TypeScript 检查 + Vite build | `just web-build` | `pnpm --dir web build` |\n| 发布 dry run | `just release-dry-run` | `DRY_RUN=1 bash scripts\u002Frelease.sh` |\n| 生产更新 | `just release` | `bash scripts\u002Frelease.sh` |\n\n`just release` \u002F `bash scripts\u002Frelease.sh` 是 Docker Compose 生产更新入口。流程包括 `docker compose config --quiet`、停止可能占用 `29280\u002F29281` 的 legacy user-level systemd 服务、`docker compose up -d --build --remove-orphans`，以及 backend `\u002Fhealthz`、web `\u002Fhealthz`、web 代理 `\u002Fapi\u002Fhealthz` 检查。该流程不会删除 Docker volumes；普通更新不要执行 `docker compose down -v`。复用旧 systemd 生产文件时，在 `.env` 中设置 `STORAGE_HOST_PATH=\u002Fhome\u002Fcot\u002FProductFlow-release\u002Fshared\u002Fstorage`。已手动迁走旧服务时，可临时执行 `LEGACY_SYSTEMD_ACTION=skip bash scripts\u002Frelease.sh`，或使用 `LEGACY_SYSTEMD_ACTION=skip just release`。\n\n`just release-dry-run` \u002F `DRY_RUN=1 bash scripts\u002Frelease.sh` 只校验 Compose 配置并打印实际发布会执行的步骤；不会停止 systemd 服务、不会构建镜像，也不会启动或切换运行中的服务。\n\n## 主要 API 资源\n\n后端只暴露 REST API。主要入口包括：\n\n- `POST \u002Fapi\u002Fauth\u002Fsession`、`GET \u002Fapi\u002Fauth\u002Fsession`、`DELETE \u002Fapi\u002Fauth\u002Fsession`\n- `\u002Fapi\u002Fproducts`、`\u002Fapi\u002Fproducts\u002F{product_id}`、`\u002Fapi\u002Fproducts\u002F{product_id}\u002Fhistory`\n- `\u002Fapi\u002Fproducts\u002F{product_id}\u002Freference-images`、`\u002Fapi\u002Fsource-assets\u002F{asset_id}`、`\u002Fapi\u002Fsource-assets\u002F{asset_id}\u002Fdownload`\n- `\u002Fapi\u002Fcopy-sets\u002F{copy_set_id}`、`\u002Fapi\u002Fcopy-sets\u002F{copy_set_id}\u002Fconfirm`\n- `\u002Fapi\u002Fposters\u002F{poster_id}\u002Fdownload`\n- `\u002Fapi\u002Fimage-sessions`、`\u002Fapi\u002Fimage-sessions\u002F{image_session_id}`、`\u002Fapi\u002Fimage-sessions\u002F{image_session_id}\u002Fstatus`、`\u002Fapi\u002Fimage-session-assets\u002F{asset_id}\u002Fdownload`\n- `\u002Fapi\u002Fgallery`\n- `\u002Fapi\u002Fgeneration-queue`\n- `\u002Fapi\u002Fproducts\u002F{product_id}\u002Fworkflow`、`\u002Fapi\u002Fproducts\u002F{product_id}\u002Fworkflow\u002Fstatus`、`\u002Fapi\u002Fproducts\u002F{product_id}\u002Fworkflow\u002Frun`、`\u002Fapi\u002Fproducts\u002F{product_id}\u002Fworkflow\u002Fruns\u002F{run_id}\u002Fcancel`\n- `\u002Fapi\u002Fworkflow\u002Fcanvas-templates`、`\u002Fapi\u002Fworkflow\u002Fuser-template-groups`\n- `\u002Fapi\u002Fworkflow-nodes\u002F{node_id}`、`\u002Fapi\u002Fworkflow-edges\u002F{edge_id}`\n- `\u002Fapi\u002Fsettings`、`\u002Fapi\u002Fsettings\u002Flock-state`、`\u002Fapi\u002Fsettings\u002Funlock`、`\u002Fapi\u002Fsettings\u002Fruntime`\n\n上面是常用资源入口，不是完整 OpenAPI reference；操作型接口还包括连续生图生成\u002F取消\u002F重试\u002F收藏到画廊、工作流重试、模板插入和用户模板管理等。\n\n## 开源与安全边界\n\n- License：MIT，见 `LICENSE`。\n- 贡献指南：见 `CONTRIBUTING.md`。\n- 安全报告：见 `SECURITY.md`。\n- 不要提交 `.env`、`web\u002F.env`、本地 storage、构建产物、缓存、日志或 `.trellis\u002Ftasks\u002F` \u002F `.trellis\u002Fworkspace\u002F`。\n- 真实 provider API key 只应放在本地环境变量或私有部署配置中，不应写入 issue、PR 或文档示例。\n","ProductFlow 是一个面向单人或小团队商家的开源自托管商品素材工作台，旨在简化商品资料、AI文案、海报设计及图像生成等流程。其核心功能包括基于节点的画布组织商品资料与参考图，支持AI文案生成和编辑，以及连续生图会话管理。技术上，它采用了FastAPI作为后端框架，并结合React构建前端界面，确保了高性能与良好的用户体验。此外，通过PostgreSQL、Redis等数据库服务的支持，实现了数据的安全存储与高效处理。适用于需要快速创建并管理商品视觉内容的电商场景，特别适合那些希望自托管解决方案以保持数据私密性的用户。","2026-06-11 02:59:52","CREATED_QUERY"]