Files
obsidian-vault/personal/projects/balda/fast-rlm-integration.md
T

10 KiB
Raw Blame History

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-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/Dockerfilepython: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.txtfast-rlm, mcp[cli]>=1.2, uvicorn[standard]
  • /Users/admin/Docker/fast-rlm-mcp/.envOPENAI_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 Балды → состояние до начала.

Признанные галлюцинации в этой сессии

  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.

Что НЕ делаем без явного подтверждения

  • Не пушить изменения в 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.