📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Научи своего AI-агента писать код на Spring (Claude Code, Codex, Cursor, OpenCode, ...)

Amplicode1:50:00

Transcription

Всем привет. Добро пожаловать в нашу виртуальную студию. Меня зовут Илья. Со мной сегодня Паш Кислов, эксперт с Принка. Паш, поздоровайся.

Привет всем.

Что мы сегодня собрались? Что мы сегодня будем делать? Мы сегодня собрались презентовать такую новую штуку, которая называется Spring and Tool Kit. А чтобы сказать, научить своего AI-агента программировать на Спринг. Паш, ты уже пользуешься агентами?

Нет, всё ещё нет.

Ещё не пользуешься. Ещё не пользуешься. Ладно, самое. Ладно, ладно, я вру, наверное, просто это не так хорошо, как это могло бы быть. Вот. А если вдруг вы ещё не пользуетесь агентами, то видео можете не выключать и до конца досмотреть, потому что мы, в принципе, всё будет доступно и понятно и будем много показывать. Но в любой момент вы можете поставить на паузу, если вот, например, смотрите нас в записи. А если вы присутствуете на стриме, то можете прямо сейчас поставить себе агента и, собственно говоря, начать и даже повторять за нами. Паша, пойдёшь ставить или всё-таки останешься пока?

Все, все эти у меня уже стоят. Тогда пользуюсь. Точно пользуюсь.

Угу. Чему мы сегодня, собственно, научимся, да? А мы сегодня поговорим о том, как повысить качество генерируемого кода в агенте, да? Потом о том, как можно снизить количество потребляемых токенов и уменьшить общее время выполнения задачи. То есть такие вещи, к которым достаточно быстро вы приходите, к проблемам, с которыми вы приходите, когда начинаете работать с агентом. Как вообще мы используем агента? Ты как используешь?

Слушай, ну мы, да, используем их в повседневных задачах, и мы от этого становимся невероятно беспомощными. Я иногда чувствую себя без подсказки AI уже прям глупым. Вот мне кажется, у тебя, кстати, тоже дверь, да, тоже, да, и она тоже закрыта. И я не выйду отсюда, пока мне не ответит чат GPT.

Но, возможно, возможно, кто-то внезапно войдёт. Правильно. Хотелось бы, чтобы так не произошло, конечно. Но вдруг вдруг такая будет маленькая подвесим ружьё, скажем так. А второй, да, но в реальности, конечно, мы пишем какой-то вопрос по коду, например, как настроить security. Вот. И агент нам подсказывает, точнее, не агент, а чат, да, подсказывает. Второй вариант - это completion IDE, то есть по-прежнему много людей пишет в IDE и что, в принципе, мы, я думаю, это никуда не исчезнет, да, и такой базовый IDE и может быть даже не базовый, это всегда приятно и полезно. Люди это используют, правильно?

Да. 100% прям это это уже мастхэв сегодня или

Да, и уже, скажем так, следующий шаг, да, обычно к чему мы приходим или я думаю, что они полноценно войдут в нашу жизнь - это агенты. При этом сами агенты, то есть если там чат IDE там это более-менее там понятно, как делать, да, вот с агентами у людей есть разный опыт использования и давай его разделим немножко. Я разделю это по уровням. Есть, скажем так, нулевой уровень агентского программирования. Это когда вы запускаете агента, пишете в него задачу какую-то, например, сделай мне security вот такой вот, да, и потом агент начинает исполнять. При этом у вас огромный этот гэп между тем, что у вас в голове находится, да, между тем, что вы, скажем так, несёте то, что вы у себя в голове держите и хотели бы, чтобы агент сделал, да, но агент про это ничего не знает и пытается угадать.

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

Постоянно на собеседовании. Но прежде чем ты продолжишь, я бы хотел тебя поправить. Ты назвал программирование агентским, а оно агентное.

А, ну да, бывает, бывает. Я, скажем так, оговариваюсь. Вот, да, это буквально практически об этом, на самом деле, можно написать не одну статью, что такое планирование, потому что сейчас планирование, по большому счёту, выглядит практически как написание кода сначала в файлике. В основном это Markdown файлы, а потом следующий шаг - это попытка из этого Markdown файла перенести уже непосредственно в разработку. Ну, то есть по ваше приложение. Ну и следующий шаг, уровень два, да, можно назвать верификация. То есть, когда вы уже не просто просите агента заставить ему задачу, планируете задачу, потом оно её исполняет. Следующий шаг вы добавляете - это когда агент сам верифицирует себя. Это может быть как статической верификация, например, компилятор или линтер или ещё что-нибудь, да, чекстайл. Так и, э-э, скажем так, э-э, когда агент сам себя верифицирует с точки зрения именно первичного плана, то есть агент буквально сам себе ставит задачу: "Пройдись, пожалуйста, по плану, проанализируй, что у тебя в этом плане было написано, отметь галочками какие-то пункты". Ну, мы сегодня посмотрим на это, да, и, собственно говоря, верифицируй результат. Согласно этому пункту.

На самом деле сейчас есть те, кто пошли уже ещё дальше, да? Сейчас полноценно есть большое количество зарубежных компаний, которые уже применяют агентов везде, да? То есть везде применяют AI, да? Наверное, не всё из этого правильно назвать агентами, но, например, в Amazon присутствуют практики того, что код пишется агентом, полреквест создаётся агентом и проверяется агентом и исправляется агентом, и никакой человек не нужен. Вкалывают роботы, а не человек. Да, ну они недавно падали, скажем так, из-за этого подхода. Вот. И сейчас они всё-таки процесс верификации, там у их есть верификация номер два - это когда это делает человек. Собственно, ты правильно сказал, что перечислял вот эти всё делает агент, агент, агент. И вот у нас практически получается такое, что агент - это набор людей, набор ролей, команда такая, которая включает в себя и продакта, да. Ну, продакт - это, скорее всего, вы, которые ставите задачу, да, агенту. Потом BA приходит, её как-то наполняет содержимым. Потом хорошо бы посмотреть на результат работы бия, да? Потом они вместе с прожектом планируют, далее девелопер разрабатывают и QA это дело верифицирует. Какие преимущества вот такого, скажем так, цикла, да, когда вы, э, используете все эти роли, да, практически или такого полноценного цикла, это стабильное качество. То есть агенты, у агентов есть проблема, скажем так, с качеством, с тем, чтобы оно было именно стабильное, да, чтобы вы реже отказывались. Вот когда у вас такой подробный цикл, вы, скорее всего, придёте именно к тому качеству, которое вы ожидаете. То есть результат, скорее всего, будет тот, который вам нужен. Вероятность получить результат ожидаемый выше, собственно говоря, да, и вы можете постепенно увеличивать задачи. То есть вы можете ставить уже не просто "настроим не Basic Security", а вы можете сказать: "Давай настроим Security". Сразу пропишем это security для всех ростов там или какой способ у вас имеется, да, там и так далее. То есть расширять этот объём задачи. Мы сегодня тоже будем достаточно крупные задачи делать, но у этого есть и сложности. Я специально не сказал, не буду говорить, что это прямо недостатки, потому что в целом, если вы не переживаете за количество расходуемых токенов, если у вас бесконечные сессии, да, у вас бесконечное количество времени, вот то в целом вы можете на эти сложности как бы игнорировать их. Паш, ты обладаешь бесконечным количеством токенов и времени?

Точно нет. Я тебе даже скажу, что ты вот с ними сталкиваешься постоянно, и это превращается в замкнутый круг, и можно угодить в дурку, прямо можно попасть в палату, как я предугадал. Что у тебя на слайдах будет, да? Видишь, у нас получается это мы ходили в общую школу мемов, да, в одну, да, но при этом даже при таком большом цикле всё равно ситуации, когда агент реализовал не совсем то, что нам нужно, они всё равно случаются. Увы, от этого никуда не уйти.

Какие решения? То есть всё-таки мы как бы не первые, да, столкнулись с этими проблемами. Агенты уже сочно давно развиваются и решения уже какие-то придуманы. Ну, во-первых, это скилы. Да, то есть агентские, вы можете добавлять скилы своего агента. Есть даже такой open source, который, скажем так, прославился вот этим попыткой огромное количество скилов затянуть и огромное количество скилов написать. Не всегда там это хорошо получается, да, вызывает разные проблемы, но это решение, да, то есть использование скилов для решения задач - это правильный подход. Потом, model communication protocol - это function calling, так называемый, когда мы даём агенту разные ручки для того, чтобы можно было, например, вызвать там систему тикетов или откуда-то сходить за данными куда-то подтянуть, да, например, поискать в интернете что-то. А можно использовать референс.

Подожди, пожалуйста, чуть-чуть прервёмся. А это не совсем function calling, это его логическое эволюционное продолжение, наверное, правильнее сказать.

Прости, что перебил. Давай пойдём дальше.

Всё верно, всё верно. Всё верно. Потом референс документация. То есть мы можем насыщать агент документами от документации по фреймворку, да, и которая, например, по свежей версии там Spring Boot, например. Либо мы можем по нашим внутренним библиотечкам, стартерам тоже давать документацию, и агенты будут лучше их использовать. И использование памяти - это как раз ситуация, когда мы чего-то в процессе, например, работы с агентом что-то выясняем и говорим ему: "Запомни, пожалуйста, вот эту вот вещь". И он её запоминает. То есть раньше мы всё это писали в Agents MD или Code MD, да? А, а Code MD, то сейчас мы можем опять же пользоваться разными вариантами memory и пытаться её всячески видоизменить. Это как кэш, да? То есть такой кэш, который вот есть у агента.

Но, но если, Паш, ты попробуешь вот сейчас применить это решение и, так сказать, собрать себе суперагента, ты столкнёшься с проблемой выбора. Да, действительно, когда ты сталкиваешься просто с тем, чтобы загуглить себе нужные скилы, да, ты можешь их найти огромное количество, и не факт, что это работает также хорошо. А, наверное, все 900 плюс скилов скачать сложно. Вот.

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

Тебя арестует полиция скилов. Вот такие проблемы.

Возможно. Да, да, я вот как раз подсобрал статистику. То есть, если ты попробуешь скилы поискать, которые тебе нужно, да, ты столкнёшься, что, во-первых, скилов уже более миллиона практически, да, то есть, если 905 плюс 90, ну, я думаю, там, естественно, пересечение в большом количестве, но в целом это более 900.000 скилов. Аэ, далее, если ты захочешь подключить себе MCP какой-то, да, то ты тоже столкнёшься с тем, что вот на пульсе MCP - это агрегатор MCP серверов, там сейчас более 12.000 серверов. Рефересная документация в целом - это хороший приём, да. Единственное, а только тебе потребуется опять же сгрузить всю документацию Спринга, возможно, да, проиндексировать её, построить из неё там разные векторные представления и так далее, да, и этим, конечно, можно заняться, если у тебя есть желание и много времени. А, и кроме того, да, Agent Memory, вот я тоже подсобрал на Гитхабе более 13.000 реализаций, скажем так, репозиториев с реализациями Aged Memory придётся покорпеть, чтобы собрать себе тот, скажем так, уникальный набор, который вот ты бы хотел.

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

Да, верно. Это такой, скажем так, практически Ну да, всё верно. Единственное, она использовалась при обучении, да, то есть при обучении огромное количество документации использовалось. Поэтому агенты в целом неплохо пишут, как мы опять же, если вы пробовали, то вы уже знаете, что они неплохо пишут на спринге, да, совершают ошибки, но в целом аа достойно, да. А при этом, если, например, ты захочешь научить агент свежей версии спринга, то тебе придётся каким-то образом понять, о чём он уже знает, да, какие, например, знает ли агент, как версионировать API в спринге, в свежем.

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

Всё верно. При этом, смотри, если, например, ты хочешь научить агента версионированию, да, AI, то, а, по сути, у тебя есть как бы несколько опций. Ну, первая опция - это референсная документация, да, как-то построить для него, собрать. Второй способ - это как раз написать скил, да, и, аэ, чтобы перед тобой не стояла проблема выбора, мы как раз и вот собрали так называемые Spring Agent Tool Kit. То есть это как раз набор, который в себя включает и э-э скилы, и сабагентов, и MCP, и доступ к там, и так далее, и так далее. Как, собственно, здесь и написано, это костюм Железного человека для вашего агента.

100%. Захотелось. Очень.

