Эндпоинты API
Исследование
POST /v1/research собирает досье по правовому вопросу. Конвейер последовательно проходит закон, разъяснения и практику; порядок и обязательность этапов заданы кодом шлюза. Ответ – дословные выдержки с реквизитами и провенансом. Текст ответа языковая модель здесь не пишет: эндпоинт подходит, когда вывод формулирует сам агент клиента или когда нужен проверяемый перечень источников.
Этапы конвейера
- Разбор вопроса. Нормы, упомянутые в тексте вопроса, извлекаются регулярными выражениями, без языковой модели.
- Закон. По каждой распознанной норме – дословный текст в редакции на дату
as_of; кроме того, тематический поиск по слою законодательства. Если редакции на дату нет, в досье попадает действующий текст с отметкойedition_mismatchи записью вgaps. - Разъяснения. Тематический поиск по сегментам «Разъяснения судов» и «Разъяснения госорганов» и обратный поиск документов, применяющих нормы вопроса.
- Практика. Тематический поиск по сегменту «Судебные акты» и обратный поиск актов, применяющих нормы вопроса.
Слои не смешиваются в общем ранжировании: судебный акт не вытесняет постановление Пленума Верховного Суда Российской Федерации, они лежат в разных разделах досье. Каждому фрагменту разъяснений и практики шлюз проставляет силу источника – поле authority, при необходимости и оговорку о применимости – applicability_note.
Тело запроса
| Поле | Тип | По умолчанию | Назначение |
|---|---|---|---|
question | строка, 5–2000 символов | обязательно | Правовой вопрос на естественном языке |
top_k | целое, 1–30 | 8 | Число результатов тематического поиска в каждом слое и сегменте |
filters | объект | — | Фильтры практики, см. Фильтры практики |
as_of | дата YYYY-MM-DD | сегодня | Дата, на которую берутся редакции норм |
agent_search | true, false или null | агент не участвует | true – агентный веер, см. «Режимы»; по ключу API – 403 |
research_mode | "fanout", "loop" или null | — | "loop" – цикл агента-исследователя, см. «Режимы»; по ключу API – 403 |
full_context | true, false или null | настройка сервера | Агент читает тексты найденных источников; точнее, но дороже. Фактическое значение – в поле full_context ответа |
vertical | строка | — | Отраслевой пакет для агента, например "kadastr"; перечень – поле verticals_available ответа GET /v1/playbook |
enumeration | объект | — | Явный запрос перечня дел, см. «Перечень дел» |
progress_id | строка, 8–100 символов A–Z, a–z, 0–9, _, - | — | Идентификатор для GET /v1/progress/{id}, см. Ответ по досье |
Поля, которых нет в таблице, шлюз игнорирует без ошибки: проверяйте их написание.
Фильтры filters передаются в тематический поиск всех трех сегментов – и судебных актов, и разъяснений. Ограничения по суду, периоду и инстанции рассчитаны на судебные акты и могут отсечь разъяснения высших судов. Если нужны и разъяснения, и практика за период, выполните два запроса или запросите практику отдельно через /v1/practice/search. Обратный поиск по нормам (by_norm) фильтры не учитывает.
Поля ответа
| Поле | Что содержит |
|---|---|
question, as_of | Вопрос и дата, на которую взяты редакции норм |
extractive | Всегда true: досье состоит из выдержек |
steps | Этапы конвейера extract_norms, law, clarifications, practice с доступностью слоя и числом находок |
norms_in_question | Нормы, распознанные в вопросе: law_key, article и реквизиты |
law.norms | Тексты норм вопроса на дату: ok, status, text, text_sha256, source_url; при подмене редакции – edition_mismatch |
law.search | Тематическая выдача слоя законодательства |
clarifications.search | Выдача по двум сегментам разъяснений, по элементу на сегмент |
clarifications.by_norm | Разъяснения, применяющие нормы вопроса |
practice.search, practice.by_norm | То же для судебных актов |
practice_coverage | Состав корпуса практики на момент запроса, срез корпуса и оговорка о неполноте выборки |
constraints | Действующие ограничения: поле, значение и источник – client (фильтры запроса) или agent (объявление агента) |
gaps | Чего не хватило – строками для человека |
gap_reasons | Те же пробелы с машиночитаемым кодом, где он есть |
court_registry | Доступность справочника судов, по которому проверяются ограничения |
agent_plan | Сводка агентной фазы, если она выполнялась |
enumeration, enumeration_intent | Перечень дел и решение о нем |
disclaimer | Дисклеймер, обязательный к показу конечному пользователю |
full_context | Фактическое значение режима чтения текстов |
billing | Вызовы языковых моделей в запросе: llm_calls, models, actual_cost_usd (стоимость по данным провайдера; null, если у части вызовов она неизвестна), known_cost_usd, unpriced_calls |
Фрагмент тематической выдачи практики или разъяснений содержит chunk_id, дословный text, context_text – тот же фрагмент с соседними, sha256_text, score, реквизиты документа в document (doc_key, title, court, decision_date, number, case_number, uid, instance, act_type, status, review_outcome) и провенанс в provenance (sha256_raw_segment, sha256_clean_html). Оценки score разных слоев между собой не сравнимы.
Поля, не описанные в таблице (например, constraint_calls), служебные: используйте их для журналирования, а не для логики клиента. Состав agent_plan зависит от режима и может расширяться.
Режимы
| Режим | Как включить | Что происходит | Списание |
|---|---|---|---|
| Конвейер | по умолчанию | Только этапы конвейера; языковая модель не вызывается | 1 единица |
Агентный веер (fanout) | agent_search: true | Агент строит планы коротких запросов по плейбуку и исполняет шаги плана параллельно, до 5 итераций; находки дополняют досье. Агентная фаза ограничена 900 с | недоступен по ключу API – 403 |
Цикл (loop) | research_mode: "loop" | Агент-исследователь ищет, смотрит на найденное и уточняет запрос; до 50 шагов, бюджет 1200 с. Цикл останавливается по собранному досье, по времени, по числу шагов или по стоимости вызовов модели; причина – agent_plan.stopped_by | недоступен по ключу API – 403 |
По ключу API работает режим по умолчанию – конвейер без агента. Агентный веер и цикл – режимы с ИИ-агентом LexaAI: по ключу API шлюз отвечает 403 с detail Режимы с ИИ-агентом LexaAI (agent_search, research_mode=loop) недоступны по ключу API, см. Что недоступно по ключу API.
Значение research_mode: "fanout" без agent_search: true агентную фазу не включает. Если планировщик веера недоступен, фаза пропускается, а досье конвейера возвращается как есть; причина видна в agent_plan.
Перечень дел
Вопросы вида «все дела по статье за период» решает перечень, а не поиск: у поиска – ограниченное число результатов и релевантность, у перечня – полный total и постраничный обход. В /v1/research перечень строится только по явному объявлению: клиента – полем enumeration или агента – в агентных режимах.
{
"question": "Какие дела об оспаривании кадастровой стоимости рассмотрены апелляцией в 2025 году?",
"enumeration": {
"needed": true,
"query": "\"кадастровая стоимость\"",
"filters": {"instance": "апелляция", "date_from": "2025-01-01", "date_to": "2025-12-31"}
}
}Поле enumeration | Тип | Назначение |
|---|---|---|
needed | логическое, по умолчанию true | Нужен ли перечень |
query | строка до 400 символов | Текстовое сужение на языке запросов |
filters | объект | Фильтры перечня, включая norm |
Блок enumeration ответа строится без языковой модели: total, first_page (до 50 карточек дел), facets, page.cursor для продолжения через /v1/practice/list, признаки delivered и complete. Если текстовое сужение не применилось, query_applied равно false, а при отказе слоя в нем – поле query_error. Поле enumeration_intent показывает, кто объявил перечень: sources – client, agent или оба.
Неполнота и ошибки
- Сбой слоя не прерывает конвейер: слой помечается
available: falseс причиной вerror, вgapsдобавляется запись, остальные этапы выполняются. Код ответа – 200. - В
gapsпопадают: недоступные слои, нормы вне корпуса законодательства, отсутствие редакции на дату, устаревший срез корпуса практики, пустая выдача по объявленным фильтрам, недоступность справочника судов, ошибки агентной фазы. - В
/v1/researchнет поляdegraded: признаки неполноты –gapsиavailable: false. 403– режим с ИИ-агентом LexaAI по ключу API;422– недопустимые значения фильтров или тела запроса;429– ограничение частоты; подробнее – в разделе Ошибки и деградация.
Пример запроса
Досье на дату редакции норм, с расширенной выдачей в каждом слое:
curl -sS --max-time 600 https://api.lexaai.ru/v1/research \
-H "X-Api-Key: $LEXAAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "Возмещаются ли расходы на отчет об оценке при оспаривании кадастровой стоимости?",
"as_of": "2026-01-01",
"top_k": 12
}'