API
id— ваш уникальный идентификатор товара (обычно GUID из 1С). Без него сервис не сможет добавить или обновить товар. Повторная загрузка с тем жеidполностью перезаписывает записьname— наименование товара. Обязательно только для нечеткого поиска- Сервис ищет по полям:
name,code,barcode,art, а также динамическим полям в PRO-режиме (см. Расширенный поиск) - Ответ приходит за 2-10 мс — ваша 1С не зависнет
- Если сервис недоступен — ставьте таймаут 1-2 секунды и создавайте новый товар без проверки
security.api_key, все запросы должны содержать заголовок X-API-Key: <ключ>. Без него сервис вернет 401 Unauthorized. При превышении лимита запросов сервис вернет 429 Too Many Requests.
site.enabled = true). Все мутации (/add, /delete, /admin/*, /feedback, /synonyms POST/DELETE и др.) возвращают 403 Forbidden. Доступны только чтение: /find, /export, /health, /api/search-config, /api/config и статика.
Поля в запросах и ответах
| Поле | Где используется | Что значит | Тип | Обязательность |
|---|---|---|---|---|
name | в запросе /find, /add | Наименование товара | string | для нечеткого поиска, для точного (можно пустым) |
id | в запросе /add, /delete, /find | Ваш GUID из 1С | string | обязательно для /add |
id_out | в ответе /find | GUID найденного товара | string | — |
name_out | в ответе /find | Наименование найденного товара | string | — |
score | в ответе /find | Уверенность (0-1). 1.0 = идеальное совпадение | float | — |
matched_by | в ответе /find | Способ поиска (см. таблицу ниже) | string | — |
search_time_ms | в ответе /find | Общее время выполнения поиска в миллисекундах | integer | — |
code | в запросе/ответе | Код товара / производителя | string | опционально |
barcode | в запросе/ответе | Штрихкод (строка или массив строк) | string или array | опционально |
art | в запросе/ответе | Дополнительный артикул | string | опционально |
fields | в запросе /find | Какие дополнительные поля вернуть в ответе | object | опционально |
(динамические поля) | в запросе/ответе | Любые дополнительные реквизиты передаются плоско, на одном уровне с name, id, code (например: material, color, supplier, brand). Все значения хранятся и сравниваются как строки — числа и даты тоже становятся строками. | string | опционально (PRO only) |
strategy | в запросе /find | Стратегия поиска: "fs_only", "embedding_only", "hybrid", "parallel" | string | опционально; принимается в обеих редакциях, эффект только в PRO |
parent_id | в запросе /add | ID родительского элемента (для иерархии) | string | опционально (PRO only) |
group_id | в запросе /add | ID группы аналогов (кросс-коды) | string | опционально (PRO only) |
is_original | в запросе /add | Является ли товар оригиналом в группе | boolean | опционально (PRO only) |
limit | в запросе /find | Максимальное количество результатов (не более 1000) | integer | опционально (по умолчанию из конфига, максимум 1000) |
type | /find, /add, ответ | Тип номенклатуры (1С) | string | опционально |
desc | /find, /add, ответ | Описание/реквизиты (1С) | string | опционально |
ref | /find, /add, ответ | Ссылка/UUID 1С (точный поиск) | string | опционально |
| fs_only | /add (body) | Пропустить эмбеддинги (экономия CPU) | bool | по умолчанию false |
success | в ответе /add, /delete | Успешно ли выполнена операция | boolean | — |
error / reason | в ответе /add, /delete | Причина ошибки | string | — |
Значения поля matched_by
| Значение | Что значит |
|---|---|
exact_id | Точное совпадение по id |
exact_id_from_name | UUID из поля name распознан как id |
exact_id_fallback | Точное совпадение по id после fallback-поиска |
exact_barcode / exact_barcode_from_name | Точное совпадение по штрихкоду (в том числе из name) |
exact_code / exact_code_from_name | Точное совпадение по коду товара (в том числе из name) |
exact_art / exact_art_from_name | Точное совпадение по артикулу (в том числе из name) |
exact_type | Точное совпадение по типу 1С |
exact_ref | Точное совпадение по ссылке/UUID 1С |
exact_name / exact_name_raw | Точное совпадение по наименованию (стеммированное / исходное) |
exact_fields | Совпадение по комбинации полей запроса (code, art, type, ref, barcode) |
exact_dynamic | Точное совпадение по динамическим полям (PRO only) |
exact_identifier | Точное совпадение по идентификатору 1С или внешнему коду |
exact_parent_id | Найден по parent_id (иерархия) |
exact_1c_full_match | Полное совпадение по 1С-идентификаторам |
ngram | Найдено через Edge N-gram (по части слова) |
phrase / phrase_fallback | Найдено по точной фразе |
fuzzy_text | Найдено через нечеткий поиск (с опечатками) |
fuzzy_boolean | Найдено через булевый нечеткий поиск |
dynamic_only | Найдено только по динамическим полям (без name, PRO only) |
embedding | Найдено через семантический поиск (PRO only) |
fs_only | Найдено через полнотекстовый поиск |
fs+embedding | Гибридный поиск (PRO only) |
hierarchy_child | Найден как потомок в иерархии (PRO only) |
hierarchy_default | Значение по умолчанию при иерархическом поиске (PRO only) |
POST /find — поиск
Поиск по названию (основной сценарий):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "Болт М16 цинк"
}
],
"limit": 3
}'
# Тот же запрос через CLI
sku-cli search "Болт М16 цинк" --limit 3
Точный поиск по ID (name можно передать пустым):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "",
"id": "1C-GUID-0001"
}
]
}'
# Тот же запрос через CLI
sku-cli search --id "1C-GUID-0001"
Поиск по артикулу (name можно передать пустым):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "",
"code": "BOLT-M16-60-ZN"
}
]
}'
# Тот же запрос через CLI
sku-cli search --code "BOLT-M16-60-ZN"
Поиск по динамическим полям (PRO only):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "",
"supplier": "ООО Ромашка",
"brand": "Bosch"
}
],
"limit": 20
}'
# Тот же запрос через CLI
sku-cli search "" --field supplier="ООО Ромашка" --field brand="Bosch" --dynamic-only --limit 20
extended_search_enabled = true и require_name_for_fuzzy = false.
Смешанный поиск (название + артикул + динамические поля):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "Болт М16",
"art": "78454",
"color": "оцинкованный"
}
],
"limit": 5
}'
# Тот же запрос через CLI
sku-cli search "Болт М16" --art "78454" --field color="оцинкованный" --limit 5
С указанием стратегии поиска:
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "шуруповерт аккумуляторный"
}
],
"strategy": "hybrid",
"limit": 5
}'
# Тот же запрос через CLI
sku-cli search "шуруповерт аккумуляторный" --limit 5 --strategy hybrid
Поиск по type (фильтр по типу объекта 1С):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "болт",
"type": "Справочник.Номенклатура"
}
]
}'
# Тот же запрос через CLI
sku-cli search "болт" --type "Справочник.Номенклатура"
Поиск по ref (прямая ссылка на объект 1С):
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "",
"ref": "e1cib/data/Справочник.Номенклатура?ref=a1b2c3d4e5f6..."
}
]
}'
# Тот же запрос через CLI
sku-cli search --ref "e1cib/data/Справочник.Номенклатура?ref=a1b2c3d4e5f6..."
Транслитерация и неправильная раскладка:
# Русская фраза, набранная латиницей на русской раскладке
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{"items":[{"name":"ljvbr d lthtdyt"}]}'
# Латинская транслитерация
curl -X POST http://localhost:8080/find \
-H "Content-Type: application/json" \
-d '{"items":[{"name":"domik v derevne"}]}'
# Тот же запрос через CLI
sku-cli search "ljvbr d lthtdyt"
sku-cli search "domik v derevne"
config.toml включен параметр search.transliteration_enabled = true.
Ответ (когда товар найден):
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"search_time_ms": 12,
"results": [
{
"query": {
"name": "Болт М16 цинк",
"id": null,
"code": null,
"art": null,
"barcode": [],
"fields": {},
"parent_id": null,
"group_id": null,
"is_original": false,
"type": null,
"desc": null,
"ref": null
},
"matches": [
{
"original": {
"name_out": "Болт М16х60 оцинкованный ГОСТ 7798-70",
"id_out": "1C-GUID-0001",
"code": "BOLT-M16-60-ZN",
"barcode": ["4607000010015"],
"art": "78454",
"score": 0.94,
"matched_by": "fuzzy_text",
"is_original": false,
"matched_tokens": ["болт", "м16", "оцинкованный"]
}
}
]
}
]
}
cross_codes возвращается только при непустом списке кросс-кодов; если аналогов нет, ключ в JSON отсутствует.
Ответ с кросс-кодами (PRO only):
Параметр include_cross_codes по умолчанию true. Кросс-коды возвращаются только если в конфигурации включены pro.enabled и pro.cross_codes.enabled.
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"search_time_ms": 8,
"results": [
{
"query": { ... },
"matches": [
{
"original": {
"name_out": "Болт М16х60 оцинкованный",
"id_out": "DETAL-BOSCH-001",
"group_id": "GROUP-BOSCH-001",
"is_original": true,
"score": 0.94
},
"cross_codes": [
{
"name_out": "Болт М16х60 оцинкованный аналог",
"id_out": "DETAL-BOSCH-002",
"score": 0.89,
"is_original": false
}
]
}
]
}
]
}
Ответ (когда ничего не найдено):
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"search_time_ms": 3,
"results": [
{
"query": { "name": "несуществующий товар", ... },
"matches": []
}
]
}
- Обычные extra-поля (не описанные в
<code>[[search.extended_fields]]</code>) сохраняются вf_attrsи возвращаются автоматически, если они проиндексированы. - Расширенные поля (
<code>[[search.extended_fields]]</code>, PRO) сохраняются в отдельные поля схемы поискового индекса. Они возвращаются в ответе, только когда поиск выполняется именно по этому полю (обычно с пустымname). Если товар найден по названию или эмбеддингам, расширенное поле может отсутствовать. - «Технические» 1С-значения (GUID, строки только из цифр/дефисов/точек/слешей) не попадают в
f_attrsи не возвращаются как extra-атрибуты.
POST /add — добавить или обновить
Запрос:
curl -X POST http://localhost:8080/add \
-H "Content-Type: application/json" \
-d '{
"items": [{
"name": "Гайка М16 нержавеющая",
"id": "1C-GUID-0002",
"code": "NUT-M16-A2",
"barcode": ["4607000010022"],
"art": "GN-16",
"supplier": "ООО Ромашка",
"brand": "Nord"
}]
}'
# Тот же запрос через CLI
# Создайте файл item.json:
[
{
"name": "Гайка М16 нержавеющая",
"id": "1C-GUID-0002",
"code": "NUT-M16-A2",
"barcode": [
"4607000010022"
],
"art": "GN-16",
"supplier": "ООО Ромашка",
"brand": "Nord"
}
]
sku-cli add item.json
id: Если в индексе уже есть товар с таким id, сервис удалит старую запись и запишет новую. Это позволяет обновлять товары, но требует, чтобы id был уникальным и не менялся между загрузками.
Ответ (успех):
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"success": true,
"error": null,
"results": [
{
"id": "1C-GUID-0002",
"success": true,
"error": null
}
]
}
Запрос с ошибкой (пустой id):
curl -X POST http://localhost:8080/add \
-H "Content-Type: application/json" \
-d '{
"items": [{
"name": "Товар без GUID",
"id": ""
}]
}'
# Тот же запрос через CLI
# Создайте файл item.json:
[
{
"name": "Товар без GUID",
"id": ""
}
]
sku-cli add item.json
Ответ (ошибка):
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"success": false,
"error": "Batch validation failed",
"results": [
{
"id": "",
"success": false,
"error": "id missing or empty"
}
]
}
POST /add?dry_run=true — проверить без записи
curl -X POST "http://localhost:8080/add?dry_run=true" \
-H "Content-Type: application/json" \
-d '{"items":[{"name":"Новый товар","id":"NEW-001"}]}'
# Тот же запрос через CLI
# Создайте файл item.json:
[
{
"name": "Новый товар",
"id": "NEW-001"
}
]
sku-cli add item.json --dry-run
Ответ:
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"success": true,
"error": null,
"results": [
{
"id": "NEW-001",
"success": true,
"error": "would_insert"
}
]
}
POST /delete — удалить
curl -X POST http://localhost:8080/delete \
-H "Content-Type: application/json" \
-d '{"items":[{"id":"1C-GUID-OLD-001"}]}'
# Тот же запрос через CLI
sku-cli delete "1C-GUID-OLD-001"
Ответ:
{
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"success": true,
"error": null,
"results": [
{
"id": "1C-GUID-OLD-001",
"success": true,
"error": null
}
]
}
POST /synonyms — управление синонимами
curl -X POST http://localhost:8080/synonyms \
-H "Content-Type: application/json" \
-d '{"items":[{"word":"цинк","expansions":["оцинкованный","zn","zinc"]}]}'
# Тот же запрос через CLI
sku-cli synonyms add --word "цинк" --expansions "оцинкованный,zn,zinc"
Ответ:
{
"results": [
{
"word": "цинк",
"success": true,
"reason": null
}
]
}
GET /synonyms — получить все синонимы
curl http://localhost:8080/synonyms
# Тот же запрос через CLI
sku-cli synonyms list
Ответ:
{
"synonyms": {
"цинк": ["оцинкованный", "zn", "zinc"],
"болт": ["болтик", "винт"]
}
}
POST /feedback — обратная связь для обучения
curl -X POST http://localhost:8080/feedback \
-H "Content-Type: application/json" \
-d '{
"query_name": "болт м16 цинк",
"matched_id_out": "1C-GUID-0001",
"action": "reject"
}'
# Тот же запрос через CLI
sku-cli feedback --query "болт м16 цинк" --matched-id "1C-GUID-0001" --action reject
Ответ:
{
"status": "logged"
}
query_name, matched_id_out и action, запрос может содержать опциональные поля:
product_name, product_art, product_barcode, matched_by, position, session_id, expected_id.
GET /health — проверить состояние сервиса
curl http://localhost:8080/health
# Тот же запрос через CLI
sku-cli health
Ответ:
{
"status": "ok",
"version": "0.2.9",
"edition": "pro",
"uptime_seconds": 3600,
"config_path": "/app/config.toml",
"config_hash": "a2476ef4e23468b5",
"db_record_count": 20001,
"db_size_mb": 142.5,
"disk_free_gb": 180.2,
"synonyms_count": 42,
"cpu_usage_percent": 2.1,
"ram_used_mb": 11912,
"backups_count": 3,
"cache_hits": 1234,
"cache_misses": 567,
"cache_size": 1000,
"qps": 12.5,
"index_status": {
"optimized": true,
"segments_count": 1
},
"orchestrator": {
"strategy": "hybrid",
"fs_enabled": true,
"embedding_enabled": true,
"total_searches": 0,
"avg_time_ms": 0.0
},
"embedding": {
"enabled": true,
"model_loaded": true,
"vector_count": 20399,
"vector_dimension": 1024,
"avg_search_time_ms": 0.0
},
"embedding_queue": {
"enabled": true,
"pending": 0,
"processing": 0,
"completed": 20399,
"failed": 0,
"dead": 0,
"total": 20399
},
"background_workers": {
"worker_count": 2,
"active_workers": 2,
"total_restarts": 0,
"restarts_last_minute": 0,
"max_restarts_per_minute": 8,
"monitor_interval_secs": 2
},
"license": {
"enabled": true,
"active": true,
"fingerprint": "sha256:..."
},
"last_error": null
}
{"enabled": false, "model_loaded": false, "vector_count": 0} (для embedding) или {"enabled": false} (для остальных). Поле last_error всегда присутствует и равно null, если ошибок не было.
GET /export — выгрузить все данные
curl "http://localhost:8080/export?format=csv&limit=1000&offset=0" -o export.csv
Параметры:
format—"json"(по умолчанию) или"csv"limit— количество строк (макс. из конфига, по умолчанию 1000)offset— смещение (для пагинации)
Ответ (CSV):
id_out,name,code,barcode,art
1C-GUID-0001,Болт М16х60 оцинкованный ГОСТ 7798-70,BOLT-M16-60-ZN,"[""4607000010015""]",78454
1C-GUID-0002,Гайка М16 нержавеющая,NUT-M16-A2,"[""4607000010022""]",GN-16
GET /api/search-config — получить конфигурацию поиска (для UI)
curl http://localhost:8080/api/search-config
# Тот же запрос через CLI
sku-cli config
Ответ:
{
"extended_fields": [
{"field": "supplier", "weight": 0.7, "stemmed": true, "fuzzy": true},
{"field": "brand", "weight": 0.6, "stemmed": true, "fuzzy": true}
],
"extended_search_enabled": true,
"require_name_for_fuzzy": false,
"pro_enabled": true,
"embedding_enabled": true,
"search_strategy": "parallel",
"pro_info_url": "https://example.com/pro",
"purchase_url": "https://example.com/purchase"
}
extended_fields возвращается пустым массивом, pro_enabled и embedding_enabled — false. Поля pro_info_url и purchase_url присутствуют в обеих редакциях, если заданы в конфигурации.
PRO API — Аналитика и тюнинг (только PRO версия)
pro.analytics_enabled = true.
GET /admin/analytics/stats — статистика поиска
curl http://localhost:8080/admin/analytics/stats
# Тот же запрос через CLI
sku-cli analytics stats
POST /admin/analytics/reset — сброс статистики
GET /admin/analytics/tuning — рекомендации по настройке
PRO API — Иерархия (BOM / Where-Used)
pro.plugins.hierarchy.enabled = true.
POST /hierarchy — построение дерева спецификаций
Запрос (разузлование вниз):
curl -X POST http://localhost:8080/hierarchy \
-H "Content-Type: application/json" \
-d '{
"root_id": "DETAL-001",
"direction": "down",
"max_depth": 5,
"include_cross_codes": true,
"limit": 100
}'
Параметры:
root_id— ID корневого элемента (обязательно). Дляdirection=downэто начало дерева; дляdirection=up— деталь, для которой ищутся родители.direction— только строчные значения:"down"(разузлование, от изделия к деталям) или"up"(Where-Used, от детали к изделиям). Значения с заглавной буквы ("Down","UP") вернут ошибку 422.max_depth— максимальное количество уровней от корня. Корень имеет уровень 0, его прямые потомки/родители — уровень 1 и т.д. По умолчанию 5 (из конфигаpro.plugins.hierarchy.default_max_depth).include_cross_codes— включать аналоги для каждого узла. Сам узел в свой список аналогов не попадает. По умолчаниюfalse(из конфигаpro.plugins.hierarchy.include_cross_codes_by_default).limit— общий лимит узлов во всем дереве или цепочке, включая корень. Не «на уровень». По умолчанию 1000 (из конфигаpro.plugins.hierarchy.default_limit).
PRO API — Управление эмбеддингами
GET /admin/embedding/stats — статистика эмбеддингов
POST /admin/embedding/reindex — переиндексация векторов
POST /admin/embedding/reindex/background — фоновая переиндексация
POST /admin/embedding/clear — очистить векторное хранилище
POST /admin/embedding/optimize — оптимизировать HNSW индекс
POST /admin/embedding/cache/clear — очистить кэш эмбеддингов
Административные эндпоинты
POST /admin/clear — очистить весь индекс (PRO only)
GET /admin/learn — анализ фидбека и предложение синонимов
GET /admin/index/stats — статистика индекса
POST /admin/index/optimize — оптимизация индекса (мерж сегментов)
GET /admin/queries/top — топ запросов
POST /admin/cache/clear — очистить кэш запросов
POST /admin/config/update — обновить конфигурацию на лету
curl -X POST http://localhost:8080/admin/config/update \\
-H "Content-Type: application/json" \\
-d '{"search":{"auto_match_threshold":0.9}}'
GET /admin/config — текущая конфигурация
GET /admin/config и GET /api/config возвращают одинаковую редактируемую конфигурацию (секции search, pro, csv, export). Различий между «admin» и «public» представлением нет.
GET /api/config — текущая конфигурация
GET /swagger-ui — интерактивная документация OpenAPI
GET / — embedded GUI
Возвращает HTML-страницу встроенного интерфейса (Free/PRO GUI или страница активации), а не JSON-статус.
Полный список эндпоинтов
/add, /delete, /feedback, /synonyms, /admin/config/update, /admin/clear, /admin/index/optimize, /admin/cache/clear, /admin/analytics/reset, /admin/embedding/*, /hierarchy и др.) регистрируются только при allow_mutations = true. В режиме «только для сайта» (site.enabled = true) мутации возвращают 403 Forbidden.
| Метод | Путь | Описание | Free | PRO |
|---|---|---|---|---|
| GET | / | Embedded GUI (Free/PRO/активация) | ✓ | ✓ |
| GET | /sample_queries | Примеры поисковых запросов | ✓ | ✓ |
| GET | /docs/* | Встроенная документация (mdbook) | ✓ | ✓ |
| GET | /static/* | Статические файлы GUI | ✓ | ✓ |
| GET | /swagger-ui | Интерактивная документация OpenAPI | ✓ | ✓ |
| GET | /api-docs/openapi.json | OpenAPI-спецификация | ✓ | ✓ |
| GET | /api/update-check | Проверка обновлений | ✓ | ✓ |
| POST | /find | Поиск номенклатуры | ✓ | ✓ |
| POST | /add | Добавить/обновить товары | ✓ | ✓ |
| POST | /delete | Удалить товары | ✓ | ✓ |
| POST | /synonyms | Управление синонимами | ✓ | ✓ |
| DELETE | /synonyms/:word | Удалить синоним | ✓ | ✓ |
| GET | /synonyms | Получить синонимы | ✓ | ✓ |
| POST | /feedback | Обратная связь для обучения | ✓ | ✓ |
| GET | /health | Состояние сервиса | ✓ | ✓ |
| GET | /export | Экспорт данных | ✓ | ✓ |
| GET | /api/search-config | Конфигурация для UI | ✓ | ✓ |
| GET | /api/config | Текущая конфигурация | ✓ | ✓ |
| POST | /api/activate | Активация PRO-лицензии | — | ✓ |
| GET | /api/license/status | Статус лицензии | — | ✓ |
| GET | /api/license/fingerprint | Fingerprint сервера | — | ✓ |
| POST | /api/license/upload | Загрузка файла лицензии | — | ✓ |
| GET | /api/license/heartbeat | Heartbeat лицензии | — | ✓ |
| GET | /api/license/crl | Список отозванных лицензий | — | ✓ |
| POST | /api/license/recover | Восстановление лицензии | — | ✓ |
| GET | /api/subscription-status | Статус подписки | — | ✓ |
| GET | /admin | Admin GUI | ✓ | ✓ |
| POST | /admin/clear | Очистить индекс | — | ✓ |
| GET | /admin/learn | Анализ фидбека | — | ✓ |
| GET | /admin/index/stats | Статистика индекса | — | ✓ |
| POST | /admin/index/optimize | Оптимизация индекса | — | ✓ |
| GET | /admin/queries/top | Топ-10 запросов | — | ✓ |
| POST | /admin/cache/clear | Очистить кэш | — | ✓ |
| POST | /admin/config/update | Обновить конфигурацию на лету | ✓ | ✓ |
| GET | /admin/config | Текущая конфигурация | ✓ | ✓ |
| POST | /hierarchy | Иерархия (BOM) | — | ✓ |
| GET | /admin/analytics/stats | Статистика аналитики | — | ✓ |
| POST | /admin/analytics/reset | Сброс аналитики | — | ✓ |
| GET | /admin/analytics/tuning | Рекомендации по настройке | — | ✓ |
| GET | /admin/embedding/stats | Статистика эмбеддингов | — | ✓ |
| POST | /admin/embedding/reindex | Переиндексация векторов | — | ✓ |
| POST | /admin/embedding/reindex/background | Фоновая переиндексация | — | ✓ |
| POST | /admin/embedding/clear | Очистить векторное хранилище | — | ✓ |
| POST | /admin/embedding/optimize | Оптимизировать HNSW | — | ✓ |
| POST | /admin/embedding/cache/clear | Очистить кэш эмбеддингов | — | ✓ |
| GET | /admin/background/stats | Статистика фоновой очереди | — | ✓ |