Це машинний переклад оригінального документа англійською мовою. У разі будь-яких розбіжностей між цим перекладом та оригінальною англійською версією, пріоритет має версія англійською мовою. Читати оригінал англійською мовою


Публічний API

Caiioo містить REST API, який дозволяє керувати всім програмно: запускати агентів, керувати інструментами, планувати завдання тощо. API розміщено на тому ж локальному сервері, який забезпечує роботу десктопного додатка та браузерного моста.

Base URL: http://localhost:3847/v1

Автентифікація: Два способи автентифікації, обидва обмежуються перемикачем API в налаштуваннях:

Для зовнішніх споживачів (скрипти, інтеграції, curl): Встановіть токен доступу до API у Налаштування > Доступ до API, а потім використовуйте його як Bearer токен:

curl -H "Authorization: Bearer YOUR_API_TOKEN" http://localhost:3847/v1/providers

Для локального додатка (автоматично): Десктопний додаток Caiioo, розширення для браузера та мобільні додатки автентифікуються автоматично через існуючий заголовок авторизації реле (X-Relay-Auth). Ручне налаштування не потрібне — додаток обробляє це за лаштунками.

Налаштування:

  1. Відкрийте Caiioo Налаштування > Доступ до API
  2. Увімкніть Enable Public API
  3. Встановіть API access token (будь-який рядок на ваш вибір — ставтеся до нього як до пароля)
  4. Використовуйте цей токен у всіх запитах до API

API доступний на localhost та через приватне реле. Перевірте GET /v1/auth/info (авторизація не потрібна) для отримання поточного статусу та інструкцій з налаштування.

Провайдери та моделі

Дізнайтеся, які провайдери LLM налаштовані та які моделі доступні.

Список провайдерів:

GET /v1/providers

Повертає всі налаштовані типи провайдерів (Anthropic, OpenAI, Google, OpenRouter, Ollama, Poe, MLX, Baseten та інші в міру їх додавання) з прапорцями можливостей (supportsVision, supportsToolCalling, supportsStreaming тощо) та інформацією про те, чи налаштовано ключ API.

Список моделей для провайдера:

GET /v1/providers/anthropic/models

Повертає каталог моделей для цього провайдера. Кожна модель містить id, displayName та contextLength, де це можливо.

Загальний каталог усіх провайдерів:

GET /v1/models

Об'єднує моделі від кожного налаштованого провайдера в один список. Провайдери без ключів API пропускаються та вказуються у warnings.

Агенти

Агенти — це ядро caiioo. Кожен агент — це Режим, налаштована особистість зі своєю системною підказкою, інструментами, змінними та навичками.

Список усіх агентів:

GET /v1/agents

Повертає вбудованих агентів (Shopping, Workplace, General) та будь-яких створених вами агентів. Кожен позначений тегом source: \"builtin\" або source: \"custom\".

Створити власного агента:

POST /v1/agents
Content-Type: application/json

{
  \"id\": \"my-research-agent\",
  \"branding\": {
    \"name\": \"Research Agent\",
    \"description\": \"Шукає в мережі та підсумовує результати\"
  },
  \"defaultSettings\": {
    \"systemPrompt\": \"Ви — асистент-дослідник. Завжди цитуйте джерела.\",
    \"enabledTools\": { \"web_browsing\": true, \"search_tools\": true }
  },
  \"settingLevels\": {}
}

Повертає 201 зі створеним агентом. Векторний годинник додається автоматично для синхронізації.

Оновити агента:

PATCH /v1/agents/my-research-agent
Content-Type: application/json

