@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,436 @@
|
|
|
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/s3vectors/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* @module @nhtio/adk/batteries/vector/s3vectors
|
|
11
|
+
*
|
|
12
|
+
* AWS S3 Vectors vector-store adapter. A vector BUCKET is provisioned out-of-band (the adapter
|
|
13
|
+
* does NOT create the bucket); a logical collection = an **index** inside that bucket. The SDK is
|
|
14
|
+
* command-based: create/delete/list indexes, PutVectors/QueryVectors/GetVectors/DeleteVectors.
|
|
15
|
+
*
|
|
16
|
+
* Scoring rule: QueryVectors returns `distance`. For cosine, distance = 1 - cosineSim; identical
|
|
17
|
+
* vectors → 0. For euclidean, distance = L2 distance. Scores are derived from the returned
|
|
18
|
+
* distance and normalized to [0,1].
|
|
19
|
+
*
|
|
20
|
+
* Metadata is NATIVE JSON (object). Store the document text under the reserved metadata key
|
|
21
|
+
* `__document`; keep user metadata flat alongside. On read, pull `__document` out into
|
|
22
|
+
* `match.document` and return the rest as `match.metadata`.
|
|
23
|
+
*
|
|
24
|
+
* Filtering: S3 Vectors supports a native filter (Mongo-ish), but for guaranteed cross-adapter
|
|
25
|
+
* parity, **over-fetch and JS-filter** with `evaluateFilter`. When `plan.filter` is set, request
|
|
26
|
+
* a larger `topK` (e.g. 500) without a native filter, then JS-filter, then slice.
|
|
27
|
+
*
|
|
28
|
+
* Eventual consistency: settle-poll after writes/deletes so the conformance suite — which writes
|
|
29
|
+
* then immediately reads — passes deterministically.
|
|
30
|
+
*/
|
|
31
|
+
var getS3Vectors = async () => {
|
|
32
|
+
try {
|
|
33
|
+
const mod = await import("@aws-sdk/client-s3vectors");
|
|
34
|
+
return {
|
|
35
|
+
S3VectorsClient: mod.S3VectorsClient,
|
|
36
|
+
CreateIndexCommand: mod.CreateIndexCommand,
|
|
37
|
+
DeleteIndexCommand: mod.DeleteIndexCommand,
|
|
38
|
+
ListIndexesCommand: mod.ListIndexesCommand,
|
|
39
|
+
PutVectorsCommand: mod.PutVectorsCommand,
|
|
40
|
+
QueryVectorsCommand: mod.QueryVectorsCommand,
|
|
41
|
+
GetVectorsCommand: mod.GetVectorsCommand,
|
|
42
|
+
DeleteVectorsCommand: mod.DeleteVectorsCommand
|
|
43
|
+
};
|
|
44
|
+
} catch {
|
|
45
|
+
throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(["@aws-sdk/client-s3vectors"]);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var mapMetricToS3 = (metric) => {
|
|
49
|
+
if (metric === "cosine") return "cosine";
|
|
50
|
+
if (metric === "euclidean") return "euclidean";
|
|
51
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", "Metric \"dot\" is not supported by AWS S3 Vectors; use \"cosine\" or \"euclidean\""]);
|
|
52
|
+
};
|
|
53
|
+
var scoreFromDistance = (distance, metric) => {
|
|
54
|
+
if (metric === "cosine") return normalizeScore(1 - distance, "cosine", "similarity");
|
|
55
|
+
else if (metric === "euclidean") return normalizeScore(distance, "euclidean", "distance");
|
|
56
|
+
else return normalizeScore(1 - distance, "cosine", "similarity");
|
|
57
|
+
};
|
|
58
|
+
var S3VectorsVectorStore = class extends BaseVectorStore {
|
|
59
|
+
capabilities = {
|
|
60
|
+
transactions: false,
|
|
61
|
+
namedVectors: false,
|
|
62
|
+
rename: false,
|
|
63
|
+
rawSql: false,
|
|
64
|
+
builtInEncoding: false,
|
|
65
|
+
consistency: {
|
|
66
|
+
configurable: false,
|
|
67
|
+
default: "strong",
|
|
68
|
+
modes: ["strong"]
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
#client = null;
|
|
72
|
+
#dims = /* @__PURE__ */ new Map();
|
|
73
|
+
#metrics = /* @__PURE__ */ new Map();
|
|
74
|
+
get #opts() {
|
|
75
|
+
return this.options;
|
|
76
|
+
}
|
|
77
|
+
#index(collection) {
|
|
78
|
+
return `${this.#opts.connection.indexPrefix ?? ""}${collection}`;
|
|
79
|
+
}
|
|
80
|
+
async #settle(physicalIndex, opts) {
|
|
81
|
+
const present = opts.present ?? [];
|
|
82
|
+
const absent = opts.absent ?? [];
|
|
83
|
+
if (present.length === 0 && absent.length === 0) return;
|
|
84
|
+
const deadline = Date.now() + 1e4;
|
|
85
|
+
const probeVec = new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0);
|
|
86
|
+
const bucket = this.#opts.connection.bucket;
|
|
87
|
+
while (true) {
|
|
88
|
+
let presentOk = true;
|
|
89
|
+
let absentOk = true;
|
|
90
|
+
if (present.length > 0) try {
|
|
91
|
+
const qr = await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
92
|
+
vectorBucketName: bucket,
|
|
93
|
+
indexName: physicalIndex,
|
|
94
|
+
queryVector: { float32: probeVec },
|
|
95
|
+
topK: Math.max(present.length + 5, 10),
|
|
96
|
+
returnMetadata: false,
|
|
97
|
+
returnDistance: false
|
|
98
|
+
}));
|
|
99
|
+
const seen = new Set((qr.vectors ?? []).map((v) => v.key));
|
|
100
|
+
presentOk = present.every((k) => seen.has(k));
|
|
101
|
+
} catch {
|
|
102
|
+
presentOk = false;
|
|
103
|
+
}
|
|
104
|
+
if (absent.length > 0) try {
|
|
105
|
+
const qr = await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
106
|
+
vectorBucketName: bucket,
|
|
107
|
+
indexName: physicalIndex,
|
|
108
|
+
queryVector: { float32: probeVec },
|
|
109
|
+
topK: 100,
|
|
110
|
+
returnMetadata: false,
|
|
111
|
+
returnDistance: false
|
|
112
|
+
}));
|
|
113
|
+
const seen = new Set((qr.vectors ?? []).map((v) => v.key));
|
|
114
|
+
absentOk = absent.every((k) => !seen.has(k));
|
|
115
|
+
} catch {
|
|
116
|
+
absentOk = false;
|
|
117
|
+
}
|
|
118
|
+
if (presentOk && absentOk) return;
|
|
119
|
+
if (Date.now() >= deadline) return;
|
|
120
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
static isAvailable() {
|
|
124
|
+
return typeof process !== "undefined";
|
|
125
|
+
}
|
|
126
|
+
isAvailable() {
|
|
127
|
+
return typeof process !== "undefined";
|
|
128
|
+
}
|
|
129
|
+
#cmd;
|
|
130
|
+
async connect() {
|
|
131
|
+
if (this.#client) return;
|
|
132
|
+
const { S3VectorsClient, ...cmd } = await getS3Vectors();
|
|
133
|
+
this.#cmd = cmd;
|
|
134
|
+
const { region, credentials } = this.#opts.connection;
|
|
135
|
+
try {
|
|
136
|
+
this.#client = new S3VectorsClient({
|
|
137
|
+
region,
|
|
138
|
+
credentials
|
|
139
|
+
});
|
|
140
|
+
} catch (err) {
|
|
141
|
+
throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)]);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async close() {
|
|
145
|
+
if (this.#client) {
|
|
146
|
+
await this.#client.destroy?.();
|
|
147
|
+
this.#client = null;
|
|
148
|
+
this.#cmd = void 0;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async createCollection(spec, ifNotExists) {
|
|
152
|
+
const collection = spec.collection;
|
|
153
|
+
const physicalIndex = this.#index(collection);
|
|
154
|
+
const dims = spec.vector.dimensions;
|
|
155
|
+
const metric = spec.vector.metric;
|
|
156
|
+
const s3Metric = mapMetricToS3(metric);
|
|
157
|
+
this.#dims.set(collection, dims);
|
|
158
|
+
this.#metrics.set(collection, metric);
|
|
159
|
+
if (ifNotExists) {
|
|
160
|
+
if (await this.hasCollection(collection)) return;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
await this.connect();
|
|
164
|
+
await this.#client.send(new this.#cmd.CreateIndexCommand({
|
|
165
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
166
|
+
indexName: physicalIndex,
|
|
167
|
+
dataType: "float32",
|
|
168
|
+
dimension: dims,
|
|
169
|
+
distanceMetric: s3Metric
|
|
170
|
+
}));
|
|
171
|
+
const probeVec = new Array(dims).fill(0).map((_, i) => i === 0 ? 1 : 0);
|
|
172
|
+
const deadline = Date.now() + 5e3;
|
|
173
|
+
while (Date.now() < deadline) try {
|
|
174
|
+
await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
175
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
176
|
+
indexName: physicalIndex,
|
|
177
|
+
queryVector: { float32: probeVec },
|
|
178
|
+
topK: 1,
|
|
179
|
+
returnMetadata: false,
|
|
180
|
+
returnDistance: false
|
|
181
|
+
}));
|
|
182
|
+
break;
|
|
183
|
+
} catch {
|
|
184
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
185
|
+
}
|
|
186
|
+
} catch (err) {
|
|
187
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["createCollection", String(err)]);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async dropCollection(collection, ifExists) {
|
|
191
|
+
const physicalIndex = this.#index(collection);
|
|
192
|
+
if (ifExists) {
|
|
193
|
+
if (!await this.hasCollection(collection)) return;
|
|
194
|
+
} else if (!await this.hasCollection(collection)) return;
|
|
195
|
+
try {
|
|
196
|
+
await this.connect();
|
|
197
|
+
await this.#client.send(new this.#cmd.DeleteIndexCommand({
|
|
198
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
199
|
+
indexName: physicalIndex
|
|
200
|
+
}));
|
|
201
|
+
this.#dims.delete(collection);
|
|
202
|
+
this.#metrics.delete(collection);
|
|
203
|
+
} catch (err) {
|
|
204
|
+
const msg = String(err);
|
|
205
|
+
if (ifExists && (msg.includes("not found") || msg.includes("ResourceNotFoundException"))) return;
|
|
206
|
+
throw new E_VECTOR_STORE_COLLECTION_FAILED(["dropCollection", msg]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async hasCollection(collection) {
|
|
210
|
+
await this.connect();
|
|
211
|
+
try {
|
|
212
|
+
const { indexes } = await this.#client.send(new this.#cmd.ListIndexesCommand({ vectorBucketName: this.#opts.connection.bucket }));
|
|
213
|
+
const physicalIndex = this.#index(collection);
|
|
214
|
+
return !!indexes?.find((idx) => idx.indexName === physicalIndex);
|
|
215
|
+
} catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async renameCollection(_from, _to) {
|
|
220
|
+
throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(["renameCollection", "s3vectors"]);
|
|
221
|
+
}
|
|
222
|
+
async executeUpsert(plan) {
|
|
223
|
+
if (plan.records.length === 0) return;
|
|
224
|
+
validateRecords(plan.records);
|
|
225
|
+
const collection = plan.collection;
|
|
226
|
+
const physicalIndex = this.#index(collection);
|
|
227
|
+
const dims = this.#dims.get(collection) ?? this.#opts.dimensions;
|
|
228
|
+
try {
|
|
229
|
+
await this.connect();
|
|
230
|
+
const vectors = [];
|
|
231
|
+
for (const r of plan.records) {
|
|
232
|
+
let vector = r.vector;
|
|
233
|
+
if (!vector && r.document) {
|
|
234
|
+
const [v] = await this.encode([r.document], "document");
|
|
235
|
+
vector = v;
|
|
236
|
+
}
|
|
237
|
+
if (!vector) throw new E_VECTOR_STORE_UPSERT_FAILED(["Record missing vector and document"]);
|
|
238
|
+
if (dims !== void 0 && vector.length !== dims) throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length]);
|
|
239
|
+
vectors.push({
|
|
240
|
+
key: r.id,
|
|
241
|
+
data: { float32: vector },
|
|
242
|
+
metadata: {
|
|
243
|
+
...r.metadata ?? {},
|
|
244
|
+
__document: r.document ?? ""
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
await this.#client.send(new this.#cmd.PutVectorsCommand({
|
|
249
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
250
|
+
indexName: physicalIndex,
|
|
251
|
+
vectors
|
|
252
|
+
}));
|
|
253
|
+
await this.#settle(physicalIndex, { present: plan.records.map((r) => r.id) });
|
|
254
|
+
} catch (err) {
|
|
255
|
+
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;
|
|
256
|
+
throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)]);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async executeSearch(plan) {
|
|
260
|
+
await this.connect();
|
|
261
|
+
const collection = plan.collection;
|
|
262
|
+
const physicalIndex = this.#index(collection);
|
|
263
|
+
const metric = this.#metrics.get(collection) ?? this.#opts.metric ?? "cosine";
|
|
264
|
+
const offset = plan.offset ?? 0;
|
|
265
|
+
let queryVector;
|
|
266
|
+
if (plan.near) {
|
|
267
|
+
if ("vector" in plan.near) queryVector = plan.near.vector;
|
|
268
|
+
else if ("serverText" in plan.near) {
|
|
269
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
270
|
+
queryVector = v;
|
|
271
|
+
} else if ("id" in plan.near) try {
|
|
272
|
+
const vec = (await this.#client.send(new this.#cmd.GetVectorsCommand({
|
|
273
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
274
|
+
indexName: physicalIndex,
|
|
275
|
+
keys: [plan.near.id],
|
|
276
|
+
returnData: true,
|
|
277
|
+
returnMetadata: true
|
|
278
|
+
}))).vectors?.[0];
|
|
279
|
+
if (!vec || !vec.data?.float32) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
280
|
+
queryVector = vec.data.float32;
|
|
281
|
+
} catch (err) {
|
|
282
|
+
if (err?.message?.includes("not found") || err?.message?.includes("ResourceNotFoundException")) throw new E_VECTOR_STORE_SEARCH_FAILED(["Referenced id not found: " + plan.near.id]);
|
|
283
|
+
throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)]);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const topK = plan.topK;
|
|
287
|
+
if (queryVector) {
|
|
288
|
+
const k = plan.filter ? 100 : Math.min(100, Math.max(topK + offset, 10));
|
|
289
|
+
let rawMatches = (await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
290
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
291
|
+
indexName: physicalIndex,
|
|
292
|
+
queryVector: { float32: queryVector },
|
|
293
|
+
topK: k,
|
|
294
|
+
returnMetadata: true,
|
|
295
|
+
returnDistance: true
|
|
296
|
+
}))).vectors ?? [];
|
|
297
|
+
if (plan.filter) rawMatches = rawMatches.filter((v) => {
|
|
298
|
+
const meta = {};
|
|
299
|
+
for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
|
|
300
|
+
return evaluateFilter(plan.filter, meta);
|
|
301
|
+
});
|
|
302
|
+
rawMatches = rawMatches.slice(offset, offset + topK);
|
|
303
|
+
const projected = [];
|
|
304
|
+
const keysToFetch = /* @__PURE__ */ new Set();
|
|
305
|
+
if (plan.projection.vector) for (const v of rawMatches) keysToFetch.add(v.key);
|
|
306
|
+
const vecStore = {};
|
|
307
|
+
if (keysToFetch.size > 0) {
|
|
308
|
+
const batch = Array.from(keysToFetch);
|
|
309
|
+
const vecRes = await this.#client.send(new this.#cmd.GetVectorsCommand({
|
|
310
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
311
|
+
indexName: physicalIndex,
|
|
312
|
+
keys: batch,
|
|
313
|
+
returnData: true,
|
|
314
|
+
returnMetadata: false
|
|
315
|
+
}));
|
|
316
|
+
for (const v of vecRes.vectors ?? []) if (v.data?.float32) vecStore[v.key] = v.data.float32;
|
|
317
|
+
}
|
|
318
|
+
for (const v of rawMatches) {
|
|
319
|
+
const proj = {};
|
|
320
|
+
if (plan.projection.id) proj.id = v.key;
|
|
321
|
+
if (plan.projection.document) proj.document = typeof v.metadata?.__document === "string" ? v.metadata.__document : "";
|
|
322
|
+
if (plan.projection.metadata) {
|
|
323
|
+
const meta = {};
|
|
324
|
+
for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
|
|
325
|
+
proj.metadata = meta;
|
|
326
|
+
}
|
|
327
|
+
if (plan.projection.vector) proj.vector = vecStore[v.key];
|
|
328
|
+
if (plan.near && v.distance !== void 0) proj.score = scoreFromDistance(v.distance, metric);
|
|
329
|
+
projected.push(proj);
|
|
330
|
+
}
|
|
331
|
+
return projected;
|
|
332
|
+
} else {
|
|
333
|
+
let rawMatches = (await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
334
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
335
|
+
indexName: physicalIndex,
|
|
336
|
+
queryVector: { float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0) },
|
|
337
|
+
topK: 100,
|
|
338
|
+
returnMetadata: true,
|
|
339
|
+
returnDistance: false
|
|
340
|
+
}))).vectors ?? [];
|
|
341
|
+
if (plan.filter) rawMatches = rawMatches.filter((v) => {
|
|
342
|
+
const meta = {};
|
|
343
|
+
for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
|
|
344
|
+
return evaluateFilter(plan.filter, meta);
|
|
345
|
+
});
|
|
346
|
+
rawMatches = rawMatches.slice(offset, offset + topK);
|
|
347
|
+
const vecStore = {};
|
|
348
|
+
if (plan.projection.vector && rawMatches.length > 0) {
|
|
349
|
+
const vecRes = await this.#client.send(new this.#cmd.GetVectorsCommand({
|
|
350
|
+
vectorBucketName: this.#opts.connection.bucket,
|
|
351
|
+
indexName: physicalIndex,
|
|
352
|
+
keys: rawMatches.map((v) => v.key),
|
|
353
|
+
returnData: true,
|
|
354
|
+
returnMetadata: false
|
|
355
|
+
}));
|
|
356
|
+
for (const v of vecRes.vectors ?? []) if (v.data?.float32) vecStore[v.key] = v.data.float32;
|
|
357
|
+
}
|
|
358
|
+
const projected = [];
|
|
359
|
+
for (const v of rawMatches) {
|
|
360
|
+
const proj = {};
|
|
361
|
+
if (plan.projection.id) proj.id = v.key;
|
|
362
|
+
if (plan.projection.document) proj.document = typeof v.metadata?.__document === "string" ? v.metadata.__document : "";
|
|
363
|
+
if (plan.projection.metadata) {
|
|
364
|
+
const meta = {};
|
|
365
|
+
for (const key in v.metadata) if (key !== "__document") meta[key] = v.metadata[key];
|
|
366
|
+
proj.metadata = meta;
|
|
367
|
+
}
|
|
368
|
+
if (plan.projection.vector) proj.vector = vecStore[v.key];
|
|
369
|
+
projected.push(proj);
|
|
370
|
+
}
|
|
371
|
+
return projected;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async executeDelete(plan) {
|
|
375
|
+
const collection = plan.collection;
|
|
376
|
+
const physicalIndex = this.#index(collection);
|
|
377
|
+
try {
|
|
378
|
+
await this.connect();
|
|
379
|
+
const bucket = this.#opts.connection.bucket;
|
|
380
|
+
if (plan.ids && plan.ids.length > 0) {
|
|
381
|
+
await this.#client.send(new this.#cmd.DeleteVectorsCommand({
|
|
382
|
+
vectorBucketName: bucket,
|
|
383
|
+
indexName: physicalIndex,
|
|
384
|
+
keys: plan.ids
|
|
385
|
+
}));
|
|
386
|
+
await this.#settle(physicalIndex, { absent: plan.ids });
|
|
387
|
+
} else if (plan.filter) {
|
|
388
|
+
const res = await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
389
|
+
vectorBucketName: bucket,
|
|
390
|
+
indexName: physicalIndex,
|
|
391
|
+
queryVector: { float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0) },
|
|
392
|
+
topK: 100,
|
|
393
|
+
returnMetadata: true,
|
|
394
|
+
returnDistance: false
|
|
395
|
+
}));
|
|
396
|
+
const targets = [];
|
|
397
|
+
for (const v of res.vectors ?? []) {
|
|
398
|
+
const evalMeta = {};
|
|
399
|
+
for (const key in v.metadata) if (key !== "__document") evalMeta[key] = v.metadata[key];
|
|
400
|
+
if (evaluateFilter(plan.filter, evalMeta)) targets.push(v.key);
|
|
401
|
+
}
|
|
402
|
+
if (targets.length > 0) {
|
|
403
|
+
await this.#client.send(new this.#cmd.DeleteVectorsCommand({
|
|
404
|
+
vectorBucketName: bucket,
|
|
405
|
+
indexName: physicalIndex,
|
|
406
|
+
keys: targets
|
|
407
|
+
}));
|
|
408
|
+
await this.#settle(physicalIndex, { absent: targets });
|
|
409
|
+
}
|
|
410
|
+
} else {
|
|
411
|
+
const allKeys = ((await this.#client.send(new this.#cmd.QueryVectorsCommand({
|
|
412
|
+
vectorBucketName: bucket,
|
|
413
|
+
indexName: physicalIndex,
|
|
414
|
+
queryVector: { float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => i === 0 ? 1 : 0) },
|
|
415
|
+
topK: 100,
|
|
416
|
+
returnMetadata: false,
|
|
417
|
+
returnDistance: false
|
|
418
|
+
}))).vectors ?? []).map((v) => v.key);
|
|
419
|
+
if (allKeys.length > 0) {
|
|
420
|
+
await this.#client.send(new this.#cmd.DeleteVectorsCommand({
|
|
421
|
+
vectorBucketName: bucket,
|
|
422
|
+
indexName: physicalIndex,
|
|
423
|
+
keys: allKeys
|
|
424
|
+
}));
|
|
425
|
+
await this.#settle(physicalIndex, { absent: allKeys });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
} catch (err) {
|
|
429
|
+
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
//#endregion
|
|
434
|
+
export { S3VectorsVectorStore };
|
|
435
|
+
|
|
436
|
+
//# sourceMappingURL=s3vectors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3vectors.mjs","names":["#opts","#settle","#client","#cmd","#index","#dims","#metrics"],"sources":["../../../src/batteries/vector/s3vectors/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/s3vectors\n *\n * AWS S3 Vectors vector-store adapter. A vector BUCKET is provisioned out-of-band (the adapter\n * does NOT create the bucket); a logical collection = an **index** inside that bucket. The SDK is\n * command-based: create/delete/list indexes, PutVectors/QueryVectors/GetVectors/DeleteVectors.\n *\n * Scoring rule: QueryVectors returns `distance`. For cosine, distance = 1 - cosineSim; identical\n * vectors → 0. For euclidean, distance = L2 distance. Scores are derived from the returned\n * distance and normalized to [0,1].\n *\n * Metadata is NATIVE JSON (object). Store the document text under the reserved metadata key\n * `__document`; keep user metadata flat alongside. On read, pull `__document` out into\n * `match.document` and return the rest as `match.metadata`.\n *\n * Filtering: S3 Vectors supports a native filter (Mongo-ish), but for guaranteed cross-adapter\n * parity, **over-fetch and JS-filter** with `evaluateFilter`. When `plan.filter` is set, request\n * a larger `topK` (e.g. 500) without a native filter, then JS-filter, then slice.\n *\n * Eventual consistency: settle-poll after writes/deletes so the conformance suite — which writes\n * then immediately reads — passes deterministically.\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 getS3Vectors = async (): Promise<{\n S3VectorsClient: any\n CreateIndexCommand: any\n DeleteIndexCommand: any\n ListIndexesCommand: any\n PutVectorsCommand: any\n QueryVectorsCommand: any\n GetVectorsCommand: any\n DeleteVectorsCommand: any\n}> => {\n try {\n const mod = await import('@aws-sdk/client-s3vectors')\n return {\n S3VectorsClient: mod.S3VectorsClient,\n CreateIndexCommand: mod.CreateIndexCommand,\n DeleteIndexCommand: mod.DeleteIndexCommand,\n ListIndexesCommand: mod.ListIndexesCommand,\n PutVectorsCommand: mod.PutVectorsCommand,\n QueryVectorsCommand: mod.QueryVectorsCommand,\n GetVectorsCommand: mod.GetVectorsCommand,\n DeleteVectorsCommand: mod.DeleteVectorsCommand,\n }\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@aws-sdk/client-s3vectors'])\n }\n}\n\nexport interface S3VectorsVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n bucket: string\n region?: string\n credentials?: { accessKeyId: string; secretAccessKey: string; sessionToken?: string }\n indexPrefix?: string\n }\n}\n\nconst mapMetricToS3 = (metric: DistanceMetric): string => {\n if (metric === 'cosine') return 'cosine'\n if (metric === 'euclidean') return 'euclidean'\n // dot is not supported by S3 Vectors\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n 'Metric \"dot\" is not supported by AWS S3 Vectors; use \"cosine\" or \"euclidean\"',\n ])\n}\n\n// QueryVectors returns a `distance`; convert it to the battery's normalized [0,1] similarity\n// score. For cosine, S3 Vectors distance = 1 - cosineSim, so sim = 1 - distance.\nconst scoreFromDistance = (distance: number, metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n // cosine distance = 1 - sim, so sim = 1 - distance\n return normalizeScore(1 - distance, 'cosine', 'similarity')\n } else if (metric === 'euclidean') {\n return normalizeScore(distance, 'euclidean', 'distance')\n } else {\n // Fallback\n return normalizeScore(1 - distance, 'cosine', 'similarity')\n }\n}\n\nexport class S3VectorsVectorStore 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 #client: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): S3VectorsVectorStoreOptions {\n return this.options as S3VectorsVectorStoreOptions\n }\n\n // Map a logical collection name to its physical S3 Vectors index name (with optional prefix).\n #index(collection: string): string {\n const prefix = this.#opts.connection.indexPrefix ?? ''\n return `${prefix}${collection}`\n }\n\n // Settle-poll: wait until the given keys are visible in QueryVectors (for upsert) or absent\n // (for delete), bounded ~10s with 300ms polls.\n async #settle(\n physicalIndex: string,\n opts: { present?: string[]; absent?: string[] }\n ): Promise<void> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return\n\n const deadline = Date.now() + 10_000\n const probeVec = new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const bucket = this.#opts.connection.bucket\n\n while (true) {\n let presentOk = true\n let absentOk = true\n\n if (present.length > 0) {\n try {\n const qr = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: { float32: probeVec },\n topK: Math.max(present.length + 5, 10),\n returnMetadata: false,\n returnDistance: false,\n })\n )\n const seen = new Set((qr.vectors ?? []).map((v: any) => v.key))\n presentOk = present.every((k) => seen.has(k))\n } catch {\n presentOk = false\n }\n }\n\n if (absent.length > 0) {\n try {\n const qr = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: { float32: probeVec },\n topK: 100,\n returnMetadata: false,\n returnDistance: false,\n })\n )\n const seen = new Set((qr.vectors ?? []).map((v: any) => v.key))\n absentOk = absent.every((k) => !seen.has(k))\n } catch {\n absentOk = false\n }\n }\n\n if (presentOk && absentOk) return\n if (Date.now() >= deadline) return\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n #cmd?: {\n CreateIndexCommand: any\n DeleteIndexCommand: any\n ListIndexesCommand: any\n PutVectorsCommand: any\n QueryVectorsCommand: any\n GetVectorsCommand: any\n DeleteVectorsCommand: any\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const { S3VectorsClient, ...cmd } = await getS3Vectors()\n this.#cmd = cmd\n const { region, credentials } = this.#opts.connection\n try {\n this.#client = new S3VectorsClient({ region, credentials })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.destroy?.()\n this.#client = null\n this.#cmd = undefined\n }\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n const physicalIndex = this.#index(collection)\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n\n // Map metric (throws on dot)\n const s3Metric = mapMetricToS3(metric)\n\n this.#dims.set(collection, dims)\n this.#metrics.set(collection, metric)\n\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n\n try {\n await this.connect()\n await this.#client!.send(\n new this.#cmd!.CreateIndexCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n dataType: 'float32',\n dimension: dims,\n distanceMetric: s3Metric,\n })\n )\n\n // Brief settle to ensure index is queryable (create has propagation delay)\n const probeVec = new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 5_000\n while (Date.now() < deadline) {\n try {\n await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n queryVector: { float32: probeVec },\n topK: 1,\n returnMetadata: false,\n returnDistance: false,\n })\n )\n break\n } catch {\n await new Promise((r) => setTimeout(r, 100))\n }\n }\n } catch (err: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const physicalIndex = this.#index(collection)\n\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n\n try {\n await this.connect()\n await this.#client!.send(\n new this.#cmd!.DeleteIndexCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n })\n )\n\n // Clear local state\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n const msg = String(err)\n if (ifExists && (msg.includes('not found') || msg.includes('ResourceNotFoundException'))) {\n return\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n try {\n const { indexes } = await this.#client!.send(\n new this.#cmd!.ListIndexesCommand({\n vectorBucketName: this.#opts.connection.bucket,\n })\n )\n const physicalIndex = this.#index(collection)\n return !!indexes?.find((idx: any) => idx.indexName === physicalIndex)\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', 's3vectors'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n const dims = this.#dims.get(collection) ?? this.#opts.dimensions\n\n try {\n await this.connect()\n\n const vectors: any[] = []\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 (dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n vectors.push({\n key: r.id,\n data: { float32: vector },\n metadata: { ...(r.metadata ?? {}), __document: r.document ?? '' },\n })\n }\n\n await this.#client!.send(\n new this.#cmd!.PutVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n vectors,\n })\n )\n\n // Settle until keys are visible\n await this.#settle(physicalIndex, { present: plan.records.map((r) => r.id) })\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 await this.connect()\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n const metric = this.#metrics.get(collection) ?? this.#opts.metric ?? 'cosine'\n const offset = plan.offset ?? 0\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 res = await this.#client!.send(\n new this.#cmd!.GetVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n keys: [plan.near.id],\n returnData: true,\n returnMetadata: true,\n })\n )\n const vec = res.vectors?.[0]\n if (!vec || !vec.data?.float32) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = vec.data.float32\n } catch (err: any) {\n if (\n err?.message?.includes('not found') ||\n err?.message?.includes('ResourceNotFoundException')\n ) {\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 topK = plan.topK\n if (queryVector) {\n // Similarity search: QueryVectors with oversampling + JS-filter.\n // S3 Vectors caps topK at 100, so over-fetch up to that ceiling.\n const k = plan.filter ? 100 : Math.min(100, Math.max(topK + offset, 10))\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n queryVector: { float32: queryVector },\n topK: k,\n returnMetadata: true,\n returnDistance: true,\n })\n )\n\n let rawMatches = res.vectors ?? []\n // Filter by JS-evaluateFilter if plan.filter present\n if (plan.filter) {\n rawMatches = rawMatches.filter((v: any) => {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n return evaluateFilter(plan.filter!, meta)\n })\n }\n // Slice offset+topK\n rawMatches = rawMatches.slice(offset, offset + topK)\n\n // Project matches, recompute scores, and fetch vectors if needed\n const projected: VectorMatch[] = []\n const keysToFetch = new Set<string>()\n if (plan.projection.vector) {\n for (const v of rawMatches) keysToFetch.add(v.key)\n }\n\n // Fetch vectors only when projected\n const vecStore: Record<string, number[]> = {}\n if (keysToFetch.size > 0) {\n const batch = Array.from(keysToFetch)\n const vecRes = await this.#client!.send(\n new this.#cmd!.GetVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n keys: batch,\n returnData: true,\n returnMetadata: false,\n })\n )\n for (const v of vecRes.vectors ?? []) {\n if (v.data?.float32) vecStore[v.key] = v.data.float32\n }\n }\n\n for (const v of rawMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = v.key\n if (plan.projection.document) {\n proj.document = typeof v.metadata?.__document === 'string' ? v.metadata.__document : ''\n }\n if (plan.projection.metadata) {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n proj.metadata = meta\n }\n if (plan.projection.vector) {\n proj.vector = vecStore[v.key]\n }\n if (plan.near && v.distance !== undefined) {\n proj.score = scoreFromDistance(v.distance, metric)\n }\n projected.push(proj)\n }\n\n return projected\n } else {\n // Filter-scan: over-fetch via QueryVectors with arbitrary vector, JS-filter, project without score\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n queryVector: {\n float32: new Array(this.#opts.dimensions ?? 3).fill(0).map((_, i) => (i === 0 ? 1 : 0)),\n },\n topK: 100, // S3 Vectors max topK\n returnMetadata: true,\n returnDistance: false,\n })\n )\n\n let rawMatches = res.vectors ?? []\n // JS-filter for parity, then slice\n if (plan.filter) {\n rawMatches = rawMatches.filter((v: any) => {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n return evaluateFilter(plan.filter!, meta)\n })\n }\n rawMatches = rawMatches.slice(offset, offset + topK)\n\n // Fetch vectors only when projected\n const vecStore: Record<string, number[]> = {}\n if (plan.projection.vector && rawMatches.length > 0) {\n const vecRes = await this.#client!.send(\n new this.#cmd!.GetVectorsCommand({\n vectorBucketName: this.#opts.connection.bucket,\n indexName: physicalIndex,\n keys: rawMatches.map((v: any) => v.key),\n returnData: true,\n returnMetadata: false,\n })\n )\n for (const v of vecRes.vectors ?? []) {\n if (v.data?.float32) vecStore[v.key] = v.data.float32\n }\n }\n\n const projected: VectorMatch[] = []\n for (const v of rawMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = v.key\n if (plan.projection.document) {\n proj.document = typeof v.metadata?.__document === 'string' ? v.metadata.__document : ''\n }\n if (plan.projection.metadata) {\n const meta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') meta[key] = v.metadata[key]\n }\n proj.metadata = meta\n }\n if (plan.projection.vector) proj.vector = vecStore[v.key]\n // filter-scan: no score\n projected.push(proj)\n }\n\n return projected\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const collection = plan.collection\n const physicalIndex = this.#index(collection)\n\n try {\n await this.connect()\n const bucket = this.#opts.connection.bucket\n\n if (plan.ids && plan.ids.length > 0) {\n await this.#client!.send(\n new this.#cmd!.DeleteVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n keys: plan.ids,\n })\n )\n // Settle until absent\n await this.#settle(physicalIndex, { absent: plan.ids })\n } else if (plan.filter) {\n // Enumerate all, JS-filter, delete matched\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: {\n float32: new Array(this.#opts.dimensions ?? 3)\n .fill(0)\n .map((_, i) => (i === 0 ? 1 : 0)),\n },\n topK: 100, // S3 Vectors max topK\n returnMetadata: true,\n returnDistance: false,\n })\n )\n\n const targets: string[] = []\n for (const v of res.vectors ?? []) {\n const evalMeta: VectorMetadata = {}\n for (const key in v.metadata) {\n if (key !== '__document') evalMeta[key] = v.metadata[key]\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n targets.push(v.key)\n }\n }\n\n if (targets.length > 0) {\n await this.#client!.send(\n new this.#cmd!.DeleteVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n keys: targets,\n })\n )\n // Settle until absent\n await this.#settle(physicalIndex, { absent: targets })\n }\n } else {\n // Delete all: enumerate all keys + delete\n const res = await this.#client!.send(\n new this.#cmd!.QueryVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n queryVector: {\n float32: new Array(this.#opts.dimensions ?? 3)\n .fill(0)\n .map((_, i) => (i === 0 ? 1 : 0)),\n },\n topK: 100, // S3 Vectors max topK\n returnMetadata: false,\n returnDistance: false,\n })\n )\n const allKeys = (res.vectors ?? []).map((v: any) => v.key)\n\n // If index has many vectors, may need pagination; but S3 Vectors QueryVectors is limited to 1000\n // For truly large collections, users should use filter-scan pattern explicitly.\n // Here, we do a best-effort single-page delete.\n if (allKeys.length > 0) {\n await this.#client!.send(\n new this.#cmd!.DeleteVectorsCommand({\n vectorBucketName: bucket,\n indexName: physicalIndex,\n keys: allKeys,\n })\n )\n // Settle until absent\n await this.#settle(physicalIndex, { absent: allKeys })\n }\n }\n } catch (err: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../chunk-Ble4zEEl.js");
|
|
3
|
+
//#region src/batteries/vector/schema.ts
|
|
4
|
+
var CollectionBuilder = class {
|
|
5
|
+
#vectorDef;
|
|
6
|
+
#fields = [];
|
|
7
|
+
vector(def) {
|
|
8
|
+
this.#vectorDef = {
|
|
9
|
+
dimensions: def.dimensions,
|
|
10
|
+
metric: def.metric ?? "cosine"
|
|
11
|
+
};
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
string(name) {
|
|
15
|
+
return this.#pushField(name, "string");
|
|
16
|
+
}
|
|
17
|
+
integer(name) {
|
|
18
|
+
return this.#pushField(name, "integer");
|
|
19
|
+
}
|
|
20
|
+
number(name) {
|
|
21
|
+
return this.#pushField(name, "number");
|
|
22
|
+
}
|
|
23
|
+
boolean(name) {
|
|
24
|
+
return this.#pushField(name, "boolean");
|
|
25
|
+
}
|
|
26
|
+
json(name) {
|
|
27
|
+
return this.#pushField(name, "json");
|
|
28
|
+
}
|
|
29
|
+
#pushField(name, type) {
|
|
30
|
+
const spec = {
|
|
31
|
+
name,
|
|
32
|
+
type,
|
|
33
|
+
index: false,
|
|
34
|
+
nullable: false
|
|
35
|
+
};
|
|
36
|
+
this.#fields.push(spec);
|
|
37
|
+
return new FieldChainImpl(spec);
|
|
38
|
+
}
|
|
39
|
+
build(collection) {
|
|
40
|
+
if (!this.#vectorDef) throw new Error("a collection requires a vector() definition");
|
|
41
|
+
return {
|
|
42
|
+
collection,
|
|
43
|
+
vector: this.#vectorDef,
|
|
44
|
+
fields: this.#fields
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var FieldChainImpl = class {
|
|
49
|
+
#spec;
|
|
50
|
+
constructor(spec) {
|
|
51
|
+
this.#spec = spec;
|
|
52
|
+
}
|
|
53
|
+
index() {
|
|
54
|
+
this.#spec.index = true;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
nullable() {
|
|
58
|
+
this.#spec.nullable = true;
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var VectorSchemaBuilder = class {
|
|
63
|
+
#executor;
|
|
64
|
+
constructor(executor) {
|
|
65
|
+
this.#executor = executor;
|
|
66
|
+
}
|
|
67
|
+
async createCollection(collection, cb) {
|
|
68
|
+
const builder = new CollectionBuilder();
|
|
69
|
+
cb(builder);
|
|
70
|
+
const spec = builder.build(collection);
|
|
71
|
+
await this.#executor.createCollection(spec, false);
|
|
72
|
+
}
|
|
73
|
+
async createCollectionIfNotExists(collection, cb) {
|
|
74
|
+
const builder = new CollectionBuilder();
|
|
75
|
+
cb(builder);
|
|
76
|
+
const spec = builder.build(collection);
|
|
77
|
+
await this.#executor.createCollection(spec, true);
|
|
78
|
+
}
|
|
79
|
+
async dropCollection(collection) {
|
|
80
|
+
await this.#executor.dropCollection(collection, false);
|
|
81
|
+
}
|
|
82
|
+
async dropCollectionIfExists(collection) {
|
|
83
|
+
await this.#executor.dropCollection(collection, true);
|
|
84
|
+
}
|
|
85
|
+
async hasCollection(collection) {
|
|
86
|
+
return this.#executor.hasCollection(collection);
|
|
87
|
+
}
|
|
88
|
+
async renameCollection(from, to) {
|
|
89
|
+
await this.#executor.renameCollection(from, to);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
//#endregion
|
|
93
|
+
exports.CollectionBuilder = CollectionBuilder;
|
|
94
|
+
exports.VectorSchemaBuilder = VectorSchemaBuilder;
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=schema.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.cjs","names":["#vectorDef","#pushField","#fields","#spec","#executor"],"sources":["../../../src/batteries/vector/schema.ts"],"sourcesContent":["/**\n * Knex-style schema builder for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/schema\n */\n\nimport type { DistanceMetric } from './types'\nimport type { CollectionSpec, CollectionFieldSpec } from './plan'\n\nexport interface SchemaExecutor {\n createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n dropCollection(collection: string, ifExists: boolean): Promise<void>\n hasCollection(collection: string): Promise<boolean>\n renameCollection(from: string, to: string): Promise<void>\n}\n\nexport class CollectionBuilder {\n #vectorDef?: { dimensions: number; metric: DistanceMetric }\n #fields: CollectionFieldSpec[] = []\n\n vector(def: { dimensions: number; metric?: DistanceMetric }): this {\n this.#vectorDef = {\n dimensions: def.dimensions,\n metric: def.metric ?? 'cosine',\n }\n return this\n }\n\n string(name: string): FieldChain {\n return this.#pushField(name, 'string')\n }\n\n integer(name: string): FieldChain {\n return this.#pushField(name, 'integer')\n }\n\n number(name: string): FieldChain {\n return this.#pushField(name, 'number')\n }\n\n boolean(name: string): FieldChain {\n return this.#pushField(name, 'boolean')\n }\n\n json(name: string): FieldChain {\n return this.#pushField(name, 'json')\n }\n\n #pushField(name: string, type: CollectionFieldSpec['type']): FieldChain {\n const spec: CollectionFieldSpec = {\n name,\n type,\n index: false,\n nullable: false,\n }\n this.#fields.push(spec)\n return new FieldChainImpl(spec)\n }\n\n build(collection: string): CollectionSpec {\n if (!this.#vectorDef) {\n throw new Error('a collection requires a vector() definition')\n }\n return {\n collection,\n vector: this.#vectorDef,\n fields: this.#fields,\n }\n }\n}\n\nexport interface FieldChain {\n index(): FieldChain\n nullable(): FieldChain\n}\n\nclass FieldChainImpl implements FieldChain {\n #spec: CollectionFieldSpec\n\n constructor(spec: CollectionFieldSpec) {\n this.#spec = spec\n }\n\n index(): FieldChain {\n this.#spec.index = true\n return this\n }\n\n nullable(): FieldChain {\n this.#spec.nullable = true\n return this\n }\n}\n\nexport class VectorSchemaBuilder {\n #executor: SchemaExecutor\n\n constructor(executor: SchemaExecutor) {\n this.#executor = executor\n }\n\n async createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, false)\n }\n\n async createCollectionIfNotExists(\n collection: string,\n cb: (c: CollectionBuilder) => void\n ): Promise<void> {\n const builder = new CollectionBuilder()\n cb(builder)\n const spec = builder.build(collection)\n await this.#executor.createCollection(spec, true)\n }\n\n async dropCollection(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, false)\n }\n\n async dropCollectionIfExists(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, true)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#executor.hasCollection(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.#executor.renameCollection(from, to)\n }\n}\n"],"mappings":";;;AAgBA,IAAa,oBAAb,MAA+B;CAC7B;CACA,UAAiC,CAAC;CAElC,OAAO,KAA4D;EACjE,KAAKA,aAAa;GAChB,YAAY,IAAI;GAChB,QAAQ,IAAI,UAAU;EACxB;EACA,OAAO;CACT;CAEA,OAAO,MAA0B;EAC/B,OAAO,KAAKC,WAAW,MAAM,QAAQ;CACvC;CAEA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;CAEA,OAAO,MAA0B;EAC/B,OAAO,KAAKA,WAAW,MAAM,QAAQ;CACvC;CAEA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;CAEA,KAAK,MAA0B;EAC7B,OAAO,KAAKA,WAAW,MAAM,MAAM;CACrC;CAEA,WAAW,MAAc,MAA+C;EACtE,MAAM,OAA4B;GAChC;GACA;GACA,OAAO;GACP,UAAU;EACZ;EACA,KAAKC,QAAQ,KAAK,IAAI;EACtB,OAAO,IAAI,eAAe,IAAI;CAChC;CAEA,MAAM,YAAoC;EACxC,IAAI,CAAC,KAAKF,YACR,MAAM,IAAI,MAAM,6CAA6C;EAE/D,OAAO;GACL;GACA,QAAQ,KAAKA;GACb,QAAQ,KAAKE;EACf;CACF;AACF;AAOA,IAAM,iBAAN,MAA2C;CACzC;CAEA,YAAY,MAA2B;EACrC,KAAKC,QAAQ;CACf;CAEA,QAAoB;EAClB,KAAKA,MAAM,QAAQ;EACnB,OAAO;CACT;CAEA,WAAuB;EACrB,KAAKA,MAAM,WAAW;EACtB,OAAO;CACT;AACF;AAEA,IAAa,sBAAb,MAAiC;CAC/B;CAEA,YAAY,UAA0B;EACpC,KAAKC,YAAY;CACnB;CAEA,MAAM,iBAAiB,YAAoB,IAAmD;EAC5F,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,KAAK;CACnD;CAEA,MAAM,4BACJ,YACA,IACe;EACf,MAAM,UAAU,IAAI,kBAAkB;EACtC,GAAG,OAAO;EACV,MAAM,OAAO,QAAQ,MAAM,UAAU;EACrC,MAAM,KAAKA,UAAU,iBAAiB,MAAM,IAAI;CAClD;CAEA,MAAM,eAAe,YAAmC;EACtD,MAAM,KAAKA,UAAU,eAAe,YAAY,KAAK;CACvD;CAEA,MAAM,uBAAuB,YAAmC;EAC9D,MAAM,KAAKA,UAAU,eAAe,YAAY,IAAI;CACtD;CAEA,MAAM,cAAc,YAAsC;EACxD,OAAO,KAAKA,UAAU,cAAc,UAAU;CAChD;CAEA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,KAAKA,UAAU,iBAAiB,MAAM,EAAE;CAChD;AACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knex-style schema builder for the vector battery.
|
|
3
|
+
*
|
|
4
|
+
* @module @nhtio/adk/batteries/vector/schema
|
|
5
|
+
*/
|
|
6
|
+
import type { DistanceMetric } from "./types";
|
|
7
|
+
import type { CollectionSpec } from "./plan";
|
|
8
|
+
export interface SchemaExecutor {
|
|
9
|
+
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
10
|
+
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
11
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
12
|
+
renameCollection(from: string, to: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare class CollectionBuilder {
|
|
15
|
+
#private;
|
|
16
|
+
vector(def: {
|
|
17
|
+
dimensions: number;
|
|
18
|
+
metric?: DistanceMetric;
|
|
19
|
+
}): this;
|
|
20
|
+
string(name: string): FieldChain;
|
|
21
|
+
integer(name: string): FieldChain;
|
|
22
|
+
number(name: string): FieldChain;
|
|
23
|
+
boolean(name: string): FieldChain;
|
|
24
|
+
json(name: string): FieldChain;
|
|
25
|
+
build(collection: string): CollectionSpec;
|
|
26
|
+
}
|
|
27
|
+
export interface FieldChain {
|
|
28
|
+
index(): FieldChain;
|
|
29
|
+
nullable(): FieldChain;
|
|
30
|
+
}
|
|
31
|
+
export declare class VectorSchemaBuilder {
|
|
32
|
+
#private;
|
|
33
|
+
constructor(executor: SchemaExecutor);
|
|
34
|
+
createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void>;
|
|
35
|
+
createCollectionIfNotExists(collection: string, cb: (c: CollectionBuilder) => void): Promise<void>;
|
|
36
|
+
dropCollection(collection: string): Promise<void>;
|
|
37
|
+
dropCollectionIfExists(collection: string): Promise<void>;
|
|
38
|
+
hasCollection(collection: string): Promise<boolean>;
|
|
39
|
+
renameCollection(from: string, to: string): Promise<void>;
|
|
40
|
+
}
|