Большинство инструментов для работы с языковыми моделями в корпоративной среде решают одну задачу — научить модель вызывать функции и помнить разговор. Всё остальное: retry, идемпотентность, аудит, мульти-тенантность, бюджеты, governance, approval — остаётся на стороне разработчика. Именно этот разрыв пытается закрыть redb.Route.Llm.

Фреймворк redb.Route позиционируется как аналог Apache Camel для.NET: компилируемая DSL поверх типизированного Exchange, поддержка Enterprise Integration Patterns (Multicast, Aggregator, Scatter-Gather, Wire-Tap и других). В версии 3.1.0 к стандартным транспортам добавился LLM-транспорт — синтаксически вызов языковой модели выглядит так же, как вызов Kafka-топика или HTTP-эндпоинта. Версия 3.1.1 развивает эту идею до уровня операционной платформы.

Пункт skip-list 3.1.0Статус в 3.1.1
Streaming end-to-end (HTTP SSE + WS)Готово
ToolCacheStore (REDB)Готово
KnowledgeStore — RAG-чанкиГотово частично (embeddings — отдельный релиз)
BatchStore + LlmCallbackProcessorГотово
EvalRunStoreГотово
PromptTemplateStoreГотово
Sliding-window памятьЗаменено tree-branching конверсаций как REDB-tree
Sandbox-инструментыРеализован redb.Route.Exec с allowlist, timeout, cap-by-bytes

Ключевое архитектурное следствие такого подхода: любой перехватчик, уже работающий в маршруте, автоматически распространяется на LLM-вызовы. Если в системе есть policy-перехватчик, пишущий каждое действие в Kafka, он без дополнительной настройки будет фиксировать и каждый tool-вызов агента — потому что это один и тот же Exchange. Это принципиально отличает подход от конструкции «LangChain плюс хуки», где approval-callbacks и governance-логика подключаются отдельно для ИИ-части.

Добавлен жёсткий бюджет на разговор (CostBudgetProps): превышение лимита блокирует запрос до отправки, а не после.

В 3.1.1 закрыта большая часть задач из публично объявленного skip-list предыдущей версии. Реализован streaming end-to-end: IAsyncEnumerable<string> в теле ответа транслируется в SSE-кадры на HTTP-стороне и в отдельные сообщения на WebSocket-стороне. Добавлен ToolCacheStore с политикой мemoize на уровне DSL, частично реализован KnowledgeStore для RAG-чанков (embeddings заявлены в отдельном релизе), появились BatchStore с поддержкой Anthropic Message Batches и OpenAI Batch через асинхронный webhook-консьюмер, а также EvalRunStore — хранилище прогонов оценки с trace-id.

Два паттерна заслуживают отдельного внимания с точки зрения корпоративного применения. Первый — жёсткий бюджет на разговор как circuit-breaker. CostBudgetProps позволяет задать потолок расходов в долларах на conversation-id; агент-engine суммирует потраченное и ожидаемое перед каждым запросом и бросает LlmBudgetExceededException до отправки, если лимит будет превышен. Один и тот же механизм масштабируется на бюджет по тенанту, по промпт-шаблону или по модели — через разные ключи в CostBudgetProps.

Второй паттерн — approval-gate с человеком в цикле. Если языковая модель имеет право инициировать платёж или удалить запись, между tool-вызовом и реальным выполнением должна стоять пауза с подтверждением. В redb.Route это реализовано через ApprovalProps: Exchange приостанавливается, записывается идентификатор аппрувера, время ожидания и входные аргументы, затем Slack-бот, email или веб-форма подключаются как обычный HTTP-маршрут в том же фреймворке. Исход фиксируется в той же схеме.

Помимо закрытых пунктов skip-list, версия добавляет мульти-тенантность через параметр?redb=<name>: один маршрут работает с разными REDB-инстансами, выбираемыми из заголовка или URI на лету. Пакеты разделены на redb.Route.Llm.Abstractions (контракты) и redb.Route.Llm.Tools (готовые инструменты), что позволяет 22 коннекторам регистрировать.AsLlmTool() без версионного конфликта. Из коробки доступны шесть утилитарных инструментов: HttpFetch, JsonPath, XPath, RegexExtract, MathEval и TavilyWebSearch — каждый работает и как DSL-расширение, и как самостоятельный tool-маршрут.

Вся операционная логика опирается на 11 REDB-схем: ConversationProps, MessageProps, ApprovalProps, CostBudgetProps, ToolCacheProps, ToolAuditProps, KnowledgeChunkProps, PromptTemplateProps, EvalRunProps, LlmBatchProps, ToolIdempotencyProps. Они подключаются одним вызовом AddRedbLlmStorage() и образуют операционный слой агентской платформы, а не просто хранилище истории чата.

Среди исправленных ошибок, обнаруженных в продакшене, — orphan-tool_use (ситуация, когда модель запрашивает инструмент, а Anthropic-провайдер прерывается на ошибке) и некорректная обработка OEM-кодировки в выводе cmd /c на Windows, ломавшая UTF-8 контракт инструмента.