Skip to content

Repository files navigation

JevNPC

基于 TypeSafe Jev 的事件驱动 Minecraft NPC 自主决策框架。

NPC 根据世界事件、当前状态、目标、记忆和关系选择结构化行为,再由 Minecraft 原生机制执行。Jev 是核心决策模型;聊天和 LLM 高级规划是后续可选扩展。

当前状态:Phase 0 工程验证已完成,M0 收口(2026-09-22)。 P0-01 锁定平台版本组合;P0-02 建立最小 Fabric 工程并实测构建/领域检查/服务端启动退出;P0-04 已在 Minecraft 1.21.11 + Fabric API 0.141.6 上 headless 实测原生能力(被取消攻击与实际伤害可区分、四类动作的启动/完成/取消入口与能力边界,见任务计划);P0-05 已建立 GitHub Actions 工作流并本地验证同入口通过(无远端,远端运行记录待托管环境);P0-03 已建立 jev-engine 协议核心与凭据门控真实调用入口、离线协议检查通过,并于 2026-09-22 服务端配置凭据后取得真实 Choice 证据(合成「玩家攻击村民」场景,HTTP 200、choice=CALL_GUARD、confidence=0.9、延迟 1298ms、usage 存在,脱敏样本落盘)。P0-06 已收口 M0 全部条件,远端 CI 运行记录(P0-05 限制)需 git 远端后触发。P1-01 已完成(2026-09-22):最小领域类型(身份、位置、人格/当前目标、快照、事件、候选、上下文、决策与执行结果)在 :domain 落地,领域检查 96 用例 0 失败;P1-02/P1-04/P1-05 可开始。

核心流程

Minecraft 事实 → 领域事件 → NPC/世界/记忆/关系快照
             → Jev Choice → 候选与状态复核 → 原生行为 → 执行反馈

首个演示计划采用“玩家攻击 NPC”:村民根据状态选择逃跑或请求现有守卫协助;只有具备战斗能力的实体才有攻击候选。行为执行前后都有明确校验,不将模型选择视为已经完成的动作。

项目不重写寻路、物理或实体系统,不要求每个动作调用 LLM,不以聊天机器人作为核心目标。

文档导航

文档 内容
项目总纲 项目定位、愿景与功能方向
架构契约 决策闭环、线程、边界、故障与选型状态
模块契约 模块职责、依赖、共享类型归属与执行边界
Jev 决策契约 内部上下文、官方 HTTP 映射、候选、置信度与退化
NPC 模型契约 身份、状态、目标、三层记忆、关系与持久化
事件契约 事件 Schema、事实来源、分发、去重与反馈
实施路线图 Phase 0—5 的交付物、验收条件与当前进度
任务规划与拆解 32 项任务的依赖、交付物、验收条件及首批执行顺序
AGENTS.md 面向代码代理的仓库协作规则

总纲定义方向;契约中的字段、边界和失败规则是本次补充的实现约定。建议和待核验项不代表已完成的技术选型。

技术基线

版本组合由 P0-01 按官方资料选定,核验日期 2026-09-21。这里只完成资料核验与构件可达性检查;实际构建、启动与退出验证属于 P0-02,尚未执行。

领域 选定版本 来源与核验依据
Minecraft 1.21.11(release,2025-12-09 发布) Mojang 版本清单;1.21.11 版本 JSON 声明 java-runtime-delta、majorVersion=21
Fabric Loader 0.19.5(stable) Fabric meta:loader/1.21.11 首个 stable 项;fabric-loader-0.19.5.jar 实测 HTTP 200
Fabric API 0.141.6+1.21.11 官方示例 1.21.11 分支 gradle.properties;maven.fabricmc.net 上该构件实测 HTTP 200
映射 Mojang 官方映射,mappings loom.officialMojangMappings() 官方示例 1.21.11 分支 build.gradle;client.txt 映射文件实测 HTTP 200
构建插件(Loom) 1.17.21,插件 id net.fabricmc.fabric-loom-remap fabric-loom maven-metadata 中 1.17 线最新稳定补丁;官方 1.21.11 模板写的是 1.17-SNAPSHOT,本项目不用 SNAPSHOT,P0-02 构建失败时再在该线内换补丁号。Loom 1.17 发布说明「Update to Gradle 9.5」,dev/1.17 分支 options.release = 21,README 声明支持 1.14.4 及以上 Minecraft。1.21.11 属混淆版本,因此用 -remap 插件 id
Gradle 9.5.1,仅通过 Wrapper 使用 官方示例 1.21.11 分支 gradle/wrapper/gradle-wrapper.properties;发行包实测 HTTP 200;Gradle 兼容矩阵:运行 Gradle 需 Java 21 → ≥ 8.5、Java 25 → ≥ 9.1.0,9.5.1 两者皆可
Java 21(本机 Microsoft OpenJDK 21.0.11,JAVA_HOME 已指向) Minecraft 1.21.11 要求 21;官方示例 it.options.release = 21、fabric.mod.json 依赖 java >= 21;Loom 1.17 自身以 21 为目标
决策 TypeSafe Jev System One HTTP API,Java 侧用 JDK HttpClient 直接接入;JSON 序列化/解析用 Gson 2.11.0 见 Jev 决策契约;P0-03 已建 jev-engine 协议核心(请求映射+响应校验+HTTP 传输+故障分类)与凭据门控真实调用入口,离线协议检查 39 用例通过;2026-09-22 真实账户调用已取得首份脱敏 Choice 证据(见任务计划第 9 节 P0-03 完成记录)。Gson 选型理由见 gradle.properties
存储 Phase 2 使用 SQLite 保存自有状态、记忆和关系 驱动、表结构与迁移策略在 Phase 2 落实
后续 社会系统、生态系统、可选 LLM 规划 按 路线图推进

