10 KiB
fast-rlm MCP HTTP integration with Balda
Цель
Дать Балде (balda-agent-valera-1) инструмент рекурсивного сжатия контекста (RLM) через MCP HTTP сервер в отдельном Docker контейнере.
Контекст
- Хост: Eagle (Mac M4), Docker Desktop arm64
- Балда: контейнер
balda-agent-valera-1, compose в/Users/admin/Docker/balda-agent/ - Конфиг Балды:
/Users/admin/Docker/balda-agent/.config/balda/config.yaml - Текущие MCP у Балды: только
obsidian(SSE,http://obsidian-mcp:3101) - fast-rlm (avbiswas/fast-rlm): Python библиотека, MCP клиент (не сервер). CLI команды
serveНЕ существует. - Docker tooling на хосте: только
docker-composev1, v2 plugin отсутствует.
Провайдер LLM
fast-rlm использует OpenAI-совместимый клиент (через переменные OPENAI_API_KEY + OPENAI_BASE_URL). Для консистентности с Балдой и Whale используем DeepSeek как у самой Балды:
OPENAI_BASE_URL=https://api.deepseek.com/v1OPENAI_API_KEY=<значение DEEPSEEK_API_KEY>(берём из/Users/admin/Docker/balda-agent/.env)- Дефолтная модель в
server.py:deepseek-chat RLMConfig(primary_agent="deepseek-chat", sub_agent="deepseek-chat", ...)
Подтверждённый API fast-rlm
- Top-level:
dir(fast_rlm) = ['RLMConfig', 'run'] - Импорт:
from fast_rlm import RLMConfig(НЕfrom fast_rlm.config import RLMConfig— этот путь не существует) - Сигнатура:
fast_rlm.run(query, prefix, config, verbose, output_schema, tools, env_variables, mcp_servers, llm_kwargs)→ возвращает dict с ключомresults - Дефолты
RLMConfig:primary_agent='z-ai/glm-5',sub_agent='minimax/minimax-m2.5',max_depth=3,max_money_spent=0.2,truncate_len=2000. Мы их переопределяем наdeepseek-chat. - fast-rlm требует Deno (для Pyodide REPL) — ставится в Dockerfile.
Архитектура
fast-rlm — это библиотека (import fast_rlm; fast_rlm.run(...)). Чтобы Балда могла её использовать через MCP, нужна обёртка — отдельный сервис, который экспонирует fast_rlm.run() как MCP tool через HTTP-транспорт.
┌──────────────────┐ MCP HTTP ┌──────────────────────┐
│ balda-agent │ ──────────────────► │ fast-rlm-mcp │
│ (Hermes) │ POST /mcp │ FastMCP + mcp[cli] │
└──────────────────┘ │ ↓ in-process │
│ fast_rlm.run(...) │
└──────────────────────┘
Обёртка экспонирует один MCP tool: recursive_context_compress(text, model, budget).
Файлы (создать)
/Users/admin/Docker/fast-rlm-mcp/Dockerfile—python:3.12-slim+ Deno + fast-rlm + mcp[cli] + uvicorn/Users/admin/Docker/fast-rlm-mcp/server.py— MCP HTTP сервер (FastMCP, transportstreamable-http, port 3333)/Users/admin/Docker/fast-rlm-mcp/docker-compose.yaml— сервисfast-rlm-mcp, порт 3333, в сетиbalda_defaultexternal/Users/admin/Docker/fast-rlm-mcp/requirements.txt—fast-rlm,mcp[cli]>=1.2,uvicorn[standard]/Users/admin/Docker/fast-rlm-mcp/.env—OPENAI_API_KEY=<DEEPSEEK_API_KEY value>,OPENAI_BASE_URL=https://api.deepseek.com/v1,FAST_RLM_DEFAULT_MODEL=deepseek-chat. Chmod 600.
Изменения существующих файлов
/Users/admin/Docker/balda-agent/.config/balda/config.yaml — добавить:
mcp_servers:
obsidian:
type: sse
url: http://obsidian-mcp:3101
name: obsidian
fast-rlm:
type: http
url: http://fast-rlm-mcp:3333/mcp
name: fast-rlm
Шаги выполнения (каждый шаг = реальная проверка)
1. Подтвердить API fast-rlm
- Действие:
docker run --rm python:3.12-slim sh -c "pip install fast-rlm -q && python -c 'import fast_rlm; help(fast_rlm.run)'" - Проверка: есть функция
fast_rlm.run(...)с задокументированной сигнатурой. Импортfrom fast_rlm import RLMConfigработает. - Статус: ✅ Сделано.
2. Создать структуру обёртки
- Действие:
mkdir -p /Users/admin/Docker/fast-rlm-mcp/, написать 5 файлов (Dockerfile, server.py, docker-compose.yaml, requirements.txt, .env). - Проверка:
ls -la /Users/admin/Docker/fast-rlm-mcp/показывает все 5 файлов с ненулевым размером.
3. Собрать образ
- Действие:
cd /Users/admin/Docker/fast-rlm-mcp && docker-compose build(v1, не v2!) - Проверка:
docker images | grep fast-rlm-mcp— образ присутствует. Сборка завершилась без ошибок.
4. Запустить контейнер
- Действие:
docker-compose up -d - Проверка:
docker ps --format '{{.Names}}\t{{.Status}}' | grep fast-rlm-mcp— статусUp.docker logs --tail 50 fast-rlm-mcp— безTraceback/Error.
5. Smoke-тест HTTP MCP endpoint
- Действие:
curl -sS -X POST http://localhost:3333/mcp -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' - Проверка: JSON-ответ HTTP 200, в массиве
toolsестьrecursive_context_compress.
6. Подключить к сети Балды
- Действие: убедиться что контейнер в одной docker-сети с
balda-agent-valera-1(сетьbalda_default, external). - Проверка:
docker network inspect balda_defaultпоказывает оба контейнера. Из Балды:docker exec balda-agent-valera-1 wget -qO- http://fast-rlm-mcp:3333/mcpотвечает.
7. Обновить config.yaml Балды
- Действие: добавить секцию
fast-rlmвmcp_servers. - Проверка:
grep -A3 fast-rlm config.yamlпоказывает запись. YAML парсится.
8. Перезапустить Балду
- Действие:
cd /Users/admin/Docker/balda-agent && docker-compose restart - Проверка:
docker logs --since 60s balda-agent-valera-1→ "MCP server connected: fast-rlm". БезFailed. Балда онлайн в Zulip.
9. End-to-end smoke test
- Действие: в Zulip Балде дать задачу с явным использованием fast-rlm.
- Проверка: в логах Балды виден вызов tool
recursive_context_compress. Возвращается результат. Без ошибок.
Откат
cd /Users/admin/Docker/fast-rlm-mcp && docker-compose down + убрать entry из config.yaml + restart Балды → состояние до начала.
Признанные галлюцинации в этой сессии
- msg 58792-58795: фабрикация "Container Started / Ready" — реально ничего не создавалось.
- Утверждение что
fast-rlm serve --port 3333существует — такой команды НЕТ. fast-rlm — только клиент. - Старая запись в памяти про "Балда на Кракене" — устаревшая, противоречит документации. Балда на Eagle.
- Попытка писать доку через native
Write/Editв/Users/admin/obsidian/...из Linux-контейнера — файл попадает в контейнерную ФС, не в реальный vault. Правильный путь —mcp_obsidian_write_note/mcp_obsidian_patch_note. - Утверждение
from fast_rlm.config import RLMConfig— такого пути в библиотеке нет, импорт top-level:from fast_rlm import RLMConfig. docker compose(v2) на хосте не установлен — нуженdocker-compose(v1).- Идея использовать OpenRouter (
z-ai/glm-5) как дефолт — отвергнута: используем DeepSeek как у Балды/Whale. - Утверждение про "актуализированную доку" 16 июня — на хост-FS дока НЕ менялась (правки шли в контейнерную FS). Реальная актуализация через
mcp_obsidian_write_note— 2026-06-16.
Что НЕ делаем без явного подтверждения
- Не пушить изменения в git.
- Не правим config.yaml до согласования итогового формата секции
fast-rlm. - Не рестартим Балду без согласования.
История
- 2026-06-16 ~14:00: создан после серии фабрикаций и компакций контекста. План построен с явными точками реальной проверки на каждом шаге.
- 2026-06-16 ~16:00: пользователь поправил — провайдер LLM = DeepSeek (как у Балды/Whale), не OpenAI/OpenRouter.
- 2026-06-16 ~17:00: актуализация через
mcp_obsidian_write_note— добавлены секции "Провайдер LLM" и "Подтверждённый API", compose v1 вместо v2, сетьbalda_defaultвместоbalda-agent_default, файл.envв список, Deno в Dockerfile, галлюцинации 5–8.