Bundle
@a9i5k4/dsh-draw-gacha
DeepSeek绘画抽卡:给 DeepSeek Harness 发送按钮旁加一根 3D 拉杆,拉下去就会用模型思维链的文本信号开一局像素风「滑动变祖器」抽卡。Just for fun.
- Source
- Aik358
- stars
- 3 stars
- License
- MIT
- Updated
- Updated 4 days ago
Readme
# DeepSeek绘画抽卡 (dsh-draw-gacha)
> 给 DeepSeek Harness 的发送按钮旁装一根 3D 拉杆——拉下去,用模型思维链的文本信号开一局像素风抽卡。**纯属娱乐,Just for fun。**
> 预览:克隆仓库后直接打开 `persistent/dev-preview.html`(零依赖,双击浏览器即可观看完整三维抽卡演出,无需 DSH)。
> **2026-08-18 更新 (v0.1.6)**: `llm/stream` 监听器改为消费方防御——`for await (const chunk of await next())` 先 await 再迭代。链上任何下游监听器返回 Promise 或流都能安全透传,不再有「async 监听器包 Promise → 全局模型调用崩溃」的隐患。
---## 这是什么
DeepSeek Harness(DSH)的模型调用效果方差很大,像抽卡一样忽好忽坏。这个插件把"抽卡"变成了字面意思:
1. 在发送区原生发送按钮右侧,出现一根 **3D 拟真机械拉杆**(金属壳体 + 长行程黄色握柄)。
2. 向下拉动握柄到底、金光满溢后松手——消息照常发送,同时全屏进入一场像素风抽卡演出。
3. 插件在后台持续读取本次模型的 **reasoning 思维链**(以及正文 text 通道),实时统计 10 类文本信号:
- **计划**:`I will / I'll / I need / we need / we should / 我会 / 我需要 / 我们得…`
- **验证**:`verify / check / test / confirm / double-check / make sure / 验证 / 检查 / 核实…`
- **自纠错**:`however / wait / I was wrong / let me reconsider / 但是 / 重新 / 等等…`
- **严谨性**:`constraint / trade-off / edge case / 约束 / 边界 / 权衡…`
- **结构**:`first / second / step / finally / 首先 / 其次 / 总结…`
- 以及 `let me / 让我` 等弱风格信号。
4. 统计足够充分后(**最短演出 15 秒 + 观测数据足量**,或模型已答完),返回舱落地,按信号稀有度揭示卡面:**白 · 小难梁 / 蓝 · 牢梁 / 黄 · 梁子 / 橙 · 梁圣 / 红 · 梁祖**。
> 拉杆拖动的信号会跨流式分片拼接统计(DeepSeek 会把单词切成 `I wi` + `ll`,插件做了跨 chunk 尾巴缓冲,不会漏检)。
---
## 核心演出
- **半透明灰遮罩**(`rgba(26,30,38,.62)` + 毛玻璃模糊):不遮挡对话,随时能看见背后内容。
- **三舱下坠**:三个 CSS 3D 多面体返回舱从母舰分离,沿固定航向下坠——监听期间持续循环下落,模型答完才播放落地动画(白闪 → 压扁 → 冲击波 → 尘土)。
- **一大两小结算**:中间大卡是**「滑动变祖器」**梁系立绘 + 档位刻度(拉 → 燃 → 稳 → 夯),左右两张武器小卡;星级按稀有度点亮。
- **趣味文案**:每个档位多组随机抽卡台词,结果由 `seed` 驱动。
- **内置 BGM**:Web Audio 生成的 8 秒工业电子循环,可一键静音,无外部素材依赖。
- **操作**:右上角 ✕ 随时关闭;**SKIP** 按当前观测立即结算(不取消模型请求);结算卡面点击任意处或「点击继续」关闭。
- 完整支持 `prefers-reduced-motion` 与窄屏布局。
---
## 为什么这样设计(理念)
- **结算条件 = 数据足量,不是模型答完**。模型可能干 40 分钟,但插件观测到足够信号(约 1200 字符 或 信号总数 ≥ 6)就会在最短 15 秒后落地结算,绝不陪你下坠 40 分钟。
- **`let me` 不是罪**。它只是弱风格信号;只有当验证/自纠错/结构信号都缺失时才产生轻微负分。
- **不保存思维链**。Host 只保留计数、长度、阶段与极短采样,完整 reasoning 永不落盘、永不进入浏览器。
- **纯娱乐声明**:所有结论仅基于生成过程中的文本信号,不代表答案质量、模型能力、版本信息、人物能力或任何官方关系。
---
## 安装
### 方式一:DSH Profile 插件(推荐)
```bash
dsh plugin --profile web add @a9i5k4/dsh-draw-gacha
```
然后在 Profile 的 `cordis.patch.yml`(`$DSH_HOME/profiles/web/cordis.patch.yml`)注册插件行:
```yaml
- insert:
- id: draw-gacha
name: '@a9i5k4/dsh-draw-gacha'
```
重启 `dsh web` 即可。
### 方式二:本地 link 开发安装
```bash
# 克隆或解压到本地目录后
dsh plugin --profile web add link:D:/path/to/dsh-draw-gacha
```
同样需要把插件行加进 Profile 的 `cordis.patch.yml`。
---
## 使用
1. 在任意会话输入一条消息(拉杆在空草稿/忙时会禁用)。
2. 按住拉杆握柄,沿机械导轨向下拉到底(约 82px 行程,88% 阈值),金色光辉满溢后松手。
3. 消息发送,全屏抽卡演出开始,三个返回舱持续下坠,副标题实时显示 `reasoning X · text Y` 与信号统计。
4. 数据足量(或模型答完)后:落地 → 冲击 → 卡面揭示 → 星级 → 随机文案。
5. 点击任意处或「点击继续」关闭;随时可用右上角 ✕ 或 SKIP。
> 键盘:`Enter` / `Space` 可触发完整拉杆动作;`Escape` 取消未发送的拉杆状态。
---
## 开发
```text
persistent/
├── lib/index.js # Host:llm/stream 监听、10 类信号统计、/api/draw-gacha/* 路由
├── lib/client.js # 浏览器端:拉杆 + 三维演出 + 结算(dsh.client bundle)
├── cordis.patch.yml # 插件行声明
├── dev-preview.html # 独立开发预览页(零依赖,双击即看,不依赖 DSH)
└── package.json
```
- Host 只读 `llm/stream` 并原样转发每个 chunk,不改写冻结的 `GenerateOptions`。
- 通过 `options.sessionId + generation` 隔离多会话;`purpose=compaction/session-title` 的辅助请求被排除。
- 信号统计支持中英双语思维链,跨 chunk 尾巴缓冲(120 字符)防止分片切词漏检。
- 想改演出:先改 `dev-preview.html` 预览,满意后再同步进 `lib/client.js`(两边代码一致)。
---
## 验证
```bash
node --check lib/index.js
node --check lib/client.js
```
本地离线模拟(5 字符极端分片的中英文思维链)可确认全部 10 类信号计数 > 0。
---
## 许可
MIT。插件代码与 CSS 原创;梁系立绘与「滑动变祖器」相关素材来自社区开源项目([Liang-Saint-Slider](https://github.com/BruzWJ/Liang-Saint-Slider) 等),复用/再分发请遵守其原始许可。人物与主题仅为玩梗,与任何真实人物或 DeepSeek 官方无关。
---
## 免责声明
> 本结果仅根据生成过程中的文本信号娱乐性结算,不代表答案质量、模型能力、模型版本信息、人物能力或任何官方关系。抽卡有风险,拉杆需谨慎。
Install
dsh plugin --profile web add github:Aik358/dsh-draw-gacha
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install a9i5k4-dsh-draw-gacha from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.