Repository navigation
Releases: YOGEMOW/DSH-Cyrene
Release list
v0.4.0 —— 表达风格档位 + 角色扮演场景
上一次发版是 v0.3.1。这个版本把两件「只在对话里生效」的东西做完了,
另外还包含 v0.3.2 的一个静默失败修复(新版 DSH 上「发消息没反应」),
用 v3 会话格式旧版 DSH 的不受影响,但仍建议一并升级。
这一版新增什么
- 表达风格档位:五档 + custom,
/style切换,按会话生效;
风格提示词走请求尾部注入(对齐上游的注入时序),温度走agent/request。 - 角色扮演场景:默认普通对话;消息里出现
(…)场景描述时切到「叙述+对话」,
括号里写「你…」则是给你的动作指令,会照做并在括号里写出动作。 - custom 档可配置:显示名(
customLabel)、温度(customTemperature)、
强度档(customTier,硬开关,由状态决定而不是让模型猜)。
升级须知
- 对话模式预设变了(多挂
cyrene-style与cyrene-scene),需要重装预设:
node scripts/install.mjs --force(已存在且内容不同时默认拒绝覆盖)。 - 从 0.3.0 升级,请一并看 0.3.1(行尾修复:Windows 上世界书整条失效)与
0.3.2(会话来源修复:新版 DSH 上发消息没反应)两条。 - 工作模式不挂风格与场景(上游 work/code 本来就不吃风格),有测试守着。
新增
表达风格档位:style.js + /style 命令
-
五档 + custom,每档 = 一段风格提示词 + 一个温度,对齐上游 Cyrene-Agent 的
prompts/styles/与BUILT_IN_STYLE_PRESETS(lively 0.90 / healing 0.55 /
focused 0.40 / sweet 0.82;default不设采样)。 -
风格提示词走
systemPrompt.context()(请求尾部、每轮重算、order: 130,
排在常驻世界书140之前);注入外壳与上游buildStylePromptBlock()逐字一致。 -
温度走
agent/request瀑布(DSH 的预设行没有temperature字段)。
default档不写温度,跟随模型默认。 -
按会话生效:状态在
<DSH_HOME>/cyrene-style.json(最多留 50 条会话记录),
/style查看与切换(/style lively、/style default、无参列出全部)。 -
custom档读<DSH_HOME>/cyrene-style-custom.md;没写文件时/style custom
会报错提示而不是静默不注入。想给它温度就在 JSON 里加customTemperature(0–2)。 -
custom 档支持两个可选字段(只影响显示/授权,不参与玩法):
customLabel:改这一档的显示名(如叫成自己的风格名);customTier:1(默认)/2—— 硬开关。style.js会按它在注入块里写一行
授权标记(「第二档已授权」/「未授权」),模型看到的是确定事实,而不是去猜用户
有没有点头。档位本身的含义由使用者自己的风格文件定义。
角色扮演场景开关(scene.js)
- 纯文本对话模式默认普通聊天;用户这一轮的消息里出现括号、且括号里写了场景/动作
((雨夜,屋里只有一盏灯)),本轮切到「叙述+对话」的场景模式;没有括号了自动切回。 - 判断走
agent/pre-step(context()在用户消息落库前执行,看不到本轮输入);
且是状态机,只在状态切换时追加一条标记,不会每轮往历史里堆指令。 - 中文括号 ≥2 字、半角括号 ≥6 字符才算,避开
print(x)、(1)的误触发。 - 括号里用「你」描述她的动作(
(你亲了我一下))时,按动作指令处理:
照做,并在回复里用括号写出动作((亲了你一下));与场景描述可同时出现。
判据保守:以「你」开头、非问句、且有动作痕迹才算。 - 只挂对话模式;工作模式不挂(与风格同理)。
安全约定
- 风格在工作模式里被禁用:预设层面工作模式不挂该插件;
style.js的
DISABLED_PRESETS还会在运行时拒绝cyrene-work(读会话的
agent-preset/selected事件判断);新会话页的风格按钮在该模式下不显示。
原因:工作模式带 shell / 文件 / 网络权限,写作风格不该影响"能不能动手、动哪只手"。
已知限制(能力边界,非缺陷)
- DSH 的
LlmCallConfig只暴露temperature / maxTokens / stop:上游的top_p、
OpenAIfrequency_penalty、Qwenrepetition_penalty无处可放,未移植。 deepseek-flash在思考模式下温度可能不生效(上游同类规则requiresReasoningOff)。
本项目不替你改路由,只在/style的回复里提示。
升级须知
- 对话模式预设多挂了一行
dsh-cyrene/style,需要重装预设才生效:
node scripts/install.mjs --force(已存在且内容不同时默认拒绝覆盖)。 - 从 0.3.0 升级请一并看 0.3.1(行尾修复)与 0.3.2(会话来源修复)两条。
附:同时包含的 v0.3.2 修复
修复
新版 DSH 上「发消息没反应」(会话格式 v4 拒收消息来源)
- 现象:装好之后能选到模式,但发消息没有任何反应;没有任何报错指向本插件。
旧版本 DSH(如 0.1.5-rc.2)上一切正常 —— 所以自己测是测不出来的。 - 原因:世界书的命中块是一条手写的消息描述符,
source.kind写的是 v3 的裸
'plugin'。会话格式 v4 要求「生产者自有」的 kind(plugin:<插件 id>),于是整条
消息被校验拒掉:
SessionFormatError: format v4 message requires a producer-owned source kind。 - 修法:改为
kind: 'plugin:dsh-cyrene/worldbook'—— 这是 harness 自己的迁移器
(producerKind())给第三方插件生成的形态,新旧两个版本都接受。 - 已经装了的怎么办:更新代码后完全退出 DSH 再启动。JS 模块替换必须重启进程
才生效,热重载读到的仍是旧代码。 ⚠️ 别换成runtime-context:那是dsh-agent-loop自己持有的 kind,用它会让我们
注入的内容被当成它的运行时快照,进而被替换/清除。详见
docs/pitfalls.md第七节。
测试
- 单元测试 73 → 74 条。新增一条守
source.kind:必须是plugin:<id>、不能是裸
plugin、也不能是runtime-context,且注入块不能被当成真实用户语料。
v0.3.1 · 两条静默失效 + Windows 真机验证
这个版本已发过 Release,正文可直接沿用;这里补一份更细的清单。
修复
- 世界书注入的消息补
id—— 缺它会让会话历史永久打不开
(session event at seq N lacks an identified message)(c46dabc) - CRLF 检出下整份世界书静默失效:Windows 上
core.autocrlf=true检出为 CRLF,
解析层只按切行 → 每个字段尾部带\r、触发词永远匹配不上。
解析层吞掉 CRLF +.gitattributes加* text=auto eol=lf(c225499、23b9f31) cyrene-work在起不来workflowEngine的部署上整条预设判「加载失败」:
默认关闭依赖它的三行(代价是少三个工具 ≪ 整条预设不可用)(ddbb66d)- 声明导出漏了
- insert:那层(按字面用会静默失效)(61039b4) - 入口判断
import.meta.url === file://${argv[1]}在 Windows 上永不成立 → CLI 静默零输出(380e250) - 预设测试在无 DSH 环境下崩溃,导致 CI 两次 job 全红(
bdf726c) LICENSE恢复为逐字标准 MIT,让 GitHub 能识别(0804b5d)
新增
- 支持 DSH 0.2.0+ 的声明式预设注册(旧版目录方式在那一代静默失效)(
53b348d) - CI 增加真实
windows-latestjob;维护边界写进 README /CONTRIBUTING.md(9f6a769) docs/windows.md:六条实测坑 + 为什么没有install.ps1(131b1ec、23b9f31)- 工作模式压制追问,避免靠反问收尾(
2987438)
移除
- 删除
install.ps1/install.bat:作者没有电脑、无法实测,连试三轮仍未在真机跑通
(b3cc7f0、fa05aa1、4706529)
v0.3.0 · 改名 + 双模式
变更
- 改名:包名
dsh-cyrene,仓库DSH-Cyrene(9e9dc30、42f7ed1) - 新增「昔涟工作模式」预设:昔涟人设 + 标准模式全套工具(
9e9dc30) - 安装脚本支持多预设:自动发现
preset/下的每个子目录(9e9dc30)
修复
- 版本号补齐三处,并修掉「工作模式看不到」的过时断言(
80cf342) - 仓库 URL 指向实际仓库名(
42f7ed1)
文档
- 记下三个只能踩出来的 DSH 行为,新增
AGENTS.md(cfaf941) - 修正只对「单预设」成立的说法(
7d08702) - 写明
install.ps1/install.bat尚未在真实 Windows 上实跑过(690369c)
v0.2.3 · 外部评价 P0–P3
逐条核实外部评价后处理,另外修了他没提到的两处。
修复
- P0 人设正文的硬规则冲突:正文同时写着「这些词语并非绝对禁止」与「不可以使用……」,
以及「对方要求解释时必须说明」与「不需要解释为什么」。根因是上游靠请求尾部注入的时序
压过正文,本仓库合并成静态正文后时序消失。
修法是把覆盖关系显式写回正文(定向覆盖 + 一处明确例外),而不是删改上游文本(bb3b9e0) - P1 记忆通道没有净化:
memory.js原样塞进系统提示词,而记忆的写入方是模型、触发源可能是
联网结果。现在写入与注入两处都清洗,整份记忆包进显式数据分隔块(bb3b9e0) - P2 CI 与测试命令:测试头部那条
node --test tests/会挂;已改正并加警告。
新增package.json的test脚本、harness:check扩到全部运行时代码、
新增.github/workflows/test.yml(Node 22/24,无需 npm install) - P2 人设残留痕:删除上游自带的空台词行与一段逐字重复的「知识性回复」,
保留#标题作来源锚点,并在THIRD_PARTY_NOTICES如实披露 - P3 六个小口子:
forget只删-开头的条目行(短关键词不再误删标题);
scanDepth1–5 真的生效(原先被静默夹到 3);lastHit改有界 LRU(上限 64 会话);
删死代码assembleSplit();index.js版本号改为读package.json
测试
- 新增
tests/memory.test.mjs(14 条),用临时DSH_HOME,不碰真实记忆文件 - 全量 45 → 59 条通过
v0.2.2 · 世界书随包发运
新增
- 61 条世界书随包发运(
worldbook/data/),按触发词自动注入;装了就有,不需要自备(78cd969) - 注入通道按「需不需要本轮消息」拆成两条:
- 常驻块(内容恒定)→
systemPrompt.context(),只落库一次 - 命中块(需要本轮消息)→
agent/pre-step
- 常驻块(内容恒定)→
修复
- 绕开一个静默失效:
assemble()跑在用户消息落库之前,装配期读会话永远拿不到本轮输入
(新会话第一轮更是一条都没有);空文本 section 会被过滤掉,快照里看不出异常
说明
- 条目格式与字段语义来自 Cyrene-Agent 的
rag/worldbook.ts,本项目的匹配器是其简化实现
(去掉 DMAE 状态机,故「内在价值」不生效、「优先级」成为主排序键)
v0.2.1 · 修「语气变淡」
修复
- 补回原应用每轮注入的「语气规则」(句式禁止 / 语气参考 / 回复边界)。
之前因为includeRuntimeContext: false把动态块整体关掉,这段规则一并丢失,
模型退回默认助手腔:语气变淡、少了活人气(1cc8c12)
文档
THIRD_PARTY_NOTICES注明该段来自tone-injector.ts的DEFAULT_RULES,
不是prompts/下的文件;上游是随请求尾部注入,本仓库并入预设正文
v0.2.0 · 首个可用版本
「纯文本对话模式」跑通了:整份替换系统提示词做纯角色对话,附带长期记忆与可配置称呼。
新增
- 预设骨架插件:DSH 的「纯文本对话模式」agent 预设 v0.1.0(
df046e0) - 随包提供完整人设,并补齐四层授权声明(上游 MIT、角色 IP、非商用、许可证副本)(
ae13f66) - 长期记忆 + 可配置称呼:
remember/forget两个工具、{{user_nickname}}变量;
同时修复了"预设变量未注册导致装配期报错"(952d0a3)
修复
files白名单补LICENSES/,避免许可证副本漏发(6090efa)
文档
- 新增「推荐搭配」;主题配方升级为可复刻的完整配置指南(
0a67b26、d783677) - 记录原作者授权(2026-10-03)与授权凭据,并说明其排除 Live2D 模型(
1ea1a90、504faef) - 修正过时的占位说明,标注
soul.md同步风险(07ce367)