发送前改写草稿,修正语法与执行顺序
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/14 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Xxsttb/dsh-input-optimizer该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 4 处,展示前 4 条)
- 发起网络请求lib/client.js:460
const response = await fetch(api(ROUTE_PREFIX + "/optimize"), { - 发起网络请求lib/client.js:717
const response = await fetch(api(ROUTE_PREFIX + "/models"), { - 发起网络请求lib/client.js:749
const response = await fetch(api(ROUTE_PREFIX + "/models/efforts") + "?" + query.toString(), { - 写入剪贴板lib/client.js:2562
void navigator.clipboard?.writeText(text);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/schemastery@deepseek-ai/dsh-llm@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-session@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-sidebar-right@deepseek-ai/dsh-client-ui-workspace给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 插件:输入框模型选择器左边有个四角星按钮,发送前帮你改写草稿——修语法、消歧义、理顺执行顺序——外加独立设置页。AI 生成。
README
由 DeepSeek 最新模型翻译生成dsh-input-optimizer
一个 DeepSeek Harness 插件,做三件事:
1. 改写你的草稿。 输入框的模型选择器左边有个四角星按钮。按下它,你已经输入、但还没发送的草稿会在发出前被改写:修正语法和措辞,并重新组织那些会悄悄削弱结果的顺序问题。
2. 编辑你已经发送的消息。 每条用户消息都带一支铅笔。点它,输入框会换成编辑区,你的草稿不受影响;发送后会从那条消息之前切出一个新分支。
3. 把对话的分支历史画成右侧边栏里的记忆树,有两种模式。
[ star ] [ model selector ] [ send ]
^
the button lives here
改写不是摘要器,也不是答案生成器。它从不回复你的请求,也从不添加事实。它交回的是同一个请求,只是写得更好。
所有内容都能在插件自己的设置页里配置:改写指令、是否跟随对话所用的模型、要固定使用的服务商和模型、模型思考的强度、以及用哪个快捷键发送编辑。
关于作者身份的说明。 代码、注释、图标、语言文件和本文档,都是应一位用户的要求,由 AI 助手生成的。见 AI-generated。
它做什么
按下模型选择器旁边的星号。Host 那一半会把你的草稿发给当前对话选中的模型——默认用低推理强度——再把改写后的文本放回输入框,让你发送前先过目。
展开完整文档(README 剩余 1 节)
dsh-input-optimizer
一个 DeepSeek Harness 插件,做三件事:
1. 改写你的草稿。 输入框的模型选择器左边有个四角星按钮。按下它,你已经输入、但还没发送的草稿会在发出前被改写:修正语法和措辞,并重新组织那些会悄悄削弱结果的顺序问题。
2. 编辑你已经发送的消息。 每条用户消息都带一支铅笔。点它,输入框会换成编辑区,你的草稿不受影响;发送后会从那条消息之前切出一个新分支。
3. 把对话的分支历史画成右侧边栏里的记忆树,有两种模式。
[ star ] [ model selector ] [ send ]
^
the button lives here
改写不是摘要器,也不是答案生成器。它从不回复你的请求,也从不添加事实。它交回的是同一个请求,只是写得更好。
所有内容都能在插件自己的设置页里配置:改写指令、是否跟随对话所用的模型、要固定使用的服务商和模型、模型思考的强度、以及用哪个快捷键发送编辑。
关于作者身份的说明。 代码、注释、图标、语言文件和本文档,都是应一位用户的要求,由 AI 助手生成的。见 AI-generated。
它做什么
按下模型选择器旁边的星号。Host 那一半会把你的草稿发给当前对话选中的模型——默认用低推理强度——再把改写后的文本放回输入框,让你发送前先过目。
改写针对五个目标,按优先级排列:
| # | 目标 | 实际意味着什么 |
| 1 | 保留意图 | 不添加你没写的内容。没有答案,没有观点,没有示例,没有开场白。 |
| 2 | 修正语言 | 语法、拼写、标点、用词错误、指代不清、搭配不一致、机翻腔。保留你的语言和语体。 |
| 3 | 修正执行顺序 | 步骤写乱了顺序,前置条件排在需要它的操作之后,目标被埋在背景里,约束条件和它约束的对象被拆开,两个不相关的请求缠在一句话里。 |
| 4 | 点明明显的隐含要求 | 如果你列出的步骤显然必须按顺序执行,它可以说出来。它绝不凭空编造要求。 |
| 5 | 精简 | 去掉废话、重复和空洞的含糊措辞。 |
指令强制执行的硬性规则:代码、命令、文件路径、标识符、数字、单位、URL、错误信息和引用文本逐字节保留;已有的 Markdown 结构和列表标记保持不变;保留原语言(包括刻意混用);已经清楚的文本原样返回;回复只包含改写后的文本——没有 Rewritten: 标题,没有外层引号,没有备注。
你应该了解的行为
- 你的编辑优先。 如果重写还在进行时你继续输入,结果就不会被应用,按钮会提示草稿已更改。模型输出永远不会悄悄覆盖更新的输入。
- 整份草稿会被替换。 结果作为一次编辑写回,所以一次撤销就能恢复你原来的内容。
- 空草稿会被拒绝,在联系服务商之前就拒绝。
- 重写是一次旁路调用。 它不带会话 id,也不带用途,所以永远不会进入对话日志,也永远不会触发那些监听 llm/stream 以捕获智能体循环流量的监听器。
编辑你已经发送的消息
把鼠标悬停在用户消息上,复制按钮旁边会出现一支铅笔。点击它不会把文本放进输入框——你的草稿会原封不动留在原地。输入框会被替换成编辑区域,原消息留在对话里,保持不变,作为你来自的那个分支的起点。
- 编辑区域从消息自身的文本开始,随文本增长,最多到略高于窗口高度的一半;它永远不会在固定框内滚动。
- 默认用 Ctrl+Enter(或 Cmd+Enter)发送,也可以用 Send 按钮。单独按 Enter 会插入换行,所以多行编辑离误发只差一次按键。
- 快捷键可配置,在设置页面上:Ctrl+Enter、Ctrl+Shift+Enter、Alt+Enter,或者完全不设。这是浏览器偏好,保存在本地,不是 Harness 的快捷键注册——Harness 已经把 Ctrl+Enter 绑定到它自己的互补操作,插件无法占用已被占用的绑定。
- Esc 取消。Cancel 按钮也一样。
- 如果 Harness 拒绝了这段文本,编辑区域会保持打开,里面是你写的内容,所以什么都不会丢。
这里的「编辑」是什么意思
Harness 的会话日志严格只追加:没有截断、回退或回滚 API,这个插件也不假装有。发送编辑会在消息之前那个事件处分叉对话,把编辑后的文本送进新分支。原消息和模型回答的一切都留在你来自的那个对话里;你正在编辑的分支加入同一血脉,在会话列表里以标题递增的形式出现。
这就是铅笔只出现在用户消息上的原因。编辑模型回复意味着问一个不同的问题,而不是修正你问过的那个。
在版本之间切换
消息被编辑过之后,它的操作行会长出 ‹ 1/3 › 箭头和一个 N/M 计数器。箭头在这条消息存在的各个对话之间切换——先是原始对话,然后是按切出顺序排列的每个分支——分组上的提示会说明你正在看哪一个。记录保存在浏览器本地。
铅笔什么时候被禁用
如果消息用 @path 引用了文件,在提供铅笔之前会先检查该文件。如果文件已更改、已消失,或者无法读取时,铅笔会被禁用,原因显示在气泡下方。
这个限制值得直说:Harness 不保留文件历史,所以「这条消息发出后文件有没有变过」无法回答。插件第一次看到这条消息时,守卫会记录一个指纹;一旦文件与指纹不再匹配、文件缺失或无法读取,就阻止操作。如果文件在消息从未上屏期间发生了变化,守卫无从得知。
记忆树
右侧边栏新增 Memory tree 标签页。它画的是会话的血缘,不是会话记录:哪个会话来自哪个会话,每一步问了什么。
- Stream —— 通向当前正在阅读的会话的那条链,随运行不断增长。这是默认视图。
- Full —— 工作区里的所有会话,包括你不在其上的分支。
每个会话是一个节点;悬停会显示启动它的提示词以及它有多少轮,节点展开后的轨道会列出它自己的轮次。虚线圆点表示正在运行的会话,实心圆点表示已结束的会话,当前会话高亮显示。会话有同级时,会出现同样的 ‹ N/M › 箭头,点击节点即可打开它。
数据来自 Harness 自己的会话目录和 turnOutline 投影 —— 这个标签页读的是会话列表已经知道的东西,不会另建一份日志。
环境要求
- DeepSeek Harness 0.2.0-rc.2 或更新版本(package.json 里的 dsh.engines.dsh)。
- 配置档的组成要包含 Harness web UI 和设置服务 —— 也就是任何正常的桌面或 web 配置档。设置页需要 @deepseek-ai/dsh-settings 和 @deepseek-ai/dsh-config-editor,自带的 desktop 和 web 配置档已经包含。
- 至少一个可用的 LLM 服务商。插件调用 ctx.llm.stream(),所以 Harness 自己能对话的服务商都能用。
安装
从这个仓库的检出目录安装:
dsh plugin --profile <profile> add /absolute/path/to/dsh-input-optimizer
打包成 tarball 也一样,而且这正是配置档存储的形态:
pnpm pack
dsh plugin --profile <profile> add ./dsh-input-optimizer-1.0.0.tgz
然后重新加载应用(或者干脆等一会儿 —— Harness 会即时同步变化后的 dsh.profile.bundles 列表),再确认:
curl http://127.0.0.1:19387/plugins/input-optimizer/models
{"ok":true,"providers":[…]} 表示 Host 那一半已经跑起来了。下次页面加载时星标按钮就会出现。
卸载
dsh plugin --profile <profile> remove dsh-input-optimizer
插件页面上保存的设置留在配置档的 cordis.patch.yml 里,位于 input-optimizer 条目下;卸载插件不会删掉这个条目,想让文件干净可以手动删除。
不要用 link: 安装后再换成 tarball。 pnpm 的 link:(junction)安装会把配置档指向你的工作副本;换成它会删除 junction,而 pnpm 会顺着重解析点走,把源目录清空。开发用的检出目录最好用 tarball 安装,或者放到一次性配置档里测试。
不要手动安装。 自己把包加进配置档的 package.json 和 node_modules,会让正在运行的进程持有一张过期的模块解析表,插件加载后变成一行死记录,还看不到任何报错。交给 dsh plugin add 来做。如果你已经手动改过,重启一次应用。
设置
打开 Settings → Input optimizer。这个页面通过 Harness 设置服务读写插件的配置,所以改动会保存到配置档的 cordis.patch.yml,重启后依然有效。
| 字段 | 默认值 | 用途 |
| Rewrite instruction | 随包附带的提示词 | 每次改写都会带上这条系统提示词。清空该字段并保存,即可恢复默认值。 |
| Follow the conversation's model | 开 | 开:用当前会话选中的模型来改写。关:始终使用下面固定的模型。 |
| Provider | (空) | 跟随关闭时使用——或者跟随的模型不可用时作为兜底。 |
| Model | (空) | 同上。 |
| Reasoning effort | low | 模型思考的用力程度。none 表示完全不发送 effort 字段。列表读取自所选模型自己声明支持的 effort,所以你选不到模型不支持的档位。 |
| Max output tokens | 4096 | 单次改写的上限。 |
| Timeout | 60000 ms | 单次改写的墙钟上限。 |
| Send edit with | Ctrl+Enter | 发送已编辑消息的快捷键。还提供 Ctrl+Shift+Enter、Alt+Enter 和 none (button only)。 |
随包附带的改写指令就是 What it does 里那套五目标提示词。它由 AI 写成,可以编辑,替换它就是重新调整优化器方向的预期做法。
开关类设置用的是胶囊开关,不是复选框,跟 Harness 自己的开关保持一致:视觉状态取决于 aria-checked,所以画出来的样子和辅助技术报告的状态不会互相矛盾。插件自己绘制控件,因为客户端插件不能依赖 Harness 的客户端包。
模型解析
每次改写都按下面的顺序解析路由,并在响应里报告用了哪一条:
1. session —— 当前会话选中的模型,前提是 Follow the conversation's model 开着,且该模型仍能解析。
2. config —— 本页固定的 provider/model。
3. 失败 —— 报 NO_MODEL 错误,提示你为会话选一个模型,或者在设置里指定一个。
effort 会对照解析出的模型所声明支持的档位做校验。如果模型不支持请求的 effort,请求会不带 effort 发出去,而不是直接失败。
HTTP 接口
Client 半边通过四条路由与 Host 半边通信,路由都挂在 /plugins/input-optimizer。它们仅限同源。
| 路由 | 方法 | Body / query | 结果 |
| /optimize | POST | { text, session?: { provider, model } } | { ok, text, provider, model, routeSource, reasoningEffort, truncated } |
| /models | GET | — | { ok, providers: [{ id, name, models: [{ id, name }] }] } |
| /models/efforts | GET | ?provider=&model= | 该模型声明支持的 efforts |
| /stat | POST | { paths: [...] } | { ok, entries: [{ path, state, size?, fingerprint? }], truncated } |
错误也是 JSON:{ ok: false, error: { code, message } }。你可能会看到这些 code:
| Code | HTTP | 含义 |
| BAD_JSON | 400 | body 不是合法 JSON。 |
| EMPTY_INPUT | 400 | 草稿为空或只有空白字符。 |
| CROSS_ORIGIN | 403 | 请求不是来自 Harness UI。 |
| BODY_TOO_LARGE | 413 | body 超过 512 KiB。 |
| INPUT_TOO_LARGE | 413 | 草稿超过 200,000 个字符。 |
| NO_MODEL | 400 | 没有可用模型 —— 见 模型解析。 |
| TIMEOUT | 504 | 改写超过了配置的超时时间。 |
| LLM_ERROR | 502 | 服务商拒绝。会带上服务商自己的 llmCode。 |
| MAX_TOKENS | 502 | 回复还没写完就撞上了输出上限。 |
| EMPTY_RESPONSE | 502 | 模型没有返回任何可用内容。 |
目录结构
dsh-input-optimizer/
├── package.json manifest: exports, dsh.bundle, dsh.client, engines
├── cordis.patch.yml the insert row; its id is the settings namespace
├── icon.svg the four-pointed star, used in plugin listings
├── locale/
│ ├── en.json plugin title/description for the plugin list
│ └── zh.json
└── lib/
├── index.js Host half: Config schema, HTTP routes, the LLM call
└── client.js Client half: the star, the pencil, the editor,
the settings page, the memory tree
lib/index.js 是 Host 那一半:它用 schemastery 声明可配置字段,打开那四条路由,通过 ctx.llm.stream() 跑改写,并为编辑守卫查询文件状态。lib/client.js 是 Client 那一半:它把星标注册进 conversation.input.right —— 也就是紧挨 conversation.input.model 左边的位置 —— 把设置页注册进 settings.section,把影子用户气泡注册进 conversation.chat.node,把编辑器注册进 conversation.composer 链,把记忆树注册进右侧边栏。按客户端规则,它不把任何 Harness 包作为模块加载。
如果你要 fork 这个项目,其中两处注册值得了解:
- 消息铅笔会遮住 Harness 自己的用户气泡。 Harness 没有给用户消息留出放额外操作的位置 —— 操作行硬编码在它的 UserMessageNodeView 里 —— 所以唯一的入口就是用同一个 conversation.chat.node key(user,出于同样的原因还有 steering)注册到 优先级更低,并绘制整个气泡。优先级最低的先渲染,所以它会占用这个单元格;由于抛出异常的 slot 条目会被放弃,影子里的 bug 会回退到 Harness 的气泡,而不是留下一个空洞。CSS 类属于插件自己,气泡用 Harness 使用的同一套 token 重绘,而不是依赖它的样式。
- 编辑器通过 conversation.composer 链替换输入框。 这条链把真正的输入框挂在下面(data-chain-overlay-fallback),并挑选第一个 select 返回非 null 的条目,所以插件的编辑器只在自己的待处理交互存在时出现,其他一切——审批、提问、子代理——都照常工作,不受影响。
cordis.patch.yml 里的 id(input-optimizer)是关键。Harness 设置服务按插件的配置档条目 id 来寻址它的易变字段,所以 Client 那一半硬编码同一个字面量,而不是导入 Host 那一半来获知它。
开发
这个插件是普通的两半式 Harness bundle。它的 Host 那一半把 @deepseek-ai/schemastery 和 @deepseek-ai/dsh-llm 作为 peer 依赖导入;配置档会提供这些依赖。要在配置档之外试用 Host 那一半,把本地的 node_modules/@deepseek-ai/ 指向 Harness 安装自带的副本。
syntax check both halves, using the Harness runtime as the Node executable
ELECTRON_RUN_AS_NODE=1 "$DSH_INSTALL/DeepSeek Harness.exe" --check lib/index.js
ELECTRON_RUN_AS_NODE=1 "$DSH_INSTALL/DeepSeek Harness.exe" --check lib/client.js
build the tarball a profile installs
pnpm pack
Client 那一半由 Harness 浏览器加载器加载,而不是 Node:它把自己包在 window.__ModuleLoader__.load({ id, factory }) 里,并且只能 require react 和 react/jsx-runtime。
AI 生成
这个仓库的每一部分都是 AI 助手响应用户请求生成的:
- lib/index.js、lib/client.js —— 实现,包括所有注释;
- icon.svg —— 四角星;
- locale/en.json、locale/zh.json —— 插件列表文案;
- cordis.patch.yml、package.json —— bundle 接线;
- README.md —— 本文档。
AI 没有从现有插件复制。它阅读了 Harness 为插件作者发布的技能、安装包里附带的 slot 与设置契约,以及已安装第三方插件的源码来学习约定,然后写下这些。这里引用的关于 Harness 内部的事实都对照运行中的安装验证过。
依赖它之前请先审查。它是针对 Harness 0.2.0-rc.2 写的,没人保证它能跟上后续版本。
License
MIT © 2026 dsh-input-optimizer contributors预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Xxsttb/dsh-input-optimizer
发送前改写草稿,修正语法与执行顺序
相关插件 · UI / 主题
破甲增强版JeffKeeping/dsh-purge-plus
dsh-purge 的非官方分支fork:适配 DeepSeek Harness 0.2.1-rc.2、破甲内核…
★ 387已汉化DeepSeek 客户端
71.9
无代码业务系统平台nocobase/nocobase
NocoBase 是什么
★ 24,804已汉化DSH
71.8
1Panel 服务器面板1Panel-dev/1Panel
全球 250 万+ 自托管用户共同喜爱。
★ 37,350已汉化DSH
71.5
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,506已汉化DSH
71.1
AI 矢量设计工具ZSeven-W/openpencil
全球首个 AI 原生开源矢量设计工具。
★ 7,027已汉化DSH
71.1
这是你的仓库?认领条目