<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Сергей Смелков | Python | AI | TypeScript</title><generator>teletype.in</generator><description><![CDATA[🧑‍💻 IT-предприниматель, более 10 лет в разработке

🚀 Делюсь опытом создания технологических продуктов

💡 Автор проектов для IT-специалистов]]></description><image><url>https://img2.teletype.in/files/9c/d9/9cd9e3b0-c936-427c-a347-1ccc6e7a5010.png</url><title>Сергей Смелков | Python | AI | TypeScript</title><link>https://teletype.in/@smelkov_pro</link></image><link>https://teletype.in/@smelkov_pro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/smelkov_pro?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/smelkov_pro?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 13 May 2026 20:58:53 GMT</pubDate><lastBuildDate>Wed, 13 May 2026 20:58:53 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/mcp-intro</guid><link>https://teletype.in/@smelkov_pro/mcp-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/mcp-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Знакомство с протоколом Model Context Protocol (MCP): почему он важен для масштабируемых приложений ИИ</title><pubDate>Thu, 26 Jun 2025 11:31:52 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ad/13/ad13483f-5afc-43ed-98f6-23dce2468480.png"></media:content><category>AI</category><tt:hashtag>ai</tt:hashtag><tt:hashtag>mcp</tt:hashtag><tt:hashtag>llm</tt:hashtag><tt:hashtag>gpt</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/14/c0/14c0de33-73e4-4d38-8c87-178545221726.png"></img>Приложения с генеративным искусственным интеллектом (Gen AI) — это большой шаг вперёд, поскольку они часто позволяют пользователю взаимодействовать с приложением с помощью подсказок на естественном языке. Однако, поскольку в такие приложения вкладывается всё больше времени и ресурсов, вы должны быть уверены, что сможете легко интегрировать функции и ресурсы таким образом, чтобы их можно было легко расширять, чтобы ваше приложение могло работать с несколькими моделями и справляться с различными сложностями.]]></description><content:encoded><![CDATA[
  <figure id="QhPK" class="m_column">
    <img src="https://img2.teletype.in/files/14/c0/14c0de33-73e4-4d38-8c87-178545221726.png" width="1000" />
  </figure>
  <p id="6xSN">Приложения с генеративным искусственным интеллектом (Gen AI) — это большой шаг вперёд, поскольку они часто позволяют пользователю взаимодействовать с приложением с помощью подсказок на естественном языке. Однако, поскольку в такие приложения вкладывается всё больше времени и ресурсов, вы должны быть уверены, что сможете легко интегрировать функции и ресурсы таким образом, чтобы их можно было легко расширять, чтобы ваше приложение могло работать с несколькими моделями и справляться с различными сложностями.</p>
  <p id="3lRW">Короче говоря, создавать приложения Gen AI с самого начала легко, но по мере их роста и усложнения вам нужно будет начать определять архитектуру и, скорее всего, использовать стандарт, чтобы ваши приложения создавались единообразно. Именно здесь на помощь приходит MCP, который упорядочивает процессы и обеспечивает стандарт.</p>
  <p id="IBDe"></p>
  <h2 id="zyLr"><strong>🔍 Что такое протокол контекстной модели (MCP)?</strong></h2>
  <p id="yYF3">Протокол контекстного моделирования (Model Context Protocol, MCP) — это открытый стандартизированный интерфейс, который позволяет большим языковым моделям (LLM) беспрепятственно взаимодействовать с внешними инструментами, API и источниками данных. Он обеспечивает согласованную архитектуру для расширения функциональности моделей ИИ за пределы обучающих данных, позволяя создавать более интеллектуальные, масштабируемые и отзывчивые системы ИИ.</p>
  <p id="MMWw">Рассматривайте MCP как порт USB-C для приложений с искусственным интеллектом. Точно так же, как USB-C обеспечивает стандартизированный способ подключения устройств к различным периферийным устройствам и аксессуарам, MCP обеспечивает стандартизированный способ подключения моделей ИИ к различным источникам данных и инструментам.</p>
  <p id="y40K"></p>
  <h2 id="ELcX">🎯 Почему стандартизация в сфере ИИ имеет значение</h2>
  <p id="FLMD">По мере усложнения приложений на основе генеративного ИИ важно внедрять стандарты, обеспечивающие масштабируемость, расширяемость и удобство сопровождения. MCP удовлетворяет эти потребности следующим образом:</p>
  <ul id="GnPT">
    <li id="CdDm">Объединение моделей и инструментов</li>
    <li id="Nu56">Сокращение количества хрупких, одноразовых индивидуальных решений</li>
    <li id="C0ZY">Возможность сосуществования нескольких моделей в рамках одной экосистемы</li>
    <li id="6nR7">Растущий список готовых интеграций, к которым ваш LLM может подключаться напрямую</li>
    <li id="BzjP">Возможность переключаться между провайдерами LLM</li>
    <li id="F14n">Рекомендации по обеспечению безопасности ваших данных в рамках вашей инфраструктуры</li>
  </ul>
  <p id="xb3H"></p>
  <h2 id="vSOE">💡 Почему протокол Model Context Protocol (MCP) меняет правила игры</h2>
  <p id="sPsb"></p>
  <h3 id="hv3u">🔗 MCP устраняет фрагментацию при взаимодействии с ИИ</h3>
  <p id="Ro1O">До появления MCP интеграция модели с инструментами включала следующие этапы:</p>
  <ul id="YuOh">
    <li id="xelA">Индивидуальный код для каждой пары инструмент-модель</li>
    <li id="VdU1">Нестандартные API для каждого поставщика</li>
    <li id="MuyS">Частые сбои из-за обновлений</li>
    <li id="k9L1">Плохая масштабируемость при использовании большего количества инструментов</li>
  </ul>
  <p id="qtRq"></p>
  <h3 id="qXyK">✅ Преимущества стандартизации MCP</h3>
  <ul id="ghUg">
    <li id="uNkF"><strong><u>Совместимость.</u></strong> LLM-модели легко интегрируются с инструментами разных производителей</li>
    <li id="7Bk3"><strong><u>Согласованность.</u></strong> Единое поведение на разных платформах и в разных инструментах</li>
    <li id="FkUS"><strong><u>Возможность повторного использования.</u></strong> Инструменты, созданные один раз, можно использовать в разных проектах и системах</li>
    <li id="7RZT"><strong><u>Ускоренная разработка.</u></strong> Сократите время разработки, используя стандартизированные интерфейсы «подключи и работай»</li>
  </ul>
  <p id="kXem"></p>
  <h2 id="GjVD">🧱 Обзор архитектуры MCP на высоком уровне</h2>
  <p id="dlMD">По своей сути MCP представляет собой клиент-серверную архитектуру, в которой хост-приложение может подключаться к нескольким серверам:</p>
  <ul id="qMY2">
    <li id="qbqe"><strong>Хосты MCP (MCP Hosts):</strong> Такие программы, как Claude Desktop, IDE или инструменты искусственного интеллекта, которым требуется доступ к данным через MCP</li>
    <li id="fbb4"><strong>Клиенты MCP (MCP Clients):</strong> инициируют запросы, клиенты, поддерживающие индивидуальные соединения с серверами</li>
    <li id="idTk"><strong>Серверы MCP (MCP Servers):</strong> Легковесные программы, каждая из которых предоставляет определённые возможности через стандартизированный протокол Model Context</li>
    <li id="SPyX"><strong>Локальные источники данных:</strong> файлы, базы данных и сервисы вашего компьютера, к которым серверы MCP могут получить безопасный доступ</li>
    <li id="HJCQ"><strong>Удаленные сервисы:</strong> внешние системы, доступные через Интернет (например, через API), к которым могут подключаться серверы MCP</li>
  </ul>
  <figure id="iqtR" class="m_column">
    <img src="https://img4.teletype.in/files/be/07/be07bed3-8cda-4933-b751-a257b060641d.png" width="1430" />
  </figure>
  <p id="ra5f"></p>
  <h3 id="cJsy">Ключевые компоненты MCP:</h3>
  <ul id="MjA3">
    <li id="eDDh"><strong>Ресурсы (Resources)</strong> — статические или динамические данные для моделей</li>
    <li id="1A2u"><strong>Промты (Prompts)</strong> — готовые рабочие процессы для управляемой генерации</li>
    <li id="3G0V"><strong>Инструменты (Tools)</strong> — выполняемые функции, такие как поиск, вычисления</li>
    <li id="EYH4"><strong>Выборка (Sampling)</strong> — агентное поведение посредством рекурсивных взаимодействий</li>
  </ul>
  <p id="uEue"></p>
  <h2 id="jHhC">🌍 Реальные примеры использования MCP</h2>
  <p id="QkYJ">MCP обеспечивает широкий спектр возможностей за счет расширения потенциала ИИ:</p>
  <ul id="DfyH">
    <li id="LDfu"><strong>Интеграция корпоративных данных.</strong> Подключение LLM к базам данных, CRM или внутренним инструментам</li>
    <li id="qvT7"><strong>Агентные системы искусственного интеллекта.</strong> Обеспечивают автономных агентов доступом к инструментам и рабочими процессами принятия решений</li>
    <li id="eDWm"><strong>Мультимодальные приложения.</strong> Объедините текстовые, графические и аудиоинструменты в одном унифицированном приложении с искусственным интеллектом</li>
    <li id="jycE"><strong>Интеграция данных в режиме реального времени.</strong> Используйте данные в реальном времени для более точных и актуальных результатов</li>
  </ul>
  <p id="4Plr"></p>
  <h3 id="RbZh">🧠 MCP = универсальный стандарт взаимодействия с искусственным интеллектом</h3>
  <p id="djBe">Model Context Protocol (MCP) выступает в качестве универсального стандарта для взаимодействия с ИИ, подобно тому, как USB-C стандартизирует физические подключения устройств. В мире ИИ MCP обеспечивает согласованный интерфейс, позволяющий моделям (клиентам) легко интегрироваться с внешними инструментами и поставщиками данных (серверами). Это устраняет необходимость в различных пользовательских протоколах для каждого API или источника данных.</p>
  <p id="QJGH">В рамках MCP инструмент, совместимый с MCP (называемый сервером MCP), соответствует единому стандарту. Эти серверы могут перечислять предлагаемые ими инструменты или действия и выполнять эти действия по запросу агента ИИ. Платформы агентов ИИ, поддерживающие MCP, могут находить доступные инструменты на серверах и вызывать их с помощью этого стандартного протокола.</p>
  <p id="1RHD"></p>
  <h3 id="3gHk">💡 Облегчает доступ к знаниям</h3>
  <p id="p7Ui">Помимо предоставления инструментов, MCP также облегчает доступ к знаниям. Он позволяет приложениям предоставлять контекст большим языковым моделям (LLM), связывая их с различными источниками данных. Например, сервер MCP может представлять собой хранилище документов компании, позволяя агентам получать необходимую информацию по запросу. Другой сервер может выполнять определённые действия, такие как отправка электронных писем или обновление записей. С точки зрения агента, это просто инструменты, которые он может использовать: одни инструменты возвращают данные (контекст знаний), а другие выполняют действия. MCP эффективно управляет и тем, и другим.</p>
  <p id="kym0">Агент, подключающийся к серверу MCP, автоматически определяет доступные возможности сервера и доступные данные в стандартном формате. Такая стандартизация обеспечивает динамическую доступность инструментов. Например, добавление нового сервера MCP в систему агента позволяет сразу же использовать его функции без необходимости дополнительной настройки инструкций для агента.</p>
  <p id="5DyW">Такая оптимизированная интеграция соответствует схеме, изображённой на диаграмме «русалка», где серверы предоставляют как инструменты, так и знания, обеспечивая бесперебойное взаимодействие между системами.</p>
  <p id="gPnq"></p>
  <hr />
  <p id="ccUz">✨<a href="https://dzen.ru/away?to=https%3A%2F%2Ft.me%2Fsmelkov_pro" target="_blank"><strong>Основной Telegram-канал со всеми обновлениями</strong></a>✨</p>
  <p id="Rr1w"></p>
  <p id="vxlr"><strong>📎  <a href="https://paywall.pw/raxl1vnwrldw" target="_blank">Присоединиться к закрытому клубу</a></strong></p>
  <p id="QW9J"></p>
  <p id="3nNf">Вам также может понравиться:</p>
  <ul id="0h79">
    <li id="BYRc"><a href="https://teletype.in/@smelkov_pro/langgraph-state-for-llm" target="_blank">LangGraph. Делаем State для LLM</a></li>
    <li id="c8w7"><a href="https://teletype.in/@smelkov_pro/yandex-cloud-run-llama-3-1" target="_blank">Запуск Llama 3.1 70b и 3.1 8b через Yandex облако</a></li>
    <li id="kDVP"><a href="https://teletype.in/@smelkov_pro/haystack-intro" target="_blank">Введение в Haystack</a></li>
  </ul>
  <p id="kWQe"></p>
  <tt-tags id="ZzQk">
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="mcp">#mcp</tt-tag>
    <tt-tag name="llm">#llm</tt-tag>
    <tt-tag name="gpt">#gpt</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/ubuntu-install-docker</guid><link>https://teletype.in/@smelkov_pro/ubuntu-install-docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/ubuntu-install-docker?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Docker на Ubuntu: Мощь контейнеризации в несколько команд</title><pubDate>Fri, 14 Mar 2025 13:02:35 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/00/6e/006ea314-21b6-4a36-985f-1eebe863199d.png"></media:content><category>DevOps</category><tt:hashtag>devops</tt:hashtag><tt:hashtag>ubuntu</tt:hashtag><tt:hashtag>docker</tt:hashtag><tt:hashtag>docker_compose</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/97/6b/976b2e03-6038-427b-acfd-b5c67513506a.png"></img>В мире разработки и DevOps Docker стал золотым стандартом для развертывания приложений. Благодаря контейнерам можно быстро запускать сервисы, изолировать окружения и масштабировать проекты без лишних хлопот. Но прежде чем наслаждаться всеми преимуществами этой технологии, Docker нужно правильно установить.]]></description><content:encoded><![CDATA[
  <figure id="hM16" class="m_column">
    <img src="https://img2.teletype.in/files/97/6b/976b2e03-6038-427b-acfd-b5c67513506a.png" width="1199" />
  </figure>
  <p id="royw">В мире разработки и DevOps Docker стал золотым стандартом для развертывания приложений. Благодаря контейнерам можно быстро запускать сервисы, изолировать окружения и масштабировать проекты без лишних хлопот. Но прежде чем наслаждаться всеми преимуществами этой технологии, Docker нужно правильно установить.</p>
  <p id="NpmN">В этой статье мы разберем, как установить Docker на Ubuntu – шаг за шагом, без лишних сложностей. Независимо от того, создаете ли вы локальную среду для разработки или готовитесь к production, следуйте этому руководству, и через несколько минут у вас будет готовый к работе Docker. 🚀</p>
  <p id="BtKN"></p>
  <h3 id="97rh">Шаг 1. Установка Docker и Docker Compose</h3>
  <p id="o7lb">Для установки достаточно выполнить следующие 2 команды:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="lCyK" data-lang="shell">curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh ./get-docker.sh</pre>
  </section>
  <p id="quPe"></p>
  <p id="m4C5">После установки проверьте версии утилит, выполнив команды:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="BOKA" data-lang="shell">docker -v

