Skip to content
dsh.fish
Bundle

dsh-composer-image-tools

聊天输入框图片工具(自研):上传图片(≤10MB 防烧 token) + 自定义区域截图(Electron desktopCapturer),注入 DSH 草稿图片轨。零外部依赖。

Source
ai-yucheng
stars
1 stars
License
MIT
Updated
Updated 13 days ago

Readme

# 🖼️ dsh-composer-image-tools · 聊天输入框图片工具

> 给 DSH 聊天输入框补上"看图"的入口 —— 上传图片 + 自定义区域截图,**自研实现**,零依赖。
> **Image tools for the DeepSeek Harness composer: upload & region-screenshot, straight into the draft.**

[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![DSH](https://img.shields.io/badge/DSH-0.1.0--rc.7-4D6BFE.svg)](https://github.com/deepseek-ai/deepseek-harness)
[![GitHub](https://img.shields.io/badge/GitHub-ai--yucheng-181717?logo=github)](https://github.com/ai-yucheng/dsh-composer-image-tools)

在 DSH 聊天输入框工具栏加两个按钮:**📎 上传图片** 和 **📷 区域截图**。图片进入 DSH 草稿图片轨,随消息发送,可被 modlens / describe-image 等图片插件读取——让模型真正"看见"你发的图。

---

## 📖 目录

- [🎯 这是什么?](#-这是什么)
- [✨ 核心功能](#-核心功能)
- [🧠 工作原理](#-工作原理)
- [🚀 快速开始(小白向,2 分钟)](#-快速开始小白向2-分钟)
- [🎯 使用教程](#-使用教程)
- [❓ 常见问题 FAQ](#-常见问题-faq)
- [📸 示例截图](#-示例截图)
- [🤝 配套项目](#-配套项目)
- [📜 更新日志](#-更新日志)
- [📄 协议](#-协议)

---

## 🎯 这是什么?

| 能力 | 说明 |
|---|---|
| 📎 **上传图片** | 打开系统文件选择器(可多选),图片注入草稿,随消息发送。超过 **10MB** 自动拦截(超大图按 tile 计费消耗大量 token) |
| 📷 **区域截图** | **自定义位置截图**:点击 → 全屏显示捕获画面 → 鼠标拖拽框选任意区域 → 裁剪成 PNG 注入草稿。不依赖微信/任何外部截图工具;`Esc` 取消 |

> 💡 **微信 Alt+A 截图怎么办?** DSH 原生支持 **Ctrl+V 粘贴图片**——Alt+A 截图后直接在输入框 Ctrl+V 即可。📷 按钮是"自定义框选截图"的独立能力,两者互不干扰,满足"没登录微信也要能截图"的场景。

---

## ✨ 核心功能

### 📎 上传图片

- 多选图片,注入 DSH 官方草稿图片轨(与拖拽上传同一路径)
- **≤10MB 限制**:超限文件拦截并提示("超大图片会消耗大量token"),未超限的正常上传
- 按钮悬停显示限制说明

### 📷 区域截图(自定义框选)

- **不依赖浏览器 getDisplayMedia**(在 DSH 的 Electron 环境实测 `NotSupportedError`)——改走**插件服务端**(Electron 主进程 `desktopCapturer`)截取整屏
- 前端全屏遮罩显示捕获画面 → **鼠标拖拽框选** → 松开即裁剪注入
- 坐标换算零偏移:显示尺寸由 JS 精确计算,选框用屏幕坐标直算
- `Esc` 取消;选区 <5px 自动取消;截屏失败有可操作提示

### 🛡️ 设计特点

- 纯客户端能力零依赖;服务端仅一个截屏路由
- 图标、样式、交互全部自研(未复制任何现成插件代码),CSS 前缀 `dcit-` 防冲突
- 与 dsh-audio-copilot 的 🎤 麦克风按钮同栏并排

---

## 🧠 工作原理

```
┌──────────────────────── 浏览器端 (dsh.client) ────────────────────────┐
│  聊天输入框工具栏 ── 📎 上传  📷 截图(与 🎤 同栏)                    │
│                                                                      │
│  📎 上传:input[type=file] 多选 → 构造 DataTransfer → 合成 drop 事件  │
│          → DSH document 级 drop 监听 → createDraftImages(官方路径) │
│                                                                      │
│  📷 截图:GET /composer-image-tools/capture-screen(fetch)           │
│          → 拿到整屏 PNG → 全屏遮罩 → 拖拽框选 → 裁剪 → 同样合成 drop │
└───────────────┬────────────────────────────────────────────────────────┘
                ▼
┌──────────────────────── 服务端 (cordis 插件) ──────────────────────────┐
│  GET /composer-image-tools/capture-screen                             │
│    Electron desktopCapturer 截取主屏 → PNG base64 返回                 │
│    (浏览器 getDisplayMedia 在 Electron 不可用,必须走主进程)          │
└────────────────────────────────────────────────────────────────────────┘
```

---

## 🚀 快速开始(小白向,2 分钟)

### 第 0 步:确认前置

- **DSH Desktop** 已安装
- **Node.js ≥ 20**(DSH 自带)

### 第 1 步:安装插件

在 DSH 的 profile web 目录执行:

```bash
# 方式 A:GitHub 源码(推荐)
git clone https://github.com/ai-yucheng/dsh-composer-image-tools.git
pnpm add dsh-composer-image-tools@link:C:/绝对路径/dsh-composer-image-tools

# 方式 B:npm(若已发布)
pnpm add dsh-composer-image-tools
```

在 profile 的 `package.json` → `dsh.profile.bundles` 数组追加:

```json
"dsh-composer-image-tools"
```

### 第 2 步:重启 + 验证

1. **重启 DSH Desktop**(服务端截屏路由生效)
2. **硬刷新浏览器** Ctrl+Shift+R
3. 聊天框工具栏出现 📎 和 📷 按钮 → 🎉

---

## 🎯 使用教程

### 上传图片

1. 点击工具栏 **📎** 按钮
2. 系统文件选择器里选一张或多张图片(≤10MB)
3. 图片出现在输入框上方草稿区
4. 输入文字(可选)→ 发送

### 区域截图

1. 点击工具栏 **📷** 按钮
2. 屏幕被全屏遮罩覆盖,顶部提示"拖动鼠标框选截图区域 · Esc 取消"
3. **按住左键拖拽**框选想要截取的区域 → 松开
4. 选区自动裁剪成图片出现在草稿区 → 发送

> 不想截了:按 `Esc` 取消。

### 微信 Alt+A 截图

Alt+A 截图后(图在剪贴板)→ 直接在输入框 **Ctrl+V** 粘贴即可,无需点任何按钮。

---

## ❓ 常见问题 FAQ

**Q:按钮不出现?**
重启 DSH + 硬刷新;确认 `dsh.profile.bundles` 已加本插件。

**Q:点 📷 提示"截图服务未就绪:请重启 DSH"?**
服务端截屏路由未加载——重启 DSH Desktop 即可(路由在插件服务端注册)。

**Q:上传超大图没反应?**
超 10MB 会被拦截并 toast 提示,这是设计(防烧 token)。

**Q:📷 框选有偏移?**
已修复:坐标由 JS 精确计算,选框直接跟随鼠标。如仍有偏移请反馈(附 DSH 版本)。

**Q:截图会依赖微信吗?**
不依赖。📷 是独立的自定义框选截图;微信 Alt+A 走 DSH 原生 Ctrl+V,两者分开。

---

## 📸 示例截图

| 使用界面 | 本地上传 | 相机框选 | 输入框图片工具 |
|---|---|---|---|
| ![使用界面](docs/screenshots/使用界面.png) | ![本地上传](docs/screenshots/本地上传.png) | ![相机框选](docs/screenshots/相机框选.png) | ![输入框图片工具](docs/screenshots/输入框图片工具.png) |

---

## 🤝 配套项目

同系列 DSH 插件(均为自研,开源):

- [**dsh-audio-copilot**](https://github.com/ai-yucheng/dsh-audio-copilot) —— 语音工作台:🎤 语音输入按钮(多引擎转写,中文/方言/外语)+ 🔊 文字转语音 + audio_probe/ask 工具。与本插件的 📎📷 按钮同栏并排。

---

## 📜 更新日志

详见 [CHANGELOG.md](CHANGELOG.md)。关键里程碑:

- `0.1.0` — 区域截图改走主进程 desktopCapturer(修复 Electron 下 getDisplayMedia 不可用)、上传大小限制、框选零偏移

---

## 📄 协议

MIT © [ai-yucheng](https://github.com/ai-yucheng)

Install

dsh plugin --profile web add github:ai-yucheng/dsh-composer-image-tools

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source