Skip to main content

srezai — Python-клиент срезAI

PyPI Python License: MIT

Официальный Python-клиент срезAI — платформы веб-доступа для LLM-агентов и RAG-систем: поиск по вебу, чтение страниц в Markdown, извлечение структурированных данных по схеме и агентное исследование.

Official Python client for срезAI (SrezAI), a web-access platform for LLM agents and RAG systems: web search, page reading as Markdown, schema-driven structured extraction and agentic research.

pip install srezai

Требования: Python 3.10 – 3.13. Единственная зависимость — httpx.

Быстрый старт / Quickstart

from srezai import SrezAI

with SrezAI() as client:  # ключ из SREZAI_API_KEY
    found = client.search("новости про ИИ", num=5, time_range="week")
    for item in found["results"]:
        print(item["title"], item["url"])

    page = client.read_url("https://example.com", max_chars=8000)
    print(page["markdown"])

Ключ передаётся аргументом api_key, а при его отсутствии берётся из переменной окружения SREZAI_API_KEY. Создать ключ можно в личном кабинете.

Клиент работает как контекстный менеджер и переиспользует HTTP-соединение внутри блока with, закрывая его на выходе. Для долгоживущего процесса допустимо создать клиент один раз и вызвать close() при завершении.

Методы / Methods

Метод Назначение Стоимость вызова
search(query, ...) Веб-поиск по десяткам движков одним запросом 1 кредит
image_search(query, ...) Поиск изображений: ссылки, источник, разрешение 1 кредит
read_url(url, ...) Страница → плотный Markdown без навигации и рекламы 1 кредит
read_urls(urls, ...) То же для группы страниц (до 10 за вызов на платном тарифе, до 5 на бесплатном, параллельно) 1 кредит за страницу
fetch_page(url, ...) Рендер страницы браузером: скриншот и Markdown 3 кредита
transcript(videos, ...) Текст ролика YouTube (ручные или авто-субтитры), без скачивания видео 1 кредит за ролик с полученным текстом
extract(schema, url=...) Данные строго по схеме, без выдуманных значений 2 кредита за страницу
deep_research(query) Агентное исследование: поиск, чтение, синтез ответа 20 кредитов + 3 за 1000 токенов ответа
answer_search(query, ...) RAG-ответ по вебу с семантическим ранжированием источников 3 / 5 / 10 кредитов — по depth

Тарифная сетка и калькулятор — на странице цен; полное описание параметров — в документации API.

Инструмент учёта get_usage (баланс, квота, цены) в SDK отсутствует: он доступен только через MCP-сервер, REST- эндпоинта для него не предусмотрено. В REST эту роль выполняют заголовки X-RateLimit-* в каждом ответе.

Поиск

found = client.search(
    "векторные базы данных",
    num=10,
    category="it",  # general | news | it | science
    language="ru",  # auto | ru | en
    time_range="month",  # "" | day | week | month | year
    depth="auto",  # flash — быстрее и уже; auto — шире
    excerpts=True,  # подтянуть текст топ-страниц
    include_domains=["habr.com"],  # только эти сайты и их поддомены
)

Чтение страниц

page = client.read_url("https://example.com", max_chars=8000, engine="auto")
batch = client.read_urls(["https://a.example", "https://b.example"], max_chars=4000)

Параметр engine управляет способом загрузки. По умолчанию auto: клиент начинает с быстрого способа и повышает ступень самостоятельно, если содержимое не получено. Явное значение имеет смысл указывать только для заранее известного сайта — fast для статики и документации, dynamic для SPA, требующих выполнения JavaScript, stealth для максимально приближенного к браузеру поведения.

На батче стоит задавать max_chars скромнее: пять больших страниц вытеснят из контекста модели всё остальное. Если часть адресов не открылась, остальные возвращаются, а неудачи перечисляются в ответе.

Субтитры YouTube

res = client.transcript(
    ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    languages=["ru", "en"],
    max_chars=12000,
)

for video in res["results"]:
    print(video["title"], video["language"], video["kind"])  # manual | auto
    print(video["text"])
    if video["nextFrom"]:
        # продолжение окна: уже прочитанное повторно не тарифицируется
        client.transcript(video["url"], from_=video["nextFrom"])

for err in res["errors"]:
    print(err["input"], err["code"], err["reason"])

До 5 роликов за вызов; частичный успех — норма. errors[].code: empty_result (нет дорожки, не тарифицируется), rate_limited, service_unavailable, bad_request.

Извлечение структурированных данных

data = client.extract(
    {"title": "string", "price": "number?", "tags": "string[]"},
    url="https://shop.example/item/42",
    instruction="использовать цену со скидкой",
)

