LEM.RU · 2026

Архитектура · 14 мин

Цена контекста: как спрятать большой MCP за тремя командами

Как 96 схем заняли половину запроса локальной модели и зачем LEM понадобились профили и ленивый шлюз.

У облачной и локальной модели может быть одинаковый интерфейс, но не одинаковый запас внимания. До того как агент прочитает задачу и код, клиент уже может отправить ему системные правила и схемы всех MCP-инструментов. В одном из ранних контуров LEM этот невидимый служебный слой оказался больше самой рабочей задачи.

Контекст — не склад, куда полезно заранее положить всё. Для небольшой модели это ограниченный бюджет: в начале должны находиться только правила выбора следующего действия, а подробная схема нужна ровно тогда, когда действие уже выбрано.
01 · Инцидент

Простое «привет» превратилось в запрос на 55 985 токенов

В сентябре 2026 года OpenCode был подключён к LEM сразу с профилями библиотечного оператора и 1С-агента. Клиент получил весь разрешённый каталог и вложил схемы инструментов в каждый запрос. Пользователь ещё не просил искать функцию или сравнивать версии — но модель уже должна была прочитать правила десятков возможных действий.

В этой комбинации было 96 инструментов. Их описание после преобразования в формат вызовов модели занимало 29 575 токенов. Вместе с другими MCP, системной инструкцией OpenCode и служебным контекстом короткий запрос вырос до 55 985 входных токенов и выполнялся 97,6 секунды на GPU. Это авторское измерение конкретного исторического контура; полный протокол в открытом доступе не опубликован.

Сколько стоил ещё не начавшийся разговорИзмерения одного воспроизводимого контура: OpenCode 1.18.30, Qwen3.6-35B-A3B и каталог LEM на 14 сентября 2026 года.
01Измерено96инструментов

Профили library_operator + one_c_agent.

02Измерено29 575токенов схем LEM

130,1 КиБ представления OpenAI tools.

03Измерено55 985входных токенов

Полный первый запрос OpenCode вместе с остальным контекстом.

04Измерено97,6 свремя ответа

До полезной работы над задачей пользователя.

02

Большое окно контекста не означает равное внимание ко всему

Формально модель могла принимать длинный запрос. Практически служебные схемы конкурировали с постановкой задачи, кодом и найденными доказательствами. Чем длиннее вход, тем больше времени требуется на его первичную обработку. Информация из середины длинного контекста также может использоваться хуже, чем данные в начале и конце — этот эффект известен как lost in the middle, «потеря в середине».

Для небольшой модели и агрессивно сжатых весов риск выше: ей нужно одновременно удержать десятки похожих имён, выбрать правильную процедуру и не перепутать аргументы. LEM должен был не просить модель стать умнее, а детерминированно убрать лишний выбор там, где его может сделать система.

03 · Отдельная поломка

На RTX инференс иногда даже не начинался

Локальный сервер llama.cpp перед генерацией превращал JSON Schema инструментов в служебную грамматику допустимого ответа. Наборы из 83 и 96 инструментов завершались ошибкой построения grammar через 123,84 и 142,94 секунды. Тот же endpoint без инструментов отвечал за 1,23 секунды; bootstrap из девяти инструментов — за 0,98 секунды.

Причиной были не только общий объём, но и две конкретные конструкции схем: предельный размер массива 2000 и регулярное выражение версии с сокращением \d в сложной схеме. Их отдельно исправили, но сам архитектурный вывод остался: даже полностью совместимый каталог не стоит заранее передавать модели целиком.

Контролируемый прямой запрос к RTXOpenCode и LiteLLM исключены из цепочки. Ошибка означала отказ до генерации ответа, а не низкое качество текста модели.
01Измерено0,98 сbootstrap · 9

1 113 токенов схем, ответ HTTP 200.

02Измерено6,21 сlibrary_operator · 27

9 677 токенов схем, ответ HTTP 200.

03Измерено123,84 сone_c_agent · 83

Ошибка grammar до начала инференса.

04Измерено142,94 сдва профиля · 96

Ошибка grammar до начала инференса.

04

Почему нельзя просто сократить каждое описание до одной строки

