Разбор платформы TinyFish: почему специализированная модель Mako эффективнее тяжелых Vision-моделей, как работает маскировка на уровне C++ ядра Chromium и как безопасно пускать ИИ-агентов в закрытые веб-интерфейсы.

Большинство демонстраций с автономными ИИ-агентами выглядят безупречно ровно до того момента, пока агенту не поручают поработать с реальным сайтом. На презентационных слайдах агент шустро бронирует отели, выгружает прайс-листы поставщиков и мониторит конкурентов. Но в бою за пределами стерильных API его встречают динамический рендеринг на тяжелых SPA, постоянные проверки Cloudflare, всплывающие окна согласия на куки и закрытые зоны авторизации.

Классическая автоматизация на Selenium или Playwright слишком хрупкая: разработчики меняют верстку, селекторы кнопок плывут, и скрипт падает с ошибкой тайм-аута. Попытка натравить на браузер современные мультимодальные модели через Computer Use (когда модель смотрит на скриншот рабочего стола и пытается кликать мышкой по пикселям) оборачивается чудовищными расходами на токены и задержками по 10–15 секунд на каждый клик.

В 2024 году команда во главе с Судишем Наиром (бывшим президентом Nutanix и экс-CEO ThoughtSpot) основала стартап TinyFish, а в августе 2025 года привлекла $47M в раунде Series A от фонда ICONIQ Growth. Вместо того чтобы городить очередной легковесный парсер, они построили сквозную облачную веб-инфраструктуру для агентов, объединившую специализированную модель действий, бессерверный пул браузеров с аппаратной маскировкой и защищенное хранилище паролей.

flowchart TD
    Task[Задача агента: цель и стартовый URL] --> Engine[TinyFish Infrastructure]
    Engine --> Model[Модель Mako: семантический анализ DOM]
    Model --> Browser[Stealth Browser: C++ патчи Chromium]
    Browser --> Net[Резидентные прокси: US, EU, JP]
    Browser --> Vault[Vault & Profiles: безопасная сессия]
    Browser --> Result[Типизированный JSON по схеме output_schema]

Развилка подходов: пиксели против семантического DOM

Сегодня в индустрии веб-агентов борются два принципиально разных подхода:

  1. Vision-агенты (Computer Use, OpenAI Operator). Модель делает скриншот страницы, скармливает его тяжелой визуальной LLM, высчитывает координаты элементов в пикселях и эмулирует аппаратные события мыши.
  2. Семантические веб-модели (TinyFish Mako). Модель подключается напрямую к дереву элементов веб-страницы, отсекает визуальный мусор и воспринимает интерактивные элементы через их роли, состояния и смысловые связи.

Vision-подход подкупает универсальностью (модель может нажимать любые кнопки в операционной системе), но для веба он неэффективен. Передача скриншотов высокого разрешения сжигает десятки тысяч токенов на каждом шаге. Если форма требует заполнить десять полей, прогон обойдется в несколько долларов и займет пару минут. При этом малейшее смещение верстки или медленный скролл приводят к промахам курсора.

TinyFish пошли другим путем: они создали специализированную веб-нативную модель Mako. Она не пытается рисовать текст или писать стихи, а натренирована на миллионах реальных интерактивных сценариев: переход по ссылкам, выбор значений в выпадающих списках, фильтрация таблиц и заполнение форм.

ПараметрVision-агенты (Computer Use / Operator)TinyFish Mako
Что «видит» модельСкриншоты страницы (RGB-пиксели)Очищенное семантическое дерево DOM
Время одного действия5–15 секунд (рендеринг + зрение LLM)1–2 секунды на оценку и выбор элемента
Расход токеновДесятки тысяч токенов на скриншотФиксированная оплата за шаг ($0.016)
Устойчивость к редизайнуСредняя (зависит от визуальной схожести)Высокая (опирается на семантику и контекст)
Точность на сложных задачах (Mind2Web)32.4% (Claude) — 43.2% (Operator)81.9% (общая точность 89.9%)
Кэширование контекстаТребует пересылки всей истории скриншотовКэширует состояние страниц между шагами

Результат на бенчмарке Mind2Web (общепринятый отраслевой стандарт тестирования веб-агентов) показывает практическую разницу: на сложных задачах с глубокой вложенностью и динамическими переходами Mako опережает универсальные модели почти в два раза.

Антидетект на уровне C++ ядра: почему умер Puppeteer-Stealth

