Перейти к содержимому

CraftAgent

Minecraft Fabric мод, который добавляет в ваш мир умных NPC на базе ИИ. NPC используют большие языковые модели (LLM), чтобы понимать контекст, принимать решения и взаимодействовать с игроками.

Fabric
Загрузчики
Fabric
Скачиваний на Modrinth
757
Подписчиков на Modrinth
1
версия
1
Обновлён
6 января 20266 янв.
Опубликован
в 2026

Коротко о моде

Работает на Fabric
Для Minecraft 1.21.8
Ставится только в игру; на сервер ставить не нужно
Последняя версия — 3.2.5 от 6 января 2026
Лицензия LGPL-3.0-only — бесплатно
Где нужен
В игреобязателенНа серверене нужен

Ставится только в игру; на сервер ставить не нужно

Версии игры1.21.8
Описание переведено автоматическиПоказать оригинал (EN)

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, запущенные локально

Установка

Для игроков

  1. Скачайте последний JAR с Modrinth или CurseForge
  2. Поместите JAR в папку mods
  3. Установите и запустите один из вариантов:

    • Ollama: скачайте с ollama.ai и выполните ollama serve
    • LM Studio: скачайте с lmstudio.ai и запустите сервер
  4. Запустите Minecraft и наслаждайтесь!

Для разработчиков

  1. Клонируйте репозиторий:

    git clone https://github.com/prskid1000/CraftAgent.git
    cd CraftAgent
  2. Соберите проект:

    # Windows
    .\gradlew.bat :1.21.8:build
    
    # Linux/Mac
    ./gradlew :1.21.8:build
  3. Скомпилированный 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.

Доступ к панели:

  1. Запустите сервер Minecraft с установленным CraftAgent
  2. Откройте браузер и перейдите по адресу: http://localhost:8080
  3. Панель отобразит всех активных NPC с их текущим статусом

Возможности панели:

  • Обзор NPC: Просмотр всех NPC с их базовой информацией (имя, возраст, пол, здоровье, еда, позиция, текущее действие, состояние навигации)
  • Вкладка состояния: Статистика в реальном времени с полосами прогресса здоровья и еды, координаты позиции и информация о биоме
  • Вкладка контекста: Подробный контекст мира, включая:

    • Информацию о состоянии (позиция, здоровье, еда, биом)
    • Детали инвентаря (хотбар, основной инвентарь, броня, вторая рука)
    • Таблицу ближайших блоков (тип, позиция, уровень добычи, нужный инструмент)
    • Таблицу ближайших сущностей (имя, тип, ID, статус игрока)
    • Состояние навигации (текущее состояние, пункт назначения, время в состоянии)
    • Текущее действие (тип действия, описание, длительность, данные, специфичные для действия)
    • Данные линии обзора:
    • Предметы в линии обзора (тип, количество, позиция, расстояние)
    • Сущности в линии обзора (имя, тип, ID, статус игрока)
    • Целевой блок (куда смотрит NPC)
    • Видимые блоки (блоки, видимые в линии обзора)
  • Вкладка сообщений: История переписки со значками ролей и временными метками
  • Вкладка почты: Почтовые сообщения от других NPC и игроков
  • Вкладка памяти: Постоянная память NPC, включая:

    • Страницы личной книги (память конкретного NPC)
    • Страницы общей книги (доступны всем NPC)

Автообновление:

  • Панель управления использует автообновление на основе максимального интервала обработки LLM
  • Все данные (NPC, сообщения, почта, память) обновляются автоматически через заданные интервалы
  • Ручное обновление не требуется — интерфейс остаётся синхронизированным с сервером
  • Обновления запускаются, когда:

    • NPC создаются или удаляются
    • В историю переписки добавляются новые сообщения
    • Отправляются или принимаются почтовые сообщения
    • Обновляется память (личная/общая книга)

Создание NPC

  1. Запустите свой LLM-сервис (Ollama или LM Studio)
  2. Используйте `/craftagent create или откройте GUI командой/craftagent`
  3. Настройте 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

  1. Установите с ollama.ai
  2. Запустите: ollama serve
  3. Загрузите модель: ollama pull llama3
  4. Настройте NPC: LLM Type ollama, Model llama3, URL http://localhost:11434

