Dropstone Docs

SDK

Type-sicherer JS-Client für Dropstone-Server.

Das Dropstone JS/TS SDK bietet einen type-sicheren Client für die Interaktion mit einem lokalen Dropstone-Agent. Es startet dropstone serve als Unterprozess und gibt dir einen typisierten HTTP-Client, der darauf verweist.

Benötigst du Headless-API-Zugriff in CI?:

Für reine programmgesteuerte Nutzung (CI-Pipelines, Automatisierung, Serverless) bevorzuge die HTTP API mit einem DROPSTONE_API_KEY. Das SDK auf dieser Seite ist für die Einbettung des interaktiven Agenten in einem Node-Prozess gedacht, in dem die CLI-Binärdatei installiert ist.

Siehe die Seite Server für Informationen zur zugrunde liegenden HTTP API.


Installation

Installiere das SDK von npm:

npm install @blankline/dropstone-sdk

Client erstellen

Erstelle eine Instanz von Dropstone:

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

const { client } = await createDropstone()

Dies startet sowohl einen Server als auch einen Client

Optionen

OptionTypBeschreibungStandard
hostnamestringServer-Hostname127.0.0.1
portnumberServer-Port4096
signalAbortSignalAbort-Signal für Abbruchundefined
timeoutnumberTimeout in ms für Server-Start5000
configConfigKonfigurationsobjekt{}

Konfiguration

Du kannst ein Konfigurationsobjekt übergeben, um das Verhalten anzupassen. Die Instanz nimmt immer noch deine dropstone.json auf, aber du kannst die Konfiguration inline überschreiben oder hinzufügen:

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

Nur Client

Wenn du bereits eine laufende Instanz von Dropstone hast, kannst du eine Client-Instanz erstellen, um dich damit zu verbinden:

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

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

Optionen

OptionTypBeschreibungStandard
baseUrlstringURL des Servershttp://localhost:4096
fetchfunctionBenutzerdefinierte Fetch-ImplementierungglobalThis.fetch
parseAsstringResponse-Parsing-Methodeauto
responseStylestringRückgabestil: data oder fieldsfields
throwOnErrorbooleanFehler werfen statt zurückgebenfalse

Typen

Das SDK enthält TypeScript-Definitionen für alle API-Typen. Importiere sie direkt:

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

Alle Typen werden aus der OpenAPI-Spezifikation des Servers generiert, daher entsprechen die Namen, die du in TypeScript siehst, eins-zu-eins den Server Request- und Response-Formen.


Fehler

Das SDK kann Fehler werfen, die du abfangen und behandeln kannst:

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

Strukturierte Ausgabe

Du kannst strukturierte JSON-Ausgabe vom Modell anfordern, indem du ein format mit einem JSON-Schema angibst. Das Modell wird ein StructuredOutput-Tool verwenden, um validiertes JSON zu zurückzugeben, das deinem Schema entspricht.

Grundlegende Verwendung

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

Ausgabeformat-Typen

TypBeschreibung
textStandard. Standardtextantwort (keine strukturierte Ausgabe)
json_schemaGibt validiertes JSON zurück, das dem bereitgestellten Schema entspricht

JSON-Schema-Format

Bei Verwendung von type: 'json_schema' stelle folgendes bereit:

FeldTypBeschreibung
type'json_schema'Erforderlich. Gibt den JSON-Schema-Modus an
schemaobjectErforderlich. JSON-Schema-Objekt, das die Ausgabestruktur definiert
retryCountnumberOptional. Anzahl der Validierungsversuche (Standard: 2)

Fehlerbehandlung

Wenn das Modell nach allen Versuchen keine gültige strukturierte Ausgabe erzeugt, enthält die Antwort einen 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)
}

Best Practices

  1. Gib klare Beschreibungen in deinen Schema-Eigenschaften an, um dem Modell zu helfen, zu verstehen, welche Daten extrahiert werden sollen
  2. Verwende required, um anzugeben, welche Felder vorhanden sein müssen
  3. Halte Schemas fokussiert – komplexe verschachtelte Schemas können für das Modell schwieriger auszufüllen sein
  4. Setze einen angemessenen retryCount – erhöhe ihn für komplexe Schemas, verringere ihn für einfache

