Создание мультимодальных визуальных агентов с Playwright и разметкой Set-of-Marks
Классическая автоматизация браузера через Selenium или Playwright по CSS-селекторам (вроде #submit-btn или div.container > button:nth-child(2)) невероятно хрупка: малейший редизайн сайта или обфускация классов ломает скрипт. Визуальные агенты (Vision Agents) используют скриншоты страницы и разметку Set-of-Marks (SoM), кликая по элементам так же, как живой человек.

Концепция Set-of-Marks: Как агент понимает координаты
Вместо того чтобы просить нейросеть угадать пиксельные координаты клика, скрипт на JavaScript выполняет разметку страницы: 1. Находит все интерактивные элементы (кнопки, ссылки, инпуты). 2. Отрисовывает поверх них полупрозрачные цветные рамки с уникальными номерами (1, 2, 3...). 3. Делает скриншот и отправляет его в мультимодальную модель (Claude 3.7 или GPT-4o). 4. Модель отвечает просто: «Кликни на элемент №14». Скрипт мгновенно кликает по центру рамки 14.
Полный рабочий скрипт агента на Python и Playwright
Пример инъекции скрипта разметки и анализа скриншота:
import asyncio
import base64
from playwright.async_api import async_playwright
from openai import AsyncOpenAI
client = AsyncOpenAI()
SOM_INJECTION_SCRIPT = """
() => {
let id = 1;
const elements = document.querySelectorAll('button, a, input, select, textarea');
elements.forEach(el => {
const rect = el.getBoundingClientRect();
if (rect.width > 10 && rect.height > 10 && window.getComputedStyle(el).visibility !== 'hidden') {
const box = document.createElement('div');
box.style.position = 'absolute';
box.style.left = rect.left + window.scrollX + 'px';
box.style.top = rect.top + window.scrollY + 'px';
box.style.width = rect.width + 'px';
box.style.height = rect.height + 'px';
box.style.border = '2px solid #00f5a0';
box.style.zIndex = '999999';
box.innerHTML = `<span style="background:#00f5a0;color:#000;font-size:12px;font-weight:bold;padding:1px 4px;">${id}</span>`;
document.body.appendChild(box);
el.setAttribute('data-som-id', id);
id++;
}
});
}
"""
async def run_vision_step(page):
# 1. Размечаем элементы номерами
await page.evaluate(SOM_INJECTION_SCRIPT)
screenshot_bytes = await page.screenshot()
base64_image = base64.b64encode(screenshot_bytes).decode('utf-8')
# 2. Спрашиваем модель
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Найди кнопку 'Войти' и назови только ее номер рамки."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{base64_image}"}}
]
}]
)
element_id = response.choices[0].message.content.strip()
await page.click(f"[data-som-id='{element_id}']")
print(f"Успешно кликнули на элемент #{element_id}")Преодоление модальных окон и бесконечного скролла
Визуальные агенты легко закрывают всплывающие окна с куками и баннеры, потому что видят крестик [X] на скриншоте независимо от того, какими сложными стилями он сверстан.
Аппаратная верификация и метрики кремния
vllm serve multimodal-vision-agents-playwright --tensor-parallel-size 4 --gpu-memory-utilization 0.95 --max-model-len 32768 --kv-cache-dtype fp8Artur Moiseyev
AI Systems Architect
Независимый AI-исследователь и архитектор распределенных систем. Разрабатываю мультиагентные системы, открытые reasoning-модели и инфраструктуру реального времени.
Связанные статьи справочника

Скилл Живого Голоса и Видеокамеры (Voice & Vision): как разговаривать с ИИ и показывать ему экран
Знаете ли вы, что в ChatGPT и Gemini можно включить живой голосовой разговор, навести камеру телефона на любой предмет или показать экран компьютера? Разбираем 7 крутых сценариев использования.

Революция генерации видео: Sora против Kling 1.5, Runway Gen-3 и Hailuo в 2026 году
Глубокое сравнение архитектур Diffusion Transformers (DiT). Оцениваем временную согласованность кадров, траектории виртуальной 3D-камеры, симуляцию физики и кинематографическое качество.

Как создать голосового AI-ассистента реального времени: Whisper, ElevenLabs и WebSockets
Разрабатываем голосового помощника с задержкой до 500 мс: двусторонний поток аудио через WebSockets, детекция прерываний голосом (Silero VAD) и генерация речи.