Схема задаётся сокращённой формой (? — необязательное поле, [] — массив) или полным JSON Schema; описания полей в полной форме заметно повышают точность разбора. Значения, которых на странице нет, возвращаются как null и никогда не достраиваются моделью. Для группы страниц под одну схему используется urls= (до 10 адресов на платном тарифе, до 5 на бесплатном; каждый тарифицируется отдельно) — взаимоисключимо с url=.

result = client.answer_search(
    "как работает BGE-reranker",
    depth="balanced",  # fast | balanced (по умолчанию) | deep
)
print(result["answer"])
for s in result["sources"]:
    print(s["title"], s["url"], s["relevance"])

В отличие от deep_research, стоимость фиксирована по depth и не зависит от объёма ответа: fast — 50 кредитов, balanced — 100, deep — 200. sources отсортированы по релевантности через семантический реранкер, а не только по порядку поиска.

Обработка ошибок / Errors

Каждая ошибка API содержит машинный код, которому соответствует отдельный класс исключения. Это позволяет ветвиться по типу ошибки, не разбирая текст сообщения. Если код не важен, достаточно перехватить базовый SrezAIError.

from srezai import SrezAI, HostUnresolved, RateLimited, SsrfBlocked

with SrezAI() as client:
    try:
        client.read_url("https://exmaple.com")
    except HostUnresolved:
        ...  # домена не существует — вероятна опечатка в адресе
    except SsrfBlocked:
        ...  # адрес запрашивать нельзя: локальная сеть или служебный диапазон
    except RateLimited as err:
        ...  # лимит; err.retry_after — секунды до следующей попытки

HostUnresolved и SsrfBlocked различаются намеренно: первое означает «проверьте адрес на опечатку», второе — «такой адрес запрашивать нельзя». Полный каталог кодов — на srezai.ru/docs/errors.

Клиент автоматически повторяет запрос при временных сбоях — rate_limited, service_unavailable, search_unavailable, upstream_timeout — с экспоненциальной задержкой и приоритетом подсказки retry_after от сервера. Ошибки запроса (bad_request, schema_invalid, unauthorized, ssrf_blocked) возвращаются немедленно: их повтор не изменит результат.

Конфигурация / Configuration

client = SrezAI(
    api_key="srz_live_…",  # по умолчанию — SREZAI_API_KEY
    base_url="https://srezai.ru",  # для стейджинга или изолированного контура
    timeout=180.0,  # секунды; deep_research идёт до двух минут
    max_retries=2,
)

Таймаут по умолчанию выбран с запасом под deep_research: он синхронный и занимает до двух минут. Уменьшать его стоит только если этот метод не используется — оборванное соединение не отменяет уже начатую работу на сервере.

Ограничения частоты / Rate limits

Ключ API: 10 запросов за 10 секунд и 200 запросов в сутки. Батчевые методы read_urls и extract принимают до 10 адресов за вызов на платном тарифе (до 5 на бесплатном). Текущее состояние квоты возвращается в заголовках X-RateLimit-*. Лимиты выше базовых согласуются индивидуально — support@srezai.ru.

Типизация и разработка / Typing and development

Пакет поставляется с маркером py.typed и проходит mypy --strict, поэтому подсказки типов доступны в потребляющем коде без дополнительных заглушек.

pip install -e ".[dev]" && ruff check . && mypy src && pytest -q

Тесты выполняются локально на pytest-httpx и обращений к рабочему API не требуют.

Поддержка и лицензия / Support and license

Лицензия — MIT.

Metadata

Release files for srezai 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for srezai 0.3.0
File Size Uploaded Provenance
srezai-0.3.0.tar.gz 17.3 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for srezai 0.3.0
File Interpreter ABI Platform
srezai-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 35.3 kB

Release files / srezai-0.3.0.tar.gz

Download URL srezai-0.3.0.tar.gz
Size 17.3 kB
Tags Source
SHA-256 checksum
How to use checksums
cce94321bf12ffabaf17e837ff69488e0f4fc613beb29d9a15950c5dea35c9c3
BLAKE2b-256 checksum
How to use checksums
26eb461aa50b333084f9c76e1e7ad750ac094103fd2a6a4cec988ddb500d2e29
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Release files / srezai-0.3.0-py3-none-any.whl

Download URL srezai-0.3.0-py3-none-any.whl
Size 18.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
018616e259fe2e477ff32fefca9c11e3b1d0ea5d8f8c3c6b041753f64d59d9d6
BLAKE2b-256 checksum
How to use checksums
a98931a93c8c9bdd2817a777ebf653f6e37f4a9084f4842bd42d480dd3ccd2ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

Security for srezai 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for srezai-0.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page