[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"content-post-telegram-boty-na-state-machine":3},{"post":4,"related":213,"status":15},{"id":5,"title":6,"slug":7,"excerpt":8,"content":9,"cover_alt":177,"cover_position":15,"reading_time":178,"seo_title":179,"seo_description":180,"date_published":181,"date_modified":15,"source_lead":15,"rubrics":182,"blocks":190,"cover":210},"1c2466c3-e456-46c8-8ab8-4645622e31f9","Второй Telegram-бот не должен стоить как первый","telegram-boty-na-state-machine","Второй похожий бот обычно делают копипастой первого, а к четвёртому одну и ту же правку приходится вносить четыре раза. Показываю, как сценарий диалога переехал в базу: новый бот заводится без разработки, а тексты и кнопки меняет администратор.",{"type":10,"content":11},"doc",[12,20,25,32,48,53,58,63,88,93,98,103,108,138,143,148,153,158,163,169,173],{"type":13,"attrs":14,"content":16},"paragraph",{"textAlign":15},null,[17],{"type":18,"text":19},"text","В 2025 году я делал серию Telegram-ботов для AI-генерации изображений и видео: похожие, но с разными сценариями диалога, тарифами и наборами кнопок. Второй бот в такой серии обычно делается копипастой первого, а к четвёртому у тебя четыре расползшиеся копии одной логики - и каждую правку приходится вносить четыре раза.",{"type":13,"attrs":21,"content":22},{"textAlign":15},[23],{"type":18,"text":24},"Вместо четырёх ботов я сделал один движок. Принцип не мой и старше меня: то, что часто меняется, должно жить в данных.",{"type":26,"attrs":27,"content":29},"heading",{"textAlign":15,"level":28},2,[30],{"type":18,"text":31},"Как это делается обычно - и где ломается",{"type":13,"attrs":33,"content":34},{"textAlign":15},[35,37,46],{"type":18,"text":36},"Стандартный путь: сценарий диалога зашивается прямо в ",{"type":18,"marks":38,"text":45},[39],{"type":40,"attrs":41},"link",{"href":42,"target":43,"rel":44,"class":15},"https:\u002F\u002Fagmazin.ru\u002Fblog\u002F134-workflow-v-prode","_blank","noopener noreferrer nofollow","воркфлоу n8n",{"type":18,"text":47}," или в код бота. Пользователь нажал \"Старт\" - ветка, выбрал стиль - ветка, оплатил - ещё ветка. Пока бот один и сценарий короткий, всё отлично.",{"type":13,"attrs":49,"content":50},{"textAlign":15},[51],{"type":18,"text":52},"Ломается это в двух местах. Первое - тираж: новый бот означает копию воркфлоу, и с этого момента любую правку нужно вносить во все копии. Второе - правки сценария: поменять текст шага или добавить вопрос может только тот, кто умеет редактировать воркфлоу. Каждая мелочь превращается в задачу разработчику.",{"type":26,"attrs":54,"content":55},{"textAlign":15,"level":28},[56],{"type":18,"text":57},"Решение: конечный автомат, сценарий - в базе",{"type":13,"attrs":59,"content":60},{"textAlign":15},[61],{"type":18,"text":62},"Я собрал один движок на Directus и n8n. В основе конечный автомат: бот в любой момент знает, на каком этапе диалога стоит пользователь и в какие этапы его можно перевести дальше. Устроено так:",{"type":64,"content":65},"bulletList",[66,74,81],{"type":67,"content":68},"listItem",[69],{"type":13,"attrs":70,"content":71},{"textAlign":15},[72],{"type":18,"text":73},"Сценарий диалога - это данные, а не код. В базе лежат две таблицы, этапы и переходы: у этапа - текст сообщения, кнопки и действие (например, запустить генерацию картинки), у перехода - из какого этапа в какой и по какому событию. Всё это видно и правится в обычной админке.",{"type":67,"content":75},[76],{"type":13,"attrs":77,"content":78},{"textAlign":15},[79],{"type":18,"text":80},"Состояние пользователя - тоже данные. У каждого пользователя хранится текущий этап диалога.",{"type":67,"content":82},[83],{"type":13,"attrs":84,"content":85},{"textAlign":15},[86],{"type":18,"text":87},"n8n - универсальный исполнитель. Один набор воркфлоу на все боты: пришло сообщение - читаем текущее состояние пользователя - выполняем действие этапа - переводим по подходящему переходу - отвечаем.",{"type":13,"attrs":89,"content":90},{"textAlign":15},[91],{"type":18,"text":92},"Движок при этом не знает ничего про конкретного бота - ни текстов, ни кнопок. Он умеет одно: проиграть тот сценарий, который описан в базе. Поэтому вся серия ботов работает на одном исполнителе.",{"type":26,"attrs":94,"content":95},{"textAlign":15,"level":28},[96],{"type":18,"text":97},"Что это дало",{"type":13,"attrs":99,"content":100},{"textAlign":15},[101],{"type":18,"text":102},"Главный результат: новый бот заводится записями в базе, без переписывания воркфлоу. Завести этапы, тексты, кнопки и переходы - и бот работает. Движок получился переиспользуемым: запуск следующего бота сводится к работе с данными.",{"type":13,"attrs":104,"content":105},{"textAlign":15},[106],{"type":18,"text":107},"Побочные эффекты оказались не менее ценными:",{"type":64,"content":109},[110,117,124,131],{"type":67,"content":111},[112],{"type":13,"attrs":113,"content":114},{"textAlign":15},[115],{"type":18,"text":116},"Правки сценария перестали быть задачей разработчика. Поменять текст шага или добавить кнопку можно прямо в админке Directus.",{"type":67,"content":118},[119],{"type":13,"attrs":120,"content":121},{"textAlign":15},[122],{"type":18,"text":123},"Стало видно, что происходит с человеком. По каждому пользователю в базе написано, на каком он этапе и как сюда попал. Жалобу \"бот меня потерял\" разбираем по базе, а не восстанавливаем путь по логам.",{"type":67,"content":125},[126],{"type":13,"attrs":127,"content":128},{"textAlign":15},[129],{"type":18,"text":130},"Логика перестала расползаться. Исправление бага в исполнителе автоматически чинит все боты сразу - копий больше нет.",{"type":67,"content":132},[133],{"type":13,"attrs":134,"content":135},{"textAlign":15},[136],{"type":18,"text":137},"Появилась воронка бесплатно. Раз состояние каждого пользователя лежит в базе, вопрос \"сколько людей дошло до оплаты и где отваливаются\" закрывается одним запросом к базе, без отдельного проекта по аналитике.",{"type":26,"attrs":139,"content":140},{"textAlign":15,"level":28},[141],{"type":18,"text":142},"Границы подхода",{"type":13,"attrs":144,"content":145},{"textAlign":15},[146],{"type":18,"text":147},"Конечный автомат нужен не всегда. Если бот - это три линейных шага и он один, автомат избыточен: вы потратите время на движок, который не окупится. Прямолинейный воркфлоу будет дешевле.",{"type":13,"attrs":149,"content":150},{"textAlign":15},[151],{"type":18,"text":152},"Для свободного диалога автомата мало: когда пользователь пишет что угодно, нужна LLM. Но и здесь автомат помогает - агент со свободным диалогом хорошо живёт поверх каркаса, который держит оплату, лимиты и обязательные шаги. LLM отвечает за разговор, автомат - за то, чтобы бот не потерял пользователя и деньги.",{"type":13,"attrs":154,"content":155},{"textAlign":15},[156],{"type":18,"text":157},"Точка окупаемости подхода - второй похожий бот или первый сценарий, который придётся часто править. У меня оба условия сработали.",{"type":26,"attrs":159,"content":160},{"level":28},[161],{"type":18,"text":162},"Что это даёт вам в месяц",{"type":164,"attrs":165},"relation-block",{"id":166,"junction":167,"collection":168},"3946ce3b-9421-4b8a-9c92-bc8e09180db9","posts_blocks","block_stats",{"type":13,"content":170},[171],{"type":18,"text":172},"Посчитайте на своих цифрах. Правка общей логики раз в неделю при четырёх копиях бота - это четыре задачи разработчику вместо одной. Тексты и кнопки после этого правит администратор: при ставке 40 000 - 80 000 рублей в месяц это его обычная работа, а не релиз. Если бот собирает заявки, каждый застрявший на этапе - это заявка за 3 000 - 15 000 рублей, и теперь видно, на каком именно.",{"type":164,"attrs":174},{"id":175,"junction":167,"collection":176},"6986b21b-1180-4abf-af71-da4abf8dbc2d","block_cta","Конечный автомат из блоков-записей, собирающийся в силуэт Telegram-бота, один блок подсвечен красным",3,"Telegram-боты на конечном автомате: сценарий диалога в базе","Кейс: движок Telegram-ботов на Directus и n8n. Новый бот заводится записями в базе, а тексты и кнопки правит администратор, не разработчик.","2026-07-27T07:00:00.000Z",[183,187],{"sort":184,"tags_id":185},1,{"name":186},"Продажи",{"sort":28,"tags_id":188},{"name":189},"Инструменты",[191,203],{"id":166,"sort":15,"collection":168,"item":192},{"items":193,"columns":178},[194,197,200],{"lead":195,"text":196},"1 правка вместо 4","Правка общей логики вносится один раз в движке - раньше её приходилось повторять в каждой из четырёх копий бота.",{"lead":198,"text":199},"0 задач разработчику","Текст этапа и кнопку правит администратор в базе, релиз не нужен.",{"lead":201,"text":202},"1 запрос к базе","Видно, сколько людей дошло до оплаты и на каком этапе отваливаются.",{"id":175,"sort":15,"collection":176,"item":204},{"cta_variant":205,"heading":206,"body":207,"button_label":208,"url":15,"glow":209},"estimator","Похожая задача?","У вас уже есть бот и на подходе второй, или каждая правка сценария упирается в разработчика. Опишите задачу - посчитаю, во что обойдётся движок и на каком боте он окупится.","Оценить задачу",true,{"id":211,"modified_on":212},"e0f5ea2b-4959-4185-9d66-d24283607218","2026-08-12T12:31:57.022Z",[214,433,657],{"id":215,"title":216,"slug":217,"excerpt":218,"content":219,"cover_alt":403,"cover_position":15,"reading_time":178,"seo_title":404,"seo_description":405,"date_published":406,"date_modified":15,"source_lead":15,"rubrics":407,"blocks":413,"cover":430},"d838d857-9efe-47b4-b6c3-6b68650b2773","Оценка, которой можно верить: как читать смету на автоматизацию","kak-chitat-ocenku-na-avtomatizaciyu","\"Разработка - от 150 до 400 часов\" - с такой строкой заказчику нечего делать: разброс в два с половиной раза, а из чего он складывается, не видно. Разбираю с позиции заказчика, что должно быть в смете на автоматизацию, чтобы её можно было проверить: одна вилка, буфер отдельной строкой, чужая зона ответственности вне часов и четыре вопроса подрядчику.",{"type":10,"content":220},[221,225,229,234,238,242,246,251,255,259,263,267,272,276,280,285,289,315,319,324,328,332,337,341,345,349,354,358,384,388,393,396,400],{"type":13,"content":222},[223],{"type":18,"text":224},"Собственник получает от подрядчика оценку: \"Разработка - от 150 до 400 часов\". Что с этим делать, непонятно. Разброс в два с половиной раза, из чего он складывается - неизвестно, а торговаться не о чем: цифра монолитная.",{"type":13,"content":226},[227],{"type":18,"text":228},"Я пишу такие оценки регулярно - и для крупного заказчика с проектным офисом, и для небольших клиентов. За это время сложился набор требований к документу, и почти каждое из них защищает интересы того, кто платит. Разберу их с позиции заказчика: что должно быть в оценке, чтобы её можно было проверить.",{"type":26,"attrs":230,"content":231},{"level":28},[232],{"type":18,"text":233},"Одна вилка на весь документ",{"type":13,"content":235},[236],{"type":18,"text":237},"Самый частый дефект - несколько чисел в одном документе. В шапке \"ориентировочно 200 часов\", в тексте \"чистой работы дней двадцать\", в таблице сумма даёт 260, а в письме звучит \"ну, месяца полтора\".",{"type":13,"content":239},[240],{"type":18,"text":241},"Каждое из этих чисел получено по-своему, и ни одно не отвечает за остальные. Разговор об объёме превращается в спор о том, какую цифру считать настоящей.",{"type":13,"content":243},[244],{"type":18,"text":245},"В документе должна быть ровно одна вилка, и она везде одинаковая. Строки таблицы обязаны суммироваться ровно в итог. Если этого не происходит, документ имеет смысл вернуть на пересборку.",{"type":26,"attrs":247,"content":248},{"level":28},[249],{"type":18,"text":250},"Буфер - отдельной строкой",{"type":13,"content":252},[253],{"type":18,"text":254},"В любой оценке есть неизвестное: чужой сервис поведёт себя не так, данные окажутся грязнее, чем обещали, вылезет ошибка в стороннем модуле. Это нормально, и на это закладывается запас.",{"type":13,"content":256},[257],{"type":18,"text":258},"Ненормально - когда запас растворён внутри строк. Тогда каждая позиция выглядит раздутой, заказчик начинает резать по живому, а подрядчик защищает воздух, не называя его вслух.",{"type":13,"content":260},[261],{"type":18,"text":262},"Честный формат: строки - реальное время работы, буфер - отдельная строка процентом от итога. Я обычно закладываю тридцать процентов и пишу это прямым текстом. Тогда торг идёт предметно: можно обсуждать риск, а можно сознательно его снять и работать без запаса, понимая последствия.",{"type":13,"content":264},[265],{"type":18,"text":266},"Отдельно: если заказчик сам называет потолок (\"у нас девять часов, больше нет\"), буфер не добавляется - под названную цифру подгоняется объём работ. Это его право - решать, сколько задача стоит. Задача подрядчика - честно сказать, что в эти часы влезет, а что нет.",{"type":26,"attrs":268,"content":269},{"level":28},[270],{"type":18,"text":271},"Реальные часы работы",{"type":13,"content":273},[274],{"type":18,"text":275},"Я считаю фактическое время: за сколько работа реально будет сделана мной и моими ИИ-ассистентами. Не за сколько её сделал бы условный средний разработчик, и без надбавки \"потому что бывает всякое\". Вы платите за часы, которые уйдут на вашу задачу, а не за коэффициент, который подрядчик держит в уме.",{"type":13,"content":277},[278],{"type":18,"text":279},"Для заказчика это важнее, чем кажется. Оценку в реальных часах можно проверить по факту сдачи: попал подрядчик или нет, видно сразу, и на следующую его оценку вы смотрите уже с этим знанием. Пересчёт на условные единицы такой сверки не даёт.",{"type":26,"attrs":281,"content":282},{"level":28},[283],{"type":18,"text":284},"Что не входит в часы",{"type":13,"content":286},[287],{"type":18,"text":288},"Отдельный раздел, которого почти никогда нет, а он самый ценный. В любом проекте есть работа, которая часами не измеряется, потому что зависит не от исполнителя:",{"type":64,"content":290},[291,297,303,309],{"type":67,"content":292},[293],{"type":13,"content":294},[295],{"type":18,"text":296},"ожидание доступов;",{"type":67,"content":298},[299],{"type":13,"content":300},[301],{"type":18,"text":302},"чужой сервис, который должен доработать другая команда;",{"type":67,"content":304},[305],{"type":13,"content":306},[307],{"type":18,"text":308},"регламентные окна выкатки;",{"type":67,"content":310},[311],{"type":13,"content":312},[313],{"type":18,"text":314},"согласования на стороне заказчика.",{"type":13,"content":316},[317],{"type":18,"text":318},"Такие вещи двигают календарь, но в трудозатраты не попадают. Смешивать одно с другим нечестно в обе стороны: подрядчик либо прячет простой в свои часы, либо потом объясняет, почему \"двадцать часов работы\" заняли месяц. Честнее развести: вот наши часы, вот зона вашей ответственности, вот от чего зависит срок.",{"type":26,"attrs":320,"content":321},{"level":28},[322],{"type":18,"text":323},"Опциональное - вне итога",{"type":13,"content":325},[326],{"type":18,"text":327},"В любой задаче есть \"хорошо бы ещё\": вторая интеграция, админка для настройки, отчётность. Место этому - отдельная строка с пометкой, что в основной объём оно не входит.",{"type":13,"content":329},[330],{"type":18,"text":331},"Когда желательное подмешано к обязательному, вы платите за то, чего не заказывали, а у подрядчика объём работ растёт без конца. Разделение снимает обе проблемы и оставляет решение за вами: пилот сейчас, расширение - когда первый этап себя оправдает.",{"type":26,"attrs":333,"content":334},{"level":28},[335],{"type":18,"text":336},"Почему всё таблицей и почему в конце",{"type":13,"content":338},[339],{"type":18,"text":340},"Две мелочи, которые сильно влияют на восприятие.",{"type":13,"content":342},[343],{"type":18,"text":344},"Всё, что можно, - таблицей: блок работ, объём, комментарий, итоговая строка. Прозаический вывод в конце (\"в целом, думаю, недели три\") не нужен: итог - это строка таблицы, и она одна.",{"type":13,"content":346},[347],{"type":18,"text":348},"А сама оценка идёт в конце документа. Сначала разбор задачи: что понято, какие есть развилки, что предлагается делать и почему. Тот, кто принимает решение, всё равно листает в конец - но, дойдя туда, он уже видит, за что именно платит.",{"type":26,"attrs":350,"content":351},{"level":28},[352],{"type":18,"text":353},"Четыре вопроса подрядчику",{"type":13,"content":355},[356],{"type":18,"text":357},"Когда получаете оценку, задайте четыре вопроса:",{"type":64,"content":359},[360,366,372,378],{"type":67,"content":361},[362],{"type":13,"content":363},[364],{"type":18,"text":365},"Складываются ли строки в итог?",{"type":67,"content":367},[368],{"type":13,"content":369},[370],{"type":18,"text":371},"Где буфер и сколько он?",{"type":67,"content":373},[374],{"type":13,"content":375},[376],{"type":18,"text":377},"Что в этом сроке зависит не от вас?",{"type":67,"content":379},[380],{"type":13,"content":381},[382],{"type":18,"text":383},"Что из перечисленного можно не делать в первом этапе?",{"type":13,"content":385},[386],{"type":18,"text":387},"Если подрядчик отвечает на все четыре не задумываясь - он задачу разобрал. Если начинает объяснять, что \"так не считают\" - вы держите в руках не оценку, а надежду.",{"type":26,"attrs":389,"content":390},{"level":28},[391],{"type":18,"text":392},"Что это даёт вам на ближайшей смете",{"type":164,"attrs":394},{"id":395,"junction":167,"collection":168},"3b5c406a-a685-44c3-8ea3-83698d9f986d",{"type":13,"content":397},[398],{"type":18,"text":399},"Посчитайте на своей смете. Вилка \"от 150 до 400 часов\" - это 250 часов, о которых вы не договорились: умножьте на ставку из договора и увидите сумму, которой пока не управляете. Буфер в 30 процентов, вынесенный строкой, обсуждаем - его можно оставить или снять осознанно. А каждый раунд спора \"какую цифру считать настоящей\" стоит вам дня руководителя - ориентировочно 7 000 - 10 000 рублей за день.",{"type":164,"attrs":401},{"id":402,"junction":167,"collection":176},"f1855753-d980-4c07-9c29-9a4561d60f63","Ряд ровных строк-полос, нижняя подсвечена, рядом линейка","Как читать оценку трудозатрат подрядчика: признаки честной сметы","Что должно быть в оценке задачи на автоматизацию, чтобы ей можно было верить: одна вилка, буфер отдельной строкой, зона чужой ответственности вне часов. Разбор изнутри.","2026-08-27T17:49:48.000Z",[408,410],{"sort":184,"tags_id":409},{"name":186},{"sort":28,"tags_id":411},{"name":412},"Разборы задач",[414,426],{"id":395,"sort":15,"collection":168,"item":415},{"items":416,"columns":178},[417,420,423],{"lead":418,"text":419},"250 часов","разрыв между краями вилки \"от 150 до 400\" - бюджет, о котором вы не договорились",{"lead":421,"text":422},"30 процентов","буфер отдельной строкой: его видно, его можно обсудить или снять осознанно",{"lead":424,"text":425},"7 000 - 10 000 рублей","ориентировочная стоимость дня руководителя, потраченного на спор, какую цифру из сметы считать настоящей",{"id":402,"sort":15,"collection":176,"item":427},{"cta_variant":205,"heading":428,"body":429,"button_label":208,"url":15,"glow":209},"У вас на руках такая смета?","Опишите задачу - вернётся разбор и оценка в том виде, о котором эта статья: одна вилка, буфер отдельной строкой, чужая зона ответственности вне часов. Будет с чем сравнить ту смету, что уже лежит у вас на столе.",{"id":431,"modified_on":432},"f0323b71-f5ac-48ff-98d1-5da4a4970269","2026-08-27T18:12:41.977Z",{"id":434,"title":435,"slug":436,"excerpt":437,"content":438,"cover_alt":629,"cover_position":15,"reading_time":178,"seo_title":630,"seo_description":631,"date_published":632,"date_modified":15,"source_lead":15,"rubrics":633,"blocks":639,"cover":654},"a3bdafa1-370e-4669-a460-69d658ee9330","Локально или в облаке: когда своё железо дешевле облачного счёта","lokalno-ili-v-oblake","Одна и та же задача на одном и том же сервере: сначала 25 секунд речи обрабатывались две минуты, потом сорок секунд речи укладывались в десять. Показываю на замерах и на деньгах, когда своё железо окупается на вашем потоке, а когда за него платят зря.",{"type":10,"content":439},[440,444,456,461,465,469,474,478,482,486,491,495,499,503,508,512,516,530,535,539,546,572,578,598,602,607,615,619,622,626],{"type":13,"content":441},[442],{"type":18,"text":443},"Голосовой ввод, который я собирал для сайта и для себя, сначала не заработал вообще: распознавание отставало от реального времени в пять раз. Развилку \"локальная модель или облачный API\" после этого я прохожу замерами - у неё есть числовой ответ, и он разный для разных задач.",{"type":13,"content":445},[446,448,454],{"type":18,"text":447},"Задача, на которой я прошёл оба пути до конца, - ",{"type":18,"marks":449,"text":453},[450],{"type":40,"attrs":451},{"href":452},"https:\u002F\u002Fagmazin.ru\u002Fblog\u002Fwhisperkey-diktovka-dlya-maka","распознавание речи",{"type":18,"text":455},". Расскажу, что получилось, и заодно сформулирую фильтр, по которому эту развилку стоит проходить в любом другом проекте.",{"type":26,"attrs":457,"content":458},{"level":28},[459],{"type":18,"text":460},"Задача",{"type":13,"content":462},[463],{"type":18,"text":464},"Голосовой ввод на сайте и в личных инструментах: человек говорит, получает готовый текст. К этому же классу относится расшифровка звонков и встреч - обычно самый первый реальный ИИ-проект в компании, потому что польза очевидна и данные уже есть.",{"type":13,"content":466},[467],{"type":18,"text":468},"Требования были такие: русский язык, приемлемая задержка, и аудио не должно уезжать в чужие руки без необходимости. Последнее - не паранойя: в звонках клиентов лежат персональные данные, и отправка их наружу превращает техническую задачу в юридическую.",{"type":26,"attrs":470,"content":471},{"level":28},[472],{"type":18,"text":473},"Первый заход: сделать красиво",{"type":13,"content":475},[476],{"type":18,"text":477},"Первым делом я взял готовую потоковую обёртку - из тех, что показывают текст прямо во время речи, слово за словом. Выглядит эффектно, и на демо-роликах всё летает.",{"type":13,"content":479},[480],{"type":18,"text":481},"На сервере без видеокарты она отставала от речи впятеро: 25 секунд речи обрабатывались две минуты. Пользоваться этим нельзя.",{"type":13,"content":483},[484],{"type":18,"text":485},"Сервер тут ни при чём: отдельная машина с быстрыми ядрами, взятая специально под задачу. Дело в подходе: потоковое распознавание постоянно пересчитывает уже сказанное, чтобы уточнить гипотезу, и на процессоре эта переработка съедает всё.",{"type":26,"attrs":487,"content":488},{"level":28},[489],{"type":18,"text":490},"Второй заход: сделать просто",{"type":13,"content":492},[493],{"type":18,"text":494},"Я выбросил потоковость и сделал скучно: человек говорит целиком, запись уходит на сервер одним куском, модель распознаёт её за один проход.",{"type":13,"content":496},[497],{"type":18,"text":498},"Сорок секунд речи обрабатываются за десять. После настройки - в восемь раз быстрее речи: час записи с планёрки превращается в текст за семь минут. Всё на том же сервере без видеокарты.",{"type":13,"content":500},[501],{"type":18,"text":502},"Заодно ушла вторая проблема, о которой я не думал заранее: потоковая выдача даёт рваный текст. Пока модель уточняет гипотезу, фраза на экране дёргается и переписывается. На записи целиком результат сразу чистый.",{"type":26,"attrs":504,"content":505},{"level":28},[506],{"type":18,"text":507},"Третий заход: посчитать на своём железе",{"type":13,"content":509},[510],{"type":18,"text":511},"Отдельная история - обработка на ноутбуке. В современных Маках есть отдельный ускоритель для нейросетей, и собранная под него модель разбирает час разговора за 17 секунд. Разделение на говорящих - примерно столько же. Ноутбук уже куплен, и счёт за минуту распознавания никто не выставляет.",{"type":13,"content":513},[514],{"type":18,"text":515},"Здесь же я собрал грабли, которые стоит знать заранее:",{"type":64,"content":517},[518,524],{"type":67,"content":519},[520],{"type":13,"content":521},[522],{"type":18,"text":523},"Безвентиляторный ноутбук перегревается, если гнать распознавание и разделение говорящих одновременно. Последовательно - те же секунды, но без троттлинга. Параллелить на одном ускорителе бессмысленно.",{"type":67,"content":525},[526],{"type":13,"content":527},[528],{"type":18,"text":529},"Затравка модели (список терминов, чтобы правильно писала специальные слова) должна быть обычной фразой, а не списком. Список, начинающийся со слова \"Термины:\", модель вставляла прямо в расшифровку, а на плохом звуке зацикливалась и повторяла его. Затравку она воспринимает как начало текста и продолжает его. После переписывания живым предложением мусор исчез, и скорость выросла втрое.",{"type":26,"attrs":531,"content":532},{"level":28},[533],{"type":18,"text":534},"Фильтр: когда локально выигрывает",{"type":13,"content":536},[537],{"type":18,"text":538},"Из этой и соседних задач сложилось правило, по которому я развилку прохожу.",{"type":13,"content":540},[541],{"type":18,"marks":542,"text":545},[543],{"type":544},"bold","Локально выигрывает, когда:",{"type":64,"content":547},[548,554,560,566],{"type":67,"content":549},[550],{"type":13,"content":551},[552],{"type":18,"text":553},"нагрузка постоянная и предсказуемая - расшифровка всех звонков, обработка всех документов;",{"type":67,"content":555},[556],{"type":13,"content":557},[558],{"type":18,"text":559},"данные чувствительные и их отправка наружу создаёт отдельную юридическую задачу;",{"type":67,"content":561},[562],{"type":13,"content":563},[564],{"type":18,"text":565},"задача узкая, и под неё есть небольшая специализированная модель;",{"type":67,"content":567},[568],{"type":13,"content":569},[570],{"type":18,"text":571},"нужна независимость от чужой доступности, тарифов и геополитики.",{"type":13,"content":573},[574],{"type":18,"marks":575,"text":577},[576],{"type":544},"Облако выигрывает, когда:",{"type":64,"content":579},[580,586,592],{"type":67,"content":581},[582],{"type":13,"content":583},[584],{"type":18,"text":585},"нагрузка редкая или рваная - железо будет простаивать;",{"type":67,"content":587},[588],{"type":13,"content":589},[590],{"type":18,"text":591},"задача требует рассуждений: разбор смысла, написание текста, принятие решений;",{"type":67,"content":593},[594],{"type":13,"content":595},[596],{"type":18,"text":597},"вы ещё проверяете гипотезу и не знаете, взлетит ли вообще.",{"type":13,"content":599},[600],{"type":18,"text":601},"Практически это чаще всего означает гибрид, и у меня он именно такой: распознавание речи - локально, на своём железе, а причёсывание расшифровки в читаемый текст - облачной моделью. Аудио наружу не уходит, а за интеллект платится там, где он действительно нужен.",{"type":26,"attrs":603,"content":604},{"level":28},[605],{"type":18,"text":606},"Про деньги",{"type":64,"content":608},[609],{"type":67,"content":610},[611],{"type":13,"content":612},[613],{"type":18,"text":614},"Считайте не стоимость запроса, а стоимость месяца при вашей нагрузке. Облачный счёт растёт вместе с потоком, своё железо покупается один раз. И это ещё не всё: главная строка - часы, которые сейчас тратит на это живой человек, умноженные на его ставку. При постоянном потоке железо окупается быстро, при редких обращениях не окупается никогда.",{"type":26,"attrs":616,"content":617},{"level":28},[618],{"type":18,"text":162},{"type":164,"attrs":620},{"id":621,"junction":167,"collection":168},"1f3bb2ac-0689-4d3d-a55f-393549604720",{"type":13,"content":623},[624],{"type":18,"text":625},"Посчитайте на своих цифрах. При ставке 500 рублей в час двадцать часовых созвонов в месяц - это 10 000 рублей чужого времени только на прослушивание, и столько же в следующем месяце. Своё железо проходит те же двадцать часов за пару часов и счёт за минуту не выставляет. Плюс риск: если запись с персональными данными ушла наружу, разбор считается днями руководителя по 7 000 - 10 000 рублей.",{"type":164,"attrs":627},{"id":628,"junction":167,"collection":176},"e89df558-4c1d-4ad8-ad47-e2771b55b20e","Весы: монолитный блок против лёгкой формы из тонких линий","Локально или в облаке: когда локальная модель дешевле API","Когда своё железо окупается, а когда дешевле облачный API. Реальные замеры на распознавании речи и расчёт в рублях на вашем потоке звонков.","2026-08-27T17:42:48.000Z",[634,636],{"sort":184,"tags_id":635},{"name":189},{"sort":28,"tags_id":637},{"name":638},"ИИ и модели",[640,643],{"id":628,"sort":15,"collection":176,"item":641},{"cta_variant":205,"heading":206,"body":642,"button_label":208,"url":15,"glow":209},"У вас копятся записи звонков и встреч, и вы выбираете между своим железом и облаком. Опишите задачу - посчитаю, что дешевле на вашем потоке и что при этом останется внутри компании.",{"id":621,"sort":15,"collection":168,"item":644},{"items":645,"columns":178},[646,649,652],{"lead":647,"text":648},"10 000 рублей в месяц","двадцать часов созвонов в месяц, которые сейчас кто-то слушает по ставке 500 рублей в час",{"lead":650,"text":651},"7 минут на час записи","столько занимает расшифровка на сервере без видеокарты вместо часа прослушивания",{"lead":424,"text":653},"день руководителя, съеденный разбором, если запись с персональными данными ушла наружу",{"id":655,"modified_on":656},"64bd6f0e-23d1-44b4-9f73-ecf6098c1280","2026-08-27T18:12:51.408Z",{"id":658,"title":659,"slug":660,"excerpt":661,"content":662,"cover_alt":781,"cover_position":15,"reading_time":178,"seo_title":782,"seo_description":783,"date_published":784,"date_modified":15,"source_lead":15,"rubrics":785,"blocks":790,"cover":803},"b4b00a32-20a6-4557-b217-16867693b50b","Работает, но врёт: как геоблокировки ломают ИИ-систему незаметно","geobloki-i-tihie-otkazy","Поиск в системе не работал минимум три недели, а мониторинг был зелёный: ИИ-агент съедал ошибку инструмента и спокойно отвечал по памяти. Разбираю класс поломок, при которых всё \"работает\", - блокировки по географии, тихие отказы и то, как их вообще заметить.",{"type":10,"content":663},[664,676,681,685,689,693,698,702,706,710,714,719,723,727,732,740,748,752,756,760,763,767,771],{"type":13,"content":665},[666,668,674],{"type":18,"text":667},"Расскажу про класс поломок, с которым в России теперь сталкивается любой, кто строит ИИ-системы: отказ внешнего сервиса по географическому признаку. ",{"type":18,"marks":669,"text":673},[670],{"type":40,"attrs":671},{"href":672},"https:\u002F\u002Fagmazin.ru\u002Fblog\u002Favtomatizaciya-kotoraya-padaet","Падение видно сразу",{"type":18,"text":675},", его чинят за час. Здесь другое: система продолжает отвечать, отчётность зелёная, а результат тихо стал хуже. Сервисы дальше без названий - разговор про класс поломок, названия к нему ничего не добавят.",{"type":26,"attrs":677,"content":678},{"level":28},[679],{"type":18,"text":680},"Что случилось",{"type":13,"content":682},[683],{"type":18,"text":684},"В одной системе ИИ-ассистент умеет искать в интернете - это отдельный инструмент, который он вызывает, когда своих знаний не хватает. Я полез в журналы по другому поводу и от нечего делать посмотрел статистику вызовов поиска.",{"type":13,"content":686},[687],{"type":18,"text":688},"За всё окно хранения журналов - две недели, 335 вызовов - успешных не было ни одного. Ноль. Поиск был мёртв как минимум с начала месяца.",{"type":13,"content":690},[691],{"type":18,"text":692},"При этом в системе не горело ничего. Запуски числились успешными, пользователи не жаловались, поддержка была спокойна. Причина проста и от этого неприятна: ИИ-агент устроен так, что ошибку инструмента он обрабатывает сам. Инструмент не ответил - агент пожал плечами и ответил по памяти. Формально диалог завершён успешно. Фактически человек получил ответ без свежих данных и не узнал об этом.",{"type":26,"attrs":694,"content":695},{"level":28},[696],{"type":18,"text":697},"Как отличить гео от сломанного ключа",{"type":13,"content":699},[700],{"type":18,"text":701},"Дальше началась диагностика, которая заняла бы дни, если бы не одна привычка: при странном отказе внешнего сервиса первым делом сравнить его поведение из разных точек.",{"type":13,"content":703},[704],{"type":18,"text":705},"Сервис отвечал ошибкой 403 и страницей-заглушкой вместо данных. С зарубежного адреса тот же самый ключ работал. С двух независимых российских адресов - отказ. А запрос вообще без ключа с тех же российских адресов получал внятную ошибку 401 в json. Значит, сеть проходит, адрес не в бане, отвечает само приложение. Режут именно вызов с ключом.",{"type":13,"content":707},[708],{"type":18,"text":709},"Это важное различение. Битый ключ даёт 401 и внятное сообщение. Гео даёт 403 и страницу-заглушку. Разница в одну цифру, а выводы противоположные: в первом случае перевыпускаете ключ, во втором перевыпуск не поможет никогда.",{"type":13,"content":711},[712],{"type":18,"text":713},"Отдельная ловушка того же семейства: один известный шлюз к языковым моделям отвечает на запросы из дата-центров кодом 403 с формулировкой про политику безопасности, а в другом сценарии - кодом 401. То есть 401 от него с сервера - это не протухший ключ, а тот же самый блок. Я потратил на эту догадку время дважды и теперь держу её записанной.",{"type":26,"attrs":715,"content":716},{"level":28},[717],{"type":18,"text":718},"Масштаб проблемы шире, чем кажется",{"type":13,"content":720},[721],{"type":18,"text":722},"Проверка соседних сервисов с тех же адресов дала пёструю картину: часть поисковых API режет российские адреса наглухо, часть работает без вопросов. Отдельная история - мессенджеры: исходящие в один популярный мессенджер из российского облака стабильно упираются в таймаут. У этого есть красивое следствие: если алерты о сбоях настроены туда же, то оповещатель падает на отправке оповещения. Про аварии не узнаёт никто, и мониторинг снова зелёный.",{"type":13,"content":724},[725],{"type":18,"text":726},"Общий вывод простой: в 2026 году доступность внешнего сервиса - это не константа, а переменная, зависящая от того, откуда вы вышли в интернет. Причём меняется она без предупреждения и без письма на почту.",{"type":26,"attrs":728,"content":729},{"level":28},[730],{"type":18,"text":731},"Что с этим делать",{"type":13,"content":733},[734,738],{"type":18,"marks":735,"text":737},[736],{"type":544},"Считать внешний сервис ненадёжным по умолчанию:",{"type":18,"text":739}," канал до него вам не принадлежит. И не гасить его ошибки внутри агента молча - если инструмент не ответил, это должно попадать в журнал сбоев и в оповещения, даже когда агент справился без него.",{"type":13,"content":741},[742,746],{"type":18,"marks":743,"text":745},[744],{"type":544},"Ловить тихие отказы отдельно.",{"type":18,"text":747}," Мониторинг \"процесс завершился успешно\" здесь бесполезен. Нужны метрики результата: сколько вызовов инструмента вернули данные, а не ошибку; какая доля ответов агента опиралась на поиск. Хорошая проверка на здравый смысл - раз в месяц открыть журналы и посмотреть, что вообще происходит внутри успешных запусков.",{"type":13,"content":749},[750],{"type":18,"text":751},"Весь мой трафик к зарубежным сервисам выходит наружу через одну точку, которой я управляю.",{"type":13,"content":753},[754],{"type":18,"text":755},"Держать запасного поставщика: второй сервис того же назначения, заранее проверенный и настроенный, на который переключаются одной настройкой. И не строить алерты на канале, который может отвалиться, - оповещения о сбоях должны идти по маршруту, независимому от того, что они охраняют.",{"type":26,"attrs":757,"content":758},{"level":28},[759],{"type":18,"text":162},{"type":164,"attrs":761},{"id":762,"junction":167,"collection":168},"2c691b05-9b0c-4b2d-906b-c6dc1369d67e",{"type":13,"content":764},[765],{"type":18,"text":766},"Считайте на своих числах. Три недели бот отвечал по памяти - прикиньте, сколько таких ответов пришлось переделывать руками. Например, двадцать штук по часу работы при ставке 500 рублей - это 10 000 рублей. Дороже другое: заявка, потерянная на устаревшем ответе, в B2B стоит от 3 000 до 15 000 рублей. И даже полчаса в журналах раз в месяц - это 250 рублей при той же ставке.",{"type":13,"content":768},[769],{"type":18,"text":770},"Если ваша система висит на зарубежном API, следующий вопрос - что перенести к себе. В соседней статье считаю, где своё железо реально выигрывает, а где это лишние деньги.",{"type":13,"content":772},[773,775],{"type":18,"text":774},"Читать дальше: ",{"type":18,"marks":776,"text":780},[777],{"type":40,"attrs":778},{"href":779},"https:\u002F\u002Fagmazin.ru\u002Fblog\u002Flokalno-ili-v-oblake","Локально или в облаке: где своё железо реально выигрывает у API","Ровный ряд горящих индикаторов и оборванный кабель за панелью","Геоблокировки и ИИ-сервисы: тихие отказы, которые не видно в мониторинге","Поиск не работал три недели, а система считала запуски успешными: ИИ-агент съедал ошибку инструмента и отвечал по памяти. Как ловить тихие отказы и что делать с блокировками по IP.","2026-08-27T17:35:48.000Z",[786,788],{"sort":184,"tags_id":787},{"name":189},{"sort":28,"tags_id":789},{"name":638},[791],{"id":762,"sort":15,"collection":168,"item":792},{"items":793,"columns":178},[794,797,800],{"lead":795,"text":796},"0 из 335","вызовов поиска сработали за две недели, а система считала запуски успешными",{"lead":798,"text":799},"от 3 000 рублей","цена одной заявки в B2B, потерянной на ответе без свежих данных",{"lead":801,"text":802},"1 точка вместо 15","столько мест правите при смене выхода наружу, если канал один",{"id":804,"modified_on":805},"9f4b69c4-2c6f-438a-abc2-5de5ab33ab96","2026-08-27T18:12:56.230Z"]