狼人杀 · DSH Agent 预设
新建一个会话,选「狼人杀」—— 你面前的智能体就是法官(上帝),
它用子代理扮演其他玩家,按顺序叫号,把每个人说了什么原样转述给你。
整个游戏没有一个字节的 JS 代码。 规则、流程、叫号、裁决、复盘,全部写在
cordis.patch.yml 里那段 6.8 KB 的中文提示词里。
⚠️ 开局前必做:把「工作步骤展示」设成『简洁』
这一步不做,牌局会当场被剧透 —— 默认模式下每轮都会弹出「🤖 子任务状态更新」卡片,
展开就能看到各个 AI 玩家的身份和私下消息。
设成简洁后,每轮只留一行折叠条:
已完成,用时 34 秒,右侧带展开箭头
这一行恰恰是你要的东西:
| 你做的事 | 结果 |
|---|
| 不展开(默认) | 看不到任何身份与夜间动作 —— 不剧透 |
| 点右边的 ⌄ 展开 | 看到该玩家的完整发言原文 —— 复盘不受影响 |
换句话说:剧透权交回你自己手上。想看就看,不想看就一直干干净净。
法官在开局时也会主动提醒你这件事,并告诉你展开的方法。
它是怎么工作的
① 身份靠「消息前缀」切换,而不是两套预设
DSH 的 spawnTeammate 不支持给子代理指定不同的预设 —— 子代理会继承父级的 agent 预设
(这条是从真实对局日志里实测确认的,见下文"实测数据")。
所以玩家的系统提示词里,和法官一字不差,全都写着"你是全知全能的上帝"。
解法是把 persona 写成双角色:
◆ 消息以 [玩家N] 开头 → 你【只是 N 号玩家】,没有上帝视角
◆ 其余一切情况 → 你是【上帝(法官)】,全知全能
这样无论子代理是否继承 persona 都不会出事 —— 把未知量设计成不重要,比花时间去测量它更划算。
② 法官是唯一的全知者,也是唯一的隔离点
| 角色 | 知道什么 |
|---|
| 法官 | 全部身份 + 全部夜间行动 |
| AI 玩家 | 只有法官在 send_message 里写给它的那一份 |
| 你 | 只有公开信息 + 你自己的身份 |
隔离不靠机制,靠法官不把不该说的说出去 —— 全部约束都在提示词的第一节「上帝铁律」和第十节「输出纪律」里。
③ 玩家只回文本,不碰任何状态
AI 玩家没有任何游戏工具,只负责"说话 + 做决定"。所有状态都在法官的上下文和 todo_write 里。
安装
# 1. 克隆
git clone https://github.com/banana770/dsh-werewolf.git
# 2. 安装(用 DSH 的插件管理器,不要手动改 profile)
# 让 agent 执行:
# plugin_manager { action: "install_bundle", target: "<克隆目录的绝对路径>" }
装完后新建会话,在预设里选「狼人杀」。
现有会话不会变 —— 预设在会话创建时就固定了。
卸载
plugin_manager { action: "remove_bundle", target: "@local/dsh-werewolf" }
只影响这一个预设,不动任何其它插件。
怎么玩
- 新建会话 → 选「狼人杀」
- 跟它说「开始」,或用弹出的选项选板子(6 / 9 / 12 人局)和模式(我参与 / 全 AI 观战)
- 开局建议先玩 6 人局(5 个 AI,稳)
- 轮到你时会看到这样的播报:
📍 第 1 天 · 发言阶段(顺序:5→6→1→2→3→4)
5 号:「打头阵没信息,先表水:民牌一个。平安夜这板子没守卫,
只有女巫解药能解释…」
6 号:「我 6 号,民牌一张,不怕查。目前全场只有 4 号一个跳预言家的…」
1 号:(跳过发言)
🎤 轮到你了(3 号)。请发言,或回复「跳过」。
⚠️ 界面上的泄漏出口(重要)
你和法官同处一个会话,所以法官的"工作痕迹"你也看得见。
提示词管得住"法官别在正文里说",管不住界面本身。目前已知的出口:
| 出口 | 在哪看 | 剧本里的对策 | 你能做的 |
|---|
| 回复正文 | 对话流 | 第十节「输出纪律」 | — |
| 子任务状态卡片 | 每轮的折叠条 | — | 设为「简洁」(见开头) |
todo_write 进度 | 会话里的待办列表 | 第十一节:只准写阶段,不准写身份 | — |
| 成员描述 | 页头「智能体团队」/ 右侧栏 | 第十一节:只准写「N 号座位玩家」 | 按 Esc 关掉面板 |
| 团队任务板 | 右侧栏任务管理 | 第十一节:干脆不用 | — |
这些出口全部是被真实对局抓出来的,不是推演出来的。
你如果发现新的显示渠道,按同样思路堵就行。
自定义
cordis.patch.yml 里的 persona.prefix 就是整个游戏。 改它 = 改游戏。
| 想改什么 | 改哪一节 |
|---|
| 主持流程、播报格式 | 第五、十节 |
| 板子与裁决规则 | 第二、七节 |
| 给 AI 玩家的话术模板 | 第六节 |
| 泄漏约束 | 第一、十一节 |
改完的完整动作:
# 1. 改 cordis.patch.yml
# 2. 校验(YAML 没写坏、剧本没被折叠、关键段落没丢)
node tools/yaml-check.mjs
# 3. 让预设重新加载(免重启)
# plugin_manager set_bundle(false) → set_bundle(true)
# 4. 新建会话试玩
仓库结构
.
├── package.json # bundle 清单(dsh.bundle.patch)
├── cordis.patch.yml # ★ 整个游戏都在这一个文件里
├── docs/
│ ├── 01-规则手册.md # 狼人杀规则 + 10 项裁决矩阵
│ ├── 02-玩法与模式.md # 板子 × 模式矩阵
│ ├── 03-引擎设计.md # 备选方案:确定性引擎
│ ├── 04-玩家与AI设计.md # 玩家驱动、上下文构造、隔离验证
│ ├── 05-工程与集成.md # DSH preset 机制、已知坑
│ ├── 06-测试与验收.md # 六层测试计划
│ ├── 07-形态选型.md # 为什么不做独立网页
│ ├── 08-实战复盘-六人局1.md # ★ 首次真实对局复盘
│ ├── 09-实战验证-9人局1.md # ★ 对照实验
│ └── images/
├── reference/ # DSH 官方文档(只读参考)
└── tools/ # 维护工具
├── yaml-check.mjs # 改完剧本必跑
└── asar-peek.mjs # 读 app.asar 里的官方包文档
实测数据
这个预设是靠两局真实对局的日志反推着改出来的,不是一次写成的。
两份复盘(docs/08、docs/09)记录了每一次修复的证据。
最有价值的一次是 9 人局:它用的剧本恰好带着部分加固、缺另一部分,
构成了一次天然的对照实验,直接判定出:
| 发现 | 结论 |
|---|
| 子代理确实继承父级 agent 预设,且玩家与法官的 persona 一字不差 | 前缀切换规则不是过度设计,是本设计成立的前提 |
| 「输出纪律」一条规则同时压住了夜间泄漏和教练式输出 | 后加的另一条禁令是冗余的 |
todo_write 里赫然写着「狼队已定刀 5 号(3:0 一致);预言家 3 号已查 7 号(金水)」 | 界面泄漏面比预想大得多 → 催生第十一节 |
已知限制
| # | 限制 |
|---|
| 1 | 法官是 LLM,不是引擎。 规则靠它自觉,长局理论上可能漏步或算错票 |
| 2 | 玩家会继承法官 persona(靠前缀规则化解,非机制保证) |
| 3 | 常驻子代理默认上限 8 → 9 人局是上限,12 人局需调 maxActiveSubagents |
| 4 | 每个玩家每轮都要背着完整的 6.8 KB 剧本,token 成本偏高 |
| 5 | 战绩不落盘,全在会话上下文里 |
许可
BSD 3-Clause © 2026 banana770
DSH 是 DeepSeek Harness 的简称。本项目是一个社区插件,与 DeepSeek 官方无隶属关系。