Большинство инструментов для работы с языковыми моделями в корпоративной среде решают одну задачу — научить модель вызывать функции и помнить разговор. Всё остальное: 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 контракт инструмента.


