Search as Code от Perplexity: поиск, который агент пишет кодом

Содержание
Search as Code (SaC) — новая поисковая архитектура Perplexity для AI-агентов. Вместо «чёрного ящика», который принимает запрос и возвращает готовый ответ, поиск разбит на атомарные примитивы, а агент сам собирает из них пайплайн кодом. Ниже — разбор от простого к сложному: что это, почему работает и как подключить к
Claude Code.
⚡ Коротко
Что это. SaC превращает поиск из монолитного сервиса в программируемый SDK: модель пишет код, который дёргает отдельные шаги поиска (retrieve, fanout, filter, dedupe, rerank…) и оркеструет тысячи операций за один ход — внутри песочницы.
Зачем. Больше контроля над тем, что и как попадает в контекст модели → выше точность, ниже стоимость и латентность.
| Метрика | Результат |
|---|---|
| Точность на CVE-задаче | 100% против <25% у не-Perplexity |
| Экономия токенов | −85% (288.7K → 42.9K) |
| Бенчмарки (лучший результат) | 4 из 5 |
| Отрыв на WANDR | в 2.5 раза от ближайшего |
🚧 Зачем новая архитектура поиска
SaC живёт внутри Perplexity Agent API — рантайма для агентных задач (в отличие от классического «вопрос-ответ» в Sonar). Агент не просто отвечает: он декомпозирует задачу, многократно ищет, обрабатывает промежуточные данные и формирует итог — сотни и тысячи операций поиска за минуты.
Классический поиск работает по одному контракту: принять запрос → прогнать фиксированный пайплайн → вернуть результат. Модель управляет только параметрами запроса; всё, что после них, зашито в движок. Для простых запросов хватает, для агентных — нет.

Отсюда три слабых места монолитного поиска для агентов:
- Нет контроля над контекстом. Нужна одна деталь — а эндпоинт, заточенный на recall, тащит гору мусора. Нужно много деталей — приходится серийно дёргать тот же субоптимальный пайплайн.
- Знания модели не используются. Модель может «знать», как смешать лексический и семантический сигнал или приоритизировать источники, но жёсткий интерфейс не даёт это применить.
- Неэффективный control flow. Реальный поиск не линеен: fan-out по вариантам, параллельная загрузка, дедуп. Прогон через повторные «ходы» модели добавляет латентность и засоряет контекст.
Вывод: узкое место — это контроль (controllability). Современные модели в code-first харнессах умеют управлять любыми примитивами через код — нужно лишь дать им правильные примитивы.
💡 Идея: поиск как код
Суть SaC проста: компоненты поискового стека выставлены как примитивы внутри SDK, а модель собирает из них пайплайн под конкретную задачу — генерируя и исполняя код в защищённой песочнице. High-level «end-to-end» пайплайны остались, но теперь это лишь shorthand для частых паттернов, а не единственный путь.

SaC даёт два рычага: control — прямое управление каждым шагом (retrieval, ranking, filtering, fanout), и legibility — доступ к промежуточному состоянию (списки кандидатов, ранжирующие сигналы). Вместе они позволяют строить пайплайны на тысячи операций и забирать в контекст только самое полезное.
🏗️ Как это устроено: три слоя

1. Модель — управляющий слой. Разбирает задачу, декомпозирует, решает, какие пайплайны нужны, и генерирует код. Кастомный SDK не представлен в претрейне, поэтому модель учат через компактные Agent Skills (<2000 токенов) — это не перечень функций, а сжатые few-shot-примеры сборки сложных паттернов.
2. Песочница — детерминированный compute. Безопасный рантайм для исполнения кода: control flow, батчинг, ретраи, фильтрация, агрегация. Промежуточное состояние модель сохраняет в файлы (state/*.json) и читает на следующем ходу — это надёжнее неявного in-memory на длинных траекториях.
3. Agentic Search SDK — атомарные примитивы. Сердце архитектуры: заново собранный стек из модульных примитивов (retrieve, fanout, filter, dedupe, rerank, parse_field…) — от низкоуровневого retrieval до семантического парсинга. Чего не хватает, модель достраивает кодом (например, сложный regex поверх выдачи) — без раздувания SDK нишевыми функциями.
🛡️ Доказательства: кейс и бенчмарки
Реальный кейс — 230+ CVE за один проход. Задача: для 230+ серьёзных CVE (2023–2025, CVSS ≥ 7.0) найти каноничный URL security-advisory вендора, продукт и версию-исправление. Модель решила её в три приёма: fan-out по официальным форматам advisory вендоров, LLM-подзадача для добора «бедных» vendor-годов и верификатор, связывающий CVE с конкретной fixed-версией. Примерно так это выглядит кодом внутри песочницы:
# Параллельный fan-out и батч-извлечение — за счёт них и получается −85% токенов
seed_hits = sdk.search.web_many(queries, limit_per_query=8, concurrency=12)
all_hits = dedupe_by_url(flatten(seed_hits))
verified = sdk.llm.extract_many(
all_hits,
instruction="Оставить только advisory, где CVE привязан к конкретной fixed-версии.",
schema={"cve": str, "vendor": str, "fix_version": str, "version_bound_to_cve": bool},
)
records = dedupe_by(verified, key="cve")
Результат: 100% точность против <25% у систем не-Perplexity, при −85.1% токенов (288.7K → 42.9K).
Систематические бенчмарки. Пять наборов, стресс-тестирующих поисковые сценарии (accuracy для DSQA / BrowseComp / HLE, F1 по строкам для WideSearch, wide-research для WANDR). SaC — лучший в 4 из 5; на HLE — паритет с OpenAI.

| Benchmark | Perplexity (SaC) | OpenAI | Anthropic | Exa | Parallel |
|---|---|---|---|---|---|
| DSQA | 0.871 🥇 | 0.733 | 0.815 | 0.530 | 0.810 |
| BrowseComp | 0.805 🥇 | 0.720 | 0.598 | 0.380 | 0.560 |
| HLE | 0.612 | 0.614 🥇 | 0.566 | 0.387 | 0.515 |
| WideSearch | 0.651 🥇 | 0.522 | 0.590 | 0.471 | 0.584 |
| WANDR | 0.386 🥇 | 0.130 | 0.152 | 0.057 | 0.126 |
Сравнение на 1 июня 2026, одиночные прогоны (не best-of-N). Perplexity SaC — Agent API, GPT 5.5 (high) · OpenAI — Responses API, GPT 5.5 · Anthropic — Managed Agents, Opus 4.7 · Exa — Agent API, effort=high · Parallel — Tasks API, ultra4x.
На WANDR (новый бенчмарк «широкого исследования») SaC обходит ближайшую систему в 2.5 раза. А прирост над собственным традиционным пайплайном на той же инфраструктуре — везде заметный: DSQA +29%, WideSearch +32%, WANDR +45%, HLE +22%, BrowseComp +7%.
Цена против качества. На DSQA и WideSearch три режима рассуждения SaC (low/medium/high) лежат на Pareto-фронте: low дешевле всех конкурентов и сильнее части из них, high — топ-результат при конкурентной цене.
Проверить можно самому: Perplexity открыла runner search_evals (MIT), который воспроизводит 4 из 5 бенчмарков (BrowseComp, DSQA, HLE, WideSearch). WANDR пока не входит — он анонсирован отдельно. Команды запуска — ниже, в практике.
🛠️ Как использовать разработчику
Главное понять сразу. SaC — это внутренняя механика Perplexity, а не API, который пишут руками. Разработчик не пишет SaC-код: он просто включает инструмент
sandbox, а модель сама генерирует Python и вызывает SDK «под капотом». Снаружи интерфейсы прежние — HTTP API и MCP-сервер.
Шаг 1. Доступ и ключ
- Регистрация на perplexity.ai → API Portal (
console.perplexity.ai) → пополнить кредиты → Generate ключ (показывается один раз). - Один ключ работает и для классического Sonar Chat API, и для нового Agent API.
- База:
https://api.perplexity.ai, заголовокAuthorization: Bearer $PERPLEXITY_API_KEY.
Две поверхности API
| Поверхность | Endpoint | Когда |
|---|---|---|
| Sonar Chat API | POST /chat/completions | Поиск-граундед чат, OpenAI-совместимо. Модели: sonar, sonar-pro, sonar-reasoning-pro, sonar-deep-research |
| Agent API (тут живёт SaC) | POST /v1/agent | Агентный рантайм: «поиск → рассуждение → инструменты → проверка». Тут включается sandbox |
Шаг 2. Базовый вызов Agent API
Форма — как OpenAI Responses API: верхнеуровневый input + instructions вместо messages.
pip install perplexityai # Python SDK npm install @perplexity-ai/perplexity_ai # TypeScript SDK
from perplexity import Perplexity
client = Perplexity() # ключ из env PERPLEXITY_API_KEY
response = client.responses.create(
model="openai/gpt-5.5",
input="Сравни подходы к refresh-token rotation в NestJS + Passport (2026), со ссылками.",
tools=[{"type": "web_search"}],
)
print(response.output_text)
Модель задаётся строкой provider/model: openai/gpt-5.5, anthropic/claude-opus-4-8, google/gemini-3.1-pro-preview, perplexity/sonar и др. Либо пресет (fast-search / pro-search / deep-research).
Шаг 3. Включить Search as Code — инструмент sandbox
response = client.responses.create(
model="openai/gpt-5.5",
input="Для всех зависимостей из этого package.json найди известные CVE и vendor-advisory со ссылками.",
tools=[{"type": "sandbox"}, {"type": "web_search"}],
instructions="Используй sandbox и web search, чтобы собрать и проверить данные перед ответом.",
)
print(response.output_text)
Отдельного флага нет — достаточно {"type": "sandbox"} в tools, модель сама решит, когда писать код. Доступные инструменты: web_search, fetch_url, people_search, finance_search, function, sandbox.
Долгие задачи запускайте с background=True и опрашивайте client.responses.retrieve(id) — синхронный вызов рискует упасть в таймаут (окно работы песочницы ~20 мин). Файлы из песочницы (CSV/JSON) забираются через client.responses.files.
Шаг 4. Perplexity в Claude Code через MCP
Perplexity ведёт официальный MCP-сервер (@perplexity-ai/mcp-server). Подключение в Claude Code — одной командой:
claude mcp add perplexity --env PERPLEXITY_API_KEY="your_key_here" \ -- npx -y @perplexity-ai/mcp-server
Появляются 4 инструмента:
| Инструмент | Назначение |
|---|---|
perplexity_search | Сырые ранжированные результаты Search API (дёшево, без LLM-токенов) |
perplexity_ask | Разговорный поиск с живым вебом (sonar-pro) |
perplexity_research | Глубокое исследование с цитатами (sonar-deep-research) |
perplexity_reason | Логика и сравнения (sonar-reasoning-pro) |
Когда брать Perplexity, а когда нет
- ✅ Глубокий синтез из многих источников с цитатами →
perplexity_research. - ✅ Широкий fan-out (десятки дедуплицированных запросов) → Agent API +
sandbox. - ✅ Нужен один цитируемый ответ, а не список ссылок «прочитай сам».
- ❌ Быстрый единичный факт или чтение одной известной страницы → оставить встроенные
WebSearch/WebFetch(они бесплатны).
Где это полезно fullstack-разработчику
- 🔎 Исследование темы — «лучшие практики X в 2026 со ссылками» одним цитируемым ответом вместо 10 вкладок.
- 🛡️ Аудит зависимостей / CVE — скормить
package.jsonи собрать advisory по всем пакетам разом (тот самый SaC-сценарий). - 🧪 Разведка breaking-changes перед апгрейдом — «что ломается при Laravel 11→12 / TypeScript 5.x» до начала миграции.
- ⚖️ Сравнение технологий —
perplexity_reasonдля логики,perplexity_researchдля цитируемых фактов.
Шаг 5. Проверить бенчмарки самому — search_evals
export PERPLEXITY_API_KEY=... # + OPENAI_API_KEY (нужен для грейдинга) uv run python -m search_evals list # системы и сюиты uv run python -m search_evals run \ --system perplexity --suite browsecomp --limit 5 --run-suffix smoke # дешёвый smoke uv run python -m search_evals run \ --system perplexity --suite browsecomp --concurrency 5 # полный прогон
Стоимость реальна. Бесплатного тарифа нет — оплата по кредитам за вызов, а инструменты тарифицируются отдельно от токенов модели.
web_search— ~$0.005 за вызовsandbox— ~$0.03 за сессию плюс ~$0.005 за каждый SDK-поиск- Широкий fan-out умножает стоимость
sandboxочень быстро - Команды
runвsearch_evalsделают платные вызовы — всегда начинайте с--limit 5
🔗 Источники
- 📄 Research-статья (ядро): Rethinking Search as Code Generation
- 🚀 Agent API — Quickstart: docs.perplexity.ai/docs/agent-api/quickstart
- 📦 Sandbox Tool: docs.perplexity.ai/docs/agent-api/tools/sandbox
- 🧪 search_evals: github.com/perplexityai/search_evals
- 🧩 Официальный MCP-сервер: github.com/perplexityai/modelcontextprotocol
Итог одной фразой. SaC — это сдвиг от «модель вызывает поиск» к «модель программирует поиск». Для разработчика практический вход — инструмент
sandboxв Agent API и MCP-сервер в Claude Code.