Вернёмся немножко, а, вернёмся немножко к сложностям, да, это опять же, которые мы уже проговорили, напомним просто, да, это большой расход токенов, медленно работает, а, и результат с требованиями, которые мы перед ним поставили. Что же мы предлагаем для того, чтобы уменьшить расход, увеличить скорость, да, и приблизиться к результату? А, ну, во-первых, это интеграция IDE, да? То есть, э, у нас в ампликоде есть, э, функционал по доступу к дереву бинов, к структуре вашего Spring проекта, к информации о пропертях, которые где и как заданы, да, какое значение у проперти там, например, дефолтное или вы переопределили значение и так далее, и так далее. То есть всё это, да, а мы можем предоставить агенту и тем самым, а, решив две проблемы. На самом деле, первая проблема - это проблема знания. То есть теперь агент будет знать, э, собственно говоря, а что, э, что содержится и в каком виде у вас в приложении. А второе - это способ доступа к этой информации. Ведь а нельзя не говорить о том, что агент и без нашего тулинга может подчерпнуть всю эту информацию просто читая файлы. То есть он может бесконечно, ну, не то, что бесконечно, а, скажем так, пробежаться, прочитать весь проект, в конце концов, да, и построить себе и структуру бинов, и структуру приложения, да, может даже распаковать все ваши JAR-ы в dependencies и из этих JAR-ов собрать себе аэ исходные коды или декомпилировать всё, что там вот находится, да. Вопрос, сколько займёт это времени? То есть, э-э, добавляя, скажем так, интеграцию IDE, она у нас сделана через MCP, вы, по сути, даёте возможность вашему агенту прямого доступа к информации о Spring-приложении, о бинах, о пропертях и так далее, и так далее. По сути, всю информацию, которая которой владеет э ампликод, построенный поверх вашего Spring-приложения. Вроде я тут всё прямо перечислил, да? Единственное, запуск и отладка, да, это тоже даёт. То есть вы можете, например, с помощью опять же этого тулкита сказать агенту: "Подебажь, пожалуйста, мне вот этот кусочек кода". И агент сам запустит приложение в debug режиме, поставит нужные брейкпоинты, вызовет нужные экспрешены, да, в нужный момент, когда у тебя, например, ну, в точке останова прочитает эти значения и после этого проанализирует и по и сможет решить задачу, например, которую нельзя решить просто чтением кода, который, например, базируется на данных извне или данных внутри базы данных.

Это, кстати, очень классная штука. Я тебя перебил. Прости, пожалуйста. Это очень классная штука, что он делает это прямо в IDE, а не просто из консоли. То есть агент в консоли, но работает это всё у тебя в среде разработки. Это хорошо.

Это, кстати, это, кстати, даёт ещё такой прикольный опыт тем, что, например, ты можешь в любой момент агент остановить и сам продолжить эту работу. То есть, если вот, например, или, например, то есть, например, вы говорите агенту там, запусти приложение, да, в какой-то момент понимаете, что, например, Docker не поднят, да, а сейчас, например, ещё пока нет у нас интеграции с Docker, и агент, например, нет скила, который помогает агенту разрулить эту ситуацию, да, ну, в целом ситуация запуска, она почему-то для агентов сложная. Вы можете сами, например, даже запустить приложение, ну, запустить он может, например, Docker запустить, да, в базу данных в Docker, а потом сказать: "Продолжай". И агент уже сам запустит. То есть вы по сути как бы можете подсказывать ему в любой точке времени, в любой момент, в любой момент, когда он решает вашу задачу. Это такой прикольный опыт. И второе, да, из чего стоит агент ToolKit - это набор скилов, да, ну там ещё сабагенты будут в будущем, да, пока пока это только скилы, которые помогают агентам как раз делать некоторые вещи просто понятно и правильно и понимать, как это можно, как правильно использовать IDE и как правильно использовать те вещи, которые мы уже знаем о вашем приложении, да, это и Spring Explore, то есть он позволяет просто вы ставите задачу, он на основе этой задачи там достаточно многошаговый процесс, процесс, да, эксплоринга, и он позволяет даже быстро получить информацию о том, например, какие доменные сущности у вас есть в проекте, да, какую версию Spring вы используете, какую версию Spring Boot вы используете и так далее. Spring Data JPA, то есть вся вот эта вся экспертиза, которая есть внутри ампликода, относительно JPA, да, она частично уже перенесена в этот скилл, да, и в дальнейшем ещё будет перенесена.

Это >> то есть если вы, например, >> Нет, продолжи, а потом, прежде чем мы перейдём дальше, я задам тебе вопрос. Хорошо. А, Spring Security. А, Паша помогал, да. Вот, да. >> Вы можете, соответственно, тоже, если у вас есть какие-то вопросы по security, подключили скилл и, соответственно, решаете этот вам поможет проще написать вашу security конфигурацию и работать с ней. Работа с DTO, работа с маперами. Ну, там ещё другие скилы, я уж не буду их перечислять. Это, скажем так, я перечислил те, которые с которыми мы сталкиваемся достаточно часто. Кстати говоря, всё это подключается вот, скажем так, одним ударом. То есть вы ставите просто себе этот skillpack, и у вас всё это сразу будет работать.

Да, Паша, >> у нас, во-первых, появилась, получается, золотая кнопка. То есть не надо всё сразу, не надо много действий, можно одно и будет хорошо. Но ты сказал такой термин, как субагенты. Возможно, наши потенциальные слушатели и смотрители не совсем в курсе, что это такое. Может быть, стоит это дело прояснить?

А давай, а значит, вы в своём агенте, например, в Cloud Code, вот мы сегодня будем использовать Cloud Code или в CodeX, они почти все сейчас уже так или иначе поддерживают сабагентов. То есть вы буквально можете сказать Cloud Code: "Запусти себя ещё один раз, ну, форкни себя же, да, передать туда промт какой-то, и этот сабагент будет что-то делать, при этом не будет". Основная его особенность в том, что он не, во-первых, может работать в бэкграунде, да, параллельно с вашим с вашим основным контекстом. И второе - это то, что, э, вы, ээ, не загрязняете ваш основной контекст. То есть такая штука удобная, но мы сегодня будем им пользоваться как раз во время эксплора. Я покажу.

Отлично. Супер.

Угу. А если у вас в процессе появятся вопросы какие-то, вы столкнётесь с проблемами использования скилов или использования другого тулинга в рамках Spring Agent Tool Kit, то вы всегда можете написать нам в чат или в канал, даже, по-моему, там сейчас можно писать. Вот. И ещё, э, если вы опять же регистрировались не через ампликод бота, да, в Телеграме или если вы, например, нас смотрите в записи на какой-либо из площадок, очень рекомендуем пройти вот по первому QR-коду. зарегистрироваться в боте, потому что там будут появляться разные плюшки и всякие новости. Он будет рассказывать новости о том, что изменяется в этом тулките. Очень полезная штука. Ты уже подписался?

100%. Уже прямо везде я есть.

Прямо сейчас. Правильно сканируешь?

Контент, я уже отсканировал до я знал.

Ага. Ага, понял. Хорошо. Так, а, да, сразу показываем сегодня, >> да, сразу оговоримся, что мы сегодня будем работать над проектом Pet Clinic, да, это типичный Spring-овый сэмпл проект всегда, когда вы смотрите, не знаю, нашу демо, например, или, а, доклады Джоша Лонга, а он показывает прекрасное и доброе приложение с позитивными намерениями для лечения животных, да, Pet Clinic, да, как говорил доктор Айболит, лечитесь, животные. Вот.

Да, но мы, в отличие от демо, несмотря на то, что мы всегда пытались показывать демо именно с реальными какими-то проблемами, с решением реальных задач, да, а всё равно есть какой-то эффект демо, когда ты не можешь прямо полностью всё реализовать. Сегодня у нас агенты, поэтому мы будем прямо по-настоящему по полной реализовывать всё. Аа, ну что, переходим к демо, >> да, конечно. Но первое - это что мы сегодня будем делать, да? Давай разберёмся. Значит, мы попытаемся, у нас есть домашние животные, да, Pet Clinic, и у нас в Pet Clinic есть ветеринары. Давай глянем. А как раз вот у нас ветеринары, и мы будем сегодня для них, а делать рабочее расписание. А далее, а помимо рабочего расписания, мы будем ещё делать, а интеграцию с внешним сервисом по-настоящему именно производственного расписания, производственного календаря, да, чтобы наши работники не работали в праздничные дни. И третья задача - это у нас есть технологический стек по Pet Clinic, а именно здесь всегда отсутствовал REST, да, и мы его сегодня будем реализовывать.

Годится.

А, итак, а годится. Итак, а как, но прем, как как что-то делать, нужно поставить тебе тулки, правильно?

Да. Но договоримся, что агенты у нас уже стоят. Это сегодня базовый минимум, >> да? Это мы в самом начале. В самом начале, да. То есть мы в самом начале сказали, как поставить. Не будем к этому возвращаться. Как установить? Ну, с флешки можно поставить.

Ура! В дни трудного интернета флешка - это наш спаситель.

100%. Но в реальности ставим агента первым, да, шагом. А, шагом номер два ставим себе ампликод. Как его поставить? Давайте покажу. Значит, а тут мне придётся так-то выйти в браузер. Заходим на сайт ампликода. Да, да, давай я перейду на главное. Нажимаем скачать. И вот тут прямо буквально у нас пошаговая инструкция, как себе поставить ампликод в то есть. Но если у вас Open IDE, то Code в ней уже присутствует, поэтому, в принципе, этот шаг можно пропустить будет. Так. А следующим шагом нужно поставить, а, сконфигурировать MCP. Да, давайте я покажу, как это сделать. Опана, смотрите, свернулся. Так, а запускаем настройки, находим вот здесь стоим CP и а галочка ставим здесь галочку, если она не стоит, да, и нажимаем кнопочку автоконфигуры. После этого делать больше ничего не надо. У вас автоматически в вашем агенте, который вы используете, появится конфигурация MCP.

Прежде чем ты подожди, для тех, у кого только русская раскладка на компьютере, это мягкий знак СЗ.

Да. А, кстати, у меня выключен почему-то. Давай включим сейчас assistant он называется, да? Presentation. Я его выключаю, когда Ну-ка. Мм, так. О, всё, теперь будут показываться шоткаты. А, и последнее - это нужно поставить скилы. Значит, для этого открываем репозиторий Spring Skills. Ссылочки мы, наверное, приложим опять же в описании или к ролику, или в процессе. А, и, э, здесь ну-ка, подожди, обновлю. Да, была не обновлённая страница. Э, добавляете сначала Marketplace, прямо буквально вот запускаете Cloud IDE. Cloud Code. И, э, давайте я запущу. Я буду запускать в Dangerous Skip Permission режиме. А его ещё иногда называют YOL.

You live only once, как будто мы играем на все деньги, >> да? А, и а далее прямо вот сюда вставляете добавить сначала маркетплейс, да? А потом вставляете, устанавливаете сам плагин. При этом апдейты работают, да, и там даже можно включить автоапдейт. Вот здесь есть подробная инструкция, как, собственно говоря, этот автоапдейт включить. Так, вроде бы про установку я всё рассказал. А предлагаю непосредственно приступать к решению задач.

Да, давай.

Угу. Значит, сейчас, секунду, я Да, приступаем к решению задачи. Значит, я уже заранее подготовил некоторое описание задач, да, вот у меня прямо здесь есть подробные. А давай разберёмся, что, собственно, они делают, да? А мы первое - это рабочее расписание ветеранов. Надо сделать, да? И вот здесь как раз нам BA аналитик подготовил, ищем, в котором как раз написано, что администратор клиники должен уметь управлять рабочим расписанием ветеринаров, да, при этом а чтобы знать, когда ветеринар доступен для приёма или недоступен. Далее, а, слушай, мне кажется, мы что-то делаем неправильно.

Почему? Мы же обсуждаем сразу задачи.

Нам их так поставил наш технический руководитель. Да, но мне, смотри, мы читаем, а никто не работает. Должен же кто-то работать уже, правильно?

А, ну да, я думаю, что да, кто-то, но не мы.

А, да, значит, у нас есть агент, и мы должны сразу запустить сделать эту задачу. Но мы уже говорили, что просто написать: "Сделай, пожалуйста, задачу" будет не совсем правильно, потому что эта задача соверша большая, объёмная, и нам нужно пройти этот этап планирование, да? А есть несколько способов как делать планирование с помощью агента. Вариант номер один - это поставить в cloud код, например, режим планирования, да? Но проблема этого режима в том, что агент ничего не знает про Спринг, да, и он как бы находится вот в таком вакууме. Ну такой, надо сначала понять, что это за приложение, да, попытаться изучить, поразобраться, какие модели там это, то есть такой процесс хаотичный, то есть никак не организованный, и агент будет пытаться в разных направлениях изучать проект, и не факт, что даже дойдёт до нужных составляющих. А есть разные скилы планирования. И вот мы как раз тоже подготовили свой скилл планирования, да, который позволит нам, а, именно, а, осущать планирование, решение задачи, скажем так, в таком спринг-режиме, да? То есть там и изучение проекта будет спринговое там и так далее, и так далее.

