AI 模式与管理员权限
完整和简约界面在消息发送框左侧共用一个模式菜单。每项以大字显示名称、小字显示说明;初始模式取当前存档的 defaultMode(默认标准)。切换自动保存到服务端 PlayerData 的 mode,等待服务端确认后生效,重登保留。原来的外部 AI / 自由聊天两个开关和顶栏强制开关由此替代,历史保存仍在设置页独立控制。
四种执行策略
| 模式 | 文字请求的执行顺序 |
|---|---|
离线 offline | 明确指令 → 本地意图缓存 / 稀疏向量匹配 → 选项卡;不调用模型或服务端联网搜索 |
标准 standard(默认) | 明确指令 → 本地匹配 → 一次 AI 辅助路由 → 工作流或选项卡;AI 可服务于签到、知识整理等必要模块,不直接自由聊天 |
扩展 extended | 明确指令 → 较高阈值的本地匹配 → AI 辅助路由;模型无法选出能力时才进入一次自由回答 |
自由 free | 文字直接进入有界 ReAct 对话,由 AI 选择已启用的能力、观察结果并回答;跳过客户端指令、本地匹配及单独的 AI 路由步骤 |
ConversationStrategy 定义执行策略接口;ConversationMode 的四个枚举项各自实现 route,只安排共用 Routes.local / assisted / chat 步骤的顺序。HybridRouter 实现步骤,继续负责指令、候选、模型路由和本地选项。新增策略时不需要在路由器堆积模式分支。网络和存档使用枚举 Codec;新增内置模式时同步菜单、语言和权限语义。
结构化卡片按钮继续执行原有动作,不会被自由模式当作聊天。模式选择、历史开关等管理请求也不走模型。自由模式关闭文字指令补全;其他三种模式仍支持。全部四种执行模式统一使用发送框左侧菜单选择。
离线状态不会把依赖 AI 的工作流改造成另一套本地业务:例如需要模型选奖励的签到会提示当前模式不可用。语音识别和播报继续使用客户端个人开关和账号,与服务端对话执行模式独立。
system-semantic.json 的 modeScores.functions=-0.1 应用于离线和标准,modeScores.freeChat=0.03 应用于扩展。默认基础 score 0.9,分别得到 0.8 / 0.93;覆盖率、候选分差、只读限制、复杂句和参数解析条件仍然生效。模式参与缓存键,切换模式会清除该玩家的路由缓存并使旧执行失效。
默认模式和房主权限
每个存档在 SavedData system:ai_access(<存档>/data/system/ai_access.dat)中保存顶层 defaultMode,支持 offline / standard / extended / free,默认 standard。它同时决定新玩家的初始模式和普通玩家的可选模式上限。顺序为离线 < 标准 < 扩展 < 自由,因此标准上限只允许离线 / 标准,扩展上限还允许扩展。管理员用 /system ai default 查看当前值,用 /system ai default <模式> 修改默认等级。
已有玩家保存的偏好不会被覆盖;降低上限后按当前权限降级执行并同步界面,上限恢复后可恢复原偏好。修改默认等级后标记存档数据待保存,并立即刷新在线玩家;新玩家构造和缺少模式字段的解码都从当前存档读取默认值。
单人玩家和局域网联机的房主本人默认可选全部四种模式,不继承 defaults 中的 AI / 自由聊天禁用。识别使用服务端 getSingleplayerProfile().id();局域网访客和独立服务器上的 OP 都按普通玩家处理,不依赖 Minecraft 客户端类。房主仍以存档的 defaultMode 为初始选择,不自动切到自由模式。每日调用上限、并发和各工作流预算保持原规则,最高模式权限不表示无限调用。
/system ai 的玩家 UUID 覆盖优先级保持最高,房主同样受显式 disable / freechat disable / limit 限制。普通玩家的 enable 在默认离线时开放到标准;freechat enable 显式开放到自由上限,但仍需 AI 总许可和非零额度。reset 移除覆盖后,普通玩家恢复配置上限,房主恢复全部模式的默认权限。defaults 中的布尔 true 不提升 defaultMode 上限,只有玩家级显式授权可以提升。
管理员权限和同步
管理员权限独立于玩家偏好。服务端把当前玩家的 maxMode、allowAi、allowFreeChat、modelCallsPerDay、模型配置可用状态 modelConfigured 和保存的模式同步到客户端,菜单根据相同规则禁用选项并显示灰色原因:
- 模型要求 API Key 但环境变量未配置或仅含空白:仅可选择离线,所有玩家(包括房主)自动按离线模式执行,菜单和设置页显示缺少密钥。只同步布尔状态,不发送密钥或环境变量名。
- 超过模式上限的选项置灰,并显示当前上限;已保存的更高模式降到上限。
- AI 禁用或每日额度设为 0:只允许离线,当前执行降为离线。
- 自由聊天禁用:至多允许离线和标准;模式上限更低时仍采用更低限制。
- 管理员重新允许后,恢复仍保存着的原模式;玩家也可主动选择另一个允许的模式覆盖偏好。
客户端按钮不能修改管理员许可。服务端收到模式修改时重新检查权限,每次路由、模型请求和工具执行仍校验当前授权。每日已用次数继续在服务端扣减和判断;菜单的额度灰色条件是管理员配置为 0,并非客户端自行估算剩余额度。
模型可用性仅在本地检查,不请求模型接口;不校验密钥是否正确或服务是否可达。system-model.json 设置 apiKeyRequired=false 时允许免密钥接口,不会因缺少密钥禁用 AI。模型配置重载后也会刷新在线玩家状态;移除密钥会取消在途交互,配置恢复后重新应用保留的模式偏好和当前权限。更改启动环境变量需重启进程;如果变量已存在,只改配置中的环境变量名或 apiKeyRequired 后 /reload 即可重新判定。客户端的 TTS / ASR 密钥及开关保持独立。
管理员在原版聊天或控制台执行以下命令,需要权限等级 2。默认等级和玩家参数均支持补全;玩家规则按 UUID 保存:
| 命令 | 作用 |
|---|---|
/system ai default [模式] | 查看或修改当前存档的默认 AI 等级 / 模式上限;省略模式时查看当前值 |
/system ai <玩家> enable / disable | 允许 / 禁用 AI 及统一门禁下的服务端收费搜索 |
/system ai <玩家> freechat enable / disable | 允许 / 禁用扩展和自由模式,不影响已获准的标准模式功能 |
/system ai <玩家> limit <次数> | 修改每日模型调用上限;0 禁用模型模式,不清空已用次数 |
/system ai <玩家> status | 查看有效权限和上限;可省略 status |
/system ai <玩家> reset | 移除玩家覆盖,恢复对应普通玩家 / 房主的默认规则,不清空个人偏好或已用额度 |
修改立即生效,调用 setDirty 后随世界自动保存或正常退出写入当前存档;权限变化会取消在途交互、同步界面并发送原版聊天提示。该数据独立于玩家业务文件,也不会被 revoke、reset 或清空对话删除。玩家覆盖和默认规则均由 SavedData 管理;不再从 config/system/ 读取 AI 等级。
普通玩家按“玩家覆盖 → 存档 defaults → 内置默认”解析布尔许可和限额,并应用存档 defaultMode 上限;房主略过 defaults 的布尔许可,仍继承每日限额。未配置的 allowAi / allowFreeChat 为 true;modelCallsPerDay 继续继承 system-agent.json 的 modelCallsPerPlayerDay。0 表示当天不再接纳模型调用。allowAi=false 同时关闭自由聊天与经统一外部服务门禁的收费搜索;本地工具、TTS 和 ASR 保持各自原有权限与账号配置。
设置页只读展示当前玩家的管理员许可、模式上限及每日模型上限。客户端只能修改 history、mode 两项个人偏好,无法写入管理员配置或查看其他玩家的权限。
自由模式的功能调用和预算
核心工作流 system:free_chat 仍为 structuredOnly,普通模型意图路由不能自行选择它。扩展模式的兜底只生成一次回答。自由模式复用 ReActLoop:默认最多 6 轮、6 次模型、16 次底层工具、32 步、6 次写步骤、90 秒总期限,单次模型最多 30 秒。最后一轮只能回答;system-agent.json 的 policies["system:free_chat"] 可统一修改上限。
ChatActions 合并两类能力:ModuleRegistry 中当前玩家可用、允许模型选择的工作流,以及 ToolRegistry 中已公开的只读 Tool 和 ToolProvider 为本次请求追加的只读 Tool。工作流支持已启用模块的参数化实例;底层 Tool 保留真实输入 / 结果 Codec,通过独立 ToolContext 执行。玩家、物品、物品来源、任务列表 / 查找 / 详情、说明书、数据库和礼包预览可以直接读取,不必先套一轮业务工作流。数据库仍包含经过 FTB 原生可见性检查的说明书。
目录按 ToolPriority.LOCAL → WORKFLOW → PAID 排序,同级按 ID 排序;每项描述包含 priority,提示模型优先选择相关的本地读取,再考虑普通工作流,最后考虑额外付费能力。问答(可能联网或额外调用模型)、组合分析和 AI 签到标记为 PAID;Search / Fetch 也标为 PAID。此优先级指在当前对话推理之外的额外成本,不表示自由聊天本身免费,也不要求遍历所有不相关的本地工具。可用证据足够时直接回答,不通过工具与工作流重复读取同一份信息。
显式入口标记继续提示模型谨慎使用;structuredOnly 的最终确认动作不进入目录。底层写工具不接受 ToolProvider 追加,购买、抽奖、任务提交和礼包领取仍按原有授权 / 确认流程处理。只读域按已启用模块、精确的 Type 实例及 SchemaMapCodec 筛选;调用前后及最终回答前再次检查已使用工具的模块权限,不能借扩展入口访问已关闭功能。扩展模式仍只作一次聊天兜底,不获得这些工具。
嵌套工作流在同一个 Agent worker 和 ExecutionContext 内执行,不重新排队或获取自己的玩家执行锁。其 owner、来源、授权集合、策略和步骤前缀暂时隔离,结束后恢复;模型、工具、写入和总步骤共用计数,子策略只缩小余量及期限。每次调用分配独立写步骤前缀,避免多个工作流使用相同步骤名碰撞。循环保留真实结果卡及其按钮,失败 / 达到上限时也展示已获得的结果,不宣称失败操作已经成功。
联网仍通过原有知识问答工作流:自由模式优先直接查 database.query,证据不足再考虑 system:question;后者在代码中重新查询数据库,仅在空结果、已启用搜索模块且当前请求明确允许联网时才可搜索。原始 Search / Fetch 不自动公开给自由聊天,也不会因排序靠后而自动获得联网授权;原有付费工具处理器继续复核授权。
循环用 ChatObservation 的 kind 分派区分 workflow 与 tool,原始查询结果通过本次工具白名单的 ToolObservation Codec 保持类型。模型能直接读到来源与查询结果,结果为 CardData 时同时保留可交互卡片;工作流返回的确认卡、失败状态和部分结果保持原行为。
历史开启时仅发送该玩家最近最多 20 条、合计 16 KiB 的适用文字;助手历史只取 ChatOutput 正文。历史、卡片和工具结果均作为不可信数据。回答使用 Markdown 卡片,复用历史、播报和统一 ModelGateway 用量计量。
系统人格
系统定义可通过 "personality_prompt": "example:personality/sign_in" 引用 data/example/system/prompts/personality/sign_in.txt。字段为可选 Identifier,省略时只使用基础提示词。默认系统附带 system:personality/default,采用克制的系统文口吻,中文称呼宿主、英文称呼 Host。
AssistantServer 从本次玩家存档中的当前绑定 ID 查服务端系统定义,再用 ExecutionContext 的提示词快照渲染该 TXT;Agent 层只接收 PromptProvider 返回的文本,不查询 Minecraft 注册表。ChatSupport 先生成基础指令,再追加人格,两种聊天入口共用该流程;自由模式的 ReAct 在开始时捕获整份提示词,后续轮次不重复读取。人格与基础提示词属于同一条 system 消息,不增加模型调用次数,仍计入输入与 Token 预算。权限、工具白名单和结构化输出保持原来的代码约束。
人格文件支持 {{player_language}}。未指定、没有当前绑定或引用文件不存在时继续使用基础指令,缺失文件记入服务端警告。修改 TXT 可 /reload;更换系统定义中的引用需要重开世界 / 重启服务器。每次执行保留原提示词快照,重载只影响新请求。人格正文不额外同步到客户端,由模型请求统一发往所配置的服务商。
扩展入口
engine.chat().prompts(PromptProvider) 可替换基础提示词提供者;默认文件 data/system/system/prompts/free_chat.txt 由 txt reload listener 加载,包含直接回答、工具优先级和 ReAct 协议。替换基础提供者后仍会附加系统人格;engine.chat().personality(PromptProvider) 可单独替换这项贡献,其默认游戏桥接由 AssistantServer 安装。
底层 Tool 先按原有方式注册到 ToolRegistry,可用 .forReasoning("说明") 将带 SchemaMapCodec 的只读操作公开给分析和自由模式;PAID 操作不会进入只允许本地读取的分析目录。.withPriority(ToolPriority.PAID) 标记额外付费,执行时仍需通过外部服务门禁,处理器负责自身业务授权。没有公开说明的工具,可通过以下接口按请求追加;未注册、已禁用、写操作和不含 schema 的类型会被过滤,不会因回调返回而取得权限:
engine.chat().tools(context -> List.of(MY_READ_TOOL));
回调只在完整自由模式构建工具域时执行,不影响扩展模式。它返回已注册的 ToolRegistry.Type 原实例;同 ID 不同实例不能冒充原工具。与工作流 ID 冲突时保留原工作流。工作流通过 routing().priority(ToolPriority.PAID) 声明成本等级;需要改变游戏状态或生成确认卡的功能仍使用工作流。
本次只做编译和静态核对,未启动 Minecraft 或请求真实模型。菜单布局、鼠标 / 键盘操作及实际模型选工具仍需游戏内验收。