Dropstone Docs

SDK

Cliente JS type-safe para servidor dropstone.

O SDK JS/TS do Dropstone fornece um cliente type-safe para interagir com um agente Dropstone local. Ele inicia dropstone serve como um subprocess e oferece um cliente HTTP tipado apontando para ele.

Precisa de acesso à API headless em CI?:

Para uso puramente programático (pipelines de CI, automação, serverless), prefira a HTTP API com uma DROPSTONE_API_KEY. O SDK nesta página é destinado para incorporar o agente interativo em um processo Node onde o binário da CLI está instalado junto.

Veja a página Server para entender como a API HTTP subjacente funciona.


Instalar

Instale o SDK do npm:

npm install @blankline/dropstone-sdk

Criar cliente

Crie uma instância do dropstone:

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

const { client } = await createDropstone()

Isso inicia tanto um servidor quanto um cliente

Opções

OpçãoTipoDescriçãoPadrão
hostnamestringHostname do servidor127.0.0.1
portnumberPorta do servidor4096
signalAbortSignalSinal de aborto para cancelamentoundefined
timeoutnumberTimeout em ms para iniciar servidor5000
configConfigObjeto de configuração{}

Config

Você pode passar um objeto de configuração para personalizar o comportamento. A instância ainda pega seu dropstone.json, mas você pode sobrescrever ou adicionar configuração inline:

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()

Apenas cliente

Se você já tem uma instância do dropstone em execução, você pode criar uma instância de cliente para se conectar a ela:

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

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

Opções

OpçãoTipoDescriçãoPadrão
baseUrlstringURL do servidorhttp://localhost:4096
fetchfunctionImplementação fetch customizadaglobalThis.fetch
parseAsstringMétodo de parsing de respostaauto
responseStylestringEstilo de retorno: data ou fieldsfields
throwOnErrorbooleanLançar erros em vez de retornarfalse

Tipos

O SDK inclui definições TypeScript para todos os tipos de API. Importe-os diretamente:

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

Todos os tipos são gerados a partir da especificação OpenAPI do servidor, então os nomes que você vê em TypeScript mapeiam um-para-um para as formas de servidor de requisição e resposta.


Erros

O SDK pode lançar erros que você pode capturar e tratar:

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

Saída Estruturada

Você pode solicitar saída JSON estruturada do modelo especificando um format com um schema JSON. O modelo usará uma ferramenta StructuredOutput para retornar JSON validado correspondendo ao seu schema.

Uso Básico

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"] }

Tipos de Formato de Saída

TipoDescrição
textPadrão. Resposta de texto padrão (sem saída estruturada)
json_schemaRetorna JSON validado correspondendo ao schema fornecido

Formato JSON Schema

Ao usar type: 'json_schema', forneça:

CampoTipoDescrição
type'json_schema'Obrigatório. Especifica modo de schema JSON
schemaobjectObrigatório. Objeto JSON Schema definindo a estrutura de saída
retryCountnumberOpcional. Número de tentativas de validação (padrão: 2)

Tratamento de Erros

Se o modelo falhar em produzir saída estruturada válida após todas as tentativas, a resposta incluirá um 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)
}

Melhores Práticas

  1. Forneça descrições claras nas propriedades do seu schema para ajudar o modelo a entender quais dados extrair
  2. Use required para especificar quais campos devem estar presentes
  3. Mantenha schemas focados - schemas aninhados complexos podem ser mais difíceis para o modelo preencher corretamente
  4. Defina retryCount apropriado - aumente para schemas complexos, diminua para simples

APIs

O SDK expõe todas as APIs do servidor através de um cliente type-safe.


Global

MétodoDescriçãoResposta
global.health()Verificar saúde e versão do servidor{ healthy: true, version: string }

Exemplos

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

App

MétodoDescriçãoResposta
app.log()Escrever uma entrada de logboolean
app.agents()Listar todos os agentes disponíveisAgent[]

Exemplos

// 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

MétodoDescriçãoResposta
project.list()Listar todos os projetosProject[]
project.current()Obter projeto atualProject

Exemplos

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

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

Path

MétodoDescriçãoResposta
path.get()Obter caminho atualPath

Exemplos

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

Config

MétodoDescriçãoResposta
config.get()Obter informações de configConfig

Exemplos

const config = await client.config.get()

Sessions

MétodoDescriçãoNotas
session.list()Listar sessõesRetorna Session[]
session.get({ path })Obter sessãoRetorna Session
session.children({ path })Listar sessões filhasRetorna Session[]
session.create({ body })Criar sessãoRetorna Session
session.delete({ path })Deletar sessãoRetorna boolean
session.update({ path, body })Atualizar propriedades da sessãoRetorna Session
session.init({ path, body })Analisar app e criar AGENTS.mdRetorna boolean
session.abort({ path })Abortar uma sessão em execuçãoRetorna boolean
session.summarize({ path, body })Resumir sessãoRetorna boolean
session.messages({ path })Listar mensagens em uma sessãoRetorna { info: Message, parts: Part[]}[]
session.message({ path })Obter detalhes da mensagemRetorna { info: Message, parts: Part[]}
session.prompt({ path, body })Enviar mensagem de promptbody.noReply: true retorna UserMessage (apenas contexto). Padrão retorna AssistantMessage com resposta de IA. Suporta body.outputFormat para saída estruturada
session.command({ path, body })Enviar comando para sessãoRetorna { info: AssistantMessage, parts: Part[]}
session.shell({ path, body })Executar um comando shellRetorna AssistantMessage
session.revert({ path, body })Reverter uma mensagemRetorna Session
session.unrevert({ path })Restaurar mensagens revertidasRetorna Session
postSessionByIdPermissionsByPermissionId({ path, body })Responder a uma solicitação de permissãoRetorna boolean

Exemplos

// 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

MétodoDescriçãoResposta
find.text({ query })Pesquisar texto em arquivosArray de objetos de correspondência com path, lines, line_number, absolute_offset, submatches
find.files({ query })Encontrar arquivos e diretórios por nomestring[] (caminhos)
find.symbols({ query })Encontrar símbolos do workspaceSymbol[]
file.read({ query })Ler um arquivo{ type: "raw" | "patch", content: string }
file.status({ query? })Obter status para arquivos rastreadosFile[]

find.files suporta alguns campos de query opcionais:

  • type: "file" ou "directory"
  • directory: sobrescrever a raiz do projeto para a busca
  • limit: máximo de resultados (1–200)

Exemplos

// 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

MétodoDescriçãoResposta
auth.set({ ... })Definir credenciais de autenticaçãoboolean

Exemplos

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

Events

MétodoDescriçãoResposta
event.subscribe()Fluxo de eventos enviados pelo servidorFluxo de eventos enviados pelo servidor

Exemplos

// 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