Давай я покажу, как это сделать. Я уже опять же подключил а-а подключил tool kit, да, и у меня вот здесь есть Spring Planing. Выбираем Spring Planing, да, и говорим: "Создай план". Создай план для реализации и указываем название тикета. В данном случае 01. Так. Угу. И отправляем его, собственно говоря, решать задачу. И теперь, пока агент её решает, да, мы можем почитать. Вот тут, кстати, обрати внимание, что как раз, да, у нас агент не агент, а скилл, который занимается планированием, подключил другой скилл, который занимается эксплорингом, то есть анализом проекта. И мы видим, что здесь есть несколько этапов. Давай я подробнее немножко про него расскажу. А тут у нас немножечко поломалось вDE терминала. Обратите внимание, бывает такое, но ничего. В целом, э работа с терминалом выдаёт очень приятно.

А, итак, аэ, тут смотрите, что произошло, да? Шаг номер один в этом случае. мы какие-то ассампшены, то есть у нас агент такой какие на основе текущего контекста предположил, а что нам может понадобиться для решения этой задачи. То есть прочитал задачу и такой: "Ну, скорее всего, понадобится ветеринары, расписание и так далее". Дальше у него есть возможности такой план исследования, по какому он может двигаться, да? А после этого он определяет, собственно, документация, которая нужна ему, потому что там она многоуровневая, потому что скилы должны многоуровне, ну, раскрываться постепенно, чтобы не за, а, не портить ваш контекст, да. И, а, далее определяется набор функций, и уже в сабагенте он начинает исполнять это. При этом, смотрите, э всё это у нас на самом деле очень быстро завершилось. Сегодня как-то агенты супер супершустрые. Во-первых, за 35 секунд, а, во-вторых, всего 18.000 токенов потрачено. То есть, если вы когда-нибудь запускали Explorer Subгент внутри cloudдкода, я думаю, вы вряд ли видели результат меньше 40.000 токенов. То есть вот мы прямо буквально сейчас с вами наблюдаем, как мы сократили в два раза потребление на этапе анализа приложения. Это две вещи. Во-первых, это целенаправленно, да, не хаотичное исследования. А второе - это использование структурированных тулов, которые мы берём из де, да, в которых прямо нет ничего лишнего, только то, что нужно агенту для понимания этой задачи.

Так, пока. О, смотри, у нас уже агент спрашивает, что мы хотим. А мы хотим всё делать, только БК или только MVP? Что мы хотим?

Мы хотим, наверное, всё. Там написано рекомендовано. Я на это соглашаюсь обычно.

Да? А выбираем. И пока агент у нас работает, мы что с тобой? Мы давай почитаем всё-таки, что нам нужно сделать. Смотри, опять вопрос. Так, какой компонент э должен быть задействован? Какие?

Так, но мы хотим, что обновить доменную модель, правильно?

Да. А потому что мы, смотри, я я-то знаю, что мы надо что надо сделать, да? А по нашим зрителям мы ещё не рассказали, но у нас уже вопросы задают. А что, посмотрим? Задачу всё-таки или поотвечам на вопросы?

Да, давай сначала прочитаем, потому что, во-первых, у тебя очень хорошее описание задачи. Вот. А тебе повезло, а это пример, как это надо делать. А, во-вторых, действительно, неплохо бы, неплохо бы погрузить аудиторию в контекст задачи, но ты сказал, что у тебя произошёл некоторый эффект с терминалом. А в какой иде самый приятный терминал? Я вот знаю в какой

самый приятный терминал внед.

Какой? Ну а да, ну е вне, вне, вовне открыть какой-нибудь Нет, самый приятный терминал

в Open de в

Open. De Хорошо, хорошо. Аа ну хорошо. Так, значит, ну давай пока мы не будем тогда отвечать на вопросы, а посмотрим содержание задачи всё-таки, а то видишь, получается, что мы с тобой ещё содержание изучили, а агент уже нас спрашивает: "А как мы хотим её реализовывать?"

Да.

Да. А итак, значит, вернёмся. Значит, что нам надо? Что нам надо? Администратор хочет брать рабочее расписание ветеринарам. Да, чтобы знать, когда недоступно. А значит, сейчас в системе нет рабочего графика, да, и администратор не может его определять, какие дни часы конкретно ветеринар принимает пациентов. Это приводит к тому, что записи на приём создаются без учёта реального графика работы. Проблема реальная, правильно?

Ужасно. Так, аа значит, кстати, давай расскажем ещё немножко потелям нашим смотрящим, да, а-а, постлям нашего стрима, скажем так, как такое вообще получить описание, да, на самом деле я, а-э, поставил первичную задачу, да, то есть сформулировал, скажем так, в пяти там четырёх предложениях э я бы даже сказал, её наговорил. Ты, кстати, знаешь, что в Клаудкоде теперь доступен режим аудио, то есть ты можешь прямо наговорить ему о своей проблеме, пожаловаться о проблеме.

Я нет, но я бы не ходил к психиатру, если бы он знал.

Вот. Но насчёт психиатра не уверен, но вот задача таким образом очень удобно заводить. Значит, я ему рассказал о проблеме, которая есть в приложении, он её сформулировал и потом сформулировал мне первичное представление. Да, я ему причём сказал, что, пожалуй, сформулирую это как бизнес-аналитик, чтобы у меня не было технических деталей. А и вот он мне придал дал представление какое-то, какой-то свой вариант, а потом я его уже постепенно дорабатывал. То есть первичный вариант меня не устроил, я его потом дорабатывал, чтобы это было что-то совсем напоминающее реальная задача. Значит, у нас, смотри, ещё помимо того, что у нас есть несколько расписаний, то есть расписание может быть основное рабочее, да, а может быть, например, дежурство, то есть они хранятся отдельно. Кроме того, у нас есть, э, расписание рабочее, да, в которое помечено как для записи. То есть если А что это значит? Это значит, что когда мы создаём визит и у нас отсутствует, э, в расписании для записи, то есть, скорее всего, это основное расписание, отсутствует доступное, ну, отсутствует рабочее время, да, то мы не можем создать такой визит.

Угу.

Тут уже пошли элементы расписания, да? То есть у нас должно быть время начало, время окончания. Ну, это естественно. А мы можем несколько элементов создавать в одном расписании на один день. То есть условно вот это как раз пример приводится. С 9:00 до часа у нас работает ветеринар и с 2: до 6:00, то есть стандартный рабочий день. Далее, а-а, валидация не допускается перечение элементов по времени, что логично, да? А перечением считается, ну, тут уже детали. Аа так, а перечем считается существующей системе должно так отнить запрос информации. А, ну да, то есть если у нас пересечение, то мы должны информацию об ошибке дать.

Да.

Теперь к визиту. У нас в визите должно быть время начало, время окончания. Оно сейчас, кстати, отсутствует. Давайте покажем это. То есть мы вот, если визит откроем, то мы увидим, да, что у нас отсутствует отсутствуют поля, связанные со временем. Надо будет их добавить в рамках этой задачи. И, а-а, ну, тут то, что одно должно быть позже другого, естественно. И при добавлении визита мы должны проверять для записи расписание рабочее, да, и при этом должны а убедиться, что нет других визитов на это время.

Выглядит пока очень валидно. Ты, кстати, сказал, что можно голосом наговорить. А я бы очень хотел, чтобы можно было записывать Клоду кружочки.

И он первым сообщением не брал не брался за работу, а пытался бы тебя отговорить. Возможно, мы бы тогда отказались от многих дурных идей.

Возможно, кстати, да. Ну, кружочки - это интересно. Представляешь, те кружочки начнут отвечать.

Было бы очень хорошо.

Кого бы ты хотел видеть в качестве клаудагента?

Тебя. Там, кстати, есть бадики, ты видел? Там бади завезли. То есть можно теперь бадика себе создать, и он тебе мог бы записывать видосики. Дальше тут у нас идут поиски сценарий, но мы не будем их в них углубляться. Описание модели данных, да? А в данном случае опять же это описание уровня бизнесатика. То есть бизнес-аналитика указывает просто, что должно быть именно в модели сохраняться в каком-то виде, да? А и ограничения и допущения. Ну, тут это просто информация, которая очевидная. Вернёмся. Теперь задача стала стала ясной, да? То есть у нас есть, ещё раз ветеринары, нам нужно для них рабочее расписание. Естественно, там не должно быть пересечений. Мы можем создавать несколько на один день для того, чтобы обеспечить, например, обед нашему ветеринару, да? И надо модифицировать ещё визиты, потому что в них сейчас нету времени, да? А и нужно при создании визита, чтобы у нас проверялась коллизия и наличие рабочего писания,

да? Вроде не слишком сложно, не слишком много, правильно?

Подожди, давай, давай, прежде чем мы перейдём, ещё раз на этом сакцентируемся. Хорошее описание задачи получить несложно. Ты всё из этого сгенерировал,

Ну и нет, первично первичную обстановку я всё-таки сам сделал, да? Потом мы ещё дорабатывали, но в целом, да, это почти в основном работа, в большей части работа агента, да. То есть самое главное - это валидировать и, ну, проверять что-то действительно то, что вам надо, да, и тогда всё будет у вас хорошо.

Угу.

Поэтому так мы сейчас выполнили небольшую роль, а, получается, бизнес-аналитика,

да?

А, то есть fullк developлопер обретает новое прочтение.

Просто в ново новыми красками заиграл,

да. Значит, теперь нам стало понятно, что, собственно, от нас хочет э наш агент, когда спрашивает вопросы. Это, кстати, одно из преимуществ именно планирования и нашего скила, да, то, что мы, а, после того, как мы проанализировали ваш проект, сделали, да, анализ, очень часто, кстати, в таких скилах планирования написано сделать типа анализ, типа прочитай не более трёх файлов, а сделай там не более двух предположений. Это именно связано с тем, что скилы, а, которые работают чисто с файловый, ну, с файлами, им гораздо сложнее найти нужную информацию. В нашем случае вот мы за по сути то же самое время, когда это, например, режим планирования был бы или мы взяли чужой скилл с обычными тулами, тулами, да, которые на доступ агенту, мы бы мы за это время по сути сделали глубокий анализ, а из-за того, что у нас есть тулы из де, да, из ампликода. А если бы мы взяли бы обычные тулы, мы бы не смогли бы сделать такой глубокий анализ за это же время, за те же самые 20 секунд.

Да.

Угу. А давай, что мы хотим? Но мы хотим, да, мы хотим, что мы хотим доменную модель обновить. Да. Миграции нам нужны, естественно. Да. Да. Месты MVC контроллеры я предлагаю не менять.

Мы, наверное, мы, наверное, сгенерируем,

Да, да, я предлагаю ст валидация логики. Так, э, это мы хотим, да? А вот смотри, у нас ещё есть опция написать, что мы хотим дополнительно, да? Я ему сейчас скажу: а-а, сделай рест, сделай, а, необходимый ст, а, с учётом. И вот у нас тут как раз есть задача ещё одна. Я же говорю, у нас есть техдолг с описанием того, какой крут нам нужен. Давай тоже глянем, чтобы не получилось так, что аа опять пользователи, мы у нас что-то программируется, а пользователи не знают, что происходит. То есть с зрители не знают, что происходит. А почему-то я их посте называю, не знаю. Значит, технический технический техлит техдлит написал нам задачу. Давайте тебе полистаю просто, чтобы ты понял, насколько у нас продвинуты техлит, да? То есть смотри, всё описано, всё описано. Все рентпоинты, в каком виде они, каким урлам должны находиться, что должны делать. Всё написано. Как получить такое описание?

А его надо сгенерировать

Именно. То есть мы просим агента создать такое описание. А, первично, естественно, давая какие-то, скажем так, на что ему опереться и проверяя, что именно, что он описывает. Значит, как разработчик я хочу иметь полноценный рест аа для управления основными сущностями системы, чтобы клиентское приложение могли взаимодействовать с данными через стандартный hpп метод hтp метода. Мы, кстати, делаем этот рест отчасти и для нашего будущего юая, который будет на реакте.