{ \"branding\": { \"name\": \"Research Agent\", \"description\": \"Оновлений опис\" } }

Об'єднує патч з існуючим агентом та оновлює векторний годинник. Вбудовані агенти повертають 403 — вони доступні лише для читання.

Видалити агента:

DELETE /v1/agents/my-research-agent

М'яке видалення через tombstone (синхронізується між пристроями). Повертає 204.

Запуск агентів

Це головна подія — виклик агента для обробки повідомлення.

Синхронний режим

Очікування повної відповіді:

POST /v1/runs
Content-Type: application/json

{
  "agentId": "general",
  "input": { "message": "Яка сьогодні погода в Парижі?" },
  "mode": "sync"
}

Повертає 200 з { content, usage, status: "completed" } після завершення роботи агента. Якщо агент видає помилку, повертає 500 з { error, status: "error" }.

Асинхронний режим

Запустити та забути — корисно для тривалих завдань:

POST /v1/runs
Content-Type: application/json

{
  "agentId": "my-research-agent",
  "input": { "message": "Напиши аналіз тенденцій відновлюваної енергетики на 2000 слів" },
  "mode": "async"
}

Негайно повертає 202 з { runId, threadId, status: "running" }.

Опитування статусу:

GET /v1/runs/{runId}

Повертає { run: { runId, threadId, agentId, status, createdAt, content?, usage?, error? } }. Статус може бути running, completed, error або cancelled.

Потік подій у реальному часі (SSE):

GET /v1/runs/{runId}/events

Повертає text/event-stream з кожною подією агента в міру її виникнення: GENERATION_STARTED, STREAMING_CONTENT, виклики інструментів, активність субагентів та кінцеву подію (GENERATION_COMPLETE, GENERATION_ERROR або GENERATION_CANCELLED). Потік завершується після кінцевої події.

Скасування запуску:

POST /v1/runs/{runId}/cancel

Повертає { run: { ..., status: "cancelled" } }.

Threads

Threads — це бесіди. Кожен запуск агента відбувається в межах thread, і threads зберігаються між сесіями. API дозволяє перераховувати, читати, створювати та керувати threads програмно.

Список усіх threads (тільки метадані):

GET /v1/threads

Повертає threads для поточного профілю з видаленими повідомленнями для підвищення продуктивності. Кожен thread містить id, title, createdAt, updatedAt, modeId, archived та статистику використання.

Отримати thread з повним списком повідомлень:

GET /v1/threads/{id}

Повертає повний thread, включаючи масив messages — кожне повідомлення користувача, відповідь асистента, виклик інструменту та результат роботи інструменту.

Отримати тільки повідомлення:

GET /v1/threads/{id}/messages

Повертає лише масив messages — це легше, ніж повний об'єкт thread, коли вам потрібна лише розмова.

Створити thread:

POST /v1/threads
Content-Type: application/json

{ "title": "Research project", "modeId": "general" }

Повертає 201 з новим thread. За замовчуванням API НЕ перемикає активний thread додатка — передайте "setActive": true у тілі запиту, якщо ви хочете це зробити. Новий thread з'явиться в бічній панелі миттєво (через WebSocket трансляцію).

Оновити thread:

PATCH /v1/threads/{id}
Content-Type: application/json

{ "title": "Renamed project", "archived": true }

Поля, що підлягають оновленню: title, modeId, archived, lastUsedModel. Зміни транслюються в бічну панель у режимі реального часу.

Видалити thread:

DELETE /v1/threads/{id}

М'яке видалення thread (tombstone для синхронізації). Повертає 204. Видалені threads переміщуються до кошика і можуть бути відновлені, доки кошик не буде очищено.

Активний thread:

GET /v1/threads/active            # Повертає { threadId }
PUT /v1/threads/active            # Тіло: { "threadId": "..." }

Керування кошиком:

GET /v1/threads/trash/count       # Повертає { count }
POST /v1/threads/trash/empty      # Повертає { deletedCount, protectedCount }

Захищені threads (збережені за допомогою перемикача зберігання даних) виключаються під час очищення кошика.

Продовження розмови через API: Щоб надіслати наступне повідомлення в існуючий thread, використовуйте POST /v1/runs з ID відповідного thread:

POST /v1/runs
Content-Type: application/json

{
  "agentId": "general",
  "threadId": "existing-thread-id",
  "input": { "message": "Follow up on that last point" },
  "mode": "sync"
}

Агент бачить повну історію розмови з цього thread.

Вкладення

Вкладення — це файли, пов'язані з гілками обговорень: скріншоти, PDF, документи, завантажені зображення, згенеровані артефакти. API дозволяє переглядати, завантажувати, вивантажувати та керувати ними.

Список усіх вкладень (тільки метадані):

GET /v1/attachments

Повертає метадані вкладень для поточного профілю. Важкі поля (dataUrl, extractedContent, extractedImages) видаляються — використовуйте кінцеві точки деталей або контенту для їх отримання.

Список вкладень для конкретної гілки:

GET /v1/threads/{threadId}/attachments

Отримати метадані вкладення:

GET /v1/attachments/{id}

Повертає повні метадані, включаючи extractedContent (текст OCR, розібраний markdown), contentType, fileName, size та прапорець hasContent. Необроблені бінарні дані НЕ включаються — використовуйте для цього кінцеву точку /content.

Завантажити бінарний файл вкладення:

GET /v1/attachments/{id}/content

Повертає необроблений файл із правильними заголовками Content-Type та Content-Disposition. Спрямуйте це у файл:

curl -o output.pdf \
  -H "Authorization: Bearer $API_TOKEN" \
  http://localhost:3847/v1/attachments/{id}/content

Вивантажити вкладення:

POST /v1/attachments
Content-Type: application/json

{
  "threadId": "thread-id",
  "type": "user_upload",
  "contentType": "application/pdf",
  "fileName": "report.pdf",
  "description": "Квартальний звіт",
  "dataUrl": "data:application/pdf;base64,JVBERi0xLjQ..."
}

dataUrl — це URL-адреса даних у кодуванні base64. Повертає 201 з ID нового вкладення. Вкладення прив'язується до вказаної гілки.

Оновити метадані вкладення:

PATCH /v1/attachments/{id}
Content-Type: application/json

{ "description": "Оновлений опис", "fileName": "new-name.pdf" }

Видалити вкладення:

DELETE /v1/attachments/{id}

М'яке видалення через tombstone. Повертає 204.

MCP Servers

Керуйте підключеннями до ваших MCP (Model Context Protocol) серверів — серверів, які надають агентам доступ до зовнішніх інструментів та джерел даних.

Список налаштованих серверів:

GET /v1/mcp-servers

Повертає всі конфігурації MCP серверів для поточного профілю. Чутливі поля (authToken, env, credentialId) видаляються з відповіді.

Отримати конфігурацію сервера:

GET /v1/mcp-servers/{id}

Додати новий MCP сервер:

POST /v1/mcp-servers
Content-Type: application/json

{
  "id": "my-server",
  "name": "My MCP Server",
  "command": "npx",
  "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/files"],
  "serverType": "local"
}

