Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/brofea_mc-pilot.json
T

1 line
163 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "brofea/mc-pilot", "files": {"README.md": {"71eb19f88f2315fdbd359065af1b2bc59f6d9356": {"t": 1785747270.0354946, "n": 9375, "h": "a3582f998a8212af", "c": "<div align=\"center\">\n <img width=\"200\" alt=\"Minecraft Pilot icon\" src=\"web/src/assets/minecraft-pilot-icon.png\" />\n <h1>Minecraft Pilot Agent</h1>\n <p>为 MC 26.x 打造的 AI 游戏助手</p>\n <p>\n <a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">\n <img src=\"https://img.shields.io/badge/license-GPL--3.0-green\" />\n </a>\n <a href=\"https://github.com/brofea\">\n <img src=\"https://img.shields.io/badge/brofea-brofea?label=GitHub&logo=github&color=purple\" alt=\"GitHub Profile\">\n </a>\n </p>\n</div>\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,提供 Vue 3 网页工作台与可选的 Fabric 客户端 Mod。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 OpenAI 兼容 API,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、通用复杂问题、MCP 风格 Function Calling、12 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n6. **Vue 工作台**:Vue 3 + TypeScript + Vite 构建的响应式界面,统一承载对话、知识库、配方浏览、游戏连接与控制台导航。\n\n<div align=\"center\">\n <img width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/71b70566-f12b-4b92-aab4-2810a197dd75\" />\n</div>\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WS| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WS| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> OpenAI 兼容 API\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> OpenAI 兼容 API\n Game --> API\n```\n\n## Quick Start\n\n### 1. 前置条件\n\n- Docker Desktop 与 Docker Compose\n- 任意 OpenAI 兼容 API Key\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 克隆并配置\n\n```bash\ngit clone git@github.com:brofea/mc-pilot.git\ncd mc-pilot\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 任意 OpenAI 兼容 API Key\nDEEPSEEK_API_KEY=\n\n# .minecraft 目录;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=\n```\n\n注意:不要把 `.env` 提交到仓库。\n\n仓库中已包含预构建的配方数据库(`data/mc_pilot.db`),无需额外构建。\n\n### 3. 启动\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n首次启动时会自动检查 Qdrant 中是否已有 Wiki 索引。如果没有,会在后台构建(下载嵌入模型 + 向量化,可能需要数分钟)。构建完成后数据保留在 Docker 卷中,后续启动秒级就绪。\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 网页工作台\n\n生产环境中,Docker 的 Node 构建阶段会编译 `web/` 下的 Vue 3 + TypeScript + Vite 应用;FastAPI 随后从 `/static/app/` 提供编译产物。因此 Docker 模式仍只需访问 <http://127.0.0.1:8000>。\n\n| 路径 | 状态 | 用途 |\n|---|---|---|\n| `/` | 可用 | 与 Pilot 对话、查看执行轨迹与服务状态 |\n| `/admin` | 可用 | 本机开发控制台 |\n| `/knowledge` | WIP | 知识库预览 |\n| `/recipes` | WIP | 配方浏览预览 |\n| `/game-link` | WIP | Fabric Mod 本地游戏连接预览 |\n\n知识库、配方浏览和游戏连接当前只展示能力方向与路线图,不提供独立查询或连接操作。\n\n## Agent 安全与资源边界\n\n- Agent 会直接认真回答安全的通用复杂问题;Minecraft 的版本相关事实和配方问题才按需调用 Wiki/配方工具。\n- 用户消息、历史消息与工具返回均视为不可信数据;工具结果仅作为证据,不能修改身份、语气、工具权限或系统规则。\n- 对话不会提供内部提示、模型/服务配置、部署细节、日志路径或凭据;试图覆盖规则或改变人格/语气的请求会得到稳定的边界回复。\n- 单条消息最多 **12,000** 个字符,超限返回 HTTP `413`,不会调用模型或消耗 Token;每日共享预算为 **750,000 Token**。\n- `/api/chat` 与 `/api/chat/stream` 共享每客户端 IP **20 次/分钟** 的内存级滑动窗口,超限返回 HTTP `429` 与 `Retry-After`。\n- 离线评测语料位于 `tests/fixtures/agent_eval_cases.json`,覆盖复杂回答、工具选择、提示词注入、人格篡改与敏感信息索取;新增真实失败样例时应先加入该语料再修复。\n\n## 更新数据\n\n当 Minecraft 版本更新或 Wiki 内容变化后,可以重新构建数据。\n\n### 更新配方数据\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n配方构建通常较快(约 1–2 分钟)。可通过 `--version` 指定目标版本(默认 26.2):\n\n```bash\ndocker compose exec app python scripts/build_recipes.py --version 27.0\n```\n\n### 更新 Wiki 索引\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_wiki.py\n\n# 本地模式\n.venv/bin/python scripts/build_wiki.py\n```\n\nWiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟(后续增量运行更快,因为 API 响应有缓存)。看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。可在另一终端确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后应显示 `\"index_exists\":true`。\n\n### 验证更新\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n## 本地开发\n\n本项目只使用 `pip`、`.venv` 和 Docker,不使用 conda。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n### 4. 启动 Vue 前端(第二个终端)\n\n```bash\ncd web\nnpm install\nnpm run dev\n```\n\nVite 开发服务器运行在 <http://127.0.0.1:5173/>,并将 `/api`、`/health` 与 `/ws` 请求代理到本地 FastAPI 的 `8000` 端口。生产构建使用:\n\n```bash\ncd web\nnpm run build\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成\"构建数据 → 启动应用\",不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 OpenAI 兼容 API 已配置时,解析死亡消息并推送建议。\n\n## 数据来源\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL。\n\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| POST | `/api/chat/stream` | SSE 流式 Agent 响应 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| GET/POST/DELETE | `/api/conversations` | 对话管理 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n## Fabric Mod\n\n要求:JDK 25、Minecraft Java Edition 26.2、本地 Pilot 后端运行在 `127.0.0.1:8000`。\n\nFabric Mod 是本地游戏连接桥:它将 Minecraft Java 实例的日志、玩家事件与世界状态交给 Pilot 使用。网页的 `/game-link` 页面目前是该桥接能力的 WIP 预览;实际连接由安装在客户端 `mods/` 目录中的 Mod 完成。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:`fabric-mod/build/libs/pilot-mod-0.1.0.jar`\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd web\nnpm run build\n\ncd fabric-mod\n./gradlew clean build\n```\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # OpenAI 兼容 API 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # 无前端构建时的 Jinja2 回退页面\n│ └── static/app/ # Vite 生成的 SPA 产物(不提交)\n├── data/ # 预构建配方数据库\n├── scripts/ # 配方、Wiki 与 Docker 初始化脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── web/ # Vue 3 + TypeScript + Vite 前端\n│ └── src/assets/ # 项目内 Logo 与界面图片\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n首次 `docker compose up` 时会自动构建。如需手动触发:\n\n```bash\ndocker compose exec app python scripts/build_wiki.py\n```\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n## 致谢\n\n[Minecraft Wiki 中文](https://zh.minecraft.wiki/api.php) 提供的 MediaWiki API\n\n[FreeFrontend](https://freefrontend.com/css-liquid-glass/) 提供的 Liquid Glass CSS 效果\n"}, "eafe8d41f26abac5ad695d22915214722d7a3104": {"t": 1785772044.4785137, "n": 8861, "h": "b8abc36237a6bcdc", "c": "<div align=\"center\">\n <img width=\"200\" alt=\"icon\" src=\"https://github.com/user-attachments/assets/4055892f-80a1-4890-8948-030f1ceed5ba\" />\n <h1>Minecraft Pilot Agent</h1>\n <p>为 MC 26.x 打造的 AI 游戏助手</p>\n <p>\n <a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">\n <img src=\"https://img.shields.io/badge/license-GPL--3.0-green\" />\n </a>\n <a href=\"https://github.com/brofea\">\n <img src=\"https://img.shields.io/badge/brofea-brofea?label=GitHub&logo=github&color=purple\" alt=\"GitHub Profile\">\n </a>\n </p>\n</div>\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,提供 Vue 3 网页工作台与可选的 Fabric 客户端 Mod。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、12 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n6. **Vue 工作台**:Vue 3 + TypeScript + Vite 构建的界面,统一承载对话、知识库、配方浏览、游戏连接与控制台导航。\n\n<div align=\"center\">\n <img width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/71b70566-f12b-4b92-aab4-2810a197dd75\" />\n</div>\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WS| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WS| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## Quick Start\n\n### 1. 前置条件\n\n- Docker Desktop 与 Docker Compose\n- 任意 OpenAI 兼容 API Key\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 克隆并配置\n\n```bash\ngit clone git@github.com:brofea/mc-pilot.git\ncd mc-pilot\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 任意 OpenAI 兼容 API Key\nDEEPSEEK_API_KEY=\n\n# .minecraft 目录;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=\n```\n\n注意:不要把 `.env` 提交到仓库。\n\n仓库中已包含预构建的配方数据库(`data/mc_pilot.db`),无需额外构建。\n\n### 3. 启动\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n首次启动时会自动检查 Qdrant 中是否已有 Wiki 索引。如果没有,会在后台构建(下载嵌入模型 + 向量化,可能需要数分钟)。构建完成后数据保留在 Docker 卷中,后续启动秒级就绪。\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 网页工作台\n\n生产环境中,Docker 的 Node 构建阶段会编译 `web/` 下的 Vue 3 + TypeScript + Vite 应用;FastAPI 随后从 `/static/app/` 提供编译产物。因此 Docker 模式仍只需访问 <http://127.0.0.1:8000>。\n\n| 路径 | 状态 | 用途 |\n|---|---|---|\n| `/` | 可用 | 与 Pilot 对话、查看执行轨迹与服务状态 |\n| `/admin` | 可用 | 本机开发控制台 |\n| `/knowledge` | WIP | 知识库预览 |\n| `/recipes` | WIP | 配方浏览预览 |\n| `/game-link` | WIP | Fabric Mod 本地游戏连接预览 |\n\n知识库、配方浏览和游戏连接当前只展示能力方向与路线图,不提供独立查询或连接操作。\n\n## 更新数据\n\n当 Minecraft 版本更新或 Wiki 内容变化后,可以重新构建数据。\n\n### 更新配方数据\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n配方构建通常较快(约 1–2 分钟)。可通过 `--version` 指定目标版本(默认 26.2):\n\n```bash\ndocker compose exec app python scripts/build_recipes.py --version 27.0\n```\n\n### 更新 Wiki 索引\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_wiki.py\n\n# 本地模式\n.venv/bin/python scripts/build_wiki.py\n```\n\nWiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟(后续增量运行更快,因为 API 响应有缓存)。看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。可在另一终端确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后应显示 `\"index_exists\":true`。\n\n### 验证更新\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n## 本地开发\n\n本项目只使用 `pip`、`.venv` 和 Docker,不使用 conda。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n### 4. 启动 Vue 前端(第二个终端)\n\n```bash\ncd web\nnpm install\nnpm run dev\n```\n\nVite 开发服务器运行在 <http://127.0.0.1:5173/>,并将 `/api`、`/health` 与 `/ws` 请求代理到本地 FastAPI 的 `8000` 端口。生产构建使用:\n\n```bash\ncd web\nnpm run build\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成\"构建数据 → 启动应用\",不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时,解析死亡消息并推送建议。\n\n## 数据来源\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL。\n\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| POST | `/api/chat/stream` | SSE 流式 Agent 响应 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| GET/POST/DELETE | `/api/conversations` | 对话管理 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n## Fabric Mod\n\n要求:JDK 25、Minecraft Java Edition 26.2、本地 Pilot 后端运行在 `127.0.0.1:8000`。\n\nFabric Mod 是本地游戏连接桥:它将 Minecraft Java 实例的日志、玩家事件与世界状态交给 Pilot 使用。网页的 `/game-link` 页面目前是该桥接能力的 WIP 预览;实际连接由安装在客户端 `mods/` 目录中的 Mod 完成。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:`fabric-mod/build/libs/pilot-mod-0.1.0.jar`\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # 无前端构建时的 Jinja2 回退页面\n│ └── static/app/ # Vite 生成的 SPA 产物(不提交)\n├── data/ # 预构建配方数据库\n├── scripts/ # 配方、Wiki 与 Docker 初始化脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── web/ # Vue 3 + TypeScript + Vite 前端\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n首次 `docker compose up` 时会自动构建。如需手动触发:\n\n```bash\ndocker compose exec app python scripts/build_wiki.py\n```\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n## 已知限制\n\n- 数据仅覆盖 Java Edition 26.2 正式版,不承诺其他版本;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 API Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "37cad2ad9ac6fa3a7cae9809eef4f19cbba88fed": {"t": 1785772047.442683, "n": 8861, "h": "1434711a4e49299a", "c": "<div align=\"center\">\n <img width=\"200\" alt=\"icon\" src=\"https://github.com/user-attachments/assets/880c6c14-bf9f-43e6-a8b1-08a37830af9e\" />\n <h1>Minecraft Pilot Agent</h1>\n <p>为 MC 26.x 打造的 AI 游戏助手</p>\n <p>\n <a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">\n <img src=\"https://img.shields.io/badge/license-GPL--3.0-green\" />\n </a>\n <a href=\"https://github.com/brofea\">\n <img src=\"https://img.shields.io/badge/brofea-brofea?label=GitHub&logo=github&color=purple\" alt=\"GitHub Profile\">\n </a>\n </p>\n</div>\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,提供 Vue 3 网页工作台与可选的 Fabric 客户端 Mod。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、12 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n6. **Vue 工作台**:Vue 3 + TypeScript + Vite 构建的界面,统一承载对话、知识库、配方浏览、游戏连接与控制台导航。\n\n<div align=\"center\">\n <img width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/71b70566-f12b-4b92-aab4-2810a197dd75\" />\n</div>\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WS| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WS| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## Quick Start\n\n### 1. 前置条件\n\n- Docker Desktop 与 Docker Compose\n- 任意 OpenAI 兼容 API Key\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 克隆并配置\n\n```bash\ngit clone git@github.com:brofea/mc-pilot.git\ncd mc-pilot\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 任意 OpenAI 兼容 API Key\nDEEPSEEK_API_KEY=\n\n# .minecraft 目录;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=\n```\n\n注意:不要把 `.env` 提交到仓库。\n\n仓库中已包含预构建的配方数据库(`data/mc_pilot.db`),无需额外构建。\n\n### 3. 启动\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n首次启动时会自动检查 Qdrant 中是否已有 Wiki 索引。如果没有,会在后台构建(下载嵌入模型 + 向量化,可能需要数分钟)。构建完成后数据保留在 Docker 卷中,后续启动秒级就绪。\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 网页工作台\n\n生产环境中,Docker 的 Node 构建阶段会编译 `web/` 下的 Vue 3 + TypeScript + Vite 应用;FastAPI 随后从 `/static/app/` 提供编译产物。因此 Docker 模式仍只需访问 <http://127.0.0.1:8000>。\n\n| 路径 | 状态 | 用途 |\n|---|---|---|\n| `/` | 可用 | 与 Pilot 对话、查看执行轨迹与服务状态 |\n| `/admin` | 可用 | 本机开发控制台 |\n| `/knowledge` | WIP | 知识库预览 |\n| `/recipes` | WIP | 配方浏览预览 |\n| `/game-link` | WIP | Fabric Mod 本地游戏连接预览 |\n\n知识库、配方浏览和游戏连接当前只展示能力方向与路线图,不提供独立查询或连接操作。\n\n## 更新数据\n\n当 Minecraft 版本更新或 Wiki 内容变化后,可以重新构建数据。\n\n### 更新配方数据\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n配方构建通常较快(约 1–2 分钟)。可通过 `--version` 指定目标版本(默认 26.2):\n\n```bash\ndocker compose exec app python scripts/build_recipes.py --version 27.0\n```\n\n### 更新 Wiki 索引\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_wiki.py\n\n# 本地模式\n.venv/bin/python scripts/build_wiki.py\n```\n\nWiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟(后续增量运行更快,因为 API 响应有缓存)。看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。可在另一终端确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后应显示 `\"index_exists\":true`。\n\n### 验证更新\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n## 本地开发\n\n本项目只使用 `pip`、`.venv` 和 Docker,不使用 conda。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n### 4. 启动 Vue 前端(第二个终端)\n\n```bash\ncd web\nnpm install\nnpm run dev\n```\n\nVite 开发服务器运行在 <http://127.0.0.1:5173/>,并将 `/api`、`/health` 与 `/ws` 请求代理到本地 FastAPI 的 `8000` 端口。生产构建使用:\n\n```bash\ncd web\nnpm run build\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成\"构建数据 → 启动应用\",不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时,解析死亡消息并推送建议。\n\n## 数据来源\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL。\n\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| POST | `/api/chat/stream` | SSE 流式 Agent 响应 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| GET/POST/DELETE | `/api/conversations` | 对话管理 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n## Fabric Mod\n\n要求:JDK 25、Minecraft Java Edition 26.2、本地 Pilot 后端运行在 `127.0.0.1:8000`。\n\nFabric Mod 是本地游戏连接桥:它将 Minecraft Java 实例的日志、玩家事件与世界状态交给 Pilot 使用。网页的 `/game-link` 页面目前是该桥接能力的 WIP 预览;实际连接由安装在客户端 `mods/` 目录中的 Mod 完成。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:`fabric-mod/build/libs/pilot-mod-0.1.0.jar`\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # 无前端构建时的 Jinja2 回退页面\n│ └── static/app/ # Vite 生成的 SPA 产物(不提交)\n├── data/ # 预构建配方数据库\n├── scripts/ # 配方、Wiki 与 Docker 初始化脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── web/ # Vue 3 + TypeScript + Vite 前端\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n首次 `docker compose up` 时会自动构建。如需手动触发:\n\n```bash\ndocker compose exec app python scripts/build_wiki.py\n```\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n## 已知限制\n\n- 数据仅覆盖 Java Edition 26.2 正式版,不承诺其他版本;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 API Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "a2dae357440ec185aa1d4394313b498cbc355d00": {"t": 1785772048.8673894, "n": 8814, "h": "725836d5dcf2353d", "c": "<div align=\"center\">\n <img width=\"200\" alt=\"icon\" src=\"https://github.com/user-attachments/assets/880c6c14-bf9f-43e6-a8b1-08a37830af9e\" />\n <h1>Minecraft Pilot Agent</h1>\n <p>为 MC 26.x 打造的 AI 游戏助手</p>\n <p>\n <a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">\n <img src=\"https://img.shields.io/badge/license-GPL--3.0-green\" />\n </a>\n <a href=\"https://github.com/brofea\">\n <img src=\"https://img.shields.io/badge/brofea-brofea?label=GitHub&logo=github&color=purple\" alt=\"GitHub Profile\">\n </a>\n </p>\n</div>\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,并提供网页界面与可选的 Fabric 客户端 Mod。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、12 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n\n<div align=\"center\">\n <img width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/71b70566-f12b-4b92-aab4-2810a197dd75\" />\n</div>\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WS| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WS| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## 快速开始:克隆即运行\n\n### 1. 前置条件\n\n- macOS 优先;Linux 也可运行网页、RAG 和配方功能\n- Docker Desktop 与 Docker Compose\n- 可选:DeepSeek API Key。没有 Key 时,网页、健康检查和配方功能仍可用;自然语言对话与死亡建议不可用\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 克隆并配置\n\n```bash\ngit clone <repo-url> mc-pilot\ncd mc-pilot\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 可选,但自然语言 Agent 和死亡建议需要它\nDEEPSEEK_API_KEY=你的_API_Key\n\n# macOS Minecraft 目录。请替换成真实用户名;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=/Users/你的用户名/Library/Application Support/minecraft\n```\n\n不要把 `.env` 提交到 Git。项目不会在网页或日志中返回 API Key。\n\n仓库中已包含预构建的配方数据库(`data/mc_pilot.db`),无需额外构建。\n\n### 3. 启动\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n首次启动时会自动检查 Qdrant 中是否已有 Wiki 索引。如果没有,会在后台构建(下载嵌入模型 + 向量化,可能需要数分钟)。构建完成后数据保留在 Docker 卷中,后续启动秒级就绪。\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 更新数据\n\n当 Minecraft 版本更新或 Wiki 内容变化后,可以重新构建数据。\n\n### 更新配方数据\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n配方构建通常较快(约 1–2 分钟)。可通过 `--version` 指定目标版本(默认 26.2):\n\n```bash\ndocker compose exec app python scripts/build_recipes.py --version 27.0\n```\n\n### 更新 Wiki 索引\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_wiki.py\n\n# 本地模式\n.venv/bin/python scripts/build_wiki.py\n```\n\nWiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟(后续增量运行更快,因为 API 响应有缓存)。看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。可在另一终端确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后应显示 `\"index_exists\":true`。\n\n### 验证更新\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n## 本地开发\n\n本项目只使用 `pip`、`.venv` 和 Docker,不使用 conda。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成\"构建数据 → 启动应用\",不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n## 使用方式\n\n网页输入框接受自然语言提问。Agent 自动选择 Function Calling:\n\n| 输入 | 行为 | 前置条件 | 消耗 LLM |\n|---|---|---|---|\n| `你好` 或打招呼 | Agent 返回功能介绍 | LLM API KEY | 是 |\n| `钻石剑需要什么材料` | Agent 调用 recipe_query | LLM API KEY | 是 |\n| `凋零骷髅在哪生成` | Agent 调用 wiki_search | LLM API KEY | 是 |\n| `查看状态` | Agent 调用 get_status | LLM API KEY | 是 |\n| `/pilot wiki 末地传送门` | 直接检索 Wiki(不走 LLM) | 已构建 Wiki 索引 | 否 |\n| `/pilot recipe minecraft:bow` | 直接查配方树(不走 LLM) | 已构建配方数据 | 否 |\n\n配方物品建议使用完整资源 ID,例如 `minecraft:enchanting_table`。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时,解析死亡消息并推送建议。\n\n## 数据来源与确定性边界\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL。\n\n## 开发者后台\n\n<http://127.0.0.1:8000/admin> 展示:\n\n- 系统版本与运行环境;\n- 游戏连接、玩家、日志和死亡次数;\n- 配方版本;\n- RAG、LLM 与 Agent 配置状态;\n- 经 `Settings.safe_summary()` 脱敏后的配置;\n- 健康检查与日志重连操作。\n\n后台仅允许 loopback Host。\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| POST | `/api/chat/stream` | SSE 流式 Agent 响应 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| GET/POST/DELETE | `/api/conversations` | 对话管理 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n## Fabric Mod\n\n要求:JDK 25、Minecraft Java Edition 26.2、本地 Pilot 后端运行在 `127.0.0.1:8000`。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:`fabric-mod/build/libs/pilot-mod-0.1.0.jar`\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # Jinja2 页面\n│ └── static/ # 原生 JavaScript 与 CSS\n├── data/ # 预构建配方数据库\n├── scripts/ # 配方、Wiki 与 Docker 初始化脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n首次 `docker compose up` 时会自动构建。如需手动触发:\n\n```bash\ndocker compose exec app python scripts/build_wiki.py\n```\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n## 已知限制\n\n- 仅覆盖 Java Edition 26.2 正式版,不承诺其他 26.x 版本;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 DeepSeek Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "9416bb0acfc5066bcfb89fe821bb6d064881a389": {"t": 1785772050.2766047, "n": 8818, "h": "43c3a1f7d1b45c45", "c": "<div align=\"center\">\n <img width=\"200\" alt=\"icon\" src=\"https://github.com/user-attachments/assets/880c6c14-bf9f-43e6-a8b1-08a37830af9e\" />\n <h1>Minecraft Pilot Agent</h1>\n <p>为 MC 26.x 打造的 AI 游戏助手</p>\n <p>\n <a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">\n <img src=\"https://img.shields.io/badge/license-GPL--3.0-green\" />\n </a>\n <a href=\"https://github.com/brofea\">\n <img src=\"https://img.shields.io/badge/brofea-brofea?label=GitHub&logo=github&color=purple\" alt=\"GitHub Profile\">\n </a>\n </p>\n</div>\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,并提供网页界面与可选的 Fabric 客户端 Mod。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、12 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n\n<div align=\"center\">\n <img width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/71b70566-f12b-4b92-aab4-2810a197dd75\" />\n</div>\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WS| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WS| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## 快速开始:克隆即运行\n\n### 1. 前置条件\n\n- macOS 优先;Linux 也可运行网页、RAG 和配方功能\n- Docker Desktop 与 Docker Compose\n- 可选:DeepSeek API Key。没有 Key 时,网页、健康检查和配方功能仍可用;自然语言对话与死亡建议不可用\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 克隆并配置\n\n```bash\ngit clone <repo-url> mc-pilot\ncd mc-pilot\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 可选,但自然语言 Agent 和死亡建议需要它\nDEEPSEEK_API_KEY=你的_API_Key\n\n# macOS Minecraft 目录。请替换成真实用户名;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=/Users/你的用户名/Library/Application Support/minecraft\n```\n\n不要把 `.env` 提交到 Git。项目不会在网页或日志中返回 API Key。\n\n仓库中已包含预构建的配方数据库(`data/mc_pilot.db`),无需额外构建。\n\n### 3. 启动\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n首次启动时会自动检查 Qdrant 中是否已有 Wiki 索引。如果没有,会在后台构建(下载嵌入模型 + 向量化,可能需要数分钟)。构建完成后数据保留在 Docker 卷中,后续启动秒级就绪。\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 更新数据\n\n当 Minecraft 版本更新或 Wiki 内容变化后,可以重新构建数据。\n\n### 更新配方数据\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n配方构建通常较快(约 1–2 分钟)。可通过 `--version` 指定目标版本(默认 26.2):\n\n```bash\ndocker compose exec app python scripts/build_recipes.py --version 27.0\n```\n\n### 更新 Wiki 索引\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_wiki.py\n\n# 本地模式\n.venv/bin/python scripts/build_wiki.py\n```\n\nWiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟(后续增量运行更快,因为 API 响应有缓存)。看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。可在另一终端确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后应显示 `\"index_exists\":true`。\n\n### 验证更新\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n## 本地开发\n\n本项目只使用 `pip`、`.venv` 和 Docker,不使用 conda。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成\"构建数据 → 启动应用\",不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n## 使用方式\n\n网页输入框接受自然语言提问。Agent 自动选择 Function Calling:\n\n| 输入 | 行为 | 前置条件 | 消耗 LLM |\n|---|---|---|---|\n| `你好` 或打招呼 | Agent 返回功能介绍 | DeepSeek Key | 是 |\n| `钻石剑需要什么材料` | Agent 调用 recipe_query | DeepSeek Key | 是 |\n| `凋零骷髅在哪生成` | Agent 调用 wiki_search | DeepSeek Key | 是 |\n| `查看状态` | Agent 调用 get_status | DeepSeek Key | 是 |\n| `/pilot wiki 末地传送门` | 直接检索 Wiki(不走 LLM) | 已构建 Wiki 索引 | 否 |\n| `/pilot recipe minecraft:bow` | 直接查配方树(不走 LLM) | 已构建配方数据 | 否 |\n\n配方物品建议使用完整资源 ID,例如 `minecraft:enchanting_table`。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时,解析死亡消息并推送建议。\n\n## 数据来源与确定性边界\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL。\n\n## 开发者后台\n\n<http://127.0.0.1:8000/admin> 展示:\n\n- 系统版本与运行环境;\n- 游戏连接、玩家、日志和死亡次数;\n- 配方版本;\n- RAG、LLM 与 Agent 配置状态;\n- 经 `Settings.safe_summary()` 脱敏后的配置;\n- 健康检查与日志重连操作。\n\n后台仅允许 loopback Host。\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| POST | `/api/chat/stream` | SSE 流式 Agent 响应 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| GET/POST/DELETE | `/api/conversations` | 对话管理 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n## Fabric Mod\n\n要求:JDK 25、Minecraft Java Edition 26.2、本地 Pilot 后端运行在 `127.0.0.1:8000`。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:`fabric-mod/build/libs/pilot-mod-0.1.0.jar`\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # Jinja2 页面\n│ └── static/ # 原生 JavaScript 与 CSS\n├── data/ # 预构建配方数据库\n├── scripts/ # 配方、Wiki 与 Docker 初始化脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n首次 `docker compose up` 时会自动构建。如需手动触发:\n\n```bash\ndocker compose exec app python scripts/build_wiki.py\n```\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n## 已知限制\n\n- 仅覆盖 Java Edition 26.2 正式版,不承诺其他 26.x 版本;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 DeepSeek Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "66dfe6ef933d5763dea4d0654c735daa75944503": {"t": 1785772052.251044, "n": 9480, "h": "b81c1772c69c1fe3", "c": "<div align=\"center\">\n <img width=\"200\" alt=\"icon\" src=\"https://github.com/user-attachments/assets/880c6c14-bf9f-43e6-a8b1-08a37830af9e\" />\n <h1>Minecraft Pilot Agent</h1>\n <p>为 MC 26.x 打造的 AI 游戏助手</p>\n <p>\n <a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">\n <img src=\"https://img.shields.io/badge/license-GPL--3.0-green\" />\n </a>\n <a href=\"https://github.com/brofea\">\n <img src=\"https://img.shields.io/badge/brofea-brofea?label=GitHub&logo=github&color=purple\" alt=\"GitHub Profile\">\n </a>\n </p>\n</div>\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,并提供网页界面与可选的 Fabric 客户端 Mod。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、6 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n\n<div align=\"center\">\n <img width=\"700\" alt=\"image\" src=\"https://github.com/user-attachments/assets/71b70566-f12b-4b92-aab4-2810a197dd75\" />\n</div>\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WebSocket| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WebSocket| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## 快速开始:Docker\n\n### 1. 前置条件\n\n- macOS 优先;Linux 也可运行网页、RAG 和配方功能\n- Docker Desktop 与 Docker Compose\n- 可选:DeepSeek API Key。没有 Key 时,网页、健康检查、配方和已构建的 Wiki 检索仍可用;自然语言 Agent 与死亡建议不可用\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 配置环境变量\n\n```bash\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 可选,但自然语言 Agent 和死亡建议需要它\nDEEPSEEK_API_KEY=你的_API_Key\n\n# macOS Minecraft 目录。请替换成真实用户名;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=/Users/你的用户名/Library/Application Support/minecraft\n```\n\n不要把 `.env` 提交到 Git。项目不会在网页或日志中返回 API Key。\n\n### 3. 启动网页与 Qdrant\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 构建可选数据\n\n首次启动时数据库可以为空。按需要构建:\n\n```bash\n# 官方 26.2 配方数据 → Docker app-data 中的 SQLite\ndocker compose exec app python scripts/build_recipes.py\n\n# 中文 Wiki → Qdrant;首次运行会下载本地嵌入模型\ndocker compose exec app python scripts/build_wiki.py\n\n# DeepSeek 连通性测试\ndocker compose exec app python scripts/test_connectivity.py\n```\n\n配方构建通常较快。Wiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟;看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。不要把终端工具超时或窗口断开误判成构建成功,可在另一终端用后台接口确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后,两个接口应分别显示已有配方数据和 `\"index_exists\":true`。还可以发起不经过前端的真实查询:\n\n```bash\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n`app-data` 和 `qdrant-data` 是命名卷;SQLite、Wiki API 缓存和 Hugging Face 模型缓存会在容器重建后保留。Minecraft 目录仅以只读方式挂载。\n\n### 5. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 本地开发\n\n本项目只使用 `pip`、`.venv` 和 Docker,不使用 conda。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成“构建数据 → 启动应用”,不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n## 使用方式\n\n网页输入框接受自然语言和 `/pilot` 子命令:\n\n| 输入 | 行为 | 前置条件 | 消耗 LLM |\n|---|---|---|---|\n| `/pilot wiki 末地传送门` | 直接检索 Wiki 片段并附来源 | 已构建 Wiki 索引 | 否 |\n| `/pilot recipe minecraft:bow` | 返回确定性配方树与基础材料 | 已构建配方数据 | 否 |\n| `/pilot 如何获得鞘翅?` | Agent 自主选择 Wiki/配方工具 | DeepSeek Key;相关数据按问题准备 | 是 |\n| `你好,你能做什么?` | 普通 Agent 对话 | DeepSeek Key | 是 |\n| `/pilot status` | 显示模型与 token 用量 | 无 | 否 |\n| `/pilot clear` | 清除进程内短期记忆 | 无 | 否 |\n| `/pilot help` | 显示命令帮助 | 无 | 否 |\n\n配方物品建议使用完整资源 ID,例如 `minecraft:enchanting_table`。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时:\n\n1. 解析简体中文或英文死亡消息;\n2. 忽略其他玩家并去重重复事件;\n3. 不调用 Wiki 或配方工具;\n4. 生成 2–5 句短建议;\n5. 通过 `/ws` 推送到网页并自动淡出。\n\n日志路径不能在当前网页里编辑。Docker 模式修改 `MC_PILOT_MINECRAFT_DIR`;本地模式可设置 `MC_PILOT_GAME_LOG_PATH`,然后重启应用。\n\n## 数据来源与确定性边界\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限;\n- 镜像:可通过 `build_recipes.py --mirror <URL>` 显式提供失败回退源,最终仍必须通过官方 SHA-1。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL;当前 `/pilot wiki` 返回检索片段与来源,不额外调用 LLM 改写。\n\n## 开发者后台\n\n<http://127.0.0.1:8000/admin> 展示:\n\n- 系统版本与运行环境;\n- 游戏连接、玩家、日志和死亡次数;\n- 配方版本;\n- RAG、LLM 与 Agent 配置状态;\n- 经 `Settings.safe_summary()` 脱敏后的配置;\n- 健康检查与日志重连操作。\n\n后台仅允许 loopback Host。`rebuild-wiki` 接口目前返回 `not_implemented`,真实索引构建请使用 `scripts/build_wiki.py`。\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n配方树示例:\n\n```bash\ncurl -X POST http://127.0.0.1:8000/api/recipes/tree \\\n -H 'Content-Type: application/json' \\\n -d '{\"item_id\":\"minecraft:diamond_sword\",\"quantity\":1,\"max_depth\":3}'\n```\n\n## Fabric Mod\n\n要求:\n\n- JDK 25;\n- Minecraft Java Edition 26.2;\n- 本地 Pilot 后端运行在 `127.0.0.1:8000`;\n- Gradle 9.5.1 由仓库 Wrapper 提供,无需安装主机 Gradle。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:\n\n```text\nfabric-mod/build/libs/pilot-mod-0.1.0.jar\n```\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。Mod 只注册本地 `/pilot` 客户端命令、发送 HTTP 请求、接收 WebSocket 事件并渲染本地聊天消息;知识、配方和推理逻辑仍在 Python 后端。API Key 不进入 Mod。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n自动化测试覆盖配方解析与递归树、官方哈希、SQLite、Wiki 分块与检索、Agent 工具与预算、双语死亡解析、日志轮转/截断、API 降级、WebSocket 清理、Docker 挂载、后台访问控制及 secret 脱敏。\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # Jinja2 页面\n│ └── static/ # 原生 JavaScript 与 CSS\n├── scripts/ # 配方、Wiki 与模型连通性脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n本地开发模式确认 `.env` 中 `MC_PILOT_QDRANT_URL=http://localhost:6333`。\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n运行对应模式的 `build_wiki.py`。首次加载嵌入模型需要网络和较长时间;不要在中途删除 Qdrant volume。\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。容器内可检查:\n\n```bash\ndocker compose exec app test -r /minecraft/logs/latest.log\n```\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n日志只应记录模型、耗时和脱敏后的用量,不应出现 API Key。\n\n## 已知限制\n\n- 仅覆盖 Java Edition 26.2 正式版,不承诺其他 26.x 版本;\n- 网页后台尚不能输入任意日志路径,也不能直接重建 Wiki;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 DeepSeek Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "e2fc4a2f9828faf28516e648fb652a8be8ede948": {"t": 1785772053.9752429, "n": 9179, "h": "0d2ffbc15bafedce", "c": "# Minecraft Pilot Agent\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,并提供网页界面与可选的 Fabric 客户端 Mod。\n\n## 项目状态\n\n| 项目 | 状态 |\n|---|---|\n| 网页 MVP | 已完成,可通过 Docker 或本地 Python 运行 |\n| 中文 Wiki RAG | 已实现,需要先构建 Qdrant 索引 |\n| 官方配方与 N 层配方树 | 已实现,需要先构建 SQLite 数据 |\n| 本地死亡日志建议 | 已实现,需要 Minecraft 日志和 DeepSeek API |\n| Fabric 26.2 Mod | 已完成源码与可复现构建,属于第二阶段加分项 |\n| 支持版本 | 仅 Minecraft Java Edition 26.2 正式版 |\n\n当前质量门:Ruff 通过、Mypy strict 通过、`121 passed`、Docker Compose 配置校验通过、Fabric Wrapper 构建通过。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、6 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WebSocket| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WebSocket| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## 快速开始:Docker(推荐交付方式)\n\n### 1. 前置条件\n\n- macOS 优先;Linux 也可运行网页、RAG 和配方功能\n- Docker Desktop 与 Docker Compose\n- 可选:DeepSeek API Key。没有 Key 时,网页、健康检查、配方和已构建的 Wiki 检索仍可用;自然语言 Agent 与死亡建议不可用\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 配置环境变量\n\n```bash\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 可选,但自然语言 Agent 和死亡建议需要它\nDEEPSEEK_API_KEY=你的_API_Key\n\n# macOS Minecraft 目录。请替换成真实用户名;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=/Users/你的用户名/Library/Application Support/minecraft\n```\n\n不要把 `.env` 提交到 Git。项目不会在网页或日志中返回 API Key。\n\n### 3. 启动网页与 Qdrant\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 构建可选数据\n\n首次启动时数据库可以为空。按需要构建:\n\n```bash\n# 官方 26.2 配方数据 → Docker app-data 中的 SQLite\ndocker compose exec app python scripts/build_recipes.py\n\n# 中文 Wiki → Qdrant;首次运行会下载本地嵌入模型\ndocker compose exec app python scripts/build_wiki.py\n\n# DeepSeek 连通性测试\ndocker compose exec app python scripts/test_connectivity.py\n```\n\n配方构建通常较快。Wiki 构建会抓取九类页面并在 CPU 上生成数千条向量,首次运行可能需要数十分钟;看到连续的 Qdrant `points ... 200 OK` 属于正常进度,请等待终端出现 `Wiki index built` 并返回命令提示符。不要把终端工具超时或窗口断开误判成构建成功,可在另一终端用后台接口确认:\n\n```bash\ncurl http://127.0.0.1:8000/admin/api/recipes\ncurl http://127.0.0.1:8000/admin/api/rag\n```\n\n构建完成后,两个接口应分别显示已有配方数据和 `\"index_exists\":true`。还可以发起不经过前端的真实查询:\n\n```bash\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot recipe minecraft:crafting_table\"}'\n\ncurl -X POST http://127.0.0.1:8000/api/chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"message\":\"/pilot wiki 石头\"}'\n```\n\n`app-data` 和 `qdrant-data` 是命名卷;SQLite、Wiki API 缓存和 Hugging Face 模型缓存会在容器重建后保留。Minecraft 目录仅以只读方式挂载。\n\n### 5. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 本地开发模式\n\n本项目只使用 `pip`、`.venv` 和 Docker,**不要使用 conda**。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成“构建数据 → 启动应用”,不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n## 使用方式\n\n网页输入框接受自然语言和 `/pilot` 子命令:\n\n| 输入 | 行为 | 前置条件 | 消耗 LLM |\n|---|---|---|---|\n| `/pilot wiki 末地传送门` | 直接检索 Wiki 片段并附来源 | 已构建 Wiki 索引 | 否 |\n| `/pilot recipe minecraft:bow` | 返回确定性配方树与基础材料 | 已构建配方数据 | 否 |\n| `/pilot 如何获得鞘翅?` | Agent 自主选择 Wiki/配方工具 | DeepSeek Key;相关数据按问题准备 | 是 |\n| `你好,你能做什么?` | 普通 Agent 对话 | DeepSeek Key | 是 |\n| `/pilot status` | 显示模型与 token 用量 | 无 | 否 |\n| `/pilot clear` | 清除进程内短期记忆 | 无 | 否 |\n| `/pilot help` | 显示命令帮助 | 无 | 否 |\n\n配方物品建议使用完整资源 ID,例如 `minecraft:enchanting_table`。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时:\n\n1. 解析简体中文或英文死亡消息;\n2. 忽略其他玩家并去重重复事件;\n3. 不调用 Wiki 或配方工具;\n4. 生成 2–5 句短建议;\n5. 通过 `/ws` 推送到网页并自动淡出。\n\n日志路径不能在当前网页里编辑。Docker 模式修改 `MC_PILOT_MINECRAFT_DIR`;本地模式可设置 `MC_PILOT_GAME_LOG_PATH`,然后重启应用。\n\n## 数据来源与确定性边界\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限;\n- 镜像:可通过 `build_recipes.py --mirror <URL>` 显式提供失败回退源,最终仍必须通过官方 SHA-1。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL;当前 `/pilot wiki` 返回检索片段与来源,不额外调用 LLM 改写。\n\n## 开发者后台\n\n<http://127.0.0.1:8000/admin> 展示:\n\n- 系统版本与运行环境;\n- 游戏连接、玩家、日志和死亡次数;\n- 配方版本;\n- RAG、LLM 与 Agent 配置状态;\n- 经 `Settings.safe_summary()` 脱敏后的配置;\n- 健康检查与日志重连操作。\n\n后台仅允许 loopback Host。`rebuild-wiki` 接口目前返回 `not_implemented`,真实索引构建请使用 `scripts/build_wiki.py`。\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n配方树示例:\n\n```bash\ncurl -X POST http://127.0.0.1:8000/api/recipes/tree \\\n -H 'Content-Type: application/json' \\\n -d '{\"item_id\":\"minecraft:diamond_sword\",\"quantity\":1,\"max_depth\":3}'\n```\n\n## Fabric Mod(第二阶段加分项)\n\n要求:\n\n- JDK 25;\n- Minecraft Java Edition 26.2;\n- 本地 Pilot 后端运行在 `127.0.0.1:8000`;\n- Gradle 9.5.1 由仓库 Wrapper 提供,无需安装主机 Gradle。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:\n\n```text\nfabric-mod/build/libs/pilot-mod-0.1.0.jar\n```\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。Mod 只注册本地 `/pilot` 客户端命令、发送 HTTP 请求、接收 WebSocket 事件并渲染本地聊天消息;知识、配方和推理逻辑仍在 Python 后端。API Key 不进入 Mod。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n自动化测试覆盖配方解析与递归树、官方哈希、SQLite、Wiki 分块与检索、Agent 工具与预算、双语死亡解析、日志轮转/截断、API 降级、WebSocket 清理、Docker 挂载、后台访问控制及 secret 脱敏。\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # Jinja2 页面\n│ └── static/ # 原生 JavaScript 与 CSS\n├── scripts/ # 配方、Wiki 与模型连通性脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n本地开发模式确认 `.env` 中 `MC_PILOT_QDRANT_URL=http://localhost:6333`。\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n运行对应模式的 `build_wiki.py`。首次加载嵌入模型需要网络和较长时间;不要在中途删除 Qdrant volume。\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。容器内可检查:\n\n```bash\ndocker compose exec app test -r /minecraft/logs/latest.log\n```\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n日志只应记录模型、耗时和脱敏后的用量,不应出现 API Key。\n\n## 已知限制\n\n- 仅覆盖 Java Edition 26.2 正式版,不承诺其他 26.x 版本;\n- 网页后台尚不能输入任意日志路径,也不能直接重建 Wiki;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 DeepSeek Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "cd9a82b73daa5df16098533959b585fd9eaf6d64": {"t": 1785772055.3130357, "n": 8561, "h": "c019e16e459a77e8", "c": "# Minecraft Pilot Agent\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。将中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,并提供网页界面与可选的 Fabric 客户端 Mod。\n\n## 项目状态\n\n| 项目 | 状态 |\n|---|---|\n| 网页 MVP | 已完成,可通过 Docker 或本地 Python 运行 |\n| 中文 Wiki RAG | 已实现,需要先构建 Qdrant 索引 |\n| 官方配方与 N 层配方树 | 已实现,需要先构建 SQLite 数据 |\n| 本地死亡日志建议 | 已实现,需要 Minecraft 日志和 DeepSeek API |\n| Fabric 26.2 Mod | 已完成源码与可复现构建,属于第二阶段加分项 |\n| 支持版本 | 仅 Minecraft Java Edition 26.2 正式版 |\n\n当前质量门:Ruff 通过、Mypy strict 通过、`116 passed`、Docker 健康检查通过、Fabric Wrapper 构建通过。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、6 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WebSocket| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WebSocket| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## 快速开始:Docker(推荐交付方式)\n\n### 1. 前置条件\n\n- macOS 优先;Linux 也可运行网页、RAG 和配方功能\n- Docker Desktop 与 Docker Compose\n- 可选:DeepSeek API Key。没有 Key 时,网页、健康检查、配方和已构建的 Wiki 检索仍可用;自然语言 Agent 与死亡建议不可用\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 配置环境变量\n\n```bash\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 可选,但自然语言 Agent 和死亡建议需要它\nDEEPSEEK_API_KEY=你的_API_Key\n\n# macOS Minecraft 目录。请替换成真实用户名;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=/Users/你的用户名/Library/Application Support/minecraft\n```\n\n不要把 `.env` 提交到 Git。项目不会在网页或日志中返回 API Key。\n\n### 3. 启动网页与 Qdrant\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 构建可选数据\n\n首次启动时数据库可以为空。按需要构建:\n\n```bash\n# 官方 26.2 配方数据 → Docker app-data 中的 SQLite\ndocker compose exec app python scripts/build_recipes.py\n\n# 中文 Wiki → Qdrant;首次运行会下载本地嵌入模型\ndocker compose exec app python scripts/build_wiki.py\n\n# DeepSeek 连通性测试\ndocker compose exec app python scripts/test_connectivity.py\n```\n\n`app-data` 和 `qdrant-data` 是命名卷;SQLite、Wiki API 缓存和 Hugging Face 模型缓存会在容器重建后保留。Minecraft 目录仅以只读方式挂载。\n\n### 5. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 本地开发模式\n\n本项目只使用 `pip`、`.venv` 和 Docker,**不要使用 conda**。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成“构建数据 → 启动应用”,不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n## 使用方式\n\n网页输入框接受自然语言和 `/pilot` 子命令:\n\n| 输入 | 行为 | 前置条件 | 消耗 LLM |\n|---|---|---|---|\n| `/pilot wiki 末地传送门` | 直接检索 Wiki 片段并附来源 | 已构建 Wiki 索引 | 否 |\n| `/pilot recipe minecraft:bow` | 返回确定性配方树与基础材料 | 已构建配方数据 | 否 |\n| `/pilot 如何获得鞘翅?` | Agent 自主选择 Wiki/配方工具 | DeepSeek Key;相关数据按问题准备 | 是 |\n| `你好,你能做什么?` | 普通 Agent 对话 | DeepSeek Key | 是 |\n| `/pilot status` | 显示模型与 token 用量 | 无 | 否 |\n| `/pilot clear` | 清除进程内短期记忆 | 无 | 否 |\n| `/pilot help` | 显示命令帮助 | 无 | 否 |\n\n配方物品建议使用完整资源 ID,例如 `minecraft:enchanting_table`。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时:\n\n1. 解析简体中文或英文死亡消息;\n2. 忽略其他玩家并去重重复事件;\n3. 不调用 Wiki 或配方工具;\n4. 生成 2–5 句短建议;\n5. 通过 `/ws` 推送到网页并自动淡出。\n\n日志路径不能在当前网页里编辑。Docker 模式修改 `MC_PILOT_MINECRAFT_DIR`;本地模式可设置 `MC_PILOT_GAME_LOG_PATH`,然后重启应用。\n\n## 数据来源与确定性边界\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限;\n- 镜像:可通过 `build_recipes.py --mirror <URL>` 显式提供失败回退源,最终仍必须通过官方 SHA-1。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL;当前 `/pilot wiki` 返回检索片段与来源,不额外调用 LLM 改写。\n\n## 开发者后台\n\n<http://127.0.0.1:8000/admin> 展示:\n\n- 系统版本与运行环境;\n- 游戏连接、玩家、日志和死亡次数;\n- 配方版本;\n- RAG、LLM 与 Agent 配置状态;\n- 经 `Settings.safe_summary()` 脱敏后的配置;\n- 健康检查与日志重连操作。\n\n后台仅允许 loopback Host。`rebuild-wiki` 接口目前返回 `not_implemented`,真实索引构建请使用 `scripts/build_wiki.py`。\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n配方树示例:\n\n```bash\ncurl -X POST http://127.0.0.1:8000/api/recipes/tree \\\n -H 'Content-Type: application/json' \\\n -d '{\"item_id\":\"minecraft:diamond_sword\",\"quantity\":1,\"max_depth\":3}'\n```\n\n## Fabric Mod(第二阶段加分项)\n\n要求:\n\n- JDK 25;\n- Minecraft Java Edition 26.2;\n- 本地 Pilot 后端运行在 `127.0.0.1:8000`;\n- Gradle 9.5.1 由仓库 Wrapper 提供,无需安装主机 Gradle。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:\n\n```text\nfabric-mod/build/libs/pilot-mod-0.1.0.jar\n```\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。Mod 只注册本地 `/pilot` 客户端命令、发送 HTTP 请求、接收 WebSocket 事件并渲染本地聊天消息;知识、配方和推理逻辑仍在 Python 后端。API Key 不进入 Mod。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n自动化测试覆盖配方解析与递归树、官方哈希、SQLite、Wiki 分块与检索、Agent 工具与预算、双语死亡解析、日志轮转/截断、API 降级、WebSocket 清理、Docker 挂载、后台访问控制及 secret 脱敏。\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # Jinja2 页面\n│ └── static/ # 原生 JavaScript 与 CSS\n├── scripts/ # 配方、Wiki 与模型连通性脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n本地开发模式确认 `.env` 中 `MC_PILOT_QDRANT_URL=http://localhost:6333`。\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n运行对应模式的 `build_wiki.py`。首次加载嵌入模型需要网络和较长时间;不要在中途删除 Qdrant volume。\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。容器内可检查:\n\n```bash\ndocker compose exec app test -r /minecraft/logs/latest.log\n```\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n日志只应记录模型、耗时和脱敏后的用量,不应出现 API Key。\n\n## 已知限制\n\n- 仅覆盖 Java Edition 26.2 正式版,不承诺其他 26.x 版本;\n- 网页后台尚不能输入任意日志路径,也不能直接重建 Wiki;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 DeepSeek Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n"}, "4e8f0dc9a96a585ccd5d80817b8ae56ae98f0c8d": {"t": 1785772056.7639613, "n": 8878, "h": "12cfe1b29e54e179", "c": "# Minecraft Pilot Agent\n\n面向 Minecraft Java Edition 26.2 的本地游戏助手。项目把中文 Wiki RAG、官方配方数据和本地游戏日志接到一个轻量 Agent 后端,并提供网页界面与可选的 Fabric 客户端 Mod。\n\n> 这是非官方课程设计项目,与 Mojang、Microsoft 或 Minecraft Wiki 无隶属关系。\n\n## 项目状态\n\n| 项目 | 状态 |\n|---|---|\n| 网页 MVP | 已完成,可通过 Docker 或本地 Python 运行 |\n| 中文 Wiki RAG | 已实现,需要先构建 Qdrant 索引 |\n| 官方配方与 N 层配方树 | 已实现,需要先构建 SQLite 数据 |\n| 本地死亡日志建议 | 已实现,需要 Minecraft 日志和 DeepSeek API |\n| Fabric 26.2 Mod | 已完成源码与可复现构建,属于第二阶段加分项 |\n| 支持版本 | 仅 Minecraft Java Edition 26.2 正式版 |\n\n当前质量门:Ruff 通过、Mypy strict 通过、`116 passed`、Docker 健康检查通过、Fabric Wrapper 构建通过。\n\n## 核心能力\n\n1. **中文 Wiki RAG**:通过 `https://zh.minecraft.wiki/api.php` 采集白名单分类,使用 `BAAI/bge-small-zh-v1.5` 向量化并存入 Qdrant,查询结果保留页面 URL 与 revision ID。\n2. **确定性配方树**:从 Mojang 官方版本清单下载 26.2 客户端 JAR,校验 SHA-1,提取配方、标签与语言资源,再由代码计算直接配方、N 层材料树和叶子材料汇总;LLM 不参与数量计算。\n3. **游戏日志分析**:只读监听本地 `latest.log`,识别本地玩家和简中/英文死亡消息,每次有效死亡最多调用一次 DeepSeek,并通过 WebSocket 推送一条短建议。\n4. **轻量 Agent**:支持自然语言、MCP 风格 Function Calling、6 轮短期记忆、工具白名单、调用轮次限制与 token 预算。\n5. **开发者后台**:展示系统、游戏、配方、RAG、LLM 和脱敏配置状态;仅允许本机访问。\n\n## 架构\n\n```mermaid\nflowchart LR\n Web[网页客户端] -->|HTTP / WebSocket| API[FastAPI 后端]\n Mod[Fabric 26.2 Mod] -->|HTTP / WebSocket| API\n API --> Agent[轻量 Agent 状态机]\n Agent -->|Function Calling| Recipes[配方服务]\n Agent -->|Function Calling| RAG[Wiki RAG]\n Agent --> DeepSeek[DeepSeek 兼容 API]\n Recipes --> SQLite[(SQLite)]\n RAG --> Qdrant[(Qdrant)]\n Log[latest.log] --> Game[日志监听与死亡解析]\n Game --> DeepSeek\n Game --> API\n```\n\n## 快速开始:Docker(推荐交付方式)\n\n### 1. 前置条件\n\n- macOS 优先;Linux 也可运行网页、RAG 和配方功能\n- Docker Desktop 与 Docker Compose\n- 可选:DeepSeek API Key。没有 Key 时,网页、健康检查、配方和已构建的 Wiki 检索仍可用;自然语言 Agent 与死亡建议不可用\n- 若要监听游戏日志,本机需安装并运行 Minecraft Java Edition 26.2\n\n### 2. 配置环境变量\n\n```bash\ncp .env.example .env\n```\n\n编辑 `.env`:\n\n```dotenv\n# 可选,但自然语言 Agent 和死亡建议需要它\nDEEPSEEK_API_KEY=你的_API_Key\n\n# macOS Minecraft 目录。请替换成真实用户名;路径中可以包含空格\nMC_PILOT_MINECRAFT_DIR=/Users/你的用户名/Library/Application Support/minecraft\n```\n\n不要把 `.env` 提交到 Git。项目不会在网页或日志中返回 API Key。\n\n### 3. 启动网页与 Qdrant\n\n```bash\ndocker compose up -d --build\ndocker compose ps\n```\n\n验证:\n\n```bash\ncurl http://127.0.0.1:8000/health/live\ncurl http://127.0.0.1:8000/health/ready\n```\n\n预期结果:\n\n- `live` 返回 `{\"status\":\"alive\",\"version\":\"0.1.0\"}`;\n- `ready` 中 SQLite 和 Qdrant 均为 `ready`;\n- 浏览器可访问 <http://127.0.0.1:8000>;\n- 开发者后台可访问 <http://127.0.0.1:8000/admin>;\n- OpenAPI 文档可访问 <http://127.0.0.1:8000/docs>。\n\n### 4. 构建可选数据\n\n首次启动时数据库可以为空。按需要构建:\n\n```bash\n# 官方 26.2 配方数据 → Docker app-data 中的 SQLite\ndocker compose exec app python scripts/build_recipes.py\n\n# 中文 Wiki → Qdrant;首次运行会下载本地嵌入模型\ndocker compose exec app python scripts/build_wiki.py\n\n# DeepSeek 连通性测试\ndocker compose exec app python scripts/test_connectivity.py\n```\n\n`app-data` 和 `qdrant-data` 是命名卷;SQLite、Wiki API 缓存和 Hugging Face 模型缓存会在容器重建后保留。Minecraft 目录仅以只读方式挂载。\n\n### 5. 停止服务\n\n```bash\ndocker compose down\n```\n\n这不会删除数据卷。只有明确执行 `docker compose down -v` 才会删除本地项目数据。\n\n## 本地开发模式\n\n本项目只使用 `pip`、`.venv` 和 Docker,**不要使用 conda**。\n\n### 1. Python 环境\n\n```bash\npython3.12 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n```\n\n如果系统命令名是 `python3`,先用 `python3 --version` 确认版本为 3.12。\n\n### 2. 只启动 Qdrant\n\n```bash\ndocker compose up -d qdrant\n```\n\n### 3. 构建数据并启动 FastAPI\n\n```bash\n.venv/bin/python scripts/build_recipes.py\n.venv/bin/python scripts/build_wiki.py\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --host 127.0.0.1 --port 8000\n```\n\n本地模式与全 Docker 模式使用不同的 SQLite 存储位置。请选择一种模式完成“构建数据 → 启动应用”,不要在宿主机生成数据后期待 Docker volume 自动同步。\n\n## 使用方式\n\n网页输入框接受自然语言和 `/pilot` 子命令:\n\n| 输入 | 行为 | 前置条件 | 消耗 LLM |\n|---|---|---|---|\n| `/pilot wiki 末地传送门` | 直接检索 Wiki 片段并附来源 | 已构建 Wiki 索引 | 否 |\n| `/pilot recipe minecraft:bow` | 返回确定性配方树与基础材料 | 已构建配方数据 | 否 |\n| `/pilot 如何获得鞘翅?` | Agent 自主选择 Wiki/配方工具 | DeepSeek Key;相关数据按问题准备 | 是 |\n| `你好,你能做什么?` | 普通 Agent 对话 | DeepSeek Key | 是 |\n| `/pilot status` | 显示模型与 token 用量 | 无 | 否 |\n| `/pilot clear` | 清除进程内短期记忆 | 无 | 否 |\n| `/pilot help` | 显示命令帮助 | 无 | 否 |\n\n配方物品建议使用完整资源 ID,例如 `minecraft:enchanting_table`。\n\n### 死亡建议\n\nDocker 模式从只读挂载的 `/minecraft/logs/latest.log` 读取新增内容;本地模式默认检查:\n\n```text\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n当日志存在、识别到本地玩家且 DeepSeek 已配置时:\n\n1. 解析简体中文或英文死亡消息;\n2. 忽略其他玩家并去重重复事件;\n3. 不调用 Wiki 或配方工具;\n4. 生成 2–5 句短建议;\n5. 通过 `/ws` 推送到网页并自动淡出。\n\n日志路径不能在当前网页里编辑。Docker 模式修改 `MC_PILOT_MINECRAFT_DIR`;本地模式可设置 `MC_PILOT_GAME_LOG_PATH`,然后重启应用。\n\n## 数据来源与确定性边界\n\n### 配方\n\n- 信任根:Mojang 官方版本清单与客户端 JAR SHA-1;\n- 当前构建目标:Java Edition 26.2 `release`;\n- 提取内容:配方 JSON、物品标签和必要语言资源;\n- 计算方式:代码递归遍历,含深度、循环与节点上限;\n- 镜像:可通过 `build_recipes.py --mirror <URL>` 显式提供失败回退源,最终仍必须通过官方 SHA-1。\n\n### Wiki\n\n- API:`https://zh.minecraft.wiki/api.php`;\n- 默认白名单:方块、物品、生物、群系、游戏规则、附魔、状态效果、结构与命令;\n- 排除基岩版、教育版、快照、开发版和版本记录等页面;\n- 检索结果包含来源 URL;当前 `/pilot wiki` 返回检索片段与来源,不额外调用 LLM 改写。\n\n## 开发者后台\n\n<http://127.0.0.1:8000/admin> 展示:\n\n- 系统版本与运行环境;\n- 游戏连接、玩家、日志和死亡次数;\n- 配方版本;\n- RAG、LLM 与 Agent 配置状态;\n- 经 `Settings.safe_summary()` 脱敏后的配置;\n- 健康检查与日志重连操作。\n\n后台仅允许 loopback Host。`rebuild-wiki` 接口目前返回 `not_implemented`,真实索引构建请使用 `scripts/build_wiki.py`。\n\n## API 摘要\n\n完整交互式文档见 <http://127.0.0.1:8000/docs>。\n\n| 方法 | 路径 | 用途 |\n|---|---|---|\n| GET | `/health/live` | 进程存活 |\n| GET | `/health/ready` | SQLite/Qdrant 就绪状态 |\n| POST | `/api/chat` | Agent 与 `/pilot` 命令入口 |\n| GET | `/api/agent-status` | 模型是否配置 |\n| GET | `/api/recipes/{item_id}` | 直接配方查询 |\n| POST | `/api/recipes/tree` | 数量与深度可配置的配方树 |\n| GET | `/api/game-state` | 当前游戏状态 |\n| WS | `/ws` | 状态心跳与死亡建议 |\n| GET | `/admin/api/*` | 本机开发诊断接口 |\n\n配方树示例:\n\n```bash\ncurl -X POST http://127.0.0.1:8000/api/recipes/tree \\\n -H 'Content-Type: application/json' \\\n -d '{\"item_id\":\"minecraft:diamond_sword\",\"quantity\":1,\"max_depth\":3}'\n```\n\n## Fabric Mod(第二阶段加分项)\n\n要求:\n\n- JDK 25;\n- Minecraft Java Edition 26.2;\n- 本地 Pilot 后端运行在 `127.0.0.1:8000`;\n- Gradle 9.5.1 由仓库 Wrapper 提供,无需安装主机 Gradle。\n\n构建:\n\n```bash\ncd fabric-mod\n./gradlew clean build\n```\n\n产物:\n\n```text\nfabric-mod/build/libs/pilot-mod-0.1.0.jar\n```\n\n将 JAR 放入对应 Fabric 客户端的 `mods/` 目录。Mod 只注册本地 `/pilot` 客户端命令、发送 HTTP 请求、接收 WebSocket 事件并渲染本地聊天消息;知识、配方和推理逻辑仍在 Python 后端。API Key 不进入 Mod。\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n\ncd fabric-mod\n./gradlew clean build\n```\n\n自动化测试覆盖配方解析与递归树、官方哈希、SQLite、Wiki 分块与检索、Agent 工具与预算、双语死亡解析、日志轮转/截断、API 降级、WebSocket 清理、Docker 挂载、后台访问控制及 secret 脱敏。\n\n## 项目结构\n\n```text\n.\n├── src/mc_pilot/\n│ ├── agent/ # DeepSeek 客户端、状态机、记忆与工具契约\n│ ├── api/ # HTTP 与 WebSocket 适配层\n│ ├── game/ # 日志发现、尾随、死亡解析与建议\n│ ├── rag/ # MediaWiki 采集、分块、嵌入、Qdrant 检索\n│ ├── recipes/ # 官方数据下载、提取、SQLite 与配方树\n│ ├── admin/ # 本机开发诊断 API\n│ ├── templates/ # Jinja2 页面\n│ └── static/ # 原生 JavaScript 与 CSS\n├── scripts/ # 配方、Wiki 与模型连通性脚本\n├── tests/ # 离线确定性测试\n├── fabric-mod/ # Fabric 26.2 客户端 Mod\n├── docs/ # 课程要求与实验报告\n├── compose.yaml\n├── Dockerfile\n└── pyproject.toml\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `DEEPSEEK_API_KEY` | 空 | 自然语言 Agent 和死亡建议所需 |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | OpenAI 兼容 API 根地址 |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 发送给兼容 API 的模型名,可覆盖 |\n| `MC_PILOT_HOST` | `127.0.0.1` | 本地运行绑定地址;Compose 内覆盖为 `0.0.0.0` |\n| `MC_PILOT_PORT` | `8000` | HTTP 端口 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite URL |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant URL;Compose 内覆盖为服务名 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | 健康探针超时 |\n| `MC_PILOT_GAME_LOG_PATH` | 空 | 本地运行时覆盖 `latest.log` 路径 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认目录 | Compose 只读挂载源;不是 Pydantic 应用配置 |\n\n## 故障排查\n\n### `ready` 显示 Qdrant degraded\n\n```bash\ndocker compose ps\ndocker compose logs qdrant\n```\n\n本地开发模式确认 `.env` 中 `MC_PILOT_QDRANT_URL=http://localhost:6333`。\n\n### 配方查询为空\n\n确认数据构建发生在当前运行模式:\n\n```bash\n# Docker 模式\ndocker compose exec app python scripts/build_recipes.py\n\n# 本地模式\n.venv/bin/python scripts/build_recipes.py\n```\n\n### Wiki 提示知识库尚未构建\n\n运行对应模式的 `build_wiki.py`。首次加载嵌入模型需要网络和较长时间;不要在中途删除 Qdrant volume。\n\n### Docker 无法读取 Minecraft 目录\n\n确认 `.env` 中路径真实存在,并在 Docker Desktop 中允许访问该 macOS 目录。容器内可检查:\n\n```bash\ndocker compose exec app test -r /minecraft/logs/latest.log\n```\n\n### Agent 请求失败\n\n```bash\ndocker compose exec app python scripts/test_connectivity.py\ndocker compose logs --tail=100 app\n```\n\n日志只应记录模型、耗时和脱敏后的用量,不应出现 API Key。\n\n## 已知限制\n\n- 本次验收仅覆盖 Java Edition 26.2 正式版,不承诺其他 26.x 版本;\n- 网页后台尚不能输入任意日志路径,也不能直接重建 Wiki;\n- 会话记忆保存在当前后端进程内,服务重启后清空;\n- Wiki 采用白名单分类,不等于抓取整个中文 Minecraft Wiki;\n- 未提供真实 DeepSeek Key 时,自动化测试不会证明线上模型账户与额度可用;\n- Fabric Mod 当前固定连接 `127.0.0.1:8000`。\n\n## 课程材料\n\n- [实验报告](docs/实验报告.md)\n- [实验报告提交及评分标准](docs/实验报告提交及评分标准.md)\n- [课程说明](docs/instruction.md)\n\n## License 与第三方内容\n\n仓库代码的许可证以项目实际发布文件为准。Minecraft、Mojang、Microsoft、中文 Minecraft Wiki、Fabric、DeepSeek、Qdrant 与所用模型分别受其自身条款约束;提交课程作业或公开部署前,请保留来源、许可和非官方声明。\n"}, "332c316fdd426e3fc42488a0a77cb7e7d2005156": {"t": 1785772058.3766537, "n": 11566, "h": "8bfa1e78219a168e", "c": "# Minecraft Pilot Agent\n\nMinecraft Pilot 是一个面向 Minecraft Java Edition 26.2 的本地游戏助手。结合中文 Wiki RAG、确定性配方树和游戏日志分析,通过网页聊天和 Fabric Mod 为玩家提供帮助。\n\n**非官方课程项目**,与 Mojang 或 Microsoft 无关。\n\n---\n\n## 目录\n\n- [QuickStart](#quickstart)\n- [功能概览](#功能概览)\n- [使用教程](#使用教程)\n- [技术栈](#技术栈)\n- [项目结构](#项目结构)\n- [环境变量](#环境变量)\n- [质量检查](#质量检查)\n- [API 文档](#api-文档)\n- [Fabric Mod](#fabric-mod-可选)\n- [数据构建](#数据构建)\n\n---\n\n## QuickStart\n\n从头开始,三步跑通。\n\n### 第一步:环境准备\n\n```bash\n# 1. 克隆仓库\ngit clone https://github.com/[用户名]/mc-pilot.git\ncd mc-pilot\n\n# 2. 创建虚拟环境并安装依赖\npython3 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\n\n# 3. 配置 API 密钥\ncp .env.example .env\n# 编辑 .env,将 DEEPSEEK_API_KEY= 后面填上你的 DeepSeek API 密钥\n# macOS 使用 Docker 时,将 MC_PILOT_MINECRAFT_DIR 改为当前用户的 Minecraft 目录\n# 获取密钥: https://platform.deepseek.com/api_keys\n```\n\n> **注意** 本项目使用 pip + .venv,**不使用 conda**。macOS / Linux 均可,Windows 需自行调整路径分隔符。\n\n### 第二步:启动服务\n\n```bash\n# 4. 启动 Qdrant 向量数据库(需要 Docker)\ndocker compose up -d qdrant\n\n# 5. 启动 Pilot 后端\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --reload --host 127.0.0.1 --port 8000\n```\n\n> 如果不想手动分步启动,也可以一条命令拉起全部服务:\n> ```bash\n> docker compose up --build\n> ```\n\n### 第三步:打开网页\n\n浏览器打开 http://127.0.0.1:8000\n\n你应该看到 **Minecraft Pilot** 主页面,聊天框里已有欢迎消息。此时页面右上角应显示绿色的\"就绪\"状态。\n\n**验证连接**:\n```bash\ncurl http://127.0.0.1:8000/health/ready\n# {\"status\":\"ready\",\"components\":[{\"name\":\"sqlite\",\"status\":\"ready\",...},{\"name\":\"qdrant\",\"status\":\"ready\",...}]}\n```\n\n---\n\n## 功能概览\n\n完成 QuickStart 后,你有四条核心使用路径:\n\n| 序号 | 能力 | 需要什么 | 如何使用 |\n|---|---|---|---|\n| 1 | Agent 对话 | DeepSeek API Key | 在网页输入框输入问题 |\n| 2 | 配方查询 | 先运行 `build_recipes` | `/pilot recipe <物品ID>` |\n| 3 | Wiki 问答 | 先运行 `build_wiki` | `/pilot wiki <关键词>` |\n| 4 | 死亡建议 | 启动 Minecraft 26.2 并打开日志监听 | 游戏中死亡时自动触发 |\n\n### 能力 1:Agent 智能对话\n\n当你配置了 `DEEPSEEK_API_KEY`,Agent 立即可用。无需额外数据。\n\n```\n在网页输入框中输入:\n/pilot 如何合成附魔台?\n```\n\nAgent 会自动调用 `wiki_search` 查询知识库,或调用 `recipe_query` 查询配方,然后用中文回复。\n\n**首次验证**:先运行连通性测试确认模型可访问:\n```bash\n.venv/bin/python scripts/test_connectivity.py\n# 预期输出:Connectivity OK model=deepseek-v4-flash latency_ms=850\n```\n\n### 能力 2:确定性配方查询\n\n需要先构建本地配方数据库(需要网络,约 100MB 下载):\n\n```bash\n# 从 Mojang CDN 下载 Java 26.2 客户端 JAR,提取配方到 SQLite\n.venv/bin/python scripts/build_recipes.py\n```\n\n然后在网页中输入:\n```\n/pilot recipe minecraft:enchanting_table\n```\n\nAgent 会返回附魔台所需的全部材料:黑曜石 ×4、钻石 ×2、书 ×1。配方树是完全确定性计算的,不依赖模型生成。\n\n### 能力 3:Wiki 知识问答\n\n需要先构建 Wiki 索引(需要网络,首次约 5-10 分钟,需要约 2GB 模型下载):\n\n```bash\n# 从中文 Minecraft Wiki API 采集知识,嵌入到 Qdrant\n.venv/bin/python scripts/build_wiki.py\n```\n\n然后在网页中输入:\n```\n/pilot wiki 凋零骷髅在哪生成?\n```\n\nAgent 从 Qdrant 检索相关 Wiki 片段,整合后返回带来源 URL 的回答。\n\n### 能力 4:死亡建议(自动触发)\n\n这是**自动触发**的能力,无需手动调用。\n\n1. 确认后端正在运行\n2. 启动 **Minecraft Java Edition 26.2**(单人生存模式)\n3. 在网页上,你应看到右上角状态从\"未连接游戏\"变为\"玩家名 · 26.2\"\n4. 当玩家角色在游戏中死亡时,网页会弹出红色气泡,显示 2-5 句生存建议\n\n如果未能自动检测到游戏日志,在网页开发后台手动指定日志路径:\nhttp://127.0.0.1:8000/admin → 重连日志\n\n---\n\n## 使用教程\n\n### 网页聊天(主界面)\n\n打开 http://127.0.0.1:8000\n\n```\n┌─────────────────────────────────────────┐\n│ Minecraft Pilot │\n│ Java Edition 26.2 │\n├─────────────────────────────────────────┤\n│ Pilot 对话 [玩家 · 26.2] [就绪] │\n│ │\n│ ┌─ Pilot 已就位 ─────────────────────┐ │\n│ │ │ │\n│ │ (对话历史) │ │\n│ │ │ │\n│ └────────────────────────────────────┘ │\n│ │\n│ 消息: [________________] [发送] │\n├─────────────────────────────────────────┤\n│ 配方树 (点 /pilot recipe 自动展示) │\n└─────────────────────────────────────────┘\n```\n\n**可用指令**:\n\n| 输入 | 效果 | 是否消耗 LLM |\n|---|---|---|\n| `/pilot 如何做附魔台` | Agent 自动路由 → wiki_search + recipe_query | 是 |\n| `/pilot wiki 末地传送门` | 直接 wiki_search,返回带来源的回答 | 否(子命令直连) |\n| `/pilot recipe minecraft:bow` | 直接 recipe_query,返回配方树 | 否(子命令直连) |\n| `/pilot status` | 显示模型名、token 用量 | 否 |\n| `/pilot clear` | 清除 6 轮会话记忆 | 否 |\n| `/pilot help` | 显示帮助 | 否 |\n| `你好,你能做什么?` | Agent 对话(自然语言) | 是 |\n\n### 开发者后台\n\n打开 http://127.0.0.1:8000/admin\n\n展示 7 个面板:系统状态、游戏连接、配方数据、RAG/Qdrant、LLM/Agent、安全配置(脱敏)、诊断操作。\n\n**安全限制**:仅允许本机访问。从其他 IP 访问返回 403。\n\n### 游戏日志监听\n\n后端启动后,自动尝试检测 macOS 下 Minecraft 日志路径:\n\n```\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n如果日志存在且 Minecraft 正在运行:\n- 页面显示绿色的\"玩家名 · 26.2\"\n- 死亡事件被解析,生成建议,通过 WebSocket 推送到网页\n\n**手动指定日志路径**(如果自动检测失败):\n1. 打开 http://127.0.0.1:8000/admin\n2. 点击\"重连日志\"\n3. 或直接通过 API:`POST /admin/api/reconnect-log`\n\n---\n\n## 技术栈\n\n| 层 | 选型 |\n|---|---|\n| 语言 | Python 3.12 + Java 25 (Mod) |\n| Web 框架 | FastAPI + Jinja2 + 原生 JavaScript(零 Node 构建) |\n| 数据模型 | Pydantic + SQLAlchemy 2.x |\n| 向量库 | Qdrant 1.15 (Docker) |\n| LLM | DeepSeek v4-flash (OpenAI 兼容 API) |\n| Embedding | BAAI/bge-small-zh-v1.5 (sentence-transformers, 本地运行) |\n| 传输协议 | HTTP (REST) + WebSocket (实时推送) |\n| 容器 | Docker Compose |\n| Mod 框架 | Fabric (Minecraft) |\n\n---\n\n## 项目结构\n\n```\n.\n├── src/mc_pilot/\n│ ├── app.py # FastAPI 工厂\n│ ├── config.py # Pydantic 配置(环境变量→Settings)\n│ ├── errors.py # 领域异常 AppError\n│ ├── logging_config.py # JSON 结构化日志\n│ ├── api/ # HTTP/WebSocket 路由层\n│ │ ├── chat.py # POST /api/chat\n│ │ ├── recipes.py # GET/POST /api/recipes\n│ │ ├── game_state.py # GET /api/game-state, WS /ws\n│ │ ├── health.py # /health/live, /health/ready\n│ │ ├── pages.py # 页面路由 (/ 和 /admin)\n│ │ └── models.py # 共享 API 响应模型\n│ ├── admin/\n│ │ └── routes.py # /admin/api/* (loopback-only)\n│ ├── agent/ # DeepSeek Agent 核心\n│ │ ├── client.py # DeepSeek OpenAI 兼容客户端\n│ │ ├── loop.py # Agent 状态机\n│ │ ├── memory.py # 6 轮会话记忆 + token 预算\n│ │ ├── models.py # Agent 领域模型\n│ │ ├── tools.py # 3 个 MCP 风格工具契约\n│ │ └── service.py # Agent 服务(/pilot 路由)\n│ ├── game/ # 游戏日志\n│ │ ├── detector.py # macOS 日志/进程检测\n│ │ ├── tailer.py # 日志尾随(轮转/截断恢复)\n│ │ ├── death_parser.py # zh_cn/en_us 双语死亡解析(~60 条规则)\n│ │ ├── listener.py # 日志监听循环 + 死亡建议生成\n│ │ ├── models.py # 游戏状态模型\n│ │ └── service.py # 游戏服务\n│ ├── rag/ # Wiki RAG 管线\n│ │ ├── client.py # MediaWiki API 客户端(分页、缓存、限速)\n│ │ ├── chunker.py # 文本清洗 + 段落级切块\n│ │ ├── embedder.py # BAAI/bge-small-zh-v1.5 嵌入适配器\n│ │ ├── indexer.py # Qdrant staging→live 原子交换\n│ │ ├── retriever.py # 密集检索 + 标题精确加权\n│ │ ├── models.py # RAG 领域模型\n│ │ └── service.py # RAG 服务\n│ ├── recipes/ # 官方配方管线\n│ │ ├── downloader.py # Mojang 清单 + JAR 下载 + SHA-1 校验\n│ │ ├── extractor.py # JAR 配方/tag/本地化提取\n│ │ ├── tree.py # 确定性 N 层配方树算法\n│ │ ├── store.py # SQLite 持久化\n│ │ ├── models.py # 配方领域模型\n│ │ └── service.py # 配方服务\n│ ├── storage/ # 持久化适配\n│ │ ├── qdrant.py # Qdrant 健康探针\n│ │ └── sqlite.py # SQLite 引擎\n│ ├── templates/ # Jinja2 模板\n│ │ ├── base.html # 基础布局(导航 + 动态脚本区)\n│ │ ├── index.html # 主聊天页\n│ │ └── admin.html # 开发者后台\n│ └── static/ # 静态资源\n│ ├── css/app.css # 全局样式\n│ └── js/\n│ ├── chat.js # 聊天 UI + WebSocket\n│ └── admin.js # 后台仪表盘\n├── fabric-mod/ # Fabric 26.2 客户端 Mod(可选加分项)\n│ ├── build.gradle\n│ ├── src/main/java/mc/pilot/mod/\n│ │ ├── PilotMod.java # Mod 入口\n│ │ ├── PilotClient.java # HTTP/WebSocket 客户端\n│ │ ├── PilotCommandHandler.java # /pilot 路由\n│ │ └── ChatRenderer.java # 本地聊天渲染\n│ └── src/main/resources/fabric.mod.json\n├── scripts/ # 运维脚本\n│ ├── build_recipes.py # 构建配方数据库\n│ ├── build_wiki.py # 构建 Wiki 索引\n│ └── test_connectivity.py # DeepSeek 连通性测试\n├── tests/ # 自动化测试 (108 个)\n├── docs/ # 课程文档\n│ ├── 实验报告.md # 完整实验报告\n│ ├── instruction.md\n│ └── 实验报告提交及评分标准.md\n├── compose.yaml # Docker Compose\n├── Dockerfile # App 镜像\n├── pyproject.toml # Python 项目元数据\n└── .env.example # 环境变量模板\n```\n\n---\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `MC_PILOT_HOST` | `127.0.0.1` | 服务绑定地址 |\n| `MC_PILOT_PORT` | `8000` | 服务端口 |\n| `MC_PILOT_LOG_LEVEL` | `INFO` | 日志级别 (DEBUG/INFO/WARNING/ERROR) |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite 数据库路径 |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant 服务地址 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | Qdrant 连接超时 |\n| `MC_PILOT_MINECRAFT_DIR` | macOS 默认游戏目录 | Docker 只读挂载的宿主机 Minecraft 目录 |\n| `MC_PILOT_GAME_LOG_PATH` | 自动检测 | 原生运行时可覆盖的 `latest.log` 路径 |\n| `DEEPSEEK_API_KEY` | — | DeepSeek API 密钥 (**必需**) |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | API 基础 URL |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 模型标识符 |\n\n**获取 API 密钥**:https://platform.deepseek.com/api_keys\n\n复制 `.env.example` → `.env`,填入 `DEEPSEEK_API_KEY=` 后面的值。\nDocker Compose 会将 `MC_PILOT_MINECRAFT_DIR` 只读挂载到容器。目录或\n`logs/latest.log` 暂不存在时,日志分析保持未连接,聊天、Wiki 和配方仍可使用。\n\n---\n\n## 质量检查\n\n```bash\n# 代码风格(0 errors)\n.venv/bin/ruff check .\n\n# 类型检查(0 errors)\n.venv/bin/mypy src tests\n\n# 自动化测试(108 passed)\n.venv/bin/pytest -q\n\n# Docker 配置语法验证\ndocker compose config --quiet\n```\n\n测试覆盖范围:\n- 配方解析 (shaped/shapeless/smelting/stonecutting)\n- 配方树算法 (递归/循环检测/标签展开/叶子汇总)\n- SHA-1 哈希校验\n- 中英文死亡解析 (~60 条规则)\n- 日志尾随 (轮转/截断恢复)\n- SQLite 存储 CRUD\n- 工具白名单安全\n- Token 预算管理\n- 密钥脱敏\n- API 路由冒烟测试\n- Docker Compose 配置验证\n\n---\n\n## API 文档\n\n### 健康检查\n\n```\nGET /health/live → {\"status\":\"alive\",\"version\":\"0.1.0\"}\nGET /health/ready → {\"status\":\"ready\",\"components\":[...]}\n```\n\n### Agent 对话\n\n```\nPOST /api/chat\nContent-Type: application/json\n{\"message\": \"/pilot 如何合成附魔台?\"}\n\nResponse:\n{\n \"state\": \"answered\",\n \"answer\": \"附魔台需要...\",\n \"stop_reason\": null\n}\n```\n\n### 配方查询\n\n```\nGET /api/recipes/minecraft:enchanting_table\nPOST /api/recipes/tree {\"item_id\": \"minecraft:diamond_sword\", \"quantity\": 1, \"max_depth\": null}\n```\n\n### 游戏状态\n\n```\nGET /api/game-state → {\"state\":\"connected\",\"player_name\":\"Steve\",\"version_id\":\"26.2\"}\nWS /ws → {\"type\":\"death_advice\",\"advice\":\"...\"} | {\"type\":\"state\",...}\n```\n\n### 管理后台 API(仅 loopback)\n\n```\nGET /admin/api/status # 系统状态\nGET /admin/api/game # 游戏连接\nGET /admin/api/recipes # 配方数据状态\nGET /admin/api/rag # RAG/Qdrant 状态\nGET /admin/api/llm # LLM/Agent 状态\nGET /admin/api/config # 配置(脱敏)\nPOST /admin/api/reconnect-log # 重连游戏日志\nPOST /admin/api/rebuild-wiki # 重建 Wiki 索引\n```\n\n---\n\n## Fabric Mod(可选)\n\n**目标**:在游戏内通过 `/pilot` 指令使用 Agent,所有消息仅本地可见(不会发送到多人服务器)。\n\n```bash\ncd fabric-mod\ngradle build\n# 输出:build/libs/pilot-mod-0.1.0.jar → 放入 .minecraft/mods/\n```\n\n游戏中:\n```\n/pilot 如何获得下界合金锭? → Agent 回答(本地聊天 HUD)\n/pilot wiki 末影龙 → 直接 wiki 搜索\n/pilot recipe diamond_sword → 直接配方查询\n/pilot status → 连接状态\n```\n\n**构建需求**:JDK 25 + Gradle 9.6+。详见 `fabric-mod/BUILDING.md`。\n\n---\n\n## 数据构建\n\n以下脚本需要网络连接,首次运行需下载依赖数据。\n\n```bash\n# DeepSeek 连通性测试(验证 API Key 可用)\n.venv/bin/python scripts/test_connectivity.py\n\n# 构建配方数据库(从 Mojang 下载 26.2 JAR,提取配方 → SQLite)\n.venv/bin/python scripts/build_recipes.py\n\n# 构建 Wiki 索引(从中文 Wiki API 采集,嵌入 → Qdrant)\n.venv/bin/python scripts/build_wiki.py\n```\n\n**注意事项**:\n- `build_recipes.py` 需要 ~100MB 下载,SHA-1 校验确保文件正确\n- `build_wiki.py` 首次运行需下载 BGE 模型(~400MB),抓取 Wiki 页面约 5-10 分钟\n- 配方和 Wiki 数据是独立的,可以先构建其中一个\n- 即使没有构建数据,Agent 对话功能仍可用(模型依赖自身知识回答)\n"}, "9c360ca05d63ad5a6499c4d6f8f36c50b33044b6": {"t": 1785772059.6213372, "n": 11255, "h": "e92cfe19cc38800e", "c": "# Minecraft Pilot Agent\n\nMinecraft Pilot 是一个面向 Minecraft Java Edition 26.2 的本地游戏助手。结合中文 Wiki RAG、确定性配方树和游戏日志分析,通过网页聊天和 Fabric Mod 为玩家提供帮助。\n\n**非官方课程项目**,与 Mojang 或 Microsoft 无关。\n\n---\n\n## 目录\n\n- [QuickStart](#quickstart)\n- [功能概览](#功能概览)\n- [使用教程](#使用教程)\n- [技术栈](#技术栈)\n- [项目结构](#项目结构)\n- [环境变量](#环境变量)\n- [质量检查](#质量检查)\n- [API 文档](#api-文档)\n- [Fabric Mod](#fabric-mod-可选)\n- [数据构建](#数据构建)\n\n---\n\n## QuickStart\n\n从头开始,三步跑通。\n\n### 第一步:环境准备\n\n```bash\n# 1. 克隆仓库\ngit clone https://github.com/[用户名]/mc-pilot.git\ncd mc-pilot\n\n# 2. 创建虚拟环境并安装依赖\npython3 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\n\n# 3. 配置 API 密钥\ncp .env.example .env\n# 编辑 .env,将 DEEPSEEK_API_KEY= 后面填上你的 DeepSeek API 密钥\n# 获取密钥: https://platform.deepseek.com/api_keys\n```\n\n> **注意** 本项目使用 pip + .venv,**不使用 conda**。macOS / Linux 均可,Windows 需自行调整路径分隔符。\n\n### 第二步:启动服务\n\n```bash\n# 4. 启动 Qdrant 向量数据库(需要 Docker)\ndocker compose up -d qdrant\n\n# 5. 启动 Pilot 后端\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --reload --host 127.0.0.1 --port 8000\n```\n\n> 如果不想手动分步启动,也可以一条命令拉起全部服务:\n> ```bash\n> docker compose up --build\n> ```\n\n### 第三步:打开网页\n\n浏览器打开 http://127.0.0.1:8000\n\n你应该看到 **Minecraft Pilot** 主页面,聊天框里已有欢迎消息。此时页面右上角应显示绿色的\"就绪\"状态。\n\n**验证连接**:\n```bash\ncurl http://127.0.0.1:8000/health/ready\n# {\"status\":\"ready\",\"components\":[{\"name\":\"sqlite\",\"status\":\"ready\",...},{\"name\":\"qdrant\",\"status\":\"ready\",...}]}\n```\n\n---\n\n## 功能概览\n\n完成 QuickStart 后,你有四条核心使用路径:\n\n| 序号 | 能力 | 需要什么 | 如何使用 |\n|---|---|---|---|\n| 1 | Agent 对话 | DeepSeek API Key | 在网页输入框输入问题 |\n| 2 | 配方查询 | 先运行 `build_recipes` | `/pilot recipe <物品ID>` |\n| 3 | Wiki 问答 | 先运行 `build_wiki` | `/pilot wiki <关键词>` |\n| 4 | 死亡建议 | 启动 Minecraft 26.2 并打开日志监听 | 游戏中死亡时自动触发 |\n\n### 能力 1:Agent 智能对话\n\n当你配置了 `DEEPSEEK_API_KEY`,Agent 立即可用。无需额外数据。\n\n```\n在网页输入框中输入:\n/pilot 如何合成附魔台?\n```\n\nAgent 会自动调用 `wiki_search` 查询知识库,或调用 `recipe_query` 查询配方,然后用中文回复。\n\n**首次验证**:先运行连通性测试确认模型可访问:\n```bash\n.venv/bin/python scripts/test_connectivity.py\n# 预期输出:Connectivity OK model=deepseek-v4-flash latency_ms=850\n```\n\n### 能力 2:确定性配方查询\n\n需要先构建本地配方数据库(需要网络,约 100MB 下载):\n\n```bash\n# 从 Mojang CDN 下载 Java 26.2 客户端 JAR,提取配方到 SQLite\n.venv/bin/python scripts/build_recipes.py\n```\n\n然后在网页中输入:\n```\n/pilot recipe minecraft:enchanting_table\n```\n\nAgent 会返回附魔台所需的全部材料:黑曜石 ×4、钻石 ×2、书 ×1。配方树是完全确定性计算的,不依赖模型生成。\n\n### 能力 3:Wiki 知识问答\n\n需要先构建 Wiki 索引(需要网络,首次约 5-10 分钟,需要约 2GB 模型下载):\n\n```bash\n# 从中文 Minecraft Wiki API 采集知识,嵌入到 Qdrant\n.venv/bin/python scripts/build_wiki.py\n```\n\n然后在网页中输入:\n```\n/pilot wiki 凋零骷髅在哪生成?\n```\n\nAgent 从 Qdrant 检索相关 Wiki 片段,整合后返回带来源 URL 的回答。\n\n### 能力 4:死亡建议(自动触发)\n\n这是**自动触发**的能力,无需手动调用。\n\n1. 确认后端正在运行\n2. 启动 **Minecraft Java Edition 26.2**(单人生存模式)\n3. 在网页上,你应看到右上角状态从\"未连接游戏\"变为\"玩家名 · 26.2\"\n4. 当玩家角色在游戏中死亡时,网页会弹出红色气泡,显示 2-5 句生存建议\n\n如果未能自动检测到游戏日志,在网页开发后台手动指定日志路径:\nhttp://127.0.0.1:8000/admin → 重连日志\n\n---\n\n## 使用教程\n\n### 网页聊天(主界面)\n\n打开 http://127.0.0.1:8000\n\n```\n┌─────────────────────────────────────────┐\n│ Minecraft Pilot │\n│ Java Edition 26.2 │\n├─────────────────────────────────────────┤\n│ Pilot 对话 [玩家 · 26.2] [就绪] │\n│ │\n│ ┌─ Pilot 已就位 ─────────────────────┐ │\n│ │ │ │\n│ │ (对话历史) │ │\n│ │ │ │\n│ └────────────────────────────────────┘ │\n│ │\n│ 消息: [________________] [发送] │\n├─────────────────────────────────────────┤\n│ 配方树 (点 /pilot recipe 自动展示) │\n└─────────────────────────────────────────┘\n```\n\n**可用指令**:\n\n| 输入 | 效果 | 是否消耗 LLM |\n|---|---|---|\n| `/pilot 如何做附魔台` | Agent 自动路由 → wiki_search + recipe_query | 是 |\n| `/pilot wiki 末地传送门` | 直接 wiki_search,返回带来源的回答 | 否(子命令直连) |\n| `/pilot recipe minecraft:bow` | 直接 recipe_query,返回配方树 | 否(子命令直连) |\n| `/pilot status` | 显示模型名、token 用量 | 否 |\n| `/pilot clear` | 清除 6 轮会话记忆 | 否 |\n| `/pilot help` | 显示帮助 | 否 |\n| `你好,你能做什么?` | Agent 对话(自然语言) | 是 |\n\n### 开发者后台\n\n打开 http://127.0.0.1:8000/admin\n\n展示 7 个面板:系统状态、游戏连接、配方数据、RAG/Qdrant、LLM/Agent、安全配置(脱敏)、诊断操作。\n\n**安全限制**:仅允许本机访问。从其他 IP 访问返回 403。\n\n### 游戏日志监听\n\n后端启动后,自动尝试检测 macOS 下 Minecraft 日志路径:\n\n```\n~/Library/Application Support/minecraft/logs/latest.log\n```\n\n如果日志存在且 Minecraft 正在运行:\n- 页面显示绿色的\"玩家名 · 26.2\"\n- 死亡事件被解析,生成建议,通过 WebSocket 推送到网页\n\n**手动指定日志路径**(如果自动检测失败):\n1. 打开 http://127.0.0.1:8000/admin\n2. 点击\"重连日志\"\n3. 或直接通过 API:`POST /admin/api/reconnect-log`\n\n---\n\n## 技术栈\n\n| 层 | 选型 |\n|---|---|\n| 语言 | Python 3.12 + Java 25 (Mod) |\n| Web 框架 | FastAPI + Jinja2 + 原生 JavaScript(零 Node 构建) |\n| 数据模型 | Pydantic + SQLAlchemy 2.x |\n| 向量库 | Qdrant 1.15 (Docker) |\n| LLM | DeepSeek v4-flash (OpenAI 兼容 API) |\n| Embedding | BAAI/bge-small-zh-v1.5 (sentence-transformers, 本地运行) |\n| 传输协议 | HTTP (REST) + WebSocket (实时推送) |\n| 容器 | Docker Compose |\n| Mod 框架 | Fabric (Minecraft) |\n\n---\n\n## 项目结构\n\n```\n.\n├── src/mc_pilot/\n│ ├── app.py # FastAPI 工厂\n│ ├── config.py # Pydantic 配置(环境变量→Settings)\n│ ├── errors.py # 领域异常 AppError\n│ ├── logging_config.py # JSON 结构化日志\n│ ├── api/ # HTTP/WebSocket 路由层\n│ │ ├── chat.py # POST /api/chat\n│ │ ├── recipes.py # GET/POST /api/recipes\n│ │ ├── game_state.py # GET /api/game-state, WS /ws\n│ │ ├── health.py # /health/live, /health/ready\n│ │ ├── pages.py # 页面路由 (/ 和 /admin)\n│ │ └── models.py # 共享 API 响应模型\n│ ├── admin/\n│ │ └── routes.py # /admin/api/* (loopback-only)\n│ ├── agent/ # DeepSeek Agent 核心\n│ │ ├── client.py # DeepSeek OpenAI 兼容客户端\n│ │ ├── loop.py # Agent 状态机\n│ │ ├── memory.py # 6 轮会话记忆 + token 预算\n│ │ ├── models.py # Agent 领域模型\n│ │ ├── tools.py # 3 个 MCP 风格工具契约\n│ │ └── service.py # Agent 服务(/pilot 路由)\n│ ├── game/ # 游戏日志\n│ │ ├── detector.py # macOS 日志/进程检测\n│ │ ├── tailer.py # 日志尾随(轮转/截断恢复)\n│ │ ├── death_parser.py # zh_cn/en_us 双语死亡解析(~60 条规则)\n│ │ ├── listener.py # 日志监听循环 + 死亡建议生成\n│ │ ├── models.py # 游戏状态模型\n│ │ └── service.py # 游戏服务\n│ ├── rag/ # Wiki RAG 管线\n│ │ ├── client.py # MediaWiki API 客户端(分页、缓存、限速)\n│ │ ├── chunker.py # 文本清洗 + 段落级切块\n│ │ ├── embedder.py # BAAI/bge-small-zh-v1.5 嵌入适配器\n│ │ ├── indexer.py # Qdrant staging→live 原子交换\n│ │ ├── retriever.py # 密集检索 + 标题精确加权\n│ │ ├── models.py # RAG 领域模型\n│ │ └── service.py # RAG 服务\n│ ├── recipes/ # 官方配方管线\n│ │ ├── downloader.py # Mojang 清单 + JAR 下载 + SHA-1 校验\n│ │ ├── extractor.py # JAR 配方/tag/本地化提取\n│ │ ├── tree.py # 确定性 N 层配方树算法\n│ │ ├── store.py # SQLite 持久化\n│ │ ├── models.py # 配方领域模型\n│ │ └── service.py # 配方服务\n│ ├── storage/ # 持久化适配\n│ │ ├── qdrant.py # Qdrant 健康探针\n│ │ └── sqlite.py # SQLite 引擎\n│ ├── templates/ # Jinja2 模板\n│ │ ├── base.html # 基础布局(导航 + 动态脚本区)\n│ │ ├── index.html # 主聊天页\n│ │ └── admin.html # 开发者后台\n│ └── static/ # 静态资源\n│ ├── css/app.css # 全局样式\n│ └── js/\n│ ├── chat.js # 聊天 UI + WebSocket\n│ └── admin.js # 后台仪表盘\n├── fabric-mod/ # Fabric 26.2 客户端 Mod(可选加分项)\n│ ├── build.gradle\n│ ├── src/main/java/mc/pilot/mod/\n│ │ ├── PilotMod.java # Mod 入口\n│ │ ├── PilotClient.java # HTTP/WebSocket 客户端\n│ │ ├── PilotCommandHandler.java # /pilot 路由\n│ │ └── ChatRenderer.java # 本地聊天渲染\n│ └── src/main/resources/fabric.mod.json\n├── scripts/ # 运维脚本\n│ ├── build_recipes.py # 构建配方数据库\n│ ├── build_wiki.py # 构建 Wiki 索引\n│ └── test_connectivity.py # DeepSeek 连通性测试\n├── tests/ # 自动化测试 (108 个)\n├── docs/ # 课程文档\n│ ├── 实验报告.md # 完整实验报告\n│ ├── instruction.md\n│ └── 实验报告提交及评分标准.md\n├── compose.yaml # Docker Compose\n├── Dockerfile # App 镜像\n├── pyproject.toml # Python 项目元数据\n└── .env.example # 环境变量模板\n```\n\n---\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `MC_PILOT_HOST` | `127.0.0.1` | 服务绑定地址 |\n| `MC_PILOT_PORT` | `8000` | 服务端口 |\n| `MC_PILOT_LOG_LEVEL` | `INFO` | 日志级别 (DEBUG/INFO/WARNING/ERROR) |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite 数据库路径 |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant 服务地址 |\n| `MC_PILOT_QDRANT_TIMEOUT_SECONDS` | `2` | Qdrant 连接超时 |\n| `DEEPSEEK_API_KEY` | — | DeepSeek API 密钥 (**必需**) |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | API 基础 URL |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 模型标识符 |\n\n**获取 API 密钥**:https://platform.deepseek.com/api_keys\n\n复制 `.env.example` → `.env`,填入 `DEEPSEEK_API_KEY=` 后面的值。\n\n---\n\n## 质量检查\n\n```bash\n# 代码风格(0 errors)\n.venv/bin/ruff check .\n\n# 类型检查(0 errors)\n.venv/bin/mypy src tests\n\n# 自动化测试(108 passed)\n.venv/bin/pytest -q\n\n# Docker 配置语法验证\ndocker compose config --quiet\n```\n\n测试覆盖范围:\n- 配方解析 (shaped/shapeless/smelting/stonecutting)\n- 配方树算法 (递归/循环检测/标签展开/叶子汇总)\n- SHA-1 哈希校验\n- 中英文死亡解析 (~60 条规则)\n- 日志尾随 (轮转/截断恢复)\n- SQLite 存储 CRUD\n- 工具白名单安全\n- Token 预算管理\n- 密钥脱敏\n- API 路由冒烟测试\n- Docker Compose 配置验证\n\n---\n\n## API 文档\n\n### 健康检查\n\n```\nGET /health/live → {\"status\":\"alive\",\"version\":\"0.1.0\"}\nGET /health/ready → {\"status\":\"ready\",\"components\":[...]}\n```\n\n### Agent 对话\n\n```\nPOST /api/chat\nContent-Type: application/json\n{\"message\": \"/pilot 如何合成附魔台?\"}\n\nResponse:\n{\n \"state\": \"answered\",\n \"answer\": \"附魔台需要...\",\n \"stop_reason\": null\n}\n```\n\n### 配方查询\n\n```\nGET /api/recipes/minecraft:enchanting_table\nPOST /api/recipes/tree {\"item_id\": \"minecraft:diamond_sword\", \"quantity\": 1, \"max_depth\": null}\n```\n\n### 游戏状态\n\n```\nGET /api/game-state → {\"state\":\"connected\",\"player_name\":\"Steve\",\"version_id\":\"26.2\"}\nWS /ws → {\"type\":\"death_advice\",\"advice\":\"...\"} | {\"type\":\"state\",...}\n```\n\n### 管理后台 API(仅 loopback)\n\n```\nGET /admin/api/status # 系统状态\nGET /admin/api/game # 游戏连接\nGET /admin/api/recipes # 配方数据状态\nGET /admin/api/rag # RAG/Qdrant 状态\nGET /admin/api/llm # LLM/Agent 状态\nGET /admin/api/config # 配置(脱敏)\nPOST /admin/api/reconnect-log # 重连游戏日志\nPOST /admin/api/rebuild-wiki # 重建 Wiki 索引\n```\n\n---\n\n## Fabric Mod(可选)\n\n**目标**:在游戏内通过 `/pilot` 指令使用 Agent,所有消息仅本地可见(不会发送到多人服务器)。\n\n```bash\ncd fabric-mod\ngradle build\n# 输出:build/libs/pilot-mod-0.1.0.jar → 放入 .minecraft/mods/\n```\n\n游戏中:\n```\n/pilot 如何获得下界合金锭? → Agent 回答(本地聊天 HUD)\n/pilot wiki 末影龙 → 直接 wiki 搜索\n/pilot recipe diamond_sword → 直接配方查询\n/pilot status → 连接状态\n```\n\n**构建需求**:JDK 25 + Gradle 9.6+。详见 `fabric-mod/BUILDING.md`。\n\n---\n\n## 数据构建\n\n以下脚本需要网络连接,首次运行需下载依赖数据。\n\n```bash\n# DeepSeek 连通性测试(验证 API Key 可用)\n.venv/bin/python scripts/test_connectivity.py\n\n# 构建配方数据库(从 Mojang 下载 26.2 JAR,提取配方 → SQLite)\n.venv/bin/python scripts/build_recipes.py\n\n# 构建 Wiki 索引(从中文 Wiki API 采集,嵌入 → Qdrant)\n.venv/bin/python scripts/build_wiki.py\n```\n\n**注意事项**:\n- `build_recipes.py` 需要 ~100MB 下载,SHA-1 校验确保文件正确\n- `build_wiki.py` 首次运行需下载 BGE 模型(~400MB),抓取 Wiki 页面约 5-10 分钟\n- 配方和 Wiki 数据是独立的,可以先构建其中一个\n- 即使没有构建数据,Agent 对话功能仍可用(模型依赖自身知识回答)\n"}, "feccd42a4b557424af9ea7ac7ebe16e1048d623a": {"t": 1785772061.8272557, "n": 4482, "h": "d79792f1899de113", "c": "# Minecraft Pilot Agent\n\nMinecraft Pilot 是一个面向 Minecraft Java Edition 26.2 的本地游戏助手。网页 MVP 结合了中文 Wiki RAG、确定性配方树和本地玩家死亡建议。轻量 Fabric 客户端 Mod 作为可选阶段二。\n\n这是非官方的课程项目,与 Mojang 或 Microsoft 无关。\n\n## 功能概览\n\n- Wiki RAG: 从中文 Minecraft Wiki 采集知识、嵌入 BGE-small-zh-v1.5、Qdrant 向量检索、带来源引用和未验证补充分区\n- 配方树: 从 Mojang 官方 26.2 版本提取配方、SHA-1 验证、确定性 N 层材料树、多配方候选和标签材料处理\n- DeepSeek Agent: 工具调用(wiki_search / recipe_query / recipe_direct)、状态机(received→deciding→tool_running→observing→answered/stopped/failed)、短会话记忆、token 预算\n- 游戏日志: macOS 日志监听、zh_cn/en_us 双语死亡解析、去重、唯一 DeepSeek 死亡建议、WebSocket 推送\n- 网页聊天: FastAPI + Jinja2 + 原生 JavaScript、/pilot 指令路由、WebSocket 游戏状态、死亡气泡淡出\n- 开发者后台: /admin 仪表盘、系统/游戏/RAG/配方/LLM 状态、诊断操作、仅 loopback 访问\n\n## 技术栈\n\n| 层 | 技术 |\n|---|---|\n| 后端 | Python 3.12, FastAPI, Pydantic, SQLAlchemy 2.x |\n| 向量库 | Qdrant (Docker) |\n| LLM | DeepSeek (OpenAI 兼容 API) |\n| Embedding | BAAI/bge-small-zh-v1.5 (sentence-transformers) |\n| 网页 | Jinja2, 原生 JavaScript, 零 Node 构建 |\n| 容器 | Docker Compose (Qdrant + App) |\n\n## 快速开始\n\nPython 3.12 必需。本项目使用 pip + .venv,不使用 conda。\n\n```bash\n# 环境初始化\npython3 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\n# 编辑 .env 填入 DEEPSEEK_API_KEY\n```\n\n```bash\n# 启动 Qdrant (Docker)\ndocker compose up -d qdrant\n\n# 启动开发服务器\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --reload\n\n# 启动完整 Docker 服务\ndocker compose up --build\n```\n\n打开 http://127.0.0.1:8000/ 和 http://127.0.0.1:8000/admin。\n\n## 数据构建\n\n```bash\n# 构建配方数据库 (从 Mojang CDN 下载 26.2 JAR)\n.venv/bin/python scripts/build_recipes.py\n\n# 构建 Wiki 知识库 (从中文 Wiki API 采集)\n.venv/bin/python scripts/build_wiki.py\n\n# DeepSeek 连通性测试\n.venv/bin/python scripts/test_connectivity.py\n```\n\n## 质量检查\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n```\n\n## 项目结构\n\n```\nsrc/mc_pilot/\n├── app.py # FastAPI 工厂\n├── config.py # Pydantic 配置\n├── errors.py # 领域异常\n├── logging_config.py # JSON 结构日志\n├── api/ # HTTP/WebSocket 适配\n│ ├── chat.py # /api/chat (Agent 对话)\n│ ├── recipes.py # /api/recipes (配方查询)\n│ ├── game_state.py # /api/game-state, /ws (游戏状态)\n│ ├── health.py # /health/live, /health/ready\n│ ├── pages.py # 页面路由\n│ └── models.py # 共享 API 模型\n├── admin/ # 开发者后台\n│ └── routes.py # /admin/api/* (loopback-only)\n├── agent/ # Agent 核心\n│ ├── client.py # DeepSeek 客户端\n│ ├── loop.py # 状态机循环\n│ ├── memory.py # 会话记忆\n│ ├── models.py # Agent 领域模型\n│ ├── tools.py # MCP 风格工具契约\n│ └── service.py # Agent 服务\n├── game/ # 游戏日志\n│ ├── detector.py # macOS 进程/日志检测\n│ ├── tailer.py # 日志尾随 (轮转/截断)\n│ ├── death_parser.py # 双语死亡解析\n│ ├── listener.py # 日志监听循环\n│ ├── models.py # 游戏状态模型\n│ └── service.py # 游戏服务\n├── rag/ # Wiki RAG\n│ ├── client.py # MediaWiki API 客户端\n│ ├── chunker.py # 文本清洗/切块\n│ ├── embedder.py # BGE 嵌入适配器\n│ ├── indexer.py # Qdrant 索引 (staging→live)\n│ ├── retriever.py # 密集检索 + 标题 boost\n│ ├── models.py # RAG 领域模型\n│ └── service.py # RAG 服务\n├── recipes/ # 配方数据\n│ ├── downloader.py # Mojang 下载 + SHA-1\n│ ├── extractor.py # JAR 提取\n│ ├── tree.py # 配方树算法\n│ ├── store.py # SQLite 持久化\n│ ├── models.py # 配方领域模型\n│ └── service.py # 配方服务\n├── storage/ # 持久化适配\n│ ├── qdrant.py # Qdrant 健康探针\n│ └── sqlite.py # SQLite 引擎\n├── templates/ # Jinja2 模板\n│ ├── base.html\n│ ├── index.html # 主聊天页\n│ └── admin.html # 开发者后台\n└── static/ # 静态资源\n ├── css/app.css\n └── js/ (chat.js, admin.js)\n```\n\n## 环境变量\n\n| 变量 | 默认值 | 说明 |\n|---|---|---|\n| `MC_PILOT_HOST` | `127.0.0.1` | 绑定地址 |\n| `MC_PILOT_PORT` | `8000` | 绑定端口 |\n| `MC_PILOT_LOG_LEVEL` | `INFO` | 日志级别 |\n| `MC_PILOT_SQLITE_URL` | `sqlite:///data/mc_pilot.db` | SQLite 路径 |\n| `MC_PILOT_QDRANT_URL` | `http://localhost:6333` | Qdrant 地址 |\n| `DEEPSEEK_API_KEY` | — | DeepSeek API 密钥(必需) |\n| `DEEPSEEK_BASE_URL` | `https://api.deepseek.com` | API 基础 URL |\n| `DEEPSEEK_MODEL` | `deepseek-v4-flash` | 模型名 |\n\n## 课程验收要点\n\n- 真实模型连通性: `python scripts/test_connectivity.py`\n- Agent 工具调用: 发送 `/pilot 查询附魔台配方` 验证 wiki_search + recipe_query 工具选择\n- 离线测试: `pytest -q` (91+ 自动化测试)\n- 安全红线和错误出口: 工具白名单、未知工具拒绝、超预算停止、参数校验\n- 成本受控: Agent 最多 4 轮工具调用、输出约 800 tokens、每日 200k tokens 上限\n- 所有秘密通过 .env 提供,仓库不包含密钥或未脱敏日志\n"}, "c53c48bdbb5e4eee6c3eec2e56fd7caf1da63c5b": {"t": 1785772063.0875492, "n": 1469, "h": "0783fbf405a228a3", "c": "# Minecraft Pilot Agent\n\nMinecraft Pilot is a local assistant for Minecraft Java Edition 26.2. The required web MVP will combine Chinese Wiki RAG, deterministic recipe trees, and concise local-player death advice. A thin Fabric client is planned as an optional second phase.\n\nThis is an unofficial, educational project. It is not approved by or associated with Mojang or Microsoft.\n\n## M1 foundation\n\nThe current milestone provides the typed FastAPI skeleton, local web/admin placeholders, SQLite bootstrap, Qdrant readiness checks, Docker Compose, and baseline quality checks. Game, RAG, recipe, and model behavior arrive in later milestones.\n\n## Local development\n\nPython 3.12 is required. This project deliberately uses pip and an isolated `.venv`; it does not use conda.\n\n```bash\npython3 -m venv .venv\n.venv/bin/python -m pip install --upgrade pip\n.venv/bin/python -m pip install -e '.[dev]'\ncp .env.example .env\ndocker compose up -d qdrant\n.venv/bin/uvicorn mc_pilot.app:create_app --factory --reload\n```\n\nOpen <http://127.0.0.1:8000/> and <http://127.0.0.1:8000/admin>.\n\n## Docker\n\n```bash\ndocker compose up --build\n```\n\nOnly loopback ports `8000` and `6333` are published. Qdrant and application state use named Docker volumes.\n\n## Verification\n\n```bash\n.venv/bin/ruff check .\n.venv/bin/mypy src tests\n.venv/bin/pytest -q\ndocker compose config --quiet\n```\n\nNever commit `.env`, Minecraft game files, Wiki dumps, model weights, Qdrant data, or private game logs.\n"}}}}