Угу. Возможно, это будет один из следующих стримов, кстати. А значит, что у нас технически, какой технический контекст? У нас есть MVC-контроллеры. То есть вот смотри, он буквально, когда я тоже интересно, смотри, из-за того, что я это делал в агенте, который находится в он использовал Spring Explore Skill сам, причём я его даже не просил, как вот, например, мы сейчас пнинг запускали, он сам используел Сpring Explore, получил информацию из дерева, вот из этого дерева полностью всю, буквально за один вызов, да, а может быть за два. И на основе этого вот он знает, что у нас есть MVC контроллеры, да, что они возвращают HTML, что у нас есть всего один поитстовый. Вот смотри, да? То есть он мы по сути дали агенту, то есть то, что раньше ампликод давал человеку, именно вот этот контекст, да, а теперь э мы даём эту информацию агенту. То есть то, что раньше нужно было подчерпнуть, чтобы можно было заглянуть вкод Explore или же пойти ресерчить кучу файлов. Да, сейчас то же самое по сути мы и этим самым мы экономим и токены, и ваше время. Кучу полезных вещей делаем.

Так, ну давай, да. Значит, крудрестапе мы хотим, да,

давай дочитаем, да, и вернёмся к программирозму,

да. Значит, да, у нас вотпоинты возвращают джисон, это понятное дело. Хотим дтошки, хотим дтошки.

Очень хотим. Нельзя экспозить снаружу. Это как человек секрити связаный, говорю, да? А, всё, мабстрак. Мастрак дальше у нас, да, апоинты должны располагаться по сшест. Значит, и мы, смотри, все сущности, которые у нас будут возвращаться, например, кстати говоря, смотри, у нас вот, например, у владельца есть ведь домашние животные, и это коллекция,

да?

То есть талист домашних животных. Аа, соответственно, мы будем их возвращать в расте в виде фл в флэтвиде.

Угу. А далее у нас тут описание рыстов. То есть мы тут, кстати, видим, что модель DDD, которая внутри петлиники заложена, она тоже соблюдена. И тем самым у нас домашние животные, они внутри владельца, да, визиты внутри домашних животных. То есть, в принципе, всё хорошо. Так, далее. Описание. Тут у нас ограничение, что нельзя трогать существующие VC-контроллеры, то, что нам надо, да? А это существующий getвет остаётся как остаётся? и погинацию для спрашивах элементов опционально на усмотрение как бы разработчика, то есть на наше усмотрение. Тут, кстати, я знаю, у тебя, возможно, возник один вопрос, а возможно, не возник, кстати говоря, я знаю, что ты любишь, когда между репозиторием и контроллером есть сервис.

Сервисный слой. Да, да,

И вот тут, кстати, нам Техлит не указал, что нужен сервисный слой.

Но нам точно надо это сделать, описать

Да, мы можем его, да, описать. Значит, ну давай смотри, у нас тут были вопросы про то, что как мы хотим, что мы хотим реализовать, да? Нас агент спрашивал, и поэтому пошли, собственно говоря, читать. Мы написали ему, что сделаем необходимый рест с учётом файла, укажем сейчас, да, с учётом правил правил в файле и отрагета как бы дальше работать. А раз уж мы к этой задаче пришли, да, чтобы не сидеть без дела, мы что сделаем? Мы запустим параллельно. Мы не будем играть в телефон.

Не, мы не будем играть.

Хорошо. Извини, извини, Паша. Да, мы запустим параллельно ээ и, собственно говоря, делать второй вторую задачу. Значит, для этого что? Открываем соседний терминальчик, да, и а в сом терминальчике запускаем также клод. Так. А давай. Угу. Так, и здесь скажем ему тоже: "Планируй исполняй задачи 003". Правильно? Надо было бы делать так.

Да, но но мы не будем так делать.

Почему? А потому что в в skillпак, который про который он как раз рассказывал, да, в Spring Skill Paack входит э такой скил, который называется

Нет, котроллерски.

А, всё о'кей. Да, и он уже внутри себя узнает, как надо писать круды. То есть там, скажем так, практически зашит внутрь него некоторый план о том, как нужно писать скилы именно ой, как нужно именно разрабатывать реконтроллеры и, в частности, крудрес-контроллеры. Поэтому как вообще как как его вызвать, если мы вот не хотим планирование, а хотим сразу конкретный скил, да? Опять же для этого ставим слшик и пишем R controller. Нажимаем Tab и говорим: "Реализуй". реализуй согласно задачи и указываем на задачу нашу. Ну всё, запускаем. Пока наш агент теперь реализует нам крут, мы вернёмся к первичной задаче, которую самое начально, ну, хотели делать, да, самая первой, который мы делаем.

Так, а хотим ли мы какие-то констренты и ограничения следовать существующему паттерну? А, base entity. Так. с с compaтибиity, кстати говоря, когда я, естественно, я проходил несколько раз уже этот сценарий, ну, эти задачи делал, да, естественно, а вот и в процессе тестирования скилов, и в целом. И всегда разные, всегда разные вопросы, всегда разные. Всегда агент хочет удать мне что-то новое для меня. Внезапно вот он спрашивает, хочу ли я компетибить, не хочу. Ну давай существующий паттерном будем следовать.

Он тебя изучает. Это, кстати, зависит не только от это зависит от времени суток, да, проснулась ли Америка или не проснулась. Вот э бывает модель внезапно начинает работать хуже или лучше. Не знаю, что происходит в антропике. Итак, спрашивает про тестирование. А мы чем будем тестировать наши росты?

Мы будем пользоваться HTTP клиентом коннект из ампликода. Я считаю, этот способ.

Да, будем коннектом. Точно. Давай этим воспользуемся. Мы же должны как как настоящие разработчики делать. Мы написали и пошли потыкали руками. Ну только не руками, а скрип ВД скриптами.

Да. Но, кстати, смотри, а во-первых, опять же, в этот скилпак входит connect skill, да, который умеет писать конект сскрипты. Хорошо. А второе, э, агенту мы уже вот на самом деле научили запускать конек скрипты самостоятельно. То есть я смогу сейчас агенту, например, сказать: "Тестируй с помощью конект". Да, и он сам напишет скрипты, сам их запустит и убедится, что всё работает.

Илья, никому больше не показывай, пожалуйста, то, что ты сейчас делаешь, меня уволит.

Так, а ну кто-то же должен ему вот отвечать на вопросы и давать задачи, правильно? Ты у ты уже это делаешь. Кстати, смотри, получается, я сейчас, э, э, как бы на меня работает два агента уже, правильно? То есть у меня один агент делает достаточно задачу, которая заранее была, скажем так, спланирована в скиле, да? То есть всё в скиле уже реализовано. А второй агент вот как раз делает такую уникальную задачу.

Так, мы хотим О, кстати говоря, смотри, он уже А, ну да, мы же ему указали, где прочитать надо. И вот он прочитал, спрашивает, как нам расписание а хранить, и мы его будем хранить внутри ветеринара, потому что ветеринар, расписание ветеринара, оно как бы бессмысленно.

Угу. Будем следовать как бы текущей логики именно модели и ростовов, которые вот нам задал наш техд и уже в приложении была. Так, ну всё, два агента работают, можно что

поиграть телефон.

Ну практически, да. Можно, на самом деле, подождать немножко и, э, пока, например, у нас первый план будет готов, потому что я вижу, что уже вот он практически вот он говорит там, что я имею все, у меня есть все ответы, да, э, давай я проверю текущие планы и создам твой план, да, то, что нам, собственно говоря, и надо. Вот. Либо пока вот данное, но это, я думаю, сейчас не прямо сразу быстро завершится. Мы, кстати, уже можем что-то посмотреть, можем даже превьюить код, вместо того, чтобы играть. Конечно. Ну нет, я я как зумер стараюсь мыслить, когда у меня на экране много всего мелькает, а я отвлекаюсь.

Ага. А ну смотри, давай глянем, что у нас агент уже сделал, да? Я не буду полностью закрывать терминалы, чтобы нам не проморгать время, когда так-то свернём их. Нужно, короче, режим какой-то вde, когда она будет тебе подсказывать, что надо отлично на агент. Есть, кстати, я видел недавно такую штучку прикольную, ставится на стол такой на пружинке, и когда он это агент что-то завершил и нужна нужна твоя реакция, а он начинает там это пищать или двигаться как-то.

Блин, это А, кстати,

ну давай. Ясно, тогда буду смотреть, кстати, а не ты.

Хорошо. У кого, кстати, больше.

Да. А ты не не хочешь, да, договорить, что-то хочу, хочу просто ээ на тебя работают два агента. Можем ли мы тебя назвать техледом будущего?

А м может быть и да, кстати. Возможно, да. Постараюсь больше не говорить слова, кстати. А так смотри по Роси тут что-то подробное про колонки. Хотим ли мы какие-то сверхподробные вещи? Он меня спрашивают уже. А, ну давай скажем всегда, пускай будет. А он, наверное, загрузил скил GPA skill и в результате не смог обнаружить некоторые, да, не смог обнаружить некоторые паттерны в нашем текущем приложении. Он, точнее, точнее надо сказать, что он тут надо пояснение. Значит, смотрите, мы же не можем, когда разрабатываем с агентом, мы не знаем, какие скилы он вообще загрузит, да? Мы не можем этим управлять. Какие-то вещи мы действительно можем скорректировать. Вот, например, я вижу, что у нас шесть конконтроллеры уже завершились, и там достаточно чёткий план, но в ситуации, когда мы просто планируем произвольную задачу, не всегда можно ограничить, да, и поэтому мы стараемся в тех местах, где лучше не указывать жёсткие ограничения для агента, мы оставляем их такими более-менее свободными. И вот сейчас агент, зная, что у нас там GPA используется, да, он решил загрузить GPA skill. И, э, GP skill написан так, что вместо того, чтобы всегда нас в нашем проекте делать разные бестпрактисы, он собирает информацию о текущем проекте, да, собирает ограничения, которые имеются в данном проекте, и, а, для себя их фиксирует. То есть вот он, например, выяснил, давай посмотрим, что у нас используется в качестве стратегии, да? Кроме того, он, например, выяснил, как мы используем фечтайпы. Но вот ему не хватило конфиденса, он, видишь, оценивает, насколько он уверен, что эту стратегию нужно продолжать использовать. И по этой причине он нас там прямо в скеле написано, что если ты в чём-то не уверен, да, спроси один раз пользователя для того, чтобы эту информацию собрать от пользователя. Аа и в данном случае вот как раз у нас там немин стратегия был вопрос, да, потому что, видимо, не во всех сущностях у нас указывается собачка колом. И второе - это typй. А давай указым лези по умолчанию, чтобы использовал. Там тоже, видимо, есть какие-то у него, э, сложности с этим возникли.

Так, ну, пока у нас здесь работает, э, мы вернёмся опять же, чтобы не играть в игрушки, да, кстати говоря, а пока он делал рест, э, он запустил сборку нашего проекта, да, и вот мы видели, э, что в активировалась функция Run. Она обычно находится вот здесь слева, но я её перенёс, чтобы она нас не отвлекала от работы с агентами. И он убедился, что действительно сборка собирается. Но здесь форматирование чисто чисто форматирование не работает. Это надо просто запустить точнее упало форматирование и нужно просто запустить таску по форматированию в Авине. На самом деле можно было бы агенту этому даже научить. Тем временем тем временем мы смотри ещё коду не успеваем уйти. Я всё рассказываю, рассказываю, рассказываю. В игрушки мы не играем. Вот. И при этом агент завершил планирование, спрашивает, хотим ли мы сразу привести приступить

к реализации или мы хотим посмотреть план. Сделать, так сказать, интерактивное ревью. Конечно, нужно посмотреть план, потому что от этого очень много зависит. Говорим именно, что хотим посмотреть план. А здесь мы давай пока закомитим реализацию, потому что чтобы потом её было удобнее поправить, закомить. А реализацию её бы, конечно бы, перед коммитом стоило бы посмотреть.

Так, реализация. Но так как у нас несколько агентов, а есть два способа, да, так как у нас одновременно два агента работают, у нас есть первый способ - это использовать Gitwork 3, например, но мы его пока не будем использовать, э, потому что, скажем так, он недавно его люди активно начали использовать. Вот. И возможно, вы, кстати, это ещё Паш, ты работал с Gitwork 3? Да, приходилось. Угу. А, ну вот я ещё не работал, поэтому я пока всё делаю, скажем так, в одном, а, в одном наборе, в одном ченсете. Вот. А, и из-за того, что у нас два агента, как раз нам просто проще будет посмотреть, что у нас уже он реализовал, да, когда мы запустим новую реализацию. Давай посмотрим план. Давай.

