Open Source Project

AI играет
в текстовую MMO

MudAI — система, в которой искусственный интеллект подключается к настоящей многопользовательской текстовой игре, исследует мир, сражается с монстрами и учится на своём опыте.

Не скрипт. Не бот с жёсткой логикой. Полноценный AI-агент, который читает текст, понимает ситуацию, запоминает мир в графовую базу данных и принимает решения самостоятельно.

↓ Узнать больше

Что такое MUD и при чём тут AI

MUD (Multi-User Dungeon) — это текстовые многопользовательские RPG, прародители современных MMORPG. Никакой графики — только текст. Ты пишешь команды («идти на север», «атаковать дракона», «выпить зелье»), а сервер описывает происходящее словами.

Эти игры существуют с 1978 года и до сих пор живут. Byliny MUD — русскоязычный мир с сотнями зон, тысячами NPC, магией, боями и экономикой. Полностью текстовый. Полностью в реальном времени. Десятки игроков онлайн.

Задача MudAI — создать AI-агента, который сможет подключиться к такой игре и играть в неё. Не по заранее написанному сценарию, а по-настоящему: читать описания комнат, понимать боевые ситуации, запоминать карту мира, взаимодействовать с NPC и другими игроками.

--- Так выглядит текст из MUD ---

Южные ворота Киева
Массивные дубовые ворота, окованные железом, преграждают путь на юг.
Двое стражников стоят по обе стороны прохода.
Выходы: север, юг, восток.

> осмотреть стражника

Крепкий воин в кольчуге. Уровень: 15. Он выглядит очень сильным.
Стражник посмотрел на вас подозрительно.

AI получает именно такой поток текста. Его задача — понять из этого текста что происходит, запомнить важные детали (карту, NPC, лут, опасности) и решить что делать дальше.

Это не Chat-GPT отвечающий на вопросы. Это автономный агент, который живёт в игровом мире 24/7.

Почему это сложно

AI-чат-бот отвечает на один вопрос и забывает. Игровой AI-агент должен помнить, планировать и действовать непрерывно.

📖

Нет API у игры

MUD отдаёт только поток текста через Telnet — протокол 1969 года. Нет JSON, нет REST. Сырой текст на русском в кодировке KOI8-R. Его нужно парсить, классифицировать и понимать.

🧠

Нужна память

Мир огромный — тысячи комнат, сотни NPC. AI должен помнить карту, опасные зоны, где какие квесты, какие предметы собирал. У LLM нет долговременной памяти — её нужно строить отдельно.

Реальное время

В бою у тебя секунды на реакцию. Пока AI думает — его убивают. Нельзя ставить паузу. Решения должны быть быстрыми и основанными на накопленных знаниях.

🌍

Многопользовательский мир

Рядом играют живые люди. Они пишут в чат, торгуют, дерутся. AI должен отличать NPC от игрока, понимать социальный контекст и не вести себя как робот.

🎲

Нет правильного ответа

Это не шахматы с оптимальным ходом. Идти в бой или отступить? Торговать или копить? Исследовать или качаться? AI должен принимать решения в условиях неопределённости.

🔄

Контекст теряется

У LLM ограниченное окно контекста. Нельзя просто скормить ему всю историю за неделю. Нужна система, которая хранит знания отдельно и подаёт нужное в нужный момент.

«Библиотека, не советник.
Спросил — ответила фактами.
Агент сам умный.»

Ключевой принцип архитектуры: LLM обрабатывает сырой текст при поступлении — классифицирует, извлекает сущности, суммирует. Но не даёт советов и не принимает решений. Агент сам запрашивает факты из базы знаний и решает, что делать.

Как это работает

Система состоит из четырёх компонентов, каждый делает свою работу. Вместе они дают AI возможность играть в текстовую игру осмысленно.

4
Компонента
30+
MCP-инструментов
5
Типов парсеров
Граф знаний
1

Electron Client — глаза и руки

