cosai · Документация
ВнедрениеREST API

Примеры запросов

Готовые примеры: поиск и чат со стримом.

Ниже — рабочие примеры на основные сценарии: поиск, диалог с агентом и загрузка документа.

Поиск по базе знаний

curl https://api.cosai.pro/v1/search \
  -H "Authorization: Bearer cosai_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"query": "сколько стоит доставка", "limit": 6}'

Ответ — список найденных фрагментов с их рангами в векторном и полнотекстовом поиске и итоговым RRF-скором:

{
  "query": "сколько стоит доставка",
  "results": [
    {
      "chunk_id": "…",
      "document_id": "…",
      "entity_type": "document",
      "title": "Условия отгрузки",
      "content": "…",
      "rrf_score": 0.83,
      "dense_rank": 1,
      "sparse_rank": 3
    }
  ]
}

Диалог с агентом (потоковый ответ, SSE)

curl -N https://api.cosai.pro/v1/agents/<agent_id>/chat \
  -H "Authorization: Bearer cosai_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"message": "Какой у вас гарантийный срок?"}'

Ответ приходит потоком событий Server-Sent Events:

event: start
data: {"conversation_id":"…","citations":[{"n":1,"document_id":"…","chunk_id":"…","title":"Гарантийные условия"}]}

event: text
data: {"delta":"Гарантийный "}

event: text
data: {"delta":"срок — 12 месяцев [1]."}

event: done
data: {"conversation_id":"…","usage":{"inputTokens":412,"outputTokens":18},"citations":[…]}

Чтобы продолжить тот же диалог следующим сообщением, передайте conversation_id из события start:

curl -N https://api.cosai.pro/v1/agents/<agent_id>/chat \
  -H "Authorization: Bearer cosai_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"message": "А на комплектующие?", "conversation_id": "<conversation_id из start>"}'

Пример чтения потока на JavaScript:

const res = await fetch(`https://api.cosai.pro/v1/agents/${agentId}/chat`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey}` },
  body: JSON.stringify({ message: 'Какой у вас гарантийный срок?' }),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buf = '';
for (;;) {
  const { done, value } = await reader.read();
  if (done) break;
  buf += decoder.decode(value, { stream: true });
  for (const line of buf.split('\n')) {
    if (line.startsWith('data:')) console.log(JSON.parse(line.slice(5)));
  }
}

Загрузка документа

Загрузка файла (multipart, до 10 файлов, каждый до 25 МБ, форматы PDF/DOCX/TXT/MD):

curl https://api.cosai.pro/v1/sources/<source_id>/files \
  -H "Authorization: Bearer cosai_sk_…" \
  -F "files[]=@catalog.pdf"
{ "files": [{ "name": "catalog.pdf", "job_id": "…" }] }

Загрузка текстового документа без файла:

curl https://api.cosai.pro/v1/sources/<source_id>/documents \
  -H "Authorization: Bearer cosai_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"title": "FAQ по доставке", "content": "…текст документа…"}'

Оба запроса возвращают 202 Accepted — обработка (разбор → нарезка → эмбеддинг → индекс) идёт асинхронно; статус можно проверить через GET /jobs/:id.

Про цитаты в ответах

Массив citations (в событии start и done чата, а также в качестве отдельного элемента при прямом поиске) — это список фрагментов, на которые агент опирался, каждый с номером n, соответствующим меткам [N] внутри текста ответа. Так можно показать пользователю не просто ответ, а ответ со ссылками на конкретные источники.

On this page