Мм, так. А что у нас в плане? Ну, тут базовая обстановка. Давай я его открою прямо в редакторе. А-а, так. Давай вот так. У нас базовая постановка, да? То есть что мы хотим сделать? А-а, а так в текущие ветеринары нужно интегрировать наше расписание, да, и визит поправить. Угу. Далее, а это контекст, который он собрал. А тут мы видим, какие конвеншены. Мы, кстати, я уже про них рассказывал, и тут мы видим, что у нас использует Identity, но Identity не очень хорошая идея использовать. И, наверное, мы можем в будущих сущности, которые вот сейчас будем создавать, уже не использовать Identity, хотя бы. Да. Да, давайте попросим агента это исправить. И прямо здесь мы от опять же ничего руками не правим, открываем агента и говорим: "А-а, поправь так, исправь план вместо Identity. Используй Sequence". А так почему хорошо это делать именно в агенте, а не руками? Потому что это позволяет тебе играть в телефон как минимум. Да. Ну, ты можешь продолжать смотреть план, да? А второе, почему это хорошо делать в агенте, потому что агенты в своих вот циклах они пытаются консистентность соблюдать. То есть если, например, ниже по документу у нас где-то уже написано Identity, то агент поправит и здесь, и ниже по документу. И это очень удобно. Это иногда бывает дольше, чем поправить руками, но зато у вас всегда консистентность. Я всё из этого знал, просто тебя проверял. Понял.

Так, а значит, э далее, что у нас? Тестирование с помощью коннекта, какие-то критические апчи. Ну, это скорее, чтобы план исполнялся корректно, да? То есть они, а, нас именно как, э, разработчиков не особо интересуют. А далее те, стратегия тестирования. Как мы будем тестировать? То, что файл нужно создать, это всё хорошо. Так, solution, значит, у нас будет сущность Vet и VetScheduleEntry. Дальше он хочет модифицировать визит, добавить туда StartTime, и ветеринара, потому что сейчас ветеринара нет внутри визита. Далее хочет создать REST. Кстати говоря, странно, ведь REST-то у нас уже создан, правильно? Да. И на тему старта. А нет, смотри, нет, подожди. Нет, здесь тот как раз REST хочет создать для расписания, поэтому всё нормально. Он, кстати, получается, подхватил, да? То есть он Да, он, смотри, оказывается в процессе. Он успел зачитать свежие данные и подхватил реализацию первого вот этого второго агента, которым мы делали REST. Значит, что у нас он для расписания создаст, да? Там по подожди, пожалуйста, там, а, в визите уже была какая-то дата, он добавит отдельно старт и endtime, да? Да, да, там была просто дата. Да, мы можем посмотреть. Давай посмотрим. Вернёмся снова. Аэ, так под вот так вот. Да, вот у нас вот по сути дата была и description, то есть у нас не было ни ветеринара, ни старта, ни времени начала, ни времени окончания визита. То есть это просто дата, на которую ты записан. Вот. Да, да, да, да. Аа, да. Значит, начало окончания ветеринар. А будет добавлен endpoint. Отлично. Для для создания и модификации, да. Booking flag будет добавлен, а-а, да, для валидации и миграция будет написана. то, что мы ожидаем. Значит, далее внутри, э-э расписания у нас будет ID, ссылка на ветеринара, название и флаг, что это для для букинга, да, для записи. А внутри записи именно конкретного времени будет ID, понятное дело, дата, начало, дата, когда это, да, рабочее расписание, начало и окончание. Тут уже технические детали пошли. Сам REST в целом меня всё устраивает, насколько я вижу. и говорит, что нужно вот здесь вот валидацию добавить. Угу. То есть, да, получается, смотри, он успел как бы повторно зачитать, пока пока второй агент работал, первым агентом он успел зачитать вот именно свежие данные, что, кстати, не всегда мне удавалось в моих предыдущих проходах иногда ему нужно было, например, сказать, что, пожалуйста, зачитай свежие данные. А тут правила, это сущности, которые будут реализованы. Угу. Всё тут нормально. Ну и дальше пошли саги имплементации. Можно, на самом деле, детально посмотреть, но редко. Я уже в предыдущих шагах я знаю, что он достаточно редко ошибается. Вот поэтому я думаю, что можно запустить реализацию. Ну-ка давай ещё раз на сущности посмотрим на наши. Так, абстракт. Так, так, так, тактак. Да, ну здесь не указывают вам подробности, поэтому давай приступать к реализации. Смотри, какой подробный план написал. Это, кстати, очень интересно. То есть вот ты, я всегда задаюсь себе вопросом, я даже думал написать какую-то статистку по этому поводу, что а когда ты начинаешь работать в реальной команде, да, ты, Паш, какие вопросы вообще обсуждаешь? Вот ты, например, тебе поставили задачу, да, ты когда с тех додом работаешь, ты обсуждаешь, а будет ли у тебя а-а поле называться вот давай какой-нибудь, что вот маппер будет компонент model string. Нет, это эти вещи обычно как бы отдаются на откуп разработчику. Ожидается, что ты как бы понимаешь, да, что так нужно делать. Вот. Но вот агенты они, видишь, а в большинстве случаев, это, кстати, у меня ещё там в планировании есть специальное ограничение, что давай я запущу и расскажу, да, как запустить реализацию. Мы делаем cleaner, а я всегда запускаю в свежем контексте. Можно, на самом деле, и в текущем контексте, потому что мы сейчас очень мало потратили токенов текущем контексте, но я уже себя приучил, что всегда запускаю реализацию в свежем контексте. Это, кстати, полезно. И знаешь, ещё из-за чего? Из-за того, что, например, если у тебя план немножко устарел, то ты в свежем контексте, скорее всего, агент захочет заново освежить свои знания, да, да, и подтянет и не будет делать ошибки, просто меньше ошибок будет делать. Поэтому мы здесь буквально говорим, кстати, ну, интересно, что он сам маркирует для себя особо критичными вещи, которые и на самом деле довольно критичны, если мы пролистаем наверх. Вот. Это не он. Это так в плане написано. Да? То есть это в нашем как раз в нашем скиле, да, это ой в плане говорю, в нашем скиле написано, чтобы вот он таким образом делал. То есть это именно вот наш скилл заставляет агента делать вот такие-то вещи, чтобы он отмечал там и так далее, и так далее. Это очень круто.

