Довідка
Markdown статтіПовідомити про помилку

Довідник Context API

Context API віддає стислий зріз про одну сутність: клієнта, тематику, оператора або скіл-групу. У відповіді — дозволені поля зараз і короткі уривки звернень, які це підтверджують. Розмір пакета обмежений, тож його можна передати в CRM або агенту без повної історії чатів.

Навіщо так зроблено і чим стан відрізняється від репліки в чаті — у поясненні «Про те, як Context API збирає контекст».

API сам не запускає Copilot чи інші AI-сценарії. Його викликає ваша інтеграція або MCP-інструмент. API бере інстанс і користувача з авторизованої сесії. Ідентифікатор інстансу в тілі запиту не дає доступу до чужих даних.

Авторизація — як у решти ConnectiveOne API. Див. Як використовувати API.

Єдиний контракт

Маршрут читання використовує одну форму запиту й відповіді для клієнта, тематики, оператора та скіл-групи. Поле version не передавайте: API відхиляє його як некоректний запит. Для читання потрібне готове сховище контексту; прихованого переходу на старий формат facts немає.

Читання контексту

POST /kw/chatrooms/context/retrieve
Authorization: Bearer <access-token>
Content-Type: application/json

API перевіряє права до складання відповіді і ще раз перед видачею. Якщо доступ зник під час запиту, API повертає помилку і не підставляє застарілі дані.

Клієнт

Останні звернення:

{
  "scope": { "entity": "client", "id": 10004 },
  "targets": ["previous_client_appeals"],
  "topK": 8
}

Останні та релевантні звернення:

{
  "scope": { "entity": "client", "id": 10004 },
  "targets": ["previous_client_appeals", "relevant_appeals"],
  "query": "повернення коштів",
  "topK": 8
}

Тематика

{
  "scope": { "entity": "subject", "id": 3 },
  "targets": ["recent_subject_appeals", "relevant_subject_appeals"],
  "query": "доставка затримується"
}

Поле query обов’язкове, якщо серед targets є relevant_appeals або relevant_subject_appeals.

Стан, дії та властивості

{
  "scope": { "entity": "client", "id": 10004 },
  "sections": ["state", "actions", "properties", "evidence"],
  "targets": ["previous_client_appeals", "previous_client_conversations"],
  "actions": { "limit": 20, "actorTypes": ["client", "operator"] },
  "allowPartial": true
}

Якщо sections не передати, API бере типовий набір для сутності; явні targets або діапазон from/to додають evidence, а параметри actions — розділ дій клієнта. query можна передати лише разом із targets. Якщо в sections є evidence, а targets немає, API бере типовий напрям «останні» для цієї сутності.

scope.entity Дозволені sections Типовий набір
client state, actions, properties, evidence state, properties
subject properties, evidence properties, evidence
operator state, properties, evidence state, properties
skill_group state, properties, evidence state, properties

Якщо sections задано явно без evidence, API відхиляє параметри відбору звернень (targets, query, from, to, maxSnippetsPerAppeal). Невідому комбінацію sections теж.

Для оператора API бере звернення, у яких він брав участь. Для скіл-групи — звернення за покриттям тематик або участю учасників групи.

Якщо потрібне джерело недоступне: без allowPartial запит завершується помилкою; з allowPartial: true розділ приходить зі status: "unavailable" і причиною.

Окреме читання одного розділу клієнта:

Метод Маршрут Що повертає
GET /kw/clients/:client_id/context/state Поточний стан
GET /kw/clients/:client_id/context/actions Сторінка зареєстрованих дій
GET /kw/clients/:client_id/context/properties Відомі властивості

Ці маршрути використовують ту саму логіку і права, що й основний маршрут читання.

Напрями targets