docker compose version</pre>
  </section>
  <p id="jKrV">Это подтвердит успешную установку и покажет версии установленных программ.</p>
  <p id="TgsM"></p>
  <h3 id="xfjn">Шаг 2. Разрешаем Docker вызывать без sudo (необязательно)</h3>
  <p id="a9nk">По умолчанию команда docker может быть запущена только пользователем <code>root</code> или пользователем из группы docker, которая автоматически создается в процессе установки Docker. Если вы попытаетесь запустить команду docker без префикса <code>sudo</code> или не входя в группу docker, вы получите результат, подобный этому:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="OcpQ">docker: Cannot connect to the Docker daemon.
Is the docker daemon running on this host?.
See &#x27;docker run --help&#x27;.</pre>
  </section>
  <p id="bJSp"></p>
  <p id="qwex">Если вы хотите избежать ввода <code>sudo</code> при каждом запуске команды docker, добавьте своё имя пользователя в группу docker:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="juIE" data-lang="shell">sudo usermod -aG docker ${USER}</pre>
  </section>
  <p id="ZTqN"> Далее просто перелогиньтесь к своему пользователю (можно перезайти в терминал) и сможете использовать команду docker без <code>sudo</code>.</p>
  <p id="ZRlk"></p>
  <hr />
  <p id="XmlQ">✨<a href="https://dzen.ru/away?to=https%3A%2F%2Ft.me%2Fsmelkov_pro" target="_blank"><strong>Основной Telegram-канал со всеми обновлениями</strong></a>✨</p>
  <p id="I3WT"></p>
  <p id="ohhs">Вам также может понравиться:</p>
  <ul id="emQL">
    <li id="6LP0"><a href="https://teletype.in/@smelkov_pro/initial-server-setup-ubuntu" target="_blank">Первоначальная настройка сервера Ubuntu</a></li>
    <li id="JC44"><a href="https://teletype.in/@smelkov_pro/find-most-busy-directories" target="_blank">Как найти наиболее используемое дисковое пространство в Linux Ubuntu</a></li>
    <li id="7nu9"><a href="https://dzen.ru/video/watch/66f6b4a7ad2d5367eefec6d8?share_to=link" target="_blank">Введение в библиотеку LangGraph</a></li>
  </ul>
  <p id="Ag2k"></p>
  <p id="NvqU"><a href="https://sig.skillspace.ru/l/backend-python-start" target="_blank">✔️ Обучение Python с нуля за 9 месяцев 🔝</a></p>
  <p id="OLLU"></p>
  <tt-tags id="azlw">
    <tt-tag name="devops">#devops</tt-tag>
    <tt-tag name="ubuntu">#ubuntu</tt-tag>
    <tt-tag name="docker">#docker</tt-tag>
    <tt-tag name="docker_compose">#docker_compose</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/langgraph-state-for-llm</guid><link>https://teletype.in/@smelkov_pro/langgraph-state-for-llm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/langgraph-state-for-llm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>LangGraph. Делаем State для LLM</title><pubDate>Sun, 16 Feb 2025 12:41:25 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c3/40/c34093b3-9edd-412f-bce7-b02431d154bc.png"></media:content><category>AI</category><tt:hashtag>ai</tt:hashtag><tt:hashtag>ии</tt:hashtag><tt:hashtag>langchain</tt:hashtag><tt:hashtag>langgraph</tt:hashtag><tt:hashtag>llm</tt:hashtag><tt:hashtag>openai</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/d6/74/d674e41f-7dd2-4fa4-b83d-5281e3650b6e.png"></img>Часто многие LLM требуют историю сообщений, чтобы лучше понимать контекст.]]></description><content:encoded><![CDATA[
  <figure id="N6Nm" class="m_column">
    <img src="https://img2.teletype.in/files/d6/74/d674e41f-7dd2-4fa4-b83d-5281e3650b6e.png" width="1792" />
  </figure>
  <p id="3RL7">Часто многие LLM требуют историю сообщений, чтобы лучше понимать контекст.</p>
  <p id="H80x">Так как передача истории сообщений довольно частая ситуация, то рассмотрим на примере:</p>
  <ol id="Fg2u">
    <li id="biL4">Как использовать State для определения схемы графа</li>
    <li id="TDnC">Как использовать reducers для управления обработкой обновлений состояния.</li>
  </ol>
  <p id="pqig"></p>
  <p id="8Xc9">Сперва установим библиотеки</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="1Scu" data-lang="bash">pip install -U langgraph langchain</pre>
  </section>
  <p id="T797"></p>
  <h2 id="5Wo6">Пример простого графа</h2>
  <p id="ZC3H">Состоянием (State) в LangGraph может быть <code>TypedDict</code>, <code>Pydantic</code> model или dataclass. Ниже мы будем использовать <code>TypedDict</code>.</p>
  <p id="SCp5"></p>
  <h3 id="LdEL">Определим State</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="9Bh1" data-lang="python">from langchain_core.messages import AnyMessage
from typing_extensions import TypedDict


class State(TypedDict):
    messages: list[AnyMessage]
    extra_field: int</pre>
  </section>
  <p id="e5Ln">В состоянии будем хранить историю сообщений.</p>
  <p id="LBgS"></p>
  <h3 id="O3Yk">Определим структуру графа</h3>
  <p id="7nbU">Давайте построим пример графа с одним узлом (node). Наш node - это просто функция Python, которая считывает состояние нашего графа и вносит в него изменения. Первым аргументом этой функции всегда будет состояние:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="pqBG" data-lang="python">from langchain_core.messages import AIMessage


def node(state: State):
    messages = state[&quot;messages&quot;]
    new_message = AIMessage(&quot;Hello!&quot;)
    return {&quot;messages&quot;: messages + [new_message], &quot;extra_field&quot;: 10}</pre>
  </section>
  <p id="tPts">Этот узел (node) просто добавляет сообщение в наш список сообщений и заполняет дополнительное поле. Как видим, мы храним всю историю сообщений и дополняем новым сообщением историю.</p>
  <p id="tP56"></p>
  <p id="IQ6N">Давайте далее определим простой граф, содержащий этот узел. Мы используем StateGraph для определения графа, который работает с этим состоянием. Затем мы используем <code>add_node</code> для заполнения нашего графа.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="5lcb" data-lang="python">from langgraph.graph import StateGraph

graph_builder = StateGraph(State)
graph_builder.add_node(node)
graph_builder.set_entry_point(&quot;node&quot;)
graph = graph_builder.compile()</pre>
  </section>
  <p id="9RTW"></p>
  <p id="0IzX">LangGraph предоставляет встроенные утилиты для визуализации вашего графа. Давайте рассмотрим наш граф.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="4jbq" data-lang="python">from IPython.display import Image, display

display(Image(graph.get_graph().draw_mermaid_png()))</pre>
  </section>
  <figure id="r21I" class="m_original">
    <img src="https://img2.teletype.in/files/5d/2b/5d2bb951-3c46-42ba-9c2c-03c253beec6c.png" width="107" />
  </figure>
  <p id="Hm8G"></p>
  <h3 id="jq1q">Использование графа</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="lk5o" data-lang="python">from langchain_core.messages import HumanMessage