Так, э, всё запустили, значит. Да, и как раз в нашем скиле написано, что не делать сверхподробной и только важные вещи. Но вот, видимо, агент решил, что маппер component model string - это важно. Это важно. Поэтому надо не упустить. В плане обязательно надо отметить и не упустить. И можно ещё встретить тоже интересные такие вещи. Например, название методов сервисов. Вот ты как бы, а, проговариваешь со своим техледом, как будут называться твои методы в сервисах? Нет, нет, это логичные вещи. Да, это как бы, ну, вроде бы даже если они будут немножко по-другому называться, ну, ничего страшного, правильно? Да. С другой стороны, хорошо, что он написал эти вещи, потому что они когда ты сейчас смотришь уже скорее не код, а markdown, и тебе немножко понятнее вообще суть того, что он хочет сделать всё-таки. Ну вот, ну вот, понимаешь, тут из-за того, что он достаточно подробный, ты его начинаешь хуже смотреть. Вот я для себя обратил внимание, я достаточно давно программирую именно в режиме планирования с агентами. Да, он, кстати, действительно, смотри, начал запрашивать контекст, да, используя сам, а, воспользовался Spring Explore. То есть, причём там Spring Explore в description написано достаточно лайтовый такой description, но он посчитал, что это правильно использовать, и вот начал использовать. Так вот, возвращаясь к плану, я на себя обратил внимание, что я когда аа у меня слишком подробный план, да, я начинаю некоторые вещи просто пропускать. Вот как сегодня сейчас мы с тобой смотрели, смотрели в какой-то момент, мы поняли, что там, ну, слишком много деталей неважных, да, и мы готовы, как бы неважно, как он там реализует это, да, нас устраивает и тот другой вариант. При этом внезапно это может оказаться очень важная штука. Вот мы сейчас посмотрим, что он реализует. Э, я, естественно, несколько раз уже смотрел на то, как он реализовывает, и подлавливал на некоторых моментах. А вот посмотрим, справится ли он в этот раз. Например, вот смотри, мы ему сказали Sequence, да, он прямо не просто написал Sequence, а он такой: "Надо вот SequenceGenerator", да, а использовать. Кстати, вот хорошо, что он использует отдельные Sequence и Sequence именно отдельные для каждой сущности. Это это круто, что это, кстати, опять же, скорее всего, он это делает, потому что был загружен GPS skill, потому что там про это написано. Вот. Если вы вот хотите, чтобы так же было бы, то ставьте себе пак и всё у вас будет. Так что вот так вот. Э, очень двоякое у меня отношение к таким подробным планам. Значит, пока у нас вот реализовывается план наш текущий, у нас есть две опции, получается три опции. Правильно? Так. Дададада, конечно. Да. То есть первая опция - это поиграть. Да. Да. Я бы хотел сказать. Вторая опция - посмотреть короткие видео на той платформе, которая вам нравится, да? А третья опция, э, третья опция - это запустить ещё одного агента, заставить кого-то работать. Да нет, нет, я думал, ты мне сейчас предложишь. У меня, я пошёл во вкус, я думал сейчас какоя третья опция? Посмотреть, что вот что ещё надо делать. Главное, чтобы не делать работу. Открыть Marketplace. Открыть Marketplace. Вот получается, что у нас игра, правильно? Первый вариант. Второй вариант - это короткие видео. Длинное видео, ты же не смотришь, правильно, длинное видео. Больше минуты это Нет. Всё. Фу. Вот. А-э, да. И третий шаг - это третий, точнее, третий шаг, говорю. Третий способ - это вот маркетплейс. Правильно. А что на маркетплейсе? Что на маркетплейсе посмотреть можно? Просто подборку. Нет, например, ну, офисная техника, рабочие столы. А, ну зависит от. Я прямо я сомневаюсь, Паша, что у тебя офисная техника рабочие столы в подборке маркетплейса. Если я могу, ну ладно. Да, о'кей. Это смотри, это получается, это список зумера, правильно? А спис Ой, да, зумера, правильно. А список миллиниала, как как звучит список миллениала? Ещё строим материал, да? Запустить, да? Значит, запустить агента ещё одного, да? Но у нас уже два, можем не справиться. У нас один, правда, закончил уже работать. Вот. А вопрос номер, ну, вариант номер два это посмотреть ревью того кода, который написал агент. Это вообще законно, правильно? Надо, надо, надо это делать. Мы тем более уже закомитили его. Надо хотя посмотреть, что закомитили. Вот. И третье - это построить новый план. Но а у нас как раз-таки ещё одна задача есть. Третья. Я предлагаю с плана начать. Да. Да. Значит, что а мне стало интересно, как много сотрудников компаний, а, между твоим списком и моим списком выбирают, пока у них работает агент. Мне кажется, я думаю, что все мой список выбирают. Правильно? Нет, конечно, вообще нет. А так. Давай, значит, значит, задача какая у нас? Давай, вторая задача. Э, прочитаем её. Я её поставлю планировать, чтобы как бы кто-то работал, правильно? Пока мы будем хотя бы читать задачу, да? А может быть опять же а зачем? У нас закончилось успел закончиться, и мы прямо сейчас здесь и закончим, запустим, а спринг и у нас получается 02 задача. Так, а давай я напишу, сделай план. Я вот, кстати, говорил, что можно наговаривать, да? Сам не наговариваю, но не всегда вот хочется наговаривать почему-то. Не знаю, почему. А знаю очень много случаев, где ты наговаривал, например, на меня. Всякое лишнее. А, всякое лишнее. Ну ладно, давай задачу посмотрим. Значит, что нам нужно сделать? У нас вот сейчас, когда завершится работа в левом агенте, да, а нам нужно будет, э, сделать интеграцию с внешним сервисом для получения праздников, чтобы когда мы, например, создаём рабочее расписание в праздник, агент нам говорил, что так делать не агент, а система говорила: "В празднике мы не работаем". Да, нам для этого нужен будет производственный календарь. Знаю такой сервис. Да. Да, вот есть такой сервис, да, xmlcalendar.ru. И вот здесь как раз написано, что администратор клиники при добавлении нового рабочего расписания ветеринару а хочет, чтобы учитывались государственные праздники, чтобы инцидовались рабочие смены в нерабочие дни. Законно всё? Да. Значит, э тут описание более подробное. Я думаю, что нет его особого смысла читать. Тут просто написано более подробно то, что мы собираемся делать. Источник данных у нас XMR cendar room, да? А, значит, далее в терминах, ну, тут производственный день. Что такое праздничный день? Что такое производственный календарь и что такое сервис? Вот ты знаешь, что такое праздничный день? Праздничный день - это день, в который я не работаю. А с ампликодом каждый день праздник. Вот так вот. А-э, значит, э, можно было, кстати, термины убрать. Это он почему-то решил добавить. Я вот не устал удалять. Как получить праздничные дни? Значит, у сервиса мы запрашиваем, дальше кэшируем на страни, мы могли эти данные использовать. Вроде бы тоже всё логично. Так, а, кстати, Паша, твои аналитики и бизнес-аналитики знают, что такое кэширование на стороне системы? Да. Только это скорее знают не бизнесовые, а технические аналитики. Технические аналитики. Но, э, не такое могло появиться в тикете, правильно, что надо пишеть что-то. Конечно, 100%. Так, значит, а при давлении расписания нужно расписание. Система проверяет указанную дату. Ну, тут всё понятно, я думаю, каждый себе может это представить. Ограничение допущения. Ну, в целом всё понятно, всё просто. Дальше, кстати, у нас описание сценариев и описание API нашего сервиса. Такой я встречал редко в тикетах, но видишь, наш аналитик старался. Ну это систем это делал системный аналитик. Чувствуется рука мастера. Да, мы, кстати, можем проверить, что всё это действительно сервис работает. Как это сделать? Вот у нас здесь endpoint. Ну, по коннекту можно, да? Можно руками, правильно? Вот как в старину, как в старину сделать, правильно? А можно можно открыть ещё один терминальчик. Да, давай откроем ещё один терминальчик. Я тебе предлагаю сразу сразу ещё один третий открывать и в нём, чтобы Minecraft ещё транслировался, как в коротких видео на YouTube. Блин, мыти пропустили опцию Майнкрафта, когда обсуждали, чем бы себя занять. Или это было вып играть? Нет, это это в коротких видео тебе рассказывают какие-то шутки, а ещё транслирует видео. А, я понял. Так, коннект скрипт. Ты взрослый и занятой человек. Ты просто незнаком с контентом шорсов. Тебе надо больше общаться с Жорой. Понял. А-э, так. А 02. Угу. Так, сейчас он нам сгенерирует скилл. Вот он, подожди, сгенерирует скрипт. Видишь, подгрузил скилл, чтобы нам руками не писать. Вот тут у нас что тут по сути у нас указывается год, да, и год золотое число, а потом возвращается XML-ка в ответ. Можно было, кстати, и в JSON, но там в XML как-то поприятнее. А два типа есть атрибута, да? То есть есть атрибут D - это день как раз и T - это целое число, которое указывает, что это праздничный день или перенесённый рабочий день. Так вот, он создал, смотри, коннект. Да, что мы его открываем, этот файл, и запрашиваем. Можно было бы, кстати, прямо здесь запросить и посмотреть прямо здесь результат, но можно сделать это и в IDE. Выбираем environment и понеслась. А, мм, да, кстати, и даже год он нам указал. Год у нас указан в environment. Да, давай чекнем, что там за год указан у нас. 2025. А давай укажем и заново перезапустим. Так что у нас тут с праздниками на 2026 год? Мм. Так будет день труда. Ты готов к нему? Э да, но в этот день я не буду трудиться. Понял. Та как же это участок убирать? А твой? Я надеюсь, что мы не встретимся для этого. А так, ну давай посмотрим, что у нас напланировалось. А так это нам больше не надо. Третий агент. Выключаем его. Тут у нас спрашивают, как будем тестировать. Ну тестировать мы будем опять же с помощью коннекта, да, при помощи коннекта. Кстати, может быть добавить опцию такую тестировать с помощью коннекта. Блин, а ты можешь его так научить делать, сказать ему всегда спрашивай меня. Да. Да, это как раз нам, кстати, там как раз в вот в скиле планирования написано, да, что а спрашивай меня о том, как нужно тестировать. И вот, собственно говоря, там есть несколько опций, и можно было бы добавить коннект. Действительно, как будем кэшировать данные? Предлагают нам in memory table. Таблица в базе данных. Нет, давай, давай, давай, пожалуйста. In memory table. Вот. Отлично. Это всё-таки не надо изобретать велосипед. Соглашаемся. Блин, мы, как думаешь, дойдём до того, чтобы посмотреть, что он там нареализовывал у нас раньше с ростами? Я думаю, что однажды однажды, да. Тут смотри, видишь, вот этот вот этот агент уже начал что-то запускать, то есть я вижу, что он уже билд смотрит, то есть сейчас он уже тестирует коннект с скрипты. Сейчас посмотрим, справится ли он с запуском приложения. Смотри, там написано, что он звонит в ампликот. Где? Calling amicкоod. А не cлей. Нет, там написано коли слева. Слева? Да. Ну ладно. Ну ладно. Пусть чуть выше, чем writing connect test scripts. Куда ты думаешь? Не пойму. Посередине, где у тебя мышка, написано calling аплико. А так а да. Ну это вызывает улыши. Это уже. Ну нет, подожди, он звонит и, судя по всему, довольно долго, потому что ему не отвечают. Не, ему отвечают. Там просто он несколько вызовов делает. Вот видишь, он можно посмотреть. Если нажать кому то, то можно посмотреть, как, собственно, это он там ребилд делает. Да, посмотрим. Ребилд. А, ребил сделался. Ну-ка. Что-то он не может это сообразить, что всё хорошо произошло. Похоже. Да, похоже, его застакало. А, да, ему пока не отвечает внешняя система. Сейчас мы подождём, пока ему ответит внешняя система. Точнее, ему LLM пока не отвечает. Видимо, думает над результатами того, которому вернул ту, которую ты вызвал в LLM должна проанализировать яй должен проанализировать результат, чтобы прийти к следующему действию. Это, кстати, интересно, что вот мы, это тоже особенность именно скилов наших отчасти, да, то, что мы, а, в тех местах, где можно распросить, например, вот там в эксплорскеле, там все Explore вызовы, они все делаются параллельно и потом всё собирается воедино и отправляется один раз в LLM, чтобы один LLM как бы один раз протянулось эти данные через себя, да? У нас свободен правый терминал, да? А ты уже, о, ты уже почувствовал, ты уже чувствуешь вот этот вайп, агентский вайп. Да, но я, если честно, и устаю сильнее от этого, что если ничего не бежит справа или слева, то надо как бы чем-то занять, правильно, агента? Да, да, конечно, нельзя. Нельзя, чтобы ничего не делалось. Ну, давай посмотрим план. Он нам создал план. А, надо его провалидировать. Так, public holidays. Так, это мы свернём. Давай мы такто сдвинем. Так, значит, что? Интеграция с календарём России через сервис XML календар. Ну, это всё понятно. Это наша задача была. Ть 24 часа. А, Casable плюс CFE, судя по всему. Угу. Так, если недоступен внешний сервис, то ошибка. Кэша нет, то ошибка. Если кэш есть, то есть кэша. Так. При добавлении schedule entry будет проверяться. Так, а поле, которое проверяется workday. А так, кэшевая конфигурация JSON. Интересно, что здесь он JSON уже пишет. Ну ладно, вроде как я думаю, что здесь интересно, что он нам не сказал. Он сказал, что если нет кэша, то ошибка. А как он будет заполнять кэш, пока не написано. Ну, через кэшбантаци. Нет, понятно. Ну нет, он под нет кэша подразумевает его недоступность или что? Я почему-то двойственно прочитал это. А, ну я думаю, что когда он пустой, вот этот вариант оно предполагает. Так, коннект скрипты для тестирования. Тут всё понятно. Так, у нас, значит, будет, смотри, public holiday clientгу, который внутри, кстати, будет использовать REST client Client. Обрати внимание, всё, как ты любишь. Ура! А далее сервис, который будет вызывать, судя по всему, нашли. Внутри будет local data. А сервис есть сервис по добавлению entry, да, и, собственно говоря, он будет использоваться. Далее, а это уже пошли детали. Implementation steps. Ну, вот видишь, уже как бы из-за того, что из такой подробности уже не хочется это всё читать, потому что как будто бы здесь кажется, что он всё правильно мыслит, как нам надо, да, но пока ты пролистываешь, не совсем понятно. То есть он же будет заполнять кэш на момент старта, значит, он должен триггериться на что-то. И вот здесь. Не он момент первого запроса, момент первого запроса будет заполнять кэш. А, о'кей, хорошо. А вот так вот. А так. А, ну я подозреваю, я не знаю точно, это както, как я говорю, пути и я неисповедимые. Нет, слушай, это просто очень хорошо, потому что это позволяет тебе самому подумать над задачей ещё разочек. и задаться вопросами, которые тебе, возможно, на которые тебе изначально не дали ответов или не задали. Да. Да. Смотри, у нас вот здесь в левом терминале, мы сейчас в правом терминале напишем реализовывать, да? То есть у нас уже потому что всё уже есть для этого, да? Глянем. Правильно, кстати, говорить, реализуй. Правильно говорить, а не реализовый. Реализуй. Да, да, да. Ага, понял. Но видишь, он меня понимает. Так, контроллер. А, так. Entry controller. О, у нас, смотри, он всю логику прописал в контроллере. А это не совсем то, что нам надо, правильно? А мы не просили, мы не просили сервисы у него сначала. Да, у этого агента мы не просили сервис. Как будто бы, да, но как будто бы вот смотри, мы же вот здесь вот, когда писали REST, мы же ему сказали про сервисы. Видимо, он посчитал. А, давай посмотрим, может быть, здесь тоже сервисов нету. Ну-ка. Так. А-э, визиты расписание. Так, стой. Вот здесьто должны быть сервисы. Ну-ка. Да, слушай, здесь тоже сервисов нету. А мы ему забыли сказать про сервисы, когда я оставил на исполнение. Я ему забыл написать. Да, это первому мы сказали, по-моему. Нет, нет, мы вообще забыли сказать ему. Мы это обсудили, но не сказали. Но ничего страшного. То есть, да, да, мы забыли ему это сказать, но, в принципе, получается, он сделал то, что мы ему не не дали эту информацию, и он это не сделал, следовал хорошо методичке. Вот. А, ну я, смотри, есть две опции, на самом деле, можно оставить как есть сейчас пока. Да, просто наши зрители, ну, вы нас просите, как бы можно попросить просто потом попросил, попросить его сделать делегации, и он, в принципе, с этим справится неплохо, да? Ну, хорошо справится, точнее, будет без проблем всё. Вот я предлагаю сейчас не делать уже через сервисы, а просто оставить нашим зрителям на самостоятельно попробовать. Да, о'кей, хорошо. И зрители тебя, скорее всего, простят, потому что зрители, говорил я, а пользователи нет. Ну да, наверное.

А значит, смотри, у нас вот здесь это застакались вызов застакался, то есть он ничего не происходит. То есть вот я вижу, что я вот смотрю, и он завис просто на билд прок. Хотя билд корректно отработал. Видимо, что-то там подломилось.

Что можно сделать в этой ситуации? Мы просто нажимаем Escape и говорим: "Продолжай".

>> Такое бывает, к сожалению, с агентами.

>> Это очень похоже на HTP ответ 200 Success FSEs. Вот так это выглядит. Продолжай после кнопки Escape. Это не очевидно. Вот.

>> Ну да, да. Ну вот видишь, он понял, что мы хотим всё-таки запустить наши скрипты, да, и погнал их запускать.

А здесь тут вот во втором терминальчике, смотри, у нас уже реализация полная есть, поэтому мы, в принципе, можем сказать ему: "Полностью реализовывай".

>> Угу.

>> Реализуй. Правильно. Полностью

>> реализуй, реализуй,

>> реализуй. Да.

Что делаем? Отчищаем опять же

>> контекст.

>> Терминал, да? Да. Контекстчаем и говорим реализуй согласно плану. И указываем план. А план у нас какой? План у нас Public Holiday называется. Так, вот наш план. Отправляем его делать работу.

А тут у нас происходит процесс запуска. Можем посмотреть, точнее даже процессы и написания скриптов одновременного и запуска. В тестовой в тесты он нам положил в конект скрипты. Давай глянем, понаблюдаем. При себя прият понаблюдать за чужой работой.

>> Согласен.

>> Так что у нас тут? Тут у нас уже полностью реализованы сценарии. Угу.

Так, тут бы, конечно, было бы хорошо бы их посмотреть внимательно, потому что, ну, правильный сценарий - это важно. Кстати говоря, смотри, какие ошибки он совершил внезапные. Вроде бы не должен. Это PowerР, да, насколько знаю.

>> А,

