MudAI — система, в которой искусственный интеллект подключается к настоящей многопользовательской текстовой игре, исследует мир, сражается с монстрами и учится на своём опыте.
Не скрипт. Не бот с жёсткой логикой. Полноценный AI-агент, который читает текст, понимает ситуацию, запоминает мир в графовую базу данных и принимает решения самостоятельно.
MUD (Multi-User Dungeon) — это текстовые многопользовательские RPG, прародители современных MMORPG. Никакой графики — только текст. Ты пишешь команды («идти на север», «атаковать дракона», «выпить зелье»), а сервер описывает происходящее словами.
Эти игры существуют с 1978 года и до сих пор живут. Byliny MUD — русскоязычный мир с сотнями зон, тысячами NPC, магией, боями и экономикой. Полностью текстовый. Полностью в реальном времени. Десятки игроков онлайн.
Задача MudAI — создать AI-агента, который сможет подключиться к такой игре и играть в неё. Не по заранее написанному сценарию, а по-настоящему: читать описания комнат, понимать боевые ситуации, запоминать карту мира, взаимодействовать с NPC и другими игроками.
AI получает именно такой поток текста. Его задача — понять из этого текста что происходит, запомнить важные детали (карту, NPC, лут, опасности) и решить что делать дальше.
Это не Chat-GPT отвечающий на вопросы. Это автономный агент, который живёт в игровом мире 24/7.
AI-чат-бот отвечает на один вопрос и забывает. Игровой AI-агент должен помнить, планировать и действовать непрерывно.
MUD отдаёт только поток текста через Telnet — протокол 1969 года. Нет JSON, нет REST. Сырой текст на русском в кодировке KOI8-R. Его нужно парсить, классифицировать и понимать.
Мир огромный — тысячи комнат, сотни NPC. AI должен помнить карту, опасные зоны, где какие квесты, какие предметы собирал. У LLM нет долговременной памяти — её нужно строить отдельно.
В бою у тебя секунды на реакцию. Пока AI думает — его убивают. Нельзя ставить паузу. Решения должны быть быстрыми и основанными на накопленных знаниях.
Рядом играют живые люди. Они пишут в чат, торгуют, дерутся. AI должен отличать NPC от игрока, понимать социальный контекст и не вести себя как робот.
Это не шахматы с оптимальным ходом. Идти в бой или отступить? Торговать или копить? Исследовать или качаться? AI должен принимать решения в условиях неопределённости.
У LLM ограниченное окно контекста. Нельзя просто скормить ему всю историю за неделю. Нужна система, которая хранит знания отдельно и подаёт нужное в нужный момент.
«Библиотека, не советник.
Спросил — ответила фактами.
Агент сам умный.»
Ключевой принцип архитектуры: LLM обрабатывает сырой текст при поступлении — классифицирует, извлекает сущности, суммирует. Но не даёт советов и не принимает решений. Агент сам запрашивает факты из базы знаний и решает, что делать.
Система состоит из четырёх компонентов, каждый делает свою работу. Вместе они дают AI возможность играть в текстовую игру осмысленно.
Десктопное приложение подключается к MUD-серверу по TCP/Telnet. Принимает сырой текстовый поток, парсит его: определяет где описание комнаты, где результат боя, где чат, где изменение HP. Каждый кусок текста превращается в типизированное событие. Параллельно отображает всё в человеческом интерфейсе с панелями: терминал, карта, статы, инвентарь, чат.
Получает события от клиента по HTTP. Записывает всё в графовую базу данных SurrealDB: комнаты, выходы между ними, NPC, предметы, факты. При получении нового текста вызывает LLM (GPT-5.4) для обогащения: извлекает сущности, классифицирует события, генерирует саммари. Результат — постоянно растущая база знаний о мире.
Это сам искусственный интеллект — Claude, GPT или любая другая модель. Подключается к Game MCP через стандартный протокол Model Context Protocol. Через инструменты (tools) запрашивает: «где я?», «что вокруг?», «какие выходы?», «был ли я здесь раньше?». На основе ответов решает: идти на север, атаковать гоблина или вернуться в город.
Когда агент решает что-то сделать, 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- │ │ совместимая │ │ модель │ └─────────────────────┘
Мы попробовали локальные модели, open-source, API-сервисы. GPT-5.4 дал глубоко положительный результат: точность извлечения сущностей из русского текста, надёжность structured output, скорость. В MudAI OpenAI используется в трёх местах — и каждое критично.
Каждый кусок текста из MUD проходит через LLM-классификатор. Модель определяет: это описание комнаты? Результат боя? Сообщение в чат? Изменение состояния?
Это не просто regex. Русский текст со склонениями, архаизмами, авторскими описаниями — классический NLP здесь ломается. GPT-5.4 понимает контекст.
Из текстового описания комнаты, NPC или предмета модель вытаскивает структурированные данные: имена, характеристики, связи, опасность.
Используем Structured Output через zodResponseFormat — модель возвращает не свободный текст, а строго типизированный JSON, соответствующий Zod-схеме. Невалидный ответ невозможен на уровне API.
Длинные эпизоды (серия боёв, квестовый диалог, путешествие по зоне) превращаются в компактные саммари с ключевыми фактами.
Саммари сохраняется в граф знаний как graph_fact с массивом key_facts и списком entities_mentioned. Агент позже может найти их через семантический поиск.
Все факты, записи и саммари векторизуются через text-embedding-3-large. Это даёт агенту возможность искать не по точным словам, а по смыслу.
Агент спрашивает «где найти кожу для крафта?» — система находит записи про гоблинов с кожаным дропом, хотя слово «кожа» в тексте может и не встречаться.
Отдельный Docker-контейнер, который модерирует и обогащает граф знаний. Проверяет консистентность, дедуплицирует записи, строит связи между сущностями.
Работает асинхронно: не блокирует основной игровой поток. Получает задачи через очередь и обрабатывает их в фоне.
Если OpenAI API недоступен — система не падает. Парсеры продолжают работать, события записываются в граф, агент может играть. Просто без LLM-обогащения: сырые данные вместо enriched.
Когда API возвращается — накопленные необработанные события обогащаются ретроактивно. Никакие данные не теряются.
MudAI использует не один, а два MCP-сервера. Game MCP отвечает за игровой мир. ANIMA Brain MCP отвечает за сам разум AI-агента: его память, решения, ошибки, continuity между сессиями. Это принципиально разные слои.
Комнаты, NPC, предметы, бой, навигация. Граф знаний конкретного MUD. Инструменты для действий в игре.
Память, решения, ошибки, задачи, цели, рефлексия. Continuity между сессиями. Работает с любым проектом, не только с MUD.
AI-модели не имеют долговременной памяти. Каждая сессия — с нуля. ANIMA Brain решает эту проблему: агент сохраняет знания, решения и опыт между сессиями.
Если контекст модели сжимается (context window overflow), если сессия обрывается, если переключается задача — ANIMA восстанавливает thread. Агент не теряет нить.
MudAI разрабатывается несколькими AI-агентами одновременно (Claude, GPT, Codex). ANIMA Brain координирует их: общая память, inbox, передача задач.
Агент не просто реагирует на текст — у него есть цели. ANIMA отслеживает задачи, приоритеты, декомпозицию и прогресс. Если агент отвлекается — Brain напоминает о главном.
После каждого значимого действия агент может отрефлексировать: что получилось, что нет, что нужно запомнить. Не просто log — осмысленный анализ.
ANIMA Brain предоставляет больше 100 MCP-инструментов для когнитивных операций. Это не игровые инструменты — это инструменты мышления.
Каждое крупное решение в MudAI было принято осознанно, с trade-off анализом. Вот ключевые — и почему мы выбрали именно так.
Когда текст приходит из MUD, он проходит через LLM один раз — при обработке. Результат сохраняется в граф. Когда агент спрашивает «что вокруг?» — ему мгновенно возвращаются готовые данные из базы, без LLM-вызова.
Альтернатива — запускать LLM при каждом запросе агента. Это было бы в 10-100x дороже и медленнее. В бою, когда решения нужны за секунды, это неприемлемо.
Один LLM-вызов при ingestion стоит ~$0.01 и занимает ~1с. Один вызов при каждом query — это 5-10 запросов за ход × тысячи ходов в день. Разница: $5/день vs $500/день.
Первая версия имела tool suggest-action, который возвращал «рекомендую идти на север, риск низкий». Мы это убрали. Полностью.
Game MCP — это энциклопедия. Агент спрашивает: «что я знаю об этом NPC?» — получает факты. «Где я был?» — получает маршрут. «Какие здесь выходы?» — получает список. Но никаких «ты должен делать X».
Если MCP советует — агент перестаёт думать. Он превращается в executor чужих решений. А наша цель — автономный агент, который учится сам. Факты — да. Советы — нет.
Game MCP знает про Byliny MUD. ANIMA Brain знает про самого агента. Это разные ответственности. Завтра мы подключим агента к другой игре — Game MCP меняется, Brain остаётся. Или подключим Brain к coding-задаче — Game MCP вообще не нужен.
Разделение позволяет переиспользовать оба слоя независимо. Brain — универсальная когнитивная платформа. Game MCP — адаптер под конкретный домен.
Монолитный сервер с 200 tools — непонятен ни модели, ни разработчику. Два сервера по 30-100 tools с чёткой ответственностью — прозрачны и заменяемы.
Игровой мир — это граф. Комната связана с комнатами через выходы. NPC находится в комнате. Предмет лежит в комнате или в инвентаре NPC. Факт относится к зоне. Эпизод произошёл в комнате с участием NPC.
В реляционной базе каждая связь — это JOIN. В графовой — это один шаг по ребру. Запрос «найди путь из комнаты A в комнату B» — естественная операция графа, кошмар для SQL.
SurrealDB ещё и embedded — работает внутри процесса Game MCP без внешнего сервера. Один бинарник, zero ops. Плюс нативная поддержка document + graph модели.
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 из коробки.
LLM может вернуть что угодно. «Извини, я не могу...», JSON с лишними полями, текст вместо числа. В игровом контексте это фатально — один невалидный ответ ломает весь пайплайн.
Мы используем OpenAI zodResponseFormat — передаём Zod-схему в API, и модель гарантированно возвращает JSON, соответствующий типам. На уровне API, не на уровне «попросили и надеемся».
Одна и та же Zod-схема валидирует: вход MCP-tool'а, ответ LLM, запись в SurrealDB. Один source of truth для типов через весь стек.
AI играет текстом. Но человек наблюдает визуально. Electron-клиент — это окно в мир AI: панели с картой, статами, боем, чатом, инвентарём. Человек видит что делает агент и может вмешаться.
Плюс Electron обрабатывает Telnet, парсит текст, генерирует события — это не просто UI, это middleware. Перенос парсинга на клиент разгружает MCP-сервер.
Без визуализации отладка AI-агента — это чтение логов. С Electron — ты видишь что агент видит, в реальном времени. Debug time сократился на порядок.
Что происходит, когда из MUD приходит новый текст? Вот полный путь — от сырого байта до записи в графе знаний.
Electron принимает поток байтов через TCP-соединение с MUD. Кодировка — KOI8-R (стандарт русских MUD). Декодер конвертирует в UTF-8. MCCP-декомпрессор обрабатывает сжатие, если включено.
6 специализированных парсеров разбирают текст: room-parser, combat-parser, chat-parser, economy-parser, effect-parser, system-parser. Каждый парсер знает свой формат и генерирует типизированное событие. GMCP-пакеты парсятся отдельно через protocol-aware router.
События накапливаются в батч и отправляются в Game MCP через POST /ingest/events. Bounded retry с exponential backoff — если MCP временно недоступен, батч не теряется и повторяется.
GPT-5.4 обрабатывает каждое событие: Classifier определяет тип, Extractor вытаскивает сущности, Summarizer генерирует саммари с key_facts[]. Всё через zodResponseFormat — невалидный ответ невозможен.
Результат записывается в граф: room, npc, item обновляются, graph_fact добавляется с confidence score, episode_event фиксируется в журнале. Связи между сущностями создаются автоматически. Visit counter увеличивается.
AI-агент не видит игру напрямую. Всё взаимодействие происходит через инструменты (MCP tools) — типизированные команды с входом и выходом. Вот что ему доступно:
MUD-боты существуют давно. MudAI — принципиально другой подход.
| Обычный MUD-бот | MudAI | |
|---|---|---|
| Принятие решений | Жёсткие правила (if/else) | AI-модель принимает решения |
| Понимание текста | Regex-паттерны | LLM извлекает смысл |
| Память | Переменные в скрипте | Графовая база знаний |
| Адаптация | Ломается при изменении текста | Понимает по смыслу |
| Новые ситуации | Не умеет | Рассуждает и пробует |
| Масштабируемость | Каждый скрипт вручную | Одна модель на всё |
| Заменяемость «мозга» | Привязан к конкретному коду | Любой MCP-клиент |