Значення Що відбирає
previous_client_appeals Останні звернення клієнта
relevant_appeals Звернення клієнта за текстом query
previous_client_conversations Останні розмови зі сховища контексту
recent_client_interactions Недавні взаємодії зі сховища контексту
relevant_client_memory Пошук у пам’яті клієнта; потрібен query. Якщо індекс не готовий — розділ не успішний
recent_subject_appeals Останні звернення тематики
relevant_subject_appeals Звернення тематики за текстом query
recent_operator_appeals Останні звернення за участю оператора
relevant_operator_appeals Релевантні звернення оператора; потрібен query
recent_skill_group_appeals Останні звернення скіл-групи
relevant_skill_group_appeals Релевантні звернення скіл-групи; потрібен query

Напрями пам’яті клієнта треба передати явно; типовий набір їх не додає сам.

Параметри читання

Поле Призначення Типове Максимум
topK Скільки звернень у кожній вибірці 8 20
candidateLimit Скільки кандидатів перевіряти перед видачею 80 200
maxSnippetsPerAppeal Уривків повідомлень на звернення 3 5
maxResponseBytes Розмір відповіді, байти 65 536 262 144
tokenBudget Бюджет тексту для моделі 8 000 8 000
timeoutMs Час очікування пошукової частини, мс 2 000 5 000
query Текст релевантного пошуку 512 символів
from, to Необов’язковий діапазон дат для останніх звернень
actions.limit Скільки дій у розділі actions 20 100

actions.actorTypes — масив з client, operator, integration, system. Можна передати одне actions.actorType. Обидва поля разом заборонені.

Якщо пакет не вміщається в бюджет, API прибирає найменш пріоритетні уривки й ставить coverage.partial=true з причиною pack_budget.

Що містить відповідь

Відповідь має sections: поточний стан, дії, властивості й матеріали залежно від запиту. Старе поле facts не повертається.

Поле Зміст
sections.state Що відбувається зараз: робочі факти продукту і стан, записаний інтеграцією
sections.actions Зареєстровані дії з виконавцем і часом
sections.properties Відомі властивості, зокрема дозволені додаткові поля клієнта
sections.evidence Відібрані звернення й уривки
citations Посилання кожного факту або уривка на джерело
coverage Чи повна відповідь і чому вона часткова
budget Фактичний розмір пакета

Приклад успішної відповіді:

{
  "status": "success",
  "data": {
    "scope": { "entity": "client", "id": 10004 },
    "sections": {
      "state": { "status": "ready", "operational": [], "recorded": [] },
      "properties": { "status": "ready", "items": [] }
    },
    "citations": [],
    "coverage": { "partial": false, "reasons": [] },
    "budget": { "maxBytes": 65536, "maxTokens": 8000 }
  }
}

Поля клієнта і тематики

Клієнт: name, email, phone, organization_ids. Додаткові поля — лише ті, що дозволені в картці клієнта, з ключем custom.<field-key>. Некоректне або заборонене поле пропускається; решта відповіді лишається.

Тематика: name, alias, parent_id якщо є, confidential. Видалена тематика фактів не повертає.

Повнота відповіді

Неготовність пошуку для всього інстансу і неповнота однієї відповіді — різні речі. Одне звернення, яке не потрапило в пошук, не вимикає Context API. Відповідь, якої воно стосується, має coverage.partial=true і причину.

Обсяг звернення Що відбувається
До 1 000 повідомлень Звичайний підтримуваний обсяг
1 001–5 000 повідомлень Список звернень може попередити про сповільнення; те саме бачить Панель оператора (OperatorLine)
Понад 5 000 повідомлень Пошукове покриття Context API для цього звернення неповне. Повний текст доступний посторінково з джерела

Типові причини в coverage.reasons: pack_budget, appeal_quarantined, citation_revoked, recent_partial, relevant_partial. citation_text_refreshed означає, що текст цитати оновлено з джерела; відповідь коректна, partial через це не ставиться.

Запис дій і стану

Запис є лише для клієнта. Він не змінює поля CRM, статуси звернень, права чи маршрутизацію. Щоб закрити звернення або оновити картку, викликайте відповідний бізнес-API.

