把模糊请求转成结构化指令,确认后再交给模型
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add puyokura/dsh-1tempo该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH 插件:用 Sarashina 把请求转成 MiL,审一遍,再交给 dsh 正在运行的模型(TUI 和 Web UI)
README
由 DeepSeek 最新模型翻译生成1tempo
把含糊的请求转成 MiL,经你批准后再交给 dsh 中选中模型的 dsh 插件。
/onetempo 3Dモデルを作って ↓ sarashina が MiL へ変換(mil-spec を system に渡す) ↓ 原文と MiL を表示し、承認(必要なら修正) ↓ 承認済みの MiL を、dsh で選択中のモデルへ渡す
- 确定设计:architecture.md
- 对 dsh 的需求(写入会话的 API):dsh-feature-request.md
- 企划原案、问答记录、实测报告(proposal.md / qa-record.md / preflight-report-.md)属于本地记录,未收录进这个公开仓库。正文中的 preflight-report-run.md 指那些记录的文件名。
做什么
1. 只在 /onetempo 启动时工作。普通请求不响应。
2. 把请求发给 Sarashina API,转成 MiL。
3. 显示原文和 MiL,请你批准。批准前还能编辑。
4. 把批准后的 MiL 作为用户消息 交给 dsh 中选中的模型(source.kind: 'user')。dsh 只把 source.kind === 'user' 的消息当作用户行,/rewind 也以它为返回目标(其余消息变成上下文行,不出现在会话里)。
展开完整文档(README 剩余 1 节)
1tempo
把含糊的请求转成 MiL,经你批准后再交给 dsh 中选中模型的 dsh 插件。
/onetempo 3Dモデルを作って ↓ sarashina が MiL へ変換(mil-spec を system に渡す) ↓ 原文と MiL を表示し、承認(必要なら修正) ↓ 承認済みの MiL を、dsh で選択中のモデルへ渡す
- 确定设计:architecture.md
- 对 dsh 的需求(写入会话的 API):dsh-feature-request.md
- 企划原案、问答记录、实测报告(proposal.md / qa-record.md / preflight-report-.md)属于本地记录,未收录进这个公开仓库。正文中的 preflight-report-run.md 指那些记录的文件名。
做什么
1. 只在 /onetempo 启动时工作。普通请求不响应。
2. 把请求发给 Sarashina API,转成 MiL。
3. 显示原文和 MiL,请你批准。批准前还能编辑。
4. 把批准后的 MiL 作为用户消息 交给 dsh 中选中的模型(source.kind: 'user')。dsh 只把 source.kind === 'user' 的消息当作用户行,/rewind 也以它为返回目标(其余消息变成上下文行,不出现在会话里)。转换的来龙去脉留在插件的 storage 日志和通知里。
5. 把原文、MiL、逆翻译、转换模型、调用次数、是否批准记进 dsh 的 storage。storage 不可用时显示「日志:保存失败(原因)」,不假装已保存(只保留会话内的记录)。
需要什么
- dsh(装有 @deepseek-harness-tui/dsh-tui 的配置档)
- Node.js 24 或更高版本(测试和测量工具已确认)
- SARASHINA_API_KEY(在 Sarashina 签发。免费 beta,Google 登录,无需事先申请)
指定 key 的方式为以下任一(按优先级排序):
1. ~/.dsh/.credentials.yaml(dsh 标准凭据文件,推荐)
2. 环境变量 SARASHINA_API_KEY(用 .env 时执行 node --env-file=.env)
測定ツールの例(~/.dsh/.credentials.yaml にキーがあれば --env-file 不要)
node tools/preflight-decode.mjs --dry
用法
/onetempo [mini|nano] [back] <依頼文>
| 参数 | 含义 |
| mini / nano | 覆盖转换模型。sarashina3-mini(6 RPM) / sarashina3-nano(60 RPM,默认) |
| back | 同时显示逆翻译(把 MiL 还原成自然语言)。省略时用配置的默认值 |
| <依頼文> | 转换对象。标志之后的字符串原样使用 |
不带参数的 /onetempo 显示用法。
关于名字:项目名是 1tempo,但命令和标识符是 onetempo。dsh 的命令名和插件自有的配置命名空间必须匹配 /^[a-z][a-z0-9_-]$/(以小写字母开头),最初方案的 1tempo 以数字开头,会被拒绝(实测:command name "1tempo" must match ... / invalid TUI settings-section namespace: 1tempo)。显示名(1tempo、配置区段标题、source.plugin)仍为 1tempo。
显示与批准
- 转换结果出现在 通知栏。整理成 200 单元格以内(1tempo: 送信しました… / MiL: <送信する MiL> / 逆翻译、日志行)。
- dsh 用 channel.notify(cleanRenderText(text, COMMAND_RESULT_CELLS = 200)) 把插件的命令结果画到通知栏。超过 200 单元格的部分会被 … 截断,所以把 MiL 放开头,后续注释只放预算内的部分(插件侧不做截断)
- 长 MiL 的全文可以在批准对话框的初始值(最多 490 单元格)里读到
- 出现在会话里的只有发送消息的正文(content)。正文 只有 MiL。
- content 兼作「会话中显示的文本」和「模型读到的文本」。dsh 没有把两者分开的字段(实测:用 tools/inspect-session-log.mjs --grep 确认正文进入 agent/inbox/spliced)。因此把原文放进会话,就会原样传给模型
- 设成 includeOriginalInMessage: true 后,正文会变成「依頼: <原文>」→「MiL: …」。会话行以自己的话开头,/rewind 时容易辨认,但 MiL 的压缩效果就没了。默认是 false
- source 只能是 { kind: 'user' }(不加 form)。dsh 仅凭 isHuman = sourceKind === 'user' 这一点区分用户和插件(dsh-adapter/trajectory/projection.js),/rewind 也用同一条件选返回目标(sessionTree.js)。保持 plugin:1tempo 会变成 context 行,不出现在会话里;加上 form 则整行消失(两者都在真机上确认过)。代价:会话日志上会记成「用户发送的」。转换的来龙去脉留在 storage 日志和通知里(qa-record.md §6.22)
- 没有 API 能往会话里追加任意行。插件的命令结果会走通知(上限 200 单元格),也无法用 session.append 添加仅日志事件(不能加 ignorable)。「只在会话里显示原文」这个需求,已汇总到 dsh-feature-request.md 的提案 6(往输入框填入正文的 API)。
- 审批只有 一个编辑对话框。MiL 会作为对话框的初始值显示出来,你可以当场阅读确认。
- 直接按 Enter → 发送
- 编辑正文后按 Enter → 发送修改后的 MiL
- Esc / Ctrl+C → 取消发送(不会擅自发送未编辑的 MiL)
- 超过 dialogTimeoutMs(默认 3 分钟)也会取消
- 确认对话框(「要发送这个 MiL 吗」)已于 2026-10-14 废除。命令的输出在处理器结束后才出现,那时 MiL 已经不在画面上,等于让人在看不见的情况下审批。
- MiL 超过 490 单元格时,不打开编辑对话框,只做显示。
- MiL 只有提问、没有实质内容时,在注记里说明这一点(用来确认需求有没有遗漏)。
- 转换失败时,按配置 failureMode 处理(默认是「询问是否原样发送原文」。不会自动发送)。
- 对话框底部的操作提示(Enter to confirm · Esc to cancel 等)由 dsh 的对话框组件绘制,插件无法消除。要消除就得改成不用对话框的方式(在会话里完成的两阶段)。
安装(注册到 dsh)
这个仓库是作为 dsh 的 bundle 包做的(package.json 的 dsh.bundle.patch → cordis.patch.yml)。所以不需要解压,也不需要手动配置,只要在 dsh 的插件管理里指定 spec 就能装。
1. 从 Web UI 的 Plugins 页面(推荐)
在侧边栏的 Plugins 页面,往添加目标里填入下面这行并 Install。
github:puyokura/dsh-1tempo
- dsh 的插件管理(@deepseek-ai/dsh-plugin-manager)会用 pnpm add 把这个仓库装进配置档,默认启用 bundle,并应用同捆的 cordis.patch.yml 里的行。不需要手动编辑 cordis.patch.yml。
- 配置档启用了 HMR(patchReload: live)就当场生效。没启用就重启 dsh。
- 删除也在同一个页面做(相当于 pnpm remove)。
走智能体的话,把同样的 spec 传给 plugin_manager 工具的 install_bundle(Creator 系预设下有效。执行需要 danger-full-access 或审批)。
2. 用命令行装进配置档(bundle 方式)
不用 Web UI 时(在服务器上跑、无头环境等),用命令行做同样的操作。
cd ~/.dsh/profiles/<プロファイル名>
pnpm add github:puyokura/dsh-1tempo
接着往 package.json 的 dsh.profile.bundles 末尾加上 "dsh-plugin-1tempo"。只做 pnpm add 不会启用 bundle,这一行相当于 Install 按钮干的活。
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-plugin-1tempo"
],
- 生效时间:patchReload: live 就立即生效,否则重启 dsh。
- 想还原就 pnpm remove dsh-plugin-1tempo,再从 bundles 里删掉。
- 在服务器侧的 Web UI 里用时,SARASHINA_API_KEY 放在那台服务器的 ~/.dsh/.credentials.yaml 里。插件在执行命令时读密钥,所以放好就生效(不用重启)。
3. 直接写进配置档的补丁(手动・传统方式)
往配置档的补丁(例:~/.dsh/profiles/dsh-tui/cordis.patch.yml)的 insert: 里加一行。
- id: onetempo
name: <このリポジトリの絶対パス>/index.mjs config: model: sarashina3-nano specPreamble: off
- name 是 index.mjs 的绝对路径。Windows 上用斜杠分隔(例:C:/Users/you/1tempo-pulgin/index.mjs)。
- id 会成为设置页面拉取设置区块的命名空间。必须匹配 /^[a-z][a-z0-9_-]$/(1tempo 不行)。
- config 可省略。省略时用下面的默认值。
- 不要往已经作为 bundle 装好的配置档里加这行手动配置(同一个 id: onetempo 会重复)。往已有手动行的配置档里装 bundle 时,先删掉手动行。
- 加载失败会让 dsh 的启动回滚。想还原就删掉这 4 行。
Web UI(配置档 web)
对 web 配置档做同样的步骤(上面 1 或 2)。只有手动装的时候,才把 insert: 行放进 ~/.dsh/profiles/web/cordis.patch.yml。插件在两种宿主上都能跑(接点运行时选择)。
| 用途 | TUI(dsh-tui) | Web UI |
| 命令注册 | ctx.tuiPluginHost(带归属)。没有就用 ctx.commands | ctx.commands(核心提供。结果文本会出现在会话的命令卡片里,多行会展开显示) |
| 确认与编辑 | ctx.tuiDialogs.input(带初始值) | ctx.userQuestions.ask 的自由记述。没有初始值栏位,所以当前的 MiL 会出现在 detail 里。留空发送,就直接用那个 MiL |
| 中止 | Esc / Ctrl+C / 超时 | 取消提问,或用 dialogTimeoutMs 截断 |
| 日志 | ctx.tuiPluginStorage(~/.dsh-tui/plugin-storage/,需要 grant) | ctx.storageDomain(~/.dsh/storages/tempo_bridge.json,不需要 grant) |
- TUI 特有的 3 个服务(tuiPluginHost / tuiDialogs / tuiPluginStorage)在 Web 宿主里不存在。反过来,ctx.storageDomain 没有 mount 到 TUI 宿主(实测 2026-10-15)。
- 两种对话入口都没有的配置下,只显示 MiL,不发送(避免未经确认就发送)。
配置
用 config 或设置区(/settings)修改。未知的值会带警告回落到默认。
| 键 | 默认 | 含义 |
| model | sarashina3-nano | 转换模型(sarashina3-mini / sarashina3-nano) |
| backtranslate | off | 设为 always 也显示逆翻译(额外多调用 1 次) |
| atSymbol | ext: | 发送前替换 @ 的 ASCII 符号。@、空白和开头的 # 不能用 |
| failureMode | confirm | confirm(确认发送原文) / abort(总是中止) |
| specPreamble | off | off(只发 MiL) / prepend(前置定义行。和原典的用法相同) |
| includeFrozenExample | true | 把格式样例和请求样例一起放进转换指令 |
| stripSpecClauses | true | 从转换结果里删掉与定义逐字一致的节 |
| replyLanguageSectionEnabled | false | 在 system prompt 里加上回复语言的指示 |
| replyLanguageSection | (用日语回复的一句话) | 启用上面那项时的文面 |
| convertInstruction | (同捆的默认文) | 转换的指示文(样例接在这后面) |
| backtranslateInstruction | (同捆的默认文) | 逆翻译的指示文 |
| temperature | 0 | 为保证可复现固定为 0 |
| seed | 20261014 | 尽力而为的确定性 |
| maxCompletionTokens | 2000 | 1〜8000 |
| retryWaitsMs | [10000, 20000, 40000] | 429、临时服务器错误(5xx)、传输失败的重试间隔(最多 3 次) |
| requestTimeoutMs | 60000 | 单次调用的上限 |
| dialogTimeoutMs | 180000 | 批准与编辑对话框的上限。不显式指定,就会被宿主默认的 30 秒擅自取消 |
| minIntervalMs | null | 连续调用的最小间隔。null 时按模型的 RPM 算出(nano 1000ms / mini 10000ms) |
| includeOriginalInMessage | false | 设为 true,会在发送正文开头加上「请求: <原文>」。会话的行以自己的话开头,用 /rewind 容易识别,但那段原文也会传给模型(content 同时充当会话和模型输入,所以 MiL 的压缩效果会丢失) |
specPreamble 的用法区分(基于实测的指引)
prepend 把定义行放在 MiL 前面。和原典的使用例(例A)用法相同,目标模型不认识 MiL 时解码更稳定。代价是 payload 会多出定义行那部分长度。off 更轻,只发 MiL。
两者都通过了复现测试(preflight-report-run6-off.md / preflight-report-run7-prepend.md。本地记录)。目标模型第一次见到 MiL 就用 prepend,已经有上下文或想省 token 就用 off,以此为准。
记法(MiL)与本插件的立场
MiL 是 @AM09_21 以 CC0 1.0 公开的记法。本插件既不改进也不官方化其规范。
- 定义本体: https://x.com/AM09_21/status/2103233036817170460
- 精密化: https://x.com/AM09_21/status/2103282758231707887
- @ 冲突的报告: https://x.com/AM09_21/status/2103290587374096573
规范的抄录,以及本插件独有的追加规则都在 mil-spec/ 里。
| 文件 | 用途 |
| mil-spec/prompt-v0-snapshot-2026-09-25.txt | 传给转换调用 system 的仅定义行 |
| mil-spec/v0-snapshot-2026-09-25.md | 出处、引用、能读出的规则、未取得的记录(给人看。不传给模型) |
| mil-spec/reference-style.txt | 原典里实际用过的正文形式(转记)与合成例 |
| mil-spec/examples-v0.txt | 请求 → MiL 的样例(本插件生成。原典里没有请求的转换示例) |
| mil-spec/author-examples.md | 原典使用示例的转写,以及从中能读出的内容 |
本插件独有的规则(原典里没有。见 mil-spec/v0-snapshot-2026-09-25.md §4):
- 发送前把 token 开头的 @ 替换成 ext:,并且不还原(因为 dsh 会把 @ 展开成文件提及)。
- 可以把返答语言的指示加进 system prompt(默认关闭)。
开发
node --test "tests/*.test.mjs" # 173 件
| 路径 | 内容 |
| index.mjs | 插件本体(name / inject / apply、命令参数解析、转换流程、对话框、接点注册) |
| cordis.patch.yml | 作为 bundle 分发用的补丁(- id: onetempo 这一行)。由 package.json 的 dsh.bundle.patch 指向 |
| locale/{en,ja}.json | dsh 插件列表里显示的显示名与说明(meta.title / meta.description) |
| src/delivery.mjs | 批准后的发送(组装通知、发送正文、选择智能体、报告日志结果) |
| src/seams.mjs | 可选接点的 soft probe(即使没有该配置也不崩) |
| src/interaction.mjs | 对话接点的抽象。TUI 用 ctx.tuiDialogs(带初始值),Web 用 ctx.userQuestions(只能自由输入、没有初始值、没有超时=用自己的 signal 做 bound)。两者都没有时返回 unavailable,不发送未确认的 MiL |
| src/storage-domain.mjs | Web 宿主的持久化 ctx.storageDomain(在本地构建相当于 defineDomain 的 spec。TUI 的 tuiPluginStorage 在 Web 上不存在) |
| src/config.mjs | 配置的默认值、校验、转换指示的组装 |
| src/mil.mjs | @ 替换、MiL 校验、双块抽取、定义逐语节去除、参数解析 |
| src/sarashina.mjs | Chat Completions 客户端(429 重试、速率间隔、密钥 redaction) |
| src/message.mjs | 生成发送消息(source.kind: 'user',正文是「请求+MiL」) |
| src/log.mjs | 经 dsh storage 的日志(按 256 KiB 上限做 50 件的环形)。句柄每次激活只解析一次,不可用时按失败上报 |
| src/prompt.mjs | 返答语言的 system prompt 段 |
| src/settings.mjs | 配置节的描述符 |
| src/spec.mjs | 读取 mil-spec 文件 |
| src/examples.mjs | 解析实例 |
| src/report.mjs | 解析实测报告(复用 payload) |
| tools/preflight-decode.mjs | 事前实测(转换 → 解码测试,--dry、--decode-only) |
| tools/draft-examples.mjs | 生成实例草稿(以评审为前提) |
| tools/freeze-example.mjs | 冻结草稿(目前不用。examples-v0.txt 靠手工整理) |
| tools/check-cell-width.mjs | 显示单元格宽度的差分校验(拿自己的 cellWidth 和已引入的 dsh-tui stringWidth 比较。只有低估=宿主会截断的危险才判失败) |
测量
确认发送 payload(不调用 API)
node tools/preflight-decode.mjs --dry
转换与解码测试(目标模型可替换。转换器固定为 Sarashina)
node --env-file=.env tools/preflight-decode.mjs --count 5 --instruction example
--target-base https://api.commandcode.ai/provider/v1
--target-model inclusionai/ling-3.1-flash:free
--target-key-env COMMANDCODE_API_KEY
--out preflight-report.md
只用现有报告的 payload 试解码
node --env-file=.env tools/preflight-decode.mjs --decode-only preflight-report-run6-off.md
--target-base https://api.commandcode.ai/provider/v1
--target-model inclusionai/ling-3.1-flash:free
--target-key-env COMMANDCODE_API_KEY
验证情况
| 项目 | 状态 |
| 单元、集成测试 | 173 件通过(在真实进程中执行) |
| 转换(Sarashina → MiL) | 实测确认。把实例的形态对齐原典正文的那一刻就成立了(preflight-report-run6-off.md / run7-prepend.md) |
| 解码(没有 spec 时目标模型能否读懂) | 实测确认(commandcode 的免费模型)。用户的生产模型尚未验证 |
| dsh 的接点 | 命令注册、转换、批准对话框、编辑对话框、撤销编辑(按 Esc 中止)、发送(agents.followup。用户确认 MiL 会作为自己的发言出现在会话中)已在实机运行。写入 storage 的内容尚未确认 |
| 转换报告显示 | 仅通知栏(整理在 200 个单元格以内)。dsh 没有把内容输出到会话的插件 API。需求见 dsh-feature-request.md |
| 目标模型选定 | 未确定(仅在免费模型上确认过) |
许可证与归属
- 本插件的代码采用 MIT 许可证(LICENSE)。
- MiL 的记法由 @AM09_21 以 CC0 1.0 公开。原典 URL 保留在本 README 与 mil-spec/ 中。
- mil-spec/examples-v0.txt 不是原典,而是本插件编写的教材。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
puyokura/dsh-1tempo
把模糊请求转成结构化指令,确认后再交给模型
相关插件 · 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,362已汉化DSH
71.4
终端编码代理esengine/DeepSeek-Reasonix
· 指南 · ACP · 扩展开发 · 规格 · 官方网站 · Discord · QQ
★ 36,076已汉化DSH
71.2
工作状态行动态ccch1mneyyy/working-activity
作者:chimney@ccch1mneyyy。社区项目,非 DeepSeek 官方项目。
★ 664已汉化DSH
71.2
多模型配置管家farion1231/cc-switch
跨平台桌面一体化助手,支持 Claude Code、Codex、OpenCode、DeepSeek Harness 等工具,唯一官网 ccswitch.io
★ 151,814已汉化DSH
71.1
这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。