编排循环
DSH 聊天智能体担任 GM。角色、记录员、世界/剧情作者、图片呈现者、编年者和建议生成器都是有边界的一次性子智能体。固定 persona 与工具表应形成可缓存前缀,变化的场景数据只放在本次任务说明中。
普通回合
- 验证输入并组装场景。
- 必须先调用
judge_action,逐条检查世界规则和用户规则。 - 可先显示很短的场景预览。
activate_characters选择可参与角色,得到结构化意图、可选台词和投入程度。resolve_round记录结果、公开状态、移动和物品操作;高投入且失败的角色最多重试一次。- 代码验证移动和物品操作,提交可见状态,运行触发器,并把本轮加入持久记录队列。
- 在
maxRounds内继续,或调用narrate。 - 检查已接受台词恰好出现一次、原文不变且顺序正确;两次修复失败后由引擎修正载荷。
- 通过
<roleplay-output>JSON 交给渲染器,并且只记录一次回合。
/ooc 是独立回合,必须先 ooc_ruling,不能激活角色;合法裁定后的强制变化仍需通过普通验证、记录、感知和快照流程。
/ask 是场外提问回合,唯一的动作是 ooc_answer,答案由只获得玩家角色所知内容的智能体写成,游戏主持人因此无法泄露隐藏的内容:不裁定、不进行回合、不预览、不流逝时间、不创造任何东西;之后 narrate 不带片段,回答通过 TurnOutput.ooc 的 question 标记送达。
judge_action 可以用 at(地点 key)指出行动发生的地点。当玩家角色所在的地点与它既不包含也不被包含时,无论游戏主持人怎么判断,该行动都被判为行不通,原因是角色必须先去到那里。角色不在任何地点或世界没有地点时没有证据,永远不会因此受阻。
后台边界
旁白完成就是用户可见的完成点。记录、整合、离场行动、建议和图片随后运行。读取或修改故事状态的步骤先调用 TurnEngine.settle;待处理工作写入数据库,因此重启、回退和分支不会静默丢失它。
触发器在回合开始、每轮提交后和跳时后执行。cue 只发给受众;beat 必须由旁白明确处理,并按设置过期。
runChild 通过 DSH 公开的子智能体激活,在 roleplay-helper 预设下启动子智能体,创建私有工具作用域、验证 submit_result、限制调用次数(用完后会撤下其其他工具,使每一步都必须调用工具的模型只能提交;若三步内仍未提交则被停止),并提醒未提交就停止的子智能体。工具必须在代码中执行权限和一致性规则,提示词不是安全边界。
字段顺序。 在每个工具 Schema 和辅助智能体的回答里,被其他字段依赖的字段排在前面:决定后文内容的选择项(问谁、行动发生在哪里)排在它所决定的文字之前,推理排在它所支持的结论之前,数量排在被度量的内容之后(一轮耗时排在各结果之后)。角色先写一小段第一人称的 thought,它是可选的、没有人读取,所以不按顺序写字段的推理引擎、或省略它的模型,得到的结果相同;这个顺序是尽力而为,不被遵守时没有代价(后端可能按字母顺序排列字段,或沿用对话中先前调用的顺序;thought 在请求中标为必填,但检查回答时不强制)。
长度。 角色回答中的每段文字都在指令里写明字数上限(ANSWER_LIMITS,按语言区分),一次请求最多可生成的 token 由这些上限估算:outputBudget(estimate, sampling.headroom),且不超过上限 sampling.shortMaxTokens 或 sampling.maxTokens。回答没有声明长度的辅助智能体使用上限。
系统故障不是故事。 因系统故障而无法行动的角色不会被记录,游戏主持人也不会收到原因,只被告知不要为它写任何内容;原因进入日志和这次运行的记录。角色看到的是名字(带代词),从不是键,也从不是轮次编号。
扩展时替换最小的边界,并保持错 误语义、取消、输出 Schema 和生命周期。新增阶段要覆盖普通回合、OOC、重试、回退、分支、取消、热重载和提示前缀稳定性。