LM Studio

  1. Установите с lmstudio.ai
  2. Скачайте модель и запустите локальный сервер (порт 1234)
  3. Настройте NPC: LLM Type lm_studio, название модели, URL http://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

Справочные таблицы компонентов

Основные компоненты

КомпонентПакетОтветственностьКлючевые методы
CraftAgentme.prskid1000.craftagentГлавный инициализатор модаonInitialize(), onStop()
NPCServiceme.prskid1000.craftagent.commonУправление жизненным циклом NPCcreateNpc(), removeNpc(), deleteNpc()
NPCFactoryme.prskid1000.craftagent.commonСоздание экземпляров NPCcreateNpc()
NPCEventHandlerme.prskid1000.craftagent.eventОбработка событий и вызовы LLMupdateState(), processLLM()
ContextProviderme.prskid1000.craftagent.contextСбор контекста мираbuildContext()
ConversationHistoryme.prskid1000.craftagent.historyУправление историей сообщенийadd(), performSummarizationIfNeeded()
CoordinationServiceme.prskid1000.craftagent.coordinationСвязь между NPCsendDirectMessage()
ActionProviderme.prskid1000.craftagent.actionМаршрутизация действий к обработчикамexecuteAction(), isValidAction()
ActionProviderFactoryme.prskid1000.craftagent.actionСоздаёт ActionProvider со всеми обработчикамиcreate()
ActionExecutorme.prskid1000.craftagent.actionВыполняет сгенерированные LLM действия, парсит командыexecuteActions(), executeAction()
ActionParserme.prskid1000.craftagent.actionУниверсальный парсер команд с поддержкой кавычекparseQuotedArguments(), wasArgumentQuoted()
MemoryActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия с памятьюhandleAction() (sharedbook/privatebook)
CommunicationActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия связиhandleAction() (mail send)
NavigationActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия навигации/перемещенияhandleAction() (travel to coordinates/entity/block)
MiningActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия добычиhandleAction() (mine blocks)
BuildingActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия строительства/установкиhandleAction() (build/place blocks)
CraftingActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия крафтаhandleAction() (craft items)
HuntingActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия охотыhandleAction() (hunt mobs)
FarmingActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия фермерстваhandleAction() (plant/harvest crops)
FishingActionHandlerme.prskid1000.craftagent.actionОбрабатывает действия рыбалкиhandleAction() (fish/stop fishing)
CombatActionHandlerme.prskid1000.craftagent.actionОбрабатывает боевые действияhandleAction() (attack/defend)
ActionStateManagerme.prskid1000.craftagent.contextУправляет текущим состоянием действияsetAction(), getActionDescription()
NavigationStateme.prskid1000.craftagent.contextУправляет состоянием навигацииsetTravelingTo(), update(), hasArrived()
LineOfSightProviderme.prskid1000.craftagent.contextОпределяет предметы/сущности/блоки в поле зренияgetItemsInLineOfSight(), getEntitiesInLineOfSight()
WebServerme.prskid1000.craftagent.webВеб-панель с автообновлениемHTTP API endpoints

Обработчики событий

ОбработчикПакетТип событияНазначение
ChatMessageListenerme.prskid1000.craftagent.listenerServerMessageEvents.CHAT_MESSAGEНаправляет сообщения игроков NPC через почту. Поддерживает адресные сообщения (формат: "npcName: message") и широковещательные сообщения
AgeUpdateListenerme.prskid1000.craftagent.listenerServerTickEvents.END_SERVER_TICKОбновляет возраст NPC со временем
LLMProcessingSchedulerme.prskid1000.craftagent.listenerServerTickEvents.END_SERVER_TICKПланирует обработку LLM для NPC
EventListenerRegistererme.prskid1000.craftagent.listener-Регистрирует все обработчики событий

Модели данных

