前言¶
在 DSH Web 客户端里和智能体长聊时,模型看到的往往是「你说了什么」,却缺少「这句话是几点说的」这类上下文。有人会在正文里手写时间,也有人依赖会话元数据——但后者并不总会进入 decision.messages 那一批即将落库、送交模型的数组。若希望不改写用户原文,又想让模型与持久记录里都有可解析的本地时间,需要在官方允许的改写点上追加一条独立消息。
下面介绍社区插件 dsh-send-timestamp(npm 包名 @local/dsh-send-timestamp,维护者 guo120629-dotcom)。它在聊天输入框工具栏右侧增加「时间戳」开关;开启后,每条你提交的用户消息后面会跟一条只在会话记录与模型上下文中存在、对话框里不显示的时间戳消息。
这是什么¶
- 定位:DSH 客户端类插件(Web composer 工具栏 + Host 端
agent/pre-step注入)。 - 分类:客户端(SkillHub 目录:guo120629-dotcom/dsh-send-timestamp)。
- 源码:github.com/guo120629-dotcom/dsh-send-timestamp(许可证 MIT,当前 package 版本 1.0.0)。
对话界面里你仍只看到自己的原话;会话记录与模型收到的是「原话 + 隐藏时间戳」,例如 README 中的示意:
对话界面: 你: 帮我看下这个报错
会话记录与模型收到:
你: 帮我看下这个报错
(隐藏)[10-16 10:23:45]
核心功能¶
时间戳格式¶
| 规则 | 取值 |
|---|---|
| 默认格式 | [MM-DD HH:mm:ss](月-日 + 时:分:秒,24 小时制,本地时间,各段补零) |
预设 time |
[HH:mm:ss](纯时间) |
预设 datetime |
YYYY-MM-DD HH:mm:ss(带年份,不带方括号) |
| 预设回落 | 非法或缺省的 preset 归一化为默认的 monthday |
格式预设是全局的;开关是逐会话的(见下文)。
开关与持久化¶
- 开关粒度:逐会话。
sessions[sessionId]优先;该会话从未被用户拨动开关时,回落到全局enabled。在一个对话里关闭不会影响其他对话。 - 会话 id:Host 侧来自
agent.session.id(Session.id取header.id);Client 侧来自槽位 standard props 的sessionId。 - 落盘:settings 路径写
sessions字典(Host 端Schema.dict(Schema.boolean())且.volatile());兜底为 localStorage 的dsh-send-timestamp:sessionsJSON 表。 - 读取接缝:
src/client/toggle.ts优先ctx.configForms.get('send-timestamp'),其次第三方settingsScope,再退回 localStorage(dsh-send-timestamp:enabled/dsh-send-timestamp:preset)。任一步失败只降级、不抛错。
Host 端 Config 字段均声明为 .volatile(),与 Client 通过 cordis.patch.yml 里 id: send-timestamp 对应的配置表单读写。
注入规则(Host)¶
改写发生在 agent/pre-step 的 decision.messages 上,而不是客户端提交前拦截(Web 端 inputActions 无 send / steer 类钩子)。插件在回调里 await next() 后,在仍拥有决策的前提下 spread 决策对象并替换 messages 数组。
- 不改写用户原文:时间戳作为独立合成消息追加在批次末尾。
- 触发条件:仅当本批存在
role === 'user' && source.kind === 'user'的消息时注入;纯插件上下文步骤不注入。 - 取时时机:在
agent/pre-step里new Date(),不在模块加载时取。 - 不显示:合成消息
source.kind !== 'user',Chat 侧经contextMessage()归为context节点;不含tool-addition/tool-removal的 context 节点会被isVisibleChatNode()隐藏。 - 去重:末尾已是当前预设同格式的时间戳时不追加。
- 斜杠命令:以
/开头(含前导空白)的用户消息不追加。 - 空文本:无 text 片段的纯附件消息不追加。
- 身份:合成消息
id使用crypto.randomUUID(),发布前deepFreeze。
因此落库与送交模型的内容与 decision.messages 一致;输入框提交后会清空,界面上不会出现「输入原文与会话内文案不一致」的分叉。
安装与启用¶
已抓取资料与目录页未给出统一的 CLI「一条命令安装」原文。本地开发或自管 profile 时,可按仓库说明构建,并在 profile 的 cordis.patch.yml 中声明插件行(id 与设置命名空间均为 send-timestamp)。
构建与测试:
npm install
npm run build # → lib/index.js、lib/timestamp.js、lib/client.js
npm test # → node --test "test/*.test.mjs"
手动改默认开关与格式,可在 profile 中编辑插件配置,例如:
- id: send-timestamp
name: '@local/dsh-send-timestamp'
config: { enabled: true, preset: 'datetime' }
SkillHub 将本插件标为「可安装」;若你通过社区目录安装,请以目录页当时展示的步骤为准,安装前阅读仓库源码与 MIT 许可证。插件在当前 DSH 进程权限下运行,与 DeepSeek / 幻方无官方从属关系。
典型用法¶
- 在 Web 聊天输入框工具栏右侧打开「时间戳」开关(可按会话单独开关)。
- 正常输入并发送一条用户消息;对话框只显示你的文字。
- 在会话记录或模型侧可见紧随其后的隐藏时间戳行,默认形如
[10-16 10:23:45]。 - 若需要带年份的全局格式,将 profile 中
preset设为datetime;仅需当日时刻可用time。
发送以 / 开头的命令行内容时,不会追加时间戳;连续发送且末尾已是同格式时间戳时,不会重复追加。
适用场景与注意¶
适合:长对话里希望模型感知「消息发生的本地时刻」,又不想污染用户可见气泡或改写原文的 DSH Web 用户与智能体开发者。
注意:
- README 标明:按钮的实际渲染位置与外观、
configForms写入是否落到 Host profile,依赖运行时服务,未在资料中宣称已在真实浏览器全量验证。 - 官方
settings.plugin.item槽位在 0.2 已删除;本插件未单独做设置卡片,开关在输入框工具栏即可。 - 本插件除
@deepseek-ai/schemastery外不 import 其他@deepseek-ai/*包,也不依赖dsh-llm。
结尾¶
dsh-send-timestamp 用 Host 端 agent/pre-step 在每条真实用户消息后追加隐藏、可配置格式的本地时间戳,并用逐会话开关控制是否启用。进一步了解可查看 SkillHub 目录页 与 GitHub 仓库。