API чата с агентом
В Santiago встроен AI-агент, который работает внутри демона: вы отправляете ему инструкцию на естественном языке, и он сам управляет запущенным профилем с помощью API автоматизации и скилла агента. На этой странице описана собственная HTTP-поверхность агента — проверка того, настроен ли LLM, сохранение API-ключа, стриминг чата как Server-Sent Events и управление историей по каждому профилю.
Все эндпоинты находятся под базовым адресом демона http://localhost:7891/api и используют стандартную обёртку: { "ok": true, "data": {...} } при успехе или { "ok": false, "error": { "code", "message" } } при ошибке. Демон слушает только localhost.
Сводка эндпоинтов
Заголовок раздела «Сводка эндпоинтов»| Метод | Путь | Назначение |
|---|---|---|
GET | /api/agent/status | Настроен ли LLM? Список доступных моделей. |
GET | /api/agent/api-key | Получить настроенный ключ для провайдера (замаскированный). |
POST | /api/agent/api-key | Установить API-ключ для провайдера. |
DELETE | /api/agent/api-key | Удалить API-ключ для провайдера. |
GET | /api/agent/:profileId/history | Прочитать сохранённые сообщения чата для профиля. |
POST | /api/agent/:profileId/chat | Отправить сообщение → SSE-стрим выполнения агента. |
POST | /api/agent/:profileId/stop | Прервать текущее выполнение агента. |
DELETE | /api/agent/:profileId | Очистить историю и уничтожить сессию. |
Провайдер по умолчанию — openai, если поле provider или query-параметр опущены.
Настройка ключа LLM
Заголовок раздела «Настройка ключа LLM»Прежде чем агент сможет работать, ему нужен API-ключ LLM. Ключи хранятся по каждому провайдеру в локальном хранилище авторизации демона, а не в профиле.
Проверка статуса
Заголовок раздела «Проверка статуса»GET /api/agent/status сообщает, настроен ли ключ хотя бы одного провайдера и какие модели доступны.
curl -s http://localhost:7891/api/agent/status | jq .data{ "configured": true, "models": [ { "provider": "openai", "id": "gpt-5", "name": "GPT-5" } ]}Когда ключ не задан, демон возвращает { "configured": false, "models": [] } — на этом эндпоинте он никогда не отдаёт ошибку.
Установка ключа
Заголовок раздела «Установка ключа»POST /api/agent/api-key сохраняет ключ для провайдера. Поле apiKey обязательно; пустое значение или значение из одних пробелов вернёт 400 BAD_REQUEST.
curl -s http://localhost:7891/api/agent/api-key -X POST \ -H 'Content-Type: application/json' -d '{ "provider": "openai", "apiKey": "sk-..." }'{ "ok": true }Получение ключа (замаскированного)
Заголовок раздела «Получение ключа (замаскированного)»GET /api/agent/api-key возвращает сохранённый ключ для провайдера, замаскированный до первых и последних четырёх символов. Передайте ?provider=, чтобы указать провайдера, отличного от значения по умолчанию.
curl -s "http://localhost:7891/api/agent/api-key?provider=openai" | jq .data{ "provider": "openai", "hasKey": true, "maskedKey": "sk-1…7f9c" }Если ключ не сохранён, hasKey равно false, а maskedKey равно null.
Удаление ключа
Заголовок раздела «Удаление ключа»curl -s "http://localhost:7891/api/agent/api-key?provider=openai" -X DELETE{ "ok": true }Чат с агентом (SSE)
Заголовок раздела «Чат с агентом (SSE)»POST /api/agent/:profileId/chat отправляет одно пользовательское сообщение и стримит выполнение агента обратно как Server-Sent Events. Профиль должен быть запущен — если это не так, демон отвечает 404 с PROFILE_NOT_RUNNING. Пустое message вернёт 400 BAD_REQUEST.
curl -N -s http://localhost:7891/api/agent/$PROFILE/chat -X POST \ -H 'Content-Type: application/json' -d '{ "message": "Go to example.com and tell me the page title" }'Флаг -N отключает буферизацию curl, чтобы вы видели события по мере их поступления. Ответ имеет Content-Type: text/event-stream; каждое событие — строка вида data: <json>\n\n.
Форматы SSE-событий
Заголовок раздела «Форматы SSE-событий»Каждая строка data: несёт JSON-объект с дискриминатором type. Это события, которые демон отправляет в ходе выполнения:
type | Поля | Значение |
|---|---|---|
tool_start | name, params | Агент начал вызов инструмента автоматизации (например, navigate, click). |
tool_end | name, ok | Этот вызов инструмента завершился; ok: false означает ошибку. |
text_delta | content | Фрагмент текстового ответа агента — соединяйте дельты по порядку. |
usage | input, output, total | Итоги по токенам, отправляются один раз после завершения выполнения. |
done | — | Агент завершил этот ход. |
error | message | Выполнение завершилось ошибкой; сообщение также сохраняется в истории. |
data: {"type":"tool_start","name":"navigate","params":{"url":"https://example.com"}}
data: {"type":"tool_end","name":"navigate","ok":true}
data: {"type":"tool_start","name":"snapshot","params":{}}
data: {"type":"tool_end","name":"snapshot","ok":true}
data: {"type":"text_delta","content":"The page title is "}
data: {"type":"text_delta","content":"\"Example Domain\"."}
data: {"type":"done"}
data: {"type":"usage","input":4821,"output":137,"total":4958}Остановка выполнения
Заголовок раздела «Остановка выполнения»Чтобы прервать долгий ход, вызовите эндпоинт остановки с тем же id профиля. Он возвращает, было ли прервано активное выполнение.
curl -s http://localhost:7891/api/agent/$PROFILE/stop -X POST | jq .data{ "aborted": true }История
Заголовок раздела «История»Каждый профиль хранит свою собственную историю чата в демоне. Сообщения сохраняются по мере общения — пользовательские сообщения, вызовы инструментов агентом, текст агента и любые ошибки.
Чтение истории
Заголовок раздела «Чтение истории»curl -s http://localhost:7891/api/agent/$PROFILE/history | jq .data{ "messages": [ { "type": "user", "content": "Go to example.com and tell me the page title" }, { "type": "tool", "content": "", "toolName": "navigate", "params": { "url": "https://example.com" } }, { "type": "agent", "content": "The page title is \"Example Domain\"." } ]}Поле type сообщения принимает одно из значений user, tool (несёт toolName и params), agent или error.
Очистка истории и завершение сессии
Заголовок раздела «Очистка истории и завершение сессии»DELETE /api/agent/:profileId очищает сохранённые сообщения и уничтожает находящуюся в памяти сессию агента для этого профиля. Следующий чат начинается с чистого листа (и заново подключает скилл).
curl -s http://localhost:7891/api/agent/$PROFILE -X DELETE{ "ok": true }| Статус | code | Когда |
|---|---|---|
400 | BAD_REQUEST | apiKey или message отсутствует/пустое. |
404 | PROFILE_NOT_RUNNING | Целевой профиль не запущен. |
500 | AGENT_ERROR | Не удалось создать сессию. |
500 | INTERNAL_ERROR | Сохранение или удаление ключа завершилось ошибкой. |
Сбои в середине стрима во время чата не являются HTTP-ошибками — соединение уже вернуло 200, поэтому сбой приходит как SSE-событие error.
Связанное
Заголовок раздела «Связанное»- Локальный HTTP API — базовые пути, обёртка и модель безопасности localhost.
- Установка скилла агента — запуск собственного агента поверх API автоматизации вместо встроенного.
- Справочник API — полный каталог действий автоматизации по каждому действию, которым управляет агент.
- Автономный режим — долгие сессии агента с заданной продолжительностью работы.