МодельПакетОписаниеКлючевые поля
NPCme.prskid1000.craftagent.modelОсновная структура данных NPCentity, llmClient, history, eventHandler, contextProvider, config
ConversationMessageme.prskid1000.craftagent.historyСообщение истории разговораmessage, role, timestamp
Messageme.prskid1000.craftagent.model.databaseСообщение почтовой системыsenderUuid, recipientUuid, content, read
WorldContextme.prskid1000.craftagent.model.contextСнимок состояния мираstate, inventory, nearbyBlocks, nearbyEntities, memoryData, navigation, lineOfSight, actionState
ContextDatame.prskid1000.craftagent.model.contextСтруктуры данных контекстаBlockData, EntityData, ItemData, InventoryData, StateData, NavigationData, LineOfSightData, ActionStateData

Репозитории

РепозиторийПакетНазначениеКлючевые методы
ConversationRepositoryme.prskid1000.craftagent.database.repositoriesХранение истории разговоровinsert(), selectByUuid()
MessageRepositoryme.prskid1000.craftagent.database.repositoriesХранение почтовой системыinsert(), selectByRecipient(), markAsRead()
PrivateBookPageRepositoryme.prskid1000.craftagent.database.repositoriesПамять конкретного NPCinsert(), selectByUuid()
SharebookRepositoryme.prskid1000.craftagent.database.repositoriesОбщая память между NPCinsert(), selectAll()

Клиенты LLM

КлиентПакетТип LLMКонечная точка API
OllamaClientme.prskid1000.craftagent.llm.ollamaOllama/api/chat
LMStudioClientme.prskid1000.craftagent.llm.lmstudioLM Studio/chat/completions
LLMClientme.prskid1000.craftagent.llmИнтерфейс-

Конфигурация

КонфигПакетРасположение файлаНазначение
BaseConfigme.prskid1000.craftagent.configconfig/craftagent/base.jsonГлобальные настройки (таймаут, радиус чанков и т. д.)
NPCConfigme.prskid1000.craftagent.configconfig/craftagent/npcs/{uuid}.jsonНастройки отдельного NPC (имя, тип LLM, модель и т. д.)
ConfigProviderme.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, модель, характер)

Поля базовой конфигурации

ПолеТипПо умолчаниюОписание
llmTimeoutint30Таймаут запроса к LLM в секундах
contextChunkRadiusint2Радиус сканирования чанков для контекста
contextVerticalScanRangeint16Диапазон вертикального сканирования блоков
maxNearbyBlocksint50Максимум блоков в контексте
maxNearbyEntitiesint10Максимум сущностей в контексте
llmProcessingIntervalint5Секунд между циклами обработки LLM
llmMinIntervalint2Минимум секунд между обработкой NPC
conversationHistoryLengthint5Максимум сообщений диалога до суммаризации
maxMessagesint50Максимум почтовых сообщений на NPC
maxSharebookPagesint20Максимум страниц общей памяти
maxPrivatePagesint20Максимум страниц личной памяти на NPC
lineOfSightMaxRangeint64Максимальная дальность обнаружения по линии взгляда
lineOfSightItemDetectionRangeint32Дальность обнаружения предметов по линии взгляда

Поля конфигурации NPC

ПолеТипПо умолчаниюОписание
npcNameString"Steve"Отображаемое имя
uuidUUIDrandomУникальный идентификатор
isActivebooleantrueАктивен ли NPC
llmTypeLLMTypeLM_STUDIOТип провайдера LLM
llmModelString-Название модели
ollamaUrlString"http://localhost:11434"URL API Ollama
lmStudioUrlString"http://localhost:1234/v1"URL API LM Studio
ageint20Возраст NPC в годах
genderString"neutral"Пол (male/female/neutral)
customSystemPromptString""Пользовательский системный промпт
skipLLMRequestsbooleanfalseЕсли 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 на сервере?

Ставится только в игру; на сервер ставить не нужно

Лицензия и источник
GNU Lesser General Public License v3.0 onlyможно использовать и распространять; изменённые версии — под той же лицензией и с исходным кодом
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее