Kdrant
Client Kotlin per Qdrant: REST di default, gRPC quando serve, sopra la stessa API.
implementation("io.github.nacode-studios:kdrant-transport-rest:2.1.0")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") } }}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.
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 ExecutionExceptionval qdrant = Kdrant(host = "localhost", port = 6333) qdrant.use { client -> client.createCollection("articoli") { vector { size = 1_536; distance = Distance.COSINE } }}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.