Разбор платформы 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
Сегодня в индустрии веб-агентов борются два принципиально разных подхода:
- Vision-агенты (Computer Use, OpenAI Operator). Модель делает скриншот страницы, скармливает его тяжелой визуальной LLM, высчитывает координаты элементов в пикселях и эмулирует аппаратные события мыши.
- Семантические веб-модели (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-порталы, личные кабинеты поставщиков, системы отслеживания заказов и биллинги.
Здесь перед архитектором встают две проблемы:
- Сохранение сессии. Заставлять агента логиниться заново на каждом запуске — значит гарантированно словить блокировку аккаунта по подозрительной активности.
- Безопасность учетных данных. Передавать пароль от корпоративного сервиса прямым текстом в промпт модели категорически нельзя: пароль осядет в логах провайдера 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 / файл)"]
- Browser Context Profiles. Сохраненные снимки состояния браузера (cookies, LocalStorage, SessionStorage). Агент поднимает профиль и сразу оказывается в авторизованной зоне без повторного ввода логина.
- Vault. Интеграция с менеджерами паролей (1Password, Bitwarden). Если сессия истекла, TinyFish подставляет учетные данные через защищенный механизм автозаполнения. Модель управляет курсором и кнопкой входа, но сам текстовый секрет никогда не попадает в контекстное окно нейросети.
Четыре инструмента под одним API-ключом
Вместо того чтобы собирать инфраструктуру из разрозненных сервисов (отдельно поисковик, отдельно парсер страниц, отдельно облачный кластер Playwright и пул прокси), TinyFish объединяет четыре режима работы:
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_ключ"
}
}
}
}
После этого кодинг-агент получает инструменты веб-поиска, чтения страниц и запуска автономных браузерных задач прямо из окна чата 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.23 | 45 – 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 │
└─────────────────────────┴─────────────────────────┴─────────────────────────┘
| Критерий | Firecrawl | Browserbase | Claude Computer Use | TinyFish |
|---|---|---|---|---|
| Основной фокус | Скрейпинг и краулинг в 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 для визуального контроля действий агента.
Ограничен бюджет кошелька:
В панели управления включен разумный лимит автоматического пополнения баланса.
Ссылки
Ссылки
- Документация: TinyFish Documentation
- Документация: TinyFish Cookbook (GitHub)
- Документация: Mind2Web Benchmark (arXiv)
- Репозиторий: Python SDK tinyfish (PyPI)
- Репозиторий: TypeScript SDK @tiny-fish/sdk (npm)