Skip to content

Справочник API: блоки и теги ​

Блок (chunk) — минимальная единица поиска, теги используются для классификации документов. Обе группы эндпоинтов относятся к ресурсам базы знаний и используют те же правила прав, что и базы знаний и знания: чтение — Viewer+ и право read на родительскую KB (API key retrieve); запись — «создатель KB OR Admin+» и право write (API key ingest); обе ограничены белым списком KB у API key.

Общие соглашения (Base URL, аутентификация, коды ошибок, пагинация) см. в Обзоре API.

Блоки (/api/v1/chunks) ​

Handler: internal/handler/chunk.go. Чтение: Viewer+ и read на родительскую KB (API key retrieve/full); запись: создатель KB OR Admin+ и write на родительскую KB (API key ingest/full).

GET /api/v1/chunks/:knowledge_id ​

Назначение: список блоков знания.

Параметр запросаТипОбязательныйОписание
pageintНетПо умолчанию 1
page_sizeintНетПо умолчанию 10, максимум 100
chunk_typestringНетМожно повторять; фильтр по типу блока

Ответ: 200 {"success":true,"data":[Chunk],"total","page","page_size"}

bash
curl "$BASE/api/v1/chunks/k-1?page=1" -H "Authorization: Bearer $TOKEN"

GET /api/v1/chunks/by-id/:id ​

Назначение: получить один блок по chunk ID (без knowledge_id).

Ответ: 200 {"success":true,"data":{Chunk}}. Chunk.source_locators — позиция блока в исходном файле; структура описана в разделе source_locators в Обзоре API.

bash
curl $BASE/api/v1/chunks/by-id/c-1 -H "Authorization: Bearer $TOKEN"

PUT /api/v1/chunks/:knowledge_id/:id ​

Назначение: редактирование содержимого блока или его включение/отключение (начиная с migration 000078 — версионируемое оптимистичное обновление).

ПолеТипОбязательноеОписание
contentstringНетНовое содержимое; после удаления начальных и конечных пробелов не должно быть пустым; максимум 200000 байт
is_enabledboolНетВключить/отключить этот блок
expected_revisionintНетОжидаемый content_revision для оптимистичного контроля параллелизма

Ограничения и побочные эффекты:

  • редактировать можно только блоки типа text; для других типов возвращается 400;
  • при несовпадении expected_revision с текущим content_revision возвращается 409 (Chunk was modified by another user; refresh and retry);
  • нельзя добавлять при редактировании URL изображений, которых нет в исходном содержимом; удаление Markdown-изображения одновременно отключает соответствующий дочерний блок OCR/caption;
  • после успешного редактирования content_revision увеличивается на 1, старая версия записывается в таблицу chunk_revisions, а index_status последовательно проходит processing → ready; если переиндексация не удалась, строка всё равно сохраняется, но index_status = failed; повторная отправка того же содержимого запускает повторную попытку;
  • при редактировании дочернего блока содержимое родительского блока перезаписывается по смещению (source_content родительского блока остаётся неизменным);
  • изменение содержимого или состояния включения ставит в очередь обновление сводки документа.

Ответ: 200 {"success":true,"data":{Chunk},"summary_status":"pending","description":"..."}

bash
curl -X PUT $BASE/api/v1/chunks/k-1/c-1 -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"content":"Исправленное содержимое","expected_revision":2}'

GET /api/v1/chunks/:knowledge_id/:id/revisions ​

Назначение: список исторических версий блока (таблица chunk_revisions, по revision в порядке убывания).

Ответ: 200 {"success":true,"data":[{ChunkRevision}]}, каждая запись содержит revision, content, is_enabled, editor_id, edit_source, edited_at.

bash
curl $BASE/api/v1/chunks/k-1/c-1/revisions -H "Authorization: Bearer $TOKEN"

POST /api/v1/chunks/:knowledge_id/:id/revert ​

Назначение: откат к исторической версии. Сам откат — тоже новое редактирование: content_revision продолжает увеличиваться, а текущее содержимое сохраняется как новая историческая версия.

ПолеТипОбязательноеОписание
revisionintДаНомер целевой исторической версии (неотрицательный)
expected_revisionintНетОптимистичная блокировка, семантика та же; при конфликте возвращается 409

Ответ: 200 {"success":true,"data":{Chunk},"summary_status":"...","description":"..."}

bash
curl -X POST $BASE/api/v1/chunks/k-1/c-1/revert -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"revision":1}'

DELETE /api/v1/chunks/:knowledge_id/:id ​

Назначение: удалить один блок.

Ответ: 200 {"success":true,"message":"Chunk deleted"}

bash
curl -X DELETE $BASE/api/v1/chunks/k-1/c-1 -H "Authorization: Bearer $TOKEN"

DELETE /api/v1/chunks/:knowledge_id ​

Назначение: удалить все блоки знания.

Ответ: 200 {"success":true,"message":"All chunks under knowledge deleted"}

bash
curl -X DELETE $BASE/api/v1/chunks/k-1 -H "Authorization: Bearer $TOKEN"

DELETE /api/v1/chunks/by-id/:id/questions ​

Назначение: удалить один сгенерированный вопрос у этого блока. Тело запроса: {"question_id":"..."} (binding:"required").

Ответ: 200 {"success":true,"message":"Generated question deleted"}

bash
curl -X DELETE $BASE/api/v1/chunks/by-id/c-1/questions -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"question_id":"q-1"}'

