Kdrant

Client Kotlin per Qdrant: REST di default, gRPC quando serve, sopra la stessa API.

Gradleimplementation("io.github.nacode-studios:kdrant-transport-rest:2.1.0")
kdrant.kt
val qdrant = Kdrant(host = "localhost", port = 6333)qdrant.use { client -> client.createCollection("articoli") { vector { size = 1_536; distance = Distance.COSINE } } client.upsert("articoli", wait = true) { point(id = 1) { vector(embedding) payload("titolo" to "Introduzione", "lingua" to "it") } }}
Il prodotto

Client Kotlin per il database vettoriale Qdrant. Espone tutte le operazioni come funzioni suspend, con DSL type-safe per collection, punti e filtri. Due motori di trasporto, REST e gRPC, dietro la stessa interfaccia; il motore REST gira su JVM e otto target Kotlin/Native.

Crea una collezioneJava
QdrantClient.javaclient ufficiale
var client = new QdrantClient(    QdrantGrpcClient.newBuilder("localhost", 6334, false)        .build()); ListenableFuture<CollectionOperationResponse> f =    client.createCollectionAsync("articoli",        VectorParams.newBuilder().setSize(1536)            .setDistance(Distance.Cosine).build());f.get();  // ...e poi gestisci ExecutionException
Dipendenzegrpc-netty-shadedprotobuf-javagrpc-protobufguava
Kdrant.ktKdrant
val qdrant = Kdrant(host = "localhost", port = 6333) qdrant.use { client ->  client.createCollection("articoli") {    vector { size = 1_536; distance = Distance.COSINE }  }}
Dipendenzektor-client-corekotlinx-serializationsuspendDSLREST su Ktor, gRPC opzionale
Gradleimplementation("io.github.nacode-studios:kdrant-transport-rest:2.1.0")Maven Central · Apache-2.0
la differenza, in codice

Il client JVM ufficiale di Qdrant è progettato per Java: ogni chiamata restituisce un ListenableFuture, le richieste si compongono con i builder protobuf e il protocollo è deciso a monte, con Netty nel progetto che serva o meno. Kdrant offre le stesse funzionalità con un’API idiomatica per Kotlin. Tutte le operazioni sono funzioni suspend, con cancellazione e timeout cooperativi e propagazione garantita di CancellationException. Collection, punti, payload e filtri si dichiarano tramite DSL a scope isolato. Gli errori sono modellati come gerarchia sealed, quindi la gestione esaustiva viene verificata in compilazione. Il protocollo lo sceglie chi usa la libreria. Il motore predefinito è REST su Ktor e kotlinx-serialization e non porta gRPC, protobuf o Netty nel progetto. Il motore gRPC è un artefatto separato, da aggiungere solo se la banda o lo streaming sono il collo di bottiglia. Passare dall’uno all’altro cambia una riga, perché entrambi stanno dietro la stessa interfaccia di trasporto: aggiungere il secondo motore non ha richiesto modifiche al core. I due motori rispondono alla stessa suite di test comportamentali, eseguita contro un Qdrant reale su entrambi i protocolli. Quattordici operazioni che Qdrant serve solo via HTTP, fra cui telemetria, metriche e il trasferimento degli snapshot, sul motore gRPC falliscono dichiarandolo invece di degradare in silenzio. Con la 2.1 il motore REST gira ovunque giri il core: JVM più otto target Kotlin/Native, fra iOS, macOS, Linux e Windows. Fino alla 2.0 quei target ricevevano i modelli e i DSL senza nulla con cui mettere una richiesta sul filo. Ora l’engine è scelto per piattaforma, e la stessa suite comportamentale che gira sulla JVM viene eseguita da un binario Linux e da uno macOS contro un Qdrant reale, perché una libreria che compila non è ancora una libreria che funziona. Il motore gRPC resta sulla JVM, perché è grpc-java. La 2.1 aggiunge anche quello che serve per mandarlo in produzione. Accanto alla chiave master si può usare un token JWT ristretto a sola lettura, a una collection o a un filtro sul payload, che è il modo di tenere la ricerca di un cliente lontana dai punti di un altro; un rifiuto arriva come eccezione tipizzata invece che come errore generico. Il modulo OpenTelemetry produce uno span per operazione, sopra entrambi i motori, senza che un payload o un vettore finisca mai in un attributo. Il modulo di migrazione sposta una collection su un nuovo modello di embedding: riprende dopo un’interruzione e sposta l’alias solo dopo una verifica che è stata eseguita davvero. La copertura comprende l’endpoint /points/query in tutte le sue modalità (nearest, fusione ibrida, recommend, discover, context, batch, gruppi), vettori sparsi e multipli, scroll, gestione di payload e vettori, alias, snapshot, cluster e sharding e politiche di retry. Sono disponibili i moduli per Spring Boot, Spring AI, LangChain4j, Koog, Micrometer, OpenTelemetry e le migrazioni.

Ambito
Open sourceKotlinKotlin MultiplatformVector databaseRAG
Approccio

Cosa abbiamo fatto

01Design dell’API pubblica e dei DSL
02Interfaccia di trasporto e i due motori, REST su Ktor e gRPC
03Migrazione del core a Kotlin Multiplatform
04Suite di test comportamentali condivisa fra i motori
05Moduli Spring Boot, Spring AI, LangChain4j, Koog, Micrometer e OpenTelemetry
06Distribuzione su Maven Central e versionamento semantico
Punti di forza
+Operazioni esposte come funzioni suspend, con cancellazione cooperativa
+DSL type-safe per collection, punti, payload e filtri
+Errori modellati come gerarchia sealed, verificati in compilazione
+Due motori dietro la stessa API: REST su Ktor, gRPC opzionale
+Chi resta su REST non si porta dentro gRPC, protobuf né Netty
+Client completo, motore incluso, su JVM e otto target Kotlin/Native
+Token JWT ristretti accanto alla chiave master, su entrambi i motori
Risultati ottenuti
Il secondo motore non ha richiesto modifiche al core
Trentadue test comportamentali eseguiti su entrambi i protocolli e da un binario nativo
Il passaggio a multipiattaforma non ha cambiato l’API pubblica
Undici moduli distribuiti su Maven Central con groupId io.github.nacode-studios
Prima ricerca a 37 ms dall’avvio del processo, da un binario GraalVM da 42 MB
Documentazione API generata con Dokka
Risorse
Apri su GitHubVisita il sitoRepository

Ti piace quello che facciamo?

Parliamo del tuo prossimo progetto insieme