dsh-theater:多角色剧场 Host 侧执行器

前言

在 DSH 里做多角色剧情或分角色对话时,常见做法是在同一会话里切换 persona,或手动开多个窗口来回粘贴。前者容易串戏、工具权限混在一起;后者难等「一手演完」再取下一句台词,也不方便给每个角色绑独立音色。

dsh-theater 是社区插件 KarBurKi/dsh-theater(分类:工作流),定位是「多角色剧场的执行器(Host 半)」:只负责给角色建独立会话、投 cue、绑音色。打分、裁决、场记、弹窗等剧本逻辑留在导演会话(场景剧情)里,插件内没有剧本引擎。

这是什么

维护者 KarBurKi。当前 README 对应版本 0.1.5(见仓库 package.json)。简介与目录一致:为每个角色创建或唤醒独立会话,投递 cue 并取回该角色输出原文;零依赖,运行时 不 import DSH 核心包。

演员表落盘为 actors.json(角色名 → sessionId / 预设 / 音色)。

核心功能

插件 README 写明「只做三件事」:独立会话、cue 投递、音色绑定;另提供演员表查询。对外暴露四个工具:

工具 用途
theater_open 为角色创建独立会话(工作区 + 预设 theater-actor),可顺带绑音色
theater_say 投一条 cue,等这一手演完,返回该角色输出原文(台词/行为/内心);默认后台送达、不切窗
theater_bind 给已存在会话绑 GPT-SoVITS 音色(写 dsh-tts 的 sessionVoices)
theater_cast 演员表 + 存活状态

预设 theater-actor 由 profile 的 cordis.patch.yml 注入(只挂 persona + compaction,不挂任何工具)。

零依赖实现方式

插件以 link: 装进 profile 后,运行时解析不到 @deepseek-ai/* 核心包。因此:

  • 消息对象按 dsh-llm 的 createUserMessage 形状手工构造({role, content, source, id});
  • 工具按 dsh-tools 的 register(definition) 契约手写(parameters 直接给 JSON Schema)。

改这两处之前,应先确认当前环境能否 import 核心包。

投递与切窗

theater_say 默认 后台送达:宿主不推 now,主人正在看的窗口不动,对方照常收消息、照常回话。要看戏时传 focus: true——宿主把 now 推到目标会话,客户端轮询到就切过去。

{ "sessionId": "session-...", "text": "...", "focus": true }   // 切窗
{ "sessionId": "session-...", "text": "..." }                   // 后台(默认)

focus: false 时也不会因「导演回合结束」自动把视图切回场景;切回同样由 focus: true 才登记导演会话。client 半未改,只跟随宿主推的 now。

正文一律用代码块包住:把 text 用三重反引号包住(```正文```)。语音播报(dsh-tts)会跳过代码块,不把投递内容念出来。该约定写在工具 description 里,不要指望会话指令长期记住——AGENTS 只在会话启动时读一次。

并发与唤醒

  1. 一个会话同时只允许一手 cue;theater_say 撞上未完成的手会直接报错。
  2. 会话未 live 时按演员表里的预设自动 resume。
  3. 回合边界靠 session/event 的 turn/start → assistant/message → turn/end 判定;只有自己开过的回合才算数,避免被上一手的收尾提前唤醒。

日志与排错(0.1.5)

宿主侧错误和警告走 console.error / console.warn,落在 stdout/stderr,由重启脚本写入 tmp_all\host-out-*.log 与 host-err-*.log。不要用 ctx.logger:产品 profile 未给 ctx.logger 挂 console exporter,宿主侧没有 exporter 写 stdout。0.1.4 及更早在 session/event 异常处用 ctx.logger?.warn?.(...),出错时可能没有任何输出;0.1.5 改为 console.error("[theater] session/event 处理失败:", error) 并带上 error 本体。仓库无自动化测试脚本,该改动以读源码与 node --check 为主,运行时确认需等实际异常场景。

安装与启用

安装方式以 README 为准:在 profile 的 package.json 里声明 link 依赖并加入 bundle,再用目录联接(Windows 示例)指向本地插件目录。

// ~/.dsh/profiles/<profile>/package.json
"dependencies": { "dsh-theater": "link:<home>/.dsh/plugins/dsh-theater" },
"dsh": { "profile": { "bundles": ["...", "dsh-theater"] } }
New-Item -ItemType Junction -Path "$env:USERPROFILE\.dsh\profiles\<profile>\node_modules\dsh-theater" `
  -Target "$env:USERPROFILE\.dsh\plugins\dsh-theater"

将 <profile>、<home> 换成你的 profile 名与本机 home 路径。插件需先放到 ~/.dsh/plugins/dsh-theater(或联接目标路径)。DSH 社区目录页:https://www.skillhub.cn/plugins/KarBurKi/dsh-theater ;源码:https://github.com/KarBurKi/dsh-theater 。

典型用法(流程)

下面是从工具职责归纳的可复现流程,剧本与 cue 文案由导演会话自行维护。

  1. 用 theater_open 为每个角色建会话,必要时一并绑音色。
  2. 用 theater_cast 查看演员表与存活状态。
  3. 导演会话按剧情调用 theater_say,text 内正文用代码块包裹;需要切到角色窗口时加 focus: true。
  4. 已有会话需补绑音色时,调用 theater_bind。

适用场景与注意

适合:已在 DSH 里用独立会话扮演多角色、并由「导演」会话编排 cue 的工作流;需要与 dsh-tts 按会话绑 GPT-SoVITS 音色的场景。

注意:

  • 插件以当前 DSH 宿主进程权限运行;安装前请阅读仓库源码与许可证,自行评估信任边界。
  • 社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本文介绍的是社区贡献插件,非官方应用商店条目。
  • GitHub 星标数为 0(目录页与公开仓库一致时以你查阅时点为准)。

结尾

dsh-theater 把多角色剧场的 Host 侧收束为四个工具:开演、说 cue、绑音、查 cast;剧本留在导演侧。若你的场景是「多窗口、等一手、可选不切窗、可选 TTS」,可按 README 的 link 安装方式接入 profile。

  • 目录页:https://www.skillhub.cn/plugins/KarBurKi/dsh-theater
  • GitHub:https://github.com/KarBurKi/dsh-theater
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