PUT /api/v1/chunks/by-id/:id/questions ​

Назначение: добавить или изменить один сгенерированный вопрос у этого блока. Тело запроса: {"question":"...","question_id":"..."}; question обязателен; пустой question_id означает создание.

Ответ: 200 {"success":true,"data":{GeneratedQuestion}}

bash
curl -X PUT $BASE/api/v1/chunks/by-id/c-1/questions -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"question_id":"q-1","question":"Как настроить векторное хранилище в aihelpme.ru?"}'

POST /api/v1/chunks/by-id/:id/questions/regenerate ​

Назначение: заново сгенерировать поисковые вопросы на основе текущего содержимого блока. После редактирования содержимого существующие вопросы не удаляются, а помечаются как «устаревшие» (revision не совпадает с текущим текстом); их можно обновить этим эндпоинтом.

Ответ: 200 {"success":true,"data":[{GeneratedQuestion}]}

bash
curl -X POST $BASE/api/v1/chunks/by-id/c-1/questions/regenerate -H "Authorization: Bearer $TOKEN"

Теги (/api/v1/knowledge-bases/:id/tags) ​

Handler: internal/handler/tag.go. Чтение: Viewer+ + KB read (API key retrieve/full); запись: создатель KB OR Admin+ + KB write (API key ingest/full).

GET /api/v1/knowledge-bases/:id/tags ​

Назначение: список тегов. Параметры запроса: page, page_size, keyword (все необязательны).

Ответ: 200 {"success":true,"data":[KnowledgeTag]}

bash
curl $BASE/api/v1/knowledge-bases/kb-1/tags -H "Authorization: Bearer $TOKEN"

POST /api/v1/knowledge-bases/:id/tags ​

Назначение: создать тег.

ПолеТипОбязательноеОписание
namestringДа (binding:"required")Имя тега
colorstringНетЦвет
sort_orderintНетСортировка

Ответ: 200 {"success":true,"data":{KnowledgeTag}}

bash
curl -X POST $BASE/api/v1/knowledge-bases/kb-1/tags -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"name":"Послепродажное обслуживание"}'

PUT /api/v1/knowledge-bases/:id/tags/:tag_id ​

Назначение: обновить тег (tag_id принимает UUID или целочисленный seq_id). Тело запроса: name/color/sort_order (поля-указатели, все необязательны).

Ответ: 200 {"success":true,"data":{KnowledgeTag}}

bash
curl -X PUT $BASE/api/v1/knowledge-bases/kb-1/tags/t-1 -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"name":"Послепродажная поддержка"}'

DELETE /api/v1/knowledge-bases/:id/tags/:tag_id ​

Назначение: удалить тег. Параметры запроса: force (bool, удалить тег вместе с документами или записями FAQ, всё ещё ссылающимися на него), content_only (bool, удалить только содержимое тега, сохранив сам тег). Тело запроса (необязательно): {"exclude_ids":[int64]} — перечисляет seq_id записей FAQ, которые нужно сохранить при удалении. Если force не передан, а на тег всё ещё ссылаются знания или записи FAQ, возвращается 400 и документы не удаляются.

Некорректный формат тела запроса или ID, не являющийся положительным целым, — 400; несуществующий ID — 404; ID записи FAQ, не принадлежащей текущей базе знаний, — 403.

Ответ: 200 {"success":true}

bash
curl -X DELETE $BASE/api/v1/knowledge-bases/kb-1/tags/t-1 -H "Authorization: Bearer $TOKEN"

Отладка разбиения на блоки ​

POST /api/v1/chunker/preview ​

Назначение: предпросмотр разбиения на блоки без сохранения состояния (панель отладки редактора KB). Права: Viewer+; API key retrieve/ingest/full. Handler: internal/handler/chunker_debug.go

ПолеТипОбязательноеОписание
textstringДа (проверка на непустоту в коде, ≤64k символов)Образец текста
chunking_config.chunk_sizeintНетЧисло символов в блоке
chunking_config.chunk_overlapintНетПерекрытие
chunking_config.separators[]stringНетРазделители
chunking_config.strategystringНетauto/heading/heuristic/recursive/legacy
chunking_config.token_limitintНетЛимит token
chunking_config.languages[]stringНетПодсказки по языкам
chunking_config.enable_parent_childboolНетПробное разбиение по схеме родитель-потомок; возвращаются дочерние блоки (совпадает с гранулярностью поиска)
chunking_config.parent_chunk_size / child_chunk_sizeintНетРазмер родительского/дочернего блока; по умолчанию 4096 / 384

Встроенный HTML <table> в образце текста сначала преобразуется в Markdown-таблицу — так же, как при загрузке в базу.

Ответ: 200 {"success":true,"data":{"selected_tier","tier_chain","rejected","profile","chunks":[...],"stats":{count,avg_chars,min_chars,max_chars,stddev_chars,truncated_to}}}; слишком длинный текст — 413; тайм-аут разбиения (5s) — 504.

bash
curl -X POST $BASE/api/v1/chunker/preview -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -d '{"text":"# Заголовок\nТекст...","chunking_config":{"chunk_size":512}}'

Справочник по реализации ​

Регистрация маршрутов: RegisterChunkRoutes, RegisterKnowledgeTagRoutes, RegisterChunkerDebugRoutes в internal/router/routes_knowledge.go.

Версия v0.8.3 · MIT License