Python SDK: Ai: анализ и преобразование
ctx.ai() вызывается через платформу и расходует AI-бюджет пространства, кроме подтверждённого попадания extract() в кэш. Все методы синхронны. Модель выбирает платформа: сценарий задаёт уровень и усилие.
Примеры являются фрагментами тела def run(ctx):. Все методы SDK синхронны, await не нужен.
Перед первым вызовом
- За один прогон доступно не более восьми AI-вызовов. В один запрос передавайте не более 48 КБ. Если страница большая, сначала выберите нужный фрагмент обычными методами SDK.
- Запрос расходует AI-бюджет пространства. Фактический расход отражается в лимитах и журнале операций; время выполнения сценария учитывается отдельно. Проверенный кэш
extract()позволяет повторно использовать правило без нового AI-вызова. - Не передавайте в запрос пароли, токены и персональные данные. Не отправляйте туда результат
ctx.credential(). - Автономный агент не может выполнить AI-запрос без платформы. Для регулярного автономного сбора сохраняйте уже проверенные правила в коде.
Уровень и усилие
| Параметр | Значения | Когда использовать |
|---|---|---|
tier |
small, medium, large |
От короткой записи до сложного анализа или исправления кода. |
effort |
low, medium, high, extra_high |
Чем выше усилие, тем больше времени и токенов может потребоваться. |
По умолчанию используются small и medium. Для repair(): large и high. Платформа сама выбирает подходящую модель; название модели в сценарии указывать не нужно.
Методы
analyze
ctx.ai().analyze(content, question, tier='small', effort='medium') -> str
| Аргумент | Тип | Обязателен | Назначение |
|---|---|---|---|
content |
str | bytes |
Да | Переданное содержимое; см. ограничения метода. |
question |
str |
Да | Вопрос к переданному содержимому. |
tier |
str |
Нет, default в сигнатуре | Уровень AI: small/medium/large. |
effort |
str |
Нет, default в сигнатуре | Усилие: low/medium/high/extra_high. |
Результат: str.
Отвечает текстом на вопрос о переданном содержимом. Ответ может ошибаться: проверяйте факты перед сохранением данных.
result = ctx.ai().analyze('sku,price\nA-1,1250', 'Which column contains the price?')
transform
ctx.ai().transform(data, shape, instruction='', tier='small', effort='medium') -> dict[str, Any]
| Аргумент | Тип | Обязателен | Назначение |
|---|---|---|---|
data |
Any |
Да | Данные, которые требуется преобразовать. |
shape |
dict[str, Any] |
Да | Описание желаемой структуры результата. |
instruction |
str |
Нет, default в сигнатуре | Дополнительное правило преобразования. |
tier |
str |
Нет, default в сигнатуре | Уровень AI: small/medium/large. |
effort |
str |
Нет, default в сигнатуре | Усилие: low/medium/high/extra_high. |
Результат: dict[str, Any].
Преобразует объект под указанную структуру и возвращает сам результат как объект. Проверяйте обязательные поля перед ctx.emit().
result = ctx.ai().transform(
{'title': 'Product', 'price': '1 250 RUB'},
{'title': 'string', 'price': 'number'},
)
find
ctx.ai().find(html, description, tier='small', effort='medium') -> dict[str, str]
| Аргумент | Тип | Обязателен | Назначение |
|---|---|---|---|
html |
str |
Да | HTML-строка, не путь/URL для загрузки. |
description |
str |
Да | Описание искомого элемента. |
tier |
str |
Нет, default в сигнатуре | Уровень AI: small/medium/large. |
effort |
str |
Нет, default в сигнатуре | Усилие: low/medium/high/extra_high. |
Результат: dict[str, str].
Предлагает CSS-селектор элемента по переданному HTML и описанию. Возвращает selector и reason; проверяйте селектор на странице.
result = ctx.ai().find('<button class="next">Next</button>', 'Next page button')
repair
ctx.ai().repair(source, error, goal, tier='large', effort='high') -> str
| Аргумент | Тип | Обязателен | Назначение |
|---|---|---|---|
source |
str |
Да | Исходный Python-код для анализа; не запускается автоматически. |
error |
str |
Да | Текст ошибки без приватных данных. |
goal |
str |
Да | Ожидаемый результат исправления. |
tier |
str |
Нет, default в сигнатуре | Уровень AI: small/medium/large. |
effort |
str |
Нет, default в сигнатуре | Усилие: low/medium/high/extra_high. |
Результат: str.
Возвращает предложение по исправлению переданного Python-кода. Не сохраняет его и не публикует новую версию. Проверьте ответ и сделайте пробный прогон.
result = ctx.ai().repair('def run(ctx):\n pass', 'Element not found', 'Collect the product name')
document_rows
ctx.ai().document_rows(document, sheet=0) -> dict[str, Any]
| Аргумент | Тип | Обязателен | Назначение |
|---|---|---|---|
document |
Document |
Да | Полученный объект Document, не путь к файлу. |
sheet |
int | str |
Нет, default в сигнатуре | Индекс листа с нуля либо его точное имя. |
Результат: dict[str, Any].
Планирует строки и заголовок таблицы по форме ячеек, без раскрытия значений внешней модели. Вернёт ready, needs_range или incomplete; в двух последних случаях задайте диапазон вручную.
document = ctx.documents().from_url(ctx.param('file_url'), 'prices.csv')
result = ctx.ai().document_rows(document, 0)
if result.get('status') == 'ready':
for row in result.get('records', []):
ctx.emit(row)
extract
ctx.ai().extract(input, schema, options=None) -> dict[str, Any]
| Аргумент | Тип | Обязателен | Назначение |
|---|---|---|---|
input |
str | list | dict | Document |
Да | Таблица, JSON/массив строк или проверенный Document. |
schema |
dict[str, Any] |
Да | Явная схема ожидаемых полей. |
options |
dict[str, Any] | None |
Нет, default в сигнатуре | Настройки извлечения: key, expected_rows и явное сопоставление при необходимости. |
Результат: dict[str, Any].
Извлекает записи из одной HTML-таблицы, JSON-массива, массива строк или одного листа документа. CSV сначала прочитайте через documents().from_bytes() или sources().document(). PDF без таблицы и произвольные карточки страницы нужно предварительно преобразовать в строки.
result = ctx.ai().extract(
[['SKU', 'Price'], ['A-1', '1 250,50']],
{'sku': {'type': 'string', 'unique': True}, 'price': {'type': 'decimal', 'min': 0}},
{'key': 'supplier-prices', 'expected_rows': 1},
)
for record in result.get('records', []):
ctx.emit(record, record['sku'])
records содержит данные текущего запуска, даже если правило найдено в кэше. Поля cache_hit и ai_used помогают понять, был ли запрос к модели. Для явного сопоставления можно указать column у полей и header_row в настройках; индексы начинаются с нуля. При неоднозначном заголовке проверьте выбор колонок вручную.
Если сервис недоступен или вернул неверный ответ, SDK выдаёт ошибку. Предложенный селектор, преобразование или исправление кода всегда проверяйте пробным прогоном, прежде чем публиковать сценарий.
Жизненный цикл · Лимиты и баланс
Ошибки и контекст выполнения
Все вызовы синхронны. Неверный аргумент или формат данных может вызвать ValueError/TypeError; отказ платформы или недоступность сервиса вызывает RuntimeError. Отсутствие элемента/значения даёт None либо пустой список только там, где это явно описано. Не превращайте любое исключение в пустой успешный результат. Методы внешних сервисов недоступны в преобразовании выгрузки; см. ограничения преобразований и среду.