Хороший MCP обязан объяснить назначение инструмента, необходимые аргументы, ограничения, продолжение долгой операции и границы прав. Если убрать эти сведения, агент начнёт угадывать: вызовет импорт вместо чтения, потеряет operationId или придумает поле, которого нет.

Удалить редко используемые инструменты тоже нельзя. Каталог LEM продолжал расти: проверка репозитория фиксировала 160 инструментов 26 сентября и 161 после следующего библиотечного изменения. Проблема была не в богатой функциональности, а в том, что вся она одновременно показывалась каждой модели.

05 · Первый уровень

Профиль оставляет только предметную область

Профиль — это короткое меню действий для конкретной роли. Общая работа с кодом, 1С, библиотечный корпус и администрирование получают разные наборы. Для публичного демонабора достаточно чтения библиотек; импорт, проектный корпус и административные операции не должны появляться в меню агента.

Важно: профиль не выдаёт права. Он только сокращает tools/list — технический список команд, который видит клиент. Каждый реальный вызов всё равно проходит авторизацию LEM. Поэтому короткое меню для читателя нельзя считать разрешением на импорт или изменение.

Два независимых фильтраСначала определяется, какие действия уместно показать, затем сервер отдельно проверяет, разрешено ли их выполнять этому ключу.
011С

Код, метаданные, конфигурации и расширения.

02Библиотеки

Поиск, точный фрагмент, версии и импорт для оператора.

03Проект

Граф, область влияния и план изменения — отдельный маршрут.

04Права

Чтение, изменение и администрирование проверяются независимо от профиля.

06 · Второй уровень

Ленивый шлюз заменяет десятки схем тремя командами

Даже профиль 1С оставался слишком большим. Поэтому guided-режим — направляемый режим работы — публикует только lem_route, lem_execute и lem_continue. Внутренние инструменты не исчезают: их полные схемы, проверки и обработчики остаются на сервере.

Первая команда, lem_route, выбирает подходящее действие по формулировке задачи и просит уточнение при неоднозначности. Точное имя инструмента имеет приоритет. В техническом ответе selectionId обозначает выбранный маршрут и шаблон следующего вызова. Затем lem_execute проверяет параметры и выполняет штатную операцию, а lem_continue читает следующую страницу или продолжает длительную задачу по её идентификатору operationId.

Минимальная постоянная инструкция агенту
Для новой задачи сначала вызови lem_route. Выполни возвращённый nextCall через lem_execute. Если ответ содержит operationId или nextCursor, продолжай через lem_continue.

Передайте запрос своему агенту. Сайт ничего не выполняет.

Не весь каталог, а один следующий шагМаршрутизация сокращает стартовый контекст, но сохраняет исходные схемы, права и журналирование внутри LEM.
01Задача

Агент формулирует одно требуемое действие.

02lem_route

LEM выбирает один инструмент или просит уточнить задачу.

03lem_execute

Аргументы проверяются полной серверной схемой.

04lem_continue

Длинная операция продолжается по operationId без нового каталога.

07

Детерминированность освобождает модель для самой задачи

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

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

Разжёванный пример

Найти разрешённую замену устаревшей функции БСП

В реальной задаче агент сам пройдёт эту цепочку под капотом. Здесь шаги разделены специально, чтобы увидеть, где заканчивается выбор маршрута и начинается работа с библиотечным доказательством.

  1. Передать в lem_route задачу: найти замену функции для целевой версии БСП.
  2. Получить один выбранный библиотечный инструмент и готовый шаблон его аргументов.
  3. Выполнить шаблон через lem_execute и открыть точную процедуру или функцию.
  4. При постраничном ответе продолжить через lem_continue, не загружая каталог заново.

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

Граница доказательства

Что уже можно утверждать, а что нужно проверить

Подтверждено материалом
  • В историческом контуре измерены размеры каталогов, токены схем, время и ошибки grammar на прямых запросах к RTX.
  • Код guided-шлюза сохраняет исходную проверку аргументов, штатный обработчик и обычную авторизацию.
  • Профили ограничивают видимость tools/list и не подменяют права доступа.
Проверяется в конкретном контуре
  • Повторить замеры на актуальном каталоге, версии OpenCode, llama.cpp и выбранной модели.
  • Отдельно измерить качество выбора маршрута на наборе реальных 1С-задач, включая неоднозначные формулировки.
Источники и опорные материалы