该组合只针对 1.21.11,不声称兼容全部 1.21+ 或 26.x。

2026-09-21 复核后基线仍为 1.21.11 + Java 21。 本机已装 Microsoft OpenJDK 25.0.4.1(C:\Users\17860\.jdks\ms-25.0.4.1),Minecraft 26.3 路线的 JDK 阻塞解除,相关构件也确认可下载(Loom 1.18.2 及其插件标记、fabric-api-0.161.0+26.3.jar 均 HTTP 200),但暂不升级,因为三项风险未消除:

  • Loom 1.18 正式版发布于 2026-09-20,距核验只有一天,稳定补丁记录不足;
  • Fabric 文档站的版本化文档只覆盖 1.20.4/1.21.1/1.21.11/26.1.2(sitemap 实测),没有 26.3;
  • 26.3 是非混淆版本:intermediary 为 0.0.0、无 Yarn 映射、不写 mappings、插件 id 改为 net.fabricmc.fabric-loom、options.release = 25;P0-04 要验证的村民/铁傀儡/原生导航接口在新版本上参考资料最少。

升级触发条件:Fabric 文档出现 26.x 版本页且 Loom 1.18 有稳定补丁记录时重新评估;届时须同步总纲与架构契约的 Java 基线。

工程布局结论

模块契约第 7 节要求领域模块可脱离 Minecraft 构建/测试,而 Loom 会把 Minecraft 加入其所在工程的编译类路径,因此确有构建隔离需要,拆为两个子项目,不为九个逻辑模块预建九套空工程:

JevNPC/
├── settings.gradle        # pluginManagement 加 maven.fabricmc.net;include ':domain', ':minecraft-fabric'
├── build.gradle           # 根工程只做公共 Java 设置,不应用 Loom
├── gradle.properties      # 上表版本号集中在此
├── gradle/wrapper/        # gradle-9.5.1-bin.zip
├── domain/                # 纯 Java 21,不应用 Loom,不依赖 Fabric/Minecraft
└── minecraft-fabric/      # 应用 Loom 1.17.21,依赖 :domain,含入口、fabric.mod.json、原生端口实现

八个领域逻辑模块先以包边界存在于 domain;只有发布或测试隔离确有需要时再拆子项目。领域检查入口是 :domain:test(P0-02 已建立),不启动游戏。包根已在 P0-02 确定为 dev.jevnpc:领域八模块对应 dev.jevnpc.{core,event,memory,relationship,context,jev,behavior,runtime},适配层入口位于 dev.jevnpc.fabric(映射依据见模块契约第 1 节)。P0-02 只建立包边界与命名空间,未预建任何空类型,领域类型随 P1-01 落地。

本地环境现状与缺口

以下为 2026-09-21 在本机实测,未运行的项目如实标注:

