dsh-image-creator
v0.4.0
Published
GPT-Image2 提示词画廊 — DeepSeek Harness web client plugin: a floating gallery over the awesome-gpt-image-2 dataset, with search, category/style/scene filters, AI semantic search via the session's LLM, zh/en prompt toggle, and one-click local image generation
Maintainers
Readme
dsh-image-creator
GPT-Image2 提示词画廊 — DeepSeek Harness web 客户端插件。仿 gpt-image2.canghe.ai 的呈现形式,把 awesome-gpt-image-2 数据集(src/awesome-gpt-image-2/data 下的 cases.json + images/)渲染成一个悬浮在 DSH 页面上方的画廊层:半透明遮罩 + 居中面板(自带 sticky 顶栏,面板整体滚动),原页面在面板四周保持可见,点遮罩或 Esc 关闭。
功能
- Hero 指标:529 案例 / 13 分类 / 22 模板,GitHub 与原站入口
- 精选条:featured 案例横滑(点图进预览)
- 筛选:全文搜索(标题/Prompt/来源/标签)+ 分类/风格/场景下拉 + 分类 chips(带计数)
- 案例网格:懒加载图片、Prompt 预览、标签、GitHub 溯源;分页渐进渲染(每页 48)
- 试一试(生图):卡片/预览的「⚡ 试一试」打开生成面板 — 左侧可编辑提示词 + 生成按钮,右侧展示结果;后台串行执行
ollama run draw <提示词>(5 分钟超时),CLI 输出按 整体 base64 / 内嵌 base64 段 / 图片文件路径 三种方式解析;每个案例最近一次结果缓存在浏览器(最多 12 条) - 中文翻译:数据优先读取
cases_with_trans.json(缺失自动回退cases.json);试一试面板「中文」按钮在 英文原文 ↔ 中文翻译 间切换,两边都可编辑,生成使用当前显示文本;无翻译的案例按钮禁用并提示 - 环境自检(ollama + draw):宿主端启动即探测本机 ollama(127.0.0.1:11434,
OLLAMA_HOST可覆盖)与 draw 模型;模型缺失时自动后台执行ollama pull x/z-image-turbo→cp改名为draw→rm清理中间标签;「试一试」仅在环境就绪时进入生成面板,未就绪时点击弹出引导(安装/启动 ollama + 一键下载 draw,含进度条与日志尾) - AI 语义筛选(✨ AI):搜索框输入任意描述(中英文皆可),点「✨ AI」按钮 → 宿主端把 529 个案例压成一行一案的目录(id/标题/分类/标签/Prompt 预览)交给 dsh 的 llm 服务(
ctx.llm.stream),模型按语义相关性返回排序后的案例 id(最多 24 条);模型优先用当前活动会话正在使用的模型(经/api/session.list最新会话 →/api/session.models当前选择解析,30s 缓存,GUI 里切模型即时跟随),其次行配置llmProvider/llmModel,最后第一个 provider;结果横幅 + 排名顺序渲染(显示所用模型与来源),分类/风格/场景筛选可叠加;编辑搜索词或点「✕ 清除」退出;查询结果缓存(最近 32 条,忽略大小写) - 大图预览:完整 Prompt(可滚动/复制)、来源链接、←/→ 键在筛选结果中翻页、Esc 关闭
- 模板区:22 套工业级模板卡片(useWhen / guidance / 防坑清单可展开 / exampleCases 点击直达案例 / GitHub 文档锚点)
数据路由(宿主半边 index.js)
| 路由 | 内容 |
|---|---|
| GET /image-gallery/ | 索引 JSON |
| GET /image-gallery/cases.json | 529 条案例 |
| GET /image-gallery/style-library.json | 分类法 + 模板 |
| GET /image-gallery/images/* | 案例图与分类封面(immutable 缓存) |
| GET /image-gallery/cases_with_trans.json | 带翻译数据集(每案例 prompt_zh),由翻译脚本生成 |
| POST /image-gallery/generate | {prompt, caseId} → 串行调用 ollama run draw,返回 {ok, image: dataURL} |
| GET /image-gallery/ollama-status | 探测 ollama 运行状态 + draw 模型是否就绪 + 后台下载进度(4s 缓存) |
| POST /image-gallery/ollama-ensure | 触发 draw 模型准备(幂等:已就绪直接返回;缺 ollama 返回 need:ollama);同源校验 |
| POST /image-gallery/smart-search | {query} → dsh llm 语义排序(活动会话模型优先),返回 {ok, ids[≤24], provider, model, routeSource};同源校验;90s 超时;查询缓存 |
| GET /image-gallery/data-status | 数据集供给进度(phase/received/total/files/error;npm 安装首运行下载用) |
| POST /image-gallery/data-ensure | 触发/重试数据集下载(幂等;同源校验) |
数据根默认 <pluginRoot>/src/awesome-gpt-image-2/data;可在 profile patch 里用 dataRoot 覆盖(相对插件包解析)。AI 筛选模型优先级:当前活动会话的选择 > 行配置 llmProvider + llmModel > 第一个 provider 及其第一个模型。已做目录穿越防护与扩展名白名单。
批量翻译(生成 cases_with_trans.json)
node scripts/translate-cases.mjs # 全量(断点续跑,可 Ctrl-C 中断)
node scripts/translate-cases.mjs --limit 5 # 先试 5 条
node scripts/translate-cases.mjs --only 373,17 # 指定案例
node scripts/translate-cases.mjs --model ornith-1.5:35b --ctx 8192通过本机 ollama(默认 http://127.0.0.1:11434)把每个案例的英文 Prompt 批量翻译成简体中文,写入 src/awesome-gpt-image-2/data/cases_with_trans.json(原信封不变,每案例新增 prompt_zh)。特性:断点续跑(已翻译跳过)、每 5 条增量落盘、Ctrl-C 安全退出、原子写(tmp+rename)、健全性校验(CJK 占比防回显英文)、失败重试 2 次后留给下次。529 条长文本本地推理预计需数小时。注意本机 ollama 对 qwen3.8 报 unknown renderer,需 --model 选可用文本模型(如 ornith-1.5:35b)。
安装
方式一(npm,推荐):
dsh plugin --profile web add dsh-image-creator
# 重启 dsh web 生效(client 模块在启动时扫描)npm 包只含插件代码(数据集 154MB 不随包发布)。首次打开画廊时宿主端自动从本仓库 GitHub tarball 下载数据集到 ~/.dsh/dsh-image-creator/data(带进度显示,仅此一次;镜像/测试可用环境变量 DSH_IMAGE_CREATOR_DATA_URL 指向同布局 tar.gz)。
方式二(本地 link,开发用):
dsh plugin --profile web add link:/Users/clark/code/dsh-image-creator侧边栏底部出现「图片画廊」按钮,点击在页面上方浮出居中画廊面板(96vw × 92vh 以内)。面板自身滚动展示全部内容:顶栏与筛选条 sticky 固定,内容区下滚加载。Esc / 点遮罩 / 顶栏 ✕ 关闭,原页面不被替换。
结构
package.json # dsh.bundle.patch + dsh.client(web 平台,立即注入)
cordis.patch.yml # profile 层:插入 image-creator 行
index.js # 宿主半边:webServer 前缀路由(守卫式注册,非 web profile 下空转)
data-provision.js # 数据集自举:npm 安装首运行从 GitHub tarball 下载解压到 ~/.dsh 缓存(守卫式解压)
client.js # 浏览器半边:sidebar.footer.action 启动器 + shell.overlay 悬浮画廊层
scripts/translate-cases.mjs # 独立翻译脚本:cases.json → cases_with_trans.json
src/awesome-gpt-image-2/ # 数据集 data/(cases + style-library + images,取自上游仓库后仅保留数据与 LICENSE)
docs/ # 数据结构逆向文档构建过程(需求 → 响应概述)
本插件由一次 DSH 会话(session-f8ef3f1c…)驱动构建,下表按时间顺序归档会话中的每一项用户需求与对应的实现响应:
| # | 阶段 | 用户需求 | 响应概述 |
|---|---|---|---|
| 1 | 逆向分析 | gpt-image2.canghe.ai 的图片内容资产用什么数据结构描述? | 从线上站点 JSON 逆向得出信封结构(529 案例 / 13 分类 / 22 模板,cases.json + style-library.json + images/) |
| 2 | 数据考证 | clone 上游仓库 awesome-gpt-image-2,按源码校对出准确完整的数据结构文档 | 产出 docs/awesome-gpt-image-2-data-structures.md,修正多处逆向推测(字段名、枚举、上游生成管线 docs → generate-site-data.mjs → data) |
| 3 | 插件雏形 | 搭建 DSH 插件,用 cases.json + images/ 仿站点呈现 | dsh-image-creator:宿主半边静态路由(index.js)+ 客户端画廊层(client.js,搜索/筛选/预览/模板/复制),cordis.patch.yml + package.json 声明,link: 安装进 web profile |
| 4 | 悬浮层改造 | 画廊从整页接管改为悬浮在 DSH 页面上方(参照 raiden-arcade),并修复内容不可滚动 | shell.overlay 半透明遮罩 + 居中面板;面板自身为滚动容器(sticky 顶栏/筛选、overscroll-behavior:contain),原页面四周可见,Esc/遮罩关闭 |
| 5 | 试一试 | 把「复制 Prompt」换成「试一试」:左侧可编辑提示词 + 生成按钮,右侧生成图,后台执行 ollama run draw | TryPanel 浮层 + POST /generate:服务端串行队列、5 分钟超时、输出三策略解析(整体 base64 / 内嵌 base64 段 / 图片文件路径);每案例最近一次结果缓存在浏览器(≤12 条) |
| 6 | 缺陷修复 | 生成报错 Unexpected end of JSON input | 根因:仍在运行的旧宿主半边无 /generate 路由 → 405 空响应体;客户端改为 r.text() + describeFailure 给出人话提示(宿主半边变更需重启 dsh web) |
| 7 | 缺陷修复 | 502「未能从 ollama 输出中解析出图片」 | 根因:draw 模型把图写成相对路径文件而非 base64;extractImage 接受相对路径(resolve 到 cwd)、读入内存后删除产物 |
| 8 | 中文翻译 | ①独立脚本:cases.json → cases_with_trans.json(每案例 prompt 中文)②插件改读翻译文件 ③试一试面板加「中文」按钮 | scripts/translate-cases.mjs(断点续跑、每 5 条原子落盘、Ctrl-C 安全、CJK 健全性校验防回显、失败重试留待下轮);客户端优先 fetch cases_with_trans.json、404 回退 cases.json;「中文」按钮在 英文原文 ↔ 中文翻译 间切换,两侧均可编辑,生成用当前显示文本 |
| 9 | 翻译模型 | translate-cases.mjs 用哪个模型?指定 ornith-1.5:35b(速度快) | 原默认 qwen3.8:huihui 在本机报 unknown renderer 不可用;PREFERRED 首选改为 ornith-1.5:35b,单案例冒烟验证(451 字符 / 24.5s)后启动全量 529 条后台翻译 |
| 10 | 缺陷修复 | #532 已翻译,但点「中文」没反应 | 根因:数据集页面加载时被模块级缓存,翻译落盘后内存不更新、按钮处于 disabled;修复:面板打开时若该案例无翻译则 cache-bust 自动补拉并热更新案例对象;按钮常可点,无翻译时点击自动尝试拉取/给出进行中提示 |
| 11 | 缺陷修复 | 502,产物文件名以连字符开头(-one-point-color-…png) | 根因:候选清洗把开头连字符当标点修剪 → 与磁盘文件名不匹配;修复:优先按 Image saved to: 整行原样解析(保留原文件名),通用词扫描同时尝试原始/修剪词;清理家目录 7 个遗留孤儿 PNG;宿主半边需重启生效 |
| 12 | 安全审计 | 检查本项目是否存在安全漏洞 | 发现并修复 6 项:跨源 CSRF 里程攻击(Sec-Fetch-Site/Origin 同源校验)、生成队列无上限(MAX_PENDING=16)、模型输出可致任意图片读取+删除(候选限 cwd 内相对名)、symlink 逃逸(lstat)、SVG 同源 XSS 载体(CSP + nosniff)、数据集 href 未消毒(safeUrl 仅放行 https);另核查路径穿越/命令注入/请求体 DoS/XSS 文本面/供应链等 8 项无问题;13 项回归测试全过 |
| 13 | 目录清理 | src/awesome-gpt-image-2 下只有 data 实际用到,其余删除 | 删 165MB(.git 160MB、上游站点源码/文档/工程文件),保留 data/ + LICENSE(MIT 再分发合规);验证活服务器四路由与翻译任务均不受影响 |
| 14 | 环境自检 | 加载时检查本机 ollama 是否启动(未启动则引导下载启动);再查 draw 模型(缺失则 pull x/z-image-turbo 并改名 draw);两者就绪才可用「试一试」,否则点击引导补齐 | 宿主端启动自检(探测 /api/tags,缺 draw 自动后台 pull → cp 改名 → rm 清理,实时进度/日志尾);GET /ollama-status(4s 缓存)+ POST /ollama-ensure(幂等、同源校验);客户端挂载即探测、未就绪每 2.5s 轮询;未就绪点「试一试」弹 GuidePanel:第 1 步装/启 ollama(命令示例 + 重检按钮),第 2 步一键下载 draw(进度条 + 失败重试) |
| 15 | AI 语义筛选 | 加模糊查询:用户输入查询内容,用 dsh 的 LLM 从内容 json 匹配最相关内容筛选呈现 | 逆向 dsh 源码定位 llm cordis 服务(ctx.llm.stream,chunk 协议 + 消息形状内联构造,零依赖);POST /smart-search:529 案例压成一行一案目录(id/标题/分类/标签/预览)→ 模型按语义相关性返回排序 id(≤24,容错解析 + 白名单过滤 + 查询缓存);客户端搜索框旁「✨ AI」按钮 → 结果横幅(模型信息)+ 排名顺序渲染,可叠加分类/风格/场景筛选 |
| 16 | 路由修正 | 「广告」匹配 0 条(deepseek-official / deepseek-v4-flash);模型不要用默认的,用当前活动 session 的模型 | 双根因:① maxTokens 600 被推理型模型的思考烧光、正文为空 → 提至 4096;② 路由落到配置异常的 provider;模型解析改为优先读活动会话当前选择(经 app 自身 RPC 载体 /api/session.list 最新会话 → /api/session.models current,30s 缓存,GUI 切模型即时跟随)> 行配置 > 第一个 provider;横幅标注「· 当前会话」;0 结果时回显模型原始输出(rawTail)辅助诊断 |
| 17 | 发布 | 清理无效无用文件;安全漏洞检查;提交代码到 GitHub 仓库 | 项目本就无残留(复核根目录/docs/scripts);密钥模式全库扫描 0 命中、新代码复查无新增攻击面;补 .gitignore;git init + 571 文件提交并创建 https://github.com/flyingtimes/dsh-image-creator 推送 main |
| 18 | 归档 | 把会话中的需求整理成「需求+响应概述」表格加进 README,记录完整构建过程 | 本表 |
| 19 | npm 发布 | 翻译全量后提交 GitHub 并打标签;插件发布到 npm(dsh plugin add dsh-image-creator 一键加载) | npm 包仅含代码(47KB/8 文件);数据集 154MB 由 data-provision.js 首运行自举——GitHub tarball(tag 优先、404 回退 main)→ 守卫式解压(拒绝 ../、绝对路径、symlink、AppleDouble)→ ~/.dsh/dsh-image-creator/data 缓存(.version 版本标记,插件升级自动重下);GET /data-status 进度 + POST /data-ensure 重试(同源校验);客户端进度条 + 轮询;真实 tarball 全流程 + 恶意条目 6/6 + HTTP E2E 10/10 验证 |
