{"id":483230,"date":"2026-06-10T20:21:20","date_gmt":"2026-06-10T20:21:20","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483230"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483230","title":{"rendered":"Redb.Route 3.1.1 (LLM, \u0447\u0430\u0441\u0442\u044c 2: enterprise-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b)"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/319\/45b\/fc0\/31945bfc082f420552315d68f59b3ba7.png\" alt=\"redb.route llm\" title=\"redb.route llm\" width=\"659\" height=\"797\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/319\/45b\/fc0\/31945bfc082f420552315d68f59b3ba7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/319\/45b\/fc0\/31945bfc082f420552315d68f59b3ba7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>redb.route llm<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0421\u0435\u0440\u0438\u044f:<\/strong>\u00a0redb ecosystem (\u0447\u0430\u0441\u0442\u044c 2 \u043a LLM-\u0430\u043d\u043e\u043d\u0441\u0443)  <\/p>\n<p>\u0412\u00a0<a href=\"https:\/\/habr.com\/ru\/articles\/1045356\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>\u00a0\u044f \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u00a0<code>redb.Route.Llm<\/code>\u00a0\u043a\u0430\u043a 24-\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u00a0<code>redb.Route<\/code>\u00a0\u2014 \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 LLM \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c endpoint&#8217;\u043e\u043c \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441 Kafka, RabbitMQ \u0438 HTTP, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u00abAI-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u00bb, \u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0440\u044f\u0434\u043e\u043c \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439. \u0417\u0430\u043e\u0434\u043d\u043e \u044f \u043f\u043e\u0432\u0435\u0441\u0438\u043b \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0430\u0442\u044c\u0438\u00a0<strong>\u00ab\u0447\u0435\u0441\u0442\u043d\u044b\u0439 skip-list\u00bb<\/strong>\u00a0\u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 3.1.0 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0434\u0435\u043b\u0430\u043d\u043e: streaming, ToolCacheStore, KnowledgeStore, BatchStore, EvalRunStore, sliding-window \u043f\u0430\u043c\u044f\u0442\u044c, sandbox-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e skip-list&#8217;\u0430 \u0434\u0435\u043b\u0430\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b. \u041d\u043e \u043d\u0435 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0430\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0439 \u0437\u0430\u0442\u0435\u0438:\u00a0<strong>LLM-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u043c \u0447\u0430\u0442-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u043c \u0437\u0432\u0435\u043d\u043e\u043c \u0432 ESB, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u00ab\u0431\u0438\u0437\u043d\u0435\u0441-\u0430\u0433\u0435\u043d\u0442 \u0432 \u043f\u0440\u043e\u0434\u0435\u00bb \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c<\/strong>. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0447\u0430\u0442-\u0434\u0435\u043c\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 enterprise-\u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044f\u0441\u044c \u0438 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0432 \u00abAI-\u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u0441\u0431\u043e\u043a\u0443\u00bb.<\/p>\n<p>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0438\u0436\u0435 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043d\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0435\u043c\u043e-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<blockquote>\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e\u00a0<code>redb.Route.Llm<\/code>. \u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1045356\/\" rel=\"noopener noreferrer nofollow\">redb.Route 3.1.0 \u2014 LLM \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442:\u00a0<code>.To(\"llm:\/\/claude\")<\/code>\u00a0\u0438\u00a0<code>.AsLlmTool()<\/code><\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0440\u0438\u0438 redb.Route \u0446\u0435\u043b\u0438\u043a\u043e\u043c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042392\/\" rel=\"noopener noreferrer nofollow\">redb.Route \u2014 Apache Camel \u0434\u043b\u044f .NET<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042872\/\" rel=\"noopener noreferrer nofollow\">redb.Route \u0438\u0437\u043d\u0443\u0442\u0440\u0438: \u0447\u0435\u0442\u044b\u0440\u0435 in-memory \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 Exchange<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1043332\/\" rel=\"noopener noreferrer nofollow\">redb.Route 3.0.1 \u2014 \u043f\u043b\u043e\u0441\u043a\u0430\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e DSL, \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 CRTP \u0438 \u0442\u0438\u0445\u0438\u0439 null<\/a><\/p>\n<\/li>\n<\/ul>\n<\/blockquote>\n<blockquote>\n<p><strong>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u043f\u0440\u043e EIP.<\/strong>\u00a0\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u044e\u0441\u044c \u043d\u0430 Enterprise Integration Patterns \u2014\u00a0<code>Multicast<\/code>,\u00a0<code>Aggregator<\/code>,\u00a0<code>Scatter-Gather<\/code>,\u00a0<code>Wire-Tap<\/code>,\u00a0<code>Choice<\/code>,\u00a0<code>Aggregate-by-window<\/code>\u00a0\u2014 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u042d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440: \u0441\u0442\u0430\u0442\u0435\u0439 \u0441\u0435\u0440\u0438\u0438 \u00abEIP \u0432 .NET \u0447\u0435\u0440\u0435\u0437 redb.Route\u00bb \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 (\u0441 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043a\u043e\u0434\u043e\u043c \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u043c\u0438) \u0435\u0449\u0451 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e, \u044f \u0438\u0445 \u043f\u0438\u0448\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0431\u0435\u0433\u0430\u044e \u0432\u043f\u0435\u0440\u0451\u0434.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u00a0<strong>Apache Camel<\/strong>\u00a0\u0438\u043b\u0438\u00a0<strong>WSO2 Micro Integrator<\/strong>\u00a0\u2014 \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043d\u0430 \u0445\u043e\u0434\u0443, \u0438\u043c\u0435\u043d\u0430 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b. \u042f \u0441\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u043f\u0438\u0441\u0430\u043b \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 WSO2 MI (\u0438 ESB-\u043f\u0440\u0435\u0434\u043a\u0435), \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u00a0<code>redb.Route<\/code>\u00a0\u0431\u043b\u0438\u0436\u0435 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043a Camel \u2014 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u0430\u044f DSL \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e Exchange, \u0430 \u043d\u0435 XML-\u043a\u043e\u043d\u0444\u0438\u0433. \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u00abCamel \u2194 redb.Route\u00bb \u0438 \u00abWSO2 MI \u2194 redb.Route\u00bb \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0442\u043e\u0436\u0435 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e EIP-\u0447\u0430\u0441\u0442\u0438 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u2014 \u043e\u0442\u0432\u0435\u0447\u0443 \u0441\u0440\u0430\u0437\u0443, \u0437\u0430\u043e\u0434\u043d\u043e \u0441\u043e\u0431\u0435\u0440\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<\/blockquote>\n<hr\/>\n<h3>\u0427\u0435\u043c \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u00ab\u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u00bb<\/h3>\n<p>\u0412 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 LLM-tool-use \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: LangChain, langchain4j, Semantic Kernel, AutoGen, LlamaIndex \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043d\u0438\u0448\u0435\u0432\u044b\u0445. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u044e\u0442\u00a0<strong>\u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443<\/strong>: \u00ab\u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u00bb. \u0418 \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0432\u0430\u043c\u00a0<strong>\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c<\/strong>: retry, idempotency, audit, multi-tenant, \u0431\u044e\u0434\u0436\u0435\u0442, observability, governance, approval, batch, scheduling.<\/p>\n<p>\u0418\u0434\u0435\u044f\u00a0<code>redb.Route.Llm<\/code>\u00a0\u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c LLM \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043e\u043c \u0432 ESB, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u0438 \u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00a0<strong>\u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u044b<\/strong>\u00a0\u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u041d\u0435 \u00ab\u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439, \u043f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f LLM-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u00bb, \u0430\u00a0<strong>\u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0436\u0435 DSL, \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 runtime, \u0440\u043e\u0432\u043d\u043e \u0442\u0435 \u0436\u0435 hook&#8217;\u0438 \u0434\u043b\u044f governance<\/strong>. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u00a0<code>redb.Route<\/code>\u00a0\u0443\u0436\u0435 \u0435\u0441\u0442\u044c policy-\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442 \u0432 Kafka \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0438\u0448\u0435\u0442 \u0442\u0443\u0434\u0430 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 tool-\u0432\u044b\u0437\u043e\u0432 \u0430\u0433\u0435\u043d\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 Exchange.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u0430. \u042d\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0431\u043e\u043b\u044c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 \u0441 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438:\u00a0<strong>\u00ab\u0430 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u043a\u043e\u0433\u0434\u0430 LLM \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c production-\u0442\u0430\u0431\u043b\u0438\u0446\u0443?\u00bb<\/strong>\u00a0\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00abLangChain + \u0445\u0443\u043a\u0438\u00bb \u043e\u0442\u0432\u0435\u0442 \u2014 \u00ab\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u043d\u0430\u0448\u0438 approval-callbacks \u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435\u00bb. \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00abLLM \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432 ESB\u00bb \u043e\u0442\u0432\u0435\u0442 \u2014\u00a0<strong>\u00ab\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u0435 Exchange \u0434\u043e\u00a0<\/strong><code><strong>.To(\"exec:\/\/...\")<\/strong><\/code><strong>\u00a0\u0442\u0435\u043c \u0436\u0435\u00a0<\/strong><code><strong>.Process(...)<\/strong><\/code><strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0448\u0430\u0433 \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0435\u00bb<\/strong>. \u041d\u0435 \u00ab\u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f AI\u00bb, \u0430\u00a0<strong>\u0442\u043e\u0442 \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0447\u0442\u043e \u0434\u043b\u044f FTP \u0438 \u0434\u043b\u044f Kafka<\/strong>.<\/p>\n<hr\/>\n<h3>\u0427\u0442\u043e \u0434\u043e\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u0437 \u00ab\u0447\u0435\u0441\u0442\u043d\u043e\u0433\u043e skip-list\u00bb 3.1.0<\/h3>\n<p>\u042f \u043e\u0431\u0435\u0449\u0430\u043b \u2014 \u044f \u0433\u043e\u0432\u043e\u0440\u044e.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">Skip-list \u043f\u0443\u043d\u043a\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u0442\u0430\u0442\u0443\u0441 3.1.1<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Streaming end-to-end (HTTP SSE + WS per-frame)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0413\u043e\u0442\u043e\u0432\u043e.<\/strong>\u00a0<code>IAsyncEnumerable&lt;string&gt;<\/code>\u00a0\u0432\u00a0<code>Out.Body<\/code>\u00a0\u2192 SSE-\u043a\u0430\u0434\u0440 \u043d\u0430 HTTP-side, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 WS-message \u043d\u0430 WS-side.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">ToolCacheStore (REDB)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0413\u043e\u0442\u043e\u0432\u043e.<\/strong>\u00a0<code>ToolCacheProps<\/code>, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u00a0<code>ToolCachingPolicy.Memoize<\/code>\u00a0\u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DSL.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">KnowledgeStore \u2014 RAG-\u0447\u0430\u043d\u043a\u0438 \u0432 REDB<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0413\u043e\u0442\u043e\u0432\u043e (\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e).<\/strong>\u00a0<code>KnowledgeChunkProps<\/code>\u00a0+ \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, embeddings \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">BatchStore + LlmCallbackProcessor<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0413\u043e\u0442\u043e\u0432\u043e.<\/strong>\u00a0Anthropic Message Batches \u0438 OpenAI Batch \u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 webhook-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440, \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, retry.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">EvalRunStore<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0413\u043e\u0442\u043e\u0432\u043e.<\/strong>\u00a0\u041f\u0440\u043e\u0433\u043e\u043d\u044b eval&#8217;\u043e\u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441 trace-id&#8217;\u0430\u043c\u0438.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PromptTemplateStore<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0413\u043e\u0442\u043e\u0432\u043e.<\/strong>\u00a0\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432, \u0441\u0441\u044b\u043b\u043a\u0430\u00a0<code>#name<\/code>\u00a0\u0432 DSL.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Sliding-window \u043f\u0430\u043c\u044f\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e.<\/strong>\u00a0\u0421\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u043d\u0430\u0447\u0435: tree-branching \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0430\u0446\u0438\u0439 \u043a\u0430\u043a REDB-tree (\u0441\u043c. \u043d\u0438\u0436\u0435).<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Sandbox-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e<\/strong>\u00a0\u0432 \u0432\u0438\u0434\u0435 \u00ab\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\u00bb. \u0421\u0434\u0435\u043b\u0430\u043d\u00a0<code>redb.Route.Exec<\/code>\u00a0\u0441 allowlist + working-dir + timeout + cap-by-bytes \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 enterprise-\u043c\u0438\u043d\u0438\u043c\u0443\u043c.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0411\u043e\u043d\u0443\u0441\u043e\u043c, \u0447\u0435\u0433\u043e \u0432 skip-list \u043d\u0435 \u0431\u044b\u043b\u043e:<\/p>\n<ul>\n<li>\n<p><code><strong>?redb=&lt;name&gt;<\/strong><\/code><strong>\u00a0per-exchange<\/strong>\u00a0\u2014 \u043c\u0443\u043b\u044c\u0442\u0438-tenant: \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, REDB-instance \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\/URI \u043d\u0430 \u043b\u0435\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p><strong>DSL\/tool split<\/strong>\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442\u044b\u00a0<code>redb.Route.Llm.Abstractions<\/code>\u00a0(\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b) \u0438\u00a0<a href=\"http:\/\/redb.Route.Llm.Tools\" rel=\"noopener noreferrer nofollow\"><code>redb.Route.Llm.Tools<\/code><\/a>\u00a0(\u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b), \u0447\u0442\u043e\u0431\u044b 22 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u043e\u0433\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00a0<code>.AsLlmTool()<\/code>\u00a0\u0431\u0435\u0437 bump&#8217;\u0430 \u043c\u0438\u043d\u043e\u0440\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445;<\/p>\n<\/li>\n<li>\n<p><strong>6 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438<\/strong>:\u00a0<code>HttpFetch<\/code>,\u00a0<code>JsonPath<\/code>,\u00a0<code>XPath<\/code>,\u00a0<code>RegexExtract<\/code>,\u00a0<code>MathEval<\/code>,\u00a0<code>TavilyWebSearch<\/code>\u00a0\u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438 \u043a\u0430\u043a DSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435, \u0438 \u043a\u0430\u043a standalone tool-route;<\/p>\n<\/li>\n<li>\n<p><strong>Bug fixes<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0434\u0435: orphan-<code>tool_use<\/code>\u00a0(\u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0430 Anthropic-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0435) \u0438 OEM-codepage \u0432\u00a0<code>Process.StandardOutput<\/code>\u00a0(windows-1251 \u0432 \u0432\u044b\u0445\u043b\u043e\u043f\u0435\u00a0<code>cmd \/c<\/code>\u00a0\u043b\u043e\u043c\u0430\u0435\u0442 UTF-8 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>11 REDB-\u0441\u0445\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u044f\u0442 \u0437\u0430 \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c:\u00a0<code>ConversationProps<\/code>,\u00a0<code>MessageProps<\/code>,\u00a0<code>ApprovalProps<\/code>,\u00a0<code>CostBudgetProps<\/code>,\u00a0<code>ToolCacheProps<\/code>,\u00a0<code>ToolAuditProps<\/code>,\u00a0<code>KnowledgeChunkProps<\/code>,\u00a0<code>PromptTemplateProps<\/code>,\u00a0<code>EvalRunProps<\/code>,\u00a0<code>LlmBatchProps<\/code>,\u00a0<code>ToolIdempotencyProps<\/code>. \u042d\u0442\u043e \u043d\u0435 \u00ab\u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u0447\u0430\u0442-\u0438\u0441\u0442\u043e\u0440\u0438\u044e\u00bb. \u042d\u0442\u043e\u00a0<strong>\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0437\u0430\u00a0<code>AddRedbLlmStorage()<\/code>\u00a0\u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<hr\/>\n<h3>\u0414\u0435\u0441\u044f\u0442\u044c enterprise-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 DSL<\/h3>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b. \u041d\u0435 \u00abHello, world\u00bb, \u0430 \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 ESB-\u043f\u043e\u0434\u0445\u043e\u0434 \u043a LLM.<\/p>\n<h4>1. \u0416\u0451\u0441\u0442\u043a\u0438\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043a\u0430\u043a circuit-breaker<\/h4>\n<p>\u0412 \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u043e\u0432\u00bb \u2014 \u044d\u0442\u043e \u043b\u043e\u0433. \u0412 \u043f\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u00a0<strong>\u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432<\/strong>: \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0441\u044a\u0435\u0441\u0442\u044c 10\u043a \u0434\u043e\u043b\u043b\u0430\u0440\u043e\u0432 \u0438\u0437-\u0437\u0430 \u0431\u0430\u0433\u0430 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435.\u00a0<code>CostBudgetProps<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435 observability-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u044d\u0442\u043e\u00a0<strong>\u043f\u0440\u0435\u0432\u0435\u043d\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e<\/strong>. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440-\u0432\u044b\u0437\u043e\u0432\u0435 \u0430\u0433\u0435\u043d\u0442-engine \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e conversation-id \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 (\u043f\u043e\u00a0<code>max_tokens<\/code>). \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \u043b\u0438\u043c\u0438\u0442 \u2014\u00a0<code>LlmBudgetExceededException<\/code>\u00a0\u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f\u00a0<strong>\u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/strong>, \u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435.<\/p>\n<pre><code>From(\"kafka:\/\/support-tickets\")    .To(Llm.Factory(\"claude\")        .Conversation(e =&gt; \"ticket-\" + e.In.Headers[\"TicketId\"])        .CostBudget(usd: 0.50)            \/\/ hard ceiling per conversation-id        .CostBudgetExceeded(BudgetPolicy.FailFast)        .AsUri())    .To(\"kafka:\/\/support-replies\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435: \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0442\u0435\u043d\u0430\u043d\u0442\u00bb, \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u043c\u043f\u0442-\u0448\u0430\u0431\u043b\u043e\u043d\u00bb, \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c\u00bb. \u0412\u0441\u0435 \u043e\u043d\u0438 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432\u00a0<code>CostBudgetProps<\/code>. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u0430.<\/p>\n<h4>2. Approval-gate \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u0432 \u0446\u0438\u043a\u043b\u0435<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0451\u043d\u043d\u044b\u0439 enterprise-\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0432 LLM. \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043b\u0430\u0442\u0435\u0436\u0438 \u2014 \u043c\u0435\u0436\u0434\u0443 tool-\u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c\u00a0<strong>\u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u043e\u044f\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a<\/strong>, \u0438 \u044d\u0442\u0430 \u043f\u0430\u0443\u0437\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e runtime, \u0430 \u043d\u0435 \u00ab\u043a\u043e\u0441\u0442\u044b\u043b\u0451\u043c \u0438\u0437 webhook&#8217;\u043e\u0432\u00bb.<\/p>\n<pre><code>From(\"direct:tool-payments-refund\")    .AsLlmTool(\"issue_refund\")        .Description(\"Refund a payment by id and reason.\")        .Input(\/* JSON Schema *\/)        .SideEffect(ToolSideEffect.Mutating)         \/\/ hook governance reads this        .Cost(ToolCostClass.Expensive)    .Then()    .Process&lt;ApprovalGate&gt;()                          \/\/ suspend exchange, write ApprovalProps,                                                       \/\/ notify Slack, wait for HTTP callback    .To(\"kafka:\/\/payments.refund.commands\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>ApprovalProps<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 exchange-id, conversation-id, \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430-\u0430\u043f\u043f\u0440\u0443\u0432\u0435\u0440\u0430, \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u0438\u0441\u0445\u043e\u0434. Slack-bot\/email\/web-form \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 HTTP-\u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435\u00a0<code>redb.Route<\/code>. \u041a\u043e\u0433\u0434\u0430 \u0430\u043f\u043f\u0440\u0443\u0432\u0435\u0440 \u043a\u043b\u0438\u043a\u0430\u0435\u0442 \u00abapprove\u00bb \u2014 webhook \u0431\u0443\u0434\u0438\u0442 exchange \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0430\u0433\u0435\u043d\u0442-engine. \u0415\u0441\u043b\u0438 timeout \u2014 agent \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u00a0<code>tool_result<\/code>\u00a0\u0441\u043e\u00a0<code>status:\"timeout\"<\/code>\u00a0\u0438 \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u2014 \u044d\u0442\u043e\u00a0<strong>\u043d\u0435 AI-\u043b\u043e\u0433\u0438\u043a\u0430<\/strong>. \u042d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d EIP \u00abAggregator + Correlation Identifier + Wire-Tap + JMS Reply-To\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438 \u043a refund-engine&#8217;\u0443 \u0431\u0435\u0437 LLM, \u0438 \u043a LLM-\u0430\u0433\u0435\u043d\u0442\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u0430 \u2014 Exchange&#8217;\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c runtime.<\/p>\n<h4>3. \u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439 retry \u0441\u00a0ToolIdempotencyProps<\/h4>\n<p>Webhook-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u2014 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. Anthropic Batch \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430\u0436\u0434\u044b. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448 tool-\u0432\u044b\u0437\u043e\u0432 \u00abissue refund $50\u00bb \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u2014 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u0441\u0440\u0435\u0434\u0430.<\/p>\n<p><code>ToolIdempotencyProps<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442\u00a0<code>idempotency-key \u2192 tool-result<\/code>\u00a0\u0441 TTL. \u0412 DSL:<\/p>\n<pre><code>From(\"direct:tool-issue-invoice\")    .AsLlmTool(\"issue_invoice\")        .Caching(ToolCachingPolicy.Idempotent)    .Then()    .Process(BuildIdempotencyKey)                    \/\/ sha256(args + customer-id + day)    .To(\"...\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0430\u0433\u0435\u043d\u0442-engine \u0432\u0438\u0434\u0438\u0442\u00a0<code>Caching = Idempotent<\/code>\u00a0\u2014 \u043e\u043d\u00a0<strong>\u0434\u043e<\/strong>\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u00a0<code>ToolIdempotencyProps<\/code>\u00a0\u043f\u043e \u043a\u043b\u044e\u0447\u0443. Hit \u2014 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439\u00a0<code>tool_result<\/code>, \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. Miss \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0430 \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u00ab\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435\u00bb.<\/p>\n<h4>4. Multi-tenant \u0447\u0435\u0440\u0435\u0437\u00a0?redb=<\/h4>\n<p>\u041e\u0434\u0438\u043d \u0432\u043e\u0440\u043a\u0435\u0440 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 50-100 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e\u00a0<strong>\u0441\u0432\u043e\u0439 REDB-instance<\/strong>\u00a0(\u0441\u0432\u043e\u0438 conversations, \u0441\u0432\u043e\u0439 cost-budget, \u0441\u0432\u043e\u0438 approvals, \u0441\u0432\u043e\u044f knowledge-base). \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u043b\u043e \u0431\u044b \u00ab50 -100 ServiceProvider&#8217;\u043e\u0432 \u0438\u043b\u0438 ScopedFactory \u0441 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439\u00bb. \u0412 3.1.1 \u044d\u0442\u043e\u00a0<strong>per-exchange hint<\/strong>:<\/p>\n<pre><code>From(\"http:0.0.0.0:5088\/api\/llm\/ask?inOut=true\")    .Process(e =&gt;        e.In.Headers[LlmHeaders.Redb] = e.In.Headers[\"X-Tenant\"]?.ToString())    .To(\"llm:\/\/claude?conversationFromHeader=true\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>?redb=acme<\/code>\u00a0\u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u2014 engine \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 named REDB-instance \u0438\u0437 \u0440\u0435\u0435\u0441\u0442\u0440\u0430,\u00a0<strong>\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c Exchange<\/strong>, \u0431\u0435\u0437 \u0441\u043c\u0435\u043d\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u0431\u0435\u0437 \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430. Conversations, ToolAudit, ApprovalProps \u2014 \u0432\u0441\u0451 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 tenant. \u041a\u0430\u0436\u0434\u044b\u0439 tenant \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0431\u0438\u043b\u043b\u0438\u043d\u0433 \u0438 \u0441\u0432\u043e\u0439 governance, \u043d\u0435 \u0437\u043d\u0430\u044f \u043f\u0440\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<h4>5. Audit trail \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p><code>ToolAuditProps<\/code>\u00a0\u2014 \u044d\u0442\u043e REDB-\u043e\u0431\u044a\u0435\u043a\u0442 \u0441 tenant-id, conversation-id, exchange-id, tool-name, \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (\u0438\u043b\u0438 \u0445\u044d\u0448\u043e\u043c, \u0435\u0441\u043b\u0438 PII), \u0432\u044b\u0445\u043e\u0434\u043e\u043c (\u0438\u043b\u0438 \u0445\u044d\u0448\u043e\u043c), \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u00a0<strong>\u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442<\/strong>, \u0430 \u0443\u00a0<code>redb.Route<\/code>\u00a0\u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 post-processors.<\/p>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u0438\u0434\u0430 \u00ab\u043f\u043e\u043a\u0430\u0436\u0438 \u043c\u043d\u0435 \u0432\u0441\u0435 tool-\u0432\u044b\u0437\u043e\u0432\u044b Claude \u0432 tenant acme \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 7 \u0434\u043d\u0435\u0439 \u0441 side-effect=mutating \u0438 cost=expensive, \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u042d\u0442\u043e\u00a0<code><strong>value_string<\/strong><\/code><strong>\u00a0\u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 REDB-\u043e\u0431\u044a\u0435\u043a\u0442\u0435 + \u043e\u0434\u0438\u043d SQL<\/strong>\u00a0(\u0441\u043c. \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0435\u0440\u0438\u044e \u00abREDB storage\u00bb, \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435).<\/p>\n<h4>6. Async batch + callback-consumer<\/h4>\n<p>Anthropic Message Batches \u0438 OpenAI Batch \u2014 \u044d\u0442\u043e\u00a0<strong>\u0434\u043e 50% \u0434\u0435\u0448\u0435\u0432\u043b\u0435<\/strong>, \u043d\u043e \u0446\u0435\u043d\u0430 \u0437\u0430 \u044d\u0442\u043e \u2014 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e 24 \u0447\u0430\u0441\u043e\u0432. \u0414\u043b\u044f \u043e\u0444\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043e\u043a (\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0442\u0438\u043a\u0435\u0442\u043e\u0432, \u044d\u043a\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 PDF) \u044d\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c.<\/p>\n<p><code>LlmBatchProps<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 batch-id, statuses, \u043c\u0435\u0442\u0430-\u0441\u0432\u044f\u0437\u044c \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0435\u0439 Exchange&#8217;\u043e\u0432.\u00a0<code>LlmCallbackProcessor<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<strong>\u043e\u0431\u044b\u0447\u043d\u044b\u0439\u00a0<\/strong><code><strong>From(\"http:\/\/...?inOut=true\")<\/strong><\/code><strong>-\u043c\u0430\u0440\u0448\u0440\u0443\u0442<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 batch&#8217;\u0430. \u041c\u0430\u0440\u0448\u0440\u0443\u0442 \u0447\u0438\u0442\u0430\u0435\u0442 batch-id, \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 Exchange (\u0447\u0435\u0440\u0435\u0437 correlation-id) \u2014 \u0438 \u043e\u043d\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0438\u0434\u0442\u0438 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043f\u0443\u0442\u0438, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f.<\/p>\n<p>\u041f\u043e\u0432\u0435\u0440\u0445 \u2014 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c (\u0442\u043e\u0442 \u0436\u0435 ToolIdempotencyProps), retry (\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 circuit-breaker\u00a0<code>redb.Route<\/code>), backpressure. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u0430\u0442\u0447\u0435\u0440. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 webhook-handler. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 callback \u043f\u0440\u0438\u0448\u0451\u043b \u0434\u0432\u0430 \u0440\u0430\u0437\u0430\u00bb.<\/p>\n<h4>7. \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432:\u00a0#-refs<\/h4>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0442\u043e\u0441\u043a\u043b\u0438\u0432\u044b\u0445 \u0431\u0430\u0433\u043e\u0432 \u043f\u0440\u043e\u0434\u0430: \u00ab\u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0442\u0430\u043b\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0438\u043d\u0430\u0447\u0435\u00bb. \u0418\u0434\u0451\u0448\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c git-blame, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u2014 \u043a\u0442\u043e-\u0442\u043e 3 \u043d\u0435\u0434\u0435\u043b\u0438 \u043d\u0430\u0437\u0430\u0434 \u0442\u0440\u043e\u043d\u0443\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442, \u0438 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0448\u043b\u0438. \u041f\u0440\u043e\u043c\u043f\u0442 \u2014 \u044d\u0442\u043e\u00a0<strong>\u043a\u043e\u0434<\/strong>, \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0436\u0438\u0442\u044c \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439.<\/p>\n<pre><code>\/\/ Where you register prompts:promptRegistry.Register(\"triage-system\", version: \"v3\", body: \"\"\"    You are a support triage agent. Classify into [billing, tech, sales, abuse]...    \"\"\");\/\/ In the route:.To(Llm.Factory(\"claude\").SystemPromptRef(\"#triage-system@v3\").AsUri())<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>PromptTemplateProps<\/code>\u00a0\u2014 \u044d\u0442\u043e REDB-\u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c, \u0432\u0435\u0440\u0441\u0438\u0435\u0439, \u0442\u0435\u043b\u043e\u043c, \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0430\u0432\u0442\u043e\u0440, \u0434\u0430\u0442\u0430, \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442). Engine \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0438\u00a0<code>#name<\/code>\u00a0\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u00a0<strong>\u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0432\u0435\u0440\u0441\u0438\u044e<\/strong>\u00a0\u0432\u00a0<code>MessageProps<\/code>\u00a0\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u0427\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u043e\u0447\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c: \u00ab\u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0448\u0451\u043b \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 v3 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 triage-system\u00bb, \u0430 \u043d\u0435 \u00ab\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, v3, \u043c\u044b \u0442\u043e\u0433\u0434\u0430 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0438\u00bb.<\/p>\n<p>\u0418 \u2014 \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u2014\u00a0<code>EvalRunStore<\/code>\u00a0\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u043e\u043d\u044b eval-test&#8217;\u043e\u0432\u00a0<strong>\u0432 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0435 \u043a \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/strong>. \u00ab\u0412\u0435\u0440\u0441\u0438\u044f v4 \u0434\u0430\u0451\u0442 +12% accuracy \u043d\u0430 golden-set&#8217;\u0435\u00bb \u2014 \u044d\u0442\u043e \u043d\u0435 excel-\u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430, \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 REDB.<\/p>\n<h4>8. Tree-branching \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0430\u0446\u0438\u0439 \u0434\u043b\u044f A\/B \u0438 \u00ab\u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b, \u0435\u0441\u043b\u0438\u00bb<\/h4>\n<p><code>ConversationProps<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043a\u0430\u043a REDB-tree \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439\u00a0<code>parent_id<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u2014 \u043d\u0435 \u043f\u043b\u043e\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0430\u00a0<strong>\u0434\u0435\u0440\u0435\u0432\u043e<\/strong>. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435:<\/p>\n<ul>\n<li>\n<p>\u0432\u0435\u0442\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u00ab\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439\u00bb \u043f\u0440\u043e\u0433\u043e\u043d \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438\u043b\u0438 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442-\u0432\u0435\u0442\u043a\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u043f\u0430\u0440\u0430\u043c \u0432\u0435\u0442\u043e\u043a (\u00ab\u0441-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 vs \u0431\u0435\u0437-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435\u00bb).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 sliding-window \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u00a0<strong>\u043e\u0442\u0440\u0435\u0437\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435<\/strong>. \u0412 tree-branching \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u00a0<strong>\u043f\u0438\u0448\u0435\u0442\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0448\u043b\u043e\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0435<\/strong>. \u0414\u043b\u044f production-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432\u0442\u043e\u0440\u043e\u0435 \u0446\u0435\u043d\u043d\u0435\u0435 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432 \u0432 \u043f\u0440\u043e\u0434\u0435 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0432\u043e\u0437\u044c\u043c\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440, \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0439 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u043c, \u0441\u0440\u0430\u0432\u043d\u0438 \u043e\u0446\u0435\u043d\u043a\u0438\u00bb.<\/p>\n<p>\u0418 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u00ab\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f LLM\u00bb. Tree \u0447\u0435\u0440\u0435\u0437\u00a0<code>parent_id<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<strong>\u0448\u0442\u0430\u0442\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c REDB<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430. LLM \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0432\u043e\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>9. Jury \u0438\u0437 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 arbiter&#8217;\u043e\u043c \u2014 Scatter-Gather + Aggregator<\/h4>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0451\u043d\u043d\u044b\u0445 production-\u043f\u0440\u0438\u0451\u043c\u043e\u0432:\u00a0<strong>\u043d\u0435 \u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438<\/strong>. \u041e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0448\u0451\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (Haiku, GPT-4o-mini, Mistral-Small, Gemini-Flash, Llama-3.1-70b \u0447\u0435\u0440\u0435\u0437 Groq), \u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u0438\u00a0<strong>\u0441\u0442\u0430\u0440\u0448\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/strong>\u00a0(Sonnet, Opus, GPT-4o) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u00a0<strong>\u043f\u043b\u044e\u0441 \u043f\u044f\u0442\u044c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432<\/strong>\u00a0\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0430\u0440\u0431\u0438\u0442\u0440: \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0439, \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0438\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f, \u043f\u0435\u0440\u0435\u0441\u043f\u0440\u043e\u0441\u0438\u00bb. \u0412 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0435 \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<strong>mixture-of-agents<\/strong>\u00a0\u0438\u043b\u0438\u00a0<strong>ensemble voting<\/strong>\u00a0\u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0451\u0442 +10..20% accuracy \u043d\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u043f\u0440\u0438 \u0446\u0435\u043d\u0435 \u043d\u0438\u0436\u0435, \u0447\u0435\u043c \u00ab\u0432\u0441\u0451 \u0447\u0435\u0440\u0435\u0437 Opus\u00bb.<\/p>\n<p>\u0412 \u0447\u0438\u0441\u0442\u043e\u0439 LangChain-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0439 orchestrator \u0441 try\/catch, retry \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 aggregation-\u043b\u043e\u0433\u0438\u043a\u043e\u0439. \u0412 ESB-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u00a0<strong>\u0448\u0442\u0430\u0442\u043d\u044b\u0439 EIP-\u043f\u0430\u0442\u0442\u0435\u0440\u043d Scatter-Gather + Aggregator<\/strong>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e 25-\u043b\u0435\u0442\u043d\u044f\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0448\u0438\u043d\u0430\u0445. LLM \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 endpoint&#8217;\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 Scatter-Gather \u0440\u0430\u0437\u043b\u0435\u0442\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code>From(\"kafka:\/\/contract-clauses-to-classify\")    .RouteId(\"contract-jury\")    .Multicast()                                          \/\/ Scatter        .Parallel()        .StopOnException(false)                           \/\/ \u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0443\u043f\u0430\u043b\u0430 \u2014 \u0442\u0435\u0440\u043f\u0438\u043c        .Timeout(TimeSpan.FromSeconds(30))                \/\/ \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0432\u0435\u0442\u043a\u0443        .To(Llm.Factory(\"haiku\")            .SystemPromptRef(\"#contract-classify@v3\")            .Temperature(0.0).MaxTokens(200).AsUri())        .To(Llm.Factory(\"gpt-4o-mini\")            .SystemPromptRef(\"#contract-classify@v3\")            .Temperature(0.0).MaxTokens(200).AsUri())        .To(Llm.Factory(\"groq-llama-70b\")            .SystemPromptRef(\"#contract-classify@v3\")            .Temperature(0.0).MaxTokens(200).AsUri())        .To(Llm.Factory(\"mistral-small\")            .SystemPromptRef(\"#contract-classify@v3\")            .Temperature(0.0).MaxTokens(200).AsUri())    .End()                                                \/\/ Gather: \u043e\u0442\u0432\u0435\u0442\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0432 Exchange.Properties[\"multicast.results\"]    .Process&lt;JuryAggregator&gt;()                            \/\/ \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u043c\u043f\u0442 \u0434\u043b\u044f \u0430\u0440\u0431\u0438\u0442\u0440\u0430    .To(Llm.Factory(\"sonnet\")                             \/\/ Arbiter        .SystemPromptRef(\"#jury-arbiter@v2\")        .Temperature(0.1).MaxTokens(500)        .CostBudget(usd: 0.05)        .AsUri())    .To(\"kafka:\/\/contract-clauses-classified\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>JuryAggregator<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u043c\u043f\u0442 \u0432\u0438\u0434\u0430 \u00ab\u0432\u043e\u0442 \u0437\u0430\u0434\u0430\u0447\u0430; \u0432\u043e\u0442 \u043e\u0442\u0432\u0435\u0442\u044b \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 A\/B\/C\/D; \u0432\u0435\u0440\u043d\u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0438\u043b\u0438 \u0441\u043a\u0430\u0436\u0438 unclear\u00bb. Arbiter \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435, \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c JSON. \u0425\u0435\u0434\u0435\u0440\u044b\u00a0<code>llm.tokens.in\/out<\/code>\u00a0\u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0442\u043a\u0438, \u043f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0430\u0440\u0431\u0438\u0442\u0440\u0430 \u2014 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043b\u0430\u0435\u0442 ESB-\u0444\u043e\u0440\u043c\u0430 \u0446\u0435\u043d\u043d\u044b\u043c:<\/p>\n<ul>\n<li>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/strong>\u00a0Multicast EIP \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 fan-out \u043f\u043e N \u0432\u0435\u0442\u043a\u0430\u043c, \u0436\u0434\u0430\u0442\u044c \u0432\u0441\u0435\u0445 \u0438\u043b\u0438 N \u0438\u0437 M, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0431\u043e\u0438. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c\u00a0<code>Task.WhenAll<\/code>\u00a0\u0441 custom-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/strong>\u00a0\u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0435\u0442\u043e\u043a \u0443\u043f\u0430\u043b\u0430 \u0438 retry \u0434\u0430\u043b \u0442\u043e\u0442 \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014\u00a0<code>ToolIdempotencyProps<\/code>\u00a0(\u0438\u043b\u0438 provider-side cache \u043f\u043e prompt-hash) \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u0446\u0438\u0440\u0443\u0435\u0442. \u041d\u0435 \u043f\u043b\u0430\u0442\u0438\u043c \u0437\u0430 \u0434\u0443\u0431\u043b\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u044e\u0434\u0436\u0435\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/strong>\u00a0<code>.CostBudget(usd: 0.05)<\/code>\u00a0\u043d\u0430 arbiter&#8217;\u0435 \u0441\u0442\u043e\u0438\u0442 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 circuit-breaker; \u043d\u0430 \u0432\u0435\u0442\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u00a0<code>.CostBudget(usd: 0.01)<\/code>. Cap \u043d\u0430 \u0432\u0441\u0451 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u2014 \u0447\u0435\u0440\u0435\u0437\u00a0<code>CostBudgetProps<\/code>\u00a0\u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u0415\u0441\u043b\u0438 jury \u0432\u044b\u0448\u043b\u043e \u0437\u0430 \u043b\u0438\u043c\u0438\u0442 \u2014 failfast, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 rule-based fallback (\u0435\u0433\u043e \u0436\u0435 \u043f\u0438\u0448\u0435\u043c \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0432\u0435\u0442\u043a\u0443 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430).<\/p>\n<\/li>\n<li>\n<p><strong>Audit \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/strong>\u00a0\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u044f\u0442\u0438 LLM-\u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0<code>ToolAuditProps<\/code>, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 exchange-id. \u0427\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u00ab\u043c\u043e\u0434\u0435\u043b\u044c \u0425 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0430\u0441\u044c \u0441 \u0430\u0440\u0431\u0438\u0442\u0440\u043e\u043c \u0432 73% \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043c\u043e\u0436\u043d\u043e \u0435\u0451 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Eval \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/strong>\u00a0<code>EvalRunProps<\/code>\u00a0\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0433\u043e\u043d \u0441 \u043f\u044f\u0442\u044c\u044e \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 + \u043e\u0434\u043d\u0438\u043c \u0430\u0440\u0431\u0438\u0442\u0440\u043e\u043c \u2014 \u043f\u043e\u0442\u043e\u043c \u043d\u0430 golden-set&#8217;\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c\u00a0<strong>\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0441\u0442\u0430\u0432 jury<\/strong>\u00a0(\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c gpt-4o-mini \u043d\u0430 gemini-flash, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0443\u043f\u0430\u043b\u043e \u043b\u0438 accuracy).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u0430\u0451\u0442 \u0434\u0432\u0435 \u043e\u0449\u0443\u0442\u0438\u043c\u044b\u0435 \u043f\u043e\u0431\u0435\u0434\u044b. \u041f\u0435\u0440\u0432\u0430\u044f \u2014\u00a0<strong>\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0432 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0432\u0438\u0434\u0430 \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u043d\u043a\u0442 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430 \u043a\u0430\u043a \u0440\u0438\u0441\u043a\/\u043d\u0435-\u0440\u0438\u0441\u043a\u00bb, \u0433\u0434\u0435 \u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0448\u0438\u0431\u0430\u0435\u0442\u0441\u044f, jury \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0434\u0435\u0448\u0451\u0432\u044b\u0445 + \u0430\u0440\u0431\u0438\u0442\u0440-Sonnet \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0431\u0433\u043e\u043d\u044f\u0435\u0442 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 Opus,\u00a0<strong>\u0432 2.5 \u0440\u0430\u0437\u0430 \u0434\u0435\u0448\u0435\u0432\u043b\u0435<\/strong>. \u0412\u0442\u043e\u0440\u0430\u044f \u2014\u00a0<strong>\u0440\u043e\u0431\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0435\u0441\u043b\u0438 Anthropic \u043b\u0435\u0436\u0438\u0442, \u0432\u0435\u0442\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 Anthropic \u0443\u043f\u0430\u043b\u0430, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0430\u043b\u0438 \u043e\u0442\u0432\u0435\u0442, \u0430\u0440\u0431\u0438\u0442\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u044f\u0442\u0438 \u0438 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u044b\u043d\u0435\u0441 \u0432\u0435\u0440\u0434\u0438\u043a\u0442. \u0414\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f \u043c\u044f\u0433\u043a\u0430\u044f, \u0430 \u043d\u0435 \u00ab\u0443\u043f\u0430\u043b\u043e \u0432\u0441\u0451\u00bb.<\/p>\n<p>\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0448\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0434\u0435:\u00a0<strong>\u0430\u0440\u0431\u0438\u0442\u0440\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/strong>. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435 \u0430\u0440\u0431\u0438\u0442\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u00ab\u0432\u043e\u0442 \u043e\u0442\u0432\u0435\u0442 Claude Haiku, \u0432\u043e\u0442 \u043e\u0442\u0432\u0435\u0442 GPT-4o-mini\u00bb \u2014 \u0430\u0440\u0431\u0438\u0442\u0440 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442 \u0444\u0430\u0432\u043e\u0440\u0438\u0442\u044b (\u043a\u0430\u043a \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0<code>JuryAggregator<\/code>\u00a0\u043c\u044b \u0430\u043d\u043e\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u044b \u043a\u0430\u043a\u00a0<code>A\/B\/C\/D<\/code>, \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a (Latin square \u043f\u043e\u00a0<code>exchange-id<\/code>\u00a0\u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438) \u0438\u00a0<strong>\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0430\u0440\u0431\u0438\u0442\u0440\u0430<\/strong>\u00a0\u043c\u0430\u043f\u0438\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u00ab\u043a\u0442\u043e \u0431\u044b\u043b A\u00bb. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0434\u043b\u044f post-hoc \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u00ab\u043a\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0430\u0449\u0435 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441 \u0430\u0440\u0431\u0438\u0442\u0440\u043e\u043c\u00bb.<\/p>\n<h4>10. Sub-agents: \u0430\u0433\u0435\u043d\u0442 \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430<\/h4>\n<p>\u041f\u0440\u044f\u043c\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u00ab\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 = \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u00bb: \u0435\u0441\u043b\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u00a0<code>.To(\"llm:\/\/...\")<\/code>, \u0442\u043e\u00a0<strong>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0430\u0433\u0435\u043d\u0442<\/strong>. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u00ab\u0437\u043d\u0430\u0435\u0442\u00bb, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u0438\u0434\u0438\u0442 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 LLM. \u0414\u043b\u044f \u043d\u0435\u0433\u043e\u00a0<code>research_topic<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 tool, \u043a\u0430\u043a\u00a0<code>web_search<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>math_eval<\/code>. \u0412\u043d\u0443\u0442\u0440\u0438 \u0436\u0435 \u2014 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 second-tier \u0430\u0433\u0435\u043d\u0442 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438: \u043c\u043e\u0434\u0435\u043b\u044c\u044e, \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u043c, \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c, \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043b\u043a\u043e\u043c, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043c\u0438 retry, RAG-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>\/\/ Subagent: \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438From(\"direct:research-subagent\")    .AsLlmTool(\"research_topic\")        .Description(\"\u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b. \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 {topic, depth}. \" +                     \"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 summary \u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438.\")        .Input(\"\"\"{\"type\":\"object\",\"properties\":{                    \"topic\":{\"type\":\"string\"},                    \"depth\":{\"type\":\"string\",\"enum\":[\"short\",\"deep\"]}},                  \"required\":[\"topic\"]}\"\"\")        .SideEffect(ToolSideEffect.ReadOnly)        .Cost(ToolCostClass.Expensive)               \/\/ \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043d\u0435\u0434\u0435\u0448\u0451\u0432\u044b\u0439    .Then()    .Knowledge(\"research-corpus\", k: 12)             \/\/ sub-agent \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e RAG-\u0431\u0430\u0437\u0443    .To(Llm.Factory(\"sonnet\")                        \/\/ \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2014 research-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442        .SystemPromptRef(\"#research-specialist@v3\")        .Tools(\"tavily_web_search\", \"http_fetch\", \"regex_extract\")        .MaxIterations(8)        .CostBudget(usd: 0.30)                       \/\/ sub-agent \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0431\u044e\u0434\u0436\u0435\u0442        .Temperature(0.1).AsUri())    .Process&lt;ExtractResearchSummary&gt;();\/\/ \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 sub-agent \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 tool \u0432 \u0441\u0432\u043e\u0451\u043c \u043d\u0430\u0431\u043e\u0440\u0435From(\"kafka:\/\/complex-business-questions\")    .To(Llm.Factory(\"opus\")                          \/\/ planner \u2014 \u0441\u0442\u0430\u0440\u0448\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c        .SystemPromptRef(\"#senior-analyst@v1\")        .Tools(\"research_topic\",                     \/\/ \u2190 \u043d\u0430\u0448 sub-agent               \"sql_query\",                          \/\/ \u2190 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 data-tool               \"math_eval\",                          \/\/ \u2190 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f               \"draft_report\")                       \/\/ \u2190 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d sub-agent (\u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a \u043e\u0442\u0447\u0451\u0442\u0430)        .MaxIterations(15)        .CostBudget(usd: 2.00)                       \/\/ budget \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f        .AsUri())    .To(\"kafka:\/\/business-answers\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438: \u043a\u043e\u0433\u0434\u0430 Opus \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u0437\u0432\u0430\u0442\u044c\u00a0<code>research_topic<\/code>, \u0430\u0433\u0435\u043d\u0442-engine \u0441\u0442\u0440\u043e\u0438\u0442 JSON-\u0432\u0445\u043e\u0434 \u0438 \u0447\u0435\u0440\u0435\u0437\u00a0<code>RouteToolBridge<\/code>\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430\u00a0<code>direct:research-subagent<\/code>. \u042d\u0442\u043e\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u00a0<strong>\u043d\u043e\u0432\u044b\u0439 Exchange<\/strong>, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044f transaction-scope, principal, headers \u0438 DI-scope \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e. \u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e Sonnet \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 tool-use loop (web search \u2192 fetch \u2192 extract), \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441 \u0434\u0435\u0441\u044f\u0442\u044c\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u0438 \u0442\u0440\u0435\u043c\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 summary \u0432\u00a0<code>Out.Body<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0433\u0435\u043d\u0442-engine \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043a\u0430\u043a\u00a0<code>tool_result<\/code>\u00a0\u0434\u043b\u044f Opus. Opus \u0432\u0438\u0434\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u043e\u0432\u0451\u0442 \u0435\u0449\u0451.<\/p>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438:\u00a0<strong>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430 \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043f\u0435\u0446\u043a\u043e\u0434\u0430<\/strong>. Sub-agent \u0432\u043d\u0443\u0442\u0440\u0438 sub-agent&#8217;\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c. \u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 audit, budget, idempotency, prompt-versioning, RAG, governance \u2014 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u00ab\u0443\u0440\u043e\u0432\u043d\u044e \u0430\u0433\u0435\u043d\u0442\u0430\u00bb, \u043e\u043d\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a Exchange&#8217;\u0443, \u0430 Exchange \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u0435.<\/p>\n<p>\u042d\u0442\u043e \u0434\u0430\u0451\u0442\u00a0<strong>\u0442\u0440\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u00ab\u043e\u0434\u0438\u043d-\u0430\u0433\u0435\u043d\u0442-\u043c\u043d\u043e\u0433\u043e-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00bb \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e:<\/p>\n<p><strong>(\u0430) Hierarchical agents \u2014 planner \u0438 workers.<\/strong>\u00a0\u0421\u0442\u0430\u0440\u0448\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c (Opus, GPT-4o) \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430: \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u043a\u0443\u0441\u043a\u0438 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u2014 sub-agent \u0441 \u0443\u0437\u043a\u0438\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u043c \u0438 \u0443\u0437\u043a\u0438\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0423 planner&#8217;\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0431\u044b\u0442\u044c \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 subagent&#8217;\u043e\u0432. \u042d\u0442\u043e \u0434\u0430\u0451\u0442\u00a0<strong>\u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0438\u0439<\/strong>: planner \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0434\u0451\u0440\u043d\u0443\u0442\u044c\u00a0<code>delete_records<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442; \u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u00a0<code>data-cleanup-subagent<\/code>, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 planner \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e.<\/p>\n<p><strong>(\u0431) Specialist subagents \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e.<\/strong>\u00a0Sub-agent \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439\u00a0<code>conversationId<\/code>\u00a0(\u0434\u0440\u0443\u0433\u0430\u044f \u0432\u0435\u0442\u043a\u0430 REDB-tree), \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440\u00a0<code>Knowledge(...)<\/code>-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432. \u0423\u0441\u043b\u043e\u0432\u043d\u044b\u0439\u00a0<code>legal-review-subagent<\/code>\u00a0\u0436\u0438\u0432\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 legal-knowledge \u0431\u0430\u0437\u044b, \u0432\u0438\u0434\u0438\u0442\u00a0<strong>\u0442\u043e\u043b\u044c\u043a\u043e<\/strong>\u00a0\u0435\u0451, \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u0432 \u043f\u0440\u0430\u0432\u043e\u0432\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435, \u0438 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0430\u0433\u0435\u043d\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u0438\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. ACL \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u00ab\u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u043f\u0440\u043e\u0446\u0438\u0442\u0438\u0440\u0443\u0435\u0442\u00bb.<\/p>\n<p><strong>(\u0432) Cost-shaped escalation.<\/strong>\u00a0\u0414\u0435\u0448\u0451\u0432\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 (Haiku) \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0435\u0440\u0432\u044b\u043c. \u0415\u0441\u043b\u0438 \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u00a0<code>unclear<\/code>\u00a0\u0438\u043b\u0438 confidence \u043d\u0438\u0436\u0435 \u043f\u043e\u0440\u043e\u0433\u0430, \u043e\u043d \u0441\u0430\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u00a0<code>escalate_to_senior<\/code>\u00a0\u043a\u0430\u043a tool \u2014 \u0438 \u043f\u043e\u0434 \u044d\u0442\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u0438\u0434\u0438\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a Opus \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0441\u0435\u0434\u0430\u0435\u0442 \u043d\u0430 Haiku \u0437\u0430 \u043a\u043e\u043f\u0435\u0439\u043a\u0438; \u0432 Opus \u0443\u0445\u043e\u0434\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435. \u041d\u0430 big-volume workloads \u044d\u0442\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u0432 \u0440\u0430\u0437\u044b.<\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u043e static-jury \u0438\u0437 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u21169:\u00a0<strong>jury \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0448\u0438\u0442\u044b\u0439 subagent pattern<\/strong>. \u041c\u0430\u0440\u0448\u0440\u0443\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c N \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432 \u0438 \u043e\u0434\u0438\u043d \u0430\u0440\u0431\u0438\u0442\u0440; DAG \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0432 DSL.\u00a0<strong>Sub-agents-as-tools \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u00a0<strong>\u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442<\/strong>, \u043a\u043e\u0433\u043e \u043f\u043e\u0437\u0432\u0430\u0442\u044c \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. Jury \u043b\u0443\u0447\u0448\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438\/\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430. Sub-agents \u2014 \u0434\u043b\u044f open-ended \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0433\u0434\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b.<\/p>\n<p>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u0430\u043c\u0435\u043d\u044c \u2014 \u0446\u0438\u043a\u043b\u044b. \u0415\u0441\u043b\u0438 sub-agent A \u043c\u043e\u0436\u0435\u0442 \u0437\u0432\u0430\u0442\u044c B, \u0430 B \u043c\u043e\u0436\u0435\u0442 \u0437\u0432\u0430\u0442\u044c A, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u043f\u0443\u0441\u043a. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u043d \u0433\u0430\u0441\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u043c\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u044f\u043c\u0438:\u00a0<code>MaxIterations<\/code>\u00a0\u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 (sub-agent \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u0432\u0435\u0447\u043d\u043e),\u00a0<code>CostBudgetProps<\/code>\u00a0(\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432), \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 depth-limit \u0432 headers (<code>LlmHeaders.SubAgentDepth<\/code>\u00a0\u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438). \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0441\u043b\u0435\u00a0<code>depth = 3-4<\/code>\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0443\u0436\u0435 \u043d\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0442.<\/p>\n<p>\u0418 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u0430:\u00a0<strong>subagent \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442<\/strong>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 URI. \u0420\u0430\u0437\u043d\u044b\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0448\u0430\u0440\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e\u00a0<code>research-subagent<\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439\u00a0<code>?redb=acme<\/code>\u00a0\u0434\u043b\u044f tenant-isolation, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 rate-limiter (<code>?throttle=5\/sec<\/code>), \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 circuit-breaker. Sub-agent \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a\u00a0<strong>\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 LLM-\u0443\u0440\u043e\u0432\u043d\u044f<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c\u0438, \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044f \u043f\u0440\u043e\u043c\u043f\u0442 \u0438 \u043d\u0435 \u043f\u043b\u043e\u0434\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u044b.<\/p>\n<hr\/>\n<h3>Streaming: \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430<\/h3>\n<p>\u0412 3.1.0 streaming \u0431\u044b\u043b \u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432, \u043d\u043e\u00a0<strong>\u043d\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u043b \u0434\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/strong>\u00a0\u2014 \u043c\u044b \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0412 3.1.1 \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043e\u0442\u0434\u0430\u0451\u0442\u00a0<code>IAsyncEnumerable&lt;string&gt;<\/code>\u00a0\u2014 \u043a\u0430\u0434\u0440\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0430\u0433\u0435\u043d\u0442-engine \u043a\u043b\u0430\u0434\u0451\u0442 \u044d\u0442\u043e \u0432\u00a0<code>Out.Body<\/code>\u00a0\u043a\u0430\u043a\u00a0<code>IAsyncEnumerable&lt;string&gt;<\/code>,\u00a0<strong>\u043d\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044f<\/strong>;<\/p>\n<\/li>\n<li>\n<p>HTTP-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440 \u0432\u0438\u0434\u0438\u0442\u00a0<code>IAsyncEnumerable&lt;string&gt;<\/code>\u00a0\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 SSE-\u0440\u0435\u0436\u0438\u043c \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u00a0<code>data: ...\\n\\n<\/code>;<\/p>\n<\/li>\n<li>\n<p>WS-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440 \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c WebSocket message;<\/p>\n<\/li>\n<li>\n<p>non-streaming consumer&#8217;\u044b (Kafka, RabbitMQ, ActiveMQ) \u2014 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442\u00a0<strong>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e<\/strong>: streaming \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0436\u0438\u043c\u043e\u043c \u00ab\u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c streaming-API \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 API\u00bb. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u00a0<strong>\u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u00a0<\/strong><code><strong>Out.Body<\/strong><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 consumer-side \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0432\u043e\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0422\u043e\u0442 \u0436\u0435 exchange \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0438 \u0432 SSE, \u0438 \u0432 Kafka \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e (multicast EIP) \u2014 Kafka-\u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0434\u043e\u0436\u0434\u0451\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, SSE-\u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0443\u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u0434\u0440\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00abIterator \u0432\u043c\u0435\u0441\u0442\u043e Collection \u0432 payload\u00bb: \u043d\u0430 pipe&#8217;\u0430\u0445 \u043e\u043d \u0434\u0430\u0432\u043d\u043e \u0436\u0438\u0432\u0451\u0442. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0435 \u2014 \u044d\u0442\u043e, \u0447\u0442\u043e async-iteration \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\u00a0<strong>\u0432\u043d\u0443\u0442\u0440\u0438<\/strong>\u00a0end-to-end Exchange-tracking&#8217;\u0430, \u0447\u0442\u043e\u0431\u044b tracing\/metrics \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c, \u0430 \u043d\u0435 \u00ab\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0434\u0438\u043d Exchange \u0438 \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u0438\u0441\u044c\u00bb.<\/p>\n<hr\/>\n<h3>RAG: \u0447\u0430\u043d\u043a\u0438 \u0432 REDB \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b<\/h3>\n<p>\u0412 3.1.1\u00a0<code>KnowledgeChunkProps<\/code>\u00a0\u2014 \u044d\u0442\u043e REDB-\u043e\u0431\u044a\u0435\u043a\u0442 \u0441:<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c (<code>text<\/code>),<\/p>\n<\/li>\n<li>\n<p>\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c (<code>source-uri<\/code>,\u00a0<code>tenant-id<\/code>,\u00a0<code>doc-id<\/code>,\u00a0<code>chunk-index<\/code>),<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u044f\u0437\u044b\u043a, \u0434\u0430\u0442\u0430, \u0442\u0435\u0433\u0438, ACL \u2014 \u043a\u0442\u043e \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0432\u0438\u0434\u0435\u0442\u044c),<\/p>\n<\/li>\n<li>\n<p>placeholder&#8217;\u043e\u043c \u0434\u043b\u044f embedding (\u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u043e\u0435\u0434\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c, MVP \u2014 keyword search \u0447\u0435\u0440\u0435\u0437\u00a0<code>value_string<\/code>-\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 FTS).<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0<strong>RAG-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a = \u043c\u0430\u0440\u0448\u0440\u0443\u0442<\/strong>, \u0430 \u043d\u0435 \u00ab\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u00bb. \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u00a0<code>From(\"file:\/\/docs?include=*.md\").To(\"knowledge:\/\/acme\")<\/code>\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b. \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u00a0<code>From(\"kafka:\/\/support-tickets\").Knowledge(\"acme\", k: 5)<\/code>\u00a0\u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043f-5 \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442 \u043f\u0435\u0440\u0435\u0434\u00a0<code>.To(\"llm:\/\/claude\")<\/code>. ACL \u0438 tenant-\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e\u00a0<code>value_*<\/code>-\u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 SQL \u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u043d\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c vector-store \u2014 \u043e\u043d \u0432\u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u044f\u0434\u043e\u043c \u0441 keyword-search \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435\u00a0<code>IKnowledgeStore<\/code>\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u0445. \u042d\u0442\u043e\u00a0<strong>\u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/strong>: \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u0444\u0438\u0447\u0438 \u043d\u0435 \u043b\u043e\u043c\u0430\u044e\u0442 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b.<\/p>\n<hr\/>\n<h3>\u0422\u0440\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 enterprise-\u043a\u0435\u0439\u0441\u0430: \u043e\u0442\u0447\u0451\u0442\u044b, \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b, \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432\u044b\u0448\u0435 \u2014 \u044d\u0442\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u0442\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u0438 \u043a\u0438\u0440\u043f\u0438\u0447\u0438\u043a\u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 enterprise-\u043c\u0430\u0440\u0448\u0440\u0443\u0442. \u0411\u0435\u0437 AI-\u0445\u0430\u0439\u043f\u0430, \u0431\u0435\u0437 \u00ab\u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438\u00bb, \u0431\u0435\u0437 \u0441\u043b\u043e\u0432 \u00ab\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044e\u00bb. \u041f\u0440\u043e\u0441\u0442\u043e\u00a0<strong>\u0440\u0443\u0442\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u044e\u0434\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0440\u0443\u043a\u0430\u043c\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c, \u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0436\u0438\u0432\u0451\u0442 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0448\u0438\u043d\u0435, \u0447\u0442\u043e \u0438 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong>.<\/p>\n<h4>\u041a\u0435\u0439\u0441 1. \u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 CFO \u043d\u0430 email \u2014 \u0441\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0441 \u043f\u0440\u043e\u0448\u043b\u044b\u043c \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u043e\u043c<\/h4>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c \u0432 7:00 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442: \u0432\u044b\u0440\u0443\u0447\u043a\u0443 \u0437\u0430 \u0432\u0447\u0435\u0440\u0430, \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043f\u043e \u0441\u0442\u0430\u0442\u044c\u044f\u043c, \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043b\u0430\u043d\u0430, top-5 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043f\u043e \u0441\u0447\u0435\u0442\u0430\u043c, \u043a\u0443\u0440\u0441\u044b \u0432\u0430\u043b\u044e\u0442. \u041f\u043e\u0442\u043e\u043c \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u043e\u0432\u043a\u0443 \u2014 \u00ab\u0432\u044b\u0440\u0443\u0447\u043a\u0430 +3.2% \u043a \u043f\u043b\u0430\u043d\u0443, \u0440\u0430\u0441\u0445\u043e\u0434\u044b +1.7%, \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0442\u0441\u044f \u0425\u00bb. \u0423\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u0442\u043e \u0447\u0430\u0441-\u043f\u043e\u043b\u0442\u043e\u0440\u0430. \u0415\u0441\u0442\u044c \u043b\u0438 \u0441\u043c\u044b\u0441\u043b \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c AI-\u0441\u0435\u0440\u0432\u0438\u0441\u0435? \u041c\u043e\u0436\u043d\u043e. \u0421\u0442\u043e\u0438\u0442 \u043b\u0438? \u041d\u0435\u0442.<\/p>\n<p>\u041c\u0430\u0440\u0448\u0440\u0443\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c:<\/p>\n<pre><code>\/\/ \u041a\u0430\u0436\u0434\u043e\u0435 \u0443\u0442\u0440\u043e \u0432 07:00 \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438From(\"cron:\/\/daily-cfo-report?schedule=0 0 7 ? * MON-FRI\")    .RouteId(\"daily-cfo-report\")    .Process&lt;LoadYesterdayMetrics&gt;()                       \/\/ \u0442\u044f\u043d\u0435\u0442 \u0438\u0437 1\u0421\/SAP\/\u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0433\u043e API                                                            \/\/ \u2192 e.In.Body = {revenue, expenses, accounts, fx, top5}    .Process&lt;LoadQuarterContext&gt;()                         \/\/ \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 ETL: \u043f\u043b\u0430\u043d, \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u043a\u0432\u0430\u0440\u0442\u0430\u043b, MTD\/QTD    .ConvertBody&lt;FinancialDailySnapshot&gt;()                 \/\/ strongly-typed payload    .Multicast().Parallel()        .To(Llm.Factory(\"haiku\")                           \/\/ \u0432\u0435\u0442\u043a\u0430 A: \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438, \u0434\u043b\u044f CFO            .SystemPromptRef(\"#cfo-daily-summary-ru@v7\")            .Temperature(0.1).MaxTokens(800)            .CostBudget(usd: 0.02).AsUri())        .To(Llm.Factory(\"haiku\")                           \/\/ \u0432\u0435\u0442\u043a\u0430 B: english, \u0434\u043b\u044f board chat            .SystemPromptRef(\"#cfo-daily-summary-en@v7\")            .Temperature(0.1).MaxTokens(800)            .CostBudget(usd: 0.02).AsUri())    .End()    .Process&lt;RenderHtmlReport&gt;()                           \/\/ mustache-\u0448\u0430\u0431\u043b\u043e\u043d: \u0446\u0438\u0444\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439,                                                            \/\/ \u0442\u0435\u043a\u0441\u0442 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0432\u0432\u0435\u0440\u0445\u0443 \u043a\u0430\u043a summary    .To(\"smtp:\/\/mail.acme.com?to=cfo@acme.com,board@acme.com\" +        \"&amp;subject=Daily%20FY%20snapshot%20${date:yyyy-MM-dd}\")    .To(\"teams:\/\/board-channel?card=adaptive\")             \/\/ \u0442\u0430 \u0436\u0435 html-\u0441\u0435\u043a\u0446\u0438\u044f \u2192 Teams adaptive card    .Wiretap(\"kafka:\/\/reports.cfo-daily.archive\");         \/\/ \u043a\u043e\u043f\u0438\u044f \u0432 \u0430\u0440\u0445\u0438\u0432 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0435\u043c\u044c \u0448\u0430\u0433\u043e\u0432, \u0438 \u0432 \u044d\u0442\u0438\u0445 \u0441\u0435\u043c\u0438 \u0448\u0430\u0433\u0430\u0445 \u0437\u0430\u043a\u0440\u044b\u0442\u043e \u0432\u0441\u0451:<\/p>\n<ul>\n<li>\n<p><strong>\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong>\u00a0\u2014\u00a0<code>cron<\/code>-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 URI, \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0434\u0443\u043b\u0435\u0440\u0430;\u00a0<code>redb.Route<\/code>\u00a0\u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>\u00a0\u2014\u00a0<code>LoadYesterdayMetrics<\/code>\u00a0\u044d\u0442\u043e\u00a0<strong>\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0451\u0440\u0433\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435\u00a0<code>redb.Route<\/code>\u00a0(Kafka\/REST\/JDBC), \u0438 \u043b\u044e\u0431\u044b\u0435 retry\/circuit-breaker&#8217;\u044b \u0443 \u044d\u0442\u0438\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u0443\u0436\u0435 \u0441\u0442\u043e\u044f\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0432\u0443\u044f\u0437\u044b\u0447\u043d\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/strong>\u00a0\u2014 multicast \u0432 \u0434\u0432\u0435 \u0432\u0435\u0442\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0435\u0448\u0451\u0432\u043e\u0433\u043e Haiku \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u043c\u043f\u0442-\u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438. \u0421\u0442\u043e\u0438\u0442 \u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u0431\u044e\u0434\u0436\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043c\u043f\u0442<\/strong>\u00a0\u2014\u00a0<code>#cfo-daily-summary-ru@v7<\/code>. \u0427\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 CFO \u0441\u043a\u0430\u0436\u0435\u0442 \u00ab\u043e\u0442\u0447\u0451\u0442 \u0441\u0442\u0430\u043b \u0445\u0443\u0436\u0435\u00bb \u2014 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u00a0<code>EvalRunProps<\/code>, \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e v7 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u044d\u0442\u0430\u043b\u043e\u043d\u0435 \u2192 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 v6 \u0431\u0435\u0437 redeploy.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043d\u0430\u043b \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438<\/strong>\u00a0\u2014 \u0434\u0432\u0430 transport&#8217;\u0430 (SMTP + Teams), \u043e\u0431\u0430 \u0448\u0442\u0430\u0442\u043d\u044b\u0435\u00a0<code>redb.Route<\/code>-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b. \u0417\u0430\u0432\u0442\u0440\u0430 CFO \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442 \u00ab\u0435\u0449\u0451 \u0432 Slack\u00bb \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u00a0<code>.To(\"slack:\/\/...\")<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0443\u0434\u0438\u0442<\/strong>\u00a0\u2014\u00a0<code>Wiretap<\/code>\u00a0\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0432 Kafka-\u0430\u0440\u0445\u0438\u0432. \u0420\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u00ab\u043f\u043e\u043a\u0430\u0436\u0438 \u043e\u0442\u0447\u0451\u0442 \u0437\u0430 2026-04-15\u00bb \u2014 \u0432\u044b\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 \u0441 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u00ab\u043c\u043e\u0434\u0435\u043b\u044c X, \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0430 Y, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 Z\u00bb (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0<code>MessageProps<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 \u0438 input, \u0438 output).<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u044e\u0434\u0436\u0435\u0442<\/strong>\u00a0\u2014\u00a0<code>.CostBudget(usd: 0.02)<\/code>\u00a0\u043d\u0430 \u0432\u0435\u0442\u043a\u0435. 250 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0434\u043d\u0435\u0439 \u00d7 2 \u0432\u0435\u0442\u043a\u0438 \u00d7 $0.02 = $10\/\u0433\u043e\u0434 \u043d\u0430 \u043e\u0442\u0447\u0451\u0442\u044b. \u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u0430\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0443\u0440\u0430 \u0437\u0430 \u0447\u0430\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430 \u2014 $50. \u041e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0434\u0435\u043d\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 enterprise-\u043a\u0435\u0439\u0441\u043e\u043c, \u0430 \u043d\u0435 \u0438\u0433\u0440\u0443\u0448\u043a\u043e\u0439: \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 CFO \u0436\u0430\u043b\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u00ab\u0441\u0442\u0440\u0430\u043d\u043d\u0443\u044e \u0446\u0438\u0444\u0440\u0443 \u0432 \u043e\u0442\u0447\u0451\u0442\u0435\u00bb, \u0430\u0443\u0434\u0438\u0442\u043e\u0440 \u043f\u043e trace-id \u0437\u0430\u00a0<strong>30 \u0441\u0435\u043a\u0443\u043d\u0434<\/strong>\u00a0\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442: \u043a\u0430\u043a\u043e\u0439 snapshot \u0431\u044b\u043b \u043d\u0430 \u0432\u0445\u043e\u0434\u0435, \u043a\u0430\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0430\u0441\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e output \u043f\u0440\u0438\u0448\u0451\u043b \u043e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b \u0443\u0448\u0451\u043b \u043d\u0430 email, \u043a\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0432 Teams. \u041d\u0435 \u00ab\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u044f \u0437\u0430\u0432\u0442\u0440\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0443\u0441\u044c \u0438 \u043f\u0440\u0438\u0448\u043b\u044e\u00bb. \u0410 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u2014 REDB-\u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a \u043e\u0434\u043d\u043e\u043c\u0443 exchange-id.<\/p>\n<h4>\u041a\u0435\u0439\u0441 2. \u041f\u0440\u043e\u0433\u043d\u043e\u0437 cash-flow \u043d\u0430 30 \u0434\u043d\u0435\u0439 \u0441 jury \u0438\u0437 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0438 \u0430\u0440\u0431\u0438\u0442\u0440\u043e\u043c<\/h4>\n<p>\u0424\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043d\u043e\u0437 \u2014 \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0433\u0434\u0435\u00a0<strong>\u043e\u0434\u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u0440\u0435\u0434\u043d\u0435\u0435, \u0447\u0435\u043c \u043d\u043e\u043b\u044c \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/strong>: \u043e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0433\u043e\u043b\u043e\u0441\u043e\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0440\u043e\u0436\u0435, \u0447\u0435\u043c \u043c\u0435\u0441\u044f\u0446 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u21169 (jury + arbiter) \u0432\u043e \u0432\u0435\u0441\u044c \u0440\u043e\u0441\u0442.<\/p>\n<pre><code>From(\"cron:\/\/weekly-cashflow-forecast?schedule=0 0 9 ? * MON\")    .RouteId(\"weekly-cashflow-forecast\")    .Process&lt;BuildCashflowFeatures&gt;()                      \/\/ \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0441\u0447\u0435\u0442\u0430, \u0434\u0435\u0431\u0438\u0442\u043e\u0440\u043a\u0430\/\u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0440\u043a\u0430,                                                            \/\/ \u043f\u043b\u0430\u043d\u043e\u0432\u044b\u0435 \u043f\u043b\u0430\u0442\u0435\u0436\u0438, \u0441\u0435\u0437\u043e\u043d\u043d\u043e\u0441\u0442\u044c, FX-\u043f\u043e\u0437\u0438\u0446\u0438\u0438    .Knowledge(\"acme-finance\", k: 8)                       \/\/ RAG: \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0433\u0430\u0439\u0434\u043b\u0430\u0439\u043d\u044b \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f,                                                            \/\/ \u043f\u0440\u043e\u0448\u043b\u044b\u0435 \u043e\u0442\u0447\u0451\u0442\u044b, \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u044f    .Multicast().Parallel().Timeout(TimeSpan.FromMinutes(2))        .To(Llm.Factory(\"sonnet\")                          \/\/ 4 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u044b\u043b\u0438            .SystemPromptRef(\"#cashflow-forecast@v4\")      \/\/ \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438, \u0430 \u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438            .Temperature(0.2).MaxTokens(2000).AsUri())        .To(Llm.Factory(\"gpt-4o\")            .SystemPromptRef(\"#cashflow-forecast@v4\")            .Temperature(0.2).MaxTokens(2000).AsUri())        .To(Llm.Factory(\"gemini-pro\")            .SystemPromptRef(\"#cashflow-forecast@v4\")            .Temperature(0.2).MaxTokens(2000).AsUri())        .To(Llm.Factory(\"mistral-large\")            .SystemPromptRef(\"#cashflow-forecast@v4\")            .Temperature(0.2).MaxTokens(2000).AsUri())    .End()    .Process&lt;JuryAggregator&gt;()                             \/\/ \u0430\u043d\u043e\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f A\/B\/C\/D + \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0435    .To(Llm.Factory(\"opus\")                                \/\/ arbiter \u2014 \u0441\u0430\u043c\u0430\u044f \u043c\u043e\u0449\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c        .SystemPromptRef(\"#cashflow-arbiter@v2\")        .Temperature(0.1).MaxTokens(3000)        .CostBudget(usd: 0.50).AsUri())    .Process&lt;ExtractStructuredForecast&gt;()                  \/\/ \u043f\u0430\u0440\u0441\u0438\u043c JSON: 30 \u0434\u043d\u0435\u0439 \u0441 low\/mid\/high    .Choice()        .When(e =&gt; e.In.Body&lt;Forecast&gt;().ConfidenceLow &lt; 0.6)            .Process&lt;ApprovalGate&gt;()                       \/\/ \u043d\u0438\u0437\u043a\u0430\u044f \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2192 \u0436\u0434\u0438 CFO            .To(\"smtp:\/\/...?to=cfo@acme.com&amp;priority=high\")        .Otherwise()            .Process&lt;RenderForecastReport&gt;()            .To(\"smtp:\/\/...?to=treasury@acme.com\")    .End()    .Wiretap(\"kafka:\/\/reports.cashflow.archive\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 ~$2-3 \u0437\u0430 \u043f\u0440\u043e\u0433\u043e\u043d, \u043f\u0440\u043e\u0433\u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437 \u0432 \u043d\u0435\u0434\u0435\u043b\u044e \u2014 \u0442\u043e \u0435\u0441\u0442\u044c ~$150\/\u0433\u043e\u0434. \u0410\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u0431\u044b \u0434\u0435\u043d\u044c \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0443. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0432 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u2014\u00a0<strong>\u0432 \u0440\u043e\u0431\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438<\/strong>: \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 (Anthropic, OpenAI, Google, Mistral) \u0434\u0430\u044e\u0442 \u043c\u043e\u0434\u0435\u043b\u044c\u00a0<strong>\u00ab\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f\u00bb \u043a\u0430\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>. \u0415\u0441\u043b\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0448\u043b\u0438\u0441\u044c \u2014 \u0430\u0440\u0431\u0438\u0442\u0440 Opus \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442. \u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u044a\u0435\u0445\u0430\u043b\u0438\u0441\u044c \u2014 \u0430\u0440\u0431\u0438\u0442\u0440 \u043f\u0438\u0448\u0435\u0442 \u00ab\u043c\u043e\u0434\u0435\u043b\u044c A \u0432\u0438\u0434\u0438\u0442 \u0440\u0438\u0441\u043a \u0425, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435\u0442, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443\u00bb, \u0438\u00a0<code>Choice<\/code>-\u0432\u0435\u0442\u043a\u0430 \u0441\u0430\u043c\u0430 \u0443\u0445\u043e\u0434\u0438\u0442 \u0432 approval-gate.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u0433\u043e\u0434 treasury-\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430\u00a0<code>EvalRunProps<\/code>\u00a0\u0438 \u0432\u0438\u0434\u0438\u0442: \u00ab\u043c\u043e\u0434\u0435\u043b\u044c Gemini-Pro \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u043e\u043c \u0432 18% \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0438 \u0432 70% \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u0440\u0430\u0432\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430\u00bb \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b, \u0447\u0442\u043e \u0435\u0451 \u043d\u0430\u0434\u043e\u00a0<strong>\u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0432 \u0432\u0435\u0441\u0435<\/strong>\u00a0\u0432 jury, \u0430 \u043d\u0435 \u0443\u0431\u0440\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u043a\u0430, \u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 REDB.<\/p>\n<h4>\u041a\u0435\u0439\u0441 3. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043d\u043e\u0437 \u0438 \u043f\u0440\u043e\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0435\u0440\u0442 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443<\/h4>\n<p>\u0412 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435 (\u043d\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u043c, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u2014 \u0437\u0430\u0432\u043e\u0434\u044b, \u0441\u043a\u043b\u0430\u0434\u044b, \u043b\u043e\u0433\u0438\u0441\u0442\u0438\u043a\u0430) \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430:\u00a0<strong>\u043f\u043e SCADA-\u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 4-6 \u0447\u0430\u0441\u043e\u0432 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0431\u043e\u0439, \u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u0438\u0442\u044c \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430<\/strong>. \u0420\u0430\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 ML-\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0441 feature-store \u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0431\u0443\u0441\u0442\u0438\u043d\u0433\u0430. \u042d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0438 LLM \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e. \u041d\u043e\u00a0<strong>LLM \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u00ab\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043c\u0438\u043b\u044e\u00bb<\/strong>\u00a0\u2014 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u00ab\u0432\u0435\u043a\u0442\u043e\u0440 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0439 + \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u00bb \u0432 \u0432\u043d\u044f\u0442\u043d\u043e\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435.<\/p>\n<pre><code>\/\/ \u0421\u043b\u0443\u0448\u0430\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u043c\u0435\u0442\u0440\u0438\u043a \u0438\u0437 SCADA-\u0448\u0438\u043d\u044b (\u0447\u0435\u0440\u0435\u0437 MQTT\/Kafka), \u043e\u043a\u043d\u043e 5 \u043c\u0438\u043d\u0443\u0442From(\"kafka:\/\/scada.metrics?groupId=plant-anomaly-watcher\")    .RouteId(\"plant-anomaly-watcher\")    .Aggregate(by: e =&gt; e.In.Headers[\"LineId\"],               window: TimeSpan.FromMinutes(5))            \/\/ \u043e\u043a\u043d\u043e \u043f\u043e \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430    .Process&lt;RunAnomalyModel&gt;()                            \/\/ \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 ML \u2014 XGBoost, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e;                                                            \/\/ \u0432\u044b\u0434\u0430\u0451\u0442 {score, top-features, line-context}    .Choice()        .When(e =&gt; e.In.Body&lt;AnomalyReport&gt;().Score &gt; 0.8)            .Knowledge(\"plant-runbooks\", k: 3)             \/\/ RAG: runbook'\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u043b\u0438\u043d\u0438\u0438,                                                            \/\/ \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432            .To(Llm.Factory(\"haiku\")                .SystemPromptRef(\"#plant-incident-explainer@v9\")                .Temperature(0.0).MaxTokens(600)                .Tools(\"metrics-history\", \"fetch-shift-log\")  \/\/ \u0430\u0433\u0435\u043d\u0442 \u0441\u0430\u043c \u0434\u043e\u0442\u044f\u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435                .MaxIterations(4)                .CostBudget(usd: 0.10).AsUri())            .Process&lt;EnrichWithOnDutyEngineer&gt;()           \/\/ \u043a\u0442\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432 \u0441\u043c\u0435\u043d\u0435 \u043d\u0430 \u044d\u0442\u043e\u0439 \u043b\u0438\u043d\u0438\u0438            .Multicast()                .To(\"teams:\/\/engineering-shift-{LineId}?card=adaptive\")                .To(\"sms:\/\/twilio?to={engineer.phone}\")                .To(\"kafka:\/\/incidents.predicted.archive\")            .End()        .Otherwise()            .To(\"kafka:\/\/scada.metrics.normal\")            \/\/ \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c    .End();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p><strong>ML-\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/strong>\u00a0Anomaly score \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 XGBoost, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u044e \u0436\u0438\u0437\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b. LLM \u0432\u0441\u0442\u0430\u0451\u0442\u00a0<strong>\u043f\u043e\u0441\u043b\u0435<\/strong>\u00a0\u043d\u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>LLM \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442.<\/strong>\u00a0\u041f\u0440\u043e\u043c\u043f\u0442: \u00ab\u0432\u043e\u0442 \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u044f \u043d\u0430 \u043b\u0438\u043d\u0438\u0438 7, top-3 \u0444\u0438\u0447\u0438 \u0442\u0430\u043a\u0438\u0435-\u0442\u043e, runbook \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0442\u0430\u043a-\u0442\u043e, \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a\u043e\u0432\u0430. \u041e\u0431\u044a\u044f\u0441\u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0447\u0442\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u0447\u0442\u043e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0447\u0430\u0441, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c\u0438\u00bb. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 LLM \u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u0430 \u2014 \u0441\u0438\u043d\u0442\u0435\u0437.<\/p>\n<\/li>\n<li>\n<p><strong>Tools \u0443 \u0430\u0433\u0435\u043d\u0442\u0430 \u2014 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0432\u043e\u0434\u0430.<\/strong>\u00a0<code>metrics-history<\/code>\u00a0\u2014 \u044d\u0442\u043e\u00a0<code>direct:metrics-history<\/code>\u00a0\u043c\u0430\u0440\u0448\u0440\u0443\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 Influx\/Prometheus.\u00a0<code>fetch-shift-log<\/code>\u00a0\u2014 REDB-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0436\u0443\u0440\u043d\u0430\u043b\u0443 \u0441\u043c\u0435\u043d\u044b. \u0410\u0433\u0435\u043d\u0442 \u0441\u0430\u043c \u0440\u0435\u0448\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0435\u043c\u0443 \u0434\u0451\u0440\u0433\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437.\u00a0<code>MaxIterations(4)<\/code>\u00a0\u2014 \u043f\u043e\u0442\u043e\u043b\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u2014 multi-channel.<\/strong>\u00a0Teams-\u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u00ab\u043f\u0440\u0438\u043d\u044f\u043b \u0432 \u0440\u0430\u0431\u043e\u0442\u0443\u00bb (\u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043a\u0441\u0442\u0430\u0442\u0438, \u0434\u0451\u0440\u043d\u0435\u0442 ApprovalGate-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 webhook), SMS \u043d\u0430 \u0434\u0435\u0436\u0443\u0440\u043d\u044b\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0447\u0435\u0440\u0435\u0437 Twilio (\u044d\u0442\u043e\u0442 transport \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u00a0<code>redb.Route<\/code>), \u0430\u0440\u0445\u0438\u0432 \u0432 Kafka.<\/p>\n<\/li>\n<li>\n<p><code><strong>Aggregate by LineId, window 5min<\/strong><\/code>\u00a0\u2014 \u044d\u0442\u043e EIP Aggregator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0433\u0440\u0443\u043f\u043f\u0430\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0439\u00a0<code>redb.Route.Llm<\/code>-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438; \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0433\u043e\u0434\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u0431\u0438\u0437\u043d\u0435\u0441\u0443: \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u043d\u043e\u043c\u0430\u043b\u0438\u0438 \u0434\u043e \u00ab\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c\u00bb \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 40 \u043c\u0438\u043d\u0443\u0442 (\u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u2014 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0432\u0438\u0434\u0435\u043b, \u043f\u043e\u0437\u0432\u043e\u043d\u0438\u043b, \u043e\u043f\u0438\u0441\u0430\u043b, \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u0440\u0438\u0448\u0451\u043b, \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c) \u0434\u043e 4-5 \u043c\u0438\u043d\u0443\u0442. \u041d\u0430 \u0434\u043e\u0440\u043e\u0433\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043b\u0438\u043d\u0438\u044f\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u2014 \u044d\u0442\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447 \u0434\u043e\u043b\u043b\u0430\u0440\u043e\u0432; \u044d\u0442\u043e\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043e\u043a\u0443\u043f\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u00a0<strong>\u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435<\/strong>.<\/p>\n<p>\u0418 \u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0451\u0445 \u043a\u0435\u0439\u0441\u0430\u0445 \u0440\u043e\u043b\u044c LLM \u2014\u00a0<strong>\u0443\u0437\u043a\u0430\u044f<\/strong>. \u041d\u0435 \u00abAI \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439\u00bb. \u041d\u0435 \u00abAI \u0432\u0435\u0434\u0451\u0442 \u0444\u0438\u043d\u0430\u043d\u0441\u044b \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438\u00bb. LLM \u0434\u0435\u043b\u0430\u0435\u0442\u00a0<strong>\u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u0449\u044c<\/strong>\u00a0\u0432 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0435 \u2014 \u0441\u0443\u043c\u043c\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0441\u0438\u043d\u0442\u0435\u0437, \u0432\u044b\u0431\u043e\u0440 \u0438\u0437 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u0432, \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435. \u0410 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0451 \u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u0430\u044f enterprise-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430: \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f, ETL, RAG, \u043c\u0443\u043b\u044c\u0442\u0438-\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430, \u0430\u0443\u0434\u0438\u0442, governance, \u0431\u044e\u0434\u0436\u0435\u0442\u044b. \u042d\u0442\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u2014 \u0438 \u0435\u0441\u0442\u044c\u00a0<code>redb.Route<\/code>. LLM \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u0438\u0440\u043f\u0438\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u043d\u044c\u0448\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<hr\/>\n<h3>Storytelling: \u043a\u0430\u043a \u0447\u0430\u0442-\u0434\u0435\u043c\u043e \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443<\/h3>\n<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0443\u0442\u044c, \u043a\u0430\u043a \u043e\u043d \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443 \u0436\u0438\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b (\u0432\u0438\u0434\u0435\u043b \u0435\u0433\u043e \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437).<\/p>\n<p><strong>\u0414\u0435\u043d\u044c 1.<\/strong>\u00a0\u041a\u0442\u043e-\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c, \u0447\u0442\u043e Claude \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0442\u0438\u043a\u0435\u0442. \u0424\u0430\u0439\u043b\u00a0<code>LlmHttpRoutes.cs<\/code>\u00a0\u2014 6 \u0441\u0442\u0440\u043e\u043a,\u00a0<code>From(\"http:\/\/...\").To(\"llm:\/\/haiku\")<\/code>, \u0438 demo \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042d\u0442\u043e\u00a0<strong>\u043f\u0440\u043e\u0435\u043a\u0442<\/strong>, \u043d\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430.<\/p>\n<pre><code>From(\"http:0.0.0.0:5088\/api\/llm\/ask?inOut=true\")    .ConvertBody&lt;string&gt;()    .To(Llm.Factory(\"haiku\").MaxIterations(1).AsUri());<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0414\u0435\u043d\u044c 7.<\/strong>\u00a0\u041a\u043e\u043b\u043b\u0435\u0433\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442: \u00ab\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u043c\u043d\u0438\u0442, \u0447\u0442\u043e \u044f \u043f\u0438\u0441\u0430\u043b \u043c\u0438\u043d\u0443\u0442\u0443 \u043d\u0430\u0437\u0430\u0434\u00bb. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<code>X-Chat-Id<\/code>\u00a0header \u2192\u00a0<code>ConversationId<\/code>-\u043f\u043e\u043b\u0435 \u2192\u00a0<code>ConversationFromHeader()<\/code>. \u041e\u0434\u0438\u043d\u00a0<code>Process(...)<\/code>-\u0448\u0430\u0433, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u2014\u00a0<code>AddRedbLlmStorage()<\/code>\u00a0\u0443\u0436\u0435 \u0432\u00a0<code>Program.cs<\/code>,\u00a0<code>MessageProps<\/code>\u00a0\u0443\u0436\u0435 \u043f\u0438\u0448\u0443\u0442\u0441\u044f.<\/p>\n<pre><code>.Process(e =&gt; e.In.Headers[LlmHeaders.ConversationId] =    e.In.Headers[\"X-Chat-Id\"]?.ToString() ?? \"default\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0414\u0435\u043d\u044c 14.<\/strong>\u00a0\u00ab\u0425\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435\u00bb. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<code>tool-shell<\/code>\u00a0\u2014\u00a0<strong>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0441\u00a0<\/strong><code><strong>.AsLlmTool(\"shell\")<\/strong><\/code>, \u0447\u0435\u0440\u0435\u0437\u00a0<code>redb.Route.Exec<\/code>\u00a0\u0441 allowlist\u00a0<code>[cmd, pwsh]<\/code>, working-dir \u0432 temp, timeout 5 \u0441\u0435\u043a, cap 8KB \u043d\u0430 stdout. \u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u2014\u00a0<strong>\u0432 DSL<\/strong>, \u0430 \u043d\u0435 \u0432 \u0441\u043e\u0432\u0435\u0442\u0430\u0445 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435.<\/p>\n<pre><code>From(\"direct:tool-shell\")    .AsLlmTool(\"shell\").SideEffect(ToolSideEffect.ReadOnly).Cost(ToolCostClass.Cheap)    .Then()    .To(ExecDsl.Run().AllowedCommands(\"pwsh\", \"cmd\").TimeoutMs(5000).MaxStdoutBytes(8192));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0414\u0435\u043d\u044c 21.<\/strong>\u00a0\u00ab\u0424\u0438\u043d\u0430\u043d\u0441\u044b \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u0441\u0447\u0451\u0442 \u0437\u0430 \u0442\u043e\u043a\u0435\u043d\u044b \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u043b \u043f\u043b\u0430\u043d \u0432 4 \u0440\u0430\u0437\u0430\u00bb. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<code>.CostBudget(usd: 0.50)<\/code>\u00a0\u043d\u0430 conversation-id. \u0411\u0435\u0437 \u043d\u043e\u0432\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0431\u0435\u0437 \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432 \u2014 \u043e\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0<code>CostBudgetProps<\/code>, \u0438 tsak.web \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p><strong>\u0414\u0435\u043d\u044c 30.<\/strong>\u00a0\u00ab\u041d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0431\u044b\u043b\u043e audit-able\u00bb. \u0423\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:\u00a0<code>ToolAuditProps<\/code>\u00a0\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u043c. \u0410\u0443\u0434\u0438\u0442\u043e\u0440 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0437\u0430 \u043a\u0432\u0430\u0440\u0442\u0430\u043b, \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e tenant \u0438 side-effect. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u00abmes \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c\u00bb.<\/p>\n<p><strong>\u0414\u0435\u043d\u044c 45.<\/strong>\u00a0\u00ab\u042e\u0440\u0438\u0441\u0442\u044b \u0445\u043e\u0442\u044f\u0442 human-in-loop \u043d\u0430 refund-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u00bb. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<code>.Process&lt;ApprovalGate&gt;()<\/code>\u00a0\u043f\u0435\u0440\u0435\u0434 exec.\u00a0<code>ApprovalProps<\/code>\u00a0\u043f\u0438\u0448\u0435\u0442\u0441\u044f, Slack-bot \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d HTTP-\u043c\u0430\u0440\u0448\u0440\u0443\u0442. \u0412\u0441\u0451.<\/p>\n<p><strong>\u0414\u0435\u043d\u044c 60.<\/strong>\u00a0\u00ab\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u0430\u0437\u0430, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043b\u043b\u0438\u043d\u0433\u00bb. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f\u00a0<code>Process(e =&gt; <\/code><a href=\"http:\/\/e.In\" rel=\"noopener noreferrer nofollow\"><code>e.In<\/code><\/a><code>.Headers[LlmHeaders.Redb] = <\/code><a href=\"http:\/\/e.In\" rel=\"noopener noreferrer nofollow\"><code>e.In<\/code><\/a><code>.Headers[\"X-Tenant\"])<\/code>. \u041e\u0434\u0438\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442, \u0434\u0432\u0430 tenant&#8217;\u0430, \u043d\u043e\u043b\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043b\u043e\u0433\u0438\u043a\u0435.<\/p>\n<p><strong>\u0414\u0435\u043d\u044c 90.<\/strong>\u00a0\u00ab\u0425\u043e\u0447\u0443 \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043d\u043e\u0447\u044c\u044e \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u00bb. \u041c\u0430\u0440\u0448\u0440\u0443\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c. \u041c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442:\u00a0<code>.Mode(LlmMode.Batch)<\/code>\u00a0\u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f Anthropic Batch,\u00a0<code>LlmBatchProps<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 id,\u00a0<code>LlmCallbackProcessor<\/code>\u00a0\u0436\u0434\u0451\u0442 webhook, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0434\u0443\u0442 \u0432 \u0442\u043e\u0442 \u0436\u0435 Kafka, \u0447\u0442\u043e \u0438 \u0434\u043d\u0451\u043c. -50% \u043a \u0442\u043e\u043a\u0435\u043d-\u0441\u0447\u0451\u0442\u0443.<\/p>\n<p><strong>\u0414\u0435\u043d\u044c 120.<\/strong>\u00a0\u00ab\u041d\u0443\u0436\u043d\u044b \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u043e \u0432\u0435\u0440\u0441\u0438\u044f\u043c \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432: \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0443\u0436\u0435\u00bb.\u00a0<code>EvalRunProps<\/code>\u00a0\u0443\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0440\u043e\u0433\u043e\u043d\u044b. \u041e\u0442\u043a\u0440\u044b\u043b\u0438 SQL, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 accuracy \u043f\u043e\u00a0<code>PromptTemplateRef<\/code>, \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044e \u0432 v4, \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u043d\u0430 v3 \u2014 \u0431\u0435\u0437 redeploy.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u0440\u0440\u0430\u0442\u0438\u0432\u0435 \u043d\u0435\u0442 \u0441\u044e\u0436\u0435\u0442\u0430 \u00ab\u0438 \u0442\u0443\u0442 \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u0432\u0441\u0451 \u043d\u0430 Kubernetes-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0435\u00bb. \u041d\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u00ab\u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 AI-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443\u00bb. \u0422\u0435\u00a0<strong>\u0448\u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a<\/strong>\u00a0\u0447\u0430\u0442-\u0434\u0435\u043c\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u0414\u0435\u043d\u044c 1, \u2014 \u044d\u0442\u043e\u00a0<strong>\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0414\u0435\u043d\u044c 120 \u0432\u0435\u0434\u0451\u0442 \u0434\u0432\u0443\u0445 \u0442\u0435\u043d\u0430\u043d\u0442\u043e\u0432 \u0441 jury-\u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u0435\u043c, batch-\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0442\u0438\u043a\u0435\u0442\u043e\u0432 \u0437\u0430 \u043d\u043e\u0447\u044c \u0438 audit&#8217;\u043e\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041d\u0435 \u0431\u044b\u043b\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u041d\u0435 \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f. \u041d\u0435 \u0431\u044b\u043b\u043e \u00ab\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b v2\u00bb. \u041f\u0440\u043e\u0441\u0442\u043e \u0432 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0427\u0430\u0442-\u0434\u0435\u043c\u043e \u043d\u0435 \u00ab\u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442\u00bb \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u2014 \u043e\u043d\u00a0<strong>\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435<\/strong>\u00a0\u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0435\u0451 \u0444\u0438\u0447\u0438.<\/p>\n<hr\/>\n<h3>Demo-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b: \u0433\u0434\u0435 \u044d\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0436\u0438\u0432\u044c\u0451\u043c<\/h3>\n<p>\u0412\u0441\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432\u044b\u0448\u0435 \u2014 \u043d\u0435 concept-art. \u0412 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u00a0<code>redbase-app\/redb-route<\/code>\u00a0\u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0434\u0435\u043c\u043e-\u0444\u0430\u0439\u043b\u0430:<\/p>\n<ul>\n<li>\n<p><code><strong>LlmDemoRoutes.cs<\/strong><\/code>\u00a0\u2014 \u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u044b LLM-\u0432\u044b\u0437\u043e\u0432\u0430: inline-step (<code>.Llm(\"demo-stub\")<\/code>), endpoint (<code>.To(\"llm:\/\/demo-stub\")<\/code>), tool (<code>.AsLlmTool(\"echo_tool\")<\/code>). \u0412\u0441\u0435 \u043d\u0430 stub-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435, \u0431\u0435\u0437 API-\u043a\u043b\u044e\u0447\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><code><strong>LlmHttpRoutes.cs<\/strong><\/code>\u00a0\u2014 \u0434\u0432\u0430 HTTP endpoint&#8217;\u0430 (<code>\/api\/llm\/ask<\/code>\u00a0\u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432,\u00a0<code>\/api\/llm\/shell<\/code>\u00a0\u0441 shell-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0447\u0435\u0440\u0435\u0437\u00a0<code>redb.Route.Exec<\/code>), \u043e\u0431\u0430 \u0441 conversation-id \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u043e\u0431\u0430 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c Claude Haiku.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0<code>dotnet run<\/code>\u00a0\u0432\u00a0<code>redb.Route.Demo<\/code>\u00a0\u2014 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u0442 5088, \u043c\u043e\u0436\u043d\u043e curl&#8217;\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441:<\/p>\n<pre><code class=\"bash\">curl -d \"what time is it on this host?\" -H \"X-Chat-Id: test1\" \\     http:\/\/localhost:5088\/api\/llm\/shell<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Repo:\u00a0<a href=\"https:\/\/github.com\/redbase-app\/redb-route\" rel=\"noopener noreferrer nofollow\">github.com\/redbase-app\/redb-route<\/a>\u00a0(Apache 2.0).<\/p>\n<hr\/>\n<h3>\u0427\u0442\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u044d\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044e<\/h3>\n<p>Sliding-window \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u0430. \u041f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 store \u0435\u0449\u0451 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d. \u041d\u0435\u0442 \u00abAI-graph editor\u00bb \u0432 tsak.web \u2014 runtime-\u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0430\u0446\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 REDB-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c UI, \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e pane. \u041d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 eval-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u2014\u00a0<code>EvalRunStore<\/code>\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u0440\u043e\u0433\u043e\u043d\u044b, \u043d\u043e \u00ab\u043d\u0430\u0436\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438 \u0441 \u043f\u0440\u043e\u0434\u043e\u043c\u00bb \u043d\u0435\u0442.<\/p>\n<p>\u042d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. Skip-list \u2014 \u044d\u0442\u043e\u00a0<strong>\u0442\u0435\u0445\u043d\u0438\u043a\u0430<\/strong>, \u043d\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u0435. Open-source-\u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0440\u0451\u0442 \u0432 README \u043f\u0440\u043e \u0441\u043a\u043e\u043f \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u0439\u0434\u0451\u0442 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437. \u042f \u043b\u0443\u0447\u0448\u0435 \u0441\u043a\u0430\u0436\u0443 \u00ab\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e\u00bb \u0438 \u0441\u0434\u0435\u043b\u0430\u044e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u0438\u043d\u043e\u0440\u043a\u0435, \u0447\u0435\u043c \u00ab\u0441\u0434\u0435\u043b\u0430\u043d\u043e\u00bb \u0438 \u0431\u0443\u0434\u0443 \u043e\u0442\u0431\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 issue \u043f\u0440\u043e \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 feature.<\/p>\n<hr\/>\n<h3>Zoom out: \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e ESB<\/h3>\n<p>\u0412 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0442\u0435\u0440\u043c\u0438\u043d \u00abAI-\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u00bb. \u041f\u043e\u0434 \u043d\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u00ab\u0443 \u043d\u0430\u0441 \u0432\u0441\u0451 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432\u043e\u043a\u0440\u0443\u0433 LLM\u00bb, \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u0438\u0442\u00a0<strong>\u043d\u043e\u0432\u044b\u0439 dev-stack \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c<\/strong>. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432 \u0441\u0442\u0435\u043a\u0435 \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u00a0<strong>\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438<\/strong>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 retry \u2014 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 audit \u2014 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 governance \u2014 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 tenant-isolation \u2014 \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0418 \u044d\u0442\u0438 \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00a0<strong>\u0440\u0430\u0437\u044a\u0435\u0437\u0436\u0430\u044e\u0442\u0441\u044f<\/strong>\u00a0\u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434: AI-stack \u0434\u043e\u0431\u0430\u0432\u0438\u043b bounded-context-\u0430\u0443\u0434\u0438\u0442, integration-stack \u2014 \u043d\u0435\u0442. \u042e\u0440\u0438\u0441\u0442\u044b \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u00ab\u043e\u0434\u0438\u043d \u043e\u0442\u0447\u0451\u0442 \u0437\u0430 \u0432\u0441\u0451\u00bb \u2014 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c.<\/p>\n<p>ESB-\u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440\u00a0<strong>\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0434\u043b\u044f I\/O \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432<\/strong>. LLM \u2014 \u044d\u0442\u043e \u0432\u0438\u0434 I\/O (\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439, \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043d\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 I\/O). \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 ESB \u2014 \u044d\u0442\u043e \u043d\u0435 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0441\u043a\u0430\u044f \u043f\u043e\u0437\u0430, \u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f:\u00a0<strong>\u043e\u0434\u043d\u0430 governance-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451<\/strong>.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0438\u043d\u0442, \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u0430\u043b\u0438 \u0413\u0430\u0440\u043b\u0430\u043d\u0434 \u0438 \u0420\u0438\u043f\u043b\u0438 (\u0441\u043c. SOA-\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0443 2000-\u0445). \u041d\u043e\u0432\u043e\u0435 \u2014 \u0447\u0442\u043e \u0432 2026 \u044d\u0442\u043e\u0442 \u043f\u043e\u0438\u043d\u0442 \u0441\u0442\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a LLM, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 LLM \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c\u00a0<strong>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/strong>\u00a0(tool-use, streaming, batch-API, embeddings). \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u00abLLM \u0432 ESB\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u00ab\u043d\u0430\u043b\u0435\u043f\u0438\u0442\u044c REST-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u0438 \u043c\u043e\u043b\u0438\u0442\u044c\u0441\u044f\u00bb. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 EIP-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0441 \u043c\u0438\u043d\u043e\u0440\u043d\u044b\u043c\u0438 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f\u043c\u0438\u00bb.<\/p>\n<p>\u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u0443 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044e \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c \u0441\u043c\u044b\u0441\u043b\u00a0<code>redb.Route.Llm<\/code>. \u041d\u0435 \u00ab\u0443 \u043d\u0430\u0441 \u043b\u0443\u0447\u0448\u0438\u0439 \u0430\u0433\u0435\u043d\u0442-\u0434\u0432\u0438\u0436\u043e\u043a\u00bb. \u041b\u0443\u0447\u0448\u0438\u0439 \u2014 \u0443 Microsoft \u0438 LangChain. \u0423 \u043d\u0430\u0441 \u2014\u00a0<strong>\u0442\u043e\u0442 \u0436\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u043d\u044c\u043a\u0438\u0439 \u0430\u0433\u0435\u043d\u0442-\u0434\u0432\u0438\u0436\u043e\u043a, \u043d\u043e \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/strong>. \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u0435\u0435.<\/p>\n<hr\/>\n<h3>Roadmap<\/h3>\n<p>3.1.2:<\/p>\n<ul>\n<li>\n<p>sliding-window \u043f\u0430\u043c\u044f\u0442\u044c \u043a\u0430\u043a \u0448\u0442\u0430\u0442\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430;<\/p>\n<\/li>\n<li>\n<p>vector-store interface \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e\u00a0<code>IKnowledgeStore<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 pgvector \u0438 Qdrant \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0435 back-end&#8217;\u044b;<\/p>\n<\/li>\n<li>\n<p><code>EvalCompare<\/code>-DSL \u0434\u043b\u044f side-by-side \u043f\u0440\u043e\u0433\u043e\u043d\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>3.2:<\/p>\n<ul>\n<li>\n<p>ConversationProps-tree UI \u0432 tsak.web;<\/p>\n<\/li>\n<li>\n<p>streaming-aware aggregator EIP (\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u0434\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0440\u0430\u043d\u0438\u0446);<\/p>\n<\/li>\n<li>\n<p>distributed batch \u2014 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e worker&#8217;\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d LlmCallbackProcessor.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0442\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>multi-modal (image input\/output \u043a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u00a0<code>Out.Body<\/code>);<\/p>\n<\/li>\n<li>\n<p>voice-\u0430\u0433\u0435\u043d\u0442\u044b \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d transport (<code>voice:\/\/...<\/code>);<\/p>\n<\/li>\n<li>\n<p>routing \u043f\u043e cost\/latency\/accuracy SLA per-message.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f (\u0430\u043d\u043e\u043d\u0441 3.1.0):\u00a0<a href=\"https:\/\/habr.com\/ru\/articles\/1045356\/\" rel=\"noopener noreferrer nofollow\">redb.Route 3.1.0 \u2014 LLM \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042392\/\" rel=\"noopener noreferrer nofollow\">redb.Route \u2014 Apache Camel \u0434\u043b\u044f .NET<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1042872\/\" rel=\"noopener noreferrer nofollow\">redb.Route \u0438\u0437\u043d\u0443\u0442\u0440\u0438: \u0447\u0435\u0442\u044b\u0440\u0435 in-memory \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 Exchange<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/1043332\/\" rel=\"noopener noreferrer nofollow\">redb.Route 3.0.1 \u2014 \u043f\u043b\u043e\u0441\u043a\u0430\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e DSL<\/a><\/p>\n<\/li>\n<li>\n<p>GitHub:\u00a0<a href=\"https:\/\/github.com\/redbase-app\/redb-route\" rel=\"noopener noreferrer nofollow\">github.com\/redbase-app\/redb-route<\/a>\u00a0(Apache 2.0)<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u043c\u043e-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b:\u00a0<code>redb.Route\/demos\/redb.Route.Demo\/Routes\/LlmDemoRoutes.cs<\/code>,\u00a0<code>LlmHttpRoutes.cs<\/code><\/p>\n<\/li>\n<li>\n<p>Storage-\u0441\u0435\u0440\u0438\u044f (REDB \u0438\u0437\u043d\u0443\u0442\u0440\u0438): \u0441\u043c. \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e REDB \u043d\u0430 \u0425\u0430\u0431\u0440\u0435<\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/dev.to\" rel=\"noopener noreferrer nofollow\">dev.to<\/a> companion: \u0441\u0441\u044b\u043b\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 (\u043d\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0442\u0435\u043c\u0443)<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><strong>TL;DR.<\/strong>\u00a0\u0412 3.1.0 \u044f \u043e\u0431\u0435\u0449\u0430\u043b \u2014 \u0432 3.1.1 \u0441\u0434\u0435\u043b\u0430\u043b. Streaming end-to-end, ToolCache, KnowledgeStore (RAG-\u0447\u0430\u043d\u043a\u0438), BatchStore \u0441 webhook-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u043c, EvalRunStore, PromptTemplate-\u0440\u0435\u0435\u0441\u0442\u0440 \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438\u00a0<code>#<\/code>-refs, \u043c\u0443\u043b\u044c\u0442\u0438-tenant\u00a0<code>?redb=&lt;name&gt;<\/code>, \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0435 tool-\u0432\u044b\u0437\u043e\u0432\u044b, approval-gates \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u0432 \u0446\u0438\u043a\u043b\u0435, audit trail. \u041f\u043e\u0432\u0435\u0440\u0445 \u2014 \u0434\u0432\u0430 \u043c\u043e\u0449\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430:\u00a0<strong>jury \u0438\u0437 \u0434\u0435\u0448\u0451\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0441 arbiter-\u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0441\u0432\u0435\u0440\u0445\u0443<\/strong>\u00a0\u0447\u0435\u0440\u0435\u0437 \u0448\u0442\u0430\u0442\u043d\u044b\u0439 Scatter-Gather + Aggregator EIP, \u0438\u00a0<strong>sub-agents as tools<\/strong>\u00a0\u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0433\u0434\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0430\u0433\u0435\u043d\u0442 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e\/\u043f\u0440\u043e\u043c\u043f\u0442\u043e\u043c\/\u0431\u044e\u0434\u0436\u0435\u0442\u043e\u043c\/RAG, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043f\u0435\u0446\u043a\u043e\u0434\u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f\u00a0<code>RouteToolBridge \u2192 direct: \u2192 llm:\/\/<\/code>. \u0418 \u0442\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 enterprise-\u043a\u0435\u0439\u0441\u0430 \u0441 \u043a\u043e\u0434\u043e\u043c: \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0439 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 CFO \u043d\u0430 email, \u043d\u0435\u0434\u0435\u043b\u044c\u043d\u044b\u0439 cash-flow forecast \u0441 jury-\u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u0435\u043c, \u043f\u0440\u043e\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 production-\u0430\u043b\u0435\u0440\u0442 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u0447\u0435\u0440\u0435\u0437 \u0433\u0438\u0431\u0440\u0438\u0434 XGBoost + LLM. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u043d\u0442 \u043d\u0435 \u0432 \u0444\u0438\u0447\u0430\u0445 \u2014\u00a0<strong>enterprise-\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u0432 \u0442\u043e\u0442 \u0434\u0435\u043d\u044c, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u044b, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f<\/strong>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e LLM \u043b\u0435\u0436\u0438\u0442 \u0432 ESB \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c I\/O. \u0422\u0435 \u0448\u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u0447\u0430\u0442-\u0434\u0435\u043c\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u0414\u0435\u043d\u044c 1, \u2014 \u044d\u0442\u043e\u00a0<strong>\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0414\u0435\u043d\u044c 90 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u0443\u043b\u044c\u0442\u0438-tenant \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441 audit&#8217;\u043e\u043c, \u0431\u044e\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0438 jury-\u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0436\u0435\u043c. \u0422\u043e\u0447\u043a\u0438 \u00ab\u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c\u00bb \u0432 \u044d\u0442\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1046237\/\">https:\/\/habr.com\/ru\/articles\/1046237\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>redb.route llm\u0421\u0435\u0440\u0438\u044f:\u00a0redb ecosystem (\u0447\u0430\u0441\u0442\u044c 2 \u043a LLM-\u0430\u043d\u043e\u043d\u0441\u0443)  \u0412\u00a0\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u00a0\u044f \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u00a0redb.Route.Llm\u00a0\u043a\u0430\u043a 24-\u0439 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u00a0redb.Route\u00a0\u2014 \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 LLM \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c endpoint&#8217;\u043e\u043c \u043d\u0430\u0440\u0430\u0432\u043d\u0435 \u0441 Kafka, RabbitMQ \u0438 HTTP, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u00abAI-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u00bb, \u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0440\u044f\u0434\u043e\u043c \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439. \u0417\u0430\u043e\u0434\u043d\u043e \u044f \u043f\u043e\u0432\u0435\u0441\u0438\u043b \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0430\u0442\u044c\u0438\u00a0\u00ab\u0447\u0435\u0441\u0442\u043d\u044b\u0439 skip-list\u00bb\u00a0\u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 3.1.0 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0434\u0435\u043b\u0430\u043d\u043e: streaming, ToolCacheStore, KnowledgeStore, BatchStore, EvalRunStore, sliding-window \u043f\u0430\u043c\u044f\u0442\u044c, sandbox-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.\u0418\u0437 \u044d\u0442\u043e\u0433\u043e skip-list&#8217;\u0430 \u0434\u0435\u043b\u0430\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b. \u041d\u043e \u043d\u0435 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0430\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0439 \u0437\u0430\u0442\u0435\u0438:\u00a0LLM-\u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u043c \u0447\u0430\u0442-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u043c \u0437\u0432\u0435\u043d\u043e\u043c \u0432 ESB, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u00ab\u0431\u0438\u0437\u043d\u0435\u0441-\u0430\u0433\u0435\u043d\u0442 \u0432 \u043f\u0440\u043e\u0434\u0435\u00bb \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0447\u0430\u0442-\u0434\u0435\u043c\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 enterprise-\u0430\u0433\u0435\u043d\u0442\u0441\u043a\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044f\u0441\u044c \u0438 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u0432 \u00abAI-\u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u0441\u0431\u043e\u043a\u0443\u00bb.\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0438\u0436\u0435 \u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043d\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0434\u0435\u043c\u043e-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435.\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e\u00a0redb.Route.Llm. \u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c:redb.Route 3.1.0 \u2014 LLM \u043a\u0430\u043a \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442:\u00a0.To(&#171;llm:\/\/claude&#187;)\u00a0\u0438\u00a0.AsLlmTool()\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0440\u0438\u0438 redb.Route \u0446\u0435\u043b\u0438\u043a\u043e\u043c:redb.Route \u2014 Apache Camel \u0434\u043b\u044f .NETredb.Route \u0438\u0437\u043d\u0443\u0442\u0440\u0438: \u0447\u0435\u0442\u044b\u0440\u0435 in-memory \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 Exchangeredb.Route 3.0.1 \u2014 \u043f\u043b\u043e\u0441\u043a\u0430\u044f \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e DSL, \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 CRTP \u0438 \u0442\u0438\u0445\u0438\u0439 null\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430 \u043f\u0440\u043e EIP.\u00a0\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u044e\u0441\u044c \u043d\u0430 Enterprise Integration Patterns \u2014\u00a0Multicast,\u00a0Aggregator,\u00a0Scatter-Gather,\u00a0Wire-Tap,\u00a0Choice,\u00a0Aggregate-by-window\u00a0\u2014 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u042d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440: \u0441\u0442\u0430\u0442\u0435\u0439 \u0441\u0435\u0440\u0438\u0438 \u00abEIP \u0432 .NET \u0447\u0435\u0440\u0435\u0437 redb.Route\u00bb \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 (\u0441 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043a\u043e\u0434\u043e\u043c \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u043c\u0438) \u0435\u0449\u0451 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e, \u044f \u0438\u0445 \u043f\u0438\u0448\u0443 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e. \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0431\u0435\u0433\u0430\u044e \u0432\u043f\u0435\u0440\u0451\u0434.\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u00a0Apache Camel\u00a0\u0438\u043b\u0438\u00a0WSO2 Micro Integrator\u00a0\u2014 \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043d\u0430 \u0445\u043e\u0434\u0443, \u0438\u043c\u0435\u043d\u0430 \u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b. \u042f \u0441\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u043f\u0438\u0441\u0430\u043b \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 WSO2 MI (\u0438 ESB-\u043f\u0440\u0435\u0434\u043a\u0435), \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u00a0redb.Route\u00a0\u0431\u043b\u0438\u0436\u0435 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043a Camel \u2014 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u0430\u044f DSL \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e Exchange, \u0430 \u043d\u0435 XML-\u043a\u043e\u043d\u0444\u0438\u0433. \u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u00abCamel \u2194 redb.Route\u00bb \u0438 \u00abWSO2 MI \u2194 redb.Route\u00bb \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0442\u043e\u0436\u0435 \u0432 \u0440\u0430\u0431\u043e\u0442\u0435. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e EIP-\u0447\u0430\u0441\u0442\u0438 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0438\u0436\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c, \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u2014 \u043e\u0442\u0432\u0435\u0447\u0443 \u0441\u0440\u0430\u0437\u0443, \u0437\u0430\u043e\u0434\u043d\u043e \u0441\u043e\u0431\u0435\u0440\u0443 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u0430\u043c\u044b\u0445 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.\u0427\u0435\u043c \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u00ab\u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u00bb\u0412 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 LLM-tool-use \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: LangChain, langchain4j, Semantic Kernel, AutoGen, LlamaIndex \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043d\u0438\u0448\u0435\u0432\u044b\u0445. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u044e\u0442\u00a0\u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u00ab\u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u00bb. \u0418 \u0432\u0441\u0435 \u043e\u043d\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0432\u0430\u043c\u00a0\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c: retry, idempotency, audit, multi-tenant, \u0431\u044e\u0434\u0436\u0435\u0442, observability, governance, approval, batch, scheduling.\u0418\u0434\u0435\u044f\u00a0redb.Route.Llm\u00a0\u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c LLM \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043e\u043c \u0432 ESB, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u0438 \u0432\u043e\u0441\u0435\u043c\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00a0\u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u044b\u00a0\u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u041d\u0435 \u00ab\u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439, \u043f\u043b\u044e\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f LLM-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u00bb, \u0430\u00a0\u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0436\u0435 DSL, \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 runtime, \u0440\u043e\u0432\u043d\u043e \u0442\u0435 \u0436\u0435 hook&#8217;\u0438 \u0434\u043b\u044f governance. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432\u00a0redb.Route\u00a0\u0443\u0436\u0435 \u0435\u0441\u0442\u044c policy-\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0448\u0435\u0442 \u0432 Kafka \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u2014 \u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0438\u0448\u0435\u0442 \u0442\u0443\u0434\u0430 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 tool-\u0432\u044b\u0437\u043e\u0432 \u0430\u0433\u0435\u043d\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 Exchange.\u042d\u0442\u043e \u043d\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u0430. \u042d\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0431\u043e\u043b\u044c \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 \u0441 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438:\u00a0\u00ab\u0430 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u043a\u043e\u0433\u0434\u0430 LLM \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c production-\u0442\u0430\u0431\u043b\u0438\u0446\u0443?\u00bb\u00a0\u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00abLangChain + \u0445\u0443\u043a\u0438\u00bb \u043e\u0442\u0432\u0435\u0442 \u2014 \u00ab\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u043d\u0430\u0448\u0438 approval-callbacks \u0438 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435\u00bb. \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00abLLM \u043a\u0430\u043a \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442 \u0432 ESB\u00bb \u043e\u0442\u0432\u0435\u0442 \u2014\u00a0\u00ab\u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u0435 Exchange \u0434\u043e\u00a0.To(&#171;exec:\/\/&#8230;&#187;)\u00a0\u0442\u0435\u043c \u0436\u0435\u00a0.Process(&#8230;), \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0448\u0430\u0433 \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0435\u00bb. \u041d\u0435 \u00ab\u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f AI\u00bb, \u0430\u00a0\u0442\u043e\u0442 \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0447\u0442\u043e \u0434\u043b\u044f FTP \u0438 \u0434\u043b\u044f Kafka.\u0427\u0442\u043e \u0434\u043e\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u0437 \u00ab\u0447\u0435\u0441\u0442\u043d\u043e\u0433\u043e skip-list\u00bb 3.1.0\u042f \u043e\u0431\u0435\u0449\u0430\u043b \u2014 \u044f \u0433\u043e\u0432\u043e\u0440\u044e.Skip-list \u043f\u0443\u043d\u043a\u0442\u0421\u0442\u0430\u0442\u0443\u0441 3.1.1Streaming end-to-end (HTTP SSE + WS per-frame)\u0413\u043e\u0442\u043e\u0432\u043e.\u00a0IAsyncEnumerable&lt;string&gt;\u00a0\u0432\u00a0Out.Body\u00a0\u2192 SSE-\u043a\u0430\u0434\u0440 \u043d\u0430 HTTP-side, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 WS-message \u043d\u0430 WS-side.ToolCacheStore (REDB)\u0413\u043e\u0442\u043e\u0432\u043e.\u00a0ToolCacheProps, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u00a0ToolCachingPolicy.Memoize\u00a0\u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DSL.KnowledgeStore \u2014 RAG-\u0447\u0430\u043d\u043a\u0438 \u0432 REDB\u0413\u043e\u0442\u043e\u0432\u043e (\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e).\u00a0KnowledgeChunkProps\u00a0+ \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, embeddings \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c.BatchStore + LlmCallbackProcessor\u0413\u043e\u0442\u043e\u0432\u043e.\u00a0Anthropic Message Batches \u0438 OpenAI Batch \u2014 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 webhook-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440, \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430, retry.EvalRunStore\u0413\u043e\u0442\u043e\u0432\u043e.\u00a0\u041f\u0440\u043e\u0433\u043e\u043d\u044b eval&#8217;\u043e\u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441 trace-id&#8217;\u0430\u043c\u0438.PromptTemplateStore\u0413\u043e\u0442\u043e\u0432\u043e.\u00a0\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432, \u0441\u0441\u044b\u043b\u043a\u0430\u00a0#name\u00a0\u0432 DSL.Sliding-window \u043f\u0430\u043c\u044f\u0442\u044c\u041d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e.\u00a0\u0421\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u043d\u0430\u0447\u0435: tree-branching \u043a\u043e\u043d\u0432\u0435\u0440\u0441\u0430\u0446\u0438\u0439 \u043a\u0430\u043a REDB-tree (\u0441\u043c. \u043d\u0438\u0436\u0435).Sandbox-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b\u041d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e\u00a0\u0432 \u0432\u0438\u0434\u0435 \u00ab\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\u00bb. \u0421\u0434\u0435\u043b\u0430\u043d\u00a0redb.Route.Exec\u00a0\u0441 allowlist + working-dir + timeout + cap-by-bytes \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u0439 enterprise-\u043c\u0438\u043d\u0438\u043c\u0443\u043c.\u0411\u043e\u043d\u0443\u0441\u043e\u043c, \u0447\u0435\u0433\u043e \u0432 skip-list \u043d\u0435 \u0431\u044b\u043b\u043e:?redb=&lt;name&gt;\u00a0per-exchange\u00a0\u2014 \u043c\u0443\u043b\u044c\u0442\u0438-tenant: \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, REDB-instance \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\/URI \u043d\u0430 \u043b\u0435\u0442\u0443;DSL\/tool split\u00a0\u2014 \u043f\u0430\u043a\u0435\u0442\u044b\u00a0redb.Route.Llm.Abstractions\u00a0(\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b) \u0438\u00a0redb.Route.Llm.Tools\u00a0(\u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b), \u0447\u0442\u043e\u0431\u044b 22 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u043e\u0433\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00a0.AsLlmTool()\u00a0\u0431\u0435\u0437 bump&#8217;\u0430 \u043c\u0438\u043d\u043e\u0440\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0447\u0438\u0445;6 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438:\u00a0HttpFetch,\u00a0JsonPath,\u00a0XPath,\u00a0RegexExtract,\u00a0MathEval,\u00a0TavilyWebSearch\u00a0\u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438 \u043a\u0430\u043a DSL-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435, \u0438 \u043a\u0430\u043a standalone tool-route;Bug fixes, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0448\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0434\u0435: orphan-tool_use\u00a0(\u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0430 Anthropic-\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0435) \u0438 OEM-codepage \u0432\u00a0Process.StandardOutput\u00a0(windows-1251 \u0432 \u0432\u044b\u0445\u043b\u043e\u043f\u0435\u00a0cmd \/c\u00a0\u043b\u043e\u043c\u0430\u0435\u0442 UTF-8 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430).11 REDB-\u0441\u0445\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u044f\u0442 \u0437\u0430 \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c:\u00a0ConversationProps,\u00a0MessageProps,\u00a0ApprovalProps,\u00a0CostBudgetProps,\u00a0ToolCacheProps,\u00a0ToolAuditProps,\u00a0KnowledgeChunkProps,\u00a0PromptTemplateProps,\u00a0EvalRunProps,\u00a0LlmBatchProps,\u00a0ToolIdempotencyProps. \u042d\u0442\u043e \u043d\u0435 \u00ab\u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u0447\u0430\u0442-\u0438\u0441\u0442\u043e\u0440\u0438\u044e\u00bb. \u042d\u0442\u043e\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0430\u0433\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0437\u0430\u00a0AddRedbLlmStorage()\u00a0\u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443.\u0414\u0435\u0441\u044f\u0442\u044c enterprise-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 DSL\u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b. \u041d\u0435 \u00abHello, world\u00bb, \u0430 \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 ESB-\u043f\u043e\u0434\u0445\u043e\u0434 \u043a LLM.1. \u0416\u0451\u0441\u0442\u043a\u0438\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043a\u0430\u043a circuit-breaker\u0412 \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u043e\u0432\u00bb \u2014 \u044d\u0442\u043e \u043b\u043e\u0433. \u0412 \u043f\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u00a0\u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u043e\u0432: \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u0441\u044a\u0435\u0441\u0442\u044c 10\u043a \u0434\u043e\u043b\u043b\u0430\u0440\u043e\u0432 \u0438\u0437-\u0437\u0430 \u0431\u0430\u0433\u0430 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442\u0435.\u00a0CostBudgetProps\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435 observability-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u044d\u0442\u043e\u00a0\u043f\u0440\u0435\u0432\u0435\u043d\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e. \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440-\u0432\u044b\u0437\u043e\u0432\u0435 \u0430\u0433\u0435\u043d\u0442-engine \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e conversation-id \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 (\u043f\u043e\u00a0max_tokens). \u0415\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 \u043b\u0438\u043c\u0438\u0442 \u2014\u00a0LlmBudgetExceededException\u00a0\u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f\u00a0\u0434\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435.From(&#171;kafka:\/\/support-tickets&#187;)    .To(Llm.Factory(&#171;claude&#187;)        .Conversation(e =&gt; &#171;ticket-&#187; + e.In.Headers[&#171;TicketId&#187;])        .CostBudget(usd: 0.50)            \/\/ hard ceiling per conversation-id        .CostBudgetExceeded(BudgetPolicy.FailFast)        .AsUri())    .To(&#171;kafka:\/\/support-replies&#187;);\u041f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435: \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u0442\u0435\u043d\u0430\u043d\u0442\u00bb, \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u043c\u043f\u0442-\u0448\u0430\u0431\u043b\u043e\u043d\u00bb, \u00ab\u0431\u044e\u0434\u0436\u0435\u0442 \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c\u00bb. \u0412\u0441\u0435 \u043e\u043d\u0438 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0432\u00a0CostBudgetProps. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u043d\u0430.2. Approval-gate \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u0432 \u0446\u0438\u043a\u043b\u0435\u0421\u0430\u043c\u044b\u0439 \u043d\u0435\u0434\u043e\u043e\u0446\u0435\u043d\u0451\u043d\u043d\u044b\u0439 enterprise-\u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0432 LLM. \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u043e \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043b\u0430\u0442\u0435\u0436\u0438 \u2014 \u043c\u0435\u0436\u0434\u0443 tool-\u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u043e\u044f\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0438 \u044d\u0442\u0430 \u043f\u0430\u0443\u0437\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e runtime, \u0430 \u043d\u0435 \u00ab\u043a\u043e\u0441\u0442\u044b\u043b\u0451\u043c \u0438\u0437 webhook&#8217;\u043e\u0432\u00bb.From(&#171;direct:tool-payments-refund&#187;)    .AsLlmTool(&#171;issue_refund&#187;)        .Description(&#171;Refund a payment by id and reason.&#187;)        .Input(\/* JSON Schema *\/)        .SideEffect(ToolSideEffect.Mutating)         \/\/ hook governance reads this        .Cost(ToolCostClass.Expensive)    .Then()    .Process&lt;ApprovalGate&gt;()                          \/\/ suspend exchange, write ApprovalProps,                                                       \/\/ notify Slack, wait for HTTP callback    .To(&#171;kafka:\/\/payments.refund.commands&#187;);ApprovalProps\u00a0\u0445\u0440\u0430\u043d\u0438\u0442 exchange-id, conversation-id, \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430-\u0430\u043f\u043f\u0440\u0443\u0432\u0435\u0440\u0430, \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u0438\u0441\u0445\u043e\u0434. Slack-bot\/email\/web-form \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 HTTP-\u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435\u00a0redb.Route. \u041a\u043e\u0433\u0434\u0430 \u0430\u043f\u043f\u0440\u0443\u0432\u0435\u0440 \u043a\u043b\u0438\u043a\u0430\u0435\u0442 \u00abapprove\u00bb \u2014 webhook \u0431\u0443\u0434\u0438\u0442 exchange \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0430\u0433\u0435\u043d\u0442-engine. \u0415\u0441\u043b\u0438 timeout \u2014 agent \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u00a0tool_result\u00a0\u0441\u043e\u00a0status:&#187;timeout&#187;\u00a0\u0438 \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u2014 \u044d\u0442\u043e\u00a0\u043d\u0435 AI-\u043b\u043e\u0433\u0438\u043a\u0430. \u042d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d EIP \u00abAggregator + Correlation Identifier + Wire-Tap + JMS Reply-To\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438 \u043a refund-engine&#8217;\u0443 \u0431\u0435\u0437 LLM, \u0438 \u043a LLM-\u0430\u0433\u0435\u043d\u0442\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u0430 \u2014 Exchange&#8217;\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c runtime.3. \u0418\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439 retry \u0441\u00a0ToolIdempotencyPropsWebhook-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u2014 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f. Anthropic Batch \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0430\u0436\u0434\u044b. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448 tool-\u0432\u044b\u0437\u043e\u0432 \u00abissue refund $50\u00bb \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u2014 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u0441\u0440\u0435\u0434\u0430.ToolIdempotencyProps\u00a0\u0445\u0440\u0430\u043d\u0438\u0442\u00a0idempotency-key \u2192 tool-result\u00a0\u0441 TTL. \u0412 DSL:From(&#171;direct:tool-issue-invoice&#187;)    .AsLlmTool(&#171;issue_invoice&#187;)        .Caching(ToolCachingPolicy.Idempotent)    .Then()    .Process(BuildIdempotencyKey)                    \/\/ sha256(args + customer-id + day)    .To(&#171;&#8230;&#187;);\u041a\u043e\u0433\u0434\u0430 \u0430\u0433\u0435\u043d\u0442-engine \u0432\u0438\u0434\u0438\u0442\u00a0Caching = Idempotent\u00a0\u2014 \u043e\u043d\u00a0\u0434\u043e\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u00a0ToolIdempotencyProps\u00a0\u043f\u043e \u043a\u043b\u044e\u0447\u0443. Hit \u2014 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439\u00a0tool_result, \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. Miss \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0430 \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u00ab\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435\u00bb.4. Multi-tenant \u0447\u0435\u0440\u0435\u0437\u00a0?redb=\u041e\u0434\u0438\u043d \u0432\u043e\u0440\u043a\u0435\u0440 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 50-100 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e\u00a0\u0441\u0432\u043e\u0439 REDB-instance\u00a0(\u0441\u0432\u043e\u0438 conversations, \u0441\u0432\u043e\u0439 cost-budget, \u0441\u0432\u043e\u0438 approvals, \u0441\u0432\u043e\u044f knowledge-base). \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u043b\u043e \u0431\u044b \u00ab50 -100 ServiceProvider&#8217;\u043e\u0432 \u0438\u043b\u0438 ScopedFactory \u0441 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439\u00bb. \u0412 3.1.1 \u044d\u0442\u043e\u00a0per-exchange hint:From(&#171;http:0.0.0.0:5088\/api\/llm\/ask?inOut=true&#187;)    .Process(e =&gt;        e.In.Headers[LlmHeaders.Redb] = e.In.Headers[&#171;X-Tenant&#187;]?.ToString())    .To(&#171;llm:\/\/claude?conversationFromHeader=true&#187;);?redb=acme\u00a0\u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u2014 engine \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 named REDB-instance \u0438\u0437 \u0440\u0435\u0435\u0441\u0442\u0440\u0430,\u00a0\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c Exchange, \u0431\u0435\u0437 \u0441\u043c\u0435\u043d\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u0431\u0435\u0437&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-483230","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483230","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=483230"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483230\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483230"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}