Десктопное приложение подключается к MUD-серверу по TCP/Telnet. Принимает сырой текстовый поток, парсит его: определяет где описание комнаты, где результат боя, где чат, где изменение HP. Каждый кусок текста превращается в типизированное событие. Параллельно отображает всё в человеческом интерфейсе с панелями: терминал, карта, статы, инвентарь, чат.

2

Game MCP Server — мозг памяти

Получает события от клиента по HTTP. Записывает всё в графовую базу данных SurrealDB: комнаты, выходы между ними, NPC, предметы, факты. При получении нового текста вызывает LLM (GPT-5.4) для обогащения: извлекает сущности, классифицирует события, генерирует саммари. Результат — постоянно растущая база знаний о мире.

3

AI Agent — тот, кто играет

Это сам искусственный интеллект — Claude, GPT или любая другая модель. Подключается к Game MCP через стандартный протокол Model Context Protocol. Через инструменты (tools) запрашивает: «где я?», «что вокруг?», «какие выходы?», «был ли я здесь раньше?». На основе ответов решает: идти на север, атаковать гоблина или вернуться в город.

4

Обратная связь — замкнутый цикл

Когда агент решает что-то сделать, Game MCP отправляет команду обратно в Electron Client через HTTP callback. Клиент отправляет текстовую команду в MUD. MUD отвечает текстом. Клиент парсит ответ. Новые события идут в Game MCP. Цикл замыкается. Агент видит результат своих действий и корректирует поведение.

Архитектура системы

Четыре компонента общаются по простым HTTP/SSE протоколам. Никаких проприетарных шин — всё прозрачно и заменяемо.

┌──────────────────┐          TCP/Telnet          ┌──────────────────────┐
│   Byliny MUD     │◄──────────────────────────►│   Electron Client    │
│   (игровой       │    KOI8-R, GMCP, MCCP     │   React + Dockview   │
│    сервер)        │                            │   Парсеры + UI       │
└──────────────────┘                            └──────────┬───────────┘
                                                           
                                          events ──► POST /ingest/events
                                          status ──► POST /status/connection
                                          push   ◄── GET  /events/stream (SSE)
                                          cmds   ◄── POST /commands (callback)
                                                           
                                                  ┌────────▼───────────┐
                                                  │   Game MCP Server  │
                                                  │   ─────────────    │
                                                  │   Hono HTTP API    │
                                                  │   SurrealDB (граф) │
                                                  │   GPT-5.4 (LLM)   │
                                                  │   30+ MCP tools    │
                                                  └────────┬───────────┘
                                                           
                                                   MCP over HTTP/SSE
                                                   (стандартный протокол)
                                                           
                                                  ┌────────▼───────────┐
                                                  │    AI Agent         │
                                                  │    ─────────────    │
                                                  │    Claude / GPT /   │
                                                  │    любая MCP-       │
                                                  │    совместимая      │
                                                  │    модель           │
                                                  └─────────────────────┘
Стрелки показывают направление данных. Все протоколы — открытые.

Почему OpenAI

Мы попробовали локальные модели, open-source, API-сервисы. GPT-5.4 дал глубоко положительный результат: точность извлечения сущностей из русского текста, надёжность structured output, скорость. В MudAI OpenAI используется в трёх местах — и каждое критично.

🔬 Классификация событий gpt-5.4

Каждый кусок текста из MUD проходит через LLM-классификатор. Модель определяет: это описание комнаты? Результат боя? Сообщение в чат? Изменение состояния?

Это не просто regex. Русский текст со склонениями, архаизмами, авторскими описаниями — классический NLP здесь ломается. GPT-5.4 понимает контекст.

input: "Стражник замахнулся мечом и нанёс вам тяжёлый удар!"
→ classification: "combat"
→ entities: [{type:"npc", name:"Стражник"}, {type:"action", value:"attack"}]
→ severity: "high"

🧩 Извлечение сущностей gpt-5.4