项 现状 影响与处理
Java JAVA_HOME 指向 Microsoft OpenJDK 21.0.11;另装有 Microsoft OpenJDK 25.0.4.1(C:\Users\17860\.jdks\ms-25.0.4.1,2026-09-21 确认 java -version 可用)、corretto 21.0.4/21.0.6、corretto 11.0.26、GraalVM 24.0.2 构建使用 21.0.11,满足 1.21.11 + Loom 1.17。JDK 25 已具备,Minecraft 26.x/Loom 1.18 不再有 JDK 阻塞;基线按上节决定不升级
Gradle PATH 中无 gradle;~/.gradle/wrapper/dists 只有 5.2.1/6.9/7.5.1 只能经 Wrapper 构建,P0-02 需首次下载 9.5.1 发行包
版本控制 git 2.53.0.windows.1 可用,全局身份已配置;G:\work\JevNPC 不是 git 仓库,无远端 P0-02 前需 git init 并写忽略规则;无远端托管意味着 P0-05 的远端 CI 运行条件尚未满足
构建期下载 maven.fabricmc.net、services.gradle.org、plugins.gradle.org、repo1.maven.org、piston-meta/piston-data.mojang.com、libraries.minecraft.net 均可达;已确认 client.jar 约 31 MB、server.jar 约 56 MB、client.txt 约 12 MB 可下载 首次 Loom 构建还要反编译与生成缓存,实际耗时与占用未实测
受限主机 raw.githubusercontent.com 不可达(HTTP 000,curl exit 7);api.github.com 与 codeload.github.com 正常 获取模板走 API 或 zip 归档,不依赖 raw 主机
磁盘 G: 可用 75 GB(已用 93%);C: 可用 138 GB,Gradle 缓存位于 C:\Users\17860\.gradle 空间足够,首次构建后需复核占用
Jev 凭据与账户 2026-09-22 用户在 Windows User 作用域环境变量配置 JEVNPC_JEV_API_KEY(密钥不经对话/仓库/日志),真实调用成功:HTTP 200、responseModel=jev-1.13.0 与请求一致、choice=CALL_GUARD、confidence=0.9、延迟 1298ms、usage input_tokens=450/output_tokens=38 离线检查(:domain:test)与真实调用(:domain:jevRealCall)分别承载;脱敏样本在 domain/build/jev-trial/samples.jsonl(mode=REAL)
代码托管/CI 2026-09-22 核实无 git 远端(git remote -v 为空) P0-05 工作流 .github/workflows/ci.yml 已完成、本地同入口通过;远端运行待托管环境,不声称 CI 已运行

已查阅 TypeSafe 官方接口,并于 2026-09-22 完成首次真实请求(合成场景,脱敏记录)。Jev 核心接入方案需要网络与服务端 API key;“LLM 扩展可选”不表示 Jev 可离线推理。未配置或服务不可用时保留 Minecraft 原生行为,详见决策契约。

开始参与

先阅读总纲与架构契约,再按所改领域阅读专项契约。Phase 0 的平台版本组合已确认,最小 Mod 工程已在 P0-02 建立并通过构建/启动/退出验证;P0-04 已 headless 实测原生能力与四类动作入口,P0-05 已落 CI 工作流并本地验证同入口,P0-03 已建 Jev 协议核心、离线检查与真实 Choice 证据。

按 任务计划推进:P0-01 至 P0-06 全部完成(2026-09-22),M0 收口;P1-01 已完成(最小领域类型),P1-02/P1-04/P1-05 可开始。Phase 1 在 P1-10 收口前完成单 NPC 决策闭环。

构建与验证命令

以下命令均在本机(Windows 11、Microsoft OpenJDK 21.0.11、Git Bash)于 2026-09-21 实测通过;Windows 的 cmd/PowerShell 用 gradlew.bat 替代 ./gradlew。首次构建需经 Wrapper 下载 Gradle 9.5.1 发行包,并由 Loom 下载 Minecraft 1.21.11(客户端约 31 MB、服务端约 56 MB、Mojang 映射约 12 MB)后反编译,耗时较长,之后走缓存。

目的 命令 实测结果
完整构建(领域 + Fabric,含领域测试与 remapJar) ./gradlew build BUILD SUCCESSFUL,首次约 9 分 51 秒;产出 domain-0.1.0.jar、minecraft-fabric-0.1.0.jar(含 dev/jevnpc/fabric/JevNPCMod.class 与 fabric.mod.json)
只跑领域检查,不启动游戏 ./gradlew :domain:test 96 用例 0 失败(3 个边界用例 + 36 个 P0-03 Jev 离线协议检查 + 57 个 P1-01 领域类型检查:非法值/未知类型拒绝、快照不可变、无 SDK 类型泄漏),daemon 热时约 5s,全程不触发任何 runServer/runClient,不需要 Jev 密钥
启动开发服务端并优雅退出 ./gradlew --no-daemon :minecraft-fabric:runServer,待 Done 后于控制台输入 stop Fabric Loader 0.19.5 加载 43 个 mod(含 jevnpc 0.1.0),入口打印 [JevNPC] mod 已加载,Done (4.153s)!,stop 后保存三个维度并退出,GRADLE_EXIT=0
P0-04 原生能力验证(headless,自动停服) ./gradlew --no-daemon :minecraft-fabric:runServer -PjevnpcValidation NativeCapabilityValidation 在 SERVER_STARTED 跑同步探针 + 140 tick 有界观测后 halt(false);GRADLE_EXIT=0,Done→Stopping server→Saving worlds。实测:被取消攻击(AttackEntityCallback 返 FAIL)无 AFTER_DAMAGE、生命不变;实际伤害(PASS/hurtServer→true)触发 AFTER_DAMAGE 且生命下降;RUN moveTo→true 后 villager 沿路径移动、isDone 转 true;CALL_GUARD setTarget 接受、doHurtTarget→true 造成伤害;ATTACK 村民设目标却不造成伤害(无战斗能力)。不带 -PjevnpcValidation 时不安装验证回调,保持 P0-02 最小加载
P0-03 真实 Jev Choice 调用(凭据门控,独立入口) JEVNPC_JEV_API_KEY=<key> ./gradlew :domain:jevRealCall 有凭据时发一次真实 Choice 请求、把脱敏样本 + 延迟 + 用量写入 domain/build/jev-trial/samples.jsonl(gitignored);无凭据时输出 SKIPPED_NO_CREDENTIALS、不联网、退出 0。不被 build/test/CI 触发,故默认测试不需要密钥。2026-09-22 已取得真实样本(mode=REAL)