Любой инженер, собиравший продакшен-парсеры, знает главную головную боль: современные WAF и системы поведенческого анализа (Cloudflare Turnstile, DataDome, Akamai, Imperva, PerimeterX).

Большинство опенсорсных инструментов маскировки (включая популярный плагин puppeteer-extra-plugin-stealth) работают через JavaScript-инъекции. Перед загрузкой страницы скрипт переопределяет свойства в объекте window.navigator, подменяет navigator.webdriver и эмулирует видеокарту через WebGL. Для современных антифрод-систем такие инъекции — открытая книга: они детектируют порядок вызова прототипов в движке V8 и мгновенно блокируют сессию.

TinyFish перенесли маскировку с прикладного JavaScript на системный уровень. Инженеры перекомпилировали Chromium с нативными C++ патчами непосредственно в бинарном коде движка:

  • Движок отдает правильные отпечатки стека вызовов и таймингов без внедрения постороннего JS-кода.
  • Запросы автоматически маршрутизируются через пул проверенных резидентных прокси с возможностью выбора страны (США, Великобритания, Германия, Франция, Япония, Канада, Австралия).
  • «Холодный старт» нового изолированного браузера в облаке занимает менее 250 миллисекунд.

По замерам компании, проходимость через строгие экраны проверки Cloudflare и DataDome достигает 85%. Если сайт не выбрасывает жесткую интерактивную капчу, агент проходит барьеры незаметно для защитных систем.

Безопасная авторизация: Browser Context Profiles и Vault

Автоматизация открытого интернета полезна, но основные бизнес-данные спрятаны за экранами входа: закрытые B2B-порталы, личные кабинеты поставщиков, системы отслеживания заказов и биллинги.

Здесь перед архитектором встают две проблемы:

  1. Сохранение сессии. Заставлять агента логиниться заново на каждом запуске — значит гарантированно словить блокировку аккаунта по подозрительной активности.
  2. Безопасность учетных данных. Передавать пароль от корпоративного сервиса прямым текстом в промпт модели категорически нельзя: пароль осядет в логах провайдера LLM или утечет через промпт-инъекцию на атакуемом сайте.

TinyFish решает это связкой из двух механизмов:

flowchart LR
    Start["Запуск Stealth Browser<br>(use_profile + use_vault)"] --> Check{"Куки активны?"}

    Check -->|"Да"| Portal["Закрытый портал<br>(сохраненная сессия)"]
    Check -->|"Нет"| Vault["Автологин через Vault<br>(пароль скрыт от LLM)"]
    Vault -->|"Свежие куки"| Portal

    Portal --> Task["Выполнение задачи<br>и сбор данных"] --> Result["Готовый результат<br>(JSON / файл)"]
  1. Browser Context Profiles. Сохраненные снимки состояния браузера (cookies, LocalStorage, SessionStorage). Агент поднимает профиль и сразу оказывается в авторизованной зоне без повторного ввода логина.
  2. Vault. Интеграция с менеджерами паролей (1Password, Bitwarden). Если сессия истекла, TinyFish подставляет учетные данные через защищенный механизм автозаполнения. Модель управляет курсором и кнопкой входа, но сам текстовый секрет никогда не попадает в контекстное окно нейросети.

Четыре инструмента под одним API-ключом

Вместо того чтобы собирать инфраструктуру из разрозненных сервисов (отдельно поисковик, отдельно парсер страниц, отдельно облачный кластер Playwright и пул прокси), TinyFish объединяет четыре режима работы:

Интерфейс платформы TinyFish с четырьмя режимами работы: Search, Fetch, Browser и Agent

1. Search API (Живой поиск без кэша)

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

from tinyfish import TinyFish

client = TinyFish()
results = client.search.query(
    "текущие цены на медь LME",
    location="US",
    language="ru"
)

2. Fetch API (Очистка страницы в Markdown)

Аналог Firecrawl: передаете URL, сервис загружает страницу с полным исполнением JavaScript, вырезает служебные теги, скрипты и стили, возвращая компактный Markdown или JSON. Оптимально для наполнения RAG-баз и предварительного чтения статей.

page_content = client.fetch.get_contents(
    urls=["https://example.com/pricing"],
    ttl=0  # 0 — принудительно свежий запрос в обход кэша
)

3. Agent API (Автономное выполнение целей)

Главный рабочий режим. Вы формулируете цель естественным языком и задаете желаемый формат ответа. Агент сам кликает, скроллит, переходит по страницам каталога и собирает данные.

