Уявіть: сайт конкурента оновив інтерфейс, і ваш RPA-бот, прив'язаний до селекторів на кшталт #price-block, почав видавати помилки. Знайома ситуація? Ми вирішуємо її за допомогою AI-агентів, які аналізують інтерфейс як людина — через скріншот і семантику елементів. Вони не ламаються при рефакторингу верстки і стійкі до антибот-захисту. За час роботи ми реалізували 30+ проектів автоматизації для e-commerce, логістики та фінансів.
Традиційний RPA-бот жорстко прив'язаний до DOM-структури. Змінився class кнопки — скрипт впав. AI-агент аналізує знімок екрана та семантику елементів, тому працює з будь-яким інтерфейсом — SPA, React, Vue, динамічні елементи. Гнучкість вища на порядок: рефакторинг фронтенду не ламає агента.
| Характеристика | RPA-бот | AI-агент |
|---|---|---|
| Стійкість до змін верстки | Низька (ламається при зміні класів) | Висока (семантичний пошук) |
| Робота з CAPTCHA | Вимагає інтеграції антикапчі | Може вирішувати через візуальний аналіз |
| Складність налаштування | Висока (точні селектори) | Низька (задача природною мовою) |
| Масштабування | Тільки задані сценарії | Адаптація під нові сторінки |
Що таке AI-агент і чим він відрізняється від RPA?
AI-агент — це програмний робот, який використовує мультимодальну велику мовну модель (LLM) та комп'ютерний зір для взаємодії з веб-інтерфейсом. На відміну від RPA, що працює за жорсткими селекторами, AI-агент бачить сторінку як людина: розпізнає кнопки, поля введення та інші елементи за їх візуальним представленням і контекстом. Це робить його стійким до змін верстки, заміни фреймворків і навіть до деяких видів антибот-захисту.
Як ми будуємо агента: архітектура
Використовуємо зв'язку Playwright + LLM (Claude, GPT-4). Playwright керує браузером, LLM приймає рішення — вибирає наступну дію на основі скріншоту та доступних елементів.
from playwright.async_api import async_playwright, Page from anthropic import Anthropic import asyncio import base64 import json client = Anthropic() class AIWebAgent: def __init__(self, headless: bool = True): self.headless = headless async def run(self, task: str, start_url: str) -> str: async with async_playwright() as p: browser = await p.chromium.launch(headless=self.headless) context = await browser.new_context( viewport={"width": 1280, "height": 800}, user_agent="Mozilla/5.0 (compatible; research-bot/1.0)" ) page = await context.new_page() await page.goto(start_url) result = await self._agent_loop(page, task) await browser.close() return result async def _get_page_state(self, page: Page) -> dict: screenshot = await page.screenshot(type="png") screenshot_b64 = base64.standard_b64encode(screenshot).decode() elements = await page.evaluate("""() => { const interactive = document.querySelectorAll( 'a, button, input, select, textarea, [role="button"]' ); return Array.from(interactive).slice(0, 50).map((el, idx) => ({ index: idx, tag: el.tagName.toLowerCase(), text: el.textContent?.trim().slice(0, 80) || '', type: el.type || '', placeholder: el.placeholder || '', })); }""") return { "url": page.url, "title": await page.title(), "screenshot": screenshot_b64, "elements": elements, } async def _execute_action(self, page: Page, action: dict) -> str: action_type = action.get("type") try: if action_type == "click": if "text" in action: await page.get_by_text(action["text"]).first.click() elif "element_index" in action: elements = await page.query_selector_all( 'a, button, input, select, textarea, [role="button"]' ) if action["element_index"] < len(elements): await elements[action["element_index"]].click() elif action_type == "fill": await page.fill(action["selector"], action["value"]) elif action_type == "navigate": await page.goto(action["url"]) elif action_type == "scroll": amount = action.get("amount", 500) direction = 1 if action.get("direction", "down") == "down" else -1 await page.evaluate(f"window.scrollBy(0, {direction * amount})") elif action_type == "extract": return await page.evaluate( f'document.querySelector({json.dumps(action.get("selector", "body"))})?.textContent?.trim()' ) await asyncio.sleep(0.5) return "success" except Exception as e: return f"error: {e}" async def _agent_loop(self, page: Page, task: str) -> str: messages = [] system = """Ты — AI веб-агент. Выполняй задачи в браузере. Доступные действия (верни JSON): - {"type": "click", "text": "текст кнопки"} - {"type": "fill", "selector": "CSS", "value": "текст"} - {"type": "navigate", "url": "https://..."} - {"type": "scroll", "direction": "down", "amount": 500} - {"type": "extract", "selector": ".result"} - {"type": "done", "result": "итоговый результат"} Формат ответа: REASONING: <что видишь и что планируешь> ACTION: <JSON с одним действием>""" for _ in range(20): state = await self._get_page_state(page) user_content = [ {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": state["screenshot"]}}, {"type": "text", "text": f"Задача: {task}\nURL: {state['url']}\nЭлементы:\n{json.dumps(state['elements'][:20], ensure_ascii=False)}"} ] messages.append({"role": "user", "content": user_content}) response = client.messages.create( model="claude-opus-4-5", max_tokens=1024, system=system, messages=messages, ) reply = response.content[0].text messages.append({"role": "assistant", "content": reply}) try: action_line = [l for l in reply.split("\n") if l.startswith("ACTION:")][0] action = json.loads(action_line.replace("ACTION:", "").strip()) except (IndexError, json.JSONDecodeError): continue if action.get("type") == "done": return action.get("result", "Task completed") await self._execute_action(page, action) return "Max iterations reached" Технічна реалізація антибот-захисту
async def setup_stealth_context(playwright): browser = await playwright.chromium.launch( headless=False, args=["--disable-blink-features=AutomationControlled"] ) context = await browser.new_context( viewport={"width": 1366, "height": 768}, locale="ru-RU", timezone_id="Europe/Moscow", ) await context.add_init_script( "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" ) return context Сучасні сайти активно блокують автоматизацію. Ми додаємо модифікацію navigator.webdriver, реалістичний User-Agent, випадкові затримки між діями та ротацію проксі. Агент може обходити навіть складні схеми — Cloudflare, DataDome, Akamai.
Чому AI-агент швидше за людину?
Людина витрачає на моніторинг 200 товарів у 5 конкурентів близько 4 годин на день. AI-агент робить те ж за 35 хвилин і формує Excel-звіт. Швидкість реакції на зміну цін скорочується з 2 днів до 2 годин.
Як AI-агент обробляє CAPTCHA?
Для вирішення CAPTCHA агент робить скріншот елемента і відправляє його мультимодальній LLM. Модель розпізнає текст або вибирає правильні зображення. Це позбавляє від інтеграції сторонніх сервісів антикапчі та прискорює проходження — в середньому 3–5 секунд на одну перевірку.
Типові сценарії
- Моніторинг конкурентів — ціни, акції, асортимент.
- Заповнення форм — тендери, реєстрація, держпослуги.
- Збір відгуків — агрегація з кількох майданчиків.
- Регресійне тестування UI — автоматична перевірка сценаріїв.
Кейс: мережа будівельних магазинів
Наш клієнт — мережа будівельних магазинів — щодня моніторив ціни 200 SKU у 5 конкурентів вручну. Ми розгорнули AI-агента: він обходить сайти, витягує ціни та наявність, формує Excel з відхиленнями. Задача виконується за 35 хвилин. Результат: менеджер витрачає 15 хвилин на аналіз готового звіту замість 4 годин збору даних. Реакція на зміну цін прискорилась з 1–2 днів до кількох годин.
Що входить в роботу
- Розробка AI-агента під ваш сценарій.
- Вихідний код та документація українською.
- Налаштування антибот-захисту та проксі (за потреби).
- Інтеграція з вашими системами через API або експорт даних.
- Навчання співробітників роботі з агентом.
- Технічна підтримка протягом першого місяця.
Процес роботи
- Аналіз — вивчаємо цільові сайти, антибот-захист, структуру даних.
- Проектування — вибираємо стек (модель, фреймворк, проксі).
- Реалізація — кодимо агента, налаштовуємо пайплайн.
- Тестування — прогоняємо на наборі складних сценаріїв.
- Деплой — розміщуємо на сервері з моніторингом.
Терміни орієнтовно
- Базовий агент для одного сайту: 3–5 днів.
- Універсальний агент з візуальним сприйняттям: 1–2 тижні.
- Моніторинг цін зі звітами: 1 тиждень.
- Антибот-захист та проксі: +1 тиждень.
Вартість розраховується індивідуально. Гарантуємо стабільну роботу агента за умови незмінності цільових сайтів. Оцінимо ваш проект за 1 день — зв'яжіться з нами. Замовте розробку AI-агента для вашого бізнесу. Отримайте консультацію по вашому сценарію автоматизації — напишіть нам.







