@nhtio/adk 1.20260607.2 → 1.20260609.1
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 +230 -0
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/openai/exceptions.cjs +1 -1
- package/batteries/embeddings/openai/exceptions.mjs +1 -1
- package/batteries/embeddings/openai/types.d.ts +7 -0
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/exceptions.cjs +1 -1
- package/batteries/embeddings/webllm/exceptions.mjs +1 -1
- package/batteries/llm/chat_common/helpers.d.ts +165 -0
- package/batteries/llm/chat_common/types.d.ts +309 -0
- package/batteries/llm/index.d.ts +5 -0
- package/batteries/llm/ollama/adapter.cjs +736 -0
- package/batteries/llm/ollama/adapter.cjs.map +1 -0
- package/batteries/llm/ollama/adapter.d.ts +64 -0
- package/batteries/llm/ollama/adapter.mjs +734 -0
- package/batteries/llm/ollama/adapter.mjs.map +1 -0
- package/batteries/llm/ollama/exceptions.cjs +105 -0
- package/batteries/llm/ollama/exceptions.cjs.map +1 -0
- package/batteries/llm/ollama/exceptions.d.ts +112 -0
- package/batteries/llm/ollama/exceptions.mjs +96 -0
- package/batteries/llm/ollama/exceptions.mjs.map +1 -0
- package/batteries/llm/ollama/helpers.cjs +487 -0
- package/batteries/llm/ollama/helpers.cjs.map +1 -0
- package/batteries/llm/ollama/helpers.d.ts +158 -0
- package/batteries/llm/ollama/helpers.mjs +450 -0
- package/batteries/llm/ollama/helpers.mjs.map +1 -0
- package/batteries/llm/ollama/index.d.ts +29 -0
- package/batteries/llm/ollama/types.cjs +2 -0
- package/batteries/llm/ollama/types.d.ts +334 -0
- package/batteries/llm/ollama/types.mjs +0 -0
- package/batteries/llm/ollama/validation.cjs +130 -0
- package/batteries/llm/ollama/validation.cjs.map +1 -0
- package/batteries/llm/ollama/validation.d.ts +31 -0
- package/batteries/llm/ollama/validation.mjs +127 -0
- package/batteries/llm/ollama/validation.mjs.map +1 -0
- package/batteries/llm/ollama.cjs +54 -0
- package/batteries/llm/ollama.mjs +6 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
- package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
- package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
- package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
- 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/openai_chat_completions.cjs +29 -28
- package/batteries/llm/openai_chat_completions.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
- package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
- package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
- package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
- package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions.cjs +29 -28
- package/batteries/llm/webllm_chat_completions.mjs +2 -1
- package/batteries/llm.cjs +44 -28
- package/batteries/llm.mjs +9 -4
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +1 -1
- package/batteries/storage/in_memory/index.d.ts +1 -1
- package/batteries/storage/in_memory.cjs +2 -2
- package/batteries/storage/in_memory.cjs.map +1 -1
- package/batteries/storage/in_memory.mjs +2 -2
- package/batteries/storage/in_memory.mjs.map +1 -1
- package/batteries/storage/opfs/index.d.ts +19 -0
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.cjs.map +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/storage/opfs.mjs.map +1 -1
- package/batteries/tools/_shared/index.d.ts +121 -0
- package/batteries/tools/_shared.cjs +157 -0
- package/batteries/tools/_shared.cjs.map +1 -0
- package/batteries/tools/_shared.mjs +149 -0
- package/batteries/tools/_shared.mjs.map +1 -0
- package/batteries/tools/color.cjs +3 -2
- package/batteries/tools/color.cjs.map +1 -1
- package/batteries/tools/color.mjs +3 -2
- package/batteries/tools/color.mjs.map +1 -1
- package/batteries/tools/comparison.cjs +4 -3
- package/batteries/tools/comparison.cjs.map +1 -1
- package/batteries/tools/comparison.mjs +4 -3
- package/batteries/tools/comparison.mjs.map +1 -1
- package/batteries/tools/data_structure.cjs +30 -10
- package/batteries/tools/data_structure.cjs.map +1 -1
- package/batteries/tools/data_structure.mjs +30 -10
- package/batteries/tools/data_structure.mjs.map +1 -1
- package/batteries/tools/datetime_extended.cjs +5 -10
- package/batteries/tools/datetime_extended.cjs.map +1 -1
- package/batteries/tools/datetime_extended.mjs +5 -10
- package/batteries/tools/datetime_extended.mjs.map +1 -1
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +13 -4
- package/batteries/tools/encoding.cjs.map +1 -1
- package/batteries/tools/encoding.mjs +13 -4
- package/batteries/tools/encoding.mjs.map +1 -1
- package/batteries/tools/formatting.cjs +4 -4
- package/batteries/tools/formatting.cjs.map +1 -1
- package/batteries/tools/formatting.mjs +4 -4
- package/batteries/tools/formatting.mjs.map +1 -1
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/index.d.ts +3 -0
- package/batteries/tools/math.cjs +10 -8
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +10 -8
- 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 +9 -5
- package/batteries/tools/parsing.cjs.map +1 -1
- package/batteries/tools/parsing.mjs +9 -5
- package/batteries/tools/parsing.mjs.map +1 -1
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/scrapper/exceptions.d.ts +21 -0
- package/batteries/tools/scrapper/index.d.ts +172 -0
- package/batteries/tools/scrapper/shared.d.ts +139 -0
- package/batteries/tools/scrapper.cjs +8 -0
- package/batteries/tools/scrapper.mjs +2 -0
- package/batteries/tools/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +177 -0
- package/batteries/tools/searxng.cjs +6 -0
- package/batteries/tools/searxng.mjs +2 -0
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +54 -43
- package/batteries/tools/statistics.cjs.map +1 -1
- package/batteries/tools/statistics.mjs +54 -43
- package/batteries/tools/statistics.mjs.map +1 -1
- package/batteries/tools/string_processing.cjs +5 -5
- package/batteries/tools/string_processing.cjs.map +1 -1
- package/batteries/tools/string_processing.mjs +5 -5
- package/batteries/tools/string_processing.mjs.map +1 -1
- package/batteries/tools/structured_data.cjs +8 -13
- package/batteries/tools/structured_data.cjs.map +1 -1
- package/batteries/tools/structured_data.mjs +8 -13
- package/batteries/tools/structured_data.mjs.map +1 -1
- 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 +10 -8
- package/batteries/tools/unit_conversion.cjs.map +1 -1
- package/batteries/tools/unit_conversion.mjs +10 -8
- package/batteries/tools/unit_conversion.mjs.map +1 -1
- package/batteries/tools/web_retrieval/index.d.ts +186 -0
- package/batteries/tools/web_retrieval.cjs +206 -0
- package/batteries/tools/web_retrieval.cjs.map +1 -0
- package/batteries/tools/web_retrieval.mjs +201 -0
- package/batteries/tools/web_retrieval.mjs.map +1 -0
- package/batteries/tools.cjs +15 -0
- package/batteries/tools.mjs +4 -1
- package/batteries/vector/arangodb/index.d.ts +2 -0
- package/batteries/vector/arangodb.cjs +2 -1
- package/batteries/vector/arangodb.cjs.map +1 -1
- package/batteries/vector/arangodb.mjs +2 -1
- package/batteries/vector/arangodb.mjs.map +1 -1
- package/batteries/vector/builder.cjs +31 -0
- package/batteries/vector/builder.cjs.map +1 -1
- package/batteries/vector/builder.d.ts +58 -0
- package/batteries/vector/builder.mjs +31 -0
- package/batteries/vector/builder.mjs.map +1 -1
- package/batteries/vector/chroma/index.d.ts +4 -0
- package/batteries/vector/chroma.cjs +3 -0
- package/batteries/vector/chroma.cjs.map +1 -1
- package/batteries/vector/chroma.mjs +3 -0
- package/batteries/vector/chroma.mjs.map +1 -1
- package/batteries/vector/clickhouse/index.d.ts +2 -0
- package/batteries/vector/clickhouse.cjs +2 -1
- package/batteries/vector/clickhouse.cjs.map +1 -1
- package/batteries/vector/clickhouse.mjs +2 -1
- package/batteries/vector/clickhouse.mjs.map +1 -1
- package/batteries/vector/cloudflare/index.d.ts +2 -0
- package/batteries/vector/cloudflare.cjs +2 -1
- package/batteries/vector/cloudflare.cjs.map +1 -1
- package/batteries/vector/cloudflare.mjs +2 -1
- package/batteries/vector/cloudflare.mjs.map +1 -1
- package/batteries/vector/conformance/index.d.ts +22 -0
- package/batteries/vector/conformance.cjs +22 -0
- package/batteries/vector/conformance.cjs.map +1 -1
- package/batteries/vector/conformance.mjs +22 -0
- package/batteries/vector/conformance.mjs.map +1 -1
- package/batteries/vector/contract.cjs +22 -0
- package/batteries/vector/contract.cjs.map +1 -1
- package/batteries/vector/contract.d.ts +51 -0
- package/batteries/vector/contract.mjs +22 -0
- package/batteries/vector/contract.mjs.map +1 -1
- package/batteries/vector/couchbase/index.d.ts +2 -0
- package/batteries/vector/couchbase.cjs +2 -1
- package/batteries/vector/couchbase.cjs.map +1 -1
- package/batteries/vector/couchbase.mjs +2 -1
- package/batteries/vector/couchbase.mjs.map +1 -1
- package/batteries/vector/duckdb/index.d.ts +2 -0
- package/batteries/vector/duckdb.cjs +2 -1
- package/batteries/vector/duckdb.cjs.map +1 -1
- package/batteries/vector/duckdb.mjs +2 -1
- package/batteries/vector/duckdb.mjs.map +1 -1
- package/batteries/vector/elasticsearch/index.d.ts +2 -0
- package/batteries/vector/elasticsearch.cjs +2 -1
- package/batteries/vector/elasticsearch.cjs.map +1 -1
- package/batteries/vector/elasticsearch.mjs +2 -1
- package/batteries/vector/elasticsearch.mjs.map +1 -1
- package/batteries/vector/exceptions.cjs +1 -1
- package/batteries/vector/exceptions.mjs +1 -1
- package/batteries/vector/factory.cjs +6 -0
- package/batteries/vector/factory.cjs.map +1 -1
- package/batteries/vector/factory.d.ts +14 -0
- package/batteries/vector/factory.mjs +6 -0
- package/batteries/vector/factory.mjs.map +1 -1
- package/batteries/vector/filters.cjs +22 -1
- package/batteries/vector/filters.cjs.map +1 -1
- package/batteries/vector/filters.d.ts +38 -0
- package/batteries/vector/filters.mjs +22 -1
- package/batteries/vector/filters.mjs.map +1 -1
- package/batteries/vector/helpers.cjs +13 -0
- package/batteries/vector/helpers.cjs.map +1 -1
- package/batteries/vector/helpers.d.ts +14 -0
- package/batteries/vector/helpers.mjs +13 -0
- package/batteries/vector/helpers.mjs.map +1 -1
- package/batteries/vector/hnswlib/index.d.ts +2 -0
- package/batteries/vector/hnswlib.cjs +2 -1
- package/batteries/vector/hnswlib.cjs.map +1 -1
- package/batteries/vector/hnswlib.mjs +2 -1
- package/batteries/vector/hnswlib.mjs.map +1 -1
- package/batteries/vector/in_memory/index.d.ts +1 -0
- package/batteries/vector/in_memory.cjs +1 -0
- package/batteries/vector/in_memory.cjs.map +1 -1
- package/batteries/vector/in_memory.mjs +1 -0
- package/batteries/vector/in_memory.mjs.map +1 -1
- package/batteries/vector/lancedb/index.d.ts +2 -0
- package/batteries/vector/lancedb.cjs +2 -1
- package/batteries/vector/lancedb.cjs.map +1 -1
- package/batteries/vector/lancedb.mjs +2 -1
- package/batteries/vector/lancedb.mjs.map +1 -1
- package/batteries/vector/mariadb/index.d.ts +2 -0
- package/batteries/vector/mariadb.cjs +2 -1
- package/batteries/vector/mariadb.cjs.map +1 -1
- package/batteries/vector/mariadb.mjs +2 -1
- package/batteries/vector/mariadb.mjs.map +1 -1
- package/batteries/vector/meilisearch/index.d.ts +2 -0
- package/batteries/vector/meilisearch.cjs +2 -1
- package/batteries/vector/meilisearch.cjs.map +1 -1
- package/batteries/vector/meilisearch.mjs +2 -1
- package/batteries/vector/meilisearch.mjs.map +1 -1
- package/batteries/vector/migrate.cjs +18 -1
- package/batteries/vector/migrate.cjs.map +1 -1
- package/batteries/vector/migrate.d.ts +31 -0
- package/batteries/vector/migrate.mjs +18 -1
- package/batteries/vector/migrate.mjs.map +1 -1
- package/batteries/vector/milvus/index.d.ts +5 -0
- package/batteries/vector/milvus.cjs +4 -0
- package/batteries/vector/milvus.cjs.map +1 -1
- package/batteries/vector/milvus.mjs +4 -0
- package/batteries/vector/milvus.mjs.map +1 -1
- package/batteries/vector/mongodb/index.d.ts +2 -0
- package/batteries/vector/mongodb.cjs +2 -1
- package/batteries/vector/mongodb.cjs.map +1 -1
- package/batteries/vector/mongodb.mjs +2 -1
- package/batteries/vector/mongodb.mjs.map +1 -1
- package/batteries/vector/neo4j/index.d.ts +2 -0
- package/batteries/vector/neo4j.cjs +2 -1
- package/batteries/vector/neo4j.cjs.map +1 -1
- package/batteries/vector/neo4j.mjs +2 -1
- package/batteries/vector/neo4j.mjs.map +1 -1
- package/batteries/vector/opensearch/index.d.ts +2 -0
- package/batteries/vector/opensearch.cjs +2 -1
- package/batteries/vector/opensearch.cjs.map +1 -1
- package/batteries/vector/opensearch.mjs +2 -1
- package/batteries/vector/opensearch.mjs.map +1 -1
- package/batteries/vector/oracle23ai/index.d.ts +2 -0
- package/batteries/vector/oracle23ai.cjs +2 -1
- package/batteries/vector/oracle23ai.cjs.map +1 -1
- package/batteries/vector/oracle23ai.mjs +2 -1
- package/batteries/vector/oracle23ai.mjs.map +1 -1
- package/batteries/vector/orama/index.d.ts +1 -0
- package/batteries/vector/orama.cjs +1 -0
- package/batteries/vector/orama.cjs.map +1 -1
- package/batteries/vector/orama.mjs +1 -0
- package/batteries/vector/orama.mjs.map +1 -1
- package/batteries/vector/pgvector/index.d.ts +9 -2
- package/batteries/vector/pgvector.cjs +4 -0
- package/batteries/vector/pgvector.cjs.map +1 -1
- package/batteries/vector/pgvector.mjs +4 -0
- package/batteries/vector/pgvector.mjs.map +1 -1
- package/batteries/vector/pinecone/index.d.ts +5 -0
- package/batteries/vector/pinecone.cjs +3 -1
- package/batteries/vector/pinecone.cjs.map +1 -1
- package/batteries/vector/pinecone.mjs +3 -1
- package/batteries/vector/pinecone.mjs.map +1 -1
- package/batteries/vector/plan.d.ts +27 -0
- package/batteries/vector/qdrant/index.d.ts +5 -0
- package/batteries/vector/qdrant.cjs +4 -0
- package/batteries/vector/qdrant.cjs.map +1 -1
- package/batteries/vector/qdrant.mjs +4 -0
- package/batteries/vector/qdrant.mjs.map +1 -1
- package/batteries/vector/redis/index.d.ts +2 -0
- package/batteries/vector/redis.cjs +2 -1
- package/batteries/vector/redis.cjs.map +1 -1
- package/batteries/vector/redis.mjs +2 -1
- package/batteries/vector/redis.mjs.map +1 -1
- package/batteries/vector/retrievable.cjs +9 -1
- package/batteries/vector/retrievable.cjs.map +1 -1
- package/batteries/vector/retrievable.mjs +9 -1
- package/batteries/vector/retrievable.mjs.map +1 -1
- package/batteries/vector/retrievable_glue.d.ts +21 -0
- package/batteries/vector/s3vectors/index.d.ts +2 -0
- package/batteries/vector/s3vectors.cjs +2 -1
- package/batteries/vector/s3vectors.cjs.map +1 -1
- package/batteries/vector/s3vectors.mjs +2 -1
- package/batteries/vector/s3vectors.mjs.map +1 -1
- package/batteries/vector/schema.cjs +28 -0
- package/batteries/vector/schema.cjs.map +1 -1
- package/batteries/vector/schema.d.ts +39 -0
- package/batteries/vector/schema.mjs +28 -0
- package/batteries/vector/schema.mjs.map +1 -1
- package/batteries/vector/solr/index.d.ts +2 -0
- package/batteries/vector/solr.cjs +2 -1
- package/batteries/vector/solr.cjs.map +1 -1
- package/batteries/vector/solr.mjs +2 -1
- package/batteries/vector/solr.mjs.map +1 -1
- package/batteries/vector/sqlite_vec/index.d.ts +6 -3
- package/batteries/vector/sqlite_vec.cjs +2 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -1
- package/batteries/vector/sqlite_vec.mjs +2 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -1
- package/batteries/vector/surrealdb/index.d.ts +2 -0
- package/batteries/vector/surrealdb.cjs +2 -1
- package/batteries/vector/surrealdb.cjs.map +1 -1
- package/batteries/vector/surrealdb.mjs +2 -1
- package/batteries/vector/surrealdb.mjs.map +1 -1
- package/batteries/vector/types.d.ts +27 -0
- package/batteries/vector/typesense/index.d.ts +2 -0
- package/batteries/vector/typesense.cjs +2 -1
- package/batteries/vector/typesense.cjs.map +1 -1
- package/batteries/vector/typesense.mjs +2 -1
- package/batteries/vector/typesense.mjs.map +1 -1
- package/batteries/vector/validation.cjs +14 -0
- package/batteries/vector/validation.cjs.map +1 -1
- package/batteries/vector/validation.d.ts +14 -0
- package/batteries/vector/validation.mjs +14 -0
- package/batteries/vector/validation.mjs.map +1 -1
- package/batteries/vector/vector_store_constructor.cjs +1 -1
- package/batteries/vector/vector_store_constructor.cjs.map +1 -1
- package/batteries/vector/vector_store_constructor.d.ts +1 -1
- package/batteries/vector/vector_store_constructor.mjs +1 -1
- package/batteries/vector/vector_store_constructor.mjs.map +1 -1
- package/batteries/vector/vespa/index.d.ts +2 -0
- package/batteries/vector/vespa.cjs +2 -1
- package/batteries/vector/vespa.cjs.map +1 -1
- package/batteries/vector/vespa.mjs +2 -1
- package/batteries/vector/vespa.mjs.map +1 -1
- package/batteries/vector/weaviate/index.d.ts +2 -0
- package/batteries/vector/weaviate.cjs +2 -1
- package/batteries/vector/weaviate.cjs.map +1 -1
- package/batteries/vector/weaviate.mjs +2 -1
- package/batteries/vector/weaviate.mjs.map +1 -1
- package/batteries.cjs +58 -28
- package/batteries.mjs +12 -5
- package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
- package/common-DYDUi99O.mjs.map +1 -0
- package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
- package/common-DZl3ADJs.js.map +1 -0
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
- package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
- package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
- package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.d.ts +1 -1
- package/dispatch_runner.mjs +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
- package/eslint/rules/require_validator_any_required.cjs +1 -0
- package/eslint/rules/require_validator_any_required.cjs.map +1 -1
- package/eslint/rules/require_validator_any_required.d.ts +1 -0
- package/eslint/rules/require_validator_any_required.mjs +1 -0
- package/eslint/rules/require_validator_any_required.mjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
- package/eslint/rules.cjs +1 -1
- package/eslint/rules.mjs +1 -1
- package/eslint.cjs +2 -2
- package/eslint.mjs +2 -2
- package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
- package/exceptions-BDhN0Xzr.mjs.map +1 -0
- package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
- package/exceptions-BRXrUKiW.js.map +1 -0
- package/exceptions.cjs +2 -2
- package/exceptions.mjs +2 -2
- package/factories.cjs +1 -1
- package/factories.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.d.ts +1 -1
- package/forge.mjs +4 -4
- package/guards.cjs +9 -9
- package/guards.mjs +9 -9
- package/helpers-DSTFxTiC.js +497 -0
- package/helpers-DSTFxTiC.js.map +1 -0
- package/helpers-xhrQbMAG.mjs +306 -0
- package/helpers-xhrQbMAG.mjs.map +1 -0
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/base_exception.d.ts +1 -0
- package/lib/classes/media.d.ts +10 -0
- package/lib/classes/retrievable.d.ts +1 -1
- package/lib/classes/spooled_json_artifact.d.ts +1 -1
- package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
- package/lib/classes/tokenizable.d.ts +3 -0
- package/lib/classes/tool.d.ts +8 -0
- package/lib/classes/turn_gate.d.ts +6 -0
- package/lib/dispatch_runner.d.ts +4 -32
- package/lib/helpers/bignum.cjs +82 -0
- package/lib/helpers/bignum.cjs.map +1 -0
- package/lib/helpers/bignum.d.ts +52 -0
- package/lib/helpers/bignum.mjs +74 -0
- package/lib/helpers/bignum.mjs.map +1 -0
- package/lib/turn_runner.d.ts +1 -1
- package/lib/types/dispatch_runner.d.ts +83 -0
- package/lib/utils/exceptions.d.ts +1 -1
- package/lib/utils/retry.cjs.map +1 -1
- package/lib/utils/retry.d.ts +2 -0
- package/lib/utils/retry.mjs.map +1 -1
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +259 -204
- package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
- package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
- package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
- package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
- package/scrapper-BHM1mCde.mjs +432 -0
- package/scrapper-BHM1mCde.mjs.map +1 -0
- package/scrapper-BeweWurk.js +462 -0
- package/scrapper-BeweWurk.js.map +1 -0
- package/searxng-BJFulNcK.mjs +247 -0
- package/searxng-BJFulNcK.mjs.map +1 -0
- package/searxng-B_D--V5q.js +265 -0
- package/searxng-B_D--V5q.js.map +1 -0
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
- package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
- package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
- package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
- package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
- package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
- package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
- package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
- package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
- package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
- package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
- package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
- package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
- package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
- package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
- package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
- package/tool_call-B4-_-vjG.mjs.map +1 -0
- package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
- package/tool_call-DixVlW40.js.map +1 -0
- package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
- package/tool_registry-791Vrjtf.mjs.map +1 -0
- package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
- package/tool_registry-CKJPze3j.js.map +1 -0
- package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
- package/turn_runner-HXImLGIn.js.map +1 -0
- package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
- package/turn_runner-ZyYO-Kti.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/types.d.ts +1 -1
- package/common-BT0nfCi9.mjs.map +0 -1
- package/common-Cj8TaQ9U.js.map +0 -1
- package/exceptions-BeWH2FwP.mjs.map +0 -1
- package/exceptions-CitH5wZI.js.map +0 -1
- package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
- package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
- package/tool_call-CV5qVNlb.mjs.map +0 -1
- package/tool_call-Db68hB7y.js.map +0 -1
- package/tool_registry-D1pSSlsd.mjs.map +0 -1
- package/tool_registry-DYUYqXvo.js.map +0 -1
- package/turn_runner-DqWHNP80.js.map +0 -1
- package/turn_runner-fg1Wc3dK.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3vectors.cjs","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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"}
|
|
1
|
+
{"version":3,"file":"s3vectors.cjs","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 and authentication parameters for the backend. */\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 availability probe: whether this adapter's runtime driver can load in the current environment. */\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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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as isInstanceOf } from "../../tool_registry-
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { evaluateFilter } from "./filters.mjs";
|
|
4
4
|
import { normalizeScore } from "./helpers.mjs";
|
|
@@ -120,6 +120,7 @@ var S3VectorsVectorStore = class extends BaseVectorStore {
|
|
|
120
120
|
await new Promise((r) => setTimeout(r, 300));
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
123
124
|
static isAvailable() {
|
|
124
125
|
return typeof process !== "undefined";
|
|
125
126
|
}
|
|
@@ -1 +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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"}
|
|
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 and authentication parameters for the backend. */\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 availability probe: whether this adapter's runtime driver can load in the current environment. */\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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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../chunk-Ble4zEEl.js");
|
|
3
3
|
//#region src/batteries/vector/schema.ts
|
|
4
|
+
/**
|
|
5
|
+
* Chainable builder for a single collection definition — declares the vector column and the typed
|
|
6
|
+
* metadata fields, compiled to a {@link CollectionSpec} by {@link CollectionBuilder.build}.
|
|
7
|
+
*/
|
|
4
8
|
var CollectionBuilder = class {
|
|
5
9
|
#vectorDef;
|
|
6
10
|
#fields = [];
|
|
11
|
+
/** Declare the vector column's dimensionality and (optionally) its distance metric (default `'cosine'`). */
|
|
7
12
|
vector(def) {
|
|
8
13
|
this.#vectorDef = {
|
|
9
14
|
dimensions: def.dimensions,
|
|
@@ -11,18 +16,23 @@ var CollectionBuilder = class {
|
|
|
11
16
|
};
|
|
12
17
|
return this;
|
|
13
18
|
}
|
|
19
|
+
/** Declare a string metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
14
20
|
string(name) {
|
|
15
21
|
return this.#pushField(name, "string");
|
|
16
22
|
}
|
|
23
|
+
/** Declare an integer metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
17
24
|
integer(name) {
|
|
18
25
|
return this.#pushField(name, "integer");
|
|
19
26
|
}
|
|
27
|
+
/** Declare a number metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
20
28
|
number(name) {
|
|
21
29
|
return this.#pushField(name, "number");
|
|
22
30
|
}
|
|
31
|
+
/** Declare a boolean metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
23
32
|
boolean(name) {
|
|
24
33
|
return this.#pushField(name, "boolean");
|
|
25
34
|
}
|
|
35
|
+
/** Declare a JSON metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
26
36
|
json(name) {
|
|
27
37
|
return this.#pushField(name, "json");
|
|
28
38
|
}
|
|
@@ -36,6 +46,11 @@ var CollectionBuilder = class {
|
|
|
36
46
|
this.#fields.push(spec);
|
|
37
47
|
return new FieldChainImpl(spec);
|
|
38
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Compile the accumulated definition into a {@link CollectionSpec}.
|
|
51
|
+
*
|
|
52
|
+
* @throws when no {@link CollectionBuilder.vector} definition was declared.
|
|
53
|
+
*/
|
|
39
54
|
build(collection) {
|
|
40
55
|
if (!this.#vectorDef) throw new Error("a collection requires a vector() definition");
|
|
41
56
|
return {
|
|
@@ -59,32 +74,45 @@ var FieldChainImpl = class {
|
|
|
59
74
|
return this;
|
|
60
75
|
}
|
|
61
76
|
};
|
|
77
|
+
/**
|
|
78
|
+
* Knex-style schema facade exposing collection DDL (create/drop/rename/has) over a
|
|
79
|
+
* {@link SchemaExecutor}. Returned by a vector store's `schema()` accessor.
|
|
80
|
+
*/
|
|
62
81
|
var VectorSchemaBuilder = class {
|
|
63
82
|
#executor;
|
|
83
|
+
/**
|
|
84
|
+
* @param executor - The adapter-backed executor the DDL calls are drained into.
|
|
85
|
+
*/
|
|
64
86
|
constructor(executor) {
|
|
65
87
|
this.#executor = executor;
|
|
66
88
|
}
|
|
89
|
+
/** Create a collection, defining it via the `cb` builder. Errors if it already exists. */
|
|
67
90
|
async createCollection(collection, cb) {
|
|
68
91
|
const builder = new CollectionBuilder();
|
|
69
92
|
cb(builder);
|
|
70
93
|
const spec = builder.build(collection);
|
|
71
94
|
await this.#executor.createCollection(spec, false);
|
|
72
95
|
}
|
|
96
|
+
/** Create a collection only if absent; a no-op if it already exists. */
|
|
73
97
|
async createCollectionIfNotExists(collection, cb) {
|
|
74
98
|
const builder = new CollectionBuilder();
|
|
75
99
|
cb(builder);
|
|
76
100
|
const spec = builder.build(collection);
|
|
77
101
|
await this.#executor.createCollection(spec, true);
|
|
78
102
|
}
|
|
103
|
+
/** Drop a collection. Errors if it does not exist. */
|
|
79
104
|
async dropCollection(collection) {
|
|
80
105
|
await this.#executor.dropCollection(collection, false);
|
|
81
106
|
}
|
|
107
|
+
/** Drop a collection only if present; a no-op if it does not exist. */
|
|
82
108
|
async dropCollectionIfExists(collection) {
|
|
83
109
|
await this.#executor.dropCollection(collection, true);
|
|
84
110
|
}
|
|
111
|
+
/** Resolve `true` if the collection exists. */
|
|
85
112
|
async hasCollection(collection) {
|
|
86
113
|
return this.#executor.hasCollection(collection);
|
|
87
114
|
}
|
|
115
|
+
/** Rename a collection from `from` to `to`. */
|
|
88
116
|
async renameCollection(from, to) {
|
|
89
117
|
await this.#executor.renameCollection(from, to);
|
|
90
118
|
}
|
|
@@ -1 +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":"
|
|
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\n/**\n * The backend side of the schema builder — the adapter operations a {@link VectorSchemaBuilder}\n * drains its compiled {@link CollectionSpec}s and DDL calls into.\n */\nexport interface SchemaExecutor {\n /** Create a collection from `spec`; `ifNotExists` suppresses the already-exists error. */\n createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>\n /** Drop a collection; `ifExists` suppresses the not-found error. */\n dropCollection(collection: string, ifExists: boolean): Promise<void>\n /** Resolve `true` if the collection exists. */\n hasCollection(collection: string): Promise<boolean>\n /** Rename a collection from `from` to `to`. */\n renameCollection(from: string, to: string): Promise<void>\n}\n\n/**\n * Chainable builder for a single collection definition — declares the vector column and the typed\n * metadata fields, compiled to a {@link CollectionSpec} by {@link CollectionBuilder.build}.\n */\nexport class CollectionBuilder {\n #vectorDef?: { dimensions: number; metric: DistanceMetric }\n #fields: CollectionFieldSpec[] = []\n\n /** Declare the vector column's dimensionality and (optionally) its distance metric (default `'cosine'`). */\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 /** Declare a string metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n string(name: string): FieldChain {\n return this.#pushField(name, 'string')\n }\n\n /** Declare an integer metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n integer(name: string): FieldChain {\n return this.#pushField(name, 'integer')\n }\n\n /** Declare a number metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n number(name: string): FieldChain {\n return this.#pushField(name, 'number')\n }\n\n /** Declare a boolean metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\n boolean(name: string): FieldChain {\n return this.#pushField(name, 'boolean')\n }\n\n /** Declare a JSON metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */\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 /**\n * Compile the accumulated definition into a {@link CollectionSpec}.\n *\n * @throws when no {@link CollectionBuilder.vector} definition was declared.\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\n/** Post-declaration chain for a metadata field, toggling indexing and nullability. */\nexport interface FieldChain {\n /** Mark the field as indexed for filtering. */\n index(): FieldChain\n /** Mark the field as nullable. */\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\n/**\n * Knex-style schema facade exposing collection DDL (create/drop/rename/has) over a\n * {@link SchemaExecutor}. Returned by a vector store's `schema()` accessor.\n */\nexport class VectorSchemaBuilder {\n #executor: SchemaExecutor\n\n /**\n * @param executor - The adapter-backed executor the DDL calls are drained into.\n */\n constructor(executor: SchemaExecutor) {\n this.#executor = executor\n }\n\n /** Create a collection, defining it via the `cb` builder. Errors if it already exists. */\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 /** Create a collection only if absent; a no-op if it already exists. */\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 /** Drop a collection. Errors if it does not exist. */\n async dropCollection(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, false)\n }\n\n /** Drop a collection only if present; a no-op if it does not exist. */\n async dropCollectionIfExists(collection: string): Promise<void> {\n await this.#executor.dropCollection(collection, true)\n }\n\n /** Resolve `true` if the collection exists. */\n async hasCollection(collection: string): Promise<boolean> {\n return this.#executor.hasCollection(collection)\n }\n\n /** Rename a collection from `from` to `to`. */\n async renameCollection(from: string, to: string): Promise<void> {\n await this.#executor.renameCollection(from, to)\n }\n}\n"],"mappings":";;;;;;;AA4BA,IAAa,oBAAb,MAA+B;CAC7B;CACA,UAAiC,CAAC;;CAGlC,OAAO,KAA4D;EACjE,KAAKA,aAAa;GAChB,YAAY,IAAI;GAChB,QAAQ,IAAI,UAAU;EACxB;EACA,OAAO;CACT;;CAGA,OAAO,MAA0B;EAC/B,OAAO,KAAKC,WAAW,MAAM,QAAQ;CACvC;;CAGA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;;CAGA,OAAO,MAA0B;EAC/B,OAAO,KAAKA,WAAW,MAAM,QAAQ;CACvC;;CAGA,QAAQ,MAA0B;EAChC,OAAO,KAAKA,WAAW,MAAM,SAAS;CACxC;;CAGA,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;;;;;;CAOA,MAAM,YAAoC;EACxC,IAAI,CAAC,KAAKF,YACR,MAAM,IAAI,MAAM,6CAA6C;EAE/D,OAAO;GACL;GACA,QAAQ,KAAKA;GACb,QAAQ,KAAKE;EACf;CACF;AACF;AAUA,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;;;;;AAMA,IAAa,sBAAb,MAAiC;CAC/B;;;;CAKA,YAAY,UAA0B;EACpC,KAAKC,YAAY;CACnB;;CAGA,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;;CAGA,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;;CAGA,MAAM,eAAe,YAAmC;EACtD,MAAM,KAAKA,UAAU,eAAe,YAAY,KAAK;CACvD;;CAGA,MAAM,uBAAuB,YAAmC;EAC9D,MAAM,KAAKA,UAAU,eAAe,YAAY,IAAI;CACtD;;CAGA,MAAM,cAAc,YAAsC;EACxD,OAAO,KAAKA,UAAU,cAAc,UAAU;CAChD;;CAGA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,KAAKA,UAAU,iBAAiB,MAAM,EAAE;CAChD;AACF"}
|
|
@@ -5,36 +5,75 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { DistanceMetric } from "./types";
|
|
7
7
|
import type { CollectionSpec } from "./plan";
|
|
8
|
+
/**
|
|
9
|
+
* The backend side of the schema builder — the adapter operations a {@link VectorSchemaBuilder}
|
|
10
|
+
* drains its compiled {@link CollectionSpec}s and DDL calls into.
|
|
11
|
+
*/
|
|
8
12
|
export interface SchemaExecutor {
|
|
13
|
+
/** Create a collection from `spec`; `ifNotExists` suppresses the already-exists error. */
|
|
9
14
|
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
15
|
+
/** Drop a collection; `ifExists` suppresses the not-found error. */
|
|
10
16
|
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
17
|
+
/** Resolve `true` if the collection exists. */
|
|
11
18
|
hasCollection(collection: string): Promise<boolean>;
|
|
19
|
+
/** Rename a collection from `from` to `to`. */
|
|
12
20
|
renameCollection(from: string, to: string): Promise<void>;
|
|
13
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Chainable builder for a single collection definition — declares the vector column and the typed
|
|
24
|
+
* metadata fields, compiled to a {@link CollectionSpec} by {@link CollectionBuilder.build}.
|
|
25
|
+
*/
|
|
14
26
|
export declare class CollectionBuilder {
|
|
15
27
|
#private;
|
|
28
|
+
/** Declare the vector column's dimensionality and (optionally) its distance metric (default `'cosine'`). */
|
|
16
29
|
vector(def: {
|
|
17
30
|
dimensions: number;
|
|
18
31
|
metric?: DistanceMetric;
|
|
19
32
|
}): this;
|
|
33
|
+
/** Declare a string metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
20
34
|
string(name: string): FieldChain;
|
|
35
|
+
/** Declare an integer metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
21
36
|
integer(name: string): FieldChain;
|
|
37
|
+
/** Declare a number metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
22
38
|
number(name: string): FieldChain;
|
|
39
|
+
/** Declare a boolean metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
23
40
|
boolean(name: string): FieldChain;
|
|
41
|
+
/** Declare a JSON metadata field; returns a {@link FieldChain} for `.index()`/`.nullable()`. */
|
|
24
42
|
json(name: string): FieldChain;
|
|
43
|
+
/**
|
|
44
|
+
* Compile the accumulated definition into a {@link CollectionSpec}.
|
|
45
|
+
*
|
|
46
|
+
* @throws when no {@link CollectionBuilder.vector} definition was declared.
|
|
47
|
+
*/
|
|
25
48
|
build(collection: string): CollectionSpec;
|
|
26
49
|
}
|
|
50
|
+
/** Post-declaration chain for a metadata field, toggling indexing and nullability. */
|
|
27
51
|
export interface FieldChain {
|
|
52
|
+
/** Mark the field as indexed for filtering. */
|
|
28
53
|
index(): FieldChain;
|
|
54
|
+
/** Mark the field as nullable. */
|
|
29
55
|
nullable(): FieldChain;
|
|
30
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Knex-style schema facade exposing collection DDL (create/drop/rename/has) over a
|
|
59
|
+
* {@link SchemaExecutor}. Returned by a vector store's `schema()` accessor.
|
|
60
|
+
*/
|
|
31
61
|
export declare class VectorSchemaBuilder {
|
|
32
62
|
#private;
|
|
63
|
+
/**
|
|
64
|
+
* @param executor - The adapter-backed executor the DDL calls are drained into.
|
|
65
|
+
*/
|
|
33
66
|
constructor(executor: SchemaExecutor);
|
|
67
|
+
/** Create a collection, defining it via the `cb` builder. Errors if it already exists. */
|
|
34
68
|
createCollection(collection: string, cb: (c: CollectionBuilder) => void): Promise<void>;
|
|
69
|
+
/** Create a collection only if absent; a no-op if it already exists. */
|
|
35
70
|
createCollectionIfNotExists(collection: string, cb: (c: CollectionBuilder) => void): Promise<void>;
|
|
71
|
+
/** Drop a collection. Errors if it does not exist. */
|
|
36
72
|
dropCollection(collection: string): Promise<void>;
|
|
73
|
+
/** Drop a collection only if present; a no-op if it does not exist. */
|
|
37
74
|
dropCollectionIfExists(collection: string): Promise<void>;
|
|
75
|
+
/** Resolve `true` if the collection exists. */
|
|
38
76
|
hasCollection(collection: string): Promise<boolean>;
|
|
77
|
+
/** Rename a collection from `from` to `to`. */
|
|
39
78
|
renameCollection(from: string, to: string): Promise<void>;
|
|
40
79
|
}
|