Сервер
Взаимодействие с сервером Dropstone по HTTP.
Команда dropstone serve запускает автономный HTTP-сервер, который предоставляет конечную точку OpenAPI, которую может использовать клиент Dropstone.
Использование
dropstone serve [--port <number>] [--hostname <string>] [--cors <origin>]
Параметры
| Флаг | Описание | По умолчанию |
|---|---|---|
--port | Порт для прослушивания | 4096 |
--hostname | Имя хоста для прослушивания | 127.0.0.1 |
--mdns | Включить обнаружение mDNS | false |
--mdns-domain | Пользовательское доменное имя для службы mDNS | dropstone.local |
--cors | Дополнительные источники браузера для разрешения | [] |
--cors можно передавать несколько раз:
dropstone serve --cors http://localhost:5173 --cors https://app.example.com
Аутентификация
Установите DROPSTONE_SERVER_PASSWORD, чтобы защитить сервер с помощью базовой HTTP-аутентификации. Имя пользователя по умолчанию — dropstone, либо установите DROPSTONE_SERVER_USERNAME, чтобы переопределить его. Это применимо как к dropstone serve, так и к dropstone web.
DROPSTONE_SERVER_PASSWORD=your-password dropstone serve
Учетные данные агента
DROPSTONE_SERVER_PASSWORD защищает сам сервер. Он не сообщает агенту, как связаться с Dropstone. На машине без присмотра нет авторизованной учетной записи для наследования, поэтому передайте ключ API через конфигурацию провайдера:
{
"provider": {
"dropstone": {
"options": {
"apiKey": "dsk_live_...",
"baseURL": "https://api.dropstone.io/api/v1"
}
}
}
}
baseURL имеет значение. Ключи API принимаются по адресу /api/v1, а не /v1, и ключ, отправленный на /v1, отклоняется с ошибкой 403 Invalid token format. Please log in again. Установите его здесь, а не через DROPSTONE_BASE_URL, который также используется для создания конечных точек учетной записи, использования и памяти, и сломает их, если вы укажете его на версионированный путь.
Сгенерируйте ключ на dropstone.io/dashboard/settings.
Note
Агент build по умолчанию спрашивает перед каждым вызовом инструмента. Здесь ничто не может ответить на этот запрос, поэтому запрос зависает, а не завершается ошибкой. Либо отправьте "agent": "accept all", либо задайте явный список разрешений. См. Разрешения.
Отправка запроса
POST /session/:id/message требует оба параметра agent и model. Если опустить model, значение по умолчанию не определяется: ход возвращает 200 с пустым телом, и ничего не выполняется.
curl -X POST "http://127.0.0.1:4096/session/$SID/message?directory=$PWD" \
-H "Content-Type: application/json" \
-d '{
"agent": "build",
"model": { "providerID": "dropstone", "modelID": "dropstone-pro" },
"parts": [{ "type": "text", "text": "Add error handling to src/index.ts" }]
}'
Ход, завершившийся ошибкой, всё равно возвращает 200. Причина находится в data.info.error, а не на транспортном уровне, поэтому проверяйте это поле, а не полагайтесь на код состояния.
Как это работает
dropstone serve предоставляет возможности Dropstone через конечную точку HTTP OpenAPI 3.1. Та же конечная точка используется для генерации SDK.
Используйте сервер, когда хотите управлять Dropstone программно: из скрипта, конвейера CI или собственной интеграции. Интерактивный сеанс и сервер независимы. Запуск dropstone serve создает новый автономный сервер независимо от того, открыт ли у вас интерактивный сеанс.
Вы можете переопределить адрес привязки с помощью флагов --hostname и --port.
Спецификация
Сервер публикует спецификацию OpenAPI 3.1, которую можно просмотреть по адресу:
http://<hostname>:<port>/doc
Например, http://localhost:4096/doc. Используйте спецификацию для генерации клиентов или проверки типов запросов и ответов. Или просмотрите её в обозревателе Swagger.
API
Сервер Dropstone предоставляет следующие API.
Глобальные
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /global/health | Получить состояние и версию сервера | { healthy: true, version: string } |
GET | /global/event | Получить глобальные события (поток SSE) | Поток событий |
Проект
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /project | Список всех проектов | Project[] |
GET | /project/current | Получить текущий проект | Project |
Путь и VCS
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /path | Получить текущий путь | Path |
GET | /vcs | Получить информацию VCS для текущего проекта | VcsInfo |
Конфигурация
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /config | Получить информацию о конфигурации | Config |
PATCH | /config | Обновить конфигурацию | Config |
Сеансы
| Метод | Путь | Описание | Примечания |
|---|---|---|---|
GET | /session | Список всех сеансов | Возвращает Session[] |
POST | /session | Создать новый сеанс | тело: { parentID?, title? }, возвращает Session |
GET | /session/status | Получить статус сеансов для всех сеансов | Возвращает { [sessionID: string]: SessionStatus } |
GET | /session/:id | Получить сведения о сеансе | Возвращает Session |
DELETE | /session/:id | Удалить сеанс и все его данные | Возвращает boolean |
PATCH | /session/:id | Обновить свойства сеанса | тело: { title? }, возвращает Session |
GET | /session/:id/children | Получить дочерние сеансы сеанса | Возвращает Session[] |
GET | /session/:id/todo | Получить список задач для сеанса | Возвращает Todo[] |
POST | /session/:id/init | Проанализировать приложение и создать AGENTS.md | тело: { messageID, providerID, modelID }, возвращает boolean |
POST | /session/:id/fork | Разветвить существующий сеанс на сообщении | тело: { messageID? }, возвращает Session |
POST | /session/:id/abort | Прервать выполняющийся сеанс | Возвращает boolean |
GET | /session/:id/diff | Получить diff для этого сеанса | запрос: messageID?, возвращает FileDiff[] |
POST | /session/:id/summarize | Суммировать сеанс | тело: { providerID, modelID }, возвращает boolean |
POST | /session/:id/revert | Откатить сообщение | тело: { messageID, partID? }, возвращает boolean |
POST | /session/:id/unrevert | Восстановить все откаченные сообщения | Возвращает boolean |
POST | /session/:id/permissions/:permissionID | Ответить на запрос разрешения | тело: { response, remember? }, возвращает boolean |
Сообщения
| Метод | Путь | Описание | Примечания |
|---|---|---|---|
GET | /session/:id/message | Список сообщений в сеансе | запрос: limit?, возвращает { info: Message, parts: Part[]}[] |
POST | /session/:id/message | Отправить сообщение и дождаться ответа | тело: { messageID?, model?, agent?, noReply?, system?, tools?, parts }, возвращает { info: Message, parts: Part[]} |
GET | /session/:id/message/:messageID | Получить сведения о сообщении | Возвращает { info: Message, parts: Part[]} |
POST | /session/:id/prompt_async | Отправить сообщение асинхронно (без ожидания) | тело: как у /session/:id/message, возвращает 204 No Content |
POST | /session/:id/command | Выполнить слэш-команду | тело: { messageID?, agent?, model?, command, arguments }, возвращает { info: Message, parts: Part[]} |
POST | /session/:id/shell | Выполнить команду оболочки | тело: { agent, model?, command }, возвращает { info: Message, parts: Part[]} |
Команды
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /command | Список всех команд | Command[] |
Файлы
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /find?pattern=<pat> | Поиск текста в файлах | Массив объектов совпадений с path, lines, line_number, absolute_offset, submatches |
GET | /find/file?query=<q> | Поиск файлов и каталогов по имени | string[] (пути) |
GET | /find/symbol?query=<q> | Поиск символов рабочей области | Symbol[] |
GET | /file?path=<path> | Список файлов и каталогов | FileNode[] |
GET | /file/content?path=<p> | Чтение файла | FileContent |
GET | /file/status | Получить статус отслеживаемых файлов | File[] |
Параметры запроса /find/file
query(обязательный): строка поиска (нечеткое совпадение)type(необязательный): ограничить результаты"file"или"directory"directory(необязательный): переопределить корень проекта для поискаlimit(необязательный): максимум результатов (1–200)dirs(необязательный): устаревший флаг ("false"возвращает только файлы)
LSP, форматтеры и MCP
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /lsp | Получить статус LSP-сервера | LSPStatus[] |
GET | /formatter | Получить статус форматтера | FormatterStatus[] |
GET | /mcp | Получить статус MCP-сервера | { [name: string]: MCPStatus } |
POST | /mcp | Добавить MCP-сервер динамически | тело: { name, config }, возвращает объект статуса MCP |
Агенты
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /agent | Список всех доступных агентов | Agent[] |
Журналирование
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
POST | /log | Записать запись журнала. Тело: { service, level, message, extra? } | boolean |
Аутентификация
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
PUT | /auth/:id | Установить учетные данные аутентификации для указанной цели. | boolean |
События
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /event | Поток событий, отправляемых сервером. Первое событие — server.connected, затем события шины | Поток событий, отправляемых сервером |
Документация
| Метод | Путь | Описание | Ответ |
|---|---|---|---|
GET | /doc | Спецификация OpenAPI 3.1 | HTML-страница со спецификацией OpenAPI |