服务端首次启动前需在 minecraft-fabric/run/eula.txt 写入 eula=true 接受 Minecraft EULA;run/(含存档、日志、本地配置)已被 .gitignore 忽略,不会提交。用 --no-daemon 是为了让服务端控制台的标准输入真正连通以便键入 stop——runServer 任务已在 minecraft-fabric/build.gradle 显式接通 standardInput。本地验证用的 run/server.properties 设了 online-mode=false(无玩家时免去验证联网)与 max-tick-time=-1(禁用看门狗,容忍首次世界生成较慢),同样不提交。

当前工程布局(P0-02 建立,P0-03/P0-04/P0-05 扩充):

JevNPC/
├── README.md
├── AGENTS.md
├── settings.gradle          # pluginManagement 加 Fabric maven;include ':domain', ':minecraft-fabric'
├── build.gradle             # 根工程:仅统一 group/version,不应用 Loom
├── gradle.properties        # 平台版本号集中于此
├── gradlew / gradlew.bat
├── gradle/wrapper/          # Gradle 9.5.1(gradle-wrapper.jar / .properties)
├── .gitignore / .gitattributes
├── .github/workflows/ci.yml # P0-05 最小 CI:调用 ./gradlew build 与 :domain:test
├── docs/                    # 总纲与各项契约、路线图、任务计划(注:docs/ 与 AGENTS.md 当前被 .gitignore 忽略)
├── domain/                  # 纯 Java 21 领域层,不应用 Loom,不依赖 Fabric/Minecraft
│   ├── build.gradle
│   └── src/
│       ├── main/java/dev/jevnpc/
│       │   ├── package-info.java
│       │   ├── core/        # npc-core:身份、位置、人格/目标、快照、动作候选(P1-01)
│       │   ├── event/       # event-system:事件信封与 Phase 1 载荷(P1-01)
│       │   ├── context/     # context-builder:DecisionContext(P1-01)
│       │   ├── jev/         # jev-engine:协议核心(P0-03)+NPCDecision(P1-01)+trial/ 试验脚手架
│       │   └── behavior/    # behavior-engine:ExecutionResult(P1-01)
│       └── test/java/dev/jevnpc/
│           ├── DomainBoundaryTest.java
│           ├── DomainTypeLeakageTest.java   # P1-01:领域类型不引用 SDK 类型的反射检查
│           ├── core/、event/、context/、jev/、behavior/   # 对应包的领域检查(P0-03/P1-01)
└── minecraft-fabric/        # Loom 适配层,依赖 :domain
    ├── build.gradle
    └── src/main/
        ├── java/dev/jevnpc/fabric/
        │   ├── JevNPCMod.java
        │   └── validation/NativeCapabilityValidation.java   # P0-04 原生能力验证 harness(门控)
        └── resources/fabric.mod.json

领域八模块中 jev-engine(dev.jevnpc.jev)已随 P0-03 落地协议核心(请求映射、响应校验、HTTP 传输、故障分类)与试验脚手架,P1-01 落地其余首阶段类型:core/event/context/behavior 的最小领域类型与 jev 的 NPCDecision;memory/relationship/runtime 仍待后续阶段落地。:minecraft-fabric 入口在 P0-02 加载日志之外,新增 P0-04 原生能力验证 harness(jevnpc.validation.native 门控,默认不安装额外回调)。API key、存档数据库、玩家数据和本地配置不得提交到版本库(.gitignore 已覆盖 run/、build/、.gradle/、.env、secrets.*、*.local.properties;P0-03 脱敏样本写入 domain/build/jev-trial/,在 build/ 忽略范围内)。

About

基于 Jev 的事件驱动 Minecraft NPC 自主决策框架

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages