
#Что делает Parallel Decisions API и что мы повторяем
Parallel Decisions API отвечает на типизированные вопросы о компаниях, продуктах и политиках. Источник ответа - живой веб, а не память модели. Каждый ответ приходит с вероятностью и ссылкой на источник. Подробности - в анонсе в блоге Parallel.
This single API call replaces the multi-step pipeline your team might be building by hand today.
Эту многошаговую цепочку мы и собираем руками на срезAI, который глубоко индексирует Рунет и хранит данные в РФ.
#Что понадобится
- ключ срезAI из личного кабинета: 100 ₽ при регистрации;
- Python 3.10+ и пакет mcp: pip install mcp;
- адрес MCP-сервера, детали авторизации - в документации;
- лимит бесплатного плана - 200 вызовов в сутки.
#Шаг 1. Как найти страницы-кандидаты
Запрос строим из названия объекта и сути вопроса, например "ПАО Аэрофлот статус юридического лица". Берём num: 5 и language: ru. Пять результатов хватает: читать будем только три верхних.
#Шаг 2. Как вынуть метку со ссылкой на источник
Инструмент extract открывает страницу полноценным браузером, выполняет JavaScript на нашей стороне и возвращает JSON по вашей схеме. Отдельный read_urls здесь лишний: extract читает страницу сам, а в контекст попадают только три поля. Чего на странице нет, приходит как null.
Поле evidence_url делает ответ проверяемым. Без него классификатор снова превращается в модель, которая отвечает из памяти.
#Шаг 3. Как выбрать итоговую метку
Суммируем confidence по каждой метке и берём лидера. Доля лидера в общей сумме становится итоговым значением confidence. Это эвристика, а не калиброванная вероятность, как у Parallel. Порог 0,7 мы выбрали руками, поэтому подберите свой на размеченной выборке.
#Шаг 4. Как перепроверить спорные случаи
Если доля лидера ниже 0,7 или победила метка unknown, вызываем verify_claim с утверждением вроде "Компания X действует и не находится в процессе ликвидации". Он читает независимые источники и возвращает вердикт с цитатами за 8 кредитов. Звать его на каждый объект дорого, поэтому он стоит только на спорной ветке.
import asyncio
import json
import os
import re
from collections import defaultdict from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client MCP_URL = 'https://srezai.ru/docs
HEADERS = {'Authorization': 'Bearer ' + os.environ['SREZAI_API_KEY']} SCHEMA = { 'label': 'string', 'confidence': 'number', 'evidence_url': 'string',
}
INSTRUCTION = ( 'Определи статус компании по странице: active, liquidating или unknown. ' 'confidence от 0 до 1. Если страница не про эту компанию, label=unknown.'
) async def call(session, tool, args): response = await session.call_tool(tool, args) return response.content[0].text async def classify(session, company): found = await call(session, 'web_search', { 'query': company + ' статус юридического лица', 'num': 5, 'language': 'ru', }) urls = list(dict.fromkeys(re.findall(r'https?://[^\s)\]]+', found)))[:3] votes = defaultdict(float) evidence = {} for url in urls: raw = await call(session, 'extract', { 'url': url, 'schema': SCHEMA, 'instruction': INSTRUCTION, }) try: item = json.loads(raw) except ValueError: continue label = item.get('label') or 'unknown' votes[label] += float(item.get('confidence') or 0) evidence.setdefault(label, item.get('evidence_url') or url) if not votes or sum(votes.values()) == 0: return {'label': 'unknown', 'confidence': 0, 'evidence_url': None} label = max(votes, key=votes.get) share = votes[label] / sum(votes.values()) answer = { 'label': label, 'confidence': round(share, 2), 'evidence_url': evidence[label], } if share < 0.7 or label == 'unknown': answer['verification'] = await call(session, 'verify_claim', { 'claim': 'Компания ' + company + ' действует и не находится в процессе ликвидации', 'maxSources': 3, 'language': 'ru', }) return answer async def main(): async with streamablehttp_client(MCP_URL, headers=HEADERS) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() answer = await classify(session, 'ПАО "Аэрофлот"') print(json.dumps(answer, ensure_ascii=False, indent=2)) asyncio.run(main())#Как проверить, что пайплайн работает
Соберите 30-50 объектов с известным статусом, среди них пару заведомо спорных. Прогоните их и посмотрите, у скольких evidence_url ведёт на страницу про нужную компанию.
Самая частая ошибка - страница-однофамилец. Строка в instruction "если страница не про эту компанию, label=unknown" отсекает большую часть таких случаев, но не все. Этот шаг легко пропустить, а потом гадать, откуда взялись чужие evidence_url. Для скоринга контрагентов добавляйте в запрос ИНН.
Возьмите ключ срезAI и прогоните пайплайн на своих объектах. 100 ₽ при регистрации хватает на отладку.
Получить ключ#Сколько это стоит и где Parallel выигрывает
| Критерий | Parallel Decisions API | Пайплайн на срезAI |
|---|---|---|
| Вызовов на объект | 1, вопросы можно батчить | 4-5: поиск, три extract, при споре verify_claim |
| Цена | $1 за 1 000 вызовов, 5 000 бесплатных запросов (по анонсу) | 7 кредитов без проверки, 15 со спорной веткой; 100 ₽ при регистрации |
| Задержка | 517-879 мс на вызов в примерах анонса | p50 одного поиска 976 мс, весь пайплайн дольше: вызовы идут друг за другом |
| Вероятность ответа | Типизированная, приходит из сервиса | Эвристика по голосам страниц, калибровать самим |
| Рунет | В анонсе не заявлен | Глубокая индексация Рунета, данные в РФ |
| Контроль схемы и источников | Фиксированный формат сервиса | Своя схема и свои домены |
По скорости и цене за объект Parallel впереди. В анонсе проверка 426 публичных компаний заняла меньше десяти секунд и стоила 85 центов. Наш пайплайн на тех же 426 объектах - около 2 982 кредитов до спорной ветки.
Зато схема и список источников здесь ваши, а для проверки контрагентов по российским реестрам и новостям это порой важнее выигрыша в пару секунд.
#Что не сработает
- Объекты без публичного следа. Если страниц нет, все голоса уйдут в unknown, и вы заплатите за verify_claim впустую.
- Массовая разметка за секунды. Вызовы идут последовательно, а суточный лимит в 200 вызовов даёт около 28 объектов.
- Формат ответа extract. Код выше разбирает его как JSON; если в вашем клиенте приходит иной формат, сверьтесь с документацией.
Как сократить стоимость пайплайна
Остановитесь после двух страниц, если обе дали одну метку с confidence выше 0,8: это экономит 2 кредита на объект. Для длинных очередей разделите объекты по доменам заранее и читайте только реестры.
Можно ли заменить Parallel Decisions API на срезAI один к одному?
Частично. Единого вызова с батчем вопросов у срезAI нет, цепочка собирается из нескольких инструментов. Схему и источники вы контролируете сами.
Сколько стоит классификация одного объекта?
7 кредитов: поиск за 1 и три extract по 2. Со спорной веткой выходит 15, потому что verify_claim стоит 8.
Нужен ли read_urls, если есть extract?
Не нужен: схема отдаёт три поля, полный текст лишний. read_urls берите, когда читаете страницы целиком.
Как задать собственные метки?
Поменяйте instruction и список допустимых значений в нём, схему оставьте прежней. Например, для категории сайта: shop, media, service, unknown.
Подходит ли пайплайн для скоринга контрагентов?
Как первый фильтр подходит: он находит источник и помечает спорные случаи. Решение о сделке принимайте после ручной проверки по реестрам.
Свой веб-доступ для агента: поиск, чтение страниц и извлечение данных по одному ключу.