Для віддалених HTTP серверів використовуйте "url" замість "command":

{
  "id": "remote-server",
  "name": "Remote API",
  "url": "https://my-mcp-server.example.com/sse",
  "serverType": "remote"
}

Оновити сервер:

PATCH /v1/mcp-servers/{id}
Content-Type: application/json

{ "name": "Renamed Server", "args": ["-y", "@mcp/server-v2"] }

Увімкнути/вимкнути сервер:

POST /v1/mcp-servers/{id}/toggle
Content-Type: application/json

{ "enabled": false }

Видалити сервер:

DELETE /v1/mcp-servers/{id}

Керування процесами

Для локальних (stdio) MCP серверів ви можете керувати процесом сервера безпосередньо.

Список запущених процесів:

GET /v1/mcp-servers/processes

Повертає запущені процеси серверів зі статусами pid, startedAt та running.

Запустити сервер:

POST /v1/mcp-servers/{id}/start

Зчитує command/args/env з конфігурації сервера та запускає процес. Повертає статус процесу.

Зупинити сервер:

POST /v1/mcp-servers/{id}/stop

Коректно завершує процес сервера (SIGTERM з переходом до SIGKILL у разі потреби).

Викликати метод JSON-RPC безпосередньо:

POST /v1/mcp-servers/{id}/call
Content-Type: application/json

{ "method": "tools/list", "params": {} }

Надсилає необроблений запит JSON-RPC 2.0 до сервера та повертає результат. Корисно для налагодження або виклику методів, які не доступні через tools API.

Інструменти та набори інструментів

Переглядайте та викликайте інструменти, які використовують агенти — веб-перегляд, пошук, календар, Gmail, Slate та інші.

