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
| Option | Type | Description | Par défaut |
|---|---|---|---|
hostname | string | Nom d'hôte du serveur | 127.0.0.1 |
port | number | Port du serveur | 4096 |
signal | AbortSignal | Signal d'abandon pour annuler | undefined |
timeout | number | Délai d'attente en ms pour le démarrage du serveur | 5000 |
config | Config | Objet 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
| Option | Type | Description | Par défaut |
|---|---|---|---|
baseUrl | string | URL du serveur | http://localhost:4096 |
fetch | function | Implémentation fetch personnalisée | globalThis.fetch |
parseAs | string | Méthode d'analyse de réponse | auto |
responseStyle | string | Style de retour : data ou fields | fields |
throwOnError | boolean | Lever les erreurs au lieu de les retourner | false |
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
| Type | Description |
|---|---|
text | Par défaut. Réponse textuelle standard (pas de sortie structurée) |
json_schema | Retourne du JSON validé correspondant au schéma fourni |
Format de schéma JSON
Lors de l'utilisation de type: 'json_schema', fournissez :
| Champ | Type | Description |
|---|---|---|
type | 'json_schema' | Requis. Spécifie le mode schéma JSON |
schema | object | Requis. Objet JSON Schema définissant la structure de sortie |
retryCount | number | Optionnel. 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
- Fournissez des descriptions claires dans les propriétés de votre schéma pour aider le modèle à comprendre quelles données extraire
- Utilisez
requiredpour spécifier les champs qui doivent être présents - Gardez les schémas ciblés - les schémas imbriqués complexes peuvent être plus difficiles à remplir correctement pour le modèle
- Définissez un
retryCountapproprié - 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éthode | Description | Ré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éthode | Description | Réponse |
|---|---|---|
app.log() | Écrire une entrée de journal | boolean |
app.agents() | Lister tous les agents disponibles | Agent[] |
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éthode | Description | Réponse |
|---|---|---|
project.list() | Lister tous les projets | Project[] |
project.current() | Obtenir le projet actuel | Project |
Exemples
// List all projects
const projects = await client.project.list()
// Get current project
const currentProject = await client.project.current()
Path
| Méthode | Description | Réponse |
|---|---|---|
path.get() | Obtenir le chemin actuel | Path |
Exemples
// Get current path information
const pathInfo = await client.path.get()
Config
| Méthode | Description | Réponse |
|---|---|---|
config.get() | Obtenir les informations de configuration | Config |
Exemples
const config = await client.config.get()
Sessions
| Méthode | Description | Notes |
|---|---|---|
session.list() | Lister les sessions | Retourne Session[] |
session.get({ path }) | Obtenir une session | Retourne Session |
session.children({ path }) | Lister les sessions enfants | Retourne Session[] |
session.create({ body }) | Créer une session | Retourne Session |
session.delete({ path }) | Supprimer une session | Retourne boolean |
session.update({ path, body }) | Mettre à jour les propriétés de session | Retourne Session |
session.init({ path, body }) | Analyser l'application et créer AGENTS.md | Retourne boolean |
session.abort({ path }) | Abandonner une session en cours | Retourne boolean |
session.summarize({ path, body }) | Résumer une session | Retourne boolean |
session.messages({ path }) | Lister les messages dans une session | Retourne { info: Message, parts: Part[]}[] |
session.message({ path }) | Obtenir les détails du message | Retourne { info: Message, parts: Part[]} |
session.prompt({ path, body }) | Envoyer un message d'invite | body.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 session | Retourne { info: AssistantMessage, parts: Part[]} |
session.shell({ path, body }) | Exécuter une commande shell | Retourne AssistantMessage |
session.revert({ path, body }) | Annuler un message | Retourne Session |
session.unrevert({ path }) | Restaurer les messages annulés | Retourne Session |
postSessionByIdPermissionsByPermissionId({ path, body }) | Répondre à une demande de permission | Retourne 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éthode | Description | Réponse |
|---|---|---|
find.text({ query }) | Rechercher du texte dans les fichiers | Tableau d'objets de correspondance avec path, lines, line_number, absolute_offset, submatches |
find.files({ query }) | Trouver des fichiers et répertoires par nom | string[] (chemins) |
find.symbols({ query }) | Trouver les symboles de l'espace de travail | Symbol[] |
file.read({ query }) | Lire un fichier | { type: "raw" | "patch", content: string } |
file.status({ query? }) | Obtenir le statut des fichiers suivis | File[] |
find.files supporte quelques champs de requête optionnels :
type:"file"ou"directory"directory: remplacer la racine du projet pour la recherchelimit: 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éthode | Description | Réponse |
|---|---|---|
auth.set({ ... }) | Définir les identifiants d'authentification | boolean |
Exemples
await client.auth.set({
path: { id: "dropstone" },
body: { type: "api", key: "your-dropstone-api-key" },
})
Events
| Méthode | Description | Réponse |
|---|---|---|
event.subscribe() | Flux d'événements envoyés par le serveur | Flux 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)
}