Метод Маршрут Результат
POST /kw/clients/:client_id/context/actions Реєстрація дії. Новий запис — HTTP 201
PUT /kw/clients/:client_id/context/state/:namespace Заміна стану в просторі імен. Потрібне expectedVersion

Обидва запити потребують заголовка Idempotency-Key. Повтор тієї самої команди повертає перший результат із replayed: true. Інше тіло з тим самим ключем відхиляється. Поле externalEventId додатково захищає дію від дубля з боку зовнішньої системи.

PUT перевіряє expectedVersion: якщо стан уже змінив інший запис, команда не проходить. Простори імен на кшталт commerce або onboarding належать різним інтеграціям і не перезаписують одні одних випадково. Зарезервовані: operational, system.

Повідомлення клієнта «я оплатив» лишається уривком у evidence. Підтвердженою дією платежу воно не стає, поки інтеграція не зареєструє подію окремо.

Дії в сценарії

Той самий запис і те саме підвантаження доступні з ноди Action. У наявні сценарії вони самі не додаються.

Дія Навіщо Гілки
register_client_context Зареєструвати подію клієнта і за потреби замінити стан у просторі імен success, replayed, conflict, error
load_external_context Підтягнути знімок з дозволеної зовнішньої системи в контекст клієнта applied, no_change, pending_import, conflict, invalid_response, unavailable

send_request зовнішній HTTP виконує, у сховище контексту відповідь не кладе. Параметри й приклади — на сторінках дій.

Сесії та імпорт

Маршрути для зовнішньої історії й робочого контексту розмови:

Метод Маршрут
POST /kw/context/sessions
POST /kw/context/sessions/:session_id/messages
GET /kw/context/sessions/:session_id/messages
POST /kw/context/sessions/:session_id/close
PUT /kw/context/sessions/:session_id/working-context
POST /kw/context/import-batches
GET /kw/context/import-batches/:batch_id

API фіксує клієнта під час відкриття сесії. Наступне тіло повідомлення не може підмінити його.

Обмеження Значення
Записів на сторінку повідомлень 100
Розмір одного повідомлення 1 MiB
workingContext 8 KiB; списки цілей, задач, сутностей, тверджень і джерел обмежені
Елементів імпорту 1–100
Розмір імпорту 1 MiB

Імпорт зберігає точку відновлення і продовжується з тим самим Idempotency-Key. Тіла запитів дивіться в Swagger: меню допомоги → API документація.

MCP-інструменти

Ті самі права й той самий маршрут читання. Операцій запису в MCP немає.

Інструмент Контекст
get_client_context Клієнт
get_subject_context Тематика
get_operator_context Оператор
get_skill_group_context Скіл-група

Імена параметрів — snake_case: client_id, subject_id, operator_id, skill_group_id, sections, actions, top_k, candidate_limit, max_snippets_per_appeal, max_response_bytes, token_budget, timeout_ms.

Помилки

HTTP Код Значення
400 INVALID_REQUEST Некоректний scope, ID, target, sections або немає обов’язкового query
400 QUERY_BUDGET_EXCEEDED Перевищено бюджет запиту чи відповіді
401 Сесія не авторизована
403 ACCESS_DENIED Немає доступу або він змінився під час запиту
429 Перевищено дозволену паралельність або частоту
503 SEARCH_UNAVAILABLE Можливість вимкнена або пошук не готовий

Відповідь містить персональні дані клієнта. Не пишіть її в звичайні логи застосунку.

Якщо запити стабільно повертають 503, зверніться до адміністратора інстансу.

Пов’язані матеріали

Працюєте з власним ШІ-агентом?Встановіть відкритий skill, щоб ваш ШІ-агент працював з актуальною офіційною документацією ConnectiveOne.Отримати skillПотрібна підтримка?Не знайшли відповідь або потрібна допомога команди ConnectiveOne? Створіть запит у Client Portal.Створити запит