Документация для разработчиков

Документация Context Assistant

Подключите ассистента с помощью Claude, установите плагин WordPress или используйте SDK и API.

Подключение с ClaudeБыстрый старт WordPressРуководства по SDKRemote Tools

Подключение с Claude

Подключение, наполнение базы знаний или план её обновления - выберите нужное задание для Claude Code.

Задание для Claude

Выберите задачу и передайте промпт в Claude Code в проекте сайта. В нём есть API-контракты и порядок проверки результата.

  1. Скопируйте промпт
  2. Вставьте в Claude Code
  3. Проверьте предложенный результат

Подключить чат одним скриптом с публичным ключом. Сохранить существующие приватные подключения.

В кабинете Assistant ID и адрес сайта подставятся автоматически. Секретный ключ задаётся только на вашем сервере. Нужен доступ к Claude Code.

Перед запуском замените YOUR_ASSISTANT_ID и https://your-site.example своими значениями или скопируйте заполненный промпт из кабинета. Введите команду claude в каталоге проекта и вставьте задание. Как начать работу с Claude Code.

При подключении проверьте реальный ответ чата. Для наполнения и обновления базы знаний Claude сначала составит план. Ответьте Начать работу, чтобы подтвердить его и перейти к реализации. Включение регулярной синхронизации согласуется отдельно после проверки. Использование Claude не меняет модель, которой отвечает ваш ассистент.

Контракты API (Markdown) · Полная текстовая инструкция для Claude · Указатель документации для ИИ. Claude найдёт здесь описание API и готовые примеры подключения.

WordPress · около 10 минут

Подключение к WordPress

Установите готовый плагин, подключите аккаунт и проверьте ассистента — писать код не нужно.

01
Доступ администратораВозможность устанавливать плагины WordPress
02
Аккаунт Context AssistantРегистрация и подтверждённый email
03
HTTPS-адрес сайтаТочный публичный URL без пути к странице
  1. Установите плагин

    В админке WordPress откройте Плагины → Добавить плагин, найдите Context Assistant, установите и активируйте его. Страница плагина в каталоге: wordpress.org/plugins/context-assistant.

  2. Создайте аккаунт

    Зарегистрируйтесь в Context Assistant и подтвердите email.

  3. Добавьте сайт

    В мастере Context Assistant задайте имя ассистента, выберите WordPress и укажите точный адрес сайта, например https://shop.example.com.

  4. Сохраните данные подключения

    Сохраните Assistant ID, публичный ключ ca_pk_… и секрет синхронизации ca_sk_… из мастера. Секрет показывается один раз. API URL в плагине уже заполнен.

  5. Подключите плагин

    Вернитесь в мастер WordPress, вставьте оба ключа и Assistant ID и нажмите Save and check connection.

  6. Настройте виджет

    Выберите заголовок, страницы показа и доступ для гостей, затем нажмите Save and finish.

  7. Проверьте результат

    Откройте сайт и задайте ассистенту тестовый вопрос. Синхронизацию базы знаний, действия WordPress/WooCommerce и сбор обращений можно включить позже в Advanced settings.

Подключение готово

Виджет открывается на выбранных страницах и отвечает на тестовый вопрос.

Открыть аккаунт
Другие платформы

Выберите способ интеграции

Поручите подключение Claude, добавьте готовый виджет или создайте свой интерфейс через API.

Встраивание через скрипт

В мастере настройки добавьте разрешённые адреса сайта и получите оба ключа. Замените YOUR_PUBLIC_KEY публичным ключом ca_pk_… и добавьте скрипт один раз в общий шаблон страниц.

<script async src="https://contextassistant.io/assets/embed.js"
  data-public-key="YOUR_PUBLIC_KEY"
  referrerpolicy="no-referrer"></script>

Скрипт сам подключает и запускает виджет. Второй вызов mount(), локальная копия SDK и обработчик токенов на вашем сервере не нужны. CA создаёт и продлевает гостевые сессии. Секрет синхронизации в код страницы не добавляйте.

Выберите Lite/Advanced и приветствие в кабинете. При загрузке страницы виджет получает совместимые обновления по тому же адресу. Полный HTML-пример со сведениями об открытой странице.

Для управления используйте window.ContextAssistantWidget или event.detail.widget события context-assistant:ready: open(), close(), setContext(), clearContext(), destroy(). Передавайте только согласованные сведения о странице, не весь DOM и не личные данные.