result = graph.invoke({&quot;messages&quot;: [HumanMessage(&quot;Hi&quot;)]})
print(result)</pre>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="LvIP">{&#x27;messages&#x27;: [
HumanMessage(content=&#x27;Hi&#x27;, additional_kwargs={}, response_metadata={}),
AIMessage(content=&#x27;Hello!&#x27;, additional_kwargs={}, response_metadata={})
], &#x27;extra_field&#x27;: 10}</pre>
  </section>
  <p id="Qnv1"></p>
  <p id="ipJD">Для удобства мы часто проверяем содержимое объектов сообщений с помощью pretty-print:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="Zxn6" data-lang="python">for message in result[&quot;messages&quot;]:
    message.pretty_print()</pre>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="FLIf" data-lang="bash">========================== Human Message ============================

Hi
=========================== Ai Message ==============================

Hello!</pre>
  </section>
  <p id="8AdK"></p>
  <h2 id="pR9W">Обновление состояния графа с помощью редьюсеров (reducers)</h2>
  <p id="TqFf">Каждый ключ в состоянии может иметь свою собственную независимую функцию-reducer, которая управляет тем, как применяются обновления с узлов. Если функция-reducer явно не указана, то предполагается, что все обновления ключа должны переопределять ее.</p>
  <p id="41SC">Для схем состояний <code>TypedDict</code> мы можем определить reducer, снабдив соответствующее поле состояния аннотацией с помощью функции reducer.</p>
  <p id="KDPi">В предыдущем примере наш узел обновил ключ &quot;сообщения&quot; в состоянии, добавив к нему сообщение. Ниже мы добавим к этому ключу reducer, чтобы обновления добавлялись автоматически:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="Jpm5" data-lang="python">from typing_extensions import Annotated


def add(left: list[AnyMessage], right: list[AnyMessage]):
    return left + right


class State(TypedDict):
    messages: Annotated[list[AnyMessage], add]
    extra_field: int</pre>
  </section>
  <p id="2cuR"></p>
  <p id="Aylz">Теперь наш узел можно упростить:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="RklO" data-lang="python">def node(state: State):
    new_message = AIMessage(&quot;Hello!&quot;)
    return {&quot;messages&quot;: [new_message], &quot;extra_field&quot;: 10}</pre>
  </section>
  <p id="2vdF">Теперь наша объявленная функция <code>add</code> будет сама делать конкатенацию списков.</p>
  <p id="pztS"></p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="k66F" data-lang="python">from langgraph.graph import START


graph_builder = StateGraph(State)
graph = graph_builder.add_node(node).add_edge(START, &quot;node&quot;).compile()

result = graph.invoke({&quot;messages&quot;: [HumanMessage(&quot;Hi&quot;)]})

for message in result[&quot;messages&quot;]:
    message.pretty_print()</pre>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="4iTw" data-lang="bash">========================== Human Message ============================

Hi
=========================== Ai Message ==============================

Hello!</pre>
  </section>
  <p id="c0f8"></p>
  <h3 id="RYEz">MessagesState</h3>
  <p id="y61r">LangGraph имеет встроенный reducer <code>add_messages</code>, который обрабатывает эти соображения:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="CRVW" data-lang="python">from langgraph.graph.message import add_messages


class State(TypedDict):
    messages: Annotated[list[AnyMessage], add_messages]
    extra_field: int


def node(state: State):
    new_message = AIMessage(&quot;Hello!&quot;)
    return {&quot;messages&quot;: [new_message], &quot;extra_field&quot;: 10}


graph_builder = StateGraph(State)
graph = graph_builder.add_node(node).set_entry_point(&quot;node&quot;).compile()</pre>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="K8p6" data-lang="python">input_message = {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Hi&quot;}

result = graph.invoke({&quot;messages&quot;: [input_message]})

for message in result[&quot;messages&quot;]:
    message.pretty_print()</pre>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="KGlY" data-lang="bash">========================== Human Message ============================

Hi
=========================== Ai Message ==============================

Hello!</pre>
  </section>
  <p id="lSey"></p>
  <p id="zeVk">Это универсальное представление состояния для приложений, использующих модели чата. Для удобства в LangGraph встроен <code>MessagesState</code>, так что мы можем написать:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="yvaX" data-lang="python">from langgraph.graph import MessagesState


class State(MessagesState):
    extra_field: int</pre>
  </section>
  <p id="JzYe">Таким образом, данный MessageState сам делает структуру:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="gUCg" data-lang="python">class State(TypedDict):
    messages: Annotated[list[AnyMessage], add_messages]</pre>
  </section>
  <p id="6Uw1"></p>
  <p id="rVOV">А мы лишь дальше от него наследуемся и можем переиспользовать функционал. Чтобы вручную самим не объявлять.</p>
  <p id="FNqa"></p>
  <hr />
  <p id="XmlQ">✨<a href="https://dzen.ru/away?to=https%3A%2F%2Ft.me%2Fsmelkov_pro" target="_blank"><strong>Основной Telegram-канал со всеми обновлениями</strong></a>✨</p>
  <p id="5wLa"></p>
  <p id="I3WT">Вам также может понравиться:</p>
  <ul id="nQp2">
    <li id="D7OO"><a href="https://teletype.in/@smelkov_pro/haystack-intro" target="_blank">Введение в Haystack</a></li>
    <li id="vPRU"><a href="/@smelkov_pro/ai-agents-intro">Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</a></li>
    <li id="7nu9"><a href="https://dzen.ru/video/watch/66f6b4a7ad2d5367eefec6d8?share_to=link" target="_blank">Введение в библиотеку LangGraph</a></li>
  </ul>
  <p id="jXLw"></p>
  <p id="Ag2k"><a href="https://sig.skillspace.ru/l/backend-python-start" target="_blank">✔️ Обучение Python с нуля за 9 месяцев 🔝</a></p>
  <p id="lOHY"></p>
  <tt-tags id="mMC2">
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="ии">#ии</tt-tag>
    <tt-tag name="langchain">#langchain</tt-tag>
    <tt-tag name="langgraph">#langgraph</tt-tag>
    <tt-tag name="llm">#llm</tt-tag>
    <tt-tag name="openai">#openai</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/find-most-busy-directories</guid><link>https://teletype.in/@smelkov_pro/find-most-busy-directories?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/find-most-busy-directories?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Как найти наиболее используемое дисковое пространство в Linux Ubuntu</title><pubDate>Sat, 15 Feb 2025 17:16:56 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/67/1d/671d1104-74d0-45e4-a3bf-298c88cd7c1a.png"></media:content><category>DevOps</category><tt:hashtag>linux</tt:hashtag><tt:hashtag>devops</tt:hashtag><tt:hashtag>ubuntu</tt:hashtag><tt:hashtag>ncdu</tt:hashtag><tt:hashtag>du</tt:hashtag><tt:hashtag>clear</tt:hashtag><description><![CDATA[<img src="https://img1.teletype.in/files/02/10/02108abd-aa4d-4668-9686-cfa128bd799e.png"></img>Чтобы найти самые забитые папки в системе Ubuntu (или любой другой Linux-системе), можно использовать ...]]></description><content:encoded><![CDATA[
  <figure id="9r9P" class="m_column">
    <img src="https://img1.teletype.in/files/02/10/02108abd-aa4d-4668-9686-cfa128bd799e.png" width="1000" />
  </figure>
  <p id="73Mg">Чтобы найти самые <strong>забитые папки</strong> в системе Ubuntu (или любой другой Linux-системе), можно использовать команду <code>du</code> (disk usage).</p>
  <p id="kS4C"></p>
  <h3 id="uoKx">🔍 1. Найти топ-10 самых больших папок в <code>/</code></h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="uQxg" data-lang="bash">sudo du -ahx / | sort -rh | head -10</pre>
  </section>
  <p id="Fi1V"><strong>Объяснение:</strong></p>
  <ul id="5yRu">
    <li id="p0fG"><code>du -ahx /</code> — считает размер всех файлов и папок (<code>-a</code> показывает файлы, <code>-h</code> делает вывод в удобочитаемом формате, <code>-x</code> ограничивает поиск одним файловым системой).</li>
    <li id="tLzP"><code>sort -rh</code> — сортирует по размеру (<code>-r</code> по убыванию, <code>-h</code> в человекочитаемом формате).</li>
    <li id="mdmJ"><code>head -10</code> — выводит только <strong>топ-10 самых больших папок/файлов</strong>.</li>
  </ul>
  <p id="2LDl"></p>
  <h3 id="pj4r">📁 2. Найти самые большие папки в <code>/var</code> (или другом каталоге)</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="B4KB" data-lang="bash">sudo du -ahx /var | sort -rh | head -10</pre>
  </section>
  <p id="WSVr">Это полезно, если хотите проверить <code>/var</code> (где часто накапливаются логи, кэши и базы данных).</p>
  <p id="QmzH"></p>
  <h3 id="R3ez">📂 3. Найти самые большие каталоги без файлов (по папкам)</h3>
  <p id="A7Uj">Если вас интересуют <strong>только папки</strong>, без отдельных файлов:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ZFFf" data-lang="bash">sudo du -hx --max-depth=1 / | sort -rh | head -10</pre>
  </section>
  <p id="6vST"><strong>Здесь:</strong></p>
  <ul id="YcfF">
    <li id="Q3tH"><code>--max-depth=1</code> показывает только <strong>прямые подкаталоги</strong>, без вложенных.</li>
  </ul>
  <p id="I8sK"></p>
  <h3 id="pQql">🛠 4. Графическое отображение дискового пространства</h3>
  <p id="iv45">Если у вас есть доступ к графическому интерфейсу, можно установить <code>ncdu</code> — удобный терминальный инструмент:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ARpz" data-lang="bash">sudo apt install ncdu -y</pre>
  </section>
  <p id="6kXt">Запустите его:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="0l9K" data-lang="bash">sudo ncdu /</pre>
  </section>
  <p id="ZJ84">Вы увидите <strong>интерактивный интерфейс</strong>, где можно легко перемещаться по папкам и находить самые большие файлы.</p>
  <p id="z1jM"></p>
  <h3 id="9xok">🚀 5. Найти большие файлы (&gt;1 ГБ)</h3>
  <p id="6ppn">Если хотите искать <strong>только файлы, больше 1 ГБ</strong>, используйте:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="D6LK" data-lang="bash">sudo find / -type f -size +1G -exec ls -lh {} + | awk &#x27;{ print $9 &quot;: &quot; $5 }&#x27;</pre>
  </section>
  <p id="xxjw">Выведет список файлов и их размер.</p>
  <h3 id="eFx3"></h3>
  <h3 id="uqUl">❗ Полезные команды для поиска и очистки &quot;мусора&quot;:</h3>
  <ul id="pEUy">
    <li id="qc0m">Логи, кеши и временные файлы:</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="1obZ" data-lang="bash">sudo du -sh /var/log /var/tmp /var/cache</pre>
  </section>
  <p id="dZoM"></p>
  <ul id="PDPH">
    <li id="0048">Docker-контейнеры и образы (если используете Docker):</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="mFFm" data-lang="bash">docker system df</pre>
  </section>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="onr2" data-lang="bash">docker system prune -a # Очищает ненужные образы и контейнеры</pre>
  </section>
  <p id="EIqn"></p>
  <ul id="cMrP">
    <li id="lR6w">Неиспользуемые пакеты и кеши APT:</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="mbqZ" data-lang="bash">sudo apt autoremove -y
sudo apt clean</pre>
  </section>
  <p id="lh1h"></p>
  <ul id="n8jT">
    <li id="4RfE">Проверка папки пользователя (<code>/home</code> часто содержит много мусора):</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="yvNv" data-lang="bash">sudo du -sh /home/*</pre>
  </section>
  <p id="p4N1"></p>
  <p id="SlRT">💡 <strong>Вывод:</strong><br />Лучший способ быстро найти забитые папки — <code>du -ahx / | sort -rh | head -10</code>.<br />Если вам нужна интерактивность, используйте <code>ncdu</code>.</p>
  <p id="BLYF"></p>
  <hr />
  <p id="cv7b">На этом всё :) <a href="https://t.me/smelkov_pro" target="_blank">Подписывайтесь на телеграм канал</a>, чтобы не пропускать обновления. Также там публикую ссылки на воркшопы и вебинары.</p>
  <p id="paBL"></p>
  <p id="I3WT">Вам также может понравиться:</p>
  <ul id="JhZ3">
    <li id="HWz2"><a href="https://teletype.in/@smelkov_pro/initial-server-setup-ubuntu" target="_blank">Первоначальная настройка сервера Ubuntu</a></li>
    <li id="vPRU"><a href="/@smelkov_pro/ai-agents-intro">Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</a></li>
    <li id="7nu9"><a href="https://dzen.ru/video/watch/66f6b4a7ad2d5367eefec6d8?share_to=link" target="_blank">Введение в библиотеку LangGraph</a></li>
  </ul>
  <p id="DDfW"></p>
  <tt-tags id="Y1Nu">
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="devops">#devops</tt-tag>
    <tt-tag name="ubuntu">#ubuntu</tt-tag>
    <tt-tag name="ncdu">#ncdu</tt-tag>
    <tt-tag name="du">#du</tt-tag>
    <tt-tag name="clear">#clear</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/yandex-cloud-run-llama-3-1</guid><link>https://teletype.in/@smelkov_pro/yandex-cloud-run-llama-3-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/yandex-cloud-run-llama-3-1?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Запуск Llama 3.1 70b и 3.1 8b через Yandex облако</title><pubDate>Tue, 04 Feb 2025 12:34:28 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4c/08/4c081ec9-f761-4dd5-9cb1-d19963bd8201.png"></media:content><tt:hashtag>ai</tt:hashtag><tt:hashtag>ии</tt:hashtag><tt:hashtag>yandex</tt:hashtag><tt:hashtag>sdk</tt:hashtag><tt:hashtag>ml</tt:hashtag><tt:hashtag>llama</tt:hashtag><description><![CDATA[<img src="https://img3.teletype.in/files/2b/bf/2bbfd9b1-a1d9-48fa-b73f-082f6170cff8.jpeg"></img>Я уже ранее делал обзор библиотеки Yandex Cloud ML SDK для работы с YandexGPT и прочими инструментами. И Yandex облако добавили возможность использовать Llama 3.1 двух версий через их API.]]></description><content:encoded><![CDATA[
  <figure id="g1wN" class="m_column">
    <img src="https://img3.teletype.in/files/2b/bf/2bbfd9b1-a1d9-48fa-b73f-082f6170cff8.jpeg" width="1280" />
  </figure>
  <p id="Lixc">Я уже ранее делал <a href="https://teletype.in/@smelkov_pro/ya-ml-sdk-intro" target="_blank">обзор библиотеки Yandex Cloud ML SDK</a> для работы с YandexGPT и прочими инструментами. И Yandex облако добавили возможность использовать <a href="https://yandex.cloud/ru/docs/foundation-models/concepts/yandexgpt/models?utm_referrer=https%253A%252F%252Fyandex.ru%252F" target="_blank">Llama 3.1 двух версий через их API</a>.</p>
  <blockquote id="vGtD">Компания Meta признана в России экстремистской организацией и запрещены в РФ 21.03.2022</blockquote>
  <p id="EPco"></p>
  <p id="saVj">Я не буду вдаваться сильно в подробности работы с библиотекой, так как обзор уже делал ни раз. Вам потребуется знать id каталога внутри Yandex Cloud и API ключ для работы с AI.</p>
  <p id="zl4g"></p>
  <p id="swgw">Сначала импортируем нужные библиотеки и прочитаем ключи.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="1LHm" data-lang="python">import asyncio
import os

from dotenv import load_dotenv
from yandex_cloud_ml_sdk import AsyncYCloudML


load_dotenv()


yandex_folder_id = os.getenv(&#x27;YANDEX_FOLDER_ID&#x27;)
yandex_api_key = os.getenv(&#x27;YANDEX_AI_API_KEY&#x27;)


# Создание экземпляра SDK
sdk = AsyncYCloudML(folder_id=yandex_folder_id, auth=yandex_api_key)</pre>
  </section>
  <p id="M7IX"></p>
  <p id="pgar">Далее просто сделаем функцию, которая будет в консоли симулировать чат:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="V2c7" data-lang="python">async def main():
    model = sdk.models.completions(&#x27;llama&#x27;)
    model = model.configure(temperature=0.5)

    messages: list[dict[str, str] | str] = [
        {&#x27;role&#x27;: &#x27;system&#x27;, &#x27;text&#x27;: &#x27;Ты - Заботливый помощник&#x27;}
    ]

    while True:
        message = input(&#x27;User: &#x27;)
        if message == &#x27;стоп&#x27;:
            break
        messages.append(message)
        result = await model.run(messages)
        messages.append(result[0])
        print(&#x27;AI: &#x27;, result[0].text, &#x27;\n&#x27;)


if __name__ == &#x27;__main__&#x27;:
    asyncio.run(main())</pre>
  </section>
  <ul id="vBkf">
    <li id="WcX5"><code>&#x27;llama&#x27;</code> — отвечает за Llama 3.1 70b</li>
    <li id="Npsw"><code>&#x27;llama-lite&#x27;</code> — отвечает за Llama 3.1 8b</li>
  </ul>
  <p id="arhC">Меняя модель можно провести эксперименты, какая отвечает лучше.</p>
  <p id="JV76"></p>
  <hr />
  <p id="Kwqu"></p>
  <p id="cv7b">На этом всё :) <a href="https://t.me/smelkov_pro" target="_blank">Подписывайтесь на телеграм канал</a>, чтобы не пропускать обновления.</p>
  <p id="I3WT">Вам также может понравиться:</p>
  <ul id="FssK">
    <li id="R8Rm"><a href="/@smelkov_pro/ai-tunnel-review">Запуск моделей ChatGPT, Gemini, LLama без VPN через AITunnel</a></li>
    <li id="vPRU"><a href="/@smelkov_pro/ai-agents-intro">Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</a></li>
    <li id="7nu9"><a href="https://dzen.ru/video/watch/66f6b4a7ad2d5367eefec6d8?share_to=link" target="_blank">Введение в библиотеку LangGraph</a></li>
  </ul>
  <tt-tags id="3pyt">
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="ии">#ии</tt-tag>
    <tt-tag name="yandex">#yandex</tt-tag>
    <tt-tag name="sdk">#sdk</tt-tag>
    <tt-tag name="ml">#ml</tt-tag>
    <tt-tag name="llama">#llama</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/pinterest-api-get-tokens</guid><link>https://teletype.in/@smelkov_pro/pinterest-api-get-tokens?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/pinterest-api-get-tokens?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Как получить ключи Pinterest API v5</title><pubDate>Sun, 26 Jan 2025 06:47:24 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d4/f5/d4f51569-f5b9-4711-868f-9a03ef3a7ad6.png"></media:content><category>Backend</category><tt:hashtag>python</tt:hashtag><tt:hashtag>ai</tt:hashtag><tt:hashtag>pinterest</tt:hashtag><tt:hashtag>api</tt:hashtag><tt:hashtag>fastapi</tt:hashtag><description><![CDATA[<img src="https://img3.teletype.in/files/2a/d0/2ad035a3-aa38-419b-994c-29ba0f8e0941.png"></img>Всем, привет! В этой статье расскажу как я получал ключи доступа к Pinterest API, а именно accessToken и refreshToken. Ведь именно accessToken используется во всех эндпоинтах для авторизации и проверки валидности запросов.]]></description><content:encoded><![CDATA[
  <figure id="m8il" class="m_column">
    <img src="https://img3.teletype.in/files/2a/d0/2ad035a3-aa38-419b-994c-29ba0f8e0941.png" width="1280" />
  </figure>
  <p id="OKCi">Всем, привет! В этой статье расскажу как я получал ключи доступа к Pinterest API, а именно <code>accessToken</code> и <code>refreshToken</code>. Ведь именно <code>accessToken</code> используется во всех эндпоинтах для авторизации и проверки валидности запросов.</p>
  <p id="A1bW">Данная статья будет полезна тем, кто хочет автоматизировать свой аккаунт Pinterest и управлять им через API.</p>
  <p id="nc2g">Все примеры будут на языке Python, но эти шаги легко повторить на любом другом языке. Так как примеры очень легко читать и понимать.</p>
  <p id="743G"></p>
  <h2 id="Wr95">Регистрация приложения</h2>
  <p id="IzS5">Сперва Вам необходимо создать бизнес аккаунт и зарегистрировать приложение внутри Pinterest. После создания приложения у Вас будет доступно <strong>CLIENT ID</strong> и <strong>CLIENT SECRET</strong>.</p>
  <p id="gJix">Как это сделать написано в инструкции:</p>
  <p id="Y3mh"><a href="https://developers.pinterest.com/docs/getting-started/connect-app" target="_blank">https://developers.pinterest.com/docs/getting-started/connect-app</a></p>
  <p id="L93m"></p>
  <p id="CMl2">Скажу лишь, что для регистрации у Вас должен быть свой сайт с доменом и обязательно с Политикой конфиденциальности, чтобы пройти проверку.</p>
  <p id="xSN6">После создания приложения, у Вас будет отображаться примерно вот так:</p>
  <figure id="mwtW" class="m_column">
    <img src="https://img1.teletype.in/files/c2/b7/c2b7a9b7-703c-418c-bca0-a6e573b68df1.png" width="1142" />
  </figure>
  <p id="IPdj"></p>
  <p id="ywVG">Нажимаете на кнопку &quot;Управление&quot; и внутри найдёте нужные данные:</p>
  <figure id="xhMp" class="m_column">
    <img src="https://img4.teletype.in/files/3b/33/3b335546-1c2c-4261-986e-17c14c4572b4.png" width="816" />
  </figure>
  <ul id="lYQW">
    <li id="h1bk">&quot;Идентификатор приложения&quot; — CLIENT ID</li>
    <li id="OM1I">&quot;Секретный ключ приложения&quot; — CLIENT SECRET</li>
  </ul>
  <p id="eZJh"></p>
  <h2 id="3HER">Получение ключей (токенов) доступа</h2>
  <p id="K0KD">Получение ключей происходит в 3 этапа:</p>
  <ol id="XOwD">
    <li id="f3cw">Генерация ссылки на авторизацию, где обязательно необходимо передать <code>redirect_uri</code>, куда будет перенаправляться пользователь после успешной авторизации.</li>
    <li id="DtZx">Сервер, который будет доступен для <code>redirect_uri</code>. То есть именно здесь будет дальше приниматься запрос с кодом подтверждения</li>
    <li id="vDdk">После получения специального кода необходимо сделать последний запрос на получение ключей.</li>
  </ol>
  <p id="nEnv"></p>
  <h3 id="XxJU">Этап 1</h3>
  <p id="BY12">На этой этапе необходимо просто сформировать URL, по которому будет происходить авторизация через Pinterest.</p>
  <p id="gvgZ">Здесь нам понадобится только CLIENT ID.</p>
  <p id="ET0T">Сперва создадим конфиг с нужными данными:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="6kTW" data-lang="python">class PinterestConfig:
    def __init__(self):
        load_dotenv()  # Загружаем переменные окружения
        self.client_id = os.getenv(&#x27;PINTEREST_CLIENT_ID&#x27;)
        self.client_secret = os.getenv(&#x27;PINTEREST_CLIENT_SECRET&#x27;)
        self.redirect_uri = os.getenv(&#x27;PINTEREST_REDIRECT_URI&#x27;, &#x27;http://localhost:8000/callback&#x27;)


config = PinterestConfig()</pre>
  </section>
  <p id="VtiR">В моём примере <code>PINTEREST_REDIRECT_URI = &#x27;<a href="http://localhost:8000/callback" target="_blank">http://localhost:8000/callback</a>&#x27;</code></p>
  <p id="aXOL">Так как я тестирую всё локально.</p>
  <p id="JNPQ"></p>
  <p id="IDap">Сразу скажу, чтобы всё сработало, то внутри своего приложения на сайте Pinterest необходимо этот URI добавить в разрешённые.</p>
  <p id="TWTf">Аналогично заходит в Управление своим приложением и ищем пункт &quot;URI перенаправления&quot; и добавляем новый:</p>
  <figure id="rlSl" class="m_column">
    <img src="https://img2.teletype.in/files/9b/4f/9b4f7c86-7353-455f-9db8-d2997e02f2e8.png" width="805" />
  </figure>
  <p id="wB1n"></p>
  <p id="7Cov">Далее формируем URL авторизации:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="G9sH" data-lang="python">client_id = config.client_id
redirect_uri = config.redirect_uri

print(f&#x27;https://www.pinterest.com/oauth/?response_type=code&amp;client_id={client_id}&amp;redirect_uri={urllib.parse.quote(redirect_uri)}&amp;scope=pins:read,pins:write,boards:read&#x27;)</pre>
  </section>
  <ul id="YzJq">
    <li id="txwQ"><code>response_type=code</code> — говорит нам о том, что нам нужен код для авторизации. Это просто будет некоторая рандомная строка, где мы будем подтверждать, что это мы всё запросили.</li>
    <li id="AKJi">Обратите внимание на <code>scope</code>. Он отвечает за то, на какие права мы рассчитываем. Собираемся мы управлять пинами, или досками, или ещё чем. Здесь надо это всё указать.</li>
  </ul>
  <p id="e5nO">Полный список значений для <code>scope</code> можно прочитать по ссылке:</p>
  <p id="bffE"><a href="https://developers.pinterest.com/docs/getting-started/set-up-authentication-and-authorization/#choose-scopes" target="_blank">https://developers.pinterest.com/docs/getting-started/set-up-authentication-and-authorization/#choose-scopes</a></p>
  <p id="aMai"></p>
  <h3 id="u3nP">Этап 2. Сервер для redirect_uri</h3>
  <p id="qmHn">Ссылка для авторизации у нас есть. Но теперь после авторизации мы будем куда-то перенаправляться. Я для примера написал простой сервер на FastAPI, который будет доступен для принятия данных:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="7RK5" data-lang="python">import aiohttp
import base64
import os
import uvicorn

from dotenv import load_dotenv
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware


class PinterestConfig:
    def __init__(self):
        load_dotenv()  # Загружаем переменные окружения
        self.client_id = os.getenv(&#x27;PINTEREST_CLIENT_ID&#x27;)
        self.client_secret = os.getenv(&#x27;PINTEREST_CLIENT_SECRET&#x27;)
        self.redirect_uri = os.getenv(&#x27;PINTEREST_REDIRECT_URI&#x27;, &#x27;http://localhost:8000/callback&#x27;)
        self.api_version = &#x27;v5&#x27;  # Актуальная версия API
        self.base_url = f&#x27;https://api.pinterest.com/{self.api_version}/&#x27;


config = PinterestConfig()


app = FastAPI()

@app.get(&quot;/callback&quot;)
async def cb(request: Request):
    code = request.query_params.get(&#x27;code&#x27;, None)
	print(&#x27;Полученный код: &#x27;, code)
    return {&quot;status&quot;: &quot;ok&quot;}


app.add_middleware(
    CORSMiddleware,
    allow_origins=[&quot;*&quot;],
    allow_credentials=True,
    allow_methods=[&quot;*&quot;],
    allow_headers=[&quot;*&quot;],
    expose_headers=[&quot;set-cookie&quot;]
)


if __name__ == &quot;__main__&quot;:
    try:
        uvicorn.run(app, host=&quot;0.0.0.0&quot;, port=8000)
    except Exception as err:
        print(&#x27;Error starting server&#x27;, err)
        exit(1)</pre>
  </section>
  <p id="oI5c">Как видим, наш сервер будет запущен на порту 8000 и у него есть соответствующий <code>/callback</code> роут.</p>
  <p id="QM7F"></p>
  <p id="2Ppp">Теперь у нас 2 этапа позади и Вы сможете перейти по ссылке, сгенерированной на шаге 1, запустив предварительно сервер на шаге 2. И в итоге видите присланный код.</p>
  <p id="ZHcI">Осталось дело за малым. Нам надо получить ключи (токены доступа). Переходим к финальному шагу.</p>
  <p id="WMFh"></p>
  <h3 id="RC4v">Этап 3. Получение ключей доступа</h3>
  <p id="aAKE">Основные шаги расписаны в документации:</p>
  <p id="qSAg"><a href="https://developers.pinterest.com/docs/getting-started/set-up-authentication-and-authorization/#generate-an-access-token" target="_blank">https://developers.pinterest.com/docs/getting-started/set-up-authentication-and-authorization/#generate-an-access-token</a></p>
  <p id="Alqq"></p>
  <p id="NJGG">В зависимости от метода авторизации выбирается один из вариантов. Мы выбрали получение кода авторизации.</p>
  <p id="04hD"></p>
  <p id="hLPe">Давайте теперь его получим:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="bcUh" data-lang="python">@app.get(&quot;/callback&quot;)
async def cb(request: Request):
    code = request.query_params.get(&#x27;code&#x27;, None)
	print(&#x27;Полученный код: &#x27;, code)

    if code:
	    auth_secret = f&quot;{config.client_id}:{config.client_secret}&quot;
	    auth_header = f&#x27;Basic {base64.b64encode(auth_secret.encode(&quot;utf-8&quot;)).decode()}&#x27;

        async with aiohttp.ClientSession(headers={&#x27;Authorization&#x27;: auth_header}) as session:
            form_data = aiohttp.FormData()
            form_data.add_field(&#x27;grant_type&#x27;, &#x27;authorization_code&#x27;)
            form_data.add_field(&#x27;code&#x27;, code)
            form_data.add_field(&#x27;redirect_uri&#x27;, config.redirect_uri)

            async with session.post(f&#x27;https://api.pinterest.com/v5/oauth/token&#x27;, data=form_data) as response:
                try:
                    response.raise_for_status()
                    response_data = await response.json()
                    print(&#x27;response_data&#x27;, response_data)
                except Exception as err:
                    print(&#x27;auth error&#x27;, err)

    return {&quot;status&quot;: &quot;ok&quot;}</pre>
  </section>
  <ul id="Aiy5">
    <li id="kUYk"><code><strong>auth_secret</strong></code> — Сначала формируем специальную строку, состоящую из CLIENT ID и CLIENT SECRET</li>
    <li id="Gqjp"><code>auth_header</code> — потом преобразовываем наш <code><strong>auth_secret</strong></code> в base64 закодированную строку</li>
    <li id="s9wA">Данные передаём как FormData. Указываем:</li>
    <ul id="03XG">
      <li id="iBL1"><code>grant_type</code> — метод авторизации. Мы выбрали получение кода. <code>&#x27;authorization_code&#x27;</code></li>
      <li id="mSjy"><code>code</code> — полученный код авторизации</li>
      <li id="gFOx"><code>redirect_uri</code> — URL перенаправления, который мы указывали, когда формировали строку авторизации на этапе 1. Важно его сюда передавать.</li>
    </ul>
  </ul>
  <p id="7rhN"></p>
  <p id="IKE0">В результате Вы получите в ответ вот такой JSON:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="INQm" data-lang="jsx">{
  &#x27;access_token&#x27;: &#x27;pina_....&#x27;,
  &#x27;refresh_token&#x27;: &#x27;pinr......&#x27;,
  &#x27;response_type&#x27;: &#x27;authorization_code&#x27;,
  &#x27;token_type&#x27;: &#x27;bearer&#x27;,
  &#x27;expires_in&#x27;: 2592000,
  &#x27;refresh_token_expires_in&#x27;: 31536000,
  &#x27;scope&#x27;: &#x27;boards:read pins:read pins:write&#x27;
}</pre>
  </section>
  <p id="djcb"></p>
  <p id="hwHn">На этом всё :)</p>
  <p id="oV1y"></p>
  <hr />
  <p id="NTNy"></p>
  <p id="Yd22">Друзья, подписывайтесь на мой основной Telegram-канал и не пропускайте всех обновлений :)</p>
  <p id="7KQo">✨<a href="https://t.me/smelkov_pro" target="_blank"><strong>Основной Telegram-канал со всеми обновлениями</strong></a>✨</p>
  <p id="YLz3"></p>
  <h2 id="NBi1">Вам также может быть полезно:</h2>
  <ul id="qkew">
    <li id="B5gX"><a href="https://teletype.in/@smelkov_pro/ai-agents-intro" target="_blank">Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</a></li>
    <li id="gJrd"><a href="https://teletype.in/@smelkov_pro/haystack-intro" target="_blank">Введение в Haystack</a></li>
    <li id="TkNn"><a href="https://dzen.ru/a/Z4JakslrGRqSEIW8" target="_blank">Руководство по Pandas Series</a></li>
  </ul>
  <p id="MW24"></p>
  <h2 id="A4gz">Другие соц. сети:</h2>
  <ul id="gs9L">
    <li id="b9Wt"><a href="https://dzen.ru/smelkov_pro" target="_blank">Dzen</a></li>
    <li id="9BqP"><a href="https://vk.com/smelkov_pro" target="_blank">Вконтакте</a></li>
    <li id="vlOo"><a href="https://www.youtube.com/@smelkov_pro" target="_blank">Youtube</a></li>
    <li id="b4Cf"><a href="https://rutube.ru/channel/47718698/" target="_blank">Rutube</a></li>
  </ul>
  <p id="13wo"></p>
  <tt-tags id="Fj3t">
    <tt-tag name="python">#python</tt-tag>
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="pinterest">#pinterest</tt-tag>
    <tt-tag name="api">#api</tt-tag>
    <tt-tag name="fastapi">#fastapi</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/haystack-intro</guid><link>https://teletype.in/@smelkov_pro/haystack-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/haystack-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Введение в Haystack</title><pubDate>Wed, 15 Jan 2025 09:47:40 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/28/57/2857aac7-e536-41ad-b364-2f12760edb45.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/ee/9c/ee9cc552-61a3-4826-a28e-e62296185fdb.png"></img>Haystack — это платформа с открытым исходным кодом для создания готовых к работе приложений LLM, конвейеров генерации с расширенным поиском (RAG) и современных поисковых систем, которые интеллектуально работают с большими коллекциями документов.]]></description><content:encoded><![CDATA[
  <figure id="eY1q" class="m_column">
    <img src="https://img3.teletype.in/files/ee/9c/ee9cc552-61a3-4826-a28e-e62296185fdb.png" width="1024" />
  </figure>
  <p id="hhCz"><a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2F" target="_blank"><strong>Haystack</strong></a> — это платформа с открытым исходным кодом для создания готовых к работе приложений LLM, конвейеров генерации с расширенным поиском (RAG) и современных поисковых систем, которые интеллектуально работают с большими коллекциями документов.</p>
  <p id="MNcQ">Она позволяет быстро опробовать новейшие модели искусственного интеллекта, оставаясь при этом гибкой и простой в использовании. Вдохновляющее сообщество пользователей и разработчиков помогло превратить Haystack в модульную, интуитивно понятную и завершенную платформу, которой она является сегодня.</p>
  <p id="CMkS"></p>
  <h2 id="razrabotka_s_haystack">Разработка с Haystack</h2>
  <p id="XhTp"><strong>Haystack</strong> предлагает полный набор инструментов для разработки самых современных систем искусственного интеллекта, использующих LLM.</p>
  <ul id="0rmb">
    <li id="X6ga">Использование моделей, размещенных на таких платформах, как <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fhuggingface" target="_blank">Hugging Face</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fopenai" target="_blank">OpenAI</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fcohere" target="_blank">Cohere</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fmistral" target="_blank">Mistral</a> <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%3Ftype%3DModel%2BProvider" target="_blank">и других</a>.</li>
    <li id="OjpA">Использование моделей, развернутых в <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.aws.amazon.com%2Fsagemaker%2Flatest%2Fdg%2Fwhatis.html" target="_blank">SageMaker</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Famazon-bedrock" target="_blank">Bedrock</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fazure" target="_blank">Azure</a> …</li>
    <li id="NXOD">Встроенные хранилища документов: <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fopensearch-document-store%2F" target="_blank">OpenSearch</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fpinecone-document-store" target="_blank">Pinecone</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fweaviate-document-store" target="_blank">Weaviate</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%2Fqdrant-document-store" target="_blank">QDrant</a> <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%3Ftype%3DDocument%2BStore" target="_blank">и другие</a>.</li>
    <li id="6hzf">Растущая <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations" target="_blank">экосистема интеграции с сообществом</a> предоставляет инструменты для <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%3Ftype%3DEvaluation%2BFramework" target="_blank">оценки</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%3Ftype%3DMonitoring%2BTool" target="_blank">мониторинга</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations%3Ftype%3DData%2BIngestion" target="_blank">обработки данных</a> и всех уровней вашего приложения LLM.</li>
  </ul>
  <figure id="OjGR" class="m_column">
    <img src="https://img1.teletype.in/files/cc/e7/cce79612-acdf-463c-9eed-ae679cd66ebc.png" width="696" />
  </figure>
  <h3 id="nekotore_primer_togo_chto_v_mojete_so">Некоторые примеры того, что вы можете создать, включают:</h3>
  <ul id="Uzup">
    <li id="vrB3"><strong>Усовершенствованный RAG</strong> на основе вашего собственного источника данных, основанный на новейших технологиях поиска и генерации</li>
    <li id="zVhj"><strong>Чат-боты и агенты</strong>, работающие на базе передовых генерирующих моделей, таких как GPT-4, которые могут даже вызывать внешние функции и сервисы</li>
    <li id="E5sW"><strong>Генеративный мультимодальный ответ на вопрос</strong> на основе базы знаний, содержащей смешанные типы информации: изображения, текст, аудио и таблицы</li>
    <li id="8uKO"><strong>Извлечение информации</strong> из документов для заполнения вашей базы данных или построения графа знаний</li>
  </ul>
  <p id="OIQI">Это лишь небольшая часть систем, которые могут быть созданы в Haystack.</p>
  <p id="fECa"></p>
  <h2 id="kompleksnaya_fynkcionalnost_dlya_vashego">Комплексная функциональность для вашего проекта LLM</h2>
  <p id="e2gG">Для успешного проекта в LLM требуется нечто большее, чем просто языковые модели. Являясь сквозным фреймворком, Haystack помогает вам на каждом этапе создания вашей системы:</p>
  <ul id="pbOT">
    <li id="DsHS">Плавное включение моделей от Hugging Face или других поставщиков в ваш Pipeline</li>
    <li id="WXxi">Интегрируйте источники данных для расширения поиска <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Flinkcontentfetcher" target="_blank">из любой точки Интернета</a></li>
    <li id="4Bk3">Расширенные динамические шаблоны для запросов LLM с помощью языка шаблонов Jinja2</li>
    <li id="7zog"><a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Fdocumentcleaner" target="_blank">Функции очистки и предварительной обработки</a> для различных форматов и источников данных</li>
    <li id="jT4r"><a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fdocument_store" target="_blank">Интеграция с вашим предпочтительным хранилищем документов</a>: поддерживайте актуальность ваших приложений GenAI с помощью конвейеров индексации Haystack, которые помогают вам подготавливать и поддерживать ваши данные</li>
    <li id="LmfH"><a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Fmodel-based-evaluation" target="_blank">Специализированные инструменты оценки</a>, которые используют различные показатели для оценки всей системы или ее отдельных компонентов</li>
    <li id="w8tA"><a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Fhayhooks" target="_blank">Модуль Hayhooks</a> для обслуживания конвейеров Haystack через конечные точки HTTP</li>
    <li id="fNrx">Настраиваемая <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Flogging" target="_blank">система ведения журнала (логгирования)</a>, которая поддерживает структурированное ведение журнала и отслеживание корреляции &quot;из коробки&quot;.</li>
    <li id="sKrD"><a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Ftracing" target="_blank">Инструментарий для обработки кода, собирающий данные о промежутках и трассировках</a> в стратегических точках пути выполнения, с поддержкой открытой телеметрии и Datadog, которые уже установлены</li>
  </ul>
  <p id="D9pG">Но это еще не все: <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Fmodel-based-evaluation" target="_blank">фильтрация метаданных</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Fdevice-management" target="_blank">управление устройствами для локально запущенных моделей</a>, даже продвинутые методы RAG, такие как внедрение <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fv2.0%2Fdocs%2Fhypothetical-document-embeddings-hyde" target="_blank">гипотетических документов</a> (HyDE). Чего бы ни пожелал ваш искусственный интеллект, вы, скорее всего, найдете это в Haystack.</p>
  <figure id="xrLt" class="m_column">
    <img src="https://img1.teletype.in/files/02/b9/02b95dc3-e7ee-4710-9d19-5e4e9f32846b.png" width="713" />
  </figure>
  <h2 id="vstroenne_bloki"></h2>
  <h2 id="fNCn">Встроенные блоки</h2>
  <p id="glZN"><strong>Haystack</strong> использует две основные концепции, которые помогут вам создавать полностью функциональные и настраиваемые комплексные системы GenAI.</p>
  <p id="pqYa"></p>
  <h3 id="komponent_components">Компоненты (Components)</h3>
  <p id="JWrD">В основе Haystack лежат его <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fcomponents_overview%23components" target="_blank">компоненты</a>, которые могут выполнять такие задачи, как <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fretrievers" target="_blank">поиск документов</a>, <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fgenerators" target="_blank">генерация текста</a> или <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fembedders" target="_blank">создание embeddings</a>. Один компонент уже достаточно мощный. Он может управлять локальными языковыми моделями или взаимодействовать с размещенной моделью через API.</p>
  <p id="O1lA">Хотя Haystack предлагает множество компонентов, которые вы можете использовать &quot;из коробки&quot;, он также позволяет создавать <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fcustom-components" target="_blank">собственные пользовательские компоненты</a> — так же просто, как написать класс на Python. Ознакомьтесь с <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fintegrations" target="_blank">коллекцией интеграций</a>, включающей пользовательские компоненты, разработанные нашими партнерами и сообществом, которые вы можете свободно использовать.</p>
  <p id="n2gz">Вы можете соединять компоненты вместе для создания <em>конвейеров (pipelines)</em>, которые являются основой архитектуры приложений LLM в Haystack.</p>
  <p id="zQV6"></p>
  <h3 id="konveiier_pipelines">Конвейеры (Pipelines)</h3>
  <p id="V01o"><a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2Fdocs%2Fpipelines" target="_blank">Pipelines</a> — это мощные абстракции, которые позволяют вам определять поток данных в вашем LLM-приложении. Они состоят из компонентов.</p>
  <p id="B09i">Как разработчик, вы имеете полный контроль над тем, как расположить компоненты в конвейере. Конвейеры (Pipelines) могут разветвляться, объединяться, а также возвращаться к другому компоненту. Вы можете создавать конвейеры (Pipelines) Haystack, которые могут повторять попытку, возвращаться к циклу и, возможно, даже работать непрерывно как служба.</p>
  <p id="8YGZ">Конвейеры (Pipelines), по сути, представляют собой графики или даже мультиграфы. Один компонент с несколькими выходами может подключаться к другому компоненту с несколькими входами или к нескольким компонентам, благодаря гибкости конвейеров.</p>
  <p id="jsew">Чтобы вы могли начать, Haystack предлагает <a href="https://dzen.ru/away?to=https%3A%2F%2Fgithub.com%2Fdeepset-ai%2Fhaystack-cookbook" target="_blank">множество примеров конвейеров</a> для различных вариантов использования: индексация, агентный чат, RAG, контроль качества, вызов функций, веб-поиск и многое другое.</p>
  <p id="p2gn"></p>
  <h2 id="dlya_kogo_eeto">Для кого это?</h2>
  <p id="dwVw"><strong>Haystack</strong> предназначен для всех, кто хочет создавать приложения с искусственным интеллектом, — как для энтузиастов, так и для новичков. Вам не нужно разбираться в том, как работают модели. Все, что вам нужно, - это базовые знания Python, чтобы сразу погрузиться в работу.</p>
  <p id="oEKh"></p>
  <h2 id="polezne_sslki_po_haystack">Полезные ссылки по Haystack</h2>
  <ul id="Q1z2">
    <li id="cibO">Начните готовить с помощью <a href="https://dzen.ru/away?to=https%3A%2F%2Fgithub.com%2Fdeepset-ai%2Fhaystack-cookbook" target="_blank">готовых Colab notebooks</a></li>
    <li id="tBt6">Учитесь в интерактивном режиме с помощью <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Ftutorials" target="_blank">пошаговых инструкций</a></li>
    <li id="royb">Взгляните на <a href="https://dzen.ru/away?to=https%3A%2F%2Fdocs.haystack.deepset.ai%2F" target="_blank">документацию</a></li>
    <li id="IKcv">Основной <a href="https://dzen.ru/away?to=https%3A%2F%2Fhaystack.deepset.ai%2Fblog" target="_blank">блог</a></li>
    <li id="UkNF"><a href="https://dzen.ru/away?to=https%3A%2F%2Fgithub.com%2Fdeepset-ai%2Fhaystack" target="_blank">Github репозиторий</a></li>
  </ul>
  <p id="JrCr"></p>
  <h2 id="vam_mojet_bt_polezno">Вам может быть полезно</h2>
  <ul id="SP9F">
    <li id="IKBn"><a href="https://dzen.ru/a/Z4S-A0xpi2l8gXz3" target="_blank">Топ-5 фреймворков GraphRAG для улучшенного поиска с помощью искусственного интеллекта</a></li>
    <li id="hBQl"><a href="https://teletype.in/@smelkov_pro/ai-agents-intro" target="_blank">Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</a></li>
  </ul>
  <p id="fsG0"></p>
  <p id="yCbi">✨<a href="https://dzen.ru/away?to=https%3A%2F%2Ft.me%2Fsmelkov_pro" target="_blank"><strong>Основной Telegram-канал со всеми обновлениями</strong></a>✨</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/ya-ml-sdk-intro</guid><link>https://teletype.in/@smelkov_pro/ya-ml-sdk-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/ya-ml-sdk-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Обзор Yandex Cloud ML SDK</title><pubDate>Mon, 06 Jan 2025 10:48:56 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/f1/6a/f16adb01-e60e-45a8-adc1-67e45a6ea4b1.png"></media:content><category>AI</category><tt:hashtag>ai</tt:hashtag><tt:hashtag>ии</tt:hashtag><tt:hashtag>yandex</tt:hashtag><tt:hashtag>sdk</tt:hashtag><tt:hashtag>ml</tt:hashtag><description><![CDATA[<img src="https://img4.teletype.in/files/76/f3/76f3d30a-e92e-4317-90c2-a058d091bb22.png"></img>Эта библиотека Python предоставляет простой и эффективный набор для разработки программного обеспечения (SDK) для взаимодействия с облачными сервисами машинного обучения Яндекса. SDK устраняет сложности необработанных вызовов gRPC, упрощая разработчикам интеграцию облачных функций в свои приложения.]]></description><content:encoded><![CDATA[
  <figure id="COqF" class="m_column">
    <img src="https://img4.teletype.in/files/76/f3/76f3d30a-e92e-4317-90c2-a058d091bb22.png" width="1280" />
  </figure>
  <p id="ybzx">Эта библиотека Python предоставляет простой и эффективный набор для разработки программного обеспечения (SDK) для взаимодействия с облачными сервисами машинного обучения Яндекса. SDK устраняет сложности необработанных вызовов gRPC, упрощая разработчикам интеграцию облачных функций в свои приложения.</p>
  <p id="0wfR">Yandex Cloud ML SDK предоставляет простой в использовании интерфейс для доступа к сервисам Yandex Cloud ML. В настоящее время он поддерживает:</p>
  <ul id="QxcS">
    <li id="ge4Q">Генерацию текста с <a href="https://yandex.cloud/ru/docs/foundation-models/concepts/yandexgpt/models" target="_blank">использованием любой поддерживаемой модели</a></li>
    <li id="1ulY">Генерацию изображений с помощью <a href="https://yandex.cloud/ru/docs/foundation-models/concepts/yandexart/models" target="_blank">YandexART</a></li>
    <li id="htIU">Помощников с искусственным интеллектом и управление файлами (Assistant API)</li>
    <li id="DF9D">Работу с <a href="https://yandex.cloud/ru/docs/foundation-models/concepts/embeddings" target="_blank">эмбеддингами</a> (embeddings)</li>
  </ul>
  <p id="6Snp">Библиотека имеет как синхронный режим выполнения, так и асинхронный.</p>
  <p id="XrYp">Для установки библиотеки можно выполнить команду:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="IKX3">pip install yandex-cloud-ml-sdk</pre>
  </section>
  <p id="8ajx"></p>
  <h3 id="P7HW">Как начать пользоваться</h3>
  <p id="qvF2">Для начала Вам потребуется <code>folder_id</code> и <code>API-ключ</code>. Для получения API ключа необходимо создать сервисный аккаунт и подключить необходимые роли для работы с AI. В тестовом примере я создал сервисный аккаунт с полными админ правами для доступа к AI.</p>
  <p id="qq7v">Где брать folder_id и как создавать сервисный аккаунт, <a href="https://teletype.in/@smelkov_pro/yandexgpt-part1" target="_blank">я уже рассматривал ранее в статье</a>.</p>
  <p id="6rg6"></p>
  <p id="zxcR">Далее просто импортируем библиотеку и создаём экземпляр для работы с API:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ziBW" data-lang="python">from yandex_cloud_ml_sdk import AsyncYCloudML


yandex_folder_id = &#x27;&lt;folder id&gt;&#x27;
yandex_api_key = &#x27;&lt;api key&gt;&#x27;


# Создание экземпляра SDK
sdk = AsyncYCloudML(folder_id=yandex_folder_id, auth=yandex_api_key)</pre>
  </section>
  <p id="k2gh">Всё, теперь можем пользоваться и экспериментировать)</p>
  <p id="0lp9"></p>
  <h4 id="Chat-Completions">Chat Completions</h4>
  <p id="Jzcp">Данная секция, конечно, подразумевает работу с YandexGPT. Для демонстрации примера работы я написал простой бесконечный цикл общения, пока пользователь не пожелает остановить:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="clvh" data-lang="python">model = sdk.models.completions(&#x27;yandexgpt&#x27;)
model = model.configure(temperature=0.5)

messages: list[dict[str, str] | str] = [
    {&#x27;role&#x27;: &#x27;system&#x27;, &#x27;text&#x27;: &#x27;Ты - Заботливый помощник&#x27;}
]

while True:
    message = input(&#x27;User:&#x27;)
    if message == &#x27;стоп&#x27;:
        break
    messages.append(message)
    result = await model.run(messages)
    messages.append(result[0])
    print(&#x27;AI:&#x27;, result[0].text, &#x27;\n&#x27;)</pre>
    <p id="nbP7">Результат работы будет выглядеть следующим образом:</p>
    <pre id="NzRx">User: привет
AI: Здравствуйте! Чем могу помочь? 

User: Кто был главным на Руси?
AI: Главным на Руси был великий князь. 

User: стоп</pre>
  </section>
  <p id="WnUy">Как видим, результат ничем не отличается <a href="https://teletype.in/@smelkov_pro/yandexgpt-part1" target="_blank">от обычного использования YandexGPT API напрямую</a>, но значительно делает красивее и удобнее код.</p>
  <p id="RBPW"></p>
  <h4 id="Генерация-изображений-(image-generation)">Генерация изображений (image generation)</h4>
  <p id="pGTj">Данная секция посвящена использованию YandexART. Как аналог для Midjourney Вы можете теперь генерировать высококачественные изображения по текстовому описанию:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="x1fY" data-lang="python">model = sdk.models.image_generation(&#x27;yandex-art&#x27;)

# Конфигурация модели
model = model.configure(width_ratio=2, height_ratio=3, seed=150)</pre>
  </section>
  <ul id="YzK4">
    <li id="1m29">С помощью <code>width_ratio</code> и <code>height_ratio</code> можете конфигурировать размеры изображения под разные цели.</li>
    <li id="Y1bP">Параметр <code>seed</code> отвечает лишь за то, будет для данного числа и одинаковых промтов одинаковый результат или нет. Он необязательный. Если удалить, то рандомное число будет по умолчанию и изображения всегда будут разными.</li>
  </ul>
  <p id="yys8"></p>
  <p id="W8vo">Как генерировать изображение:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="oZM7" data-lang="python">operation = await model.run_deferred(&#x27;Подарочная открытка с изображением корги в стиле Pixar на лаймовом фоне, держит в лапках букет цветов&#x27;)
result = await operation
print(result)</pre>
  </section>
  <p id="IjB8"></p>
  <p id="BSS8">Для отображения результата в Jupyter Notebook можно использовать следующий код:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="gkbQ" data-lang="python">from IPython.display import Image, display

display(Image(result.image_bytes, width=200, height=800))</pre>
  </section>
  <figure id="cbwh" class="m_original">
    <img src="https://img2.teletype.in/files/d4/d7/d4d78777-51b9-48f3-8c9e-8969e01ee487.png" width="438" />
  </figure>
  <p id="MzAp">Результат Вы увидите как показано выше.</p>
  <p id="9Se1"></p>
  <h4 id="Ассистенты-(Assistant-API)">Ассистенты (Assistant API)</h4>
  <p id="8Up7">Ассистенты стали популярны благодаря OpenAI Assistant API. Смысл в том, чтобы единоразово загрузить ему инструкции, базу знаний и дальше он сам будет понимать, когда запрос относится к инструкции, а когда надо пойти в базу знаний и найти нужный ответ на вопрос пользователя.</p>
  <p id="s3Qn">А ещё главным преимуществом ассистентов является то, что не нужно каждый раз передавать всю историю сообщений. В обычном Chat Completion как вы помните мы передаём всю историю сообщений, чтобы модель учитывала контекст.</p>
  <p id="TXvg">Ассистенты же, напротив, принимают сообщение и сами хранят историю. И в результате возвращают только ответ.</p>
  <p id="sHUM"></p>
  <p id="DNP5"><u>Разберём сначала простые операции с ассистентами:</u></p>
  <ul id="yhcc">
    <li id="Ac6f">Создание ассистента</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="CLlh" data-lang="python">assistant = await sdk.assistants.create(
    &#x27;yandexgpt&#x27;,
    ttl_days=1,
    expiration_policy=&#x27;static&#x27;,
    temperature=0.5,
    max_prompt_tokens=50,
)
print(f&quot;{assistant=}&quot;)</pre>
    <p id="WrIj">Вывод:</p>
    <pre id="Bz0M" data-lang="bash">assistant=AsyncAssistant(
  id=&#x27;fvt90pe2jrisf2...&#x27;,
  expiration_config=ExpirationConfig(ttl_days=1, expiration_policy=&lt;ExpirationPolicy.STATIC: 1&gt;),
  model=AsyncGPTModel(uri=gpt://...gn7ort.../yandexgpt/latest, config=GPTModelConfig(temperature=0.5, max_tokens=None)),
  instruction=None, max_prompt_tokens=50,
  tools=(),
  name=None, description=None,
  created_by=&#x27;aje5i2cktiqs...&#x27;,
  created_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
  updated_by=&#x27;aje5i2cktiqsq...&#x27;,
  updated_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
  expires_at=datetime.datetime(2024, 11, 22, 12, 10, 1, 934024),
  labels=None
)</pre>
  </section>
  <p id="xzqp"></p>
  <ul id="tzrz">
    <li id="vlfb">Получение по ID</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="L4R8" data-lang="python">assistant2 = await sdk.assistants.get(assistant.id)
print(f&quot;same {assistant2=}&quot;)</pre>
    <p id="YIxC">Вывод:</p>
    <pre id="2NJp" data-lang="bash">assistant2=AsyncAssistant(
  id=&#x27;fvt90pe2jrisf2...e&#x27;,
  expiration_config=ExpirationConfig(ttl_days=1, expiration_policy=&lt;ExpirationPolicy.STATIC: 1&gt;),
  model=AsyncGPTModel(uri=gpt://...ugn7.../yandexgpt/latest, config=GPTModelConfig(temperature=0.5, max_tokens=None)),
  instruction=None, max_prompt_tokens=50,
  tools=(),
  name=None, description=None,
  created_by=&#x27;aje5i2cktiqsqv...&#x27;,
  created_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
  updated_by=&#x27;aje5i2cktiqsqv...&#x27;,
  updated_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
  expires_at=datetime.datetime(2024, 11, 22, 12, 10, 1, 934024),
  labels=None
)</pre>
  </section>
  <p id="o4dy"></p>
  <ul id="WdqL">
    <li id="Ra9G">Обновление данных</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="MpzE" data-lang="python">await assistant2.update(
    model=&#x27;yandexgpt-lite&#x27;, name=&#x27;foo&#x27;, max_tokens=5
)
print(f&quot;updated {assistant2=}&quot;)</pre>
    <p id="VNF0">Вывод:</p>
    <pre id="fXl4" data-lang="bash">updated assistant2=AsyncAssistant(
  id=&#x27;fvt90pe2jrisf2...&#x27;,
  expiration_config=ExpirationConfig(ttl_days=1, expiration_policy=&lt;ExpirationPolicy.STATIC: 1&gt;),
  model=AsyncGPTModel(uri=gpt://.../yandexgpt-lite/latest, config=GPTModelConfig(temperature=0.5, max_tokens=5)),
  instruction=None, max_prompt_tokens=50,
  tools=(),
  name=&#x27;foo&#x27;, description=None,
  created_by=&#x27;aje5i2cktiqsqv...&#x27;,
  created_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
  updated_by=&#x27;aje5i2cktiqsqv...&#x27;,
  updated_at=datetime.datetime(2024, 11, 21, 12, 10, 24, 970164),
  expires_at=datetime.datetime(2024, 11, 22, 12, 10, 1, 934024),
  labels=None
)</pre>
  </section>
  <p id="AqV1"></p>
  <ul id="vilF">
    <li id="KNQ9">Получить список всех версий ассистента</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="90t4" data-lang="python">async for version in assistant.list_versions():
    print(f&quot;assistant {version=}\n&quot;)</pre>
    <p id="kWuT">Вывод:</p>
    <pre id="ewHi" data-lang="bash">assistant version=AssistantVersion(
  id=&#x27;fvt7qv73ojo...qbec&#x27;,
  assistant=ReadOnlyAssistant(
    id=&#x27;fvt90pe2j...sboe&#x27;,
    expiration_config=ExpirationConfig(ttl_days=1, expiration_policy=&lt;ExpirationPolicy.STATIC: 1&gt;),
    model=AsyncGPTModel(uri=gpt://...t.../yandexgpt-lite/latest, config=GPTModelConfig(temperature=0.5, max_tokens=5)),
    instruction=None, max_prompt_tokens=50,
    tools=(),
    name=&#x27;foo&#x27;, description=None,
    created_by=&#x27;aje5i2cktiqsqv...&#x27;,
    created_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
    updated_by=&#x27;aje5i2cktiqsqv...&#x27;,
    updated_at=datetime.datetime(2024, 11, 21, 12, 10, 24, 970164),
    expires_at=datetime.datetime(2024, 11, 22, 12, 10, 1, 934024),
    labels=None
  ),
  update_mask=(&#x27;name&#x27;, &#x27;model_uri&#x27;, &#x27;completion_options.max_tokens&#x27;)
)

assistant version=AssistantVersion(
  id=&#x27;fvtrgpdli...eaefg&#x27;,
  assistant=ReadOnlyAssistant(
    id=&#x27;fvt90pe2jris...&#x27;,
    expiration_config=ExpirationConfig(ttl_days=1, expiration_policy=&lt;ExpirationPolicy.STATIC: 1&gt;),
    model=AsyncGPTModel(uri=gpt://...ugn7.../yandexgpt/latest, config=GPTModelConfig(temperature=0.5, max_tokens=None)),
    instruction=None, max_prompt_tokens=50,
    tools=(),
    name=None, description=None,
    created_by=&#x27;aje5i2cktiqsqv...&#x27;,
    created_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
    updated_by=&#x27;aje5i2cktiqsqv...&#x27;,
    updated_at=datetime.datetime(2024, 11, 21, 12, 10, 1, 934024),
    expires_at=datetime.datetime(2024, 11, 22, 12, 10, 1, 934024),
    labels=None
  ),
  update_mask=()
)</pre>
  </section>
  <p id="tNde"></p>
  <ul id="0zJh">
    <li id="fXh0">Удаление ассистента</li>
  </ul>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="UeIR" data-lang="python">async for assistant in sdk.assistants.list():
    await assistant.delete()</pre>
  </section>
  <p id="CgQg"></p>
  <p id="kEmA"><u>Теперь давайте посмотрим, как нам создать ассистента с базой знаний и пообщаться с ним.</u></p>
  <p id="dTbg">Представим, что есть 2 файла</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="45ND"><strong>turkey_example.txt</strong></p>
    <pre id="6ILq">🌞 Побег в Анталью: Ваш идеальный отдых начинается здесь! 🌊

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

Ваши преимущества с нашим туром:

🏖 Беззаботные дни на пляже: Песчаные и галечные пляжи Антальи славятся своей чистотой и красотой. Устройте себе расслабляющий день, погружаясь в теплые воды Средиземного моря.

🏛 Исторические открытия: Откройте для себя чудеса древнего мира. Посетите античные города Аспендос и Перге, насладитесь прогулками по исторической части города – Калечи, где каждая улочка хранит свое секреты.

🌿 Природные чудеса: Полюбуйтесь величественным водопадом Дюден, исследуйте горный массив Тавр и отправьтесь на экскурсию в национальный парк Олюдениз, где воздух напоен ароматами сосен.

🍽 Некоторые изысканные угощения: Насладитесь вкуснейшей турецкой кухней с её множеством специй и ароматов. Отведайте аутентичные блюда в местных ресторанах и попробуйте свежайшие морепродукты.

🎉 Активные и вечерние развлечения: Для любителей активного отдыха доступны водные виды спорта, а для тех, кто ищет веселья, города предлагает оживлённые ночные клубы и дискотеки.

Въездная / выездная пошлина всего лишь 20 долларов в обе стороны !!!

Всего лишь 20 долларов

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

Анталья ждет вас! ✈️

...</pre>
  </section>
  <p id="Z95q"></p>
  <p id="EQ2Q">И второй файл</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="E09w"><strong>maldives_example.txt</strong></p>
    <pre id="qhPS">Стоимость въезда/выезда с Мальдив - 10 тысяч долларов в обе стороны</pre>
  </section>
  <p id="hzJk"></p>
  <p id="E72t">Это просто 2 файла как база знаний для ассистента. В реальном мире эти файлы могут быть в разы длиннее.</p>
  <p id="5Cpq"></p>
  <p id="wtik">Теперь к самой логике</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="i2i9" data-lang="python">import asyncio
import pathlib


# Загружаем файлы в Yandex Assistant
file_coros = (
    sdk.files.upload(
        path,
        ttl_days=5,
        expiration_policy=&quot;static&quot;,
    )
    for path in [&#x27;turkey_example.txt&#x27;, &#x27;maldives_example.txt&#x27;]
)

files = await asyncio.gather(*file_coros)

# Создаём поисковый индекс
operation = await sdk.search_indexes.create_deferred(files)
search_index = await operation

print(search_index)</pre>
    <p id="wOPX">Вывод:</p>
    <pre id="HklB" data-lang="bash">AsyncSearchIndex(
  id=&#x27;fvttaeii...&#x27;,
  expiration_config=ExpirationConfig(ttl_days=7, expiration_policy=&lt;ExpirationPolicy.SINCE_LAST_ACTIVE: 2&gt;),
  folder_id=&#x27;...&#x27;,
  name=None, description=None,
  created_by=&#x27;aje5i2cktiqsq...&#x27;,
  created_at=datetime.datetime(2024, 11, 21, 12, 21, 49, 479133),
  updated_by=&#x27;aje5i2cktiqsq...&#x27;,
  updated_at=datetime.datetime(2024, 11, 21, 12, 21, 49, 479133),
  expires_at=datetime.datetime(2024, 11, 28, 12, 21, 49, 479133),
  labels=None,
  index_type=TextSearchIndexType(chunking_strategy=StaticIndexChunkingStrategy(max_chunk_size_tokens=800, chunk_overlap_tokens=400))
)</pre>
  </section>
  <p id="wKRD"></p>
  <p id="GJ7T">Создаём ассистента с поисковым индексом:</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="zFf7" data-lang="python">tool = sdk.tools.search_index(search_index)

assistant = await sdk.assistants.create(&#x27;yandexgpt&#x27;, tools=[tool])</pre>
  </section>
  <p id="ZNKa">Обратите внимание, что поисковый индекс создаётся в виде <code>tool</code>, который по сути является <code>function calling</code>.</p>
  <p id="8Kd1"></p>
  <p id="57ma">Для общения с пользователем необходимо сначала создать <code>thread</code>. Это как чат единый, в котором хранится информация общения с человеком. И потом сообщения помещать в этот <code>thread</code>.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="KpUf" data-lang="python">thread = await sdk.threads.create()

for search_query in (
    &#x27;Какова стоимость выездной пошлины для путешествия в чарующие и солнечные МАЛЬДИВЫ, где беззаботный отдых на восхитительных пляжах, утопающих в лучах мягкого средиземноморского солнца, соединяется с открытием величественных исторических памятников и наслаждением изысканными ароматами местной кухни?&#x27;,
    &quot;Cколько пошлина в Анталье&quot;
):
    await thread.write(search_query)
    run = await assistant.run(thread)
    result = await run
    print(&#x27;Question&#x27;, search_query)
    print(&#x27;Answer:&#x27;, result.text, &#x27;\n&#x27;)</pre>
    <p id="CHzx">Вывод:</p>
    <pre id="FWIY" data-lang="bash">Question Какова стоимость выездной пошлины для путешествия в чарующие и солнечные МАЛЬДИВЫ, где беззаботный отдых на восхитительных пляжах, утопающих в лучах мягкого средиземноморского солнца, соединяется с открытием величественных исторических памятников и наслаждением изысканными ароматами местной кухни?
Answer: Стоимость выездной пошлины для путешествия на Мальдивы составляет 10 тысяч долларов в обе стороны. 

Question Cколько пошлина в Анталье
Answer: Въездная и выездная пошлина в Анталье составляет 20 долларов в обе стороны. </pre>
  </section>
  <p id="Jt9i">Как видите, задаём ему 2 вопроса и он отвечает на вопросы исходя из информации, что мы в него загрузили.</p>
  <p id="rVxz"></p>
  <p id="DvGW">Очистка пространства</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="UeGg" data-lang="python">await search_index.delete()
await thread.delete()
await assistant.delete()

for file in files:
    await file.delete()</pre>
  </section>
  <p id="5ZAy"></p>
  <h4 id="Embeddings">Embeddings</h4>
  <p id="HWvL">Ранее мы с Вами <a href="https://teletype.in/@smelkov_pro/yandexgpt-part2-embedding" target="_blank">уже рассматривали в статье</a>, как использовать embeddings в проекте через http запросы.</p>
  <p id="JIZB">Давайте посмотрим как это делать через SDK.</p>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="dkP3" data-lang="python">doc_texts = [
    &quot;&quot;&quot;Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург)
    — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления,
    литературный критик и теоретик литературы, историк, публицист, журналист.&quot;&quot;&quot;,

    &quot;&quot;&quot;Ромашка — род однолетних цветковых растений семейства астровые,
    или сложноцветные, по современной классификации объединяет около 70 видов невысоких пахучих трав,
    цветущих с первого года жизни.&quot;&quot;&quot;
]

# Генерация embeddings для документов (начальной базы знаний)
doc_model = sdk.models.text_embeddings(&#x27;doc&#x27;)
coros = (doc_model.run(text) for text in doc_texts)
doc_embeddings = await asyncio.gather(*coros)


# Генерация embedding для поискового запроса
query_model = sdk.models.text_embeddings(&#x27;query&#x27;)
query_embedding = await query_model.run(&quot;когда день рождения Пушкина?&quot;)</pre>
  </section>
  <p id="SczD">Как видим всё очень просто. И далее эту SDK можно использовать с любой базой данных для хранения информации об embeddings.</p>
  <p id="Mdly"></p>
  <p id="cv7b">На этом всё :) <a href="https://t.me/smelkov_pro" target="_blank">Подписывайтесь на телеграм канал</a>, чтобы не пропускать обновления.</p>
  <p id="UHcQ"></p>
  <p id="I3WT">Вам также может понравиться:</p>
  <ul id="FssK">
    <li id="R8Rm"><a href="https://teletype.in/@smelkov_pro/ai-tunnel-review" target="_blank">Запуск моделей ChatGPT, Gemini, LLama без VPN через AITunnel</a></li>
    <li id="vPRU"><a href="https://teletype.in/@smelkov_pro/ai-agents-intro" target="_blank">Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</a></li>
    <li id="7nu9"><a href="https://dzen.ru/video/watch/66f6b4a7ad2d5367eefec6d8?share_to=link" target="_blank">Введение в библиотеку LangGraph</a></li>
  </ul>
  <p id="PfIw"></p>
  <tt-tags id="B8xM">
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="ии">#ии</tt-tag>
    <tt-tag name="yandex">#yandex</tt-tag>
    <tt-tag name="sdk">#sdk</tt-tag>
    <tt-tag name="ml">#ml</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/ai-agents-intro</guid><link>https://teletype.in/@smelkov_pro/ai-agents-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/ai-agents-intro?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Агенты искусственного интеллекта: что это такое, зачем нужны и почему за ними будущее</title><pubDate>Sun, 05 Jan 2025 15:15:34 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d6/60/d660f57b-b972-4c6b-9da1-14b89c80a406.png"></media:content><category>AI</category><tt:hashtag>ai</tt:hashtag><tt:hashtag>ии</tt:hashtag><tt:hashtag>agent</tt:hashtag><tt:hashtag>агент</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/1f/09/1f09515a-dfa3-444b-832f-1ced414374da.jpeg"></img>Сегодня всё чаще можно услышать, что за агентами искусственного интеллекта (ИИ) — будущее. Но что же это за «агенты» и почему они вызывают такой интерес?]]></description><content:encoded><![CDATA[
  <figure id="mWH8" class="m_column">
    <img src="https://img2.teletype.in/files/1f/09/1f09515a-dfa3-444b-832f-1ced414374da.jpeg" width="1200" />
  </figure>
  <p id="sDe6">Сегодня всё чаще можно услышать, что за агентами искусственного интеллекта (ИИ) — будущее. Но что же это за «агенты» и почему они вызывают такой интерес?</p>
  <p id="Bf2H">По сути, агентом ИИ называют автономную программу, которая способна самостоятельно выполнять поставленные задачи, обучаться и принимать решения в рамках определённых ограничений и правил. Такая система может анализировать поступающую информацию, реагировать на изменения в окружающей среде и искать оптимальные способы достижения целей.</p>
  <p id="dlhU"></p>
  <h2 id="a3yD">Для чего нужны агенты ИИ</h2>
  <p id="E3KM">Основная роль агентов ИИ — автоматизация процессов, которые раньше требовали больших затрат человеческих ресурсов или были слишком сложны для традиционных программ.</p>
  <p id="l52R">Представьте, что у вас есть склад с тысячами товаров: каждый день нужно контролировать их остатки, следить за изменениями цен, определять оптимальные маршруты для доставки. Человек может тратить на это часы, а программа-агент способна регулярно собирать данные, анализировать их и на основе результатов предпринимать действия (уведомлять менеджеров, формировать оптимальные заказы или маршруты и т. д.).</p>
  <p id="zURn">Но сфера применения агентов не ограничивается логистикой. Например, в сфере финансов они отслеживают биржевые курсы, принимают решения о покупке или продаже ценных бумаг. В медицине помогают выявлять потенциальные диагнозы по симптомам пациента, а в сфере обслуживания — подбирают персонализированные предложения клиентам. Потенциально любая отрасль, связанная с обработкой больших объёмов данных и принятием решений, может выиграть от использования агентов ИИ.</p>
  <p id="Z4fx"></p>
  <h2 id="ZQhs">Как агенты упрощают работу</h2>
  <p id="OPJC">Главная ценность агентов ИИ — умение обрабатывать огромные массивы данных и учиться на опыте. В отличие от человека, которому трудно держать в голове сразу сотни параметров и быстро реагировать на изменения, агент умеет без устали анализировать информацию практически в реальном времени. Это позволяет людям сосредоточиться на более творческих или сложных задачах, делегируя «рутинные» операции автоматизированным системам.</p>
  <p id="ZNHu">Благодаря использованию машинного обучения и принципов поведенческой адаптации, агенты способны со временем становиться «умнее». Чем больше данных они обрабатывают, тем более точными становятся их прогнозы и принимаемые решения. Например, система, работающая с прогнозом погоды, может самостоятельно адаптироваться к новым моделям атмосферных изменений и постоянно повышать точность своих расчётов.</p>
  <p id="U4YP"></p>
  <h2 id="1MmN">Почему это нужно уже сегодня</h2>
  <p id="QJJH">Современные компании и организации сталкиваются с колоссальными объёмами данных и возросшими ожиданиями клиентов по скорости реакции и качеству сервиса. Агенты ИИ позволяют справляться с этими вызовами: они исключают человеческий фактор там, где цена ошибки слишком велика, а объём работы непосильный. При этом они не вытесняют человека полностью, а берут на себя рутинные или механические задачи, освобождая время и ресурсы для более сложной и важной деятельности.</p>
  <p id="kF6D">В долгосрочной перспективе развитие агентов ИИ может изменить многие сферы — от бытового уровня (вспомните домашних роботов-помощников или умные системы управления «умным домом») до глобальной промышленности, финансов и науки. Автономные агенты уже сейчас способны координировать работу целых заводов, прорабатывать эффективные схемы логистики и даже выступать в роли консультантов в сложных областях. Всё это говорит о том, что будущее действительно принадлежит агентам искусственного интеллекта: они не только упрощают привычные процессы, но и открывают путь к решениям, которые прежде казались невозможными.</p>
  <p id="gh2f"></p>
  <tt-tags id="yDAK">
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="ии">#ии</tt-tag>
    <tt-tag name="agent">#agent</tt-tag>
    <tt-tag name="агент">#агент</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@smelkov_pro/ai-tunnel-review</guid><link>https://teletype.in/@smelkov_pro/ai-tunnel-review?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro</link><comments>https://teletype.in/@smelkov_pro/ai-tunnel-review?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=smelkov_pro#comments</comments><dc:creator>smelkov_pro</dc:creator><title>Запуск моделей ChatGPT, Gemini, LLama без VPN через AITunnel</title><pubDate>Thu, 31 Oct 2024 10:26:58 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/04/22/0422f19f-da27-450f-ab9a-34dae101a6fe.png"></media:content><category>AI</category><tt:hashtag>python</tt:hashtag><tt:hashtag>ai</tt:hashtag><tt:hashtag>gpt</tt:hashtag><tt:hashtag>gemini</tt:hashtag><tt:hashtag>llama</tt:hashtag><description><![CDATA[<img src="https://img1.teletype.in/files/4f/fb/4ffb6841-65ee-4285-9458-3603c69d0d5b.png"></img>Часто бывает российским проектам необходимо использовать зарубежные LLM в своих проектах. И чтобы их использовать, обычно создаются прокси сервера личные и зарубежные аккаунты с оплатой иностранными картами.]]></description><content:encoded><![CDATA[
  <figure id="yFie" class="m_column">
    <img src="https://img1.teletype.in/files/4f/fb/4ffb6841-65ee-4285-9458-3603c69d0d5b.png" width="800" />
  </figure>
  <p id="VQLL">Часто бывает российским проектам необходимо использовать зарубежные LLM в своих проектах. И чтобы их использовать, обычно создаются прокси сервера личные и зарубежные аккаунты с оплатой иностранными картами.</p>
  <p id="5dfe">Такой вариант подойдёт, если вы максимально хотите сократить возможности утечки персональных данных. Для максимальной сохранности подобных данных обычно запускают LLM на своих серверах.</p>
  <p id="mFh2">Но если для Вас это не супер критично и данные не супер конфиденциальные, а обычные диалоги, то я бы рассматривал использование сервисов прокси. Хотя все сервисы утверждают, что данные и логи никакие не собирают.</p>
  <p id="g0KY">Сегодня рассмотрим один из самых демократичных сервисов прокси — <a href="https://aitunnel.ru" target="_blank">AITunnel</a>.</p>
  <p id="UvYA"></p>
  <p id="0R1r">На сайте думаю сами сможете ознакомиться со всем списком моделей, которые можно использовать. Покажу просто примеры использования.</p>
  <p id="puuG"></p>
  <h3 id="9HMC">Создание API-ключа</h3>
  <p id="Rtik">Просто откройте личный кабинет, пополните баланс и на вкладке &quot;Управление ключами&quot; создайте API-ключ.</p>
  <figure id="EIsp" class="m_column">
    <img src="https://img4.teletype.in/files/74/1e/741ed86f-2543-4e10-8cc0-e35659ff4b53.png" width="1022" />
  </figure>
  <p id="kD41"></p>
  <h3 id="eg9Y">ChatGPT</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="wHhb" data-lang="python">from openai import OpenAI

# У меня создан файл &#x27;config&#x27;, где я храню API-ключ
from ai_tunnel.config import ai_tunnel_api_key


client = OpenAI(
    api_key=ai_tunnel_api_key,
    base_url=&#x27;https://api.aitunnel.ru/v1/&#x27;,
)

completion = client.chat.completions.create(
    messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Скажи интересный факт&quot;}],
    max_tokens=500,
    model=&#x27;gpt-4o&#x27;,
)

print(completion.choices[0].message.content)</pre>
  </section>
  <p id="hVaK">Как видим использовать можно существующую библиотеку OpenAI, указав только <code>base_url</code> и название модели.</p>
  <p id="sYii"></p>
  <h3 id="4UI8">Gemini</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="kE4e" data-lang="python">from openai import OpenAI

# У меня создан файл &#x27;config&#x27;, где я храню API-ключ
from ai_tunnel.config import ai_tunnel_api_key


client = OpenAI(
    api_key=ai_tunnel_api_key,
    base_url=&#x27;https://api.aitunnel.ru/v1/&#x27;,
)

completion = client.chat.completions.create(
    messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Скажи интересный факт&quot;}],
    max_tokens=500,
    model=&#x27;gemini-pro-1.5&#x27;,
)

print(completion.choices[0].message.content)</pre>
  </section>
  <p id="UI9R"></p>
  <h3 id="C9dD">LLama</h3>
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="lnEf" data-lang="python">from openai import OpenAI

# У меня создан файл &#x27;config&#x27;, где я храню API-ключ
from ai_tunnel.config import ai_tunnel_api_key


client = OpenAI(
    api_key=ai_tunnel_api_key,
    base_url=&#x27;https://api.aitunnel.ru/v1/&#x27;,
)

completion = client.chat.completions.create(
    messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Скажи интересный факт&quot;}],
    max_tokens=500,
    model=&#x27;llama-3.2-90b-vision-instruct&#x27;,
)

print(completion.choices[0].message.content)</pre>
  </section>
  <p id="u2UY"></p>
  <p id="wvaA">Как видим, использование очень простое. Не требуется VPN и для оплаты нужна российская карта, а не зарубежная.</p>
  <p id="OG6Q"></p>
  <p id="LGBK">Если у вас не планируется большая нагрузка, то вполне можно пользоваться прокси. Работает быстро.</p>
  <p id="y8Lx"></p>
  <tt-tags id="3nXm">
    <tt-tag name="python">#python</tt-tag>
    <tt-tag name="ai">#ai</tt-tag>
    <tt-tag name="gpt">#gpt</tt-tag>
    <tt-tag name="gemini">#gemini</tt-tag>
    <tt-tag name="llama">#llama</tt-tag>
  </tt-tags>

]]></content:encoded></item></channel></rss>