Из текстового описания комнаты, NPC или предмета модель вытаскивает структурированные данные: имена, характеристики, связи, опасность.

Используем Structured Output через zodResponseFormat — модель возвращает не свободный текст, а строго типизированный JSON, соответствующий Zod-схеме. Невалидный ответ невозможен на уровне API.

input: "Старый торговец Ибрагим сидит за прилавком..."
→ {name:"Ибрагим", role:"merchant", level_hint:"low",
   sells:true, aggression:"none", dialogue:true}

📝 Суммаризация в знания gpt-5.4

Длинные эпизоды (серия боёв, квестовый диалог, путешествие по зоне) превращаются в компактные саммари с ключевыми фактами.

Саммари сохраняется в граф знаний как graph_fact с массивом key_facts и списком entities_mentioned. Агент позже может найти их через семантический поиск.

input: [серия из 12 событий в Тёмном лесу]
→ summary: "Тёмный лес за южными воротами. 3 гоблина lvl 5-7,
   drop: кожаный пояс, мелкие монеты. Безопасный путь: восток."
→ key_facts: ["гоблины lvl 5-7", "drop кожаный пояс", "путь восток безопасен"]

🔍 Семантический поиск text-embedding-3-large

Все факты, записи и саммари векторизуются через text-embedding-3-large. Это даёт агенту возможность искать не по точным словам, а по смыслу.

Агент спрашивает «где найти кожу для крафта?» — система находит записи про гоблинов с кожаным дропом, хотя слово «кожа» в тексте может и не встречаться.

query: "опасные зоны для низкого уровня"
→ top-3 results by cosine similarity:
   1. fact: "Кладбище — нежить lvl 10+" (0.89)
   2. fact: "Подземелья Киева — тьма, lvl 15+" (0.85)
   3. fact: "Тёмный лес — гоблины lvl 5-7" (0.78)

📊 Graph Analyst (Sidecar) gpt-5.4

Отдельный Docker-контейнер, который модерирует и обогащает граф знаний. Проверяет консистентность, дедуплицирует записи, строит связи между сущностями.

Работает асинхронно: не блокирует основной игровой поток. Получает задачи через очередь и обрабатывает их в фоне.

job: {type:"enrichment", entity:"room:south-gate"}
→ enriched: added edges to npc:guard-1, npc:guard-2
→ detected: duplicate room "Южные ворота" merged
→ confidence: 0.94

🛡️ Graceful Degradation

Если OpenAI API недоступен — система не падает. Парсеры продолжают работать, события записываются в граф, агент может играть. Просто без LLM-обогащения: сырые данные вместо enriched.

Когда API возвращается — накопленные необработанные события обогащаются ретроактивно. Никакие данные не теряются.

Два MCP — два уровня интеллекта

MudAI использует не один, а два MCP-сервера. Game MCP отвечает за игровой мир. ANIMA Brain MCP отвечает за сам разум AI-агента: его память, решения, ошибки, continuity между сессиями. Это принципиально разные слои.

GAME MCP

Мир игры

Комнаты, NPC, предметы, бой, навигация. Граф знаний конкретного MUD. Инструменты для действий в игре.

+
ANIMA BRAIN

Разум агента

Память, решения, ошибки, задачи, цели, рефлексия. Continuity между сессиями. Работает с любым проектом, не только с MUD.

🧠 Persistent Memory

AI-модели не имеют долговременной памяти. Каждая сессия — с нуля. ANIMA Brain решает эту проблему: агент сохраняет знания, решения и опыт между сессиями.

  • Рабочая память (текущая сессия)
  • Долговременные знания (подтверждённые факты)
  • Решения с обоснованием
  • Журнал ошибок с правилами предотвращения
  • Checkpoints для восстановления

🎯 Continuity

Если контекст модели сжимается (context window overflow), если сессия обрывается, если переключается задача — ANIMA восстанавливает thread. Агент не теряет нить.

  • Bootstrap при каждом старте сессии
  • Checkpoint save каждые N действий
  • Interrupt recovery при обрыве
  • Context compaction без потери данных
  • Resume из любой точки

