Перейти к содержимому

POST /api/projects/:id/doc-content/:nodeId/inline-edit — Точечная правка блока (SSE)

Сгенерировано из матриц + кода. Правки вносить в источники (docs/matrices/, server/routes/), не здесь.

ПолеЗначение
HTTPPOST /api/projects/:id/doc-content/:nodeId/inline-edit
AuthoptionalAuth, requireProjectAccess — гость + авторизованный, доступ к проекту (read/write)
Scope токенаread_write
PG-функцииapi.upsert_block_doc_content
Таблицыblock_doc_content, block_doc_content_history
SRMSRM-199
RP (права)RP-112
Файл роутаserver/routes/projects.js
Статусdone

Аргументы запроса (best-effort из хендлера; путь-параметры опущены):

АргументГдеОбяз.Заметка
contentItemIdbodyподтвердить
fullContentbodyподтвердить
instructionbodyподтвердить
selectedTextbodyподтвердить

Коды ответов/ошибок (из хендлера): 400, 403 (+ 200) — уточнить причины вручную

Для человека

Как открыть: откройте проект → вкладка «Doc» (▧) → в тексте блока выделите фрагмент мышью → во всплывающей подсказке впишите, что с ним сделать («сократи», «добавь пример», «формальнее»), и подтвердите.

Точечная правка: вы указываете на конкретный кусок текста и говорите, как его изменить, — переписывается весь блок целиком, но прицельно вокруг вашего выделения и инструкции. В контекст идут весь текст блока, выделенный фрагмент, ваша инструкция и тексты блоков-предшественников, так что правка остаётся согласованной с остальным документом.

Результат течёт потоком и заменяет текст блока целиком. Прежняя версия уходит в историю с пометкой «правка по выделению», поэтому изменение легко отменить (Ctrl+Z или «Отменить»). Инструкция — до 1000 символов, выделение — до 5000. Доступно владельцу проекта (и гостю — в своём проекте). Точные правила — RP-112.

Для агента

Запись — токен со scope read_write (см. Конвенции); под ролью владельца, write-доступ к проекту обязателен. Ответ — поток text/event-stream (SSE).

Тело запроса (JSON):

ПолеТипОбяз.Назначение
selectedTextstringдаВыделенный фрагмент, ≤ 5000 символов
instructionstringдаЧто сделать с фрагментом, ≤ 1000 символов
fullContentstringдаТекущий полный текст блока, ≤ 50 000 символов
contentItemIdnumberнетЕсли правится не сам блок, а его артефакт — id этого артефакта

Любое из обязательных полей пропущено → 400 (поток не открывается). Невалидный contentItemId → событие error в потоке.

Пример запроса (-N — потоковый ответ):

Окно терминала
curl -N -X POST "https://specbuilder.vnimanie.ai/api/projects/a1b2c3d4-.../doc-content/node-7/inline-edit" \
-H "Authorization: Bearer tak_..." \
-H "Content-Type: application/json" \
-d '{"selectedText":"Данные берём из CRM.","instruction":"Уточни, какие именно поля","fullContent":"## Сбор данных\n\nДанные берём из CRM.\n..."}'

Пример потока (события — из server/services/docGenerator.js):

event: generating
data: {"nodeId":"node-7","label":"Сбор данных","phase":"inline-edit"}
event: chunk
data: {"nodeId":"node-7","text":"## Сбор данных\n\nИз CRM берём поля..."}
event: saved
data: {"nodeId":"node-7","version":5,"tokenEstimate":560}
event: done
data: {"nodeId":"node-7","phase":"inline-edit"}

Возвращается весь обновлённый блок (не дифф) — собираете его из chunk-событий. saved означает, что результат записан, а прежняя версия ушла в историю с типом правки llm_inline — отсюда работает откат. done закрывает поток. Обрыв соединения прерывает генерацию (AbortController). Поток — SSE, не JSON и не Markdown.

Связанные