APIs

Das SDK stellt alle Server-APIs über einen type-sicheren Client bereit.


Global

MethodeBeschreibungAntwort
global.health()Überprüfe Server-Gesundheit und Version{ healthy: true, version: string }

Beispiele

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

App

MethodeBeschreibungAntwort
app.log()Schreibe einen Log-Eintragboolean
app.agents()Liste alle verfügbaren Agenten aufAgent[]

Beispiele

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

Projekt

MethodeBeschreibungAntwort
project.list()Liste alle Projekte aufProject[]
project.current()Hole aktuelles ProjektProject

Beispiele

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

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

Pfad

MethodeBeschreibungAntwort
path.get()Hole aktuellen PfadPath

Beispiele

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

Konfiguration

MethodeBeschreibungAntwort
config.get()Hole KonfigurationConfig

Beispiele

const config = await client.config.get()

Sitzungen

MethodeBeschreibungHinweise
session.list()Liste Sitzungen aufGibt Session[] zurück
session.get({ path })Hole SitzungGibt Session zurück
session.children({ path })Liste untergeordnete Sitzungen aufGibt Session[] zurück
session.create({ body })Erstelle SitzungGibt Session zurück
session.delete({ path })Lösche SitzungGibt boolean zurück
session.update({ path, body })Aktualisiere SitzungseigenschaftenGibt Session zurück
session.init({ path, body })Analysiere App und erstelle AGENTS.mdGibt boolean zurück
session.abort({ path })Breche laufende Sitzung abGibt boolean zurück
session.summarize({ path, body })Fasse Sitzung zusammenGibt boolean zurück
session.messages({ path })Liste Nachrichten in einer Sitzung aufGibt { info: Message, parts: Part[]}[] zurück
session.message({ path })Hole NachrichtendetailsGibt { info: Message, parts: Part[]} zurück
session.prompt({ path, body })Sende Prompt-Nachrichtbody.noReply: true gibt UserMessage (nur Kontext) zurück. Standard gibt AssistantMessage mit KI-Antwort zurück. Unterstützt body.outputFormat für strukturierte Ausgabe
session.command({ path, body })Sende Befehl an SitzungGibt { info: AssistantMessage, parts: Part[]} zurück
session.shell({ path, body })Führe Shell-Befehl ausGibt AssistantMessage zurück
session.revert({ path, body })Mache Nachricht rückgängigGibt Session zurück
session.unrevert({ path })Stelle rückgängig gemachte Nachrichten wieder herGibt Session zurück
postSessionByIdPermissionsByPermissionId({ path, body })Antworte auf BerechtigungsanfrageGibt boolean zurück

Beispiele

// 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." }],
  },
})

Dateien

MethodeBeschreibungAntwort
find.text({ query })Suche nach Text in DateienArray von Match-Objekten mit path, lines, line_number, absolute_offset, submatches
find.files({ query })Finde Dateien und Verzeichnisse nach Namestring[] (Pfade)
find.symbols({ query })Finde Workspace-SymboleSymbol[]
file.read({ query })Lese eine Datei{ type: "raw" | "patch", content: string }
file.status({ query? })Hole Status für verfolgten DateienFile[]

find.files unterstützt einige optionale Query-Felder:

  • type: "file" oder "directory"
  • directory: Überschreibe das Projektstammverzeichnis für die Suche
  • limit: maximale Ergebnisse (1–200)

Beispiele

// 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" },
})

Authentifizierung

MethodeBeschreibungAntwort
auth.set({ ... })Setze Authentifizierungsanmeldedatenboolean

Beispiele

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

Ereignisse

MethodeBeschreibungAntwort
event.subscribe()Server-Sent-Events-StreamServer-Sent-Events-Stream

Beispiele

// 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)
}
Strg+I