HTTP и веб

Четыре ноды в группе «HTTP и веб» решают три разные задачи, и путать их дорого: http_request ходит в любой API как шаг графа, fetch_webpage даёт агенту прочитать страницу по ссылке, а websearch и openrouter_web_search ищут в интернете — но первый бесплатен и умеет только заголовки со сниппетами, а второй стоит кредитов и возвращает выдержки текста вместе с ответом модели.

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

http_request — универсальная дверь наружу

Это единственная нода, которая делает произвольный HTTP-запрос: метод, адрес, заголовки, параметры строки запроса, тело. Всё, чего в платформе нет отдельной интеграцией, делается ею — от вызова внутреннего сервиса компании до API, про которое мы никогда не слышали.

Вход
HTTP-запрос
Ответ
Выход
  • Исполнение + данные
Типичная форма: вход даёт данные, запрос уходит наружу, ответ разбирается шаблоном.

Что настраивается

ПолеЗначенияЗамечание
MethodGET, POST, PUT, PATCH, DELETE, HEADу GET и HEAD тело не отправляется, что бы ни стояло в Body
URLhttp/httpsшаблонизируется
HeadersJSON-объектшаблонизируется целиком, а не по значениям
Query ParametersJSON-объектчисла и булевы приводятся к строке автоматически
Body Typenone · json · text · formform — это application/x-www-form-urlencoded, задаётся JSON-объектом
Bodyстрокашаблонизируется; для json обязан после подстановки быть валидным JSON
Auth Typenone · bearer · basic · custom headerзаполняет заголовок Authorization за вас
Timeout1…120 секунд, по умолчанию 30тариф может опустить потолок, но не поднять
Max Response Bytes1 КиБ…10 МБ, по умолчанию 1 МБответ длиннее обрезается
Follow Redirectsвключенокаждый переход проверяется заново
Parse JSON Responseвключенотело разбирается только если сервер объявил JSON
Fail on 4xx/5xxвключеновыключите, если 404 для вас нормальный ответ

Шаблоны и секреты

Адрес, заголовки, параметры, тело и поля авторизации проходят через шаблонизатор. То есть в них работает и {{ inputs.input }}, и {{ nodes.<id>.output.<поле> }}, и {{ secret.ИМЯ }}.

URL      https://api.example.com/v1/orders/{{ inputs.input.order_id }}
Headers  {"X-Api-Key": "{{ secret.SHOP_API_KEY }}"}
Body     {"comment": {{ nodes.llm_1.output | tojson }}}

Ключ живёт в НастройкиСекреты, а не в графе. Это не гигиена ради гигиены: граф можно экспортировать, показать коллеге или отдать ассистенту, и вставленный прямо в JSON токен уедет вместе с ним.

Что нода отдаёт дальше

Ответ приходит одним объектом. {{ nodes.<id>.output }} — это весь он целиком.

ПолеЧто внутри
status_codeкод ответа числом
oktrue для 2xx
bodyразобранный JSON, если сервер отдал JSON и разбор включён; иначе строка
textсырой текст ответа всегда
headersзаголовки ответа
urlитоговый адрес после всех перенаправлений
elapsed_msвремя запроса в миллисекундах

Ветка ошибки здесь включена по умолчанию

У большинства нод выход on_error выключен и включается вручную (см. Ошибки нод). У http_request он включён сразу — это единственная нода каталога с таким дефолтом, и причина в природе задачи.

Чужой сервер отвечает 500, отдаёт 429, молчит до таймаута или роняет соединение — это не поломка вашего воркфлоу, а нормальный, ожидаемый исход обращения к чужой инфраструктуре. Если бы ветка была выключена, самый частый сбой в продукте приводил бы к одному и тому же: весь запуск падает, клиент в чате не получает ничего, а автор узнаёт об этом из списка запусков. С включённой веткой вы решаете сами — написать «сервис недоступен, попробуйте позже», сходить в резервный источник, отправить письмо себе.

HTTP-запрос
Ответ клиенту
Сервис недоступен
Выход
  • Исполнение + данные
Выход ошибки и выход успеха взаимоисключающие: сработает ровно один, поэтому обе ветви спокойно сходятся в один выход.

Что именно уводит управление в ветку ошибки: сетевой сбой, таймаут, а при включённом Fail on 4xx/5xx — ещё и любой не-2xx ответ. Выключите тумблер, если код ответа для вас — данные (например, 404 означает «такого клиента нет»): тогда нода всегда уходит в успех, а вы ветвитесь по {{ nodes.<id>.output.ok }} обычным условием.

В ветку ошибки приезжает объект с кодом и текстом. Тело чужого ответа автор видит: сервис за адресом принадлежит ему, и его слова — это и есть диагноз. Собеседнику в чате оно не показывается никогда.

Куда нода ходить не будет

Все исходящие запросы платформы идут через защищённый клиент. Он резолвит имя хоста и отказывает, если адрес попадает в приватный диапазон: loopback, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, link-local 169.254.0.0/16 (это адрес метаданных облака), multicast и зарезервированное. Перенаправления при этом отслеживаются вручную и проверяются на каждом переходе — иначе публичный адрес, отвечающий 302 на http://169.254.169.254/, обходил бы проверку целиком.

Ограничение не косметическое: адрес в поле URL — шаблон, а значит его часть может прийти из сообщения пользователя. Без такой проверки чат-бот превращается в сканер внутренней сети того сервера, на котором он работает.

fetch_webpage — чтение страницы агентом

Загрузить веб-страницуT

У этой ноды нет ни входа запуска, ни выхода успеха: она существует только как инструмент агента. Поставьте её на холст, протяните tool_out в порт расширений ai_agent — и модель сама решит, когда открыть ссылку.

Что делает: скачивает страницу, вытаскивает основное содержимое и конвертирует HTML в Markdown, отбрасывая навигацию и разметку. Модель получает читаемый текст, а не тег <div> в тысячу символов. Настройки — предел длины (по умолчанию 8000 символов, до 50 000), таймаут (по умолчанию 20 секунд) и потолок на размер сырого ответа. Предел принадлежит автору, а не модели: модель не может попросить больше, чем вы разрешили.

Проверка адресов у неё та же, что у http_request: ссылку, ведущую во внутреннюю сеть, инструмент отклоняет, и модель получает ответ «этот адрес недопустим», а не текст с внутреннего сервиса.

Два поиска, и они не взаимозаменяемы

websearchopenrouter_web_search
Как подключаетсятолько инструмент агентаи шаг графа, и инструмент агента
ИсточникDuckDuckGoпоиск на стороне OpenRouter вместе с вызовом модели
Что возвращаетзаголовок, короткий сниппет, ссылкаответ модели плюс источники с выдержками текста
Ценабесплатнокредиты за каждый поиск
Когда брать«найди ссылку», дальше читает fetch_webpageкогда нужен связный ответ с цитатами

websearch отдаёт до десяти результатов (по умолчанию пять) — этого хватает, чтобы агент нашёл нужную страницу и прочитал её fetch_webpage. Пара из этих двух нод — бесплатная замена платному поиску, если вы готовы к тому, что качество выдержек ниже, а раундов агента больше.

openrouter_web_search — отдельная тема со своими режимами, движками и способом счёта денег: Веб-поиск.

Веб-поискT
ИИ-агент
Загрузить веб-страницуT
  • Расширение
Бесплатная связка: агент ищет и тут же читает найденное. Обе ноды подключаются связью расширения.

Что дальше