Dropstone Docs

SDK

Типобезопасный JS клиент для сервера dropstone.

Dropstone JS/TS SDK предоставляет типобезопасный клиент для взаимодействия с локальным агентом Dropstone. Он запускает dropstone serve как подпроцесс и дает вам типизированный HTTP клиент, указывающий на него.

Нужен доступ к headless API в CI?:

Для чистого программного использования (CI конвейеры, автоматизация, serverless), предпочитайте HTTP API с DROPSTONE_API_KEY. SDK на этой странице предназначен для встраивания интерактивного агента в Node процесс, где CLI бинарный файл установлен рядом.

Смотрите страницу Server для информации о том, как работает базовый HTTP API.


Установка

Установите SDK из npm:

npm install @blankline/dropstone-sdk

Создание клиента

Создайте экземпляр dropstone:

import { createDropstone } from "@blankline/dropstone-sdk"

const { client } = await createDropstone()

Это запускает как сервер, так и клиент

Опции

ОпцияТипОписаниеПо умолчанию
hostnamestringИмя хоста сервера127.0.0.1
portnumberПорт сервера4096
signalAbortSignalСигнал отмены для отменыundefined
timeoutnumberТайм-аут в мс для запуска сервера5000
configConfigОбъект конфигурации{}

Конфигурация

Вы можете передать объект конфигурации для настройки поведения. Экземпляр все еще подхватывает ваш dropstone.json, но вы можете переопределить или добавить конфигурацию встроенно:

import { createDropstone } from "@blankline/dropstone-sdk"

const dropstone = await createDropstone({
  hostname: "127.0.0.1",
  port: 4096,
  config: {
    model: "dropstone/dropstone-pro",
  },
})

console.log(`Server running at ${dropstone.server.url}`)

dropstone.server.close()

Только клиент

Если у вас уже есть запущенный экземпляр dropstone, вы можете создать экземпляр клиента для подключения к нему:

import { createDropstoneClient } from "@blankline/dropstone-sdk"

const client = createDropstoneClient({
  baseUrl: "http://localhost:4096",
})

Опции

ОпцияТипОписаниеПо умолчанию
baseUrlstringURL сервераhttp://localhost:4096
fetchfunctionПользовательская реализация fetchglobalThis.fetch
parseAsstringМетод парсинга ответаauto
responseStylestringСтиль возврата: data или fieldsfields
throwOnErrorbooleanВыбросить ошибки вместо возвратаfalse

Типы

SDK включает определения TypeScript для всех типов API. Импортируйте их напрямую:

import type { Session, Message, Part } from "@blankline/dropstone-sdk"

Все типы генерируются из спецификации OpenAPI сервера, поэтому имена, которые вы видите в TypeScript, соответствуют один-к-одному формам запроса и ответа сервера.


Ошибки

SDK может выбросить ошибки, которые вы можете перехватить и обработать:

try {
  await client.session.get({ path: { id: "invalid-id" } })
} catch (error) {
  console.error("Failed to get session:", (error as Error).message)
}

Структурированный вывод

Вы можете запросить структурированный JSON вывод от модели, указав format с JSON схемой. Модель будет использовать инструмент StructuredOutput для возврата валидированного JSON, соответствующего вашей схеме.

Базовое использование

const result = await client.session.prompt({
  path: { id: sessionId },
  body: {
    parts: [{ type: "text", text: "Research Dropstone and provide company info" }],
    format: {
      type: "json_schema",
      schema: {
        type: "object",
        properties: {
          company: { type: "string", description: "Company name" },
          founded: { type: "number", description: "Year founded" },
          products: {
            type: "array",
            items: { type: "string" },
            description: "Main products",
          },
        },
        required: ["company", "founded"],
      },
    },
  },
})

// Access the structured output
console.log(result.data.info.structured_output)
// { company: "Dropstone", founded: 2024, products: ["Dropstone CLI"] }

Типы формата вывода

ТипОписание
textПо умолчанию. Стандартный текстовый ответ (без структурированного вывода)
json_schemaВозвращает валидированный JSON, соответствующий предоставленной схеме

Формат JSON Schema

При использовании type: 'json_schema', предоставьте:

ПолеТипОписание
type'json_schema'Обязательно. Указывает режим JSON schema
schemaobjectОбязательно. Объект JSON Schema, определяющий структуру вывода
retryCountnumberОпционально. Количество попыток валидации (по умолчанию: 2)

Обработка ошибок

Если модель не может создать валидный структурированный вывод после всех повторных попыток, ответ будет включать StructuredOutputError:

if (result.data.info.error?.name === "StructuredOutputError") {
  console.error("Failed to produce structured output:", result.data.info.error.message)
  console.error("Attempts:", result.data.info.error.retries)
}

