@nhtio/adk 1.20260604.0 → 1.20260607.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +261 -0
- package/adk-mcp.mjs +1 -1
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/index.d.ts +1 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
- package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +2 -2
- package/batteries/storage/in_memory.cjs +1 -1
- package/batteries/storage/in_memory.mjs +1 -1
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/tools/color.cjs +2 -2
- package/batteries/tools/color.mjs +2 -2
- package/batteries/tools/comparison.cjs +3 -3
- package/batteries/tools/comparison.mjs +3 -3
- package/batteries/tools/data_structure.cjs +3 -3
- package/batteries/tools/data_structure.mjs +3 -3
- package/batteries/tools/datetime_extended.cjs +2 -2
- package/batteries/tools/datetime_extended.mjs +2 -2
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +3 -3
- package/batteries/tools/encoding.mjs +3 -3
- package/batteries/tools/formatting.cjs +3 -3
- package/batteries/tools/formatting.mjs +3 -3
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/math/index.d.ts +16 -5
- package/batteries/tools/math.cjs +340 -22
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +338 -21
- package/batteries/tools/math.mjs.map +1 -1
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +4 -4
- package/batteries/tools/parsing.mjs +4 -4
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +4 -4
- package/batteries/tools/statistics.mjs +4 -4
- package/batteries/tools/string_processing.cjs +3 -3
- package/batteries/tools/string_processing.mjs +3 -3
- package/batteries/tools/structured_data.cjs +3 -3
- package/batteries/tools/structured_data.mjs +3 -3
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +2 -2
- package/batteries/tools/unit_conversion.mjs +2 -2
- package/batteries/vector/arangodb/index.d.ts +38 -0
- package/batteries/vector/arangodb.cjs +257 -0
- package/batteries/vector/arangodb.cjs.map +1 -0
- package/batteries/vector/arangodb.mjs +255 -0
- package/batteries/vector/arangodb.mjs.map +1 -0
- package/batteries/vector/builder.cjs +297 -0
- package/batteries/vector/builder.cjs.map +1 -0
- package/batteries/vector/builder.d.ts +87 -0
- package/batteries/vector/builder.mjs +294 -0
- package/batteries/vector/builder.mjs.map +1 -0
- package/batteries/vector/chroma/index.d.ts +32 -0
- package/batteries/vector/chroma.cjs +305 -0
- package/batteries/vector/chroma.cjs.map +1 -0
- package/batteries/vector/chroma.mjs +302 -0
- package/batteries/vector/chroma.mjs.map +1 -0
- package/batteries/vector/clickhouse/index.d.ts +39 -0
- package/batteries/vector/clickhouse.cjs +246 -0
- package/batteries/vector/clickhouse.cjs.map +1 -0
- package/batteries/vector/clickhouse.mjs +244 -0
- package/batteries/vector/clickhouse.mjs.map +1 -0
- package/batteries/vector/cloudflare/index.d.ts +43 -0
- package/batteries/vector/cloudflare.cjs +397 -0
- package/batteries/vector/cloudflare.cjs.map +1 -0
- package/batteries/vector/cloudflare.mjs +395 -0
- package/batteries/vector/cloudflare.mjs.map +1 -0
- package/batteries/vector/conformance/index.d.ts +15 -0
- package/batteries/vector/conformance.cjs +209 -0
- package/batteries/vector/conformance.cjs.map +1 -0
- package/batteries/vector/conformance.mjs +205 -0
- package/batteries/vector/conformance.mjs.map +1 -0
- package/batteries/vector/contract.cjs +42 -0
- package/batteries/vector/contract.cjs.map +1 -0
- package/batteries/vector/contract.d.ts +39 -0
- package/batteries/vector/contract.mjs +40 -0
- package/batteries/vector/contract.mjs.map +1 -0
- package/batteries/vector/couchbase/index.d.ts +49 -0
- package/batteries/vector/couchbase.cjs +401 -0
- package/batteries/vector/couchbase.cjs.map +1 -0
- package/batteries/vector/couchbase.mjs +399 -0
- package/batteries/vector/couchbase.mjs.map +1 -0
- package/batteries/vector/duckdb/index.d.ts +33 -0
- package/batteries/vector/duckdb.cjs +218 -0
- package/batteries/vector/duckdb.cjs.map +1 -0
- package/batteries/vector/duckdb.mjs +216 -0
- package/batteries/vector/duckdb.mjs.map +1 -0
- package/batteries/vector/elasticsearch/index.d.ts +43 -0
- package/batteries/vector/elasticsearch.cjs +306 -0
- package/batteries/vector/elasticsearch.cjs.map +1 -0
- package/batteries/vector/elasticsearch.mjs +303 -0
- package/batteries/vector/elasticsearch.mjs.map +1 -0
- package/batteries/vector/exceptions.cjs +126 -0
- package/batteries/vector/exceptions.cjs.map +1 -0
- package/batteries/vector/exceptions.d.ts +142 -0
- package/batteries/vector/exceptions.mjs +107 -0
- package/batteries/vector/exceptions.mjs.map +1 -0
- package/batteries/vector/factory.cjs +28 -0
- package/batteries/vector/factory.cjs.map +1 -0
- package/batteries/vector/factory.d.ts +38 -0
- package/batteries/vector/factory.mjs +25 -0
- package/batteries/vector/factory.mjs.map +1 -0
- package/batteries/vector/filters.cjs +107 -0
- package/batteries/vector/filters.cjs.map +1 -0
- package/batteries/vector/filters.d.ts +34 -0
- package/batteries/vector/filters.mjs +99 -0
- package/batteries/vector/filters.mjs.map +1 -0
- package/batteries/vector/helpers.cjs +23 -0
- package/batteries/vector/helpers.cjs.map +1 -0
- package/batteries/vector/helpers.d.ts +12 -0
- package/batteries/vector/helpers.mjs +17 -0
- package/batteries/vector/helpers.mjs.map +1 -0
- package/batteries/vector/hnswlib/index.d.ts +35 -0
- package/batteries/vector/hnswlib.cjs +237 -0
- package/batteries/vector/hnswlib.cjs.map +1 -0
- package/batteries/vector/hnswlib.mjs +235 -0
- package/batteries/vector/hnswlib.mjs.map +1 -0
- package/batteries/vector/in_memory/index.d.ts +23 -0
- package/batteries/vector/in_memory.cjs +178 -0
- package/batteries/vector/in_memory.cjs.map +1 -0
- package/batteries/vector/in_memory.mjs +176 -0
- package/batteries/vector/in_memory.mjs.map +1 -0
- package/batteries/vector/index.d.ts +18 -0
- package/batteries/vector/lancedb/index.d.ts +34 -0
- package/batteries/vector/lancedb.cjs +224 -0
- package/batteries/vector/lancedb.cjs.map +1 -0
- package/batteries/vector/lancedb.mjs +222 -0
- package/batteries/vector/lancedb.mjs.map +1 -0
- package/batteries/vector/mariadb/index.d.ts +39 -0
- package/batteries/vector/mariadb.cjs +228 -0
- package/batteries/vector/mariadb.cjs.map +1 -0
- package/batteries/vector/mariadb.mjs +226 -0
- package/batteries/vector/mariadb.mjs.map +1 -0
- package/batteries/vector/meilisearch/index.d.ts +36 -0
- package/batteries/vector/meilisearch.cjs +242 -0
- package/batteries/vector/meilisearch.cjs.map +1 -0
- package/batteries/vector/meilisearch.mjs +240 -0
- package/batteries/vector/meilisearch.mjs.map +1 -0
- package/batteries/vector/migrate.cjs +54 -0
- package/batteries/vector/migrate.cjs.map +1 -0
- package/batteries/vector/migrate.d.ts +30 -0
- package/batteries/vector/migrate.mjs +52 -0
- package/batteries/vector/migrate.mjs.map +1 -0
- package/batteries/vector/milvus/index.d.ts +35 -0
- package/batteries/vector/milvus.cjs +357 -0
- package/batteries/vector/milvus.cjs.map +1 -0
- package/batteries/vector/milvus.mjs +354 -0
- package/batteries/vector/milvus.mjs.map +1 -0
- package/batteries/vector/mongodb/index.d.ts +46 -0
- package/batteries/vector/mongodb.cjs +270 -0
- package/batteries/vector/mongodb.cjs.map +1 -0
- package/batteries/vector/mongodb.mjs +268 -0
- package/batteries/vector/mongodb.mjs.map +1 -0
- package/batteries/vector/neo4j/index.d.ts +38 -0
- package/batteries/vector/neo4j.cjs +231 -0
- package/batteries/vector/neo4j.cjs.map +1 -0
- package/batteries/vector/neo4j.mjs +229 -0
- package/batteries/vector/neo4j.mjs.map +1 -0
- package/batteries/vector/opensearch/index.d.ts +46 -0
- package/batteries/vector/opensearch.cjs +316 -0
- package/batteries/vector/opensearch.cjs.map +1 -0
- package/batteries/vector/opensearch.mjs +313 -0
- package/batteries/vector/opensearch.mjs.map +1 -0
- package/batteries/vector/oracle23ai/index.d.ts +45 -0
- package/batteries/vector/oracle23ai.cjs +340 -0
- package/batteries/vector/oracle23ai.cjs.map +1 -0
- package/batteries/vector/oracle23ai.mjs +338 -0
- package/batteries/vector/oracle23ai.mjs.map +1 -0
- package/batteries/vector/orama/index.d.ts +23 -0
- package/batteries/vector/orama.cjs +272 -0
- package/batteries/vector/orama.cjs.map +1 -0
- package/batteries/vector/orama.mjs +270 -0
- package/batteries/vector/orama.mjs.map +1 -0
- package/batteries/vector/pgvector/index.d.ts +43 -0
- package/batteries/vector/pgvector.cjs +411 -0
- package/batteries/vector/pgvector.cjs.map +1 -0
- package/batteries/vector/pgvector.mjs +408 -0
- package/batteries/vector/pgvector.mjs.map +1 -0
- package/batteries/vector/pinecone/index.d.ts +38 -0
- package/batteries/vector/pinecone.cjs +415 -0
- package/batteries/vector/pinecone.cjs.map +1 -0
- package/batteries/vector/pinecone.mjs +412 -0
- package/batteries/vector/pinecone.mjs.map +1 -0
- package/batteries/vector/plan.cjs +2 -0
- package/batteries/vector/plan.d.ts +65 -0
- package/batteries/vector/plan.mjs +0 -0
- package/batteries/vector/qdrant/index.d.ts +34 -0
- package/batteries/vector/qdrant.cjs +286 -0
- package/batteries/vector/qdrant.cjs.map +1 -0
- package/batteries/vector/qdrant.mjs +284 -0
- package/batteries/vector/qdrant.mjs.map +1 -0
- package/batteries/vector/redis/index.d.ts +44 -0
- package/batteries/vector/redis.cjs +391 -0
- package/batteries/vector/redis.cjs.map +1 -0
- package/batteries/vector/redis.mjs +388 -0
- package/batteries/vector/redis.mjs.map +1 -0
- package/batteries/vector/retrievable.cjs +69 -0
- package/batteries/vector/retrievable.cjs.map +1 -0
- package/batteries/vector/retrievable.mjs +67 -0
- package/batteries/vector/retrievable.mjs.map +1 -0
- package/batteries/vector/retrievable_glue.d.ts +24 -0
- package/batteries/vector/s3vectors/index.d.ts +52 -0
- package/batteries/vector/s3vectors.cjs +438 -0
- package/batteries/vector/s3vectors.cjs.map +1 -0
- package/batteries/vector/s3vectors.mjs +436 -0
- package/batteries/vector/s3vectors.mjs.map +1 -0
- package/batteries/vector/schema.cjs +96 -0
- package/batteries/vector/schema.cjs.map +1 -0
- package/batteries/vector/schema.d.ts +40 -0
- package/batteries/vector/schema.mjs +93 -0
- package/batteries/vector/schema.mjs.map +1 -0
- package/batteries/vector/solr/index.d.ts +36 -0
- package/batteries/vector/solr.cjs +230 -0
- package/batteries/vector/solr.cjs.map +1 -0
- package/batteries/vector/solr.mjs +228 -0
- package/batteries/vector/solr.mjs.map +1 -0
- package/batteries/vector/sqlite_vec/index.d.ts +30 -0
- package/batteries/vector/sqlite_vec.cjs +318 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -0
- package/batteries/vector/sqlite_vec.mjs +316 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -0
- package/batteries/vector/surrealdb/index.d.ts +37 -0
- package/batteries/vector/surrealdb.cjs +230 -0
- package/batteries/vector/surrealdb.cjs.map +1 -0
- package/batteries/vector/surrealdb.mjs +228 -0
- package/batteries/vector/surrealdb.mjs.map +1 -0
- package/batteries/vector/types.cjs +2 -0
- package/batteries/vector/types.d.ts +100 -0
- package/batteries/vector/types.mjs +0 -0
- package/batteries/vector/typesense/index.d.ts +38 -0
- package/batteries/vector/typesense.cjs +272 -0
- package/batteries/vector/typesense.cjs.map +1 -0
- package/batteries/vector/typesense.mjs +270 -0
- package/batteries/vector/typesense.mjs.map +1 -0
- package/batteries/vector/validation.cjs +90 -0
- package/batteries/vector/validation.cjs.map +1 -0
- package/batteries/vector/validation.d.ts +18 -0
- package/batteries/vector/validation.mjs +83 -0
- package/batteries/vector/validation.mjs.map +1 -0
- package/batteries/vector/vector_store_constructor.cjs +56 -0
- package/batteries/vector/vector_store_constructor.cjs.map +1 -0
- package/batteries/vector/vector_store_constructor.d.ts +30 -0
- package/batteries/vector/vector_store_constructor.mjs +53 -0
- package/batteries/vector/vector_store_constructor.mjs.map +1 -0
- package/batteries/vector/vespa/index.d.ts +39 -0
- package/batteries/vector/vespa.cjs +423 -0
- package/batteries/vector/vespa.cjs.map +1 -0
- package/batteries/vector/vespa.mjs +421 -0
- package/batteries/vector/vespa.mjs.map +1 -0
- package/batteries/vector/weaviate/index.d.ts +57 -0
- package/batteries/vector/weaviate.cjs +325 -0
- package/batteries/vector/weaviate.cjs.map +1 -0
- package/batteries/vector/weaviate.mjs +322 -0
- package/batteries/vector/weaviate.mjs.map +1 -0
- package/batteries/vector.cjs +63 -0
- package/batteries/vector.mjs +14 -0
- package/batteries.cjs +62 -0
- package/batteries.mjs +15 -1
- package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
- package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
- package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
- package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
- package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
- package/dispatch_runner-BHBNupqp.js.map +1 -0
- package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
- package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.mjs +4 -4
- package/guards.cjs +8 -8
- package/guards.mjs +8 -8
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/tool_registry.d.ts +70 -4
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +424 -88
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
- package/spooled_artifact-BTq6Nzfy.js.map +1 -0
- package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
- package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
- package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
- package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
- package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
- package/src/types/evaluatex.d.ts +31 -0
- package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
- package/thought-BbwhJ1wb.js.map +1 -0
- package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
- package/thought-D34QQZZ9.mjs.map +1 -0
- package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
- package/tool-CMhaDRNd.mjs.map +1 -0
- package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
- package/tool-CVyZkFC7.js.map +1 -0
- package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
- package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
- package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
- package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
- package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
- package/tool_registry-D1pSSlsd.mjs.map +1 -0
- package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
- package/tool_registry-DYUYqXvo.js.map +1 -0
- package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
- package/turn_runner-DqWHNP80.js.map +1 -0
- package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
- package/turn_runner-fg1Wc3dK.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
- package/dispatch_runner-CpuyATj1.js.map +0 -1
- package/spooled_artifact-B8gIIn9h.js.map +0 -1
- package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
- package/thought-BD6AkkOr.js.map +0 -1
- package/thought-B_P8LiB6.mjs.map +0 -1
- package/tool-CRZSUcdP.mjs.map +0 -1
- package/tool-CX9vNHAw.js.map +0 -1
- package/tool_registry-BGHg6KTq.mjs.map +0 -1
- package/tool_registry-CtCQ4Xoz.js.map +0 -1
- package/turn_runner-BJTtAORU.js.map +0 -1
- package/turn_runner-C02LZHjt.mjs.map +0 -1
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-D1pSSlsd.mjs";
|
|
2
|
+
import "../../guards.mjs";
|
|
3
|
+
import { evaluateFilter } from "./filters.mjs";
|
|
4
|
+
import { normalizeScore } from "./helpers.mjs";
|
|
5
|
+
import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_CONNECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
|
|
6
|
+
import { BaseVectorStore } from "./contract.mjs";
|
|
7
|
+
import { validateRecords } from "./validation.mjs";
|
|
8
|
+
//#region src/batteries/vector/couchbase/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* @module @nhtio/adk/batteries/vector/couchbase
|
|
11
|
+
*
|
|
12
|
+
* Couchbase (Enterprise) vector-store adapter. Vector search is Enterprise Edition only; the
|
|
13
|
+
* Community Edition will throw "vector typed fields not supported". A logical collection maps to a
|
|
14
|
+
* Couchbase scope.collection inside a bucket. KV operations (upsert/get/remove) use strong
|
|
15
|
+
* consistency, while the scoped FTS vector index is async (settle-polled after writes).
|
|
16
|
+
*
|
|
17
|
+
* Scoring rule: do NOT trust FTS native scores (they vary per metric and are unbounded for
|
|
18
|
+
* euclidean/l2_norm). Instead, use FTS only to retrieve the candidate id set, then KV-get each
|
|
19
|
+
* candidate doc and RE-COMPUTE the similarity score from the stored vec vs query vec using
|
|
20
|
+
* normalizeScore — guaranteeing the [0,1] contract regardless of backend metric quirks.
|
|
21
|
+
*
|
|
22
|
+
* Filter-scan, enumerate, and delete-by-filter use N1QL with RequestPlus for strong consistency.
|
|
23
|
+
*/
|
|
24
|
+
var similarity = (metric) => metric === "cosine" ? "cosine" : metric === "dot" ? "dot_product" : "l2_norm";
|
|
25
|
+
var cosineSim = (a, b) => {
|
|
26
|
+
let dot = 0;
|
|
27
|
+
let normA = 0;
|
|
28
|
+
let normB = 0;
|
|
29
|
+
a.forEach((av, i) => {
|
|
30
|
+
const bv = b[i];
|
|
31
|
+
dot += av * bv;
|
|
32
|
+
normA += av * av;
|
|
33
|
+
normB += bv * bv;
|
|
34
|
+
});
|
|
35
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
36
|
+
return denom === 0 ? 0 : dot / denom;
|
|
37
|
+
};
|
|
38
|
+
var dotProd = (a, b) => {
|
|
39
|
+
let s = 0;
|
|
40
|
+
a.forEach((av, i) => {
|
|
41
|
+
s += av * b[i];
|
|
42
|
+
});
|
|
43
|
+
return s;
|
|
44
|
+
};
|
|
45
|
+
var euclideanDist = (a, b) => {
|
|
46
|
+
let s = 0;
|
|
47
|
+
a.forEach((av, i) => {
|
|
48
|
+
const d = av - b[i];
|
|
49
|
+
s += d * d;
|
|
50
|
+
});
|
|
51
|
+
return Math.sqrt(s);
|
|
52
|
+
};
|
|
53
|
+
var computeScore = (vec, query, metric) => {
|
|
54
|
+
if (metric === "cosine") return normalizeScore(cosineSim(vec, query), "cosine", "similarity");
|
|
55
|
+
else if (metric === "dot") return normalizeScore(dotProd(vec, query), "dot", "similarity");
|
|
56
|
+
else if (metric === "euclidean") return normalizeScore(euclideanDist(vec, query), "euclidean", "distance");
|
|
57
|
+
else return normalizeScore(cosineSim(vec, query), "cosine", "similarity");
|
|
58
|
+
};
|
|
59
|
+
var getCB = async () => {
|
|
60
|
+
try {
|
|
61
|
+
return await import("couchbase");
|
|
62
|
+
} catch {
|
|
63
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["couchbase"]);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
var CouchbaseVectorStore = class extends BaseVectorStore {
|
|
67
|
+
capabilities = {
|
|
68
|
+
transactions: false,
|
|
69
|
+
namedVectors: false,
|
|
70
|
+
rename: false,
|
|
71
|
+
rawSql: false,
|
|
72
|
+
builtInEncoding: false,
|
|
73
|
+
consistency: {
|
|
74
|
+
configurable: false,
|
|
75
|
+
default: "strong",
|
|
76
|
+
modes: ["strong"]
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
#cluster = null;
|
|
80
|
+
#bucket = null;
|
|
81
|
+
#cb = null;
|
|
82
|
+
#dims = /* @__PURE__ */ new Map();
|
|
83
|
+
#metrics = /* @__PURE__ */ new Map();
|
|
84
|
+
get #opts() {
|
|
85
|
+
return this.options;
|
|
86
|
+
}
|
|
87
|
+
#scopeName() {
|
|
88
|
+
return this.#opts.connection.scope ?? "_default";
|
|
89
|
+
}
|
|
90
|
+
#phys(collection) {
|
|
91
|
+
const prefix = this.#opts.connection.collectionPrefix;
|
|
92
|
+
return prefix ? `${prefix}${collection}` : collection;
|
|
93
|
+
}
|
|
94
|
+
#vecIndexName(collection) {
|
|
95
|
+
return `${this.#phys(collection)}_vec`;
|
|
96
|
+
}
|
|
97
|
+
static isAvailable() {
|
|
98
|
+
return typeof process !== "undefined";
|
|
99
|
+
}
|
|
100
|
+
isAvailable() {
|
|
101
|
+
return typeof process !== "undefined";
|
|
102
|
+
}
|
|
103
|
+
async connect() {
|
|
104
|
+
if (this.#cluster) return;
|
|
105
|
+
const couchbase = await getCB();
|
|
106
|
+
this.#cb = couchbase;
|
|
107
|
+
const c = this.#opts.connection;
|
|
108
|
+
try {
|
|
109
|
+
this.#cluster = await couchbase.connect(c.url, {
|
|
110
|
+
username: c.username,
|
|
111
|
+
password: c.password
|
|
112
|
+
});
|
|
113
|
+
this.#bucket = this.#cluster.bucket(c.bucket);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async close() {
|
|
119
|
+
if (this.#cluster) {
|
|
120
|
+
await this.#cluster.close();
|
|
121
|
+
this.#cluster = null;
|
|
122
|
+
this.#bucket = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async #sleep(ms) {
|
|
126
|
+
await new Promise((r) => setTimeout(r, ms));
|
|
127
|
+
}
|
|
128
|
+
async #scope() {
|
|
129
|
+
if (!this.#bucket) await this.connect();
|
|
130
|
+
return this.#bucket.scope(this.#scopeName());
|
|
131
|
+
}
|
|
132
|
+
async #coll(scope, collection) {
|
|
133
|
+
return scope.collection(this.#phys(collection));
|
|
134
|
+
}
|
|
135
|
+
async createCollection(spec, ifNotExists) {
|
|
136
|
+
if (!this.#bucket) await this.connect();
|
|
137
|
+
const cm = this.#bucket.collections();
|
|
138
|
+
const scopeName = this.#scopeName();
|
|
139
|
+
this.#dims.set(spec.collection, spec.vector.dimensions);
|
|
140
|
+
this.#metrics.set(spec.collection, spec.vector.metric);
|
|
141
|
+
const collectionName = this.#phys(spec.collection);
|
|
142
|
+
const indexName = this.#vecIndexName(spec.collection);
|
|
143
|
+
try {
|
|
144
|
+
try {
|
|
145
|
+
await cm.createCollection({
|
|
146
|
+
name: collectionName,
|
|
147
|
+
scopeName
|
|
148
|
+
});
|
|
149
|
+
} catch (err) {
|
|
150
|
+
if (err.message && err.message.includes("CollectionExists")) if (ifNotExists) try {
|
|
151
|
+
await this.#cluster.query(`DELETE FROM \`${this.#opts.connection.bucket}\`.\`${scopeName}\`.\`${collectionName}\``);
|
|
152
|
+
} catch {}
|
|
153
|
+
else {
|
|
154
|
+
await cm.dropCollection(collectionName, scopeName);
|
|
155
|
+
await cm.createCollection({
|
|
156
|
+
name: collectionName,
|
|
157
|
+
scopeName
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else throw err;
|
|
161
|
+
}
|
|
162
|
+
await this.#sleep(1e3);
|
|
163
|
+
try {
|
|
164
|
+
await this.#cluster.query(`CREATE PRIMARY INDEX ON \`${this.#opts.connection.bucket}\`.\`${scopeName}\`.\`${collectionName}\``);
|
|
165
|
+
} catch {}
|
|
166
|
+
const mgr = this.#bucket.scope(scopeName).searchIndexes();
|
|
167
|
+
try {
|
|
168
|
+
await mgr.upsertIndex({
|
|
169
|
+
name: indexName,
|
|
170
|
+
sourceType: "gocbcore",
|
|
171
|
+
sourceName: this.#opts.connection.bucket,
|
|
172
|
+
type: "fulltext-index",
|
|
173
|
+
planParams: { indexPartitions: 1 },
|
|
174
|
+
params: {
|
|
175
|
+
doc_config: {
|
|
176
|
+
mode: "scope.collection.type_field",
|
|
177
|
+
type_field: "type"
|
|
178
|
+
},
|
|
179
|
+
mapping: {
|
|
180
|
+
default_mapping: { enabled: false },
|
|
181
|
+
default_analyzer: "standard",
|
|
182
|
+
default_type: "_default",
|
|
183
|
+
types: { [`${scopeName}.${collectionName}`]: {
|
|
184
|
+
enabled: true,
|
|
185
|
+
dynamic: false,
|
|
186
|
+
properties: { vec: {
|
|
187
|
+
enabled: true,
|
|
188
|
+
fields: [{
|
|
189
|
+
name: "vec",
|
|
190
|
+
type: "vector",
|
|
191
|
+
dims: spec.vector.dimensions,
|
|
192
|
+
similarity: similarity(spec.vector.metric),
|
|
193
|
+
index: true
|
|
194
|
+
}]
|
|
195
|
+
} }
|
|
196
|
+
} }
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
} catch {}
|
|
201
|
+
const scope = this.#bucket.scope(scopeName);
|
|
202
|
+
const probe = new Array(spec.vector.dimensions).fill(0);
|
|
203
|
+
probe[0] = 1;
|
|
204
|
+
for (let i = 0; i < 60; i++) try {
|
|
205
|
+
const req = this.#cb.SearchRequest.create(this.#cb.VectorSearch.fromVectorQuery(this.#cb.VectorQuery.create("vec", probe).numCandidates(10)));
|
|
206
|
+
await scope.search(indexName, req, { timeout: 1e4 });
|
|
207
|
+
break;
|
|
208
|
+
} catch {
|
|
209
|
+
await this.#sleep(1e3);
|
|
210
|
+
}
|
|
211
|
+
} catch (err) {
|
|
212
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async dropCollection(collection, ifExists) {
|
|
216
|
+
if (!this.#bucket) await this.connect();
|
|
217
|
+
const cm = this.#bucket.collections();
|
|
218
|
+
const scopeName = this.#scopeName();
|
|
219
|
+
const physical = this.#phys(collection);
|
|
220
|
+
const indexName = this.#vecIndexName(collection);
|
|
221
|
+
const mgr = this.#bucket.scope(scopeName).searchIndexes();
|
|
222
|
+
try {
|
|
223
|
+
try {
|
|
224
|
+
await mgr.dropIndex(indexName);
|
|
225
|
+
} catch {}
|
|
226
|
+
try {
|
|
227
|
+
const scope = (await cm.getAllScopes()).find((s) => s.name === scopeName);
|
|
228
|
+
if (!scope) {
|
|
229
|
+
if (ifExists) return;
|
|
230
|
+
throw new Error(`scope not found: ${scopeName}`);
|
|
231
|
+
}
|
|
232
|
+
if (!scope.collections?.find((c) => c.name === physical)) {
|
|
233
|
+
if (ifExists) return;
|
|
234
|
+
throw new Error(`collection not found: ${collection}`);
|
|
235
|
+
}
|
|
236
|
+
} catch (err) {
|
|
237
|
+
if (err.message && err.message.includes("not found")) {
|
|
238
|
+
if (ifExists) return;
|
|
239
|
+
throw err;
|
|
240
|
+
}
|
|
241
|
+
throw err;
|
|
242
|
+
}
|
|
243
|
+
await cm.dropCollection(physical, scopeName);
|
|
244
|
+
this.#dims.delete(collection);
|
|
245
|
+
this.#metrics.delete(collection);
|
|
246
|
+
} catch (err) {
|
|
247
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", String(err)]);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async hasCollection(collection) {
|
|
251
|
+
if (!this.#bucket) await this.connect();
|
|
252
|
+
const cm = this.#bucket.collections();
|
|
253
|
+
const scopeName = this.#scopeName();
|
|
254
|
+
try {
|
|
255
|
+
const scope = (await cm.getAllScopes()).find((s) => s.name === scopeName);
|
|
256
|
+
if (!scope) return false;
|
|
257
|
+
return !!scope.collections?.find((c) => c.name === this.#phys(collection));
|
|
258
|
+
} catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
async renameCollection(_from, _to) {
|
|
263
|
+
throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "couchbase"]);
|
|
264
|
+
}
|
|
265
|
+
async executeUpsert(plan) {
|
|
266
|
+
if (plan.records.length === 0) return;
|
|
267
|
+
validateRecords(plan.records);
|
|
268
|
+
const scope = await this.#scope();
|
|
269
|
+
const coll = await this.#coll(scope, plan.collection);
|
|
270
|
+
const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection);
|
|
271
|
+
const dims = expected ?? 0;
|
|
272
|
+
const indexName = this.#vecIndexName(plan.collection);
|
|
273
|
+
try {
|
|
274
|
+
const ids = [];
|
|
275
|
+
for (const r of plan.records) {
|
|
276
|
+
let vector = r.vector;
|
|
277
|
+
if (!vector && r.document) {
|
|
278
|
+
const [v] = await this.encode([r.document], "document");
|
|
279
|
+
vector = v;
|
|
280
|
+
}
|
|
281
|
+
if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
282
|
+
if (expected !== void 0 && vector.length !== expected) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length]);
|
|
283
|
+
await coll.upsert(r.id, {
|
|
284
|
+
id: r.id,
|
|
285
|
+
vec: vector,
|
|
286
|
+
document: r.document ?? "",
|
|
287
|
+
metadata: r.metadata ? JSON.stringify(r.metadata) : "{}",
|
|
288
|
+
type: plan.collection
|
|
289
|
+
});
|
|
290
|
+
ids.push(r.id);
|
|
291
|
+
}
|
|
292
|
+
const probe = new Array(dims).fill(0);
|
|
293
|
+
probe[0] = 1;
|
|
294
|
+
const deadline = Date.now() + 1e4;
|
|
295
|
+
while (Date.now() < deadline) {
|
|
296
|
+
let seen = /* @__PURE__ */ new Set();
|
|
297
|
+
try {
|
|
298
|
+
const req = this.#cb.SearchRequest.create(this.#cb.VectorSearch.fromVectorQuery(this.#cb.VectorQuery.create("vec", probe).numCandidates(100)));
|
|
299
|
+
const res = await scope.search(indexName, req, { timeout: 1e4 });
|
|
300
|
+
seen = new Set(res.rows?.map((row) => row.id) ?? []);
|
|
301
|
+
} catch {}
|
|
302
|
+
if (ids.every((id) => seen.has(id))) break;
|
|
303
|
+
await this.#sleep(300);
|
|
304
|
+
}
|
|
305
|
+
} catch (err) {
|
|
306
|
+
if (isInstanceOf(err, "E_VECTOR_STORE_DIMENSION_MISMATCH", E_VECTOR_STORE_DIMENSION_MISMATCH) || isInstanceOf(err, "E_VECTOR_STORE_UPSERT_FAILED", E_VECTOR_STORE_UPSERT_FAILED)) throw err;
|
|
307
|
+
throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
async executeSearch(plan) {
|
|
311
|
+
const scope = await this.#scope();
|
|
312
|
+
const coll = await this.#coll(scope, plan.collection);
|
|
313
|
+
const indexName = this.#vecIndexName(plan.collection);
|
|
314
|
+
const metric = this.#metrics.get(plan.collection) ?? this.#opts.metric ?? "cosine";
|
|
315
|
+
const oversample = 10;
|
|
316
|
+
let queryVector;
|
|
317
|
+
if (plan.near) {
|
|
318
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
319
|
+
else if ("serverText" in plan.near) {
|
|
320
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
321
|
+
queryVector = v;
|
|
322
|
+
} else if ("id" in plan.near) try {
|
|
323
|
+
queryVector = (await coll.get(plan.near.id)).content?.vec;
|
|
324
|
+
if (!queryVector) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
325
|
+
} catch (err) {
|
|
326
|
+
if (err.message && err.message.includes("DocumentNotFound")) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
327
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const offset = plan.offset ?? 0;
|
|
331
|
+
try {
|
|
332
|
+
if (queryVector) {
|
|
333
|
+
const k = (plan.filter ? 1e3 : (plan.topK + offset) * oversample) || 100;
|
|
334
|
+
const req = this.#cb.SearchRequest.create(this.#cb.VectorSearch.fromVectorQuery(this.#cb.VectorQuery.create("vec", queryVector).numCandidates(Math.max(k, 100))));
|
|
335
|
+
const candidateIds = (await scope.search(indexName, req, { timeout: 1e4 })).rows?.map((row) => row.id) ?? [];
|
|
336
|
+
const candidates = [];
|
|
337
|
+
for (const id of candidateIds) try {
|
|
338
|
+
const got = await coll.get(id);
|
|
339
|
+
candidates.push(got.content);
|
|
340
|
+
} catch {}
|
|
341
|
+
const scored = candidates.filter((d) => evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))).map((d) => ({
|
|
342
|
+
...d,
|
|
343
|
+
score: computeScore(d.vec, queryVector, metric)
|
|
344
|
+
}));
|
|
345
|
+
scored.sort((a, b) => b.score - a.score);
|
|
346
|
+
return scored.slice(offset, offset + plan.topK).map((d) => this.#project(d, plan, true));
|
|
347
|
+
} else {
|
|
348
|
+
const bucket = this.#opts.connection.bucket;
|
|
349
|
+
const scopeName = this.#scopeName();
|
|
350
|
+
return ((await this.#cluster.query(`SELECT d.id, d.vec, d.document, d.metadata FROM \`${bucket}\`.\`${scopeName}\`.\`${this.#phys(plan.collection)}\` d`, { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus })).rows ?? []).filter((d) => evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))).slice(offset, offset + plan.topK).map((d) => this.#project(d, plan, false));
|
|
351
|
+
}
|
|
352
|
+
} catch (err) {
|
|
353
|
+
if (err?.message?.includes("Referenced id not found")) throw err;
|
|
354
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
#parseMeta(val) {
|
|
358
|
+
if (typeof val === "string") try {
|
|
359
|
+
return JSON.parse(val);
|
|
360
|
+
} catch {
|
|
361
|
+
return {};
|
|
362
|
+
}
|
|
363
|
+
if (val && typeof val === "object") return val;
|
|
364
|
+
return {};
|
|
365
|
+
}
|
|
366
|
+
#project(doc, plan, hasScore) {
|
|
367
|
+
const proj = plan.projection;
|
|
368
|
+
const out = {};
|
|
369
|
+
if (proj.id) out.id = doc.id;
|
|
370
|
+
if (proj.vector && Array.isArray(doc.vec)) out.vector = doc.vec.map(Number);
|
|
371
|
+
if (proj.document) out.document = doc.document ?? void 0;
|
|
372
|
+
if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata);
|
|
373
|
+
if (hasScore && typeof doc.score === "number") out.score = doc.score;
|
|
374
|
+
return out;
|
|
375
|
+
}
|
|
376
|
+
async executeDelete(plan) {
|
|
377
|
+
const scope = await this.#scope();
|
|
378
|
+
const coll = await this.#coll(scope, plan.collection);
|
|
379
|
+
const bucket = this.#opts.connection.bucket;
|
|
380
|
+
const scopeName = this.#scopeName();
|
|
381
|
+
try {
|
|
382
|
+
if (plan.ids && plan.ids.length > 0) for (const id of plan.ids) try {
|
|
383
|
+
await coll.remove(id);
|
|
384
|
+
} catch {}
|
|
385
|
+
else if (plan.filter) {
|
|
386
|
+
const targets = ((await this.#cluster.query(`SELECT d.id, d.metadata FROM \`${bucket}\`.\`${scopeName}\`.\`${this.#phys(plan.collection)}\` d`, { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus })).rows ?? []).filter((d) => evaluateFilter(plan.filter, this.#parseMeta(d.metadata))).map((d) => d.id);
|
|
387
|
+
for (const id of targets) try {
|
|
388
|
+
await coll.remove(id);
|
|
389
|
+
} catch {}
|
|
390
|
+
} else await this.#cluster.query(`DELETE FROM \`${bucket}\`.\`${scopeName}\`.\`${this.#phys(plan.collection)}\` d`, { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus });
|
|
391
|
+
} catch (err) {
|
|
392
|
+
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
//#endregion
|
|
397
|
+
export { CouchbaseVectorStore };
|
|
398
|
+
|
|
399
|
+
//# sourceMappingURL=couchbase.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"couchbase.mjs","names":["#opts","#phys","#cluster","#cb","#bucket","#sleep","#scope","#scopeName","#coll","#dims","#metrics","#vecIndexName","#parseMeta","#project"],"sources":["../../../src/batteries/vector/couchbase/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/couchbase\n *\n * Couchbase (Enterprise) vector-store adapter. Vector search is Enterprise Edition only; the\n * Community Edition will throw \"vector typed fields not supported\". A logical collection maps to a\n * Couchbase scope.collection inside a bucket. KV operations (upsert/get/remove) use strong\n * consistency, while the scoped FTS vector index is async (settle-polled after writes).\n *\n * Scoring rule: do NOT trust FTS native scores (they vary per metric and are unbounded for\n * euclidean/l2_norm). Instead, use FTS only to retrieve the candidate id set, then KV-get each\n * candidate doc and RE-COMPUTE the similarity score from the stored vec vs query vec using\n * normalizeScore — guaranteeing the [0,1] contract regardless of backend metric quirks.\n *\n * Filter-scan, enumerate, and delete-by-filter use N1QL with RequestPlus for strong consistency.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'cosine' ? 'cosine' : metric === 'dot' ? 'dot_product' : 'l2_norm'\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n a.forEach((av, i) => {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n })\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n s += av * b[i]\n })\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n a.forEach((av, i) => {\n const d = av - b[i]\n s += d * d\n })\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n\nconst getCB = async (): Promise<any> => {\n try {\n return await import('couchbase')\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['couchbase'])\n }\n}\n\nexport interface CouchbaseVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n url: string\n username: string\n password: string\n bucket: string\n scope?: string\n /**\n * When set, the physical Couchbase collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the scoped FTS vector index\n * builds asynchronously, so a fresh collection per use avoids drop+rebuild-index churn.\n */\n collectionPrefix?: string\n }\n}\n\nexport class CouchbaseVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #cluster: any | null = null\n #bucket: any | null = null\n #cb: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): CouchbaseVectorStoreOptions {\n return this.options as CouchbaseVectorStoreOptions\n }\n\n #scopeName(): string {\n return this.#opts.connection.scope ?? '_default'\n }\n\n // Map a logical collection name to its physical Couchbase collection (optional prefix).\n #phys(collection: string): string {\n const prefix = this.#opts.connection.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n #vecIndexName(collection: string): string {\n return `${this.#phys(collection)}_vec`\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#cluster) return\n const couchbase = await getCB()\n this.#cb = couchbase\n const c = this.#opts.connection\n try {\n this.#cluster = await couchbase.connect(c.url, { username: c.username, password: c.password })\n this.#bucket = this.#cluster.bucket(c.bucket)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#cluster) {\n await this.#cluster.close()\n this.#cluster = null\n this.#bucket = null\n }\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async #scope(): Promise<any> {\n if (!this.#bucket) await this.connect()\n return this.#bucket.scope(this.#scopeName())\n }\n\n async #coll(scope: any, collection: string): Promise<any> {\n return scope.collection(this.#phys(collection))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n this.#metrics.set(spec.collection, spec.vector.metric)\n\n // Physical collection name (logical name + optional prefix); the FTS index, N1QL identifiers\n // and the collection-manager ops all key off the physical name.\n const collectionName = this.#phys(spec.collection)\n const indexName = this.#vecIndexName(spec.collection)\n\n try {\n // Create scope.collection\n try {\n await cm.createCollection({ name: collectionName, scopeName })\n } catch (err: any) {\n if (err.message && err.message.includes('CollectionExists')) {\n if (ifNotExists) {\n // Clear existing collection\n try {\n await this.#cluster.query(\n `DELETE FROM \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n )\n } catch {\n // Ignore cleanup failures\n }\n } else {\n // Drop and recreate\n await cm.dropCollection(collectionName, scopeName)\n await cm.createCollection({ name: collectionName, scopeName })\n }\n } else {\n throw err\n }\n }\n\n // Wait for collection to be ready\n await this.#sleep(1000)\n\n // Create primary index\n try {\n await this.#cluster.query(\n `CREATE PRIMARY INDEX ON \\`${this.#opts.connection.bucket}\\`.\\`${scopeName}\\`.\\`${collectionName}\\``\n )\n } catch {\n // Ignore if already exists\n }\n\n // Create FTS vector index\n const mgr = this.#bucket.scope(scopeName).searchIndexes()\n try {\n await mgr.upsertIndex({\n name: indexName,\n sourceType: 'gocbcore',\n sourceName: this.#opts.connection.bucket,\n type: 'fulltext-index',\n planParams: { indexPartitions: 1 },\n params: {\n doc_config: {\n mode: 'scope.collection.type_field',\n type_field: 'type',\n },\n mapping: {\n default_mapping: { enabled: false },\n default_analyzer: 'standard',\n default_type: '_default',\n types: {\n [`${scopeName}.${collectionName}`]: {\n enabled: true,\n dynamic: false,\n properties: {\n vec: {\n enabled: true,\n fields: [\n {\n name: 'vec',\n type: 'vector',\n dims: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n index: true,\n },\n ],\n },\n },\n },\n },\n },\n },\n })\n } catch {\n // Ignore if index already exists\n }\n\n // Poll until index is queryable\n const scope = this.#bucket.scope(scopeName)\n const probe = new Array(spec.vector.dimensions).fill(0)\n probe[0] = 1\n for (let i = 0; i < 60; i++) {\n try {\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', probe).numCandidates(10)\n )\n )\n await scope.search(indexName, req, { timeout: 10000 })\n break\n } catch {\n await this.#sleep(1000)\n }\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n const physical = this.#phys(collection)\n const indexName = this.#vecIndexName(collection)\n const mgr = this.#bucket.scope(scopeName).searchIndexes()\n\n try {\n // Drop FTS index\n try {\n await mgr.dropIndex(indexName)\n } catch {\n // Ignore if index doesn't exist\n }\n\n // Drop collection\n try {\n const scopes = await cm.getAllScopes()\n const scope = scopes.find((s: any) => s.name === scopeName)\n if (!scope) {\n if (ifExists) return\n throw new Error(`scope not found: ${scopeName}`)\n }\n const coll = scope.collections?.find((c: any) => c.name === physical)\n if (!coll) {\n if (ifExists) return\n throw new Error(`collection not found: ${collection}`)\n }\n } catch (err: any) {\n if (err.message && err.message.includes('not found')) {\n if (ifExists) return\n throw err\n }\n throw err\n }\n\n await cm.dropCollection(physical, scopeName)\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n if (!this.#bucket) await this.connect()\n const cm = this.#bucket.collections()\n const scopeName = this.#scopeName()\n try {\n const scopes = await cm.getAllScopes()\n const scope = scopes.find((s: any) => s.name === scopeName)\n if (!scope) return false\n return !!scope.collections?.find((c: any) => c.name === this.#phys(collection))\n } catch {\n return false\n }\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'couchbase'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const dims = expected ?? 0\n const indexName = this.#vecIndexName(plan.collection)\n\n try {\n const ids: string[] = []\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await coll.upsert(r.id, {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n type: plan.collection,\n })\n ids.push(r.id)\n }\n\n // Poll until FTS index shows all ids\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen = new Set<string>()\n try {\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', probe).numCandidates(100)\n )\n )\n const res: any = await scope.search(indexName, req, { timeout: 10000 })\n seen = new Set(res.rows?.map((row: any) => row.id) ?? [])\n } catch {\n // Continue polling\n }\n if (ids.every((id) => seen.has(id))) break\n await this.#sleep(300)\n }\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const indexName = this.#vecIndexName(plan.collection)\n const metric: DistanceMetric =\n this.#metrics.get(plan.collection) ?? this.#opts.metric ?? 'cosine'\n const oversample = 10\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n try {\n const got: any = await coll.get(plan.near.id)\n queryVector = got.content?.vec\n if (!queryVector) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n } catch (err: any) {\n if (err.message && err.message.includes('DocumentNotFound')) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n // Similarity search: FTS for candidates, then KV-get and re-score\n const k = (plan.filter ? 1000 : (plan.topK + offset) * oversample) || 100\n const req = this.#cb.SearchRequest.create(\n this.#cb.VectorSearch.fromVectorQuery(\n this.#cb.VectorQuery.create('vec', queryVector).numCandidates(Math.max(k, 100))\n )\n )\n const res: any = await scope.search(indexName, req, { timeout: 10000 })\n const candidateIds = res.rows?.map((row: any) => row.id) ?? []\n\n // KV-get each candidate to get full doc\n const candidates: any[] = []\n for (const id of candidateIds) {\n try {\n const got: any = await coll.get(id)\n candidates.push(got.content)\n } catch {\n // Skip docs that can't be read\n }\n }\n\n // Apply filter and compute scores\n const filtered = candidates.filter((d) =>\n evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n )\n\n // Re-compute scores and sort\n const scored = filtered.map((d) => ({\n ...d,\n score: computeScore(d.vec, queryVector, metric),\n }))\n scored.sort((a, b) => b.score - a.score)\n\n return scored\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: N1QL\n const bucket = this.#opts.connection.bucket\n const scopeName = this.#scopeName()\n const q = await this.#cluster.query(\n `SELECT d.id, d.vec, d.document, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n const docs: any[] = q.rows ?? []\n\n const filtered = docs.filter((d) =>\n evaluateFilter(plan.filter ?? {}, this.#parseMeta(d.metadata))\n )\n\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err: any) {\n if (err?.message?.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, hasScore: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (hasScore && typeof doc.score === 'number') {\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const scope = await this.#scope()\n const coll = await this.#coll(scope, plan.collection)\n const bucket = this.#opts.connection.bucket\n const scopeName = this.#scopeName()\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n // Delete by ids\n for (const id of plan.ids) {\n try {\n await coll.remove(id)\n } catch {\n // Ignore DocumentNotFoundError\n }\n }\n } else if (plan.filter) {\n // Enumerate via N1QL, filter, then delete\n const q = await this.#cluster.query(\n `SELECT d.id, d.metadata FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n const docs: any[] = q.rows ?? []\n\n const targets = docs\n .filter((d) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n\n for (const id of targets) {\n try {\n await coll.remove(id)\n } catch {\n // Ignore DocumentNotFoundError\n }\n }\n } else {\n // Delete all\n await this.#cluster.query(\n `DELETE FROM \\`${bucket}\\`.\\`${scopeName}\\`.\\`${this.#phys(plan.collection)}\\` d`,\n { scanConsistency: this.#cb.QueryScanConsistency.RequestPlus }\n )\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @nhtio/adk/batteries/vector/duckdb
|
|
3
|
+
*
|
|
4
|
+
* In-process DuckDB adapter (like sqlite_vec — no server). Uses the `vss` community
|
|
5
|
+
* extension for vector distance functions over a `FLOAT[N]` column; metadata lives in a
|
|
6
|
+
* `JSON` column filtered with DuckDB's `json_extract*` functions. Each collection is a
|
|
7
|
+
* table; the document and id are plain columns.
|
|
8
|
+
*
|
|
9
|
+
* Driver: `@duckdb/node-api` (promise-based). Path defaults to `:memory:`.
|
|
10
|
+
*/
|
|
11
|
+
import { BaseVectorStore } from "../contract";
|
|
12
|
+
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
13
|
+
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
14
|
+
export interface DuckDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
15
|
+
connection?: {
|
|
16
|
+
path?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare class DuckDBVectorStore extends BaseVectorStore {
|
|
20
|
+
#private;
|
|
21
|
+
readonly capabilities: VectorStoreCapabilities;
|
|
22
|
+
static isAvailable(): boolean;
|
|
23
|
+
isAvailable(): boolean;
|
|
24
|
+
connect(): Promise<void>;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
27
|
+
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
28
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
29
|
+
renameCollection(from: string, to: string): Promise<void>;
|
|
30
|
+
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
31
|
+
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
32
|
+
executeDelete(plan: DeletePlan): Promise<void>;
|
|
33
|
+
}
|