from tinyfish import TinyFish, BrowserProfile, ProxyConfig, ProxyCountryCode

client = TinyFish()

result = client.agent.run(
    url="https://market.example.com/catalog",
    goal="""
    1. Закрой всплывающий баннер с куки, если он появится.
    2. В боковом фильтре выбери категорию 'Серверное оборудование'.
    3. Найди первые 5 позиций в наличии.
    4. Для каждой позиции собери название, артикул и цену в рублях.
    
    Верни строго в формате JSON:
    [{"title": str, "sku": str, "price": int}]
    """,
    browser_profile=BrowserProfile.STEALTH,
    proxy_config=ProxyConfig(enabled=True, country_code=ProxyCountryCode.DE),
    use_profile=True  # использовать сохраненную сессию
)

print(result.result_json)

Во время работы доступен streaming\_url: разработчик или оператор может открыть ссылку в обычном браузере и своими глазами наблюдать за действиями агента на виртуальном экране в реальном времени.

4. Browser API (Прямой доступ к CDP)

Если готовой логики агента недостаточно и требуется написать жесткий детерминированный сценарий на Playwright или Puppeteer, сервис выдает WebSocket-ссылку к удаленному браузеру (cdp\_url). Разработчик получает готовую stealth-машину без необходимости разворачивать Docker-контейнеры на своих серверах.

Подключение через MCP (Model Context Protocol)

Для тех, кто использует современные среды разработки (Cursor, Windsurf, Claude Code или Claude Desktop), TinyFish развернул публичный MCP-сервер. Агенту не нужны самописные скрипты интеграции: достаточно прописать эндпоинт в конфигурацию.

{
  "mcpServers": {
    "tinyfish": {
      "command": "npx",
      "args": ["-y", "@tiny-fish/cli@latest", "mcp"],
      "env": {
        "TINYFISH_API_KEY": "ваш_api_ключ"
      }
    }
  }
}
Документация TinyFish Developer: раздел для кодинг-агентов и интеграции API

После этого кодинг-агент получает инструменты веб-поиска, чтения страниц и запуска автономных браузерных задач прямо из окна чата IDE.

Экономика: сравнение затрат на задачу

У TinyFish гибридная модель оплаты через предоплаченный кошелек (Wallet), без обязательных ежемесячных контрактов:

  • Search API: полностью бесплатно (до 30 запросов в минуту и 500 в час).
  • Fetch API: полностью бесплатно (до 150 страниц в минуту и 1 000 страниц в день).
  • Web Agent: $0.016 за один шаг действия.
  • Browser API (CDP): $0.002 за минуту работы браузера (~$0.12 в час).
  • Стартовый баланс: $8.00 начисляются сразу при регистрации, чего хватает на 500 шагов агента.

Сравним стоимость типового сценария: зайти на защищенный сайт поставщика, авторизоваться, применить 2 фильтра, открыть карточки 5 товаров и выгрузить цены (суммарно 12–15 действий).

ИнструментМеханикаРасчет стоимости задачиВремя работы
Claude 3.7 Computer UseСкриншоты высокого разрешения на каждом шаге~15 скриншотов × ~15k токенов = ~225k токенов ($0.65 – $1.20)2.5 – 4 минуты
Собственный Playwright + GPT-4oАренда VPS + резидентные прокси + вызовы LLM для парсинга DOM~$0.08 за прокси и инфраструктуру + ~$0.15 за токены = ~$0.2345 – 90 секунд
TinyFish Web Agent (Mako)Пошаговый семантический агент + встроенные прокси14 шагов × $0.016 = $0.224 (всё включено)20 – 35 секунд
Обычный Fetch (если нет кликов)Прямой скрейпинг контента страницы$0.00 (бесплатный лимит)2 – 5 секунд

TinyFish оказывается сопоставим по цене с самописным стеком, но полностью снимает расходы на поддержку серверного парка, закупку прокси и починку антидетект-скриптов.

Сравнение с альтернативами на рынке

