Проксі для ШІ-агентів: як підключити Playwright, LangChain та n8n
Де в ШІ-агенті місце проксі та як налаштувати його в Python, Playwright, сервері Playwright MCP і n8n, з робочим кодом.
ШІ-агент, який відкриває сайти, читає документи чи викликає інструменти, надсилає звичайні HTTP-запити, і вони виходять звідти, де працює ваш код. Проксі дає змогу обрати цю відправну точку: країну, мережу мобільного оператора чи сервер у дата-центрі.
У цьому посібнику ви дізнаєтеся, де в агенті місце проксі, як налаштувати його в Python, Playwright, сервері Playwright MCP та n8n, як тримати один IP на одне завдання й як не пускати облікові дані в промпти та журнали. Усі приклади містять заглушки й розраховані на законний доступ до публічних сторінок із розумними лімітами запитів.
- Ставте проксі на інструмент, який робить вихідні запити: HTTP-клієнт, браузер чи крок завантаження. Виклики API моделі через нього йти не мусять.
- Підійде будь-який фреймворк, що приймає URL проксі або опцію проксі в Playwright: Xameleon працює через HTTP(S) і SOCKS5 із логіном та паролем.
- Тримайте один IP на все завдання, а змінюйте його між завданнями: у кабінеті чи зі свого коду через API.
- Беріть мобільні проксі, коли важлива мережа оператора, а проксі дата-центрів — для серверних перевірок, де це неважливо.
- Облікові дані мають лежати в змінних середовища чи сховищі секретів, а не в промптах, описах інструментів або журналах.
- Трафік оплачується за ГБ, тому завантажуйте текст, кешуйте результати й обмежуйте кількість сторінок на завдання. Дотримуйтеся robots.txt, умов сайтів і лімітів запитів.
1.Навіщо ШІ-агенту власний мережевий шлях
Агент із вебінструментами шукає, відкриває сторінки, заповнює форми в headless-браузері та викликає API. Усе це мережевий трафік з вашого сервера, і після початку реальної роботи важливі три речі.
- Локація. Багато сторінок залежать від країни: мова, ціни, наявність, юридичні повідомлення. Хмарний сервер стоїть в одному місці, тож агенту, який має прочитати сторінку як відвідувач з України чи Німеччини, потрібне з’єднання звідти.
- Сталість. Багатокрокове завдання, як-от вхід в акаунт, пошук з фільтрами чи перевірка кошика, виконується краще з однієї стабільної адреси, ніж з нової при кожному виклику.
- Контроль. Один проксі на агента чи завдання дає єдине місце, де можна рахувати трафік, ставити ліміти й читати журнали, а мережеві облікові дані лишаються окремо від коду.
Проксі потрібен не завжди. Публічні API, сайти з документацією та ваші власні сервіси чудово працюють із сервера. Додайте проксі, коли від локації чи типу мережі залежить те, що бачить агент. На сторінці проксі для ШІ-агентів та LLM-інструментів перелічено типові завдання, а проксі для веб-скрейпінгу розповідають про збір даних загалом.
2.Де в агенті місце проксі
Агент — це цикл: модель вирішує, інструмент діє, результат повертається до моделі. Проксі належить до боку інструментів у цьому циклі.
Проксі потрібен інструменту, а не моделі. Якщо пускати виклики до провайдера моделі через проксі, зростають витрати й з’являється ще одна точка відмови, а сторінки, які читає агент, від цього не змінюються. На практиці проксі прописують в одному з таких місць:
- HTTP-клієнт усередині функції завантаження чи пошуку (Python
requestsабоhttpx, Node.jsundici); - параметри запуску браузерного інструмента (Playwright, Puppeteer, Selenium);
- конфігурація MCP-сервера, що завантажує чи переглядає сторінки;
- параметр проксі у вузлі робочого процесу, наприклад у вузлі
HTTP Requestв n8n.
Одна пастка: багато HTTP-бібліотек самі читають змінні середовища HTTP_PROXY і HTTPS_PROXY, зокрема й клієнт усередині SDK провайдера моделі. Якщо експортувати їх на весь процес, виклики до моделі теж підуть через проксі. Тож задавайте проксі на власному клієнті інструмента або додайте хост моделі до NO_PROXY.
3.Мобільні проксі чи проксі дата-центрів для агентів
Обидва типи працюють з усіма інструментами цього посібника, а вибір залежить від того, що має побачити агент і скільки він працює. У матеріалах що таке мобільні проксі та мобільні проксі проти проксі дата-центрів різницю описано докладно. Для агентів вона зводиться до такого:
| Питання | 4G мобільні проксі | Проксі дата-центрів |
|---|---|---|
| Звідки береться IP | Модем у мережі мобільного оператора | Сервер у дата-центрі |
| Як оплачується | Спільні: за ГБ. Ексклюзивні: модем на період із включеним трафіком | IP на період із включеним трафіком |
| Підходить агентам, які | перевіряють сторінки так, як їх бачать відвідувачі в мережі оператора, або працюють довшими стабільнішими сесіями | завантажують публічні сторінки й API, де тип мережі неважливий |
| На що зважати | Мобільне з’єднання повільніше, ніж у дата-центрі, а ГБ трафіку коштує дорожче | Сторінки, які по-різному ставляться до серверних і операторських адрес |
| Змінити IP | Спільні переносять на інший модем тієї самої країни; ексклюзивні перезапускають модем | Ви отримуєте іншу IP-адресу сервера |
Почніть із дешевшого варіанта, який дає агентові правильну картину, і виміряйте трафік реального завдання, перш ніж масштабувати. Країни, які можна замовити, показано на сторінках 4G мобільних проксі і проксі дата-центрів. Тарифи за країнами наведено на сторінці цін.
4.Перевірте проксі, перш ніж підключати агента
Спершу перевірте проксі окремо, щоб згодом збій міг виникнути лише в агенті. У кабінеті є хост, порт, логін і пароль. Підставте їх замість заглушок і викличте наш публічний ендпоінт, що повертає IP-адресу й країну, які бачить сервер (до 30 запитів на хвилину з однієї адреси, нічого не зберігається):
curl -x http://USERNAME:PASSWORD@HOST:PORT https://xameleon.cloud/api/tools/ip
# {"ip":"203.0.113.25","country":"UA"}Якщо у відповіді адреса оператора та країна, яку ви замовили, проксі працює. Для тієї самої мети є безкоштовні інструменти: перевірка IP і тест затримки. Для SOCKS5 скористайтеся --proxy socks5h:// з тими самими даними.
5.Один IP на завдання, новий IP між завданнями
У Xameleon IP стабільний (sticky): він лишається тим самим, поки ви працюєте. Таймера й зміни при кожному запиті немає, тож момент зміни адреси обираєте ви. Для агентів важливі дві деталі:
- Паузи. Після паузи близько 10 хвилин без з’єднань наступне з’єднання може отримати інший IP. Агент, що чекає на схвалення кроку людиною, має сприймати свій наступний запит як новий старт.
- Зміна IP. Натисніть «Змінити IP» у кабінеті або викличте API зі свого коду. Опис API керування проксі є на сторінці API. Робіть це між завданнями, а не посеред завдання.
Записуйте IP і країну на початку кожного завдання. Якщо пізніше запуск виглядатиме дивно, ви знатимете, з якої адреси він ішов. У посібнику як ротувати проксі показано, як поєднати sticky IP з кількома проксі в коді.
6.Інструмент завантаження для LangChain, LlamaIndex чи власного циклу
Найпростіший інструмент агента — функція, що завантажує сторінку й повертає її текст. Напишіть її один раз із проксі всередині та віддайте будь-якому фреймворку. URL проксі збирається зі змінних середовища, а логін і пароль кодуються через відсотки:
import os
from urllib.parse import quote
import requests
def proxy_url() -> str:
user = quote(os.environ["PROXY_USER"], safe="")
password = quote(os.environ["PROXY_PASS"], safe="")
return f"http://{user}:{password}@{os.environ['PROXY_HOST']}" # PROXY_HOST is HOST:PORT
SESSION = requests.Session()
SESSION.proxies.update({"http": proxy_url(), "https": proxy_url()})
SESSION.headers["User-Agent"] = "my-agent/1.0 (contact: [email protected])"
def fetch_page(url: str) -> str:
"""Download a public web page and return its text (the first 20,000 characters)."""
r = SESSION.get(url, timeout=(5, 20))
r.raise_for_status()
return r.text[:20000]Обидва фреймворки перетворюють звичайну функцію на інструмент. Рядок документації стає описом, який читає модель, тому в ньому має бути лише суть завдання й нічого більше:
# LangChain
from langchain_core.tools import tool
fetch_tool = tool(fetch_page)
# LlamaIndex
from llama_index.core.tools import FunctionTool
fetch_tool = FunctionTool.from_defaults(fn=fetch_page)Повертайте текст, а не сирий HTML: прибирайте скрипти, меню й футери, перш ніж сторінка потрапить до моделі, бо кожен зайвий символ коштує токенів і трафіку. Якщо стек вашого агента написано на Node.js, той самий результат дає undici з проксі-агентом:
import { ProxyAgent, fetch } from "undici";
const token = Buffer.from(`${process.env.PROXY_USER}:${process.env.PROXY_PASS}`).toString("base64");
const agent = new ProxyAgent({ uri: `http://${process.env.PROXY_HOST}`, token: `Basic ${token}` });
export async function fetchPage(url) {
const res = await fetch(url, { dispatcher: agent, signal: AbortSignal.timeout(20000) });
return (await res.text()).slice(0, 20000);
}Більше варіантів для Python, зокрема httpx, SOCKS5, тайм-аути й повторні спроби, є в посібнику з проксі для Python.
7.Браузерні інструменти: Playwright і Playwright MCP
Коли сторінці потрібен JavaScript, агент керує справжнім браузером. Playwright приймає проксі в параметрах запуску, а логін і пароль — окремими полями:
import os
from playwright.sync_api import sync_playwright
PROXY = {
"server": f"http://{os.environ['PROXY_HOST']}", # HOST:PORT
"username": os.environ["PROXY_USER"],
"password": os.environ["PROXY_PASS"],
}
def read_page(url: str) -> str:
"""Open a public page in a browser and return the visible text."""
with sync_playwright() as p:
browser = p.chromium.launch(proxy=PROXY)
page = browser.new_page()
# skip images, media and fonts: they only cost traffic
page.route("**/*", lambda route: route.abort()
if route.request.resource_type in {"image", "media", "font"} else route.continue_())
page.goto(url, timeout=30000)
text = page.inner_text("body")
browser.close()
return text[:20000]У Node.js той самий параметр виглядає як chromium.launch({ proxy: { server, username, password } }). Запускайте один браузер на завдання, щоб усе завдання йшло через один проксі й один IP. Chromium не підтримує SOCKS5 з логіном і паролем у налаштуваннях проксі, тож для браузерних інструментів беріть дані HTTP(S) із кабінету.
Playwright MCP
Сервер Playwright MCP дає змогу MCP-клієнту, як-от IDE чи настільному асистентові, керувати браузером. Параметри браузера він читає з файлу конфігурації. Вкажіть цей файл у налаштуваннях MCP-клієнта:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest", "--config", "/path/to/playwright-mcp.json"]
}
}
}Потім додайте проксі до параметрів запуску в цьому файлі:
{
"browser": {
"launchOptions": {
"proxy": { "server": "http://HOST:PORT", "username": "USERNAME", "password": "PASSWORD" }
}
}
}Тримайте цей файл поза репозиторієм і з доступом лише для вас, бо в ньому пароль. Назви параметрів змінюються між релізами, тому перевірте npx @playwright/mcp@latest --help і документацію проєкту для вашої версії.
8.Робочі процеси в n8n
В n8n проксі — це налаштування вузла, який робить запит. Кроки для вузла HTTP Request:
- Відкрийте вузол, оберіть
Add option, а даліProxy. - Введіть
http://USERNAME:PASSWORD@HOST:PORT, найкраще зі змінної середовища чи облікових даних, а не вписаним у сам процес. - Надішліть тестовий запит на
https://xameleon.cloud/api/tools/ipі перевірте адресу та країну у відповіді. - Додайте справжній запит, указавши тайм-аут і налаштування повторних спроб вузла.
Самостійно розгорнутий n8n також може читати HTTP_PROXY і HTTPS_PROXY для всього екземпляра, але тоді ці змінні діють на кожен вузол. У n8n Cloud змінні середовища задати не можна, тож там користуйтеся параметром вузла; перевірте документацію n8n для вашої версії. Якщо HTTPS-запити не проходять через HTTP-проксі, спершу перевірте той самий URL через curl, оновіть n8n і зазирніть на форум спільноти n8n, де цей випадок обговорювали.
Для сторінок, яким потрібен браузер, не втискайте Playwright у вузол процесу. Запустіть функцію read_page з попереднього розділу як невеликий сервіс і викликайте його з n8n через HTTP. Проксі лишається в цьому сервісі, а процес передає тільки URL.
9.Не пускайте облікові дані в промпти, описи інструментів і журнали
Агент багато «говорить». Промпти, описи інструментів, результати інструментів і повідомлення про помилки надсилаються провайдеру моделі, потрапляють у трейси й часто зберігаються. Пароль проксі, що опинився в будь-якому з них, більше не є секретом.
| Де витікає | Що робити |
|---|---|
| Промпти й описи інструментів | Давайте моделі назву функції та рядок документації. Секрет код бере зі змінних середовища. |
| Аргументи й результати інструментів | Не робіть проксі параметром, який модель може задавати чи бачити. Повертайте лише текст сторінки. |
| Журнали й трейси | Записуйте ідентифікатор завдання, країну й хост. Перед записом маскуйте ://user:pass@. |
| Репозиторії та знімки екрана | Користуйтеся змінними середовища, сховищем секретів або файлом поза репозиторієм. |
Невелика функція маскування для журналів:
import re
def redact(text: str) -> str:
"""Mask the login and password in any proxy URL inside a log line."""
return re.sub(r"(://)[^/@\s]+@", r"\1***@", text)Якщо пароль коли-небудь з’явиться в промпті чи журналі, змініть його в кабінеті. Більше про збереження облікових даних — у посібнику про безпечне й відповідальне використання проксі.
10.Плануйте трафік і поводьтеся ввічливо
Агент, якому дозволили вільно переглядати сторінки, може завантажити сотні сторінок заради одного питання. Трафік оплачується за ГБ, а чужі сервери витрачають ресурси на кожен запит, тож задайте бюджет для кожного завдання:
class Budget:
def __init__(self, max_pages: int = 20, max_bytes: int = 2_000_000):
self.max_pages, self.max_bytes = max_pages, max_bytes
self.pages = self.bytes = 0
def spend(self, size: int) -> None:
self.pages += 1
self.bytes += size
if self.pages > self.max_pages or self.bytes > self.max_bytes:
raise RuntimeError("task budget used up")- Кеш. Зберігайте результати за URL і не завантажуйте ту саму сторінку двічі за запуск.
- Обмежуйте паралельність. Запускайте на один сайт кілька завдань одночасно, а не десятки. Для більшої паралельності замовляйте більше проксі, а не вичавлюйте більше з одного з’єднання.
- Сповільнюйтеся при помилках. Робіть паузу, коли сайт відповідає 429 чи 5xx, і поважайте заголовок
Retry-After. - Дотримуйтеся правил сайту. Читайте
robots.txtй умови використання, вказуйте чеснийUser-Agentз контактною адресою та збирайте лише те, що вам дозволено використовувати.
У матеріалі веб-скрейпінг у масштабі докладніше про бюджети запитів і обробку помилок, а наступні статті серії розповідають про збір даних для навчання ШІ та RAG і перевірку відповідей ШІ-пошуку за країнами. У політиці прийнятного використання перелічено, для чого сервіс використовувати не можна.
11.Типові помилки
| Що йде не так | Чому | Виправлення |
|---|---|---|
| Виклики до моделі сповільнюються чи падають | HTTPS_PROXY експортовано на весь процес, тож SDK моделі йде через проксі | Задайте проксі на клієнті інструмента або додайте хост моделі до NO_PROXY |
| Пароль з’являється в трейсі | URL проксі передали як аргумент інструмента чи надрукували в помилці | Читайте його зі змінних середовища всередині інструмента й маскуйте рядки журналу |
| Багатокрокове завдання поводиться дивно | IP змінили посеред завдання, або через довгу паузу сесія завершилася | Змінюйте IP між завданнями й тримайте паузи короткими |
InvalidURL або помилки автентифікації | Спеціальні символи в логіні чи паролі не закодовано через відсотки | Скористайтеся quote(value, safe="") |
| Агент зависає | Немає тайм-ауту для запиту чи браузера | Задайте тайм-аути підключення й читання та ліміт часу на все завдання |
| Трафік швидко закінчується | Агент завантажує повні сторінки із зображеннями або повертається на ті самі сторінки | Повертайте текст, пропускайте важкі файли, кешуйте за URL і задайте ліміт сторінок |
| Не вдається відтворити запуск | Ніхто не записав країну, IP чи проксі | Записуйте їх на початку кожного завдання |
12.Часті запитання
Чи потрібні ШІ-агентам проксі?
Не завжди. Вони допомагають, коли від локації чи типу мережі залежить те, що бачить агент, коли багатокрокове завдання потребує однієї адреси на весь свій перебіг або коли хочеться мати одне місце для обліку й обмеження вихідного трафіку.
Як додати проксі до агента LangChain?
Підключіть проксі всередині інструмента, що завантажує сторінки, як у розділі 6, і передайте цю функцію LangChain через tool(fetch_page). Клієнт моделі лишається без проксі.
Чи може Playwright працювати з SOCKS5-проксі з логіном і паролем?
Chromium не підтримує автентифікацію SOCKS5 у налаштуваннях проксі. Для браузерних інструментів беріть дані HTTP(S), а SOCKS5 лишайте для інструментів, що його підтримують, наприклад curl і Python з SOCKS-розширенням.
Скільки агентів можуть ділити один проксі?
Це залежить від трафіку, який ви використовуєте, і від лімітів запитів сайтів, які ви відвідуєте, а не від фіксованого числа. Дайте кожному паралельному завданню власний бюджет і паузи. Якщо потрібно більше паралельної роботи, замовте більше проксі.
Чи може агент сам змінити IP?
Так, через API, але робіть це з коду оркестрації між завданнями, а не як інструмент, який модель може викликати як завгодно. Ендпоінти описано на сторінці API.
Який тип проксі кращий для ШІ-агентів?
Беріть мобільні проксі, коли для того, що читає агент, важлива мережа оператора, і проксі дата-центрів для серверних перевірок, де це неважливо. Порівняння є в розділі 3.
Лишилися запитання про мобільні проксі? Відвідайте нашу сторінку FAQ щоб отримати детальні відповіді, або зверніться до нашої підтримки — ми допоможемо.