Дополнительно: отдельно предоставленный embed SDK

Этот пакет не опубликован в публичном npm и не нужен для скрипта выше. При наличии доступа к пакету виджет можно создать вручную:

import { mount } from '@context-assistant/embed-sdk';

const widget = mount({
  apiUrl: 'https://api.contextassistant.io',
  publicKey: 'YOUR_PUBLIC_KEY',
  title: 'Store Consultant',
  appearance: {
    variant: 'refined',
    theme: 'system',
    welcomeMessage: 'How can I help with this product?',
    starterPrompts: ['Is it in stock?', 'Compare the available options'],
    privacyUrl: '/privacy/',
  },
});

widget.setContext({
  page: { type: 'product', id: 184 },
});

Виджет для React

Используйте тот же виджет с нашего сайта. Если чат нужен во всём приложении, добавьте скрипт выше один раз в общий шаблон приложения. Устанавливать пакеты Context Assistant или добавлять серверный маршрут токенов не нужно.

Если виджет должен появляться и удаляться вместе с компонентом, скопируйте react-widget.tsx в проект и явно передайте публичный ключ:

<ContextAssistantWidget
  publicKey="YOUR_PUBLIC_KEY"
  page={{ type: "product", id: 184 }}
/>

Выберите один способ: автоматический скрипт или этот компонент. Не добавляйте оба. Компонент загружает тот же файл, создаёт виджет в браузере и вызывает destroy() при размонтировании. Меняйте page при переходе к другому товару. В этом совместимом примере отсутствие publicKey включает приватную серверную схему, поэтому для публичного чата обязательно укажите ключ.

Дополнительно: отдельно предоставленный React SDK

@context-assistant/react не опубликован в публичном npm. Этот вариант нужен только при наличии отдельно предоставленного пакета. Провайдер принимает публичный ключ; useAssistant() позволяет сделать свой интерфейс. Версию пакета обновляют в проекте, а не через общий скрипт.

import { ContextAssistantProvider, Assistant } from '@context-assistant/react';


export function App() {
  return (
    <ContextAssistantProvider apiUrl="https://api.contextassistant.io" publicKey="YOUR_PUBLIC_KEY">
      <Assistant
        title="Store Consultant"
        appearance={{
          variant: 'refined',
          theme: 'system',
          welcomeMessage: 'How can I help with this product?',
          starterPrompts: ['Is it in stock?', 'Compare the available options'],
          privacyUrl: '/privacy/',
        }}
      />
    </ContextAssistantProvider>
  );
}

JavaScript API и SDK

Для готового чата достаточно скрипта выше. API нужен, если вы создаёте свой интерфейс: обменяйте публичный ключ через POST /v1/embed/public-token, затем обращайтесь к Conversations API с временным Bearer-токеном. Обработчик токенов на вашем сервере для публичного чата не нужен.

В собственном API-клиенте нужно учитывать срок сессии, сохранять visitorToken для продления, обрабатывать SSE-ответы и соблюдать Retry-After. Готовый виджет делает это сам. Публичный ключ не загружает знания: для синхронизации нужен отдельный секрет на сервере.

Дополнительно: отдельно предоставленный JavaScript SDK

Клиент @context-assistant/js-sdk не опубликован в публичном npm. Если он уже предоставлен вашему проекту, он также принимает publicKey:

import { ConversationSession } from '@context-assistant/js-sdk';

const session = new ConversationSession({
  apiUrl: 'https://api.contextassistant.io',
  publicKey: 'YOUR_PUBLIC_KEY',
});

await session.send('What pairs well with this processor?', {
  onToken: (delta) => console.log(delta),
  onDone: (event) => console.log('\n[done]', event.message),
});

Личные заказы, закрытые документы и Remote Tools требуют серверной авторизации. Существующие приватные подключения сохраняйте; не заменяйте их ключи публичным.

Сессия публичного чата

POST /v1/embed/public-token. Без Authorization. Используется заголовок Origin браузера, не поле тела. Нужен действующий ca_pk_, явно выданный в мастере настройки, и точный разрешённый origin. Пустой список запрещает доступ.

{
  "publicKey": "YOUR_PUBLIC_KEY",
  "visitorToken": "OPTIONAL_PREVIOUS_VISITOR_TOKEN"
}

200, Cache-Control: no-store:

{
  "token": "SHORT_LIVED_ACCESS_JWT",
  "expiresAt": "2026-09-14T12:15:00Z",
  "visitorToken": "SIGNED_GUEST_RENEWAL_CREDENTIAL"
}

При первом запросе пропустите visitorToken; для продления того же гостя передайте значение из ответа. Оно истекает через 30 дней без продления и не принимается как Bearer чата. Для чата, config и context используйте token в Bearer с тем же Origin. SDK управляет кешированием, единым запросом обновления и хранением гостевой сессии. Внешний user ID не передавайте: его генерирует сервер. Публичный доступ не даёт прав управления и Remote Tools. Ошибки: 400 invalid_input; 401 visitor_expired; 403 origin_not_allowed/public_access_denied; 429 rate_limited; 503 not_configured. Бесконечные повторы недопустимы. Отзыв ключа и изменение origins учитываются на последующих запросах.

Выданный визардом ключ синхронизации имеет knowledge:read, knowledge:write и assistants:read в своём рабочем пространстве, без embed:token. Храните CONTEXT_ASSISTANT_SYNC_KEY только в серверной .env; добавьте .env в .gitignore. ca_pk_ не позволяет загружать знания. Существующие секретные ключи и POST /v1/embed/token не меняются.

HTTP API: авторизация и правила запросов

Все контракты одним файлом (Markdown)

Базовый адрес REST API: https://api.contextassistant.io/v1. Отправляйте JSON с Content-Type: application/json. Идентификаторы в примерах нужно заменить своими. В настройках виджета адрес указывается без /v1: SDK добавляет этот префикс сам.

АвторизацияДля чего нужна
Authorization: Bearer <server API key>Серверные запросы. Ключ хранится в окружении сервера, не в браузере и не в чате с ИИ. Доступ ограничен рабочим пространством ключа.
Authorization: Bearer <embed token>Чат в браузере, диалоги и проверка сведений о странице. Временный токен получается через бэкенд вашего сайта.
Право серверного ключаРазрешённые операции
embed:tokenВыдача токенов для браузера
assistants:readЧтение настроек ассистента и получение UUID по Public ID
knowledge:readСписки источников, документов и корзины
knowledge:writeСоздание источников, загрузка, обновление, удаление и восстановление документов. Для импорта используйте отдельный ключ.

