Dropstone Docs

SDK

Client JS/TS type-safe pour serveur dropstone.

Le SDK JS/TS Dropstone fournit un client type-safe pour interagir avec un agent Dropstone local. Il lance dropstone serve en tant que sous-processus et vous donne un client HTTP typé pointant vers celui-ci.

Besoin d'accès API headless en CI ?:

Pour une utilisation purement programmatique (pipelines CI, automatisation, serverless), préférez l'API HTTP avec une DROPSTONE_API_KEY. Le SDK sur cette page est destiné à l'intégration de l'agent interactif dans un processus Node où le binaire CLI est installé à côté.

Consultez la page Server pour savoir comment fonctionne l'API HTTP sous-jacente.


Installation

Installez le SDK depuis npm :

npm install @blankline/dropstone-sdk

Créer un client

Créez une instance de dropstone :

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

const { client } = await createDropstone()

Cela démarre à la fois un serveur et un client

Options

OptionTypeDescriptionPar défaut
hostnamestringNom d'hôte du serveur127.0.0.1
portnumberPort du serveur4096
signalAbortSignalSignal d'abandon pour annulerundefined
timeoutnumberDélai d'attente en ms pour le démarrage du serveur5000
configConfigObjet de configuration{}

Configuration

Vous pouvez passer un objet de configuration pour personnaliser le comportement. L'instance récupère toujours votre dropstone.json, mais vous pouvez remplacer ou ajouter une configuration en ligne :

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

Client uniquement

Si vous avez déjà une instance de dropstone en cours d'exécution, vous pouvez créer une instance client pour vous y connecter :

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

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

Options

OptionTypeDescriptionPar défaut
baseUrlstringURL du serveurhttp://localhost:4096
fetchfunctionImplémentation fetch personnaliséeglobalThis.fetch
parseAsstringMéthode d'analyse de réponseauto
responseStylestringStyle de retour : data ou fieldsfields
throwOnErrorbooleanLever les erreurs au lieu de les retournerfalse

Types

Le SDK inclut des définitions TypeScript pour tous les types d'API. Importez-les directement :

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

Tous les types sont générés à partir de la spécification OpenAPI du serveur, donc les noms que vous voyez dans TypeScript correspondent un-à-un aux formes de requête et de réponse du serveur.


Erreurs

Le SDK peut lever des erreurs que vous pouvez attraper et gérer :

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

Sortie structurée

Vous pouvez demander une sortie JSON structurée du modèle en spécifiant un format avec un schéma JSON. Le modèle utilisera un outil StructuredOutput pour retourner du JSON validé correspondant à votre schéma.

Utilisation de base

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

Types de format de sortie

TypeDescription
textPar défaut. Réponse textuelle standard (pas de sortie structurée)
json_schemaRetourne du JSON validé correspondant au schéma fourni

Format de schéma JSON

Lors de l'utilisation de type: 'json_schema', fournissez :

ChampTypeDescription
type'json_schema'Requis. Spécifie le mode schéma JSON
schemaobjectRequis. Objet JSON Schema définissant la structure de sortie
retryCountnumberOptionnel. Nombre de tentatives de validation (par défaut : 2)

Gestion des erreurs

Si le modèle ne parvient pas à produire une sortie structurée valide après toutes les tentatives, la réponse inclura une 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)
}

Bonnes pratiques

  1. Fournissez des descriptions claires dans les propriétés de votre schéma pour aider le modèle à comprendre quelles données extraire
  2. Utilisez required pour spécifier les champs qui doivent être présents
  3. Gardez les schémas ciblés - les schémas imbriqués complexes peuvent être plus difficiles à remplir correctement pour le modèle
  4. Définissez un retryCount approprié - augmentez pour les schémas complexes, diminuez pour les schémas simples

APIs

Le SDK expose toutes les API du serveur via un client type-safe.


Global

MéthodeDescriptionRéponse
global.health()Vérifier la santé et la version du serveur{ healthy: true, version: string }

Exemples

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

App

MéthodeDescriptionRéponse
app.log()Écrire une entrée de journalboolean
app.agents()Lister tous les agents disponiblesAgent[]

Exemples

// 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éthodeDescriptionRéponse
project.list()Lister tous les projetsProject[]
project.current()Obtenir le projet actuelProject

Exemples

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

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

Path

MéthodeDescriptionRéponse
path.get()Obtenir le chemin actuelPath

Exemples

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

Config

MéthodeDescriptionRéponse
config.get()Obtenir les informations de configurationConfig

Exemples

const config = await client.config.get()

Sessions

MéthodeDescriptionNotes
session.list()Lister les sessionsRetourne Session[]
session.get({ path })Obtenir une sessionRetourne Session
session.children({ path })Lister les sessions enfantsRetourne Session[]
session.create({ body })Créer une sessionRetourne Session
session.delete({ path })Supprimer une sessionRetourne boolean
session.update({ path, body })Mettre à jour les propriétés de sessionRetourne Session
session.init({ path, body })Analyser l'application et créer AGENTS.mdRetourne boolean
session.abort({ path })Abandonner une session en coursRetourne boolean
session.summarize({ path, body })Résumer une sessionRetourne boolean
session.messages({ path })Lister les messages dans une sessionRetourne { info: Message, parts: Part[]}[]
session.message({ path })Obtenir les détails du messageRetourne { info: Message, parts: Part[]}
session.prompt({ path, body })Envoyer un message d'invitebody.noReply: true retourne UserMessage (contexte uniquement). Par défaut retourne AssistantMessage avec réponse IA. Supporte body.outputFormat pour sortie structurée
session.command({ path, body })Envoyer une commande à la sessionRetourne { info: AssistantMessage, parts: Part[]}
session.shell({ path, body })Exécuter une commande shellRetourne AssistantMessage
session.revert({ path, body })Annuler un messageRetourne Session
session.unrevert({ path })Restaurer les messages annulésRetourne Session
postSessionByIdPermissionsByPermissionId({ path, body })Répondre à une demande de permissionRetourne boolean

Exemples

// 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éthodeDescriptionRéponse
find.text({ query })Rechercher du texte dans les fichiersTableau d'objets de correspondance avec path, lines, line_number, absolute_offset, submatches
find.files({ query })Trouver des fichiers et répertoires par nomstring[] (chemins)
find.symbols({ query })Trouver les symboles de l'espace de travailSymbol[]
file.read({ query })Lire un fichier{ type: "raw" | "patch", content: string }
file.status({ query? })Obtenir le statut des fichiers suivisFile[]

find.files supporte quelques champs de requête optionnels :

  • type: "file" ou "directory"
  • directory: remplacer la racine du projet pour la recherche
  • limit: résultats max (1–200)

Exemples

// 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éthodeDescriptionRéponse
auth.set({ ... })Définir les identifiants d'authentificationboolean

Exemples

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

Events

MéthodeDescriptionRéponse
event.subscribe()Flux d'événements envoyés par le serveurFlux d'événements envoyés par le serveur

Exemples

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