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

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

Каждый пример ниже — реальный файл, типизируемый в CI против настоящих SDK-пакетов, а не переписанный вручную текст. Если типы не сойдутся, сборка упадёт раньше, чем вы это увидите.

Быстрый старт

Три способа подключить Context Assistant — в зависимости от вашего стека:

Всем трём нужна одна вещь от вашего бэкенда: эндпоинт токена, который обменивает секретный ключ ca_sk_… на короткоживущий embed token. Сам секретный ключ никогда не попадает в браузер (см. Модель безопасности).

React SDK

Установка:

npm install @context-assistant/react

Оберните приложение (или его часть) в provider, затем добавьте виджет:

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

async function getToken(): Promise<string> {
  const res = await fetch('/api/context-assistant/token', { method: 'POST' });
  const data = await res.json();
  return data.token;
}

export function App() {
  return (
    <ContextAssistantProvider apiUrl="https://api.your-domain.example" getToken={getToken}>
      <Assistant agent="store-consultant" title="Store Consultant" greeting="How can I help?" />
    </ContextAssistantProvider>
  );
}

Нужен свой интерфейс вместо встроенного виджета? Используйте useAssistant() напрямую — он даёт messages, status, busy, pendingAction, send() и пару confirm/cancel для схемы preview → Apply.

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

Для любого сайта — без фреймворка. Установите бандл или раздавайте его сами, затем:

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

async function getToken(): Promise<string> {
  const res = await fetch('/api/context-assistant/token', { method: 'POST' });
  const data = await res.json();
  return data.token;
}

const widget = mount({
  apiUrl: 'https://api.your-domain.example',
  getToken,
  agent: 'store-consultant',
  title: 'Store Consultant',
});

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

Возвращённый виджет даёт open(), close(), send(), setContext(), updateContext(), clearContext() и destroy().

JavaScript SDK

Клиент без интерфейса, на котором построены оба SDK выше, — для полностью своего UI:

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

async function getToken(): Promise<string> {
  const res = await fetch('/api/context-assistant/token', { method: 'POST' });
  const data = await res.json();
  return data.token;
}

const session = new ConversationSession({
  apiUrl: 'https://api.your-domain.example',
  getToken,
  agent: 'store-consultant',
});

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

Контракт Remote Tools

Любой бэкенд может дать ассистенту типизированные действия и обоснование ответов, реализовав четыре 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-тестами против реального хоста при каждом изменении.

Self-hosting

Ядро — open-core: те же Docker-образы, что используем мы сами, разворачиваются одной командой docker compose up, а все данные — диалоги, база знаний, ключи — остаются в вашей инфраструктуре. Полный гайд оператора для этой страницы ещё в планах; до тех пор — напишите нам, если хотите развернуть self-hosting уже сегодня.

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

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