CraftAgent
Minecraft Fabric мод, который добавляет в ваш мир умных NPC на базе ИИ. NPC используют большие языковые модели (LLM), чтобы понимать контекст, принимать решения и взаимодействовать с игроками.
- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 757
- Подписчиков на Modrinth
- 1
- версия
- 1
- Обновлён
- 6 января 20266 янв.
- Опубликован
- в 2026
Коротко о моде
Ставится только в игру; на сервер ставить не нужно
CraftAgent
Minecraft-мод на Fabric, который добавляет в ваш мир умных NPC на базе ИИ. NPC используют большие языковые модели (LLM), чтобы понимать контекст, принимать решения и взаимодействовать с игроками.
Возможности
- 🤖 NPC на базе ИИ: используют LLM (Ollama, LM Studio) для разумного принятия решений
- 🎮 Автономные действия: NPC выполняют команды Minecraft, чтобы взаимодействовать с миром
- 💬 Память диалогов: постоянная история переписки в SQLite
- 🌍 Осознание контекста мира: NPC понимают окружение (блоки, сущности, инвентарь, навигацию, линию видимости)
- 🔧 Поддержка нескольких LLM: Ollama и LM Studio (совместимые с OpenAI)
- 🎨 Архитектура клиент-сервер: настройка GUI на клиенте, логика NPC на сервере
- 🛠️ Система команд: использует Brigadier для обнаружения и выполнения всех команд Minecraft
- 🌐 Веб-панель: встроенный веб-интерфейс (http://localhost:8080) с автообновлением по интервалам обработки LLM
- 📧 Система почты: NPC могут отправлять и получать сообщения через почтовую систему
- 💬 Адресные сообщения в чате: отправляйте сообщения конкретным NPC в формате "npcName: message" или всем NPC сразу
- 🧠 Система памяти: приватная и общая память (privateBook, sharebook) для постоянных знаний
- ⚡ Структурированные действия: LLM возвращает структурированный вывод с сообщениями и исполняемыми действиями
- 🔄 Обновления в реальном времени: веб-интерфейс обновляется автоматически без ручного обновления
- 🧭 Система навигации: NPC могут перемещаться к координатам, сущностям или блокам с отслеживанием состояния
- 👁️ Определение линии видимости: NPC замечают предметы, сущности и блоки в своей линии видимости
- ⚡ Управление состоянием действий: отслеживание текущих действий (добыча, строительство, крафт, охота, фермерство, рыбалка, бой)
- 🛠️ Продвинутые действия: добыча, строительство, крафт, охота, фермерство, рыбалка и бой
- ⏸️ Управление LLM: переключатель для пропуска запросов к LLM для каждого NPC и команда ручного запуска LLM
Требования
- Minecraft: 1.20.1 или 1.21.8
- Java: 17 (1.20.1) или 21 (1.21.8+)
- Fabric Loader: 0.17.3+
- Сервис LLM: Ollama или LM Studio, запущенные локально
Установка
Для игроков
- Скачайте последний JAR с Modrinth или CurseForge
- Поместите JAR в папку
mods Установите и запустите один из вариантов:
- Ollama: скачайте с ollama.ai и выполните
ollama serve - LM Studio: скачайте с lmstudio.ai и запустите сервер
- Ollama: скачайте с ollama.ai и выполните
- Запустите Minecraft и наслаждайтесь!
Для разработчиков
Клонируйте репозиторий:
git clone https://github.com/prskid1000/CraftAgent.git cd CraftAgentСоберите проект:
# Windows .\gradlew.bat :1.21.8:build # Linux/Mac ./gradlew :1.21.8:build- Скомпилированный JAR найдёте в
versions/1.21.8/build/libs/
Сборка
# Сборка для конкретной версии
.\gradlew.bat :1.21.8:build
# Сборка всех версий
.\gradlew.bat build
# Запуск в режиме разработки
.\gradlew.bat :1.21.8:runServerИспользование
Команды
/craftagent— открыть GUI настройки- `/craftagent add ` — создать нового NPC
- `/craftagent remove ` — удалить NPC (данные сохраняются)
- `/craftagent llm` — вручную запустить вызов LLM для указанного NPC (имя NPC без учёта регистра)
`/craftagent ` — выполнить действие для указанного NPC (имя NPC без учёта регистра)
Действия с памятью:
/craftagent Steve sharedbook add "Iron Mine" "Iron mine located at coordinates 150, 64, -200"/craftagent Steve sharedbook add BaseLocation "Our base is at spawn"/craftagent Steve sharedbook remove "Iron Mine"/craftagent Steve privatebook add "Secret Plan" "I will build a house tomorrow"/craftagent Steve privatebook add Notes "Remember to craft more tools"/craftagent Steve privatebook remove "Secret Plan"
Действия общения:
/craftagent Steve mail send Alice "Hello there! Want to mine together?"/craftagent Steve mail send Bob "Found some diamonds at 200, 50, -100"Действия навигации:
/craftagent Steve travel to 100 64 200/craftagent Steve travel to entity Zombie/craftagent Steve travel to block iron_ore/craftagent Steve travel stopДействия добычи:
/craftagent Steve mine iron_ore 5/craftagent Steve mine diamond_ore/craftagent Steve mine at 150 64 -200Действия строительства:
/craftagent Steve build stone_bricks at 100 65 200/craftagent Steve place oak_planks at 101 65 201Действия крафта:
/craftagent Steve craft iron_pickaxe/craftagent Steve craft wooden_swordДействия охоты:
/craftagent Steve hunt zombie/craftagent Steve hunt Creeper/craftagent Steve hunt SkeletonДействия фермерства:
/craftagent Steve farm plant wheat at 50 64 50/craftagent Steve farm plant carrot at 51 64 51/craftagent Steve farm harvest at 50 64 50/craftagent Steve farm harvestДействия рыбалки:
/craftagent Steve fish/craftagent Steve fish stopДействия боя:
/craftagent Steve attack Zombie/craftagent Steve attack zombie/craftagent Steve defend
Сообщения в чате
Игроки могут отправлять сообщения NPC через чат. Сообщения автоматически направляются NPC:
- Адресные сообщения:
steve: Do your homework— отправляет сообщение только NPC с именем "steve" (без учёта регистра) - Широковещательные сообщения:
Do your homework— отправляет сообщение всем NPC
Имена NPC сопоставляются без учёта регистра, поэтому steve, STEVE и Steve соответствуют одному и тому же NPC.
Полезные клавиши Minecraft
- F3: Открывает экран отладки с координатами, FPS, информацией о чанках и другими техническими деталями. Полезно для определения координат при выдаче NPC команд перемещения.
- F3+P: Переключает паузу при потере фокуса. Когда включено, игра продолжает работать при переключении на другое окно, что полезно для наблюдения за NPC в фоне.
Веб-панель
CraftAgent включает встроенную веб-панель для мониторинга NPC в реальном времени. Панель автоматически запускается при старте сервера Minecraft.
Доступ к панели:
- Запустите сервер Minecraft с установленным CraftAgent
- Откройте браузер и перейдите по адресу: http://localhost:8080
- Панель отобразит всех активных NPC с их текущим статусом
Возможности панели:
- Обзор NPC: Просмотр всех NPC с их базовой информацией (имя, возраст, пол, здоровье, еда, позиция, текущее действие, состояние навигации)
- Вкладка состояния: Статистика в реальном времени с полосами прогресса здоровья и еды, координаты позиции и информация о биоме
Вкладка контекста: Подробный контекст мира, включая:
- Информацию о состоянии (позиция, здоровье, еда, биом)
- Детали инвентаря (хотбар, основной инвентарь, броня, вторая рука)
- Таблицу ближайших блоков (тип, позиция, уровень добычи, нужный инструмент)
- Таблицу ближайших сущностей (имя, тип, ID, статус игрока)
- Состояние навигации (текущее состояние, пункт назначения, время в состоянии)
- Текущее действие (тип действия, описание, длительность, данные, специфичные для действия)
- Данные линии обзора:
- Предметы в линии обзора (тип, количество, позиция, расстояние)
- Сущности в линии обзора (имя, тип, ID, статус игрока)
- Целевой блок (куда смотрит NPC)
- Видимые блоки (блоки, видимые в линии обзора)
- Вкладка сообщений: История переписки со значками ролей и временными метками
- Вкладка почты: Почтовые сообщения от других NPC и игроков
Вкладка памяти: Постоянная память NPC, включая:
- Страницы личной книги (память конкретного NPC)
- Страницы общей книги (доступны всем NPC)
Автообновление:
- Панель управления использует автообновление на основе максимального интервала обработки LLM
- Все данные (NPC, сообщения, почта, память) обновляются автоматически через заданные интервалы
- Ручное обновление не требуется — интерфейс остаётся синхронизированным с сервером
Обновления запускаются, когда:
- NPC создаются или удаляются
- В историю переписки добавляются новые сообщения
- Отправляются или принимаются почтовые сообщения
- Обновляется память (личная/общая книга)
Создание NPC
- Запустите свой LLM-сервис (Ollama или LM Studio)
- Используйте `/craftagent create
или откройте GUI командой/craftagent` Настройте NPC:
- Name: Отображаемое имя
- LLM Type:
ollamaилиlm_studio - Model: Название модели (например,
llama3) - URL: URL LLM-сервиса (по умолчанию:
http://localhost:11434для Ollama,http://localhost:1234/v1для LM Studio) - Skip LLM Requests: Переключатель для отключения автоматической обработки LLM для этого NPC (полезно для тестирования или когда LLM-сервис недоступен)
Управление обработкой LLM
- Автоматическая обработка: NPC автоматически обрабатывают вызовы LLM через заданные интервалы (см.
llmProcessingIntervalв базовом конфиге) - Skip LLM Requests: Включите переключатель "Skip LLM Requests" в конфиге NPC, чтобы отключить все вызовы LLM (как автоматические, так и ручные) для этого NPC
- Ручной запуск: Используйте `/craftagent llm` для ручного запуска вызова LLM для конкретного NPC (работает только если skipLLMRequests отключён)
Настройка LLM
Ollama
- Установите с ollama.ai
- Запустите:
ollama serve - Загрузите модель:
ollama pull llama3 - Настройте NPC: LLM Type
ollama, Modelllama3, URLhttp://localhost:11434
LM Studio
- Установите с lmstudio.ai
- Скачайте модель и запустите локальный сервер (порт 1234)
- Настройте NPC: LLM Type
lm_studio, название модели, URLhttp://localhost:1234/v1
Архитектура
Обзор архитектуры системы
graph TB
subgraph "Client Side"
GUI[OWO UI Screens]
ClientNet[Client Network Manager]
GUI --> ClientNet
end
subgraph "Server Side"
Main[CraftAgent Mod]
CmdMgr[Command Manager]
NetHandler[Network Handler]
NPCService[NPC Service]
EventReg[EventListener Registerer]
WebServer[Web Server :8080]
Main --> CmdMgr
Main --> NetHandler
Main --> NPCService
Main --> EventReg
Main --> WebServer
end
subgraph "NPC Components"
NPCFactory[NPC Factory]
NPCEntity[Server Player Entity]
EventHandler[NPCEventHandler]
ContextProv[Context Provider]
History[Conversation History]
LLMClient[LLM Client]
NPCService --> NPCFactory
NPCFactory --> NPCEntity
NPCFactory --> EventHandler
NPCFactory --> ContextProv
NPCFactory --> History
NPCFactory --> LLMClient
end
subgraph "Data Layer"
SQLite[(SQLite Database)]
ConfigFiles[Config Files]
Repos[Repositories]
NPCService --> Repos
Repos --> SQLite
NPCService --> ConfigFiles
end
subgraph "External Services"
Ollama[Ollama API]
LMStudio[LM Studio API]
LLMClient --> Ollama
LLMClient --> LMStudio
end
ClientNet <--> NetHandler
EventReg --> NPCService
WebServer --> NPCServiceАрхитектура компонентов
graph LR
subgraph "Core Services"
NPCService[NPC Service<br/>Lifecycle Management]
CoordinationService[Coordination Service<br/>NPC Communication]
ConfigProvider[Config Provider<br/>Configuration Management]
end
subgraph "NPC Instance"
NPC[NPC Model]
EventHandler[Event Handler<br/>LLM Processing]
ContextProvider[Context Provider<br/>World State]
ConversationHistory[Conversation History<br/>Message Storage]
MemoryManager[Memory Manager<br/>Private Memory]
end
subgraph "Data Repositories"
ConversationRepo[Conversation Repository]
MessageRepo[Message Repository<br/>Mail System]
PrivateBookRepo[Private Book Repository]
SharebookRepo[Sharebook Repository]
end
subgraph "Event Listeners"
ChatListener[Chat Message Listener]
AgeListener[Age Update Listener]
LLMScheduler[LLM Processing Scheduler]
end
NPCService --> NPC
NPC --> EventHandler
NPC --> ContextProvider
NPC --> ConversationHistory
NPC --> MemoryManager
EventHandler --> ConversationHistory
ContextProvider --> MessageRepo
ContextProvider --> PrivateBookRepo
ContextProvider --> SharebookRepo
NPCService --> CoordinationService
ChatListener --> NPCService
AgeListener --> NPCService
LLMScheduler --> EventHandler
### Жизненный цикл NPC
```mermaid
stateDiagram-v2
[*] --> Created: /craftagent create
Created --> Validating: Проверка имени и конфигурации
Validating --> CheckingLLM: Имя корректно
Validating --> Error: Некорректное имя
CheckingLLM --> Spawning: LLM доступен
CheckingLLM --> Error: LLM недоступен
Spawning --> Active: Сущность заспавнена
Active --> Processing: Запуск планировщика LLM
Processing --> Active: Ответ сгенерирован
Active --> Removed: /craftagent remove
Active --> Deleted: /craftagent delete
Active --> Dead: Событие смерти сущности
Dead --> Removed: Автоудаление
Removed --> [*]: Данные сохранены
Deleted --> [*]: Данные удалены
Error --> [*]Процесс обработки LLM
sequenceDiagram
participant Scheduler as Планировщик обработки LLM
participant EventHandler as NPCEventHandler
participant History as История диалога
participant Context as Поставщик контекста
participant LLM as Клиент LLM
participant Ollama as Ollama/LM Studio
participant ActionExecutor as Исполнитель действий
participant WebServer as Веб-сервер
Scheduler->>EventHandler: processLLM()
EventHandler->>History: performSummarizationIfNeeded()
History-->>EventHandler: Суммировано при необходимости
EventHandler->>History: Получить сообщения диалога
EventHandler->>Context: buildContext()
Context-->>EventHandler: WorldContext (состояние, инвентарь, блоки, сущности, память)
EventHandler->>EventHandler: Форматирование сообщений с контекстом
EventHandler->>LLM: chat(messages, server)
LLM->>Ollama: HTTP POST /api/chat
Ollama-->>LLM: JSON-ответ {"message": "...", "actions": [...]}
LLM-->>EventHandler: LLMResponse (структурированный)
EventHandler->>ActionExecutor: executeActions(actions)
ActionExecutor->>ActionExecutor: Маршрутизация к обработчикам (память, общение и т.д.)
EventHandler->>History: Добавить ответ в историю
EventHandler->>ChatUtil: Отправить сообщение в чат
EventHandler->>History: Сохранить ответ
EventHandler-->>Scheduler: Успех/НеудачаПоток сообщений: Игрок → NPC
sequenceDiagram
participant Player
participant ChatListener as Слушатель сообщений чата
participant NPCService
participant MessageRepo as Хранилище сообщений
participant Context as Поставщик контекста
participant LLM as Клиент LLM
Player->>ChatListener: Отправляет сообщение в чат<br/>(адресное: "npcName: message"<br/>или широковещательное: "message")
ChatListener->>ChatListener: Разбор формата сообщения
alt Адресное сообщение (npcName: message)
ChatListener->>ChatListener: Найти NPC по имени (без учёта регистра)
ChatListener->>NPCService: sendPlayerMessageToNpc(конкретный NPC)
else Широковещательное сообщение
ChatListener->>NPCService: sendPlayerMessageToNpc(все NPC)
end
NPCService->>MessageRepo: insert(message)
MessageRepo-->>NPCService: Сообщение сохранено
Note over NPCService: Сообщение доступно в контексте<br/>при следующем вызове LLM
NPCService-->>ChatListener: Готово
ChatListener-->>Player: Сообщение обработаноПоток сообщений: NPC → NPC
sequenceDiagram
participant NPC1
participant CoordinationService
participant MessageRepo as Хранилище сообщений
participant NPC2
participant ChatUtil
participant Context as Поставщик контекста
NPC1->>CoordinationService: sendDirectMessage(toNpc, message)
CoordinationService->>MessageRepo: insert(message)
MessageRepo-->>CoordinationService: Сообщение сохранено
CoordinationService->>ChatUtil: sendChatMessage()
ChatUtil-->>NPC2: Отобразить в чате
Note over CoordinationService: Сообщение доступно в контексте<br/>при следующем вызове LLM
CoordinationService-->>NPC1: Готово
### Архитектура потоков данных
```mermaid
graph TD
subgraph "Input Sources"
PlayerChat[Player Chat Messages]
GameEvents[Game Events<br/>Tick, Death, etc.]
WorldState[World State<br/>Blocks, Entities, Inventory]
end
subgraph "Processing Layer"
EventHandler[Event Handler]
ContextBuilder[Context Builder]
LLMProcessor[LLM Processor]
end
subgraph "Storage Layer"
ConversationDB[(Conversation History)]
MessageDB[(Mail Messages)]
PrivateMemoryDB[(Private Memory)]
SharedMemoryDB[(Shared Memory)]
ConfigFiles[Config Files]
end
subgraph "Output"
ChatOutput[Chat Messages]
CommandExecution[Minecraft Commands]
WebDashboard[Web Dashboard]
end
PlayerChat --> EventHandler
GameEvents --> EventHandler
WorldState --> ContextBuilder
EventHandler --> LLMProcessor
ContextBuilder --> LLMProcessor
LLMProcessor --> ConversationDB
EventHandler --> MessageDB
EventHandler --> PrivateMemoryDB
EventHandler --> SharedMemoryDB
EventHandler --> ConfigFiles
LLMProcessor --> ChatOutput
LLMProcessor --> CommandExecution
EventHandler --> WebDashboardСправочные таблицы компонентов
Основные компоненты
| Компонент | Пакет | Ответственность | Ключевые методы |
|---|---|---|---|
| CraftAgent | me.prskid1000.craftagent | Главный инициализатор мода | onInitialize(), onStop() |
| NPCService | me.prskid1000.craftagent.common | Управление жизненным циклом NPC | createNpc(), removeNpc(), deleteNpc() |
| NPCFactory | me.prskid1000.craftagent.common | Создание экземпляров NPC | createNpc() |
| NPCEventHandler | me.prskid1000.craftagent.event | Обработка событий и вызовы LLM | updateState(), processLLM() |
| ContextProvider | me.prskid1000.craftagent.context | Сбор контекста мира | buildContext() |
| ConversationHistory | me.prskid1000.craftagent.history | Управление историей сообщений | add(), performSummarizationIfNeeded() |
| CoordinationService | me.prskid1000.craftagent.coordination | Связь между NPC | sendDirectMessage() |
| ActionProvider | me.prskid1000.craftagent.action | Маршрутизация действий к обработчикам | executeAction(), isValidAction() |
| ActionProviderFactory | me.prskid1000.craftagent.action | Создаёт ActionProvider со всеми обработчиками | create() |
| ActionExecutor | me.prskid1000.craftagent.action | Выполняет сгенерированные LLM действия, парсит команды | executeActions(), executeAction() |
| ActionParser | me.prskid1000.craftagent.action | Универсальный парсер команд с поддержкой кавычек | parseQuotedArguments(), wasArgumentQuoted() |
| MemoryActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия с памятью | handleAction() (sharedbook/privatebook) |
| CommunicationActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия связи | handleAction() (mail send) |
| NavigationActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия навигации/перемещения | handleAction() (travel to coordinates/entity/block) |
| MiningActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия добычи | handleAction() (mine blocks) |
| BuildingActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия строительства/установки | handleAction() (build/place blocks) |
| CraftingActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия крафта | handleAction() (craft items) |
| HuntingActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия охоты | handleAction() (hunt mobs) |
| FarmingActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия фермерства | handleAction() (plant/harvest crops) |
| FishingActionHandler | me.prskid1000.craftagent.action | Обрабатывает действия рыбалки | handleAction() (fish/stop fishing) |
| CombatActionHandler | me.prskid1000.craftagent.action | Обрабатывает боевые действия | handleAction() (attack/defend) |
| ActionStateManager | me.prskid1000.craftagent.context | Управляет текущим состоянием действия | setAction(), getActionDescription() |
| NavigationState | me.prskid1000.craftagent.context | Управляет состоянием навигации | setTravelingTo(), update(), hasArrived() |
| LineOfSightProvider | me.prskid1000.craftagent.context | Определяет предметы/сущности/блоки в поле зрения | getItemsInLineOfSight(), getEntitiesInLineOfSight() |
| WebServer | me.prskid1000.craftagent.web | Веб-панель с автообновлением | HTTP API endpoints |
Обработчики событий
| Обработчик | Пакет | Тип события | Назначение |
|---|---|---|---|
| ChatMessageListener | me.prskid1000.craftagent.listener | ServerMessageEvents.CHAT_MESSAGE | Направляет сообщения игроков NPC через почту. Поддерживает адресные сообщения (формат: "npcName: message") и широковещательные сообщения |
| AgeUpdateListener | me.prskid1000.craftagent.listener | ServerTickEvents.END_SERVER_TICK | Обновляет возраст NPC со временем |
| LLMProcessingScheduler | me.prskid1000.craftagent.listener | ServerTickEvents.END_SERVER_TICK | Планирует обработку LLM для NPC |
| EventListenerRegisterer | me.prskid1000.craftagent.listener | - | Регистрирует все обработчики событий |
Модели данных
| Модель | Пакет | Описание | Ключевые поля |
|---|---|---|---|
| NPC | me.prskid1000.craftagent.model | Основная структура данных NPC | entity, llmClient, history, eventHandler, contextProvider, config |
| ConversationMessage | me.prskid1000.craftagent.history | Сообщение истории разговора | message, role, timestamp |
| Message | me.prskid1000.craftagent.model.database | Сообщение почтовой системы | senderUuid, recipientUuid, content, read |
| WorldContext | me.prskid1000.craftagent.model.context | Снимок состояния мира | state, inventory, nearbyBlocks, nearbyEntities, memoryData, navigation, lineOfSight, actionState |
| ContextData | me.prskid1000.craftagent.model.context | Структуры данных контекста | BlockData, EntityData, ItemData, InventoryData, StateData, NavigationData, LineOfSightData, ActionStateData |
Репозитории
| Репозиторий | Пакет | Назначение | Ключевые методы |
|---|---|---|---|
| ConversationRepository | me.prskid1000.craftagent.database.repositories | Хранение истории разговоров | insert(), selectByUuid() |
| MessageRepository | me.prskid1000.craftagent.database.repositories | Хранение почтовой системы | insert(), selectByRecipient(), markAsRead() |
| PrivateBookPageRepository | me.prskid1000.craftagent.database.repositories | Память конкретного NPC | insert(), selectByUuid() |
| SharebookRepository | me.prskid1000.craftagent.database.repositories | Общая память между NPC | insert(), selectAll() |
Клиенты LLM
| Клиент | Пакет | Тип LLM | Конечная точка API |
|---|---|---|---|
| OllamaClient | me.prskid1000.craftagent.llm.ollama | Ollama | /api/chat |
| LMStudioClient | me.prskid1000.craftagent.llm.lmstudio | LM Studio | /chat/completions |
| LLMClient | me.prskid1000.craftagent.llm | Интерфейс | - |
Конфигурация
| Конфиг | Пакет | Расположение файла | Назначение |
|---|---|---|---|
| BaseConfig | me.prskid1000.craftagent.config | config/craftagent/base.json | Глобальные настройки (таймаут, радиус чанков и т. д.) |
| NPCConfig | me.prskid1000.craftagent.config | config/craftagent/npcs/{uuid}.json | Настройки отдельного NPC (имя, тип LLM, модель и т. д.) |
| ConfigProvider | me.prskid1000.craftagent.config | - | Управление конфигурацией |
Подробности потока данных
Процесс построения контекста
graph LR
A[ContextProvider.buildContext] --> B[Get NPC State]
A --> C[Get Inventory]
A --> D[Get Nearby Blocks]
A --> E[Get Nearby Entities]
A --> F[Build Memory Data]
A --> G[Build Navigation Data]
A --> H[Build Line of Sight Data]
A --> I[Build Action State Data]
B --> J[StateData<br/>position, health, food, biome]
C --> K[InventoryData<br/>armor, main, hotbar, offhand]
D --> L[List of BlockData<br/>type, position, mineLevel]
E --> M[List of EntityData<br/>id, name, isPlayer]
F --> N[Memory Data<br/>privateBook, mail, sharebook]
G --> O[NavigationData<br/>state, destination, time]
H --> P[LineOfSightData<br/>items, entities, blocks]
I --> Q[ActionStateData<br/>actionType, description, data]
J --> R[WorldContext]
K --> R
L --> R
M --> R
N --> R
O --> R
P --> R
Q --> R
### Структура системы памяти
| Тип памяти | Репозиторий | Область | Способ доступа |
|-------------|------------|-------|----------------|
| **История переписки** | ConversationRepository | Для каждого NPC | Загружается при появлении, сохраняется при выключении |
| **Почтовые сообщения** | MessageRepository | Для каждого NPC | Сохраняются при получении, отмечаются прочитанными при обращении |
| **Личная память** | PrivateBookPageRepository | Для каждого NPC | Заметки и знания конкретного NPC |
| **Общая память** | SharebookRepository | Глобальная | Доступна всем NPC |
### Система действий
NPC могут выполнять действия через структурированный вывод LLM. LLM возвращает ответ в формате JSON с сообщением и списком действий:
```json
{
"message": "I found an iron mine!",
"actions": [
"sharedbook add IronMine Location at 150, 64, -200",
"mail send Alice Found iron, want to mine together?"
]
}Доступные действия:
| Тип действия | Формат | Описание |
|---|---|---|
| Память — общая книга | `sharedbook add | Добавить/обновить страницу общей памяти (все NPC могут читать). Заголовок можно указывать в кавычках или без. Содержимое должно быть в одинарных (') или двойных (") кавычках. |
| Память — общая книга | `sharedbook remove | Удалить страницу общей памяти |
| Память — личная книга | `privatebook add | Добавить/обновить страницу личной памяти (для конкретного NPC). Заголовок можно указывать в кавычках или без. Содержимое должно быть в одинарных (') или двойных (") кавычках. |
| Общение | `mail send <npc_name> ''` | Отправить почтовое сообщение другому NPC. Имя получателя можно указывать в кавычках или без. Сообщение должно быть в одинарных (') или двойных (") кавычках. |
| Навигация | `travel to ` | Идти к указанным координатам |
| Навигация | travel to entity <entity_name> | Идти к ближайшей сущности по имени |
| Навигация | travel to block <block_type> | Идти к ближайшему блоку указанного типа |
| Навигация | travel stop | Остановить текущее перемещение |
| Добыча | mine <block_type> [count] | Добыть блоки указанного типа (по умолчанию: 1) |
| Добыча | `mine at ` | Добыть блок по указанным координатам |
| Строительство | `build <block_type> at ` | Поставить блок по координатам (нужен блок в инвентаре) |
| Строительство | `place <block_type> at ` | Поставить блок (синоним build) |
| Крафт | craft <item_name> | Скрафтить предмет из материалов в инвентаре |
| Охота | hunt <mob_type> | Охотиться/атаковать указанный тип мобов |
| Охота | hunt <entity_name> | Охотиться/атаковать сущность по имени |
| Фермерство | `farm plant <crop_type> at ` | Посадить культуру по координатам |
| Фермерство | `farm harvest at ` | Собрать урожай по координатам |
| Фермерство | farm harvest | Собрать созревший урожай поблизости |
| Рыбалка | fish | Начать рыбалку (забросить удочку) |
| Рыбалка | fish stop | Прекратить рыбалку (вытянуть удочку) |
| Бой | attack <entity_name> | Атаковать указанную сущность |
| Бой | attack <entity_type> | Атаковать сущность по типу |
| Бой | defend | Перейти в защитную стойку |
Разбор действий:
- Действия разбираются один раз через
ActionExecutorс помощью утилитыActionParser - Парсер обрабатывает и одинарные, и двойные кавычки, позволяя использовать аргументы с пробелами
- Разобранные массивы передаются обработчикам:
["sharedbook", "add", "title", "content"] - Содержимое и сообщения должны быть в кавычках, чтобы обрабатывать текст из нескольких слов и специальные символы
Примеры:
sharedbook add "My Title" "Content with spaces and special chars!"sharedbook add title 'Simple content'mail send "Alice" "Hello world message"mail send Alice 'Hello world'
Действия автоматически выполняются ActionExecutor, который разбирает команды и направляет их соответствующим обработчикам (MemoryActionHandler, CommunicationActionHandler и т. д.).
Поток обработки событий
graph TD
A[Происходит игровое событие] --> B{Тип события}
B -->|Сообщение в чате| C[ChatMessageListener]
B -->|Серверный тик| D[AgeUpdateListener]
B -->|Серверный тик| E[LLMProcessingScheduler]
C --> F[Сохранить в систему почты]
F --> H[Доступно в контексте]
D --> I[Обновить возраст NPC]
I --> J[Сохранить конфиг]
E --> K[Проверить интервал обработки]
K -->|Интервал прошёл| L[Поставить NPC в очередь на обработку]
L --> M[NPCEventHandler.processLLM]
M --> N[Построить контекст]
N --> O[Вызвать LLM]
O --> P[Разобрать структурированный ответ]
P --> Q{Есть действия?}
Q -->|Да| R[Выполнить действия]
R --> S[Обработчики памяти/общения]
Q -->|Нет| T[Обновить историю]
R --> T
T --> U[Отправить сообщение в чат]
U --> V[Сохранить в историю]Конфигурация
Файлы конфигурации находятся в config/craftagent/:
- base.json: Глобальные настройки (таймаут, радиус чанков, режим отладки)
- npcs/{uuid}.json: Настройки отдельного NPC (имя, тип LLM, модель, характер)
Поля базовой конфигурации
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
llmTimeout | int | 30 | Таймаут запроса к LLM в секундах |
contextChunkRadius | int | 2 | Радиус сканирования чанков для контекста |
contextVerticalScanRange | int | 16 | Диапазон вертикального сканирования блоков |
maxNearbyBlocks | int | 50 | Максимум блоков в контексте |
maxNearbyEntities | int | 10 | Максимум сущностей в контексте |
llmProcessingInterval | int | 5 | Секунд между циклами обработки LLM |
llmMinInterval | int | 2 | Минимум секунд между обработкой NPC |
conversationHistoryLength | int | 5 | Максимум сообщений диалога до суммаризации |
maxMessages | int | 50 | Максимум почтовых сообщений на NPC |
maxSharebookPages | int | 20 | Максимум страниц общей памяти |
maxPrivatePages | int | 20 | Максимум страниц личной памяти на NPC |
lineOfSightMaxRange | int | 64 | Максимальная дальность обнаружения по линии взгляда |
lineOfSightItemDetectionRange | int | 32 | Дальность обнаружения предметов по линии взгляда |
Поля конфигурации NPC
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
npcName | String | "Steve" | Отображаемое имя |
uuid | UUID | random | Уникальный идентификатор |
isActive | boolean | true | Активен ли NPC |
llmType | LLMType | LM_STUDIO | Тип провайдера LLM |
llmModel | String | - | Название модели |
ollamaUrl | String | "http://localhost:11434" | URL API Ollama |
lmStudioUrl | String | "http://localhost:1234/v1" | URL API LM Studio |
age | int | 20 | Возраст NPC в годах |
gender | String | "neutral" | Пол (male/female/neutral) |
customSystemPrompt | String | "" | Пользовательский системный промпт |
skipLLMRequests | boolean | false | Если true, запросы к LLM не отправляются (NPC не будет обрабатывать вызовы LLM автоматически или вручную) |
Разработка
Ключевые компоненты
- NPCService: Управляет жизненным циклом NPC (создание, удаление, спавн)
- NPCEventHandler: Обрабатывает события и взаимодействия с LLM, работает со структурированным выводом
- ContextProvider: Собирает информацию о состоянии мира (блоки, сущности, инвентарь)
- ActionProvider: Направляет действия соответствующим обработчикам (память, общение, навигация, добыча, строительство, крафт, охота, фермерство, рыбалка, бой)
- ActionProviderFactory: Фабричный класс, создающий ActionProvider со всеми обработчиками действий, централизует логику создания обработчиков
- ActionExecutor: Выполняет действия из структурированных ответов LLM, разбирает команды один раз
- ActionParser: Универсальная утилита для разбора аргументов команд с поддержкой кавычек
- MemoryActionHandler: Обрабатывает действия, связанные с памятью (sharedbook, privatebook)
- CommunicationActionHandler: Обрабатывает действия общения (отправка почты)
- NavigationActionHandler: Обрабатывает действия навигации/перемещения (путь к координатам/сущности/блоку)
- MiningActionHandler: Обрабатывает действия добычи (добыть блоки)
- BuildingActionHandler: Обрабатывает действия строительства/установки (построить/поставить блоки)
- CraftingActionHandler: Обрабатывает действия крафта (создать предметы)
- HuntingActionHandler: Обрабатывает действия охоты (охотиться на мобов)
- FarmingActionHandler: Обрабатывает действия фермерства (сажать/собирать урожай)
- FishingActionHandler: Обрабатывает действия рыбалки (рыбачить/прекратить рыбалку)
- CombatActionHandler: Обрабатывает боевые действия (атаковать/защищаться)
- ActionStateManager: Отслеживает текущее состояние действия и предоставляет описания действий
- NavigationState: Управляет состоянием навигации (бездействие, перемещение, прибытие)
- LineOfSightProvider: Обнаруживает предметы, сущности и блоки по линии взгляда NPC
- MinecraftCommandUtil: Находит и выполняет команды Minecraft через Brigadier
- LLMClient: Интерфейс для провайдеров LLM (Ollama, LM Studio)
- CoordinationService: Обрабатывает связь между NPC через почтовую систему
- WebServer: HTTP-сервер для мониторинга NPC через веб-панель с автообновлением
Структура пакета
me.prskid1000.craftagent/
├── auth/ # Авторизация игрока
├── callback/ # Колбэки событий
├── client/ # Клиентский код (GUI, сеть)
├── commands/ # Команды Minecraft
├── common/ # Основные сервисы (NPCService, NPCFactory)
├── config/ # Управление конфигурацией
├── constant/ # Константы и инструкции
├── context/ # Сбор контекста мира
├── coordination/ # Взаимодействие между NPC
├── database/ # Хранение данных
│ ├── repositories/ # Репозитории базы данных
│ └── resources/ # Поставщики ресурсов
├── event/ # Обработка событий
├── exception/ # Классы исключений
├── history/ # История разговоров
├── listener/ # Слушатели событий
├── llm/ # Реализации клиентов LLM
│ ├── lmstudio/ # Клиент LM Studio
│ └── ollama/ # Клиент Ollama
├── memory/ # Управление памятью
├── mineskin/ # Управление скинами
├── mixin/ # Миксины для Minecraft
├── model/ # Модели данных
│ ├── context/ # Структуры данных контекста
│ └── database/ # Модели базы данных
├── networking/ # Сетевые пакеты
├── thread/ # Управление потоками
├── util/ # Вспомогательные классы
└── web/ # Веб-серверРешение проблем
- NPC не отвечает: Проверьте, запущен ли сервис LLM, проверьте URL/модель в конфиге
- Команды не работают: Проверьте логи сервера, убедитесь, что у NPC есть нужные права
- Таймаут LLM: Увеличьте
llmTimeoutв базовом конфиге или попробуйте более быструю модель - Почта не работает: Убедитесь, что MessageRepository инициализирован и UUID NPC верный
- Контекст не обновляется: Проверьте, что ChunkManager запущен и чанки загружены
- Действия не выполняются: Убедитесь, что формат действий соответствует ожидаемому синтаксису (см. раздел «Система действий»)
- Веб-интерфейс не обновляется: Проверьте консоль браузера на ошибки, убедитесь, что сервер запущен и настроен интервал обновления
- Разбор структурированного вывода не удаётся: LLM должна вернуть валидный JSON с полями "message" и "actions"
Участие в разработке
Вклад приветствуется! Форкните, создайте ветку с функцией и отправьте пул-реквест.
Лицензия
Этот проект лицензирован под LGPL-3.0.
Ссылки
Благодарности
- Автор: prskid1000
- Fabric: Фреймворк загрузчика модов
- Brigadier: Система команд (Mojang)
- Ollama и LM Studio: Провайдеры LLM
Частые вопросы
Как установить CraftAgent?
Установите Fabric под свою версию Minecraft, скачайте CraftAgent под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть CraftAgent?
У CraftAgent есть сборки для Minecraft 1.21.8.
Нужен ли CraftAgent на сервере?
Ставится только в игру; на сервер ставить не нужно