Данный документ является машинным переводом оригинальной английской версии. В случае любых расхождений между переводом и оригиналом на английском языке, приоритет имеет английская версия. Читать оригинал на английском языке
Публичный API
Caiioo включает в себя REST API, который позволяет управлять всем программно: запускать агентов, управлять инструментами, планировать задачи и многое другое. API работает на том же локальном сервере, который обслуживает десктопное приложение и браузерный мост.
Базовый URL: http://localhost:3847/v1
Аутентификация: Существует два способа аутентификации, оба регулируются переключателем API в настройках:
Для внешних потребителей (скрипты, интеграции, curl): Установите токен доступа к API в разделе Настройки > Доступ к API, затем используйте его как Bearer-токен:
curl -H "Authorization: Bearer ВАШ_API_TOKEN" http://localhost:3847/v1/providers
Для локального приложения (автоматически):
Десктопное приложение Caiioo, расширения для браузеров и мобильные приложения аутентифицируются автоматически через существующий заголовок авторизации реле (X-Relay-Auth). Ручная настройка не требуется — приложение обрабатывает это в фоновом режиме.
Настройка:
- Откройте Caiioo Настройки > Доступ к API
- Включите переключатель Включить публичный API
- Установите Токен доступа к API (любая строка на ваш выбор — относитесь к ней как к паролю)
- Используйте этот токен во всех запросах к 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, и они сохраняются между сессиями. 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 (пометка для синхронизации). Возвращает 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 на сервер и возвращает результат. Полезно для отладки или вызова методов, не представленных через 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 Schema инструмента для его входных параметров, чтобы вы могли провести валидацию перед вызовом.
Прямой вызов инструмента:
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 с их именами, категориями и областями доступа по умолчанию.
Список ваших подключенных аккаунтов:
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}
Ворклоу (Рабочие процессы)
Организуйте работу нескольких агентов в виде 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-пакет с определением агента, требованиями к инструментам, коннекторам и шаблонами триггеров. Метаданные синхронизации удаляются — пакет представляет собой чистый чертеж.
Импорт агента:
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.