>> это колен power, да, для того, чтобы у тебя результаты всех твоих ассершенов выводились сразу.

>> Угу. Знаю, у тебя там даже была недавно проста статья на эту тему. Да, всё верно. Да.

Так, смотри, значит, что он у нас сделал. Он у нас не запустил конnкт. То есть он его написал, но не запустил. И в связи с этим я вижу, там какая-то ошибочка в коннекте. И а и он должен был запустить, правильно? Как так? Ну это что такое вообще, когда агент не запускает проверочные скрипты? Это плохо.

>> Ты недоволен, Паш?

>> Я недоволен.

Так, давай вывереммент. Возможно, из-за энта у него тут проблемки. Скажем так, не без багов. Конечно, этот ваймент должен был бы выделяться автоматически. Вот. А, но агент не смог. А давай скажем ему: "Запусти скрипты".

>> Да.

Так, пока он запускает. Так, смотри, он понял, что приложение не запущено. Сейчас должен запустить. Пока он всё это запускает, мы чем займёмся?

>> Мы займёмся, посмотрим предыдущий реквест.

>> Да, потому что мы закомитили и не посмотрели.

>> Ты ты же Да, да, да. Вя. Да, да, да.

Так, Крустапи, давай посмотримпоинты. А давай мы прямо посмотрим их вот отсюда. Так, значит, было сделано что овнер. Давай глянем, что овнер. Вот мы видим, что, смотри, начали запускаться приложение. То есть видишь, у нас агент, он сам смог запустить. Так, что-то тут пошло не по плану. Ну-ка, давай глянем.

А ещё у тебя довольно странная вложенная структура реста. Почему она такая? Но это так было написано в задача, то есть в задаче тех лит, которые она поставила. Я вот говорил, что модель здесь описана в терминах DD и она следует как бы той логией, которая, собственно говоря, в D представлена.

>> О'кей.

Ну я, кстати, ещё знаешь что хотел? Ну тут давай посмотрим наш рест, потом вернёмся к тому, что он не может запустить. Э, он, может быть, к этому времени уже разберётся, в чём проблема. Так, у нас тут метод гетол понятный, да, спагинации. Тут вроде всё понятно, всё правильно. Мапе, но тут он реализовывает весь рес согласно тому, как это было сделано в амприкоде. А в амприкоде у нас есть целый доклад на тему того, как делать росты в амприкоде. Правильно? Ой, как делать правильно росты. Это твой доклад? Конечно,

>> это мой доклад. Всё правильно.

Так, что-то уже, говорит, запущено на порту 8080. Ну-ка. Интересно, что это такое? Давай глянем. Возможно, он не сможет справиться без нашей помощи. Так, да, смотри, петлиника запущена где-то на другом порту. Так, и он решил запустить скрипты. Ну пусть запускает, не будем ему мешать. Пусть работает. Так.

А, да, тут, в принципе, реста весь понятный, поэтому особо на него смотреть нечего. Правильно, я его смотрю, потому что он полностью тот, который меня устраивает. А далее, далее посмотрим, давай на сущности, на нашевецкедуля,

>> да?

>> А, и вот смотри, у нас, э, в расписании используется О, кстати, тут смотри, он лист использовал. Вот это можно было поправить. То есть сказав ему, что использую сет. И я вот хочу сразу тебе сказать, что если бы ты бы здесь сказал использовать сет, то он бы посмотрел бы в наш скилл GPный, да, и сделал для

>> и бы, да, сделал бы и Qшкод. Всё правильно, как они должны быть написаны. Он он сделал заранее, хотя в целом вот для листа это не обязательно, да, но он их уже сделал. То есть, в принципе, это неплохо.

Так, у нас вот пока запускается. А что ещё можно посмотреть? ДТОшки. Давай посмотрим. ДТОшки. У нас дшки должны были быть с флэтами,

>> помнишь? Да, мы

>> Да. А сделали. И они действительно с флэтами. Вот мы видим, что действительно с флэтом. То есть домашние животные передаются в виде коллекции. А можно даже посмотреть.

Так, а что ещё из важного такого, что мы делали? Можем, кстати, посмотреть логику, э, логику проверки на Ой, её, кстати, на Посмотри. Да, агент её написал уже или нет? Ещё так у нас конфигурация реклиента происходит. Что-то он прямо долго с этим с этим он прямо долго как-то работает. Но я смотрю уже сервис написал. Или подожди, или это Да нет, вроде. Ну-ка давай глянем. Что-то сегодня он решил это усложнить себе задачу, написал клиента, но при этом при этом

>> Кстати, он же получает XMLну, и он до сих пор не спросил тебя о том, что использовать для партинга XML.

>> А, да, кстати, мы это не указали. Но видишь, он иногда может спросить, иногда может не спросить. Это, к сожалению, увы, но так. Ну, вот здесь, смотри, элементы пошли. То есть, в принципе, наверное, он правильно всё делает. Давай посмотрим. Так, паблик Holiday Series. Так, а-э, сам себя вызывает внезапно. Что-то он, короче, решил усложнить себе жизнь. Так, документ Builder Factory, смотри. New instance документ. Ну, это вроде то, что надо. Нет. Очень похоже на Очень похоже на тот,

>> да. Только интересно, почему он это стал делать не внутри, а он смотри, клиент не реализовал. Видимо, там у него при реализации возникли какие-то проблемы с клиентом, и он решил вообще клиент не реализовывать и сразу реализовать сервис

>> и просто вызвать се.

>> При этом по-прежнему находится вот, да, при этом находится в стадии реализации клиента. Что-то пошло явно не так. И вот смотрите, из-за того, что мы не используем не используем Work 3, git work 3, да, мы сейчас вот, например, не можем отходить изменения,

>> да,

>> хотя, наверное, тут же у нас, видишь, параллельно ещё делает в соседнем агенте. Так, я надеюсь, что сейчас всё завершится успешно. Не думаешь, что А нет, слушай, мне на секунду показалось, что у тебя подвис правый терминал. А, но, наверное, нет.

>> Нет, нет, нет.

>> Что в такой вот ситуации делать, да, когда вы чувствуете, что что-то пошло не так? Что делать? А я обычно нажимаю Escape, я обычно прерываю работу агента и начинаю смотреть код, который он нагенерировал, помогаю ему как бы справиться. Либо второй вариант, можно откатить всё и заново попробовать реализовать. Здесь даже, к сожалению, не во всех случаях можно помочь скилами. То есть тут сейчас агент почему-то внезапно решил, что ему нужен, что он с клиентом не справился. Вот мы этот момент упустили. Можно было бы сказать ему, что пото скорректировать, но вот он прямо явно пошёл не туда, мне кажется. Сейчас давай посмотрим. Он getхолидес вызывает уже. Да, уже вызывает. А внутри нашего сервиса создания вот entry. То есть, в принципе, он практически сделал реализацию полную уже. Я думаю, что, возможно, вот этот список он неверный. То есть, возможно, сейчас он уже полностью закончит. И Да, тесты начал писать. А давай мы попросим не писать тесты. Возможно, сейчас всё будет быстрее. Ну-ка, давай. Хотя мы ему сказали, да, использую только конек для тестирования, он всё равно вот так что у нас левый агент. Так, что-то он тут переключил у нас, смотри. А, ага, мы вышли за контекст. Так, да, видишь, он слева, справа получается у нас всё хорошо выполнилось, да?

>> А единственное, несмотря на то, что он считает, что клиент он заимплементирован, клиента у нас нет, я так понимаю.

>> Угу.

>> А, нет, есть. Ну-ка, клиента-то есть, оказывается, но он его вызывает, интересно, где-нибудь. Нет. А он, видишь, смотри, а получается, что клиент использует только для того, чтобы получить строку. Хотя логичнее было бы прямо там в ним распастись. Правильный результат.

>> Слушай, ну это довольно спорный момент. Ты получаешь XML, а дальше ты при помощи сервиса праздников своего можешь как-то с ним работать. Это ну два. хотя бы. Ну, с

>> ну это

>> не нужно разве на уро на як на уровне клиента не нужно как-то создать какой-то промежуточный типа ДТО, который или там, скажем так, какой интерфейс, который, если мы потом захотим сменить клиента, чтобы он возвращался, нам не нужно было менять сервис.

>> Ну не обязательно. У тебя может быть промежуточный сервис для этого, например, который вы знаете,

>> ну, может быть, да. В нашем случае как раз так и получилось. То есть наш сервис, он как раз вот Holiday Calendar - это вот та самая ДТО, которая в себе содержит праздники. И она, собственно говоря, является вот этим апе. Получается, что этот сервис, он является таким слоем апи для внешних систем, для получения расписания. Ой, для получения прачных дней.

Так, тут у нас, смотри, всё налаживается. Запросы на через зелёненькие, я смотрю уже все. Так, дай глянем, что там агенты у нас. Так, видимо, вот этот агент запускает, а, тесты, а, ну, этот агент тесты пытается запускать, кстати говоря. Вот смотри, он пытается тесты запускать через а через Gradle, да, хотя мы можем запускать тесты прямо через MCP, который мы подключали до этого. То есть вам прикоде есть функциональность, которая позволяет вот этот тулинг вызывать именно дшный, который запускает тесты. И при этом он возвращает не все сведения, которые есть в этом, да, там и запуск приложения, там и инициализацию тестконтейнеров, если они используются, и так далее, а он возвращает только там ответ и аэ причину, если вдруг что-то упало, тем самым опять же экономия ваши токены. То есть когда вам не и не приходится и среди объёма большого данных искать а нужные вещи, да, а возражать только эти нужные вещи, то вы тем самым опять же экономите токены. И чтобы как сделать так, чтобы вот тесты, почему он, собственно говоря, не запустил, да, вот наш прекрасный инструмент, да? А, к сожалению, мы тоже стараемся не делать так, чтобы вот в описаниях скилов писать там в обязательном порядке использовать этот туolл, когда там используете те, кто писали скилы, знают про использование слова там must, mandatory или там critical или ещё что-то. Если такие слова в декрипшне написать, то с высокой вероятностью агенты будут прямо активны ваши скилы использовать. Мы так не делаем именно потому, что hdm от постера, что вот если он видит, что у него там вот он использует грел тест, да, и он хотел бы, чтобы использовалсь вместо этого механизм de, он может просто у себя добавить правило, в котором напишет, что в случае тестирования используй, пожалуйста, механизмы. Или можно прямо сейчас в чате нажать escape и сказать: "Используй механизмы для запуска тестов". И таким образом он как бы не будет запускать после больше играть тест.

Так, он всё-таки пытается тесты починить. Тут походу у него прямо это жёсткие жёсткие начались проблемы. Смотри, он пишет нам, что, а, ноб севис - это сервис по природе. Лучше добавить mбиin для него в в клиник сервис-теestст. Какой ты сервис по жизни?

>> Как тебе такие?

>> Дадада,

>> да. Я хочу изменить изменения существующего теста. То есть прямо у него это, Но смотри, все тесты прошли, то есть всё, значит, получается, он смог, да, и написал скрипты, но скрипты он не запускал. Или подожди, сценари на празчный день и обычный день. Давай спросим, не запускал ли он скрипты. Так нет, что попросим его запустить коннект скрипты.

>> Конечно, обязательно.

>> Получается, это это левый запускал конект скрипты.

>> Получается, что да, получается, что левый, да. Но вот вы можете сюда нажать Ctrl O или option у кого какая клавиатура. И вот здесь посмотреть, что, собственно говоря, вызывалось вызывал ваш агент. и ответы, собственно говоря, посмотреть MCPшные там и так далее.

Так, ну мы по-прежнему, кстати, а, ну, мы уже посмотрели, в принципе, код, да, можем посмотреть только к ещё метод создания, да, чтобы убедиться, что там в целом, но там, я чувствую сейчас очень интересный код. Давай посмотрим, который написал нам агент. Так, он у нас находится тут опять же стоит некоторую скидку делать на то, что мы находимся всё-таки в демо. В реальности, если я вижу, чувствую, что что-то пошло не так, я нажимаю ESA, иду в код и начинаю уже просить его править отдельные кусочки. Так, у нас метод создания, да? Давай найдём его в нпоинтах,

>> да?

>> Так, у нас метод создания внутри ветеринара скедули. Вот этот метод. А это медсоздание не тот. Нам нужен метод создания entry.

>> Да,

>> вот этот метод. Так, пусть он пока воюет со скриптами, не будем мешать. Так, у нас тут что? А, проверяется время, что есть, проверяется, что одно после другого. Это всё правильно. Потом календарь берётся, проверяется, что действительно в календаре а-а он получается, да, а обрабатывается ошибка, что сервис недоступен. А проверяется нахождение дня внутри, точнее, рабочего дня, которые мы собираемся сгенерить внутри в праздника. В целом не так уж и плохо, да?

