<?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>PAAM</title><generator>teletype.in</generator><description><![CDATA[PAAM]]></description><image><url>https://img4.teletype.in/files/f7/c9/f7c9db24-ded9-41e8-a5a1-ecac1174f4f3.png</url><title>PAAM</title><link>https://teletype.in/@paam_ai</link></image><link>https://teletype.in/@paam_ai?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/paam_ai?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/paam_ai?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 05 Sep 2026 04:44:32 GMT</pubDate><lastBuildDate>Sat, 05 Sep 2026 04:44:32 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@paam_ai/2uXLMjxUwzh</guid><link>https://teletype.in/@paam_ai/2uXLMjxUwzh?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai</link><comments>https://teletype.in/@paam_ai/2uXLMjxUwzh?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai#comments</comments><dc:creator>paam_ai</dc:creator><title>код для supa</title><pubDate>Thu, 14 Aug 2025 01:21:03 GMT</pubDate><description><![CDATA[[]]></description><content:encoded><![CDATA[
  <pre id="aIXG">-- ===========================
-- 1) Расширения
-- ===========================
create extension if not exists vector;
create extension if not exists pg_trgm;
create extension if not exists pgcrypto;

-- ===========================
-- 2) Таблица документов
-- ===========================
create table if not exists public.documents (
  id         uuid primary key default gen_random_uuid(),
  content    text not null,
  embedding  vector(1536) not null,
  metadata   jsonb not null default &#x27;{}&#x27;::jsonb,
  created_at timestamptz not null default now()
);

-- ===========================
-- 3) Индексы
-- (без CONCURRENTLY — Supabase выполняет скрипт в транзакции)
-- ===========================
create index if not exists documents_embedding_ivfflat
  on public.documents using ivfflat (embedding vector_cosine_ops) with (lists = 100);

create index if not exists documents_content_trgm
  on public.documents using gin (content gin_trgm_ops);

create index if not exists documents_metadata_gin
  on public.documents using gin (metadata);

analyze public.documents;

-- Опционально: сколько &quot;корзин&quot; просматривать при ivfflat
-- (можно варьировать 1..lists; больше = медленнее, но точнее)
-- set ivfflat.probes = 10;

-- ===========================
-- 4) Функции поиска (с уникальными именами, чтобы не конфликтовать)
-- ===========================

-- 4.1 Векторный поиск (cosine)
create or replace function public.search_documents_v1(
  query_embedding vector(1536),
  match_count int default 10,
  min_content_length int default 1
)
returns table (
  id uuid,
  content text,
  metadata jsonb,
  similarity float
)
language sql
stable
parallel safe
as $$
  select d.id,
         d.content,
         d.metadata,
         1 - (d.embedding &lt;=&gt; query_embedding) as similarity
  from public.documents d
  where length(d.content) &gt;= min_content_length
  order by d.embedding &lt;=&gt; query_embedding
  limit match_count
$$;

