本地 AI 主持人,跑《克苏鲁的呼唤》。你说,它听,然后以守秘人的身份回答——全部本地运行,零 API 成本。
状态:Phase 4.5 完成 — 动态剧情事件、RPG 风格存档(自动存档+NL触发+多人加载)、SQLite 持久层、97 项测试全绿。
git clone https://github.com/Gousting/trpg-agent.git
cd trpg-agent
uv sync
cp .env.example .env # 编辑 OLLAMA_HOST 指向你的 Ollama
uv run python tests/test_integration.py # Phase 4 全链路测试 (6 轮)前提:Ollama 运行中,已 pull 模型(默认 gemma4:12b)。
uv run pytest tests/ -v # 97 项单元测试借鉴 DMbot 的架构范式——"LLM 提议叙事,代码拥有硬状态"。
玩家输入 → 检定分类器 → 掷骰引擎 → [Ollama] → sanitize 清洗 → GS 解析 → KP 回答
↓ ↑ ↓
SAN/战斗/幸运/孤注一掷 system prompt SQLite DB
↓ ↑ (调查员/NPC/任务/历史)
Session 管理器(多人联机 + 存档/读档 + 上下文窗口 + recap压缩)
Phase 1-2:核心管线
| 模块 | 说明 |
|---|---|
llm/sanitize.py |
中文 KP 回答清洗 (12 项正则) |
llm/client.py |
Ollama 异步客户端 |
prompts/kp_core_zh.md |
守秘人核心人格 (2587 字) |
rules/coc.py |
COC 7 版检定引擎 |
rules/engine.py |
通用掷骰引擎 |
session.py |
Session 管理器 |
memory/game_state.py |
COC 游戏状态 |
memory/history.py |
对话历史 |
Phase 3:掷骰路由
| 模块 | 说明 |
|---|---|
llm/roll_router.py |
检定分类器 (constrained JSON) |
Phase 4:完整游戏系统
| 模块 | 说明 |
|---|---|
rules/sanity.py |
SAN 检定、临时/不定疯狂 |
rules/combat.py |
格斗/射击/闪避/反击 |
rules/luck.py |
幸运值消耗与恢复 |
rules/pushing.py |
孤注一掷重试 |
memory/gs_parser.py |
动态剧情事件 — KP 回复中 <!--GS--> 标记块自动写入游戏状态 |
memory/database.py |
SQLite 持久层 — 调查员跨 session 复用、声纹绑定、快照存档 |
多人联机 + RPG 存档
| 模块 | 说明 |
|---|---|
session.py |
speaker 参数支持多人说话、自动存档(每5轮)、NL保存/加载意图检测、多人加载摘要 |
session.py |
is_multiplayer / loaded_from / loaded_state_summary() 辅助属性 |
测试
| 文件 | 说明 |
|---|---|
tests/test_unit.py |
39 项单元测试 |
tests/test_phase4.py |
20 项规则测试 |
tests/test_integration.py |
6 轮全链路集成测试 |
tests/test_multiplayer.py |
17 项多人联机 + RPG 存档测试 |
tests/test_database.py |
6 项数据库集成测试 |
详见 ROADMAP.md。 Phase 1 纯文字闭环 ✅ · Phase 2 状态与记忆 ✅ · Phase 3 掷骰路由 ✅ · Phase 4 完整游戏系统 ✅ · Phase 4.5 动态剧情+多人联机+SQLite ✅ · Phase 5 语音链路 → Phase 6 平板客户端。
MIT