Список наборів інструментів (згруповано):

GET /v1/toolkits

Повертає вбудовані інструменти, згруповані за категоріями (Продуктивність, Пошук, Утиліти тощо), та будь-які підключені MCP-сервери як окремі набори інструментів, кожен із переліком дій.

Список усіх інструментів (плоский):

GET /v1/tools
GET /v1/tools?source=embedded   # Тільки вбудовані інструменти
GET /v1/tools?source=mcp        # Тільки інструменти MCP-серверів

Отримати деталі інструмента зі схемою введення:

GET /v1/tools/calculator

Повертає JSON-схему інструмента для його вхідних параметрів, щоб ви могли провести валідацію перед викликом.

Викликати інструмент безпосередньо:

POST /v1/tools/calculator/invoke
Content-Type: application/json

{ "input": { "expression": "sqrt(144) + 3^2" } }

Повертає { result }. Введення перевіряється за схемою інструмента — невірне введення повертає 422 з деталями. Віддалені інструменти MCP повертають 501 з рекомендацією використовувати /v1/runs (вони потребують транспорту підпроцесу агента).

Конектори

Керуйте інтеграціями OAuth — Google, Microsoft, GitHub, Notion, Slack та іншими.

Перегляд доступних інтеграцій:

GET /v1/connectors/catalog

Повертає всіх зареєстрованих провайдерів OAuth з їхніми іменами, категоріями та стандартними областями доступу (scopes).

Список ваших підключених акаунтів:

GET /v1/connectors

Повертає активні підключення для поточного профілю. Токени ніколи не розкриваються — лише метадані (провайдер, email, статус, області доступу, мітки часу).

Перевірка стану підключення:

POST /v1/connectors/{id}/test

Повертає { health: { status, isTokenExpired, canRefresh } }.

Видалити підключення:

DELETE /v1/connectors/{id}

