Довідник 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, зверніться до адміністратора інстансу.