Лучшие практики

  1. Предоставляйте четкие описания в свойствах вашей схемы, чтобы помочь модели понять, какие данные извлекать
  2. Используйте required для указания, какие поля должны быть присутствующими
  3. Держите схемы сфокусированными - сложные вложенные схемы могут быть сложнее для модели
  4. Установите подходящий retryCount - увеличьте для сложных схем, уменьшите для простых

APIs

SDK предоставляет все API сервера через типобезопасный клиент.


Global

МетодОписаниеОтвет
global.health()Проверить здоровье и версию сервера{ healthy: true, version: string }

Примеры

const health = await client.global.health()
console.log(health.data.version)

App

МетодОписаниеОтвет
app.log()Написать запись логовboolean
app.agents()Список всех доступных агентовAgent[]

Примеры

// Write a log entry
await client.app.log({
  body: {
    service: "my-app",
    level: "info",
    message: "Operation completed",
  },
})

// List available agents
const agents = await client.app.agents()

Project

МетодОписаниеОтвет
project.list()Список всех проектовProject[]
project.current()Получить текущий проектProject

Примеры

// List all projects
const projects = await client.project.list()

// Get current project
const currentProject = await client.project.current()

Path

МетодОписаниеОтвет
path.get()Получить текущий путьPath

Примеры

// Get current path information
const pathInfo = await client.path.get()

Config

МетодОписаниеОтвет
config.get()Получить конфигConfig

Примеры

const config = await client.config.get()

Sessions

МетодОписаниеПримечания
session.list()Список сессийВозвращает Session[]
session.get({ path })Получить сессиюВозвращает Session
session.children({ path })Список дочерних сессийВозвращает Session[]
session.create({ body })Создать сессиюВозвращает Session
session.delete({ path })Удалить сессиюВозвращает boolean
session.update({ path, body })Обновить свойства сессииВозвращает Session
session.init({ path, body })Анализировать приложение и создать AGENTS.mdВозвращает boolean
session.abort({ path })Отменить запущенную сессиюВозвращает boolean
session.summarize({ path, body })Суммировать сессиюВозвращает boolean
session.messages({ path })Список сообщений в сессииВозвращает { info: Message, parts: Part[]}[]
session.message({ path })Получить детали сообщенияВозвращает { info: Message, parts: Part[]}
session.prompt({ path, body })Отправить сообщение с подсказкойbody.noReply: true возвращает UserMessage (только контекст). По умолчанию возвращает AssistantMessage с ответом AI. Поддерживает body.outputFormat для структурированного вывода
session.command({ path, body })Отправить команду в сессиюВозвращает { info: AssistantMessage, parts: Part[]}
session.shell({ path, body })Запустить команду shellВозвращает AssistantMessage
session.revert({ path, body })Отменить сообщениеВозвращает Session
session.unrevert({ path })Восстановить отмененные сообщенияВозвращает Session
postSessionByIdPermissionsByPermissionId({ path, body })Ответить на запрос разрешенияВозвращает boolean

Примеры

// Create and manage sessions
const session = await client.session.create({
  body: { title: "My session" },
})

const sessions = await client.session.list()

// Send a prompt message
const result = await client.session.prompt({
  path: { id: session.id },
  body: {
    model: { providerID: "dropstone", modelID: "dropstone-pro" },
    parts: [{ type: "text", text: "Hello!" }],
  },
})

// Inject context without triggering AI response (useful for plugins)
await client.session.prompt({
  path: { id: session.id },
  body: {
    noReply: true,
    parts: [{ type: "text", text: "You are a helpful assistant." }],
  },
})

Files

МетодОписаниеОтвет
find.text({ query })Поиск текста в файлахМассив объектов совпадений с path, lines, line_number, absolute_offset, submatches
find.files({ query })Найти файлы и директории по имениstring[] (пути)
find.symbols({ query })Найти символы рабочего пространстваSymbol[]
file.read({ query })Прочитать файл{ type: "raw" | "patch", content: string }
file.status({ query? })Получить статус отслеживаемых файловFile[]

find.files поддерживает несколько опциональных полей запроса:

  • type: "file" или "directory"
  • directory: переопределить корень проекта для поиска
  • limit: максимум результатов (1–200)

Примеры

// Search and read files
const textResults = await client.find.text({
  query: { pattern: "function.*dropstone" },
})

const files = await client.find.files({
  query: { query: "*.ts", type: "file" },
})

const directories = await client.find.files({
  query: { query: "packages", type: "directory", limit: 20 },
})

const content = await client.file.read({
  query: { path: "src/index.ts" },
})

Auth

МетодОписаниеОтвет
auth.set({ ... })Установить учетные данные аутентификацииboolean

Примеры

await client.auth.set({
  path: { id: "dropstone" },
  body: { type: "api", key: "your-dropstone-api-key" },
})

Events

МетодОписаниеОтвет
event.subscribe()Поток событий, отправляемых серверомПоток событий, отправляемых сервером

Примеры

// Listen to real-time events
const events = await client.event.subscribe()
for await (const event of events.stream) {
  console.log("Event:", event.type, event.properties)
}
Ctrl+I