Эндпоинты API
Ответ по досье
По ключу API недоступно.
POST /v1/answer– ответы ИИ-агента LexaAI: они доступны только в чате app.lexaai.ru. Запрос с ключом API получает 403 сdetailОтветы ИИ-агента LexaAI недоступны по ключу API. Для своего агента используйте /v1/research, /v1/search и /v1/practice/*; ответы ИИ-агента LexaAI доступны в чате app.lexaai.ru. Для своего агента используйте /v1/research в режиме по умолчанию, /v1/search и /v1/practice/*, см. Что недоступно по ключу API.
POST /v1/answer отвечает на правовой вопрос текстом, написанным по материалам досье. Агент сервиса ищет материалы (веер fanout или цикл loop), языковая модель пишет ответ только по ним, сервер побайтово сверяет закавыченные цитаты и реквизиты рядом со ссылками на материалы. Если материалов нет, ответ не формируется.
Тело запроса
Тело совпадает с /v1/research по составу полей; отличаются значения по умолчанию и смысл некоторых полей.
| Поле | Тип | По умолчанию | Назначение |
|---|---|---|---|
question | строка, 5–2000 символов | обязательно | Правовой вопрос |
research_mode | "fanout", "loop" или null | режим сервера | Режим агентной фазы; значение по умолчанию – поле research_modes.default ответа GET /v1/tools |
agent_search | true, false или null | агент включен | false отключает поиск: ответ не формируется (degradation.reason: "agent_disabled") |
filters | объект | — | Ограничения клиента для поиска по судебным актам; агент обязан их соблюдать, они приоритетнее его собственных |
as_of | дата YYYY-MM-DD | сегодня | Дата, на которую берутся редакции норм |
full_context | true, false или null | настройка сервера | Агент читает тексты найденных источников; фактическое значение – в поле full_context ответа |
vertical | строка | — | Отраслевой пакет для агента, например "kadastr" |
enumeration | объект | — | Явный запрос перечня дел, как в /v1/research |
progress_id | строка, 8–100 символов A–Z, a–z, 0–9, _, - | — | Идентификатор для GET /v1/progress/{id} |
top_k | целое, 1–30 | 8 | На ответ не влияет; поле принимается для совместимости с /v1/research |
Поля, которых нет в таблице, шлюз игнорирует без ошибки.
Три исхода
Код ответа во всех трех случаях – 200. Различаются они по полям answer и degraded.
| Исход | Признак | Что есть в ответе |
|---|---|---|
| Ответ сформирован | answer – строка, поля degraded нет | answer, citation_check, model, materials, materials_dropped |
| Отказ по существу | answer: null, поля degraded нет | detail с причиной: материалов для ответа не нашлось, ответ не формируется |
| Деградация | degraded: true, answer: null | detail, degradation: {reason, message}, materials с текстом, materials_dropped |
Во всех исходах ответ содержит общие поля: question, as_of, steps, gaps, practice_coverage, constraints, court_registry, enumeration_intent, agent_plan (с полем mode), agent_queries, disclaimer, full_context, billing, а при перечне – enumeration.
{
"question": "Возмещаются ли расходы на отчет об оценке при оспаривании кадастровой стоимости?",
"as_of": "2026-10-07",
"answer": "… [C1] … «…» [P2] …",
"citation_check": {
"total_quotes": 4,
"verified_quotes": 4,
"unverified": [],
"verified": true,
"unverified_refs": [],
"refs_checked": 6,
"refs_verified": true,
"note": "дословность гарантируется внутри «кавычек»; ..."
},
"model": "…",
"materials": [
{"id": "L1", "label": "НОРМА …", "doc_key": null, "cut_by": null},
{"id": "C1", "label": "РАЗЪЯСНЕНИЕ: … [сила: …]", "doc_key": "…", "cut_by": null},
{"id": "P2", "label": "СУДЕБНЫЙ АКТ: … [сила: …]", "doc_key": "…", "cut_by": "budget"}
],
"materials_dropped": {"P": {"budget": 3}},
"gaps": ["…"],
"agent_plan": {"mode": "fanout", "steps": ["…"]},
"disclaimer": "Справочная информация на основе дословных выдержек из правовых источников; ...",
"full_context": true,
"billing": {"actual_cost_usd": 0.0123, "known_cost_usd": 0.0123, "unpriced_calls": 0, "llm_calls": 3, "models": ["…"], "source": "provider_usage"}
}Поля ответа
| Поле | Что содержит |
|---|---|
answer | Текст ответа со ссылками на материалы: [L…] – норма, [C…] – разъяснение, [P…] – судебный акт |
citation_check | Сверка ответа с материалами, см. ниже |
model | Модель, написавшая ответ |
materials | Материалы, переданные модели: id, label (реквизиты, сила источника, отметки статуса и пересмотра), doc_key, cut_by – budget, если текст усечен по объему досье. При деградации – также text |
materials_dropped | Сколько найденного не вошло в досье, по слоям L, C, P и причинам: budget – не хватило объема, constraints – вне объявленных ограничений, duplicate_doc – другой фрагмент того же акта. Перечень причин может пополняться |
gaps | Пробелы досье, в том числе усечение материалов и расхождение судов в досье с запрошенными |
agent_plan | Сводка агентной фазы: режим, шаги, причина остановки |
agent_queries | Запросы агента к слою практики: query, filters, n_results, при ошибке – error |
practice_coverage | Состав корпуса практики и срез корпуса |
constraints | Действующие ограничения и их источник |
billing | Вызовы языковых моделей в запросе и их стоимость по данным провайдера |
disclaimer | Дисклеймер, обязательный к показу конечному пользователю |
Состав agent_plan зависит от режима и может расширяться: используйте его для журналирования, а не для логики клиента.
Сверка цитат: citation_check
- Цитатой считается текст длиной от 25 символов в кавычках «…», „…“, “…” или в прямых кавычках
"…". Каждая цитата ищется в каждом материале отдельно, без учета различий в пробелах, виде кавычек и тире и в регистре: цитата, склеенная из двух документов, не засчитывается. total_quotes,verified_quotes– сколько цитат найдено в ответе и сколько подтверждено;unverified– неподтвержденные цитаты (до 160 символов каждая);verified–true, если неподтвержденных нет.refs_checked– сколько ссылок[L…],[C…],[P…]проверено;unverified_refs– реквизиты (номер дела, УИД, дата рядом с номером), которые не совпали с заголовком указанного материала:ref,written,material_title,reason;refs_verified–true, если расхождений нет.
Сверка подтверждает дословность цитат и реквизитов, но не правильность выводов: текст между цитатами – изложение модели.
Деградация
Если сервис подготовки ответа недоступен или не уложился в срок, шлюз возвращает найденные материалы с текстом вместо ответа. Незавершенный текст модели не публикуется.
degradation.reason | Что произошло |
|---|---|
agent_disabled | Клиент передал agent_search: false: поиск не выполнялся, ответ не формировался |
agent_unavailable | Агент не смог построить или исполнить поиск |
no_healthy_route | Нет рабочего канала к сервису подготовки ответа |
selected_route_unavailable | Связь с сервисом подготовки ответа прервалась |
timeout | Сервис подготовки ответа не уложился в отведенное время |
channel_unavailable | Иной отказ канала |
Перечень причин может пополняться: неизвестное значение обрабатывайте как channel_unavailable. Поле degradation.message – текст для человека. Машинным клиентам и мониторингу недостаточно проверять код ответа: проверяйте degraded.
Если сервис подготовки ответа не настроен на сервере совсем, шлюз отвечает 503 до начала поиска.
Ход выполнения: GET /v1/progress/{id}
Клиент сам создает progress_id (8–100 символов A–Z, a–z, 0–9, _, -), передает его в теле POST /v1/answer или POST /v1/research и параллельно опрашивает GET /v1/progress/{id}. Опрос требует ключ той же учетной записи и не списывает единиц; на итоговый ответ он не влияет.
{
"available": true,
"found": true,
"question": "Возмещаются ли расходы на отчет об оценке при оспаривании кадастровой стоимости?",
"mode": "answer",
"status": "running",
"events": [
{"step": 1, "tool": "plan_search", "arguments": "iteration=1", "outcome": "план получен", "elapsed_s": 21.4},
{"step": 2, "tool": "search", "arguments": "query='…'", "outcome": null, "elapsed_s": 23.0}
],
"elapsed_s": 31.7,
"ttl_s": 900
}status–running,complete,failed;outcome– итог запроса после завершения.- Неизвестный или чужой идентификатор:
{"available": true, "found": false, "status": "unknown"}. - Запись хранится в памяти шлюза 15 минут после последнего обновления.
- Если ход выполнения временно недоступен на стороне сервера, ответ –
{"available": false, "reason": "…"}; основной запрос это не затрагивает.
Время выполнения
Агентная фаза и ответ модели укладываются в общий предел: 1800 с в режиме fanout и 2100 с в режиме loop; к нему добавляется время на перечень и оформление ответа. Таймаут чтения на клиенте – не меньше 35 и 40 минут соответственно. После обрыва соединения не повторяйте запрос сразу: проверьте ход выполнения по progress_id, см. Ошибки и деградация.