🤝 Multi-Agent Coordination

MudAI разрабатывается несколькими AI-агентами одновременно (Claude, GPT, Codex). ANIMA Brain координирует их: общая память, inbox, передача задач.

  • Межагентные сообщения
  • Shared knowledge layer
  • Delivery lifecycle (claim → execute → complete)
  • Дедупликация работы

📋 Task & Goal Management

Агент не просто реагирует на текст — у него есть цели. ANIMA отслеживает задачи, приоритеты, декомпозицию и прогресс. Если агент отвлекается — Brain напоминает о главном.

  • Цели (strategic / session / task)
  • Декомпозиция через HTN
  • Priority scoring
  • Reminders и due-dates
  • Quality gates перед завершением

🔬 Reflection & Learning

После каждого значимого действия агент может отрефлексировать: что получилось, что нет, что нужно запомнить. Не просто log — осмысленный анализ.

  • Hypothesis → test → verdict
  • Decision log с reasoning
  • Mistake log с prevention rules
  • Episode recall (похожие ситуации)
  • Competence & uncertainty estimation

🏗️ 100+ Cognitive Tools

ANIMA Brain предоставляет больше 100 MCP-инструментов для когнитивных операций. Это не игровые инструменты — это инструменты мышления.

  • Knowledge CRUD + semantic search
  • Graph queries + causal trace
  • Workflow engine + quality gates
  • Markdown document memory
  • Context snapshots + forgetting policy

Архитектурные решения

Каждое крупное решение в MudAI было принято осознанно, с trade-off анализом. Вот ключевые — и почему мы выбрали именно так.

LLM при ingestion, не при запросе

Когда запускать дорогой GPT-вызов?

Когда текст приходит из MUD, он проходит через LLM один раз — при обработке. Результат сохраняется в граф. Когда агент спрашивает «что вокруг?» — ему мгновенно возвращаются готовые данные из базы, без LLM-вызова.

Альтернатива — запускать LLM при каждом запросе агента. Это было бы в 10-100x дороже и медленнее. В бою, когда решения нужны за секунды, это неприемлемо.

Почему это важно:

Один LLM-вызов при ingestion стоит ~$0.01 и занимает ~1с. Один вызов при каждом query — это 5-10 запросов за ход × тысячи ходов в день. Разница: $5/день vs $500/день.

Библиотека, не советник

Должен ли MCP давать агенту советы?

Первая версия имела tool suggest-action, который возвращал «рекомендую идти на север, риск низкий». Мы это убрали. Полностью.

Game MCP — это энциклопедия. Агент спрашивает: «что я знаю об этом NPC?» — получает факты. «Где я был?» — получает маршрут. «Какие здесь выходы?» — получает список. Но никаких «ты должен делать X».

Почему это важно:

Если MCP советует — агент перестаёт думать. Он превращается в executor чужих решений. А наша цель — автономный агент, который учится сам. Факты — да. Советы — нет.

Два MCP-сервера: Game + Brain

Почему не один большой сервер?

Game MCP знает про Byliny MUD. ANIMA Brain знает про самого агента. Это разные ответственности. Завтра мы подключим агента к другой игре — Game MCP меняется, Brain остаётся. Или подключим Brain к coding-задаче — Game MCP вообще не нужен.

Разделение позволяет переиспользовать оба слоя независимо. Brain — универсальная когнитивная платформа. Game MCP — адаптер под конкретный домен.

Почему это важно:

Монолитный сервер с 200 tools — непонятен ни модели, ни разработчику. Два сервера по 30-100 tools с чёткой ответственностью — прозрачны и заменяемы.

Графовая база вместо реляционной

Почему SurrealDB, а не PostgreSQL?

Игровой мир — это граф. Комната связана с комнатами через выходы. NPC находится в комнате. Предмет лежит в комнате или в инвентаре NPC. Факт относится к зоне. Эпизод произошёл в комнате с участием NPC.

