B
dsh-persona-presets
beyondgjc/dsh-persona-presets
Three custom agent presets, one editable character card each, with three built-in personas out of the box; import SillyTavern character-card PNGs or md/txt/json setting files, and the settings section handles naming, editing, and card-image display — edits apply on the next turn with no restart.
설치
dsh plugin --profile web add github:beyondgjc/dsh-persona-presetsREADME
dsh-persona-presets
三个自定义 agent 预设,每个预设一张可编辑的角色卡——独立插件,任何 DSH 用户可装。
- 预设:人设-自定义1/2/3(persona-598-custom-1/2/3),工具目录 = 标准模式克隆,人设行替换官方
@deepseek-ai/dsh-persona,并以 scoped 空段遮蔽宿主harness:identity开场白(只影响这三个预设,standard 不动)。 - 设置页:「角色卡」区块,每槽一张卡(可取名、常显对应预设),三槽开箱即各带一张预制人设(槽1=鲸鱼娘 / 槽2=病娇 / 槽3=小满),保存后下一回合生效(prompt 段每次组装实时读文件,无缓存无重启)。
- 导入:支持角色卡 PNG(SillyTavern 生态 V2/V3 格式,如 aicharactercards.com 下载的卡)、.md/.txt/.json——本机解析,结构化平铺成草稿,检查后保存;卡面原图存
~/.dsh/persona-presets-598/characters/<presetId>.png并在编辑区左侧展示(纯展示,不进 prompt),清空保存即删图。 - 存储:
~/.dsh/persona-presets-598/persona-settings.json,字段personas.<presetId>与presetNames,卡上限 20000 字(超 10000 字软警告 token 消耗)、名上限 60 字。
用户指南见 docs/DETAIL.zh.md。
开发
npm install
npm run build # tsdown → lib/index.js + lib/persona.js
npm test # vitest
npm run typecheck # tsc --noEmit
本包自包含:唯一运行时依赖是宿主提供的 @deepseek-ai/cordis(peer),无私有 @deepseek-ai 包,构建不依赖 dsh monorepo。
结构
src/index.ts 束行:注册设置路由(inject webServer)
src/persona.ts 人设行:deployment:persona-prefix 段,实时读卡
src/merge.ts 白名单合并(空串=删槽=回落默认卡)+ 文件装载
src/settings-page.ts 宿主半:/api/persona-settings-598/read|update,同源围栏
client/persona-settings.js client 半:设置页「角色卡」区块(手写 bundle,无构建)
presets/persona-custom.patch.yml 三预设(单根 - insert,克隆 standard 工具行)
铁律(改动前必读)
- patch yml 单根:一个 patch 文件只能有一个顶层
- insert:,第二段顶层条目会被静默丢弃。 - standard 克隆纪律:工具行复制自 dsh
presets/standard.patch.yml,上游演进需 re-diff(tests/presets.spec.ts 深比对会红)。 - interpolate: false 不可移除:用户自由文本进严格
{{}}插值会让整次组装抛异常。 - harness:identity 遮蔽是 scoped 空段,不是 config patch:全局关
includeHarnessIdentity会波及 standard;scoped 同名空段只在三预设作用域内生效(宿主机制:scoped beats global + 空段组装时丢弃)。 - 白名单合并:只有
PERSONA_PRESET_IDS内的键可写;空串删除槽位;非字符串忽略;先 trim 后截断 20000(名 60)。 - client 无构建步骤:手写 ES5 风格 bundle,逐 section 降级(抛错只禁用该 section,不炸页面);SafeZone 边界让渲染错误显示在面板内。
- 注册面全家桶 -598:cordis 插件名/slot id/API 路由/预设 id/存储目录全部带
-598,防止撞名。 - locale 锚点:
exports "./locale/*.json"必须保留——插件市场详情页读locale/<lang>.jsonmeta.detail。