dsh-soul
Đã xác minhdsh-soul · v0.7.1 · MIT · Giao diện web
为 DeepSeek Harness 添加个性化设置。
Cài đặt
dsh plugin add dsh-soul Xác nhận layer đã áp bằng dsh --profile default --dump-config — xem hướng dẫn cài plugin.
Mã nguồn
Thẻ
Tác giả
Readme
dsh-soul
DeepSeek Harness 个性化设置插件,用于配置 Agent 的昵称、回复风格、语调和自定义指令。
功能
- Web UI 个性化设置页面
- 设置页体验:中英双语文案(随界面语言切换)、dirty 检测(无改动禁用保存)、保存结果提示、提示词预览只读面板
- 启用或禁用个性化设置
- 「关于你」:设置用户昵称、职业和介绍,回复时结合你的背景
- 选择回复风格和语调(合并为单一选项):
professional(专业严谨)、casual(轻松自然)、humorous(幽默风趣)、roast(吐槽达人)、efficient(高效干练) - 特质微调(在风格和语调的基础上叠加):
- 标题和列表:
default(默认)、more(增强,采用清晰格式和列表结构)、less(减弱,使用更多段落文本) - 表情符号:
default(默认)、more(增强,使用较多表情符号)、less(减弱,尽量减少使用表情符号) - 表格:
default(默认)、more(增强,呈现对比或多字段信息时优先使用表格)、less(减弱,避免表格、改用列表或段落)
- 标题和列表:
- 回复长度偏好:
concise(简洁,只讲要点、不展开)、normal(适中,不额外约束,默认)、detailed(详尽,充分展开背景、步骤与推理) - 选择输出语言(Agent 回复语言 +
/soul命令输出语言):中文 / English - 提示词随输出语言本地化:
language=en时 system prompt 使用英文描述 - 输入自定义指令
- Agent 可调用工具
set_persona,让模型在对话中直接调整人设 - 人设预设:7 个内置人设(苏格拉底式提问者 / 极简主义者 / 资深架构师 / 教学型讲解者 / 严格代码审阅者 / 头脑风暴伙伴 / 自驱型协作者,随插件提供、不可删除)+ 多套自建人设一键切换(保存 / 使用 / 列表 / 删除,Web UI 与命令双入口);每行摘要显示风格与偏离默认的维度
- 预设只管 Agent 的人格:切换预设不会动「关于你」(昵称 / 职业 / 介绍是你本人的资料,与「Agent 怎么说话」是两码事)。内置与自建一视同仁——保存预设时只快照风格 / 特质 / 回复长度 / 输出语言 / 自定义指令,不包含身份字段;早期版本存下的完整快照会在读取时自动剥离
set_persona确认模式(requireToolConfirmation):Agent 的人设修改需经/soul confirm确认后才生效- 输入框光轨:Agent 回复中时,输入框边框显示沿边循环流动的光轨(默认颜色
#679EFE)- 颜色:预设色板、取色器或十六进制输入(如
#679EFE) - 流动速度:慢 / 中 / 快;光带粗细:细 / 中 / 粗
- 光轨起点、终点沿边框匀速推进,带渐隐拖尾;与输入框边框完全重合,不出现双线
- 设置页内置实时效果示例,随颜色 / 速度 / 粗细联动;系统开启「减少动态效果」时自动停用
- 颜色:预设色板、取色器或十六进制输入(如
/soul set键值方式修改配置项- 配置持久化保存
- 配置输入校验:字段白名单、类型、长度上限(昵称/职业 50、介绍 500、自定义指令 2000 字符)、枚举与十六进制颜色校验,非法或超限字段整单拒绝
- 配置持久化健壮性:写入为原子替换(先写临时文件再
rename,中断不会留下半份配置);读取区分「文件不存在」与「文件损坏」——损坏时保留原文件、另存.corrupt备份、拒绝覆写,并把原因直接显示在设置页,避免自定义指令与人设库被静默清空 - 配置损坏时有逃生口:「重置」会先把损坏文件移开(备份为
.corrupt)再写入默认值 —— 否则损坏状态下五条写路径全被拒,用户只能自己删文件 - 送达可观测:
/soul show的「送达」行、GET /api/soul/status、设置页提示条(configError= 配置读不出来;deliveryWarning= 配置送不到活动会话) - 提示词插值已关闭:自定义指令里的
{{…}}按字面保留,不会触发宿主提示词装配失败 - 配置更新后同步到所有活动 Agent
- 变更检测:仅在影响 Agent 行为的配置实际变化时刷新提示词并注入会话;纯外观配置(输入框光轨)只落盘,不产生注入消息
- 插件图标:插件管理列表与侧栏入口显示专属图标(
assets/icon.svg,36×36,随 npm 包发布) - 设置导航图标:设置面板左侧「个性化」那一项显示与插件图标同一套几何的图标——同一条光轨与火花,颜色与线宽则跟随邻居(单色
currentColor);DSH 的导航图标按 section id 硬编码、插件声明不了,故由客户端做 DOM 替换 - 提示词预览(只读,设置页底部折叠区):无未保存编辑时显示当前生效的提示词;表单一有改动就转为预览草稿——展示保存后真正会注入的内容,边改边看(停止输入 400ms 后自动重新编译),并在保存 / 重置 / 应用预设后自动刷新。未通过校验的字段会单独列出且不计入预览
安装
dsh plugin --profile <profile> add dsh-soul
dsh plugin --profile <profile> update dsh-soul
插件配置由 cordis.patch.yml 提供:
- insert:
- id: soul
name: dsh-soul
兼容性
插件不打包 DSH 运行时包,全部由宿主提供。DSH 会在装载前校验 peerDependencies,比较对象是 DSH 运行时版本(@deepseek-ai/dsh-app-boot 的 version),而不是这些包各自的版本:
| 包 | 范围 |
|---|---|
@deepseek-ai/dsh-llm |
>=0.1.1-rc.2 <0.3.0-0 |
@deepseek-ai/dsh-tools |
>=0.1.0-rc.6 <0.3.0-0 |
@deepseek-ai/cordis |
^4.0.1 || ^4.0.5-alpha.1 |
即支持 DSH 0.1.x 与 0.2.x(含 prerelease 版本)。可用 npm run verify:compat 在当前环境确认声明是否成立。
若 DSH 提示「[email protected] 与 DSH a.b.c 不兼容」,说明插件版本早于该 DSH 版本,升级插件即可:
dsh plugin --profile <profile> update dsh-soul
截图
设置页(关于你 + 特质)

设置页(特质 + 输出语言 + 自定义指令)

/soul 命令提示

/soul 命令输出(设置昵称、show、enable、disable、reset)

使用
启动 DSH 后,进入设置页面中的「个性化设置」栏目,修改配置并点击「保存设置」。
也可以使用斜杠命令:
/soul show 查看当前配置(含确认模式、预设数量与送达状态)
/soul set k=v 修改配置项(如 /soul set style=humorous language=en;光轨:trailColor=#679EFE trailSpeed=fast trailWidth=thick)
/soul save <名> 保存当前人设为预设(只含人格维度,不含「关于你」;内置名不可占用)
/soul use <名> 应用人设预设(内置预设同样可用)
/soul list 查看人设预设(✔ 标记当前匹配项;内置项带 [内置] 标记)
/soul del <名> 删除人设预设(delete / rm 别名;内置预设不可删)
/soul confirm 应用待确认的人设变更(确认模式)
/soul reject 拒绝待确认的人设变更
/soul reset 重置配置(保留人设预设库);配置损坏时这是逃生口,会先备份为 .corrupt
/soul enable 启用个性化设置
/soul disable 禁用个性化设置
/soul 小明 设置昵称
配置保存后会同步到所有活动 Agent,当前会话下一次请求即可使用最新配置;无实际变化的保存不产生注入消息。
Agent 也可以通过工具 set_persona 在对话中直接调整你的人设(昵称、回复风格和语调、特质、回复语言、自定义指令)。模型只会在明确请求改变称呼、语气、风格或语言时调用该工具。开启「人设变更需确认」(requireToolConfirmation)后,该工具的修改会以待确认提议返回,需使用 /soul confirm 确认或 /soul reject 拒绝后才会生效。
配置文件
插件将配置保存到 DSH 的用户数据目录,文件名为:
soul-config.json
配置示例:
{
"enabled": true,
"nickname": "小明",
"occupation": "软件工程师",
"bio": "对编程和技术感兴趣",
"style": "professional",
"language": "zh",
"customInstructions": "请保持简洁,优先给出结论。",
"requireToolConfirmation": false,
"trailEnabled": true,
"trailColor": "#679EFE",
"trailSpeed": "slow",
"trailWidth": "thin"
}
自建人设预设保存在同一文件的 personas 字段:名称 → 人设字段快照(风格 / 特质 / 回复长度 / 输出语言 / 自定义指令)+ updatedAt。预设不含「关于你」(昵称 / 职业 / 介绍)——那是使用者本人的资料,切换预设只换 Agent 的说话方式;这条由 PROFILE_FIELDS 与 PERSONA_FIELDS(lib/config.mjs)结构性保证:保存快照、应用取键、★ 匹配判据、磁盘归一化四条路径都按 PERSONA_FIELDS 白名单走,所以内置与自建行为一致。预设库变更不影响活动配置,使用预设时才应用到配置并同步会话。内置人设不落盘(见 lib/personas.mjs),列表 / 使用 / ★ 匹配统一走「内置 + 自建」的合并视图,同名以内置为准,内置名既不可保存占用也不可删除。
输入框光轨字段:trailEnabled(是否启用,默认 true)、trailColor(6 位十六进制颜色,统一大写存储,默认 #679EFE)、trailSpeed(slow / normal / fast,默认 slow)、trailWidth(thin / normal / thick,默认 thin)。这四个字段属纯外观配置,只落盘、不进入 system prompt、不触发会话注入。
字段长度上限:昵称 / 职业 50 字符,介绍 500 字符,自定义指令 2000 字符;颜色必须为 #rrggbb 形式。未知字段会被丢弃,非法或超限字段整单拒绝(HTTP 返回 400 与字段级错误明细)。
实现原理
「保存后下一次请求即生效」由两条通道共同保证(缺一不可,见 DEBUGGING.md 3.5)。
通道一:system prompt section。 插件把配置编译成 system prompt 并注册到 DSH:
spCtx.systemPrompt.section({
name: 'soul:persona',
order: 0,
// 关闭宿主提示词插值:默认开启时,用户自定义指令里任何一对完整的 {{…}}
// 都会让装配抛错(该抛错在 agent.step() 开头且无 try/catch ⇒ 每轮都失败)
interpolate: false,
text: () => compilePrompt(configCache || DEFAULT_CONFIG)
})
宿主在每一个 step 之前都会重新装配提示词,对函数式 text provider 不做缓存,并在文本变化时自行提交新的 system 快照 —— 所以这一条的更新时机是「下一次请求」。
通道二:活动会话注入。 配置变化后,插件遍历所有活动 Agent,用标准 UserMessage 调用 agent.inject():
agent.inject(createUserMessage({
content: [{ type: 'text', text: `[dsh-soul 个性化配置已更新]\n…\n${prompt}` }],
// 会话格式 v4 要求生产者自持 kind(不得再用共享的 kind:'plugin' + plugin 字段,
// 那会让每一轮在 step 开始前失败);构造见 lib/injection.mjs
source: { kind: 'plugin:dsh-soul', form: 'snapshot', sections: [{ name: 'soul:persona', text: prompt }] }
}))
agent.inject() 会把最新配置放入 Agent 的待处理上下文,在下一次请求中生效;不会主动触发新请求,也不会修改历史消息。它同时是「即时生效」的可见载体:会话里会出现一条 [dsh-soul 个性化配置已更新] 消息。
为什么两条都要:只保留通道一时,实测「会话进行中修改人设」不会在下一轮生效(0.7.1 开发中曾据此删除通道二,随后原样撤回)。
npm run verify:host与npm run verify:e2e分别把两条通道钉住,DSH 升级后请重跑。
诊断。 这两条通道静默失效时症状都是「改了配置不生效」,因此插件会如实记录送达结果:/soul show 末尾的「送达」行、GET /api/soul/status、以及设置页的提示条(configError = 配置读不出来,deliveryWarning = 配置送不到活动会话)。
许可证
MIT License,完整文本见 LICENSE。