Створення нових підключень вимагає інтерактивного потоку OAuth через інтерфейс додатка або маршрути /auth/*.

Тригери

Плануйте автоматичний запуск агентів — щоденні брифінги, щотижневі звіти, моніторинг на основі інтервалів.

Список тригерів:

GET /v1/triggers

Створити запланований тригер:

POST /v1/triggers
Content-Type: application/json

{
  "name": "Ранковий брифінг",
  "prompt": "Підсумуй мої непрочитані листи та сьогоднішній календар",
  "modeId": "general",
  "schedule": { "type": "daily", "time": "08:00" }
}

Підтримувані типи розкладів:

  • { "type": "interval", "minutes": 60 } — кожні N хвилин (мін. 15, макс. 1440)
  • { "type": "daily", "time": "09:00" } — щодня у вказаний час
  • { "type": "weekly", "day": "mon", "time": "09:00" } — щотижня
  • { "type": "weekdays", "time": "08:30" } — з понеділка по п'ятницю
  • { "type": "daysOfWeek", "days": ["mon", "wed", "fri"], "time": "10:00" } — у конкретні дні
  • { "type": "monthly", "dayOfMonth": 1, "time": "09:00" } — щомісяця
  • { "type": "manual" } — тільки при запуску через API

Запустити тригер вручну:

POST /v1/triggers/{id}/fire

Повертає 202 з threadId для результату запуску.

Оновити або видалити:

PATCH /v1/triggers/{id}
DELETE /v1/triggers/{id}

Вебхуки

Тригери вебхуків дозволяють зовнішнім сервісам (CI/CD, моніторинг, конструктори форм) запускати агента через HTTP.

Створити тригер вебхука:

POST /v1/triggers
Content-Type: application/json

{
  "name": "Deploy hook",
  "prompt": "Відбулося розгортання: {{webhook.body}}",
  "modeId": "general",
  "kind": "webhook"
}

Повертає 201 з webhookSecret та webhookPath. Збережіть секрет — він знадобиться для підпису корисного навантаження.

Надіслати вебхук:

# Обчислення HMAC-SHA256 необробленого тіла запиту
SIGNATURE=$(echo -n '{"repo":"my-app","branch":"main"}' | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET" | awk '{print $2}')

POST /v1/webhooks/{triggerId}
Content-Type: application/json
X-Webhook-Signature: $SIGNATURE

{"repo": "my-app", "branch": "main"}

Кінцева точка вебхука НЕ потребує bearer-авторизації — замість цього вона використовує перевірку HMAC. Повертає 202 з threadId запущеного процесу. Плейсхолдер {{webhook.body}} у промпті тригера замінюється необробленим тілом запиту.

Користувацькі функції

Створюйте власні інструменти, які можуть викликати агенти. Функції пишуться на JavaScript або Python і виконуються в пісочниці.

Список функцій:

GET /v1/functions

Створити функцію:

POST /v1/functions
Content-Type: application/json

{
  "name": "calculate_bmi",
  "description": "Розрахувати індекс маси тіла за зростом і вагою",
  "language": "javascript",
  "source": "return { bmi: (input.weightKg / (input.heightM * input.heightM)).toFixed(1) };",
  "inputSchema": {
    "type": "object",
    "properties": {
      "weightKg": { "type": "number" },
      "heightM": { "type": "number" }
    },
    "required": ["weightKg", "heightM"]
  }
}

Функції JavaScript отримують input і повинні повернути результат. Функції Python встановлюють змінну result:

# Приклад на Python
result = {"bmi": round(input["weightKg"] / (input["heightM"] ** 2), 1)}

Виконати функцію безпосередньо:

POST /v1/functions/{id}/execute
Content-Type: application/json

{ "input": { "weightKg": 75, "heightM": 1.80 } }

Безпека: JavaScript працює в пісочниці Node vm (без доступу до файлової системи або мережі, таймаут 10с). Python працює як підпроцес із таймаутом 30с. Обидва варіанти перевіряють введення перед виконанням.

Оновити або видалити:

PATCH /v1/functions/{id}
DELETE /v1/functions/{id}

Робочі процеси (Workflows)

Організовуйте роботу кількох агентів у DAG (спрямований ациклічний граф) — запускайте кроки паралельно, де це можливо, і передавайте результати попередніх кроків у наступні.

Валідація графа робочого процесу:

POST /v1/workflows/validate
Content-Type: application/json

{
  "graph": {
    "nodes": [
      { "id": "research", "agentId": "general", "prompt": "Дослідити тенденції відновлюваної енергетики" },
      { "id": "analyze", "agentId": "general", "prompt": "Дослідити ціни конкурентів" },
      { "id": "report", "agentId": "general", "prompt": "Написати звіт, поєднавши: {{outputs.research}} та {{outputs.analyze}}", "dependsOn": ["research", "analyze"] }
    ]
  }
}

Повертає { valid: true/false, errors: [...] }. Перевіряє наявність циклів, дублікатів ID та відсутніх посилань на залежності.

Виконати робочий процес:

POST /v1/workflows/execute
Content-Type: application/json

{
  "graph": {
    "nodes": [
      { "id": "research", "agentId": "general", "prompt": "Дослідити тенденції відновлюваної енергетики" },
      { "id": "summarize", "agentId": "general", "prompt": "Підсумувати: {{outputs.research}}", "dependsOn": ["research"] }
    ]
  }
}

Повертає { status: "completed", outputs: { research: "...", summarize: "..." }, nodeResults: {...} }.

Незалежні вузли (без спільних залежностей) виконуються паралельно. Плейсхолдер {{outputs.nodeId}} у промпті вузла замінюється на вихідний контент названого вищестоящого вузла. Кожен вузол — це повноцінний запуск агента, тому він може використовувати інструменти, переглядати веб-сторінки та мати доступ до всіх можливостей цільового агента.

Бази знань

Організовуйте документи в колекції з можливістю пошуку, на які можуть посилатися агенти.

Список баз знань:

GET /v1/knowledge/bases

Створити базу знань:

POST /v1/knowledge/bases
Content-Type: application/json

{ "name": "Дослідницькі роботи" }

Повертає 201 з ID нової бази.

Завантажити документ у базу знань:

POST /v1/knowledge/bases/{id}/documents
Content-Type: application/json

{
  "fileName": "research-paper.pdf",
  "contentType": "application/pdf",
  "dataUrl": "data:application/pdf;base64,JVBERi0xLjQ...",
  "description": "Тенденції відновлюваної енергетики 2026"
}

Поле dataUrl — це URL-адреса даних у кодуванні base64. Повертає 201 з метаданими документа.

Список документів у базі знань:

GET /v1/knowledge/bases/{id}/documents

Пошук у базі знань:

POST /v1/knowledge/bases/{id}/search
Content-Type: application/json

{ "query": "відновлювана енергетика" }

Повертає відповідні документи на основі імені файлу та опису. Семантичний (векторний) пошук з'явиться в майбутніх версіях.

Видалити документ або базу знань:

DELETE /v1/knowledge/bases/{id}/documents/{docId}
DELETE /v1/knowledge/bases/{id}

Експорт та імпорт агентів

Діліться агентами як портативними пакетами — між пристроями, командами або через Community Hub.

Експортувати агента:

POST /v1/agents/{id}/export

Повертає пакет JSON, що містить визначення агента, вимоги до інструментів (на основі увімкнених інструментів), вимоги до конекторів (які постачальники OAuth потрібні) та шаблони тригерів. Метадані синхронізації видаляються — пакет є чистим, автономним кресленням.

Імпортувати агента:

POST /v1/agents/import
Content-Type: application/json

{
  \"package\": {
    \"$schema\": \"caiioo.agent.package/v1\",
    \"agent\": {
      \"id\": \"shared-research-agent\",
      \"branding\": { \"name\": \"Research Agent\", \"description\": \"Від команди\" },
      \"defaultSettings\": { \"systemPrompt\": \"Ви досліджуєте речі.\" },
      \"settingLevels\": {}
    },
    \"toolRequirements\": [
      { \"toolId\": \"web_browsing\", \"enabled\": true },
      { \"toolId\": \"search_tools\", \"enabled\": true }
    ]
  }
}

Повертає 201 з інстальованим агентом. Конфлікти ID з вбудованими або існуючими агентами повертають 409.

Обробка помилок

API використовує стандартні коди стану HTTP:

Код Значення
200 Успіх
201 Створено
202 Прийнято (асинхронна операція розпочата)
204 Видалено (без контенту)
400 Невірний запит — перевірте поле error для деталей
401 Неавторизовано — відсутній або невірний секрет сесії
403 Заборонено — наприклад, спроба змінити вбудованого агента
404 Не знайдено
409 Конфлікт — наприклад, ID агента вже існує
422 Помилка валідації — введення не відповідає схемі інструмента
500 Помилка сервера — перевірте поле error
501 Не реалізовано — функція існує, але недоступна цим способом
503 Сервіс недоступний — сховище або провайдер не готові

Усі відповіді з помилками містять { "error": "людиночитане повідомлення" }.

Приклад швидкого старту

Ось повний робочий процес: створення агента, його запуск та стрімінг результатів.

# 1. Створення користувацького агента
curl -X POST http://localhost:3847/v1/agents \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "quick-summarizer",
    "branding": { "name": "Quick Summarizer" },
    "defaultSettings": {
      "systemPrompt": "Стисло підсумуй будь-яке введення у 3 пунктах.",
      "enabledTools": { "web_browsing": true }
    },
    "settingLevels": {}
  }'

# 2. Асинхронний запуск
RUN=$(curl -s -X POST http://localhost:3847/v1/runs \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{ \"agentId\": \"quick-summarizer\", \"input\": { \"message\": \"Підсумуй https://en.wikipedia.org/wiki/Artificial_intelligence\" }, \"mode\": \"async\" }")

RUN_ID=$(echo $RUN | jq -r '.runId')

# 3. Стрімінг подій
curl -N http://localhost:3847/v1/runs/$RUN_ID/events \
  -H "Authorization: Bearer $API_TOKEN"

# 4. Експорт агента для спільного використання
curl -X POST http://localhost:3847/v1/agents/quick-summarizer/export \
  -H "Authorization: Bearer $API_TOKEN"

This guide is maintained by the Caiioo team using Slate, our built-in editor.