Инфраструктура для веб-агентов
┌─────────────────────────┬─────────────────────────┬─────────────────────────┐
│       Чтение данных     │   Браузерный хостинг    │    Автономные агенты    │
├─────────────────────────┼─────────────────────────┼─────────────────────────┤
│ • Firecrawl             │ • Browserbase           │ • TinyFish (Mako)       │
│ • Jina Reader           │ • Steel                 │ • OpenAI Operator       │
│ • Crawl4AI              │ • Cloudflare Browser    │ • Claude Computer Use   │
└─────────────────────────┴─────────────────────────┴─────────────────────────┘
КритерийFirecrawlBrowserbaseClaude Computer UseTinyFish
Основной фокусСкрейпинг и краулинг в MarkdownОблачные браузеры для PlaywrightУправление рабочим столом через зрениеКомплексная среда веб-действий
Интерактивные кликиОграниченно (через действия)Да (пишете код сами)Да (модель кликает по экрану)Да (нативная цель на Mako)
Обход WAF (Stealth)Стандартный прокси-слойПродвинутый (браузерные профили)Зависит от окруженияАппаратный (C++ патчи Chromium)
Собственная модель действийНетНетДа (универсальная vision-модель)Да (специализированная Mako)
Менеджер паролей (Vault)НетНетНетДа (1Password / Bitwarden)
Встроенный поискНетНетНетДа (бесплатный live-поиск)

Ограничения

Ограничения

Капчи остаются непреодолимым барьером: TinyFish не умеет автоматически разгадывать графические головоломки (reCAPTCHA v2/v3, hCaptcha).

Технология C++ stealth снижает шанс их появления до минимума, но при агрессивной блокировке задача завершится ошибкой.

Лимиты параллелизма на старте: Новые аккаунты ограничены двумя одновременными запусками агента и пятью браузерными сессиями.

Для масштабирования на сотни потоков необходимо запрашивать расширение квот через поддержку.

Жесткий таймаут выполнения: На одну операцию агента установлен лимит в 10 минут.

Сложные сценарии со сбором сотен страниц нужно декомпозировать на параллельные микрозадачи.

Привязка к закрытой платформе: Модель Mako и инфраструктура браузеров проприетарны.

Развернуть решение полностью на собственных серверах невозможно (доступно только Enterprise VPC-развертывание).

Зависимость от стабильности разметки фреймворков:

Если сайт динамически перерисовывает DOM каждые 200 миллисекунд (например, сложные графики или канвас-интерфейсы), семантический агент может терять фокус.

Антипаттерны

Антипаттерны

Использование Web Agent для простого сбора текстов:

Запускать дорогой пошаговый Agent там, где достаточно бесплатного Fetch API, — неоправданная трата баланса кошелька.

Передача селекторов вместо описания смысла:

Указывать агенту кликни по div.btn-v2-primary неэффективно; надежнее писать нажми синюю кнопку добавления товара в корзину под ценой.

Повторный вход в систему на каждом цикле:

Запуск агента с вводом логина и пароля с нуля вместо сохранения сессии через Browser Context Profile быстро приводит к блокировке учетной записи защитными системами сайта.

Попытка выкачать весь каталог одной задачей: Формулировка цели собери все 5 000 товаров с пагинацией гарантированно упрется в 10-минутный таймаут.

Каталог следует обходить по частям через параллельные запросы.

Игнорирование проверки результата по статусу COMPLETED:

Статус выполнения COMPLETED означает лишь то, что скрипт завершил цикл, а не то, что данные найдены; код обязан валидировать поля итогового result_json.

Чеклист

Чеклист

Выбран оптимальный режим:

Подтверждено, что задачу нельзя решить бесплатными вызовами Search или Fetch API без запуска агента.

Сформулирована четкая цель:

Задача разбита на последовательные шаги с указанием закрытия баннеров и поведения при ошибках.

Задана строгая схема output_schema:

Описаны обязательные поля и типы данных в итоговом JSON для автоматической валидации.

Настроен Browser Context Profile:

Для закрытых сервисов сессия предварительно записана и авторизована.

Подключен Vault при необходимости логина:

Пароли хранятся в защищенном менеджере и не фигурируют в открытом тексте промпта.

Выбран географический регион прокси:

Страна резидентного прокси совпадает с целевой аудиторией автоматизируемого сайта.

Настроен безопасный таймаут клиента:

В коде интеграции таймаут ожидания ответа выставлен не менее чем на 120–150 секунд.

Проверена реакция на блокировку:

В логике приложения обработаны сценарии появления капчи, ошибки 403 или пустого ответа.

Подключен стриминг для отладки:

На этапе разработки используется streaming_url для визуального контроля действий агента.

Ограничен бюджет кошелька:

В панели управления включен разумный лимит автоматического пополнения баланса.

Ссылки

Ссылки