В реляционной базе каждая связь — это JOIN. В графовой — это один шаг по ребру. Запрос «найди путь из комнаты A в комнату B» — естественная операция графа, кошмар для SQL.

Почему это важно:

SurrealDB ещё и embedded — работает внутри процесса Game MCP без внешнего сервера. Один бинарник, zero ops. Плюс нативная поддержка document + graph модели.

MCP как единый протокол

Почему не REST API?

Model Context Protocol — открытый стандарт от Anthropic. Любая MCP-совместимая модель (Claude, GPT, Gemini, Llama, Mistral) может подключиться без адаптера. Это не привязка к вендору — это привязка к стандарту.

Завтра выйдет GPT-6 — он подключится к нашему Game MCP через тот же протокол. Без изменения кода. Без адаптеров. Plug and play.

Почему это важно:

REST API нужен был бы отдельный клиент под каждую модель. MCP — один сервер, любой клиент. Плюс MCP поддерживает streaming, tool discovery и structured schemas из коробки.

Structured Output через Zod

Как гарантировать формат ответа LLM?

LLM может вернуть что угодно. «Извини, я не могу...», JSON с лишними полями, текст вместо числа. В игровом контексте это фатально — один невалидный ответ ломает весь пайплайн.

Мы используем OpenAI zodResponseFormat — передаём Zod-схему в API, и модель гарантированно возвращает JSON, соответствующий типам. На уровне API, не на уровне «попросили и надеемся».

Почему это важно:

Одна и та же Zod-схема валидирует: вход MCP-tool'а, ответ LLM, запись в SurrealDB. Один source of truth для типов через весь стек.

Electron, а не терминал

Зачем GUI если AI играет текстом?

AI играет текстом. Но человек наблюдает визуально. Electron-клиент — это окно в мир AI: панели с картой, статами, боем, чатом, инвентарём. Человек видит что делает агент и может вмешаться.

Плюс Electron обрабатывает Telnet, парсит текст, генерирует события — это не просто UI, это middleware. Перенос парсинга на клиент разгружает MCP-сервер.

Почему это важно:

Без визуализации отладка AI-агента — это чтение логов. С Electron — ты видишь что агент видит, в реальном времени. Debug time сократился на порядок.

Ingestion Pipeline

Что происходит, когда из MUD приходит новый текст? Вот полный путь — от сырого байта до записи в графе знаний.

📡

TCP Socket → Raw Bytes

Electron принимает поток байтов через TCP-соединение с MUD. Кодировка — KOI8-R (стандарт русских MUD). Декодер конвертирует в UTF-8. MCCP-декомпрессор обрабатывает сжатие, если включено.

🔍

Parsers → Typed Events

6 специализированных парсеров разбирают текст: room-parser, combat-parser, chat-parser, economy-parser, effect-parser, system-parser. Каждый парсер знает свой формат и генерирует типизированное событие. GMCP-пакеты парсятся отдельно через protocol-aware router.

📤

Event Sender → Batch POST

События накапливаются в батч и отправляются в Game MCP через POST /ingest/events. Bounded retry с exponential backoff — если MCP временно недоступен, батч не теряется и повторяется.

🧠

LLM Enrichment → Structured Facts

GPT-5.4 обрабатывает каждое событие: Classifier определяет тип, Extractor вытаскивает сущности, Summarizer генерирует саммари с key_facts[]. Всё через zodResponseFormat — невалидный ответ невозможен.

💾

SurrealDB → Knowledge Graph

Результат записывается в граф: room, npc, item обновляются, graph_fact добавляется с confidence score, episode_event фиксируется в журнале. Связи между сущностями создаются автоматически. Visit counter увеличивается.

Что может агент

AI-агент не видит игру напрямую. Всё взаимодействие происходит через инструменты (MCP tools) — типизированные команды с входом и выходом. Вот что ему доступно:

