Обзор API
HTTP API aihelpme.ru использует префикс /api/v1 и поддерживает аутентификацию JWT, API Key и Embed token; встроенные эндпоинты MCP Server используют отдельную аутентификацию по токену эндпоинта. Перед вызовом интерфейсов ресурсов нужно выбрать учётные данные в зависимости от типа клиента и следовать единым соглашениям об ответах, обработке ошибок, пагинации и потоковых событиях.
Base URL и префикс версии
- Все бизнес-API смонтированы под префиксом
/api/v1(r.Group("/api/v1")вrouter.go). - Проверка работоспособности:
GET /health(без аутентификации), возвращает{"status":"ok"}. - Swagger UI:
/swagger/index.htmlбэкенда, регистрируется только в режиме, отличном отrelease(GIN_MODE != release). Docker Compose по умолчанию используетrelease; шаги включения, порт бэкенда и диагностика пустой страницы см. в руководстве по разработке. - Особые пути помимо аутентификации:
GET|HEAD /r/:token(URL авторизации ресурса с коротким сроком действия),GET /files(прокси файлов после аутентификации),GET|HEAD /api/v1/files/presigned(URL с HMAC-подписью, без аутентификации),GET /api/v1/files/presigned-preview(диагностика Admin).
BASE=http://localhost:8080Способы аутентификации
Аутентификация единообразно обрабатывается middleware Auth из internal/middleware/auth.go, попытки выполняются в следующем порядке:
JWT Bearer (пользователи Web)
Authorization: Bearer <access_token>- Через
POST /api/v1/auth/login(или register / OIDC; нативные десктопные приложения используют auto-setup) получаютtokenиrefresh_token;POST /api/v1/auth/refreshвыдаёт новый token. - Необязательный заголовок
X-Tenant-ID: <tenant_id>: переключение целевого пространства за пределами указанного в JWT (нужно быть активным участником этого пространства или обладать свойством кросс-пространственного суперадминаCanAccessAllTenants). Некорректное значение или0сразу возвращает 400. - Если из JWT не удалось определить ни одного пространства и эндпоинт не входит в белый список «пространство не требуется» (например,
/auth/me,/me/invitationsи т. п.), возвращается 409{"code":"TENANT_REQUIRED"}.
API Key (машинный субъект)
X-API-Key: <api_key>- Key уровня пространства (workspace): создаётся в
POST /api/v1/tenants/:id/api-keys, привязан к одному пространству; указаниеX-Tenant-IDна другое пространство даёт 403. - Key уровня платформы (platform): создаётся в
POST /api/v1/system/admin/api-keys, обязательно должен нестиX-Tenant-IDдля выбора целевого пространства (кроме/system/admin/*,/tenants/all|search,POST /tenants), иначе возвращается 409TENANT_REQUIRED. - Модель авторизации (
internal/middleware/api_key_gate.go, по умолчанию запрет): каждый маршрут/api/v1должен явно объявлять политику API key; для маршрутов без объявления любой key получает 403. full_accesskey: полные права в пространстве (машинный эквивалент Owner).- Ограниченный (scoped) key: пропускается по capability и ограничен белым списком
knowledge_base_ids. Константы capability см. вinternal/types/tenant_api_key.go:retrieve,ingest,chat,read_agents,manage_kbs,manage_agents,message_history,manage_models,manage_mcp_services,manage_datasources,manage_channels,manage_vector_stores,manage_storage_backends,manage_web_search,run_evaluations,manage_members,manage_spaces,manage_tenant_settings; способности платформы:system_tenants_read/manage,system_settings_read/manage,system_runtime_read/manage,system_audit_read. - Субъект внешнего пользователя (необязательно, настраивается через
api-principal-configпространства): - Режим
direct:X-External-User-ID: <ID внешнего пользователя>(≤128 символов). - Режим
signed_token:X-External-User-Token: <HS256 JWT>, требуетaud=weknora,exp(время жизни ≤24h), claimtenant_id, совпадающий с целевым пространством, иsub— ID внешнего пользователя.
Embed publish token (анонимный встраиваемый клиент)
Публичные маршруты /api/v1/embed/:channel_id/* используют отдельный middleware EmbedAuth (internal/middleware/embed_auth.go):
Authorization: Embed <publish_token или session_token>POST /embed/:channel_id/exchangeобменивает publish token на краткосрочный session token; для операций уровня сессии также нуженX-Embed-Session: <sig>(подписанный дескриптор, возвращаемый при создании сессии).- Маршруты обратных вызовов IM (
/api/v1/im/callback/:channel_id) регистрируются до глобального middleware аутентификации и используют собственную проверку подписи каждой IM-платформы.
Токен эндпоинта MCP (встроенный MCP Server)
/mcp/:endpoint_id (без префикса /api/v1) — это MCP Streamable HTTP эндпоинт, публикуемый пространством наружу; проверяется internal/middleware/mcp_endpoint_auth.go:
Authorization: Bearer <endpoint_token>Токен отображается один раз при создании эндпоинта в разделе «Настройки → Публикация интеграций → MCP Server», его можно ротировать. Запросы выполняются от имени машинного субъекта пространства, которому принадлежит эндпоинт, а права ограничены отмеченными в эндпоинте инструментами и базами знаний. Интерфейс управления эндпоинтами — /api/v1/mcp-endpoints (чтение Viewer+, изменение Admin+, API Key требует manage_channels), использование см. в интеграции MCP.
Схема аутентификации
Модель ролей и прав (RBAC)
internal/middleware/rbac.go + internal/middleware/access.go:
| Роль | Описание |
|---|---|
owner | Владелец пространства: жизненный цикл пространства, API key, управление участниками |
admin | Администратор пространства: конфигурации уровня пространства — модели/инфраструктура/каналы и т. п. |
contributor | Участник с правами записи: может создавать KB/Agent, изменять созданные им ресурсы |
viewer | Участник только для чтения: чтение и использование сессий |
| SystemAdmin | Администратор уровня платформы (User.IsSystemAdmin), независим от ролей пространства, охраняет /system/admin/*, применяется всегда |
- В документации «Viewer+ / Contributor+ / Admin+ / Owner» обозначают минимальные требования к роли; «создатель OR Admin+» соответствует
RequireOwnershipOrRole(Contributor может изменять только созданные им KB/Agent/контент). - При
cfg.Tenant.EnableRBAC=falseстраж ролей только пишет в лог и не блокирует (rollout fail-open); на страж SystemAdmin этот переключатель не влияет. - Страж доступа уровня KB
KBAccessRead/Write(internal/middleware/kb_access.go): разбирает три типа доступа — «собственный / общий в организации / видимый через общий Agent» — и перезаписывает tenant в контексте запроса на пространство-владелец KB. - Субъект API key обходит (short-circuit) страж ролей JWT; его фактические права полностью определяются APIKeyGate (capability + белый список KB).
- Отклонённые запросы записываются в журнал аудита (
middleware.AuditServiceProvider, дедупликация по скользящему окну 1 минута).
Общий формат ответов и коды ошибок
Большинство handler'ов возвращают:
{ "success": true, "data": { ... } }Для списочных эндпоинтов распространены дополнительные поля: total, page, page_size. Несколько исключений: часть читающих эндпоинтов /system/admin/* возвращает исходные строки/массивы напрямую (без обёртки); /system/info и подобные используют {"code":0,"msg":"success","data":...}.
Ошибки единообразно выводятся через internal/middleware/error_handler.go (AppError из internal/errors/errors.go):
{ "success": false, "error": { "code": 1003, "message": "...", "details": null } }Уровень middleware (аутентификация/RBAC) возвращает напрямую {"error": "..."} (часть — со строковым "code", например TENANT_REQUIRED).
| Код ошибки | Значение | HTTP |
|---|---|---|
| 1000 | ErrBadRequest ошибка запроса | 400 |
| 1001 | ErrUnauthorized не аутентифицирован | 401 |
| 1002 | ErrForbidden нет прав | 403 |
| 1003 | ErrNotFound ресурс не существует | 404 |
| 1004 | ErrMethodNotAllowed | 405 |
| 1005 | ErrConflict конфликт | 409 |
| 1006 | ErrTooManyRequests ограничение частоты/квота | 429 |
| 1007 | ErrInternalServer внутренняя ошибка | 500 |
| 1008 | ErrServiceUnavailable временно недоступен | 503 |
| 1009 | ErrTimeout тайм-аут | — |
| 1010 | ErrValidation ошибка валидации параметров | 400 |
| 2000-2005 | Пространство: не существует/уже существует/отключено/имя обязательно/недопустимый статус/самостоятельное создание запрещено | 404/409/403/… |
| 2100-2103 | Agent: отсутствует модель рассуждений/отсутствуют разрешённые инструменты/недопустимое число итераций (1-20)/недопустимая температура (0-2) | 400 |
| 2200-2201 | Недопустимая привязка VectorStore / сейчас недоступен | 400 |
Есть также ошибки без кода: types.StorageQuotaExceededError (превышена квота хранилища), types.DuplicateKnowledgeError (дублирующийся файл/URL; интерфейс загрузки возвращает 409, а data содержит уже существующий Knowledge).
Соглашения о пагинации
internal/handler/list_pagination.go:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
page | int | Нет | Номер страницы, по умолчанию 1, должен быть ≥1 |
page_size | int | Нет | Число записей на странице, по умолчанию 20, диапазон 1-100 |
Значение вне диапазона или недопустимое возвращает ошибку валидации (code 1010). Ответы списков содержат total/page/page_size. Часть эндпоинтов использует курсорную пагинацию: журнал аудита (after_id+limit, ответ содержит next_cursor), задачи среды выполнения системы (cursor+page_size, ответ содержит next_cursor/has_more), Wiki index/log (cursor+limit).
Протокол потоковых эндпоинтов (SSE)
Чат-эндпоинты (POST /api/v1/knowledge-chat/:session_id, POST /api/v1/agent-chat/:session_id, GET /api/v1/sessions/continue-stream/:session_id, а также соответствующие маршруты на стороне embed) возвращают Server-Sent Events:
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
X-Accel-Buffering: noКаждое событие — event: message, data: — JSON types.StreamResponse:
| Поле | Тип | Описание |
|---|---|---|
id | string | ID запроса |
response_type | string | answer / references / thinking / tool_call / tool_result / command_output / reflection / session_title / agent_query / artifacts_pending / memory_recalled / user_message_injected / context_compacted / tool_approval_required / tool_approval_resolved / mcp_oauth_required / mcp_oauth_resolved / error / complete; поток записи установки навыков дополнительно содержит install_prompt / install_output |
content | string | Инкрементальный текст |
done | bool | Завершено ли событие этого типа |
knowledge_references | []SearchResult | Ссылки, передаваемые событием references |
tool_calls | []LLMToolCall | События вызова инструментов |
data | object | Дополнительные метаданные события (например, success результата инструмента, truncated ответа) |
session_id / assistant_message_id | string | Передаётся событием agent_query |
usage | TokenUsage | prompt_tokens/completion_tokens/total_tokens/cache_* |
finish_reason | string | Причина завершения |
source_locators в SearchResult (результаты knowledge_references и эндпоинтов поиска) — это позиция данного блока в исходном файле, по ней можно найти ссылку в исходном тексте (для документов, добавленных до запуска этой функции, пусто):
| Поле | Применимый type | Описание |
|---|---|---|
type | — | pdf / docx / slide / sheet / text / time / section |
page, bbox | pdf | Номер страницы (с 1); bbox — [x0,y0,x1,y1], пропорции относительно ширины и высоты страницы, начало координат в левом верхнем углу страницы, может отсутствовать |
block | docx | Номер абзаца или таблицы в тексте (с 1) |
slide | slide | Номер слайда (с 1) |
sheet, row_start, row_end | sheet | Имя листа (для CSV пусто) и номера строк (с 1, как в Excel) |
start, end | text | Диапазон символов текста исходного файла (кодовые точки Unicode) |
start_ms, end_ms | time | Временной диапазон аудио (миллисекунды) |
section, title | section | Номер элемента в spine EPUB (с 1) и заголовок раздела |
quote | все | Цитируемый текст, не более 300 символов |
Числовые поля со значением 0 опускаются. Объединённый результат поиска несёт объединение позиций объединённых блоков.
Поток завершается response_type:"complete" (done:true); при ошибке завершается response_type:"error" (done:true). Сбой выполнения инструмента возвращается как tool_result (data.success=false), а error означает только провал всего раунда; когда ответ усечён из-за лимита вывода, событие answer несёт data.truncated=true. continue-stream использует семантику возобновления «воспроизведение + опрос каждые 100ms для догона инкремента» (?message_id= обязателен).
Формы ссылок на файлы (resource_urls)
Изображения/вложения, на которые ссылаются ответы и результаты поиска, по умолчанию возвращаются как внутренний дескриптор resource://<handle>; чтобы получить содержимое, клиент должен ещё раз обратиться к прокси /files с аутентификацией. Если стороннее приложение хочет получить ссылку «готовую к отрисовке сразу», можно переключиться в режим прямых ссылок:
| Область действия | Использование |
|---|---|
| Единичный запрос | Добавить к URL ?resource_urls=public |
| Всё развёртывание | Переменная окружения RESOURCE_URL_MODE=public |
Допустимы только значения handle (по умолчанию) и public; любое другое значение возвращает 400. Параметр единичного запроса имеет приоритет над переменной окружения, поэтому после установки значения по умолчанию public для всего развёртывания всё ещё можно отдельно откатиться через ?resource_urls=handle.
Эндпоинты, поддерживающие этот параметр: POST /knowledge-chat/{session_id}, POST /agent-chat/{session_id}, GET /sessions/continue-stream/{session_id}, GET /messages/{session_id}/load, POST /knowledge-search, POST /knowledge-bases/{id}/hybrid-search (совместим с GET). Переписывание охватывает текст ответа, content / image_info результатов поиска, knowledge_references, шаги выполнения Agent и результаты инструментов, а также вложения-изображения в сообщениях; ссылки в потоковом ответе, разорванные на границе chunk, сначала буферизуются, а затем переписываются, поэтому клиент всегда получает полную ссылку.
Несколько вещей, которые нужно знать перед использованием:
- Требуется возможность внешних ссылок: прямая ссылка создаётся предподписью бэкенда хранилища либо через
APP_EXTERNAL_URL+/r/<token>. Если нет ни того ни другого (например, локальное хранилище и не заданAPP_EXTERNAL_URL), ссылка остаётся в исходном видеresource://, и клиент по-прежнему может откатиться к/files; - Прямая ссылка анонимно доступна на чтение в течение ограниченного времени (grant, выдаваемый платформой, — 2 часа; предподпись MinIO — 24 часа), любой, кто получил ссылку, сможет прочитать её до истечения срока; не записывайте её в журналы и не пересылайте тем, кому не следует видеть;
- Встраиваемые каналы не поддерживаются: эндпоинты под
/api/v1/embed/...принудительно используютhandle, изображения для гостей продолжают идти через аутентифицирующий прокси уровня канала; - API Key, ограниченный определёнными базами знаний, при
publicвернёт 403: такому Key и так запрещён доступ к прокси/files, а получение анонимной прямой ссылки означало бы обход этого же ограничения; - Прямая ссылка на один и тот же файл переиспользуется в пределах срока действия, повторные запросы не выдают учётные данные заново, поэтому клиентский кэш и кэш CDN срабатывают.
Какую форму получает каждый канал (Web / IM / встраиваемый виджет / API) и как диагностировать случаи, когда изображения не загружаются, см. в внешний доступ к изображениям и файлам.
Как выбрать эндпоинт поиска
Наружу доступны два эндпоинта поиска, оба требуют у API Key права retrieve (или full) и оба возвращают список SearchResult.
По умолчанию используйте POST /knowledge-search. Он проходит тот же конвейер поиска, что и режим «вопрос-ответ» в продукте (recall → rerank → объединение → усечение), и возвращает именно те фрагменты, которые используются в режиме «вопрос-ответ» на странице. POST /knowledge-bases/{id}/hybrid-search — более низкоуровневый эндпоинт recall: по умолчанию не выполняет rerank, а оценка — это оценка recall; подходит для сценариев, где нужно видеть или контролировать исходные результаты recall.
Выбор по сценарию
| Я хочу… | Что использовать | Ключевые моменты тела запроса |
|---|---|---|
| Получить результаты поиска для своего RAG / агента, чтобы ранжирование совпадало с режимом «вопрос-ответ» на странице | knowledge-search | query + knowledge_base_ids, остальное не заполнять |
| Искать одновременно по нескольким базам знаний с разными embedding-моделями | knowledge-search | knowledge_base_ids |
| Искать только в некоторых документах или тегах | knowledge-search | knowledge_ids / tag_ids; при поиске только по указанным документам не передавайте также их knowledge_base_ids — берётся объединение |
| Настроить число результатов или порог recall, но всё ещё с rerank | knowledge-search | match_count, vector_threshold, keyword_threshold |
| Сменить rerank-модель или изменить порог rerank | knowledge-search | rerank.model_id, rerank.threshold |
| Без rerank, сразу получить результаты recall | knowledge-search или hybrid-search | Первый передаёт "rerank":{"enabled":false}; второй не передаёт rerank |
| Результат пуст, хочется узнать причину | knowledge-search | Смотреть meta.rerank.outcome в ответе |
| Вектор запроса уже вычислен самостоятельно | hybrid-search | query_embedding + disable_keywords_match: true |
| Оценка качества recall: фиксированная база, фиксированные параметры, смотрим исходную оценку recall | hybrid-search | Не передавать rerank |
| На основе предыдущей оценки дополнительно сравнить эффект с добавлением rerank | hybrid-search | Добавить rerank к тому же запросу |
| Родительские и соседние блоки должны возвращаться отдельными строками результатов, а не вклеиваться в текст | hybrid-search | Так по умолчанию, skip_context_enrichment: true отключает |
Различия между ними
knowledge-search | hybrid-search | |
|---|---|---|
| rerank | Включён по умолчанию (используется конфигурация пространства); объект rerank может переопределить или отключить | Выключен по умолчанию; включается только при передаче объекта rerank |
| Несколько баз знаний | Можно; embedding-модели могут различаться | knowledge_base_ids можно, но embedding-модели должны совпадать, и {id} из пути также должен входить в них |
| Предвычисленный вектор | Не поддерживается | query_embedding |
| Контекстные блоки | Вклеиваются в content результата | Возвращаются отдельными строками результатов |
Если match_count опущен | rerank_top_k из конфигурации пространства (по умолчанию 10) | 50 |
meta.rerank | Возвращается всегда | Возвращается только при наличии rerank |
Параметры recall обоих эндпоинтов (vector_threshold, keyword_threshold, match_count, disable_keywords_match, disable_vector_match) и объект rerank имеют одинаковый смысл; параметры, опущенные в knowledge-search, берутся из конфигурации поиска пространства (GET /tenants/kv/retrieval-config).
Объект rerank
Поле rerank у обоих эндпоинтов имеет одинаковую структуру:
| Поле | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
enabled | bool | true | Установка false отключает rerank, результаты сохраняют порядок recall |
model_id | string | см. ниже | ID rerank-модели (модель с type = Rerank в GET /models). Если ID не существует, не активирован или это не rerank-модель, возвращается 400, без незаметной подмены на другую модель |
top_k | int | число результатов эндпоинта | Сколько максимум оставить после rerank; отрицательное число или более 200 возвращает 400 |
threshold | float | rerank_threshold из конфигурации поиска пространства (при отсутствии 0.2) | Нижняя граница оценки модели; 0 и отрицательные значения допустимы |
Если model_id не передан, последовательно используется: rerank_model_id из конфигурации поиска пространства → первая rerank-модель в пространстве. Если ни того ни другого нет, rerank не выполняется, результаты возвращаются в порядке recall, а meta.rerank.outcome равен no_model.
Процесс rerank использует ту же реализацию, что и цепочка «вопрос-ответ» и инструмент search_knowledge интеллектуального рассуждения (internal/reranking):
- Текст, отправляемый модели на оценку = заголовок документа + текст блока без разметки Markdown + описание изображений и OCR-текст + сгенерированные вопросы. К записям FAQ заголовок не добавляется. Если для модели настроены лимиты длины одного документа или одного запроса (
max_document_chars/max_request_chars), слишком длинный текст обрезается с конца до лимита перед отправкой, причём первыми отрезаются дополнительный текст изображений и сгенерированные вопросы; из-за одного слишком длинного текста вся партия не провалится. - Оставляются результаты с оценкой не ниже
threshold. Если не осталось ни одного, аthresholdвыше 0.3, порог снижается доmax(threshold×0.7, 0.3)и фильтрация повторяется. Если и тогда ничего нет: при максимальной оценке не ниже 0.15 остаётся только эта одна запись, иначе возвращается пустой список. - Оценка ранжирования =
0.6×оценка модели + 0.3×оценка recall + 0.1×вес источника; вmetadataрезультата присутствуютmodel_scoreиbase_score. - С помощью MMR (λ=0.7) из них выбираются
top_kзаписей, что снижает дублирование контента.
Попадания по вектору изображения также можно переранжировать по оригиналу: модель rerank должна объявлять и реализовывать приём изображений, обычный текстовый rerank по-прежнему использует текстовую информацию; визуальные диалоговые модели могут принимать сохранённые изображения попаданий. Правила сохранения изображений-кандидатов и контекста см. в процессе RAG-поиска.
Когда в hybrid-search включён rerank, глубина recall как минимум равна top_k, пул кандидатов — блоки, занимающие первые max(top_k, 50) мест после слияния, поэтому даже при очень малом match_count модели хватает кандидатов для выбора.
Если загрузка rerank-модели не удалась или вызов завершился ошибкой, запрос не падает, а результаты возвращаются в порядке recall, а причина указывается в meta.rerank.
Диагностика meta.rerank
Ответ knowledge-search всегда содержит meta.rerank; hybrid-search содержит его только тогда, когда в запросе был объект rerank.
{
"success": true,
"data": [],
"meta": {
"rerank": {
"applied": true,
"outcome": "all_below_threshold",
"model_id": "rr-1",
"model_source": "tenant",
"threshold": 0.3,
"effective_threshold": 0.3,
"top_score": 0.08,
"candidate_count": 24,
"result_count": 0
}
}
}| Поле | Описание |
|---|---|
applied | Определили ли оценки rerank порядок возврата |
outcome | см. таблицу ниже |
model_id / model_source | Используемая модель и откуда она взялась: request (указана в запросе), tenant (конфигурация пространства), auto (автоматический выбор) |
threshold / effective_threshold | Запрошенный порог и фактически использованный после деградации |
top_score | Наибольшая оценка модели среди кандидатов |
candidate_count / result_count | Число кандидатов, отправленных на rerank / число возвращённых записей |
error | Сообщение об ошибке при model_error, model_unavailable |
outcome | Значение |
|---|---|
ok | Есть результаты, достигшие порога |
threshold_degraded | При исходном пороге результатов не было, появились после снижения порога |
fallback_top1 | Ни один порог не пройден, оставлена только запись с наибольшей оценкой |
all_below_threshold | Модель считает, что ни один кандидат не релевантен, результат пуст. Можно переформулировать вопрос или снизить rerank.threshold |
model_error | Вызов модели не удался, возврат в порядке recall |
model_unavailable | Загрузка модели не удалась (проблемы конфигурации: учётные данные, адрес и т. п.), возврат в порядке recall |
no_model | В пространстве нет rerank-модели, возврат в порядке recall |
disabled | rerank.enabled в запросе равен false |
no_candidates | На этапе recall нет результатов |
Ограничение частоты
| Аспект | Ограничение | Источник |
|---|---|---|
Эндпоинты публичных ссылок общего доступа (/auth/invitations/lookup, /auth/register-by-invite) | 30 раз/минуту на IP (оба эндпоинта делят лимит), при превышении 429 (code 1006) | internal/middleware/auth_public_ratelimit.go |
| Публичные маршруты Embed | На (channel, IP) rate_limit_per_minute (по умолчанию 30)/минуту; на уровне channel rate_limit_per_minute*20 (нижняя граница 120)/минуту; на уровне channel rate_limit_per_day (по умолчанию 10000)/сутки; при превышении 429 | internal/middleware/embed_auth.go |
| Доверие обратному прокси | Доверять X-Forwarded-For только от WEKNORA_TRUSTED_PROXIES (по умолчанию loopback + внутренние подсети) для предотвращения подделки IP в обход ограничения частоты | router.go trustedProxies() |
У остальных бизнес-эндпоинтов глобального ограничения частоты нет; отказы по квоте, например при самостоятельном создании пространства, также используют 429 (code 1006).
Навигация по группам API
| Группа | Документ | Основной префикс |
|---|---|---|
| Аутентификация и пользователи | 02-api-auth.md | /auth, /me/invitations |
| Тенанты (пространства) и участники | 02-api-tenant.md | /tenants |
| Организации и общий доступ | 02-api-org.md | /organizations, /shared-*, /knowledge-bases/:id/shares, /agents/:id/shares |
| Базы знаний и знания | 02-api-knowledge.md | /knowledge-bases, /knowledge, папки базы знаний, галерея, /image-attrs/schema |
| Блоки и теги | 02-api-chunks.md | /chunks, /knowledge-bases/:id/tags, /chunker/preview |
| FAQ и Wiki | 02-api-faq-wiki.md | /knowledge-bases/:id/faq, /faq, /knowledgebase/:kb_id/wiki, /wiki-search |
| Сессии, сообщения и чат | 02-api-chat.md | /sessions, /messages, /knowledge-chat, /agent-chat, /knowledge-search |
| Модели и инициализация | 02-api-model-system.md | /models, /initialization, /evaluation, /weknoracloud |
| Система и управление платформой | 02-api-system.md | /system, /system/admin |
| Инфраструктура и источники данных | 02-api-infra.md | /vector-stores, /storage-backends, /web-search-providers, /datasource |
| Agent и MCP | 02-api-agent-mcp.md | /agents, /mcp-services, /agent, /user/favorites |
| Встроенный MCP Server | интеграция MCP | /mcp-endpoints, /mcp/:endpoint_id |
| Локальный браузер | локальный браузер | /me/browser, /local-browser |
| Песочница, навыки и личные переменные | 02-api-sandbox-skills.md | /sandbox-configs, /skills, /me/env-vars |
| Долговременная память | 02-api-memory.md | /memory, /tenants/kv/memory-config |
| IM, Embed и файловые сервисы | 02-api-channels.md | /im, /im-channels, /wechat, /embed-channels, /embed, /files, /r/:token |
Новые конфигурационные и личные эндпоинты см. в песочница, навыки и личные переменные, долговременная память; список и загрузку сгенерированных файлов см. в сессии и чат.