-- 4.2 Гибридный поиск (лексика + вектор)
create or replace function public.search_documents_hybrid_v1(
  query_text text,
  query_embedding vector(1536),
  match_count int default 10
)
returns table (
  id uuid,
  content text,
  metadata jsonb,
  similarity float
)
language sql
stable
parallel safe
as $$
  select d.id,
         d.content,
         d.metadata,
         1 - (d.embedding &lt;=&gt; query_embedding) as similarity
  from public.documents d
  where
    -- триграммы
    d.content ilike &#x27;%&#x27; || query_text || &#x27;%&#x27;
    -- и/или полнотекст (русский словарь можно заменить на &#x27;simple&#x27;, если надо)
    or to_tsvector(&#x27;russian&#x27;, d.content) @@ plainto_tsquery(&#x27;russian&#x27;, query_text)
  order by d.embedding &lt;=&gt; query_embedding
  limit match_count
$$;

-- ===========================
-- Готово.
-- Вставлять данные: INSERT INTO public.documents(content, metadata, embedding) VALUES (...)
-- И вызывать поиск:
--   select * from public.search_documents_v1($1::vector(1536), 10);
--   select * from public.search_documents_hybrid_v1(&#x27;дурак&#x27;, $2::vector(1536), 10);
-- ===========================
</pre>
  <p id="SvkO"></p>
  <p id="kopz"></p>
  <p id="EvWH"></p>
  <p id="HvuW">[</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@paam_ai/3OJBsxi0XzJ</guid><link>https://teletype.in/@paam_ai/3OJBsxi0XzJ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai</link><comments>https://teletype.in/@paam_ai/3OJBsxi0XzJ?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai#comments</comments><dc:creator>paam_ai</dc:creator><title>💡 Автоматический сбор и отбор топ-новостей через n8n и GPT: инструкция за 15 минут  для телеграмм канала</title><pubDate>Sun, 03 Aug 2025 13:03:02 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fb/0e/fb0e1103-57c6-4f66-96ea-169e247540c8.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/9f/f2/9ff2d31f-a0f3-4ba2-8096-cee8a224c40f.png"></img>Финальная структура бота: от RSS-источников до Telegram через AI-агентов]]></description><content:encoded><![CDATA[
  <figure id="H8ib" class="m_original">
    <img src="https://img2.teletype.in/files/9f/f2/9ff2d31f-a0f3-4ba2-8096-cee8a224c40f.png" width="1639" />
  </figure>
  <p id="Gc2U"><strong>Финальная структура бота: от RSS-источников до Telegram через AI-агентов</strong></p>
  <h3 id="0eIk">1. Добавление триггера запуска</h3>
  <p id="cdU0">Начинаем с установки стартовой ноды — <strong>“When clicking ‘Execute workflow’”</strong>.<br /> Эта нода позволяет вручную запускать сценарий при клике по кнопке <code>Execute workflow</code>.<br /> Идеально подходит для тестов и ручного запуска в процессе настройки. <br />В конце мы ее поменяем 📌</p>
  <figure id="CyLH" class="m_original">
    <img src="https://img3.teletype.in/files/61/35/61358795-1bc0-481a-988f-972dda501d49.png" width="472" />
  </figure>
  <h3 id="QnKV">--------------------------------------------------------------------------<br />2) Добавляем <strong>RSS Read</strong> и находим ленты через ИИ и группируем в Merge Ноде </h3>
  <figure id="E2AV" class="m_original">
    <img src="https://img1.teletype.in/files/06/bc/06bc1ca4-c703-4d65-801a-d1b7102473fb.png" width="406" />
    <figcaption>RSS Нода</figcaption>
  </figure>
  <p id="3L9s">🧩 <strong>Зачем</strong><br /> <code>RSS Read</code> подтягивает свежие статьи из ленты сайта и отдаёт их как JSON (title, link, pubDate, snippet).</p>
  <p id="rOVq">🛠 <strong>Как добавить</strong><br /> <strong>Add node → RSS Feed Read → URL</strong> вставляем адрес ленты → подключаем к триггеру. Повтори для 6–8 источников.</p>
  <p id="3llX">🤖 <strong>Где взять URL под вашу нишу</strong><br /> Самый быстрый способ — спросить у <strong>GPT/Gemini можно использовать deepreserch для более глубокого поиска</strong>.<br /> Сформулируй запрос и вставь готовые ссылки в ноды.</p>
  <figure id="TYZi" class="m_original">
    <img src="https://img1.teletype.in/files/4d/86/4d868317-26c1-4c18-896e-aecb815cbe46.png" width="892" />
    <figcaption>Запрос нейронки</figcaption>
  </figure>
  <p id="oKWH"><strong>Пример запроса:</strong></p>
  <blockquote id="kwzx">«Подбери 7–10 актуальных RSS-лент по нише маркетинга (или моей нише). Дай прямые RSS-URL.»</blockquote>
  <p id="Xrds">✅ <strong>Проверка</strong><br /> Нажми <strong>Execute</strong> на ноде: должны прийти записи. Если пусто — замени ленту на другую из списка.</p>
  <figure id="6FVW" class="m_original">
    <img src="https://img3.teletype.in/files/ac/5c/ac5c755f-eea7-4f87-b1d0-acb61e670712.png" width="714" />
  </figure>
  <p id="9Pq6">Готово — переходим к объединению через <strong>Merge (append)</strong>.</p>
  <p id="EwyS"></p>
  <figure id="zKGn" class="m_original">
    <img src="https://img1.teletype.in/files/ca/5f/ca5fcbbf-d537-40a1-8c79-8c891ce1290e.png" width="399" />
    <figcaption>Нода Merge</figcaption>
  </figure>
  <p id="e6IQ">🧩 <strong>Зачем</strong><br /> Нужно получить <strong>один общий список</strong> новостей из всех RSS-нод. Режим <strong>append</strong> просто <strong>складывает записи подряд</strong>, не сравнивая поля (а у разных лент они могут отличаться). Так дальше — фильтрация/код/ИИ — работают с <strong>одним массивом</strong>.</p>
  <p id="zON5">🛠 <strong>Как сделать</strong></p>
  <ol id="a6Bi">
    <li id="kTXq">Добавь ноду <strong>Merge</strong> → в <strong>Mode</strong> выбери <strong>Append</strong>.</li>
    <li id="qLWD">Подключи выходы всех <code>RSS Read</code> к входам <code>Merge</code>.</li>
    <li id="4FCa">(Опционально) Укажи количество входов (7–10).<br /><br />------------------------------------------------------------------------------------<br /></li>
  </ol>
  <h2 id="tchp">3) Две ноды <strong>Code</strong>: фильтрация и упаковка данных</h2>
  <h3 id="2k1o">  🖼️<code>Code</code> → <strong>Filter &amp; Deduplicate</strong></h3>
  <figure id="Lpw3" class="m_original">
    <img src="https://img3.teletype.in/files/eb/0b/eb0b4558-ce59-42d5-b47a-ff57e615dd51.png" />
  </figure>
  <p id="JfOL"><strong> 💡 Что делает эта нода</strong></p>
  <ul id="thax">
    <li id="FJTl">Оставляет <strong>только свежие записи</strong> (за последние 24 часа).</li>
    <li id="9uKx"><strong>Удаляет дубликаты</strong> по <code>link</code>, даже если они пришли из разных источников.</li>
    <li id="URZf">Чистит HTML-шум из описаний, приводит текст к читаемому виду.</li>
    <li id="XVK5">На выходе даёт <strong>очищенный список новостей</strong> (количество может уменьшиться — это нормально).</li>
    <li id="wAL6">Дальше <strong>подключаем выход</strong> этой ноды ко второй ноде <code>Code</code>.</li>
  </ul>
  <p id="uhqs"><strong>Код ноды (вставь как есть):</strong></p>
  <pre id="Pnyy">// Фильтрация и дедупликация новостей
const items = $input.all();
const now = new Date();
const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);

// Убираем дубликаты и фильтруем по времени
const uniqueNews = [];
const seenUrls = new Set();

for (const item of items) {
  const data = item.json;
  
  // Проверяем дату публикации
  const pubDate = new Date(data.pubDate || data.isoDate);
  if (pubDate &lt; yesterday) continue;
  
  // Проверяем на дубликаты
  if (seenUrls.has(data.link)) continue;
  seenUrls.add(data.link);
  
  // Берем все доступные поля контента
  const rssContent = data[&#x27;content:encodedSnippet&#x27;] || data.content || data.contentSnippet || data.summary || &#x27;&#x27;;
  
  // Очищаем RSS контент от HTML
  const cleanRssContent = rssContent
    .replace(/&lt;[^&gt;]*&gt;/g, &#x27;&#x27;)
    .replace(/&amp;[^;]+;/g, &#x27;&#x27;)
    .replace(/\s+/g, &#x27; &#x27;)
    .trim();
  
  // Создаем новый объект, теперь с сохранением contentSnippet
  uniqueNews.push({
    title: data.title,
    link: data.link,
    rssContent: cleanRssContent,
    contentSnippet: data.contentSnippet, // Сохраняем оригинальный contentSnippet
    pubDate: data.pubDate,
    source: data[&#x27;dc:creator&#x27;] || data.meta?.title || &#x27;Unknown&#x27;,
    guid: data.guid
  });
}

console.log(&#x60;Filtered ${uniqueNews.length} unique news from ${items.length} total&#x60;);

return uniqueNews.map(item =&gt; ({ json: item }));</pre>
  <p id="z3eH">🖼️— <code>Code</code> → <strong>Упаковка в единый объект <code>data</code></strong></p>
  <figure id="a0kK" class="m_original">
    <img src="https://img4.teletype.in/files/fc/d1/fcd12918-63ad-4661-8936-e21bbeddf8e7.png" />
  </figure>
  <h3 id="pfMM">🖼️— <code>Code</code> → <strong>Упаковка в единый объект <code>data</code></strong></h3>
  <p id="UtJF"><strong>Что делает эта нода</strong></p>
  <ul id="NuRr">
    <li id="L9UQ">Берёт все элементы из предыдущего шага и <strong>упаковывает</strong> их в <strong>один объект</strong> с полем <code>data</code>.</li>
    <li id="naDU">Это нужно, чтобы следующий AI-агент получил <strong>единый массив</strong> новостей через <code>{{ JSON.stringify($json.data, null, 2) }}</code>.</li>
  </ul>
  <p id="vZDa"><strong>Код ноды (вставь как есть):</strong></p>
  <pre id="g3Jl">// 1. Получаем все входящие элементы в виде массива
const allItems = $input.all();

// 2. Из каждого элемента забираем только его &#x27;json&#x27; часть (саму новость)
// и складываем в новый массив.
const newsArray = allItems.map(item =&gt; item.json);

// 3. Возвращаем ОДИН-ЕДИНСТВЕННЫЙ новый элемент.
// У этого элемента будет поле &#x27;data&#x27;, которое содержит массив всех новостей.
// Имя &#x27;data&#x27; важно, так как оно используется в промте: {{$json.data}}
return [{
  json: {
    data: newsArray
  }
}];</pre>
  <h3 id="CspX">⚠️ Если новостей мало</h3>
  <p id="a84n">Если после фильтрации записей выходит 1–3 вместо ожидаемых 5–10, значит источники публикуют редко.<br /> <strong>Решение:</strong> вернись в GPT/Gemini и попроси подобрать <strong>7–10 актуальных RSS-лент</strong> под твою нишу (маркетинг/HR/финансы и т.д.), затем <strong>замени/добавь</strong> их в блоки <code>RSS Read</code>.</p>
  <p id="wuMp">Готово. Следующий шаг — <strong>AI Agent1</strong> для отбора <strong>топ-5</strong>. <br /><br /><strong>Так же после каждой итерации нажимайте на Execute Step Чтобы проверить логику в работе </strong></p>
  <p id="NHF8">-----------------------------------------------------------------------------------------</p>
  <h2 id="JYg6">4) Два <strong>AI-агента</strong>: отбор топ-5 → оформление дайджеста</h2>
  <figure id="WjL1" class="m_original">
    <img src="https://img3.teletype.in/files/a7/67/a7675acd-df60-45b5-9949-bdd94b9a7cc6.png" width="628" />
  </figure>
  <h4 id="RxmH">🧠 AI Agent (аналитик: отбор топ-5)</h4>
  <p id="Nzhg"><strong>Вход:</strong> <code>{{ JSON.stringify($json.data, null, 2) }}</code> — единый массив новостей из предыдущей ноды <code>Code</code>.</p>
  <p id="7AW5"><strong>Что делает:</strong></p>
  <ul id="uT5k">
    <li id="59mR">Просматривает весь массив (например, 8–15 записей).</li>
    <li id="jKP4"><strong>Оценивает важность</strong> по критериям (платформы/бюджеты, инструменты/технологии, стратегии/тренды, регулирование/данные).</li>
    <li id="KfPV"><strong>Отбирает 5 лучших</strong> материалов по значимости и качеству источника.</li>
    <li id="qMHg">Возвращает <strong>JSON-массив из 5</strong> выбранных новостей.</li>
  </ul>
  <p id="wiub"><strong>Как адаптировать под свою нишу (обязательно):</strong></p>
  <p id="1whG" data-align="center">Открой этот <strong>AI Agent</strong> → скопируй <strong>prompt</strong> целиком.</p>
  <p id="Cs9q"></p>
  <pre id="yJWR">Ты — ведущий аналитик в топовом IT-издании (как TechCrunch). Твоя специализация — выявление самых значимых и влиятельных событий в мире AI.</pre>
  <p id="Vdk9"><code>Твоя задача — проанализировать предоставленный массив новостных статей и идентифицировать **10 самых главных *событий* или *тем* дня**. Для каждого из 10 выбранных событий ты должен выбрать **одну, самую лучшую и информативную статью**, которая его освещает.</code></p>
  <p id="5NOq"><code>**Строго следуй этому процессу:**<br />1.  **Анализ:** Прочитай все статьи, чтобы составить полный список уникальных событий и тем дня.<br />2.  **Оценка:** Оцени важность каждого события, используя приведенные ниже критерии.<br />3.  **Отбор:** Выбери 10 самых важных событий.<br />4.  **Выбор лучшей статьи:** Для каждого из 10 событий, если его освещают несколько статей, выбери ту, которая является наиболее полной и исходит от самого авторитетного источника.</code></p>
  <p id="Qdfr"><code>**Критерии для оценки важности события (в порядке убывания приоритета):**</code></p>
  <p id="EkAA"><code>1.  **Финансы и бизнес:**<br />    * Крупные сделки, слияния и поглощения (M&amp;A).<br />    * Крупные раунды финансирования (особенно более $20 млн).<br />    * Заключение стратегических контрактов на большие суммы (например, Tesla и Samsung).</code></p>
  <p id="SxlM"><code>2.  **Продукты и технологии:**<br />    * Запуск новых прорывных продуктов, моделей или платформ от лидеров рынка (Google, OpenAI, Anthropic, Microsoft, Apple, Meta, NVIDIA).<br />    * Значительные обновления, влияющие на разработчиков: изменение API, цен, лимитов использования (как новость про лимиты Claude).<br />    * Важные запуски от других ключевых игроков в своих нишах (например, Runway в видео, Perplexity в поиске).</code></p>
  <p id="cEcm"><code>3.  **Политика и Регулирование:**<br />    * Новости о новых государственных регуляциях, законах или санкциях, напрямую влияющих на AI-индустрию.</code></p>
  <p id="53CS"><code>4.  **Научные прорывы:**<br />    * Публикация исследований или state-of-the-art моделей, которые устанавливают новый стандарт в отрасли.</code></p>
  <p id="AiVx"><code>**Формат вывода:**<br />Твой ответ должен быть **ТОЛЬКО** валидным JSON-массивом, содержащим полные объекты 10 выбранных тобой новостей (по одной на каждое событие). Не добавляй никаких объяснений, комментариев или текста до или после JSON-массива.</code></p>
  <pre id="GIxF">-— **Входные данные (массив новостей):**
{{ JSON.stringify($json.data, null, 2) }}</pre>
  <p id="t11G"></p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <ol id="MbEX">
      <li id="ZCxe">Вставь в <strong>GPT</strong> или <strong>Gemini</strong> с запросом:  <em>«Отредактируй этот prompt в точности, но под мою нишу: [укажи нишу]. Структуру и логику оставь прежними»</em>.</li>
      <li id="qK4P">Замени исходный prompt на отредактированный — агент будет отбирать <strong>топ-5</strong> уже в контексте твоей тематики.</li>
    </ol>
  </section>
  <p id="3gYd"><strong>Подключение:</strong> выход <code>AI Agent</code> → вход следующего агента.</p>
  <p id="OpVd"></p>
  <figure id="Hs0o" class="m_original">
    <img src="https://img3.teletype.in/files/6c/63/6c63cfdf-5621-4602-b91a-0355cb6e08c1.png" width="668" />
  </figure>
  <h4 id="NcFZ">📝 AI Agent1 (редактор: форматирование для Telegram)</h4>
  <p id="BaNF"><strong>Вход:</strong> JSON с 5 отобранными новостями от первого агента.</p>
  <p id="EOjV"><strong>Что делает:</strong></p>
  <ul id="0K8B">
    <li id="fifb"><strong>Переводит заголовки</strong> на русский.</li>
    <li id="SL6c">Пишет <strong>выжимку 3–5 предложений</strong> с акцентом на главной идее.</li>
    <li id="W9lI">Приводит дату к виду <strong>«ДД месяца ГГГГ, ЧЧ:ММ»</strong>.</li>
    <li id="TVfu">Собирает итог в <strong>чистый HTML</strong>, совместимый с Telegram (только теги <code>&lt;b&gt;</code>, <code>&lt;u&gt;</code>, <code>&lt;a&gt;</code>, <code>&lt;code&gt;</code>; без Markdown).</li>
    <li id="Yr2E">На выходе — <strong>готовый текст дайджеста</strong> для отправки.</li>
  </ul>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="llWN"><strong>Замечание:</strong> по умолчанию настроен под SMM-редактор/AI. Вам нужно <strong>здесь заменить под свою нишу</strong>.</p>
    <figure id="RoJB" class="m_original">
      <img src="https://img1.teletype.in/files/0c/a2/0ca2f0be-3da1-4989-ae84-c58a8b462d67.png" width="755" />
    </figure>
  </section>
  <p id="M2I6">Промт для второго Ai Агента</p>
  <pre id="78hb">
Ты — SMM-редактор и автор ведущего Telegram-канала об маркетинг. Твоя задача — создать увлекательный, стильный и удобный для чтения дайджест, используя для форматирования исключительно HTML-теги, совместимые с Telegram.

**ГЛАВНОЕ ПРАВИЛО: КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО использовать любую Markdown-разметку (символы **, _, &#x60;, []()). Всё форматирование, особенно выделение жирным, должно быть сделано ТОЛЬКО с помощью HTML-тега &lt;b&gt;. Это самое важное правило.**

**Остальные правила:**

1.  **Обработай каждую новость:** Последовательно пройдись по каждому объекту в предоставленном JSON-массиве.
2.  **Подробная суть с акцентами:** Напиши содержательную выжимку на 3-5 предложений. Внутри этого текста выдели тегом &lt;b&gt; **ключевую концепцию новости** — как правило, это название продукта, технологии или суть главного анонса. Старайся выделять фразу в **начале** текста.
3.  **Безупречное HTML-форматирование:**
    * Заголовок новости (из поля &#x60;title&#x60;) **обязательно переведи на русский язык и сделай его жирным и подчеркнутым**, обернув в теги &#x60;&lt;b&gt;&#x60; и &#x60;&lt;u&gt;&#x60;.
    * Дату публикации (&#x60;pubDate&#x60;) приведи к простому формату &quot;ДД месяца ГГГГ, ЧЧ:ММ&quot; и оберни в тег &#x60;&lt;code&gt;&#x60;.
    * Ссылку на источник (&#x60;link&#x60;) оформи в виде HTML-гиперссылки &#x60;&lt;a href=&quot;URL&quot;&gt;Читать подробнее&lt;/a&gt;&#x60;.
4.  **Структура и разделители:**
    * Выведи новости в виде нумерованного списка.
    * Четко разделяй каждую новость в списке двумя переносами строки (&#x60;\n\n&#x60;).
    * Строго следуй примеру структуры.

**Пример желаемой структуры для ОДНОЙ новости:**

1.  📰 **&lt;b&gt;&lt;u&gt;[Здесь ПЕРЕВЕДЕННЫЙ на русский заголовок]&lt;/u&gt;&lt;/b&gt;**
    📝 [Здесь подробная выжимка на русском, где &lt;b&gt;ключевая фраза новости&lt;/b&gt; выделена жирным.]
    📅 &#x60;&lt;code&gt;28 июля 2025, 15:29&lt;/code&gt;&#x60;
    🔗 &lt;a href=&quot;https://example.com/news-article-url&quot;&gt;Читать подробнее&lt;/a&gt;

---

**Входные данные (массив новостей):**
{{ $json.output }}</pre>
  <p id="P1Qq"><strong>Подключение:</strong> выход <code>AI Agent</code> → вход <code>AI Agent1</code> .</p>
  <p id="XUKZ">- ---------------------------------------------------------------------------------------</p>
  <h2 id="P2Hq">5) ✂️ Нода <strong>Code</strong> — разрезаем длинный текст под лимит Telegram </h2>
  <figure id="bnPx" class="m_original">
    <img src="https://img1.teletype.in/files/0a/d7/0ad7f5d6-17eb-4d50-a78a-72197b8da966.png" width="576" />
  </figure>
  <p id="TBhI"><strong>Что делает</strong></p>
  <ul id="Ndt2">
    <li id="nZsw">Берёт итоговый текст из предыдущего AI-агента (<code>$json.output</code>).</li>
    <li id="VUEs"><strong>Делит его на куски ≤ 4096 символов</strong> — это лимит одного сообщения в Telegram.</li>
    <li id="xtYn">Ставит «умные» разрывы: сначала ищет двойной перенос <code>\n\n</code>, потом обычный <code>\n</code>, и только если ничего не нашёл — режет «по живому».</li>
    <li id="5fFA">Возвращает <strong>массив объектов</strong> вида <code>{ text: &quot;&lt;кусок&gt;&quot; }</code> — каждый пойдёт отдельным сообщением дальше по цепочке.</li>
  </ul>
  <pre id="qo0L">Код для ноды код скопируй как есть




// Получаем длинный текст из предыдущего узла (AI-агента)
const longText = $json.output;

// Устанавливаем максимальную длину сообщения в Telegram
const maxLength = 4096;

// Место, где мы будем хранить готовые куски сообщения
const chunks = [];

let remainingText = longText;

// Запускаем цикл, который будет работать, пока не &quot;нарежем&quot; весь текст
while (remainingText.length &gt; 0) {
  // Если оставшийся текст уже помещается в одно сообщение, просто добавляем его и выходим
  if (remainingText.length &lt;= maxLength) {
    chunks.push(remainingText);
    break;
  }

  // Если текст слишком длинный, ищем последнее &quot;красивое&quot; место для разрыва
  // (двойной перенос строки) в пределах лимита
  let splitAt = remainingText.lastIndexOf(&#x27;\n\n&#x27;, maxLength);

  // Если не нашли двойного переноса (например, одна новость сама по себе &gt; 4096 символов),
  // то просто ищем последний перенос строки
  if (splitAt === -1) {
    splitAt = remainingText.lastIndexOf(&#x27;\n&#x27;, maxLength);
  }
  
  // Если даже обычного переноса не нашли, режем &quot;по живому&quot;, чтобы избежать бесконечного цикла
  if (splitAt === -1) {
      splitAt = maxLength;
  }

  // &quot;Откусываем&quot; кусок и добавляем его в наш массив
  chunks.push(remainingText.substring(0, splitAt));
  
  // Обновляем оставшийся текст
  remainingText = remainingText.substring(splitAt).trim();
}

// На выходе мы получаем массив из нескольких элементов,
// каждый из которых содержит кусок текста для отправки.
// Мы должны вернуть их в формате, который n8n сможет обработать по одному.
return chunks.map(chunk =&gt; ({
  json: {
    // Узел Telegram по умолчанию ищет текст в поле &#x27;text&#x27;.
    // Мы сразу кладем наш кусок в это поле.
    text: chunk
  }
}));</pre>
  <p id="UAbP"><strong>Как подключить</strong><br /> <code>AI Agent1 (форматирование) → Code (разрезка) → Telegram</code></p>
  <p id="lzTV"><strong>На что обратить внимание</strong></p>
  <ul id="Hapu">
    <li id="Yu7I">Если одна новость сама длиннее 4096, она тоже корректно <strong>будет разбита</strong> на несколько сообщений.</li>
    <li id="ytLh">Код уже учитывает тримминг, чтобы <strong>не было лишних пробелов</strong> в начале/конце сообщений.</li>
  </ul>
  <figure id="dX0N" class="m_original">
    <img src="https://img3.teletype.in/files/ed/28/ed28faf9-0d32-469b-ba2c-4b0816f0bf26.png" width="1123" />
  </figure>
  <h2 id="Qwiu">6) 📤 Нода <strong>Telegram — Send a text message</strong> — отправляем в канал</h2>
  <p id="GJnG"><strong>Что делает</strong></p>
  <ul id="oDaH">
    <li id="wThQ">Получает массив <code>{ text }</code> и <strong>отправляет каждую часть отдельным сообщением</strong> в указанный канал/чат.</li>
    <li id="4Xxs">Поле <strong>parse_mode: HTML</strong> — важно, потому что форматирование идёт HTML-тегами (<code>&lt;b&gt;</code>, <code>&lt;u&gt;</code>, <code>&lt;a&gt;</code>, <code>&lt;code&gt;</code>).</li>
  </ul>
  <p id="zN56"><strong>Как настроить</strong></p>
  <ul id="mR7S">
    <li id="sL1R"><strong>chatId</strong>: укажи <code>@username</code> канала или <strong>числовой ID</strong> чата.</li>
    <li id="2a35">В <strong>additionalFields</strong> оставь:</li>
    <ul id="6Xzt">
      <li id="QivR"><code>parse_mode: &quot;HTML&quot;</code></li>
      <li id="VOuP"><code>appendAttribution: false</code></li>
    </ul>
    <li id="FDSC">Убедись, что <strong>бот добавлен в канал</strong> и имеет права на публикацию (лучше — админ).<br /><br /></li>
  </ul>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h3 id="TdX9">🔢 Как получить <strong>числовой Chat ID</strong> в Telegram через n8n</h3>
    <p id="4ays">Сделаем это на чисто через <strong>Telegram Trigger</strong> в отдельном workflow — быстро и без API-ручек.</p>
    <p id="ixs3"><strong>Шаги:</strong></p>
    <ol id="D9Eb">
      <li id="OPD4"><strong>Создайте новый Workflow</strong> → добавьте ноду <strong>Telegram Trigger</strong>.</li>
      <li id="4yhr">В ноде выберите <strong>учётку бота</strong> (те же креды, что и в <code>Send a text message</code>).</li>
      <li id="yMy3">Нажмите <strong>Execute Workflow</strong> (или <strong>Execute Node</strong>).</li>
      <li id="Ckxx">Откройте Telegram и <strong>напишите любое сообщение</strong> этому боту:</li>
      <ul id="8NK4">
        <li id="58AJ">если нужен ID <strong>личного чата</strong> — пишите боту в личку;</li>
        <li id="p5ut">если нужен ID <strong>канала/группы</strong> — <strong>добавьте бота</strong> в канал/группу (лучше админом) и <strong>отправьте сообщение в этот канал/группу</strong>.</li>
      </ul>
      <li id="3ao2">Вернитесь в n8n → в <strong>Telegram Trigger</strong> появится выполненный запуск.</li>
      <li id="VxqY">Откройте <strong>Output</strong> ноды и <strong>скопируйте Chat ID</strong> (поле вроде <code>message.chat.id</code>).</li>
      <li id="RFMt">Вставьте это число в ноду <strong>Send a text message → chatId</strong>.</li>
    </ol>
    <p id="yKns"><strong>Полезно знать:</strong></p>
    <ul id="dLcZ">
      <li id="Yfh9">Для <strong>каналов/супергрупп</strong> ID обычно <strong>отрицательный</strong> и начинается на <code>-100…</code>.</li>
      <li id="e8lf">Если триггер не ловит сообщение — проверьте, что бот <strong>добавлен</strong> туда, где вы пишете, и у него есть <strong>права</strong>.</li>
      <li id="Srxb">Один раз получили ID — можете хранить в заметке и использовать дальше в любых workflow.</li>
    </ul>
    <p id="6vyt">Готово: теперь отправка через <code>Send a text message</code> пойдёт <strong>в нужный чат по числовому ID</strong>.</p>
  </section>
  <p id="U4dg"><strong>Практические советы</strong></p>
  <ul id="rKrR">
    <li id="7bO8">🧪 Протестируй сначала на личном чате с ботом: поставь свой <code>chatId</code>, нажми <strong>Execute</strong> и проверь разметку.</li>
    <li id="mUJt">⚠️ Если сообщений слишком много, Telegram может притормозить отправку — это нормально, просто дождись завершения.</li>
  </ul>
  <figure id="H5wD" class="m_original">
    <img src="https://img1.teletype.in/files/8e/4b/8e4bd4ec-f991-4268-b4ef-560f8f8b3a7e.png" width="746" />
    <figcaption>Schedule Trigger</figcaption>
  </figure>
  <h3 id="IsRR">7) ⏰ <strong>Schedule Trigger</strong> — переводим бота на ежедневный авто-запуск</h3>
  <p id="Oxqn">🧩 <strong>Зачем</strong><br /> Мы фильтруем новости за последние <strong>24 часа</strong>, значит логично запускать воркфлоу <strong>раз в день</strong>.</p>
  <hr />
  <h4 id="l4FI">Шаги настройки</h4>
  <ol id="2ItY">
    <li id="LdrR"><strong>Заменить ручной триггер</strong></li>
  </ol>
  <ul id="kHm0">
    <li id="XCOw">Удалите/отключите ноду <em>When clicking ‘Execute workflow’</em>.</li>
    <li id="mZ9B">Добавьте ноду <strong>Schedule Trigger</strong> и <strong>подключите её ко всем <code>RSS Read</code></strong>.</li>
  </ul>
  <ol id="ELSN">
    <li id="A1ny"><strong>Параметры <code>Schedule Trigger</code></strong> (см. скрин ниже):</li>
  </ol>
  <ul id="puUe">
    <li id="ayCj"><strong>Trigger Interval:</strong> <code>Days</code></li>
    <li id="mCXS"><strong>Days Between Triggers:</strong> <code>1</code></li>
    <li id="lvUh"><strong>Trigger at Hour:</strong> выберите час запуска </li>
    <li id="r0cZ"><strong>Trigger at Minute:</strong> <code>0</code></li>
  </ul>
  <blockquote id="OUCg">После этого воркфлоу будет стартовать <strong>каждый день</strong> в выбранное время.</blockquote>
  <figure id="EFU6" class="m_original">
    <img src="https://img4.teletype.in/files/fb/b2/fbb2cbfa-a4d9-4507-92ab-5fff401c7b8b.png" width="419" />
  </figure>
  <ol id="joc4">
    <li id="EEff"><strong>Синхронизируем часовой пояс</strong></li>
  </ol>
  <ul id="KzMf">
    <li id="Sgdl">Откройте <strong>Settings</strong> воркфлоу (иконка шестерёнки сверху).</li>
    <li id="3aJP">В поле <strong>Timezone</strong> укажите ваш часовой пояс (на скрине — <code>Europe/Moscow</code>).</li>
  </ul>
  <blockquote id="ZqgW">Это важно, чтобы время запуска совпадало с вашим локальным временем.</blockquote>
  <figure id="Z8lO" class="m_original">
    <img src="https://img2.teletype.in/files/1a/f5/1af507db-82b1-4313-bbc8-51a512347055.png" width="1256" />
  </figure>
  <p id="4hwb" data-align="center"><strong>Активировать воркфлоу</strong></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <ul id="Egp7">
      <li id="HB5h">Включите тумблер <strong>Activate</strong>.</li>
      <li id="F7CE">Для теста можно по-прежнему нажать <strong>Execute workflow</strong> (разовый ручной запуск).</li>
    </ul>
  </section>
  <hr />
  <p id="FKGG">📝 <strong>Короткие подписи к скриншотам</strong></p>
  <ul id="7lEA">
    <li id="KFsz">Скрин 1: <em>Параметры <code>Schedule Trigger</code>: ежедневный запуск в заданный час.</em></li>
    <li id="R5NB">Скрин 2: <em>Settings → Timezone: выставляем часовой пояс воркфлоу.</em></li>
  </ul>
  <hr />
  <p id="Vlek">⚠️ Если после авто-запуска новостей мало: вернитесь в <strong>GPT/Gemini</strong> и попросите <strong>7–10 актуальных RSS-лент под вашу нишу</strong>, затем добавьте/замените их в <code>RSS Read</code>.</p>
  <p id="wePV"></p>
  <p id="6QB6"></p>
  <p id="vYiH"></p>
  <h3 id="shyH">✅ Финал</h3>
  <p id="pPxe">Спасибо, что дочитали! Надеюсь, гайд был полезен и вы уже собрали своего новостного бота. Если остались вопросы — напишите, я отвечу и дополняю статью.</p>
  <p id="VNvi"><strong>Скачать/импортировать готовый workflow:</strong><br /> 👉 <a href="https://drive.google.com/file/d/11EaojfcVJGMxPJzUt2jt-KRypRRdKk3A/view?usp=sharing" target="_blank">https://drive.google.com/file/d/11EaojfcVJGMxPJzUt2jt-KRypRRdKk3A/view?usp=sharing</a></p>
  <p id="YmMx"><strong>Как импортировать в n8n (коротко):</strong><br /> <code>n8n → Workflows → Import from File/URL → выберите файл → Save → Activate</code></p>
  <p id="3gxO">Спасибо за внимание и удачных автозапусков! 🚀📬</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@paam_ai/Paam_001</guid><link>https://teletype.in/@paam_ai/Paam_001?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai</link><comments>https://teletype.in/@paam_ai/Paam_001?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=paam_ai#comments</comments><dc:creator>paam_ai</dc:creator><title>✨ Ваш отчёт уже в руках — и это только старт</title><pubDate>Mon, 14 Jul 2025 20:27:08 GMT</pubDate><description><![CDATA[Как за 5 минут превратить рефлексию в реальный рост]]></description><content:encoded><![CDATA[
  <p id="MJgK"><strong>Как за 5 минут превратить рефлексию в реальный рост</strong></p>
  <p id="oUE0"></p>
  <h4 id="dfT5">👋 Привет!</h4>
  <p id="98LO">Файл, который только что прислал <strong>Paam</strong>, — не сухая сводка.<br /> Это ваше <strong>личное топливо</strong>:</p>
  <ul id="seom">
    <li id="pIW4">комментарии-подсказки к каждому блоку;</li>
    <li id="CEoI">конкретные <strong>Paam-советы</strong> на завтра — готовый микро-план действий.</li>
  </ul>
  <blockquote id="HrgC">Возьмите из него <strong>одну-единственную мысль</strong>, которая откликается сильнее других.<br /> Примените её завтра — и вы уже обошли инерцию на круг.</blockquote>
  <hr />
  <h3 id="21Nn">🛠️ <strong>Важно знать</strong></h3>
  <p id="mcC9">Это <strong>первый</strong> — базовый — слой функционала.<br /> Дальше Paam будет расти вместе с вами:</p>
  <ul id="wVnp">
    <li id="Rdsq">автоматически <strong>сравнивать</strong> свежий отчёт с предыдущими днями;</li>
    <li id="eHAA">показывать <strong>корреляции</strong> (напр. «когда работаю &gt; 4 ч — становлюсь счастливее);</li>
    <li id="6XTT">подсвечивать <strong>паттерны</strong> эмоций и продуктивности;</li>
    <li id="Yvpl">предлагать персональные «микро рецепты» на основе накопленных данных.</li>
  </ul>
  <p id="uZvV">Сейчас мы закладываем фундамент, чтобы все эти модули имели, с чем работать.</p>
  <hr />
  <h2 id="oc8C">🔧 Мини-ритуал: 1 минута → системный рост</h2>
  <h3 id="LQ4H">1️⃣ Создайте <strong>«Свой Дневник»</strong></h3>
  <ol id="7Z5f">
    <li id="Imm2">Откройте <strong>Google Sheets</strong> → <em>Новая таблица</em>.</li>
    <li id="S7VJ">Назовите так, чтобы приятнее резонировало: <em>«Моя Рефлексия»</em>, <em>«Точка роста»</em>…</li>
    <li id="65rL">Это ваше безопасное пространство и внутренний компас.</li>
  </ol>
  <h3 id="xP0S">2️⃣ Зафиксируйте <strong>сегодняшний день</strong></h3>
  <ol id="LATr">
    <li id="bFeq">Откройте полученный <code>.xlsx</code>.</li>
    <li id="Fx4g"><strong>Скопируйте</strong> всю строку-отчёт <em>(Ctrl/Cmd + C)</em>.</li>
    <li id="M3Gv"><strong>Вставьте</strong> в первую свободную строку своего журнала <em>(Ctrl/Cmd + V)</em>.</li>
  </ol>
  <p id="ZMIJ">Щёлк — и мысли стали данными.</p>
  <hr />
  <h2 id="xbY8">📈 Почему это важно</h2>
  <ul id="rNvg">
    <li id="jRSe">Каждая строка — отпечаток вашего шага.</li>
    <li id="MjSw">1 % внедрения из отчёта ежедневно — через год превращается в экспоненциальный сдвиг.</li>
    <li id="AHXa">Уже через несколько недель ты увидишь: то, что сейчас кажется хаосом, на самом деле складывается в уникальный твой узор успехов, затыков и побед.</li>
  </ul>
  <p id="rTA3">Открывайте, копируйте, внедряйте — и встретимся завтра ещё сильнее.</p>
  <p id="7nxc"><strong>Путь уже начался. Продолжайте ковать свой меч.</strong> 🗡️<br /><br />По всем предложениям об улучшении или просто обратной связи пишите мне <a href="https://t.me/PAAM_AI" target="_blank">https://t.me/PAAM_AI</a><br /></p>

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