>> Наверное, айдишники только он не проверил. У нас же используется

>> что между айдишники. Э-э, ну я не вижу в моменте ДТО, если в ДТО есть ID аа выходящий.

>> А то есть ты имеешь, ну это же мы entry содаём. То есть тут в принципе, да, посмотрим в entry ДТО, да, есть адишник, никто не проверил, но да, мы знаем, как это делать. Если не знаем, то

>> смотрим доклад Ильи Кучмина. Да, обязательно.

>> Именно. А, да. А-а, так. А если что, там в том числе разбирается ситуация, когда можно создать отдельный дето, правильно? То есть,

>> да? А значит, далее у нас тут что мы где остановись? Мы были contents, да? А проверяется overlaps, то есть проверяется, что одни не покрыва не накрываются они, да? То есть нет уже такого графиков, как не пересекаются, да?

>> А-а, тут прямо у нас нормальная такая обработка исключений. То есть смотри, аэ у нас получается сначала строится Ну да, нормально в целом. Так, далее. Map, да, на entry. А, добавляется entry. Кстати, смотри, entry добавляется через get entries at. А, то есть не вы не вызовом репозитория, да? То есть мы, видишь, не вызываем нигде сedry repository, а вызываем вот именно вот таким-то образом добавление. Почему так происходит? То есть, а, у тебя же, когда айтем внутри, да? То есть у нас есть рабочее расписание, внутри него есть айтемы рабочего расписания. И вот мы сейчас по сути что сделали? Взяли базовый объект и в коллекцию добавили. И теперь его сохраняем, этот базовый объект. А этот это происходит отчасти из-за того, что уже так реализовано в проекте. То есть это я вот говорил, что наши скилы анализируют текущее состояние проекта и как он написан, да, и а если что, ну и стараются делать так же. То есть вот у нас, например, а внутри ветеринара, если мы, точнее, не ветеринара, а внутри владельца домашнего животного, если мы откроем, то мы увидим здесь есть методы типа, например, да? То есть это методы так называемые методы синхронизации,

>> да?

>> Внутри JPA. У нас мы в своё время писали статейку на тему того, почему эти методы могут вызывать проблемы, там лезилоги разные там, и так далее. Аа но у нас они уже были в проекте, поэтому мы следовали этим практикам. Но что делать, если вот мы мы такие типа мы хотим узнать, а как bestст, как bestст, вот как что надо поправить, что сделать в этой ситуации? Вы мы всегда можем, вот у нас есть свободный чат, мы всегда можем вызвать наш скилл, например, да, GPA skill и сказать: "Проанализируй проект и, а-а, соответственно, а-э, дай и дай свои рекомендации". А у нас внутри скила есть некоторые, так скажем так, а, отхождение блока называется review. Да. И если мы видим, что Постер хочет ревью, то мы не запускаем там некоторые процессы в скиле, а мы делаем конкретно ревью и рекомендации даём в ответ.

>> Угу.

>> То есть, если вдруг вы хотите, чтобы узнать, а как Bestст, да, как Best практи или, может быть, ваш проект чему-то не следует, то вот таким-то образом можно запустить. Пока ты пока ты делаешь полезные действия, я бы хотел сделать некоторую пометочку. Я заметил, что у тебя в коде есть только мм маперы. Это как-то неправильно, потому что должны быть по правилам ещё и паперы. Вот

>> я понял. А, но абстракт, мне кажется, пока ещё не умеет в паперы.

>> На, ну, пока да, наверное.

>> Ну, я думаю, где-то есть какая-то ищую, правильно? Ты заведёшь ищую им, чтобы они научились.

>> Конечно, это, ну, моё главное ишьё.

>> И да, и что нужно сделать? Нужно всем с зрителям пойти и что? Ну, поставить лайки, правильно на это ещё.

>> Да, дада. И надо, чтобы это работало таким образом, чтобы новый объект ДТО получался только в результате совместной работы мапера и папера.

>> Да. Да.

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

>> Угу.

>> Делал ли ты так? Ну да,

>> нам знаешь, нам сейчас нужен Миша, чтобы он такое посмотрел и сказал, что бы он сказал.

>> Ну

>> я про Мишу Поливаха.

>> Нам нельзя такое говорить здесь.

>> Нельзя такое говорить, да. А я слышал, что у вас теперь это есть десятиминутка на подкасте.

>> Да. Дадада. Михаил Поливахамси с аудиторией.

>> Да. А, значит, ну мы не будем сейчас это исправлять. Это явно есть повод для улучшения, как будто бы. Так, дальше у нас result обратный, да? Result, да, мапер обратный. Ну, тут всё понятно. Кстати, смотри, он header добавляет. XW warning using cash holiday data. Я бы такого бы не стал делать, но смотри, приятно чувствуется сразу ты, когда добавляешь хедер, чувствуется, что ты как бы уже немножко синер, правильно?

>> Ну, ты понимаешь, да? Ты владеешь ситуацией, понимаешь, что происходит, да? Да. Да. И причём, смотри, это XADER, то есть это как люди X практически.

>> Да. Да.

>> Так. А, ну и дальше уже респонс. То есть, в принципе, всё нормально. Не будем дальше смотреть. Тут, я смотрю, в целом агенты с чем-то справились, да? То есть, ну, мы видели по коду, что в целом это будет работать, да? То есть берётся holлий, проверяется, всё это собирается. Вот это во-то, знаешь, так как там было?

>> Дадада. Дадада. Дадада. В 2000 в 2000 каком-то году был, э, известный мем Pineapple Apple Pen. Вот. Да, дада, дадада, да-да, да.

Завершаем, завершаем. А я на самом деле бы в реальности я бы запустил бы, конечно бы, ещё раз коннект сскрипты все прогнать, потому что, судя по тому количеству, э, проблем, с которыми столкнулся наш агент, наши агенты столкнулись в процессе, а-э, нужно ещё раз, чтобы убедиться, что здесь всё работает, потому что может и не работает, но именно не работает. Я имею в виду, что возможно какие-то кейсы отдельные не работают, а, возможно, всё работает уже. А, естественно, надо посмотреть код, который он сгенерировал. Да, без этого никуда.

>> Да,

>> правильно.

>> Я с тобой это никуда никуда.

>> Да, можно попросить всё это закомитить, разложить по полочкам, разложить по отдельным комитам обязательно. Вот. И а что в конце? В конце а давай ещё раз, наверное, расскажем, как установить, да?

>> Да. И ещё надо показать, сколько вообще эта штука нагенерила кода. Наверное, это было бы пра

>> Да, давай. Да, ну тут уже сложно показать, потому что давай тогда закомитим.

>> Давай.

>> А, давай, да, закомитим и изменения. Так, и я вот сейчас думал, он сейчас всё закоммитит или закоммитит только свои изменения. Бывает по-разному. Бывает всё закоммитит, а бывает закомтит только свои изменения. Сейчас узнаем.

>> У него очень интересные подписи. Вот этот нуклейтинг. Правый был LOL gйing.

>> Он, кстати, интересно. Cloud код, когда просишь закоммитить, он добавляет себя в савторы.

>> Такой вот хитрец.

>> Как тебе такое? Ма,

>> да. То есть смотри, если давай поверим, они собрали, да? Видишь, смотри, Cloud код Sunan 46тор. Так что я вот думаю, будут ли когда они Ну, представляешь, у нас почти к любому комиту получается есть соавтор в виде модели, правильно?

>> Да.

>> Так, значит, что у нас? Смотри, он не всё закомитил. Да, видимо, он загамитил почти всё. Ну, давай. Вот смотри, есть такая кнопочка. Вот так раз нажимаем. Так, ну тут всё нормально. Тут, в принципе, планы вон только остались. Так, комитем. А-а, мы хотели посмотреть, сколько же мы сделали. Да,

>> да,

>> да. Значит, мы за сегодня сделали вот это implement. Так, вот это мы сделали. И тут у нас получается, ну, много изменений,

>> огромное количество. Слушай, это очень много кода,

>> да, но его всё, весь код надо проревью, да, не забываем,

>> конечно, коне,

>> как бы этот код написан агентом, его, естественно, нужно проревьюить и возможно, ну, мы по крайней мере точно видели минус один, да, сайз -1, это, наверное, не то, что ты ожидаешь в коде,

>> но сам факт, мы с тобой за час нагенерировали и тесты, и всё остальное оно как бы всё будет

>> за час 30 за

>> за час,

>> но тесты в

>> коннектет.

>> Тесты в коннекте. А, ну да, за час программирования. Зачас

>> программирование. Всё верно. Дада. Да. А-а, но тесты мы коннекторские сделали. То есть мы сделали to тесты, то есть это не тесты, которые вот именно сервисы на условии или тесты там MOC MVC тесты, да, это именно N тесты. В принципе, кстати, наверное, даже неплохо, да, что это N2-те тесты. Они как минимум убеждаются, что работают сценарии пользовательские.

>> Мне кажется, у нас бы ушло не сильно больше времени. При вот столько же ровно ушло бы, если бы мы ему отдельно сказали: "Ещё и тесты сделай, пожалуйста". Вот.

>> Ну, чуть побольше. Да. Да. Но в целом, да, в целом ты прав.

Так, давайте ещё раз как поставить, да, на всякий случай напомним. Аэ, значит, для этого нам что нужно? Первое - это агент поставить,

>> да,

>> правильно?

>> Да.

>> А второе - это поставить ампликод ещё раз с сайта, да, ампликода. А если у вас open de, то

>> всё уже в коробке.

>> Всё уже в коробке, верно? Далее конфигурируем свой агент MCP. Для этого опять же заходим в поиск, пишем MCP, CP и включаем код MCP, да, если он ещё не включен, и нажимаем кнопочку автоконфира в cloud код или в курсоре или в кодексе, неважно, где вы используете. А далее, далее ставим себе скилы, да, а опять же заходим на GitHub на наш со скилами и ставим себе скилы вот одной простой команды. Сначала ставим marрйс, а потом ставим себе скилл. Угу.

>> И, собственно, всё. После этого можно вот сделать всё, что мы сегодня делали, запускать планирование с нашим скилом, да, со спрингом, запускать эксплор со скило со спрингом, запускать создание реконтроллеров и так далее, и так далее. Кстати, ревю проекта с GPA тоже можно сделать. И, кстати, ещё такая прикольная штука есть. А, Spring Explore Skill. он поддерживает DDD, а именно у него прямо есть отдельная методика, как работать с DD проектом. И если, например, у вас вы хотите посмотреть, как ваша модель структурирована с точки зрения DD, просто вот интересно, тебе было когда-нибудь интересно, насколько твоя модель DDD ready?

>> Очень каждый раз,

>> да. А ты можешь просто написать опять же в агенте, а,

>> прямо буквально вот так вот, ну, естественно, очистив контекст, пишешь Spring Explore, да, и говоришь: "А покажи DDD модель". И он проанализирует ваше текущее приложение, построит из неё DD структуру и покажет там её прямо в терминальчике в таком удобном графе. Прикольная штука. А так, а, и, собственно, всё, да, вот можно пользоваться после этого. И напоследок, если у вас есть какие-то вопросы, идеи или пожелания, то мы куда идём?

>> В чат ампликод.

>> В чат ампликода, да. Вот по этой ссылочке, по этому QR-коду справа открывается канал, и через канал можно попасть в чат. Аа а слева не забываемся в боте регистрироваться, потому что плюшки будут ещё и после данного стрима, да. А если вы, например, смотрите нас на какой-то видеоплощадке, то опять же заходите в бот, и там уже эти плюшки можно получить, скорее всего. Вообще

>> на этом всё,

>> конечно,

>> правильно.

>> Достаточно.

>> Возможно, ты хочешь что-то сказать в конце, так сказать, а как это, как ты обычно заканчиваешь?

>> А я нет, ну мы всегда заканчиваем на хорошей ноте. Вот, собственно говоря, пользуйтесь прикодом и обязательно пользуйтесь им в Open IDE, и всё у вас будет хорошо. Я бы даже сказал не ампликодом, а пользоваться надо сн.

>> Это уже больше, чем апко. Да,

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

>> До скорых встреч.

>> Да, спасибо за внимание. пакета и до свидания.

>> А изри получается никто так и не вышел. Изри так никто и не вышел.

>> Нет, и я тоже не выйду.

>> Всё, всем спасибо. До встречи.

>> Хорошего дня, вечера, утра. Yeah.