SDK
Klien JS/TS yang aman tipe untuk server dropstone.
SDK JS/TS Dropstone menyediakan klien yang aman tipe untuk berinteraksi dengan agen Dropstone lokal. Ini menjalankan dropstone serve sebagai subprocess dan memberikan Anda klien HTTP yang diketik yang menunjuk ke sana.
Butuh akses API headless di CI?:
Untuk penggunaan murni pemrograman (pipeline CI, otomasi, serverless), lebih suka HTTP API dengan DROPSTONE_API_KEY. SDK di halaman ini dimaksudkan untuk menyematkan agen interaktif dalam proses Node di mana biner CLI dipasang bersama.
Lihat halaman Server untuk mengetahui cara kerja HTTP API yang mendasar.
Instal
Instal SDK dari npm:
npm install @blankline/dropstone-sdk
Buat klien
Buat instance dropstone:
import { createDropstone } from "@blankline/dropstone-sdk"
const { client } = await createDropstone()
Ini memulai server dan klien
Opsi
| Opsi | Tipe | Deskripsi | Default |
|---|---|---|---|
hostname | string | Hostname server | 127.0.0.1 |
port | number | Port server | 4096 |
signal | AbortSignal | Sinyal abort untuk pembatalan | undefined |
timeout | number | Timeout dalam ms untuk awal server | 5000 |
config | Config | Objek konfigurasi | {} |
Konfigurasi
Anda dapat melewatkan objek konfigurasi untuk menyesuaikan perilaku. Instance masih mengambil dropstone.json Anda, tetapi Anda dapat mengganti atau menambahkan konfigurasi secara 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()
Hanya klien
Jika Anda sudah memiliki instance dropstone yang berjalan, Anda dapat membuat instance klien untuk terhubung ke sana:
import { createDropstoneClient } from "@blankline/dropstone-sdk"
const client = createDropstoneClient({
baseUrl: "http://localhost:4096",
})
Opsi
| Opsi | Tipe | Deskripsi | Default |
|---|---|---|---|
baseUrl | string | URL server | http://localhost:4096 |
fetch | function | Implementasi fetch khusus | globalThis.fetch |
parseAs | string | Metode parsing respons | auto |
responseStyle | string | Gaya pengembalian: data atau fields | fields |
throwOnError | boolean | Lempar kesalahan alih-alih kembali | false |
Tipe
SDK mencakup definisi TypeScript untuk semua tipe API. Impor langsung:
import type { Session, Message, Part } from "@blankline/dropstone-sdk"
Semua tipe dihasilkan dari spesifikasi OpenAPI server, jadi nama yang Anda lihat di TypeScript memetakan satu-ke-satu ke bentuk permintaan dan respons server.
Kesalahan
SDK dapat melempar kesalahan yang dapat Anda tangkap dan tangani:
try {
await client.session.get({ path: { id: "invalid-id" } })
} catch (error) {
console.error("Failed to get session:", (error as Error).message)
}
Output Terstruktur
Anda dapat meminta output JSON terstruktur dari model dengan menentukan format dengan skema JSON. Model akan menggunakan alat StructuredOutput untuk mengembalikan JSON yang divalidasi yang cocok dengan skema Anda.
Penggunaan Dasar
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"] }
Tipe Format Output
| Tipe | Deskripsi |
|---|---|
text | Default. Respons teks standar (tidak ada output terstruktur) |
json_schema | Mengembalikan JSON yang divalidasi yang cocok dengan skema yang disediakan |
Format Skema JSON
Saat menggunakan type: 'json_schema', sediakan:
| Field | Tipe | Deskripsi |
|---|---|---|
type | 'json_schema' | Diperlukan. Menentukan mode skema JSON |
schema | object | Diperlukan. Objek JSON Schema yang menentukan struktur output |
retryCount | number | Opsional. Jumlah percobaan validasi ulang (default: 2) |
Penanganan Kesalahan
Jika model gagal menghasilkan output terstruktur yang valid setelah semua percobaan ulang, respons akan menyertakan 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)
}
Praktik Terbaik
- Berikan deskripsi yang jelas dalam properti skema Anda untuk membantu model memahami data apa yang akan diekstrak
- Gunakan
requireduntuk menentukan bidang mana yang harus ada - Jaga skema tetap fokus - skema bersarang yang kompleks mungkin lebih sulit bagi model untuk diisi dengan benar
- Tetapkan
retryCountyang sesuai - tingkatkan untuk skema kompleks, kurangi untuk skema sederhana
API
SDK mengekspos semua API server melalui klien yang aman tipe.
Global
| Metode | Deskripsi | Respons |
|---|---|---|
global.health() | Periksa kesehatan dan versi server | { healthy: true, version: string } |
Contoh
const health = await client.global.health()
console.log(health.data.version)
App
| Metode | Deskripsi | Respons |
|---|---|---|
app.log() | Tulis entri log | boolean |
app.agents() | Daftar semua agen yang tersedia | Agent[] |
Contoh
// 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()
Proyek
| Metode | Deskripsi | Respons |
|---|---|---|
project.list() | Daftar semua proyek | Project[] |
project.current() | Dapatkan proyek saat ini | Project |
Contoh
// List all projects
const projects = await client.project.list()
// Get current project
const currentProject = await client.project.current()
Path
| Metode | Deskripsi | Respons |
|---|---|---|
path.get() | Dapatkan path saat ini | Path |
Contoh
// Get current path information
const pathInfo = await client.path.get()
Konfigurasi
| Metode | Deskripsi | Respons |
|---|---|---|
config.get() | Dapatkan info konfigurasi | Config |
Contoh
const config = await client.config.get()
Sesi
| Metode | Deskripsi | Catatan |
|---|---|---|
session.list() | Daftar sesi | Mengembalikan Session[] |
session.get({ path }) | Dapatkan sesi | Mengembalikan Session |
session.children({ path }) | Daftar sesi anak | Mengembalikan Session[] |
session.create({ body }) | Buat sesi | Mengembalikan Session |
session.delete({ path }) | Hapus sesi | Mengembalikan boolean |
session.update({ path, body }) | Perbarui properti sesi | Mengembalikan Session |
session.init({ path, body }) | Analisis aplikasi dan buat AGENTS.md | Mengembalikan boolean |
session.abort({ path }) | Batalkan sesi yang sedang berjalan | Mengembalikan boolean |
session.summarize({ path, body }) | Ringkas sesi | Mengembalikan boolean |
session.messages({ path }) | Daftar pesan dalam sesi | Mengembalikan { info: Message, parts: Part[]}[] |
session.message({ path }) | Dapatkan detail pesan | Mengembalikan { info: Message, parts: Part[]} |
session.prompt({ path, body }) | Kirim pesan prompt | body.noReply: true mengembalikan UserMessage (hanya konteks). Default mengembalikan AssistantMessage dengan respons AI. Mendukung body.outputFormat untuk output terstruktur |
session.command({ path, body }) | Kirim pesan perintah ke sesi | Mengembalikan { info: AssistantMessage, parts: Part[]} |
session.shell({ path, body }) | Jalankan perintah shell | Mengembalikan AssistantMessage |
session.revert({ path, body }) | Kembalikan pesan | Mengembalikan Session |
session.unrevert({ path }) | Pulihkan pesan yang dikembalikan | Mengembalikan Session |
postSessionByIdPermissionsByPermissionId({ path, body }) | Merespons permintaan izin | Mengembalikan boolean |
Contoh
// 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." }],
},
})
File
| Metode | Deskripsi | Respons |
|---|---|---|
find.text({ query }) | Cari teks dalam file | Array objek kecocokan dengan path, lines, line_number, absolute_offset, submatches |
find.files({ query }) | Temukan file dan direktori berdasarkan nama | string[] (paths) |
find.symbols({ query }) | Temukan simbol workspace | Symbol[] |
file.read({ query }) | Baca file | { type: "raw" | "patch", content: string } |
file.status({ query? }) | Dapatkan status untuk file yang dilacak | File[] |
find.files mendukung beberapa bidang kueri opsional:
type:"file"atau"directory"directory: ganti akar proyek untuk pencarianlimit: hasil maksimal (1–200)
Contoh
// 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
| Metode | Deskripsi | Respons |
|---|---|---|
auth.set({ ... }) | Tetapkan kredensial autentikasi | boolean |
Contoh
await client.auth.set({
path: { id: "dropstone" },
body: { type: "api", key: "your-dropstone-api-key" },
})
Event
| Metode | Deskripsi | Respons |
|---|---|---|
event.subscribe() | Aliran event yang dikirim server | Aliran event yang dikirim server |
Contoh
// 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)
}