Права ключей не взаимозаменяемы: embed:token не позволяет загружать документы. Маршруты /v1/cabinet/* используют сессию кабинета и не предназначены для серверной интеграции. /api/core и /api/embed-token относятся к нашему сайту.

curl --fail-with-body "https://api.contextassistant.io/v1/assistants" \
  -H "Authorization: Bearer ${CONTEXT_ASSISTANT_SYNC_KEY}"

Команда использует ключ, уже заданный в окружении сервера. Не вставляйте его значение в промпт или исходники. Запросы записи применяются сразу: предпросмотр и подтверждение реализуются в вашем импорте или интерфейсе. Параметра dry-run у API нет.

Как получить идентификаторы ассистента

GET /v1/assistants -> 200 { "items": [...] }. GET /v1/assistants/{publicId} -> 200 с объектом одного ассистента. Оба запроса требуют assistants:read; в пути используется Public ID, не UUID.

{
  "items": [
    {
      "id": "11111111-1111-4111-8111-111111111111",
      "workspaceId": "44444444-4444-4444-8444-444444444444",
      "publicId": "asst_example",
      "name": "Store assistant",
      "profile": "general",
      "instructions": "",
      "modelConfig": {},
      "toolPolicy": {},
      "allowedOrigins": [
        "https://shop.example"
      ],
      "createdAt": "2026-09-10T12:00:00Z",
      "updatedAt": "2026-09-10T12:00:00Z"
    }
  ]
}
ИдентификаторГде используется
publicId / asst_...assistantId при выдаче токена; точное совпадение при выборе ассистента
id / UUIDassistantId при создании источника знаний или регистрации подключения бэкенда
sourceId / UUIDОбъединяет документы конкретного источника
externalId / stringВаш стабильный идентификатор документа внутри источника
agentНеобязательный профиль поведения, а не один из перечисленных ID. В обычном подключении его не передавайте.

POST /v1/embed/token

Серверный ключ с embed:token. JSON-тело до 4 KiB. Обязательный assistantId - Public ID. В origin укажите настроенные схему, домен и порт из разрешённых адресов ассистента. user.externalId берите из проверенной серверной сессии или подписанной cookie конкретного гостя; user.name необязателен.

{
  "assistantId": "asst_example",
  "origin": "https://shop.example",
  "user": {
    "externalId": "member_42",
    "name": "Alex"
  }
}

Ответ 200:

{
  "token": "<temporary JWT>",
  "expiresAt": "2026-09-10T12:15:00Z"
}

Ориентируйтесь на expiresAt при обновлении токена. Верните браузеру только эти два поля и Cache-Control: no-store. Токен определяет ассистента и посетителя. Разрешённый origin не подтверждает вход пользователя; публичному обработчику токенов нужна защита от злоупотреблений. Не объединяйте гостей под одним ID.

Диалоги и потоковые ответы

Все маршруты ниже требуют embed-токен. Начните с POST /v1/conversations, тело { "title": "Delivery question" } (title необязателен). Ответ 201:

{
  "id": "55555555-5555-4555-8555-555555555555",
  "assistantId": "asst_example",
  "title": "Delivery question",
  "createdAt": "2026-09-10T12:00:00Z",
  "updatedAt": "2026-09-10T12:00:00Z"
}

Отправьте POST /v1/conversations/{id}/messages. Обязательное поле content - непустая строка. Необязательный context содержит небольшие структурированные сведения о странице; не весь DOM и не персональные данные. Лимит JSON-тела - 64 KiB. Поле agent пропустите: Public ID в этом поле вызывает unknown agent profile.

{
  "content": "How long does delivery take?",
  "context": {
    "page": {
      "type": "product",
      "id": 184
    }
  }
}
curl -N --fail-with-body "https://api.contextassistant.io/v1/conversations/${CONVERSATION_ID}/messages" \
  -H "Authorization: Bearer ${EMBED_TOKEN}" \
  -H "Content-Type: application/json" \
  --data-binary @message.json

Сохраните JSON выше в message.json в UTF-8. Успешный ответ - HTTP 200 text/event-stream, а не один JSON-документ. Собирайте события SSE независимо от границ сетевых фрагментов. Пример:

event: token
data: {"delta":"Delivery takes 2-4 business days."}

event: done
data: {"conversationId":"55555555-5555-4555-8555-555555555555","userMessageId":"user-message-uuid","messageId":"reply-message-uuid","message":"Delivery takes 2-4 business days.","model":"model-id","agent":"general","title":"Delivery question"}

События: token содержит delta; done - итоговый ответ; pending_action - предложенное действие; error - code/error и завершение неудачного потока. В done также могут быть suggestions и references. HTTP 200 сам по себе не подтверждает завершённый ответ. Повторная отправка может создать второе сообщение: после обрыва сначала проверьте историю.

Метод и путьЗапрос / ответ
GET /v1/conversationslimit/cursor; 200 items с id, title, createdAt, updatedAt и необязательный nextCursor
GET /v1/conversations/{id}200 объект диалога
GET /v1/conversations/{id}/messageslimit/cursor; 200 items с id, conversationId, role, content, createdAt; возможны toolCalls/usage и nextCursor
POST /v1/conversations/{id}/confirmcallId, tool, arguments и confirmed из реального предложенного действия; context необязателен. 200 SSE. Сначала предпросмотр и согласие пользователя, для удаления - второе подтверждение.
DELETE /v1/conversations/{id}204 без тела. Удаляет диалог и сообщения безвозвратно; маршрута восстановления нет.

Для постраничных списков limit по умолчанию равен 20, максимум - 100; неверный/неположительный limit или неверный cursor дают 400. Передавайте nextCursor с URL-кодированием, пока он не исчезнет из ответа. Сообщения идут от старых к новым, диалоги - по последней активности. Перед удалением диалога запросите подтверждение.

POST /v1/context/validate

Embed-токен. Необязательная предварительная проверка сведений о странице; чат проверяет их повторно. JSON-тело до 16 KiB, очищенный context до 4096 байт, глубина вложенности до 6. Разрешённые поля верхнего уровня: application, workspaceId, page, selection, entity, site. Остальные поля удаляются, строки, похожие на секреты, скрываются. Эти сведения не дают прав доступа и не меняют рабочее пространство из токена.

{
  "context": {
    "page": {
      "type": "product",
      "id": 184
    }
  }
}

Ответ 200; если данные изменены при очистке, также могут присутствовать массивы droppedFields и redactedPaths:

{
  "context": {
    "page": {
      "type": "product",
      "id": 184
    }
  }
}

Коды 400: invalid_input при неверном JSON-теле; context_not_an_object, context_too_large, context_too_deep или invalid_context при недопустимом context. Этот запрос не добавляет материалы в базу знаний.

API базы знаний: создание источника

POST /v1/knowledge/sources, серверный ключ с knowledge:write. Обязательны assistantId (внутренний UUID) и непустой name. type необязателен, по умолчанию manual; это только метка, она не запускает обход сайта или расписание. Лимит тела - 256 KiB.

{
  "assistantId": "11111111-1111-4111-8111-111111111111",
  "name": "Store help",
  "type": "manual"
}

Ответ 201. Сохраните id как sourceId и его связь с ассистентом в своих настройках:

{
  "id": "22222222-2222-4222-8222-222222222222",
  "name": "Store help",
  "type": "manual",
  "createdAt": "2026-09-10T12:00:00Z"
}

GET /v1/knowledge/sources требует knowledge:read и возвращает 200 { "items": [...] } для рабочего пространства, без пагинации. Объекты источников не содержат assistantId. Не определяйте владельца по имени и не создавайте новый источник при каждом импорте.

POST /v1/knowledge/documents

Серверный ключ с knowledge:write. Создание или обновление одного документа:

{
  "sourceId": "22222222-2222-4222-8222-222222222222",
  "externalId": "help:delivery:en",
  "title": "Delivery",
  "contentType": "markdown",
  "content": "# Delivery\nDelivery takes 2-4 business days."
}
ПолеКонтракт
sourceIdОбязательный UUID существующего источника в этом рабочем пространстве
externalIdНеобязательная строка до 512 байт UTF-8. Для импорта и синхронизации всегда задавайте её.
titleНеобязательная строка, пробелы по краям удаляются
cardНеобязательный объект карточки: title (1–120 символов, по умолчанию заголовок документа), url (HTTP/S), image (HTTPS), subtitle (до 100 символов), badges (до 4 строк по 48 символов). Ссылки до 2048 байт UTF-8, без логина и пароля. Без image карточка текстовая, без url - её нельзя открыть нажатием. При повторной загрузке отсутствие card сохраняет карточку; card: null явно удаляет её. Объект card заменяет все поля карточки.
contentTypeОбязательное: text, markdown, html или json (не MIME-тип)
contentОбязательная непустая строка с самим содержимым, в том числе для JSON. Всё JSON-тело запроса <= 256 KiB.
curl --fail-with-body "https://api.contextassistant.io/v1/knowledge/documents" \
  -H "Authorization: Bearer ${CONTEXT_ASSISTANT_SYNC_KEY}" \
  -H "Content-Type: application/json" \
  --data-binary @document.json

Сохраните пример в document.json в UTF-8. Новый документ возвращает 201:

{
  "id": "33333333-3333-4333-8333-333333333333",
  "sourceId": "22222222-2222-4222-8222-222222222222",
  "externalId": "help:delivery:en",
  "title": "Delivery",
  "contentType": "markdown",
  "status": "pending",
  "createdAt": "2026-09-10T12:00:00Z",
  "syncStatus": "created"
}

Идентичность документа - пара (sourceId, externalId). Изменения возвращают 200 updated с тем же id; одинаковый текст и метаданные - unchanged. Изменение только title/card обновляет метаданные без повторной векторизации готового документа. Изменение content ставит документ на индексацию. Без externalId каждый POST создаёт новый документ. PATCH для документа нет.

{
  "sourceId": "22222222-2222-4222-8222-222222222222",
  "externalId": "product:42:ru",
  "title": "Кресло Oslo",
  "contentType": "text",
  "content": "Кресло Oslo: светлый дуб, серая ткань. Цена 120 EUR.",
  "card": {
    "title": "Кресло Oslo",
    "url": "https://shop.example/products/42",
    "image": "https://shop.example/images/42.jpg",
    "subtitle": "120 EUR",
    "badges": [
      "Светлый дуб",
      "Серая ткань"
    ]
  }
}

Карточки выбираются из результатов базы знаний без Remote Tools. Сервер передаёт сохранённые поля в references ответа чата. Изображения задаются ссылками: файлы не загружаются и не анализируются. Обновляйте цены и наличие синхронизацией: карточки из базы знаний не проверяют склад в реальном времени. Сейчас карточки видны в текущем ответе; при повторной загрузке истории восстанавливается текст, но не карточки.

syncStatus описывает результат записи, а не готовность индекса. status принимает pending, processing, ready или failed. URL в content не скачивается. PDF и изображения перед загрузкой преобразуйте в проверенный текст. Загружайте только материалы, доступные аудитории ассистента: источник не задаёт индивидуальные права посетителей.

POST /v1/knowledge/documents/bulk

В текущем контракте API есть пакетная загрузка с knowledge:write: 1-100 документов, externalId обязателен у каждого, JSON-тело до 8 MiB, content каждого документа до 256 KiB. Повторяющиеся пары (sourceId, externalId) внутри пакета отклоняются. Проверьте доступность маршрута в своём окружении; если bulk недоступен, используйте одиночные запросы.

{
  "documents": [
    {
      "sourceId": "22222222-2222-4222-8222-222222222222",
      "externalId": "help:delivery:en",
      "title": "Delivery",
      "contentType": "markdown",
      "content": "# Delivery\nDelivery takes 2-4 business days."
    }
  ]
}

Ответ 200, по одному результату на документ в порядке запроса:

{
  "items": [
    {
      "id": "33333333-3333-4333-8333-333333333333",
      "sourceId": "22222222-2222-4222-8222-222222222222",
      "externalId": "help:delivery:en",
      "title": "Delivery",
      "contentType": "markdown",
      "status": "pending",
      "createdAt": "2026-09-10T12:00:00Z",
      "syncStatus": "created"
    }
  ],
  "created": 1,
  "updated": 0,
  "unchanged": 0
}

Поля и источники проверяются до записи, но пакет не является одной транзакцией БД. При ошибке хранилища или очереди часть документов может уже сохраниться. Повторяйте запрос с теми же стабильными идентификаторами, не генерируйте новые externalId. Индексация остаётся асинхронной.

Проверка индексации и постраничная загрузка

GET /v1/knowledge/documents?limit=100 требует knowledge:read. В ответе 200 items содержат id, sourceId, необязательный externalId, title, необязательный card, contentType, status, необязательный error и createdAt. Исходный content, checksum и syncStatus в списке не возвращаются.

{
  "items": [
    {
      "id": "33333333-3333-4333-8333-333333333333",
      "sourceId": "22222222-2222-4222-8222-222222222222",
      "externalId": "help:delivery:en",
      "title": "Delivery",
      "contentType": "markdown",
      "status": "ready",
      "createdAt": "2026-09-10T12:00:00Z"
    }
  ],
  "nextCursor": "<opaque cursor; omitted on last page>"
}

limit по умолчанию 20, максимум 100; неверные/неположительные значения и неверные курсоры возвращают 400. Передавайте nextCursor с URL-кодированием, пока он не исчезнет. Список относится ко всему рабочему пространству, не к одному ассистенту или источнику. Фильтруйте sourceId в импорте. Фильтра sourceId в query и GET /documents/{id} нет; нужный документ ищется по id в постраничном списке.

Опрашивайте с паузами и предельным временем ожидания. ready означает, что документ проиндексирован; реальные ответы всё равно нужно проверить. При failed разберите error без вывода закрытого содержимого. Повторная отправка неизменного failed-документа не запускает индексацию заново. Сохраняйте исходные материалы у себя и сообщайте о сбое вместо бесконечных повторов.

Обновления, корзина и безопасная синхронизация

Метод и путьПраво и ответ
DELETE /v1/knowledge/documents/{documentId}knowledge:write; 204, переносит в корзину и убирает фрагменты из индекса
GET /v1/knowledge/documents/trashknowledge:read; 200 {items: [...]}, последние 100, без курсора
POST /v1/knowledge/documents/{documentId}/restoreknowledge:write; тело не требуется; 200 документ со status pending; снова ставит на индексацию
DELETE /v1/knowledge/documents/{documentId}/purgeknowledge:write; 204; безвозвратно удаляет документ из корзины
DELETE /v1/knowledge/sources/{sourceId}knowledge:write; 204; безвозвратно удаляет источник и все его документы, включая корзину

Восстановление может вернуть 409 conflict, если активный документ уже занимает пару (sourceId, externalId). Не удаляйте ни одну версию автоматически. Маршруты удаления не реализуют ваш процесс согласования: сначала покажите предпросмотр и получите отдельное двойное подтверждение. DELETE источника и purge не подходят для обычной очистки при синхронизации.

Стройте синхронизацию вокруг постоянного sourceId и стабильных externalId. Сравнивайте кандидатов на удаление только внутри этого источника, после полной успешной выгрузки и чтения всех страниц списка документов. Недоступность источника, пустая частичная выгрузка или пропущенная страница не должны приводить к массовому удалению. По умолчанию используйте dry-run, сохраняйте исходный контент и журнал запусков, останавливайтесь при необычно большом числе удалений. Расписание, webhook и чтение источника реализуются в проекте клиента; этот API не создаёт обходчик сайтов.

Ошибки и ограничения запросов

{
  "code": "forbidden",
  "error": "the API key lacks the required scope"
}
Статус / кодПричина и действие
400 invalid_inputНеверные поля, формат, курсор или размер тела; исправьте запрос, а не повторяйте его без изменений
400 invalid_contextНедопустимые сведения о странице
401 unauthorizedНет ключа, ключ отозван, embed-токен неверный или истёк
403 forbiddenУ ключа нет требуемого права
403 origin_not_allowedЗаявленный origin не входит в разрешённые адреса ассистента
404 not_found, assistant_not_found, source_not_found, document_not_found, conversation_not_foundОбъект отсутствует или не входит в область доступа. API управления ассистентами возвращает not_found, выдача токенов - assistant_not_found.
409 conflictВосстанавливаемый документ конфликтует с активной версией
429Лимит частоты или квота. Учитывайте Retry-After, если он есть; ограничивайте число повторов.
5xxСбой сервиса, хранилища или провайдера. Документ мог сохраниться: повторяйте загрузку со стабильным externalId. Не пересылайте сообщения чата вслепую.

Лимиты тела: токен 4 KiB; чат 64 KiB; одиночный запрос знаний 256 KiB; bulk 8 MiB и до 256 KiB content на элемент. Прокси может ограничивать размер сильнее и возвращать не-JSON ошибки, например 413. Проверяйте HTTP-статус и тип ответа перед разбором. Для POST с SSE в браузере используйте fetch с Authorization, а не EventSource.

Контракт Remote Tools

Полный HTTP-контракт · Регистрация подключения, права ключей и идентификаторы.

Любой бэкенд может дать ассистенту типизированные действия и обоснование ответов, реализовав четыре HTTP-эндпоинта. Скоуп передаётся как execution (workspaceId, externalUserId, permissions, requestId); callId сквозно идентифицирует один конкретный вызов инструмента.

Метод и путьНазначение
GET {baseURL}/toolsСписок доступных инструментов для этого execution scope
GET {baseURL}/contextКонтекст для обоснования ответов текущего пользователя/сессии
POST {baseURL}/tools/previewПредпросмотр для человека — без побочных эффектов
POST {baseURL}/tools/executeВыполнить действие после подтверждения

Ответ GET /tools:

{
  "tools": [
    {
      "name": "create_task",
      "description": "Create a task in the current project",
      "verb": "create",
      "inputSchema": { "type": "object", "properties": { "title": { "type": "string" } }, "required": ["title"] }
    }
  ]
}

Запрос POST /tools/preview:

{
  "tool": "create_task",
  "callId": "call_abc123",
  "arguments": { "title": "Ship the release" },
  "execution": {
    "workspaceId": "ws_123",
    "externalUserId": "user_42",
    "permissions": ["tasks:write"],
    "requestId": "req_xyz"
  }
}

Ответ POST /tools/preview:

{ "preview": "Create a task “Ship the release” in Project Apollo" }

Ответ POST /tools/execute (запрос той же формы, что и у preview):

{ "output": { "id": "task_789", "title": "Ship the release", "status": "open" } }
VerbПодтверждение
getНет — выполняется автоматически в рамках хода
create, updatePreview, затем явный Apply
deletePreview, затем второе явное подтверждение

Живой пример: плагин для WordPress реализует именно этот контракт — 10 инструментов (6 WordPress + 4 WooCommerce), проверяется conformance-тестами против реального хоста при каждом изменении.

Модель безопасности

Полная модель — на главной странице. Коротко: публичный ключ подключает только гостевой чат, секрет синхронизации остаётся на сервере, каждый запрос привязан к своему тенанту и воркспейсу, хост перепроверяет реальные права перед любым действием, а удаление требует двойного подтверждения с возможностью восстановления.