ЗНАНИЯ Запросить информацию

  • situation — полный срез: комната, NPC, бой, выходы
  • query-knowledge — поиск по базе: «что я знаю о драконах?»
  • semantic-search — поиск по смыслу, не по словам
  • history — что происходило последние N ходов
  • where-have-i-been — посещённые комнаты и маршрут
  • remember — записать заметку в базу
  • journal — журнал событий с фильтрами

ДЕЙСТВИЯ Сделать что-то в игре

  • send-command — любая текстовая команда в MUD
  • move-direction — идти: север, юг, восток...
  • cast-spell — колдовать заклинание
  • use-skill — использовать навык
  • say-text — сказать текст в игре
  • look — осмотреться
  • take-item — взять предмет

СТАТУС Состояние персонажа

  • get-stats — HP, мана, опыт, уровень
  • get-inventory — содержимое инвентаря
  • get-effects — баффы и дебаффы
  • get-combat-status — состояние боя
  • get-connection — подключён ли к серверу

МИР Навигация и карта

  • list-exits — выходы из текущей комнаты
  • get-area-map — карта зоны из графа
  • find-path — маршрут между комнатами
  • get-entity-info — подробности о NPC или предмете

Чем это отличается от бота

MUD-боты существуют давно. MudAI — принципиально другой подход.

Обычный MUD-ботMudAI
Принятие решенийЖёсткие правила (if/else)AI-модель принимает решения
Понимание текстаRegex-паттерныLLM извлекает смысл
ПамятьПеременные в скриптеГрафовая база знаний
АдаптацияЛомается при изменении текстаПонимает по смыслу
Новые ситуацииНе умеетРассуждает и пробует
МасштабируемостьКаждый скрипт вручнуюОдна модель на всё
Заменяемость «мозга»Привязан к конкретному кодуЛюбой MCP-клиент

Технологии под капотом

Клиент
Electron + React
UI-панели
Dockview
HTTP-сервер
Hono
Граф-база
SurrealDB
LLM
GPT-5.4 (OpenAI)
Эмбеддинги
text-embedding-3-large
Протокол
MCP (Anthropic)
Валидация
Zod
Язык
TypeScript
Сборка
electron-vite
Состояние
Zustand
Оркестрация
Docker Compose

Частые вопросы

Это реально работает?
Система в активной разработке. Клиент подключается к серверу, парсеры работают, Game MCP принимает события, граф строится, LLM обогащает данные. AI-агент уже может подключиться через MCP и использовать инструменты.
Зачем использовать LLM для обработки текста, а не просто regex?
Regex работает для 80% случаев и используется для первичного парсинга. Но MUD-текст непредсказуем: русский язык, склонения, вариации описаний. LLM понимает смысл там, где regex ломается. При этом LLM работает при обработке, а не при запросе — агент получает уже готовые структурированные данные мгновенно.
Почему MCP, а не просто API?
Model Context Protocol — открытый стандарт от Anthropic для подключения AI-моделей к инструментам. Это значит: любая MCP-совместимая модель (Claude, GPT, Llama) может подключиться к Game MCP без адаптеров. Завтра выйдет новая модель — она сразу сможет играть.
Может ли AI играть лучше человека?
Пока нет, и вряд ли скоро сможет. Человек обладает интуицией, социальными навыками и годами опыта в MUD. AI пока учится базовым вещам: не заблудиться, не погибнуть, понять кто враг. Но он не спит, не устаёт и может играть 24/7 — а это даёт свои преимущества.
Это вообще законно?
Это исследовательский проект. Мы не нарушаем правила конкретных серверов — это среда для экспериментов с AI-агентами в сложных текстовых средах. MUD — идеальный полигон: достаточно сложный для challenge, но достаточно структурированный для прогресса.
Можно ли подключить к другому MUD?
Архитектура не привязана к конкретной игре. Парсеры нужно будет адаптировать под текстовый формат другого MUD, но Game MCP, граф знаний и MCP-интерфейс для агента — универсальные.