# 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](https://github.com/avbiswas/fast-rlm)): Python библиотека, MCP **клиент** (не сервер). CLI команды `serve` НЕ существует. - Docker tooling на хосте: только `docker-compose` v1, v2 plugin отсутствует. ## Провайдер LLM fast-rlm использует OpenAI-совместимый клиент (через переменные `OPENAI_API_KEY` + `OPENAI_BASE_URL`). Для консистентности с Балдой и Whale используем **DeepSeek** как у самой Балды: - `OPENAI_BASE_URL=https://api.deepseek.com/v1` - `OPENAI_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, transport `streamable-http`, port 3333) - `/Users/admin/Docker/fast-rlm-mcp/docker-compose.yaml` — сервис `fast-rlm-mcp`, порт 3333, в сети `balda_default` external - `/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=`, `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` — добавить: ```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` Балды → состояние до начала. ## Признанные галлюцинации в этой сессии 1. msg 58792-58795: фабрикация "Container Started / Ready" — реально ничего не создавалось. 2. Утверждение что `fast-rlm serve --port 3333` существует — такой команды НЕТ. fast-rlm — только клиент. 3. Старая запись в памяти про "Балда на Кракене" — устаревшая, противоречит документации. Балда на Eagle. 4. Попытка писать доку через native `Write`/`Edit` в `/Users/admin/obsidian/...` из Linux-контейнера — файл попадает в контейнерную ФС, не в реальный vault. **Правильный путь — `mcp_obsidian_write_note` / `mcp_obsidian_patch_note`**. 5. Утверждение `from fast_rlm.config import RLMConfig` — такого пути в библиотеке нет, импорт top-level: `from fast_rlm import RLMConfig`. 6. `docker compose` (v2) на хосте не установлен — нужен `docker-compose` (v1). 7. Идея использовать OpenRouter (`z-ai/glm-5`) как дефолт — отвергнута: используем DeepSeek как у Балды/Whale. 8. Утверждение про "актуализированную доку" 16 июня — на хост-FS дока НЕ менялась (правки шли в контейнерную FS). Реальная актуализация через `mcp_obsidian_write_note` — 2026-06-16. ## Текущий статус (2026-06-19) ### ✅ Сделано - Шаги 1–4: образ собран, контейнер `fast-rlm-mcp` Up 2 дня - `fast-rlm-mcp` в сети `balda_default`, доступен из Валеры по DNS - MCP HTTP сервер работает, initialize/tools/list отвечают - Валера (`balda-agent-valera-1`) запущен после простоя — отвечает 401 на webhook, 404 на корень - **fast-rlm добавлен в `config.yaml` Балды** — и в `runtime.mcp_servers`, и в `balda.mcp_servers` - Балда рестартнута ### ❓ Не проверено end-to-end - Нужен реальный вызов `recursive_context_compress` из Валеры (через Zulip @Валера) - В логах старта Валеры нет явного "MCP connected: fast-rlm" — возможно коннект ленивый ## История - **2026-06-16 ~14:00**: создан - **2026-06-16 ~17:00**: актуализация - **2026-06-19 ~03:47**: Валера запущен, fast-rlm добавлен в config.yaml и рестартнут