@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":"pinecone.mjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n apiKey: string\n index: string\n /**\n * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n * The logical collection name the builder/base see is unchanged — only the physical\n * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n * identically-named collections into distinct, uncontended namespaces. Pinecone\n * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n */\n namespacePrefix?: string\n connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n try {\n const mod = await import('@pinecone-database/pinecone')\n return mod.Pinecone\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Pinecone serverless is eventually consistent: the option is honored, and the default\n // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n consistency: {\n configurable: true,\n default: 'strong',\n modes: ['strong', 'best-effort', 'eventual'],\n },\n }\n #pc: any | null = null\n #index: any | null = null\n #dims: Map<string, number> = new Map()\n\n // Resolve the effective consistency mode for one write, honoring precedence:\n // per-operation override (plan.consistency) > store option > adapter-declared default.\n #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n return (\n perOp ??\n (this.options as PineconeVectorStoreOptions).consistency ??\n this.capabilities.consistency.default\n )\n }\n\n // Map a logical collection name to its physical Pinecone namespace. Only the physical\n // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n // the logical name.\n #ns(collection: string): string {\n const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n return prefix ? `${prefix}__${collection}` : collection\n }\n\n // Returns true if visibility was confirmed within the bound, false on timeout.\n // Polls the SAME read paths the adapter reads through downstream:\n // present ids → must appear in BOTH query() matches AND listPaginated()\n // absent ids → must be gone from BOTH listPaginated() AND fetch()\n async #waitVisible(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n ): Promise<boolean> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return true\n const physicalNs = this.#ns(collection)\n const dims = this.#dims.get(collection) ?? 3\n const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n const topK = Math.max(present.length + absent.length + 5, 10)\n while (true) {\n let presentOk = true\n let absentOk = true\n if (present.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 100 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let queried = new Set<string>()\n try {\n const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n } catch {\n queried = new Set()\n }\n presentOk = present.every((id) => listed.has(id) && queried.has(id))\n }\n if (absent.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 1000 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let fetched: Record<string, unknown> = {}\n try {\n const fr = await ns.fetch({ ids: absent })\n fetched = fr.records ?? {}\n } catch {\n fetched = {}\n }\n absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n }\n if (presentOk && absentOk) return true\n if (Date.now() >= deadline) return false\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n // Apply the resolved consistency-mode semantics for one write:\n // strong → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n // best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n // eventual → no wait at all.\n // `mode` is the effective mode for THIS operation (already resolved from the precedence\n // chain by the caller via #consistencyMode(plan.consistency)).\n async #settle(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[] },\n what: string,\n mode: VectorConsistency\n ): Promise<void> {\n if (mode === 'eventual') return\n const confirmed = await this.#waitVisible(ns, collection, opts)\n if (!confirmed && mode === 'strong') {\n throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n }\n // best-effort: resolve regardless\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#pc) return\n const Pinecone = await getPineconeClient()\n const opts = this.options as PineconeVectorStoreOptions\n try {\n this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n this.#index = this.#pc.index(opts.index)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n this.#pc = null\n this.#index = null\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n if (this.#dims.has(collection)) {\n const existingDim = this.#dims.get(collection)!\n if (existingDim !== spec.vector.dimensions) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Collection ${collection} already exists with dimension ${existingDim}`,\n ])\n }\n return\n }\n this.#dims.set(collection, spec.vector.dimensions)\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n await this.connect()\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n try {\n // Get all IDs via pagination\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n // Delete all found IDs\n if (ids.length > 0) {\n await ns.deleteMany({ ids })\n }\n\n // Settle on absence\n await this.#settle(\n ns,\n collection,\n { absent: ids },\n 'dropCollection ' + collection,\n this.#consistencyMode()\n )\n } catch (err: any) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const stats = await this.#index!.describeIndexStats()\n return !!stats.namespaces?.[this.#ns(collection)]\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.connect()\n const collection = plan.collection\n const ns = this.#index!.namespace(this.#ns(collection))\n const dims = this.#dims.get(collection)\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 id: r.id,\n values: vector,\n metadata: { ...r.metadata, __document: r.document ?? '' },\n })\n }\n try {\n await ns.upsert({ records: vectors })\n // Call settle after upsert to wait for visibility (per-op override > store > default)\n await this.#settle(\n ns,\n collection,\n { present: vectors.map((v) => v.id) },\n 'upsert ' + vectors.length + ' record(s)',\n this.#consistencyMode(plan.consistency)\n )\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const metric = this.options.metric ?? 'cosine'\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 const res = await ns.fetch({ ids: [plan.near.id] })\n const record = res.records[plan.near.id]\n if (!record) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = record.values\n }\n }\n const offset = plan.offset ?? 0\n const k = plan.topK + offset\n if (queryVector) {\n const filter = translatePineconeFilter(plan.filter)\n const res = await ns.query({\n vector: queryVector,\n topK: k,\n filter,\n includeMetadata: true,\n includeValues: !!plan.projection.vector,\n })\n const rawMatches = res.matches ?? []\n const sliceMatches = rawMatches.slice(offset)\n const matches: VectorMatch[] = []\n for (const match of sliceMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = match.id\n }\n if (plan.projection.vector && match.values) {\n proj.vector = match.values\n }\n if (plan.projection.document && match.metadata) {\n proj.document = match.metadata.__document\n }\n if (plan.projection.metadata && match.metadata) {\n const meta: VectorMetadata = {}\n for (const key in match.metadata) {\n if (key !== '__document') {\n meta[key] = match.metadata[key]\n }\n }\n proj.metadata = meta\n }\n if (plan.near) {\n proj.score = normalizeScore(match.score!, metric, 'similarity')\n }\n matches.push(proj)\n }\n return matches\n } else {\n // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n // and filter client-side. First, get all IDs without filter, then fetch.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n const listRes = await this.#index!.listPaginated({\n limit: 100,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n if (ids.length === 0) return []\n\n // Fetch all records and filter client-side\n const allRecords: any = {}\n for (let i = 0; i < ids.length; i += 100) {\n const batch = ids.slice(i, i + 100)\n const fetchRes = await ns.fetch({ ids: batch })\n if (fetchRes && fetchRes.records) {\n for (const id in fetchRes.records) {\n allRecords[id] = fetchRes.records[id]\n }\n }\n }\n const matches: VectorMatch[] = []\n for (const id in allRecords) {\n const record = allRecords[id]\n if (record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n // If no filter, include all records; otherwise evaluate the filter\n if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = id\n }\n if (plan.projection.vector && record.values) {\n proj.vector = record.values\n }\n if (plan.projection.document && record.metadata) {\n proj.document = record.metadata.__document\n }\n if (plan.projection.metadata && record.metadata) {\n const meta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n meta[key] = record.metadata[key]\n }\n }\n proj.metadata = meta as VectorMetadata\n }\n matches.push(proj)\n }\n }\n }\n return matches.slice(offset, offset + plan.topK)\n }\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const mode = this.#consistencyMode(plan.consistency)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await ns.deleteMany({ ids: plan.ids })\n // Call settle after delete-by-ids to wait for absence\n await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n } else if (plan.filter) {\n // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n // filtering by record ID. Get all IDs and filter client-side.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const listRes = await this.#index!.listPaginated({\n limit: 1000,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n\n // For Pinecone, we can only filter by metadata fields.\n // If the filter is on 'id', filter client-side without metadata.\n // Otherwise, fetch records and filter by metadata.\n const deleteIds: string[] = []\n\n // Check if filter targets 'id' field (Pinecone record ID)\n const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n if (filterTargetsId) {\n // Filter by record ID directly\n for (const id of ids) {\n if (evaluateFilter(plan.filter, { id })) {\n deleteIds.push(id)\n }\n }\n } else {\n // Filter by metadata\n for (const id of ids) {\n const res = await ns.fetch({ ids: [id] })\n const record = res.records[id]\n if (record && record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n deleteIds.push(id)\n }\n }\n }\n }\n\n if (deleteIds.length > 0) {\n await ns.deleteMany({ ids: deleteIds })\n // Call settle after delete-by-filter to wait for absence\n await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n }\n } else {\n // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n let page: any = { next: null }\n const allIds: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n if (allIds.length > 0) {\n await ns.deleteMany({ ids: allIds })\n }\n // Settle on absence\n await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n }\n } catch (err) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n if (!filter) return false\n if (isRawFilter(filter)) {\n return false\n }\n if (isFilterCondition(filter)) {\n return filter.field === 'id'\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and && and.length > 0) {\n return and.some((f) => isFilterOnId(f))\n }\n if (or && or.length > 0) {\n return or.some((f) => isFilterOnId(f))\n }\n if (not) {\n return isFilterOnId(not)\n }\n }\n return false\n}\n\nexport const translatePineconeFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'pinecone') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n return undefined\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n }\n return undefined\n }\n return undefined\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pinecone.mjs","names":["#waitVisible","#ns","#dims","#index","#settle","#pc","#consistencyMode"],"sources":["../../../src/batteries/vector/pinecone/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pinecone\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport { isFilterCondition, isRawFilter, isFilterGroup, evaluateFilter } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_CONSISTENCY_TIMEOUT,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n VectorConsistency,\n} from '../types'\n\nexport interface PineconeVectorStoreOptions extends BaseVectorStoreOptions {\n /** Pinecone API key. */\n apiKey: string\n /** Name of the Pinecone index this store operates against. */\n index: string\n /**\n * When set, the physical Pinecone namespace becomes `${namespacePrefix}__${collection}`.\n * The logical collection name the builder/base see is unchanged — only the physical\n * namespace string is prefixed. Lets callers (and the test suite) isolate otherwise\n * identically-named collections into distinct, uncontended namespaces. Pinecone\n * namespaces are implicit (born on first upsert), so a fresh prefix costs nothing.\n */\n namespacePrefix?: string\n /** Connection and authentication parameters for the backend. */\n connection?: { controllerHostUrl?: string }\n}\n\nconst getPineconeClient = async () => {\n try {\n const mod = await import('@pinecone-database/pinecone')\n return mod.Pinecone\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@pinecone-database/pinecone'])\n }\n}\n\nexport class PineconeVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Pinecone serverless is eventually consistent: the option is honored, and the default\n // is 'strong' so out-of-the-box behavior matches the strongly-consistent adapters.\n consistency: {\n configurable: true,\n default: 'strong',\n modes: ['strong', 'best-effort', 'eventual'],\n },\n }\n #pc: any | null = null\n #index: any | null = null\n #dims: Map<string, number> = new Map()\n\n // Resolve the effective consistency mode for one write, honoring precedence:\n // per-operation override (plan.consistency) > store option > adapter-declared default.\n #consistencyMode(perOp?: VectorConsistency): VectorConsistency {\n return (\n perOp ??\n (this.options as PineconeVectorStoreOptions).consistency ??\n this.capabilities.consistency.default\n )\n }\n\n // Map a logical collection name to its physical Pinecone namespace. Only the physical\n // namespace string is prefixed; #dims and everything the base/builder see stay keyed on\n // the logical name.\n #ns(collection: string): string {\n const prefix = (this.options as PineconeVectorStoreOptions).namespacePrefix\n return prefix ? `${prefix}__${collection}` : collection\n }\n\n // Returns true if visibility was confirmed within the bound, false on timeout.\n // Polls the SAME read paths the adapter reads through downstream:\n // present ids → must appear in BOTH query() matches AND listPaginated()\n // absent ids → must be gone from BOTH listPaginated() AND fetch()\n async #waitVisible(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[]; probeVector?: number[] }\n ): Promise<boolean> {\n const present = opts.present ?? []\n const absent = opts.absent ?? []\n if (present.length === 0 && absent.length === 0) return true\n const physicalNs = this.#ns(collection)\n const dims = this.#dims.get(collection) ?? 3\n const queryVec = opts.probeVector ?? new Array(dims).fill(0).map((_, i) => (i === 0 ? 1 : 0))\n const deadline = Date.now() + 10_000 // 10s ceiling; freshness is ~seconds\n const topK = Math.max(present.length + absent.length + 5, 10)\n while (true) {\n let presentOk = true\n let absentOk = true\n if (present.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 100 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let queried = new Set<string>()\n try {\n const qr = await ns.query({ vector: queryVec, topK, includeValues: false })\n queried = new Set((qr.matches ?? []).map((m: any) => m.id))\n } catch {\n queried = new Set()\n }\n presentOk = present.every((id) => listed.has(id) && queried.has(id))\n }\n if (absent.length > 0) {\n let listed = new Set<string>()\n try {\n const lr = await this.#index!.listPaginated({ namespace: physicalNs, limit: 1000 })\n listed = new Set((lr.vectors ?? []).map((v: any) => v.id))\n } catch {\n listed = new Set()\n }\n let fetched: Record<string, unknown> = {}\n try {\n const fr = await ns.fetch({ ids: absent })\n fetched = fr.records ?? {}\n } catch {\n fetched = {}\n }\n absentOk = absent.every((id) => !listed.has(id) && fetched[id] === undefined)\n }\n if (presentOk && absentOk) return true\n if (Date.now() >= deadline) return false\n await new Promise((r) => setTimeout(r, 300))\n }\n }\n\n // Apply the resolved consistency-mode semantics for one write:\n // strong → wait, and THROW E_VECTOR_STORE_CONSISTENCY_TIMEOUT if not confirmed.\n // best-effort → wait up to the bound, then resolve whether or not confirmed (no throw).\n // eventual → no wait at all.\n // `mode` is the effective mode for THIS operation (already resolved from the precedence\n // chain by the caller via #consistencyMode(plan.consistency)).\n async #settle(\n ns: any,\n collection: string,\n opts: { present?: string[]; absent?: string[] },\n what: string,\n mode: VectorConsistency\n ): Promise<void> {\n if (mode === 'eventual') return\n const confirmed = await this.#waitVisible(ns, collection, opts)\n if (!confirmed && mode === 'strong') {\n throw new E_VECTOR_STORE_CONSISTENCY_TIMEOUT([what])\n }\n // best-effort: resolve regardless\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 isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#pc) return\n const Pinecone = await getPineconeClient()\n const opts = this.options as PineconeVectorStoreOptions\n try {\n this.#pc = new Pinecone({ apiKey: opts.apiKey, ...opts.connection })\n this.#index = this.#pc.index(opts.index)\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n this.#pc = null\n this.#index = null\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const collection = spec.collection\n if (ifNotExists) {\n if (await this.hasCollection(collection)) return\n }\n if (this.#dims.has(collection)) {\n const existingDim = this.#dims.get(collection)!\n if (existingDim !== spec.vector.dimensions) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED([\n 'createCollection',\n `Collection ${collection} already exists with dimension ${existingDim}`,\n ])\n }\n return\n }\n this.#dims.set(collection, spec.vector.dimensions)\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (ifExists) {\n if (!(await this.hasCollection(collection))) return\n } else if (!(await this.hasCollection(collection))) {\n return\n }\n await this.connect()\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n try {\n // Get all IDs via pagination\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) ids.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n // Delete all found IDs\n if (ids.length > 0) {\n await ns.deleteMany({ ids })\n }\n\n // Settle on absence\n await this.#settle(\n ns,\n collection,\n { absent: ids },\n 'dropCollection ' + collection,\n this.#consistencyMode()\n )\n } catch (err: any) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n const msg = String(err)\n if (ifExists && msg.includes('not found')) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', msg])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n await this.connect()\n const stats = await this.#index!.describeIndexStats()\n return !!stats.namespaces?.[this.#ns(collection)]\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'pinecone'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n await this.connect()\n const collection = plan.collection\n const ns = this.#index!.namespace(this.#ns(collection))\n const dims = this.#dims.get(collection)\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 id: r.id,\n values: vector,\n metadata: { ...r.metadata, __document: r.document ?? '' },\n })\n }\n try {\n await ns.upsert({ records: vectors })\n // Call settle after upsert to wait for visibility (per-op override > store > default)\n await this.#settle(\n ns,\n collection,\n { present: vectors.map((v) => v.id) },\n 'upsert ' + vectors.length + ' record(s)',\n this.#consistencyMode(plan.consistency)\n )\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const metric = this.options.metric ?? 'cosine'\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 const res = await ns.fetch({ ids: [plan.near.id] })\n const record = res.records[plan.near.id]\n if (!record) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = record.values\n }\n }\n const offset = plan.offset ?? 0\n const k = plan.topK + offset\n if (queryVector) {\n const filter = translatePineconeFilter(plan.filter)\n const res = await ns.query({\n vector: queryVector,\n topK: k,\n filter,\n includeMetadata: true,\n includeValues: !!plan.projection.vector,\n })\n const rawMatches = res.matches ?? []\n const sliceMatches = rawMatches.slice(offset)\n const matches: VectorMatch[] = []\n for (const match of sliceMatches) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = match.id\n }\n if (plan.projection.vector && match.values) {\n proj.vector = match.values\n }\n if (plan.projection.document && match.metadata) {\n proj.document = match.metadata.__document\n }\n if (plan.projection.metadata && match.metadata) {\n const meta: VectorMetadata = {}\n for (const key in match.metadata) {\n if (key !== '__document') {\n meta[key] = match.metadata[key]\n }\n }\n proj.metadata = meta\n }\n if (plan.near) {\n proj.score = normalizeScore(match.score!, metric, 'similarity')\n }\n matches.push(proj)\n }\n return matches\n } else {\n // Filter-scan: Pinecone v7 listPaginated filter is broken, so we get all records\n // and filter client-side. First, get all IDs without filter, then fetch.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n // Get all IDs without filter - Pinecone v7 listPaginated without filter works\n const listRes = await this.#index!.listPaginated({\n limit: 100,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n if (ids.length === 0) return []\n\n // Fetch all records and filter client-side\n const allRecords: any = {}\n for (let i = 0; i < ids.length; i += 100) {\n const batch = ids.slice(i, i + 100)\n const fetchRes = await ns.fetch({ ids: batch })\n if (fetchRes && fetchRes.records) {\n for (const id in fetchRes.records) {\n allRecords[id] = fetchRes.records[id]\n }\n }\n }\n const matches: VectorMatch[] = []\n for (const id in allRecords) {\n const record = allRecords[id]\n if (record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n // If no filter, include all records; otherwise evaluate the filter\n if (!plan.filter || evaluateFilter(plan.filter, evalMeta)) {\n const proj: VectorMatch = {}\n if (plan.projection.id) {\n proj.id = id\n }\n if (plan.projection.vector && record.values) {\n proj.vector = record.values\n }\n if (plan.projection.document && record.metadata) {\n proj.document = record.metadata.__document\n }\n if (plan.projection.metadata && record.metadata) {\n const meta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n meta[key] = record.metadata[key]\n }\n }\n proj.metadata = meta as VectorMetadata\n }\n matches.push(proj)\n }\n }\n }\n return matches.slice(offset, offset + plan.topK)\n }\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.connect()\n const collection = plan.collection\n const physicalNs = this.#ns(collection)\n const ns = this.#index!.namespace(physicalNs)\n const mode = this.#consistencyMode(plan.consistency)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await ns.deleteMany({ ids: plan.ids })\n // Call settle after delete-by-ids to wait for absence\n await this.#settle(ns, collection, { absent: plan.ids }, 'delete by id', mode)\n } else if (plan.filter) {\n // Pinecone v7 listPaginated filter is broken, and Pinecone doesn't support\n // filtering by record ID. Get all IDs and filter client-side.\n let page: any = { next: null }\n const ids: string[] = []\n do {\n const listRes = await this.#index!.listPaginated({\n limit: 1000,\n startingToken: page.next,\n namespace: physicalNs,\n })\n if (listRes.vectors) {\n ids.push(...listRes.vectors.map((v: any) => v.id))\n }\n page.next = listRes.pagination?.next\n } while (page.next)\n\n // For Pinecone, we can only filter by metadata fields.\n // If the filter is on 'id', filter client-side without metadata.\n // Otherwise, fetch records and filter by metadata.\n const deleteIds: string[] = []\n\n // Check if filter targets 'id' field (Pinecone record ID)\n const filterTargetsId = plan.filter ? isFilterOnId(plan.filter) : false\n\n if (filterTargetsId) {\n // Filter by record ID directly\n for (const id of ids) {\n if (evaluateFilter(plan.filter, { id })) {\n deleteIds.push(id)\n }\n }\n } else {\n // Filter by metadata\n for (const id of ids) {\n const res = await ns.fetch({ ids: [id] })\n const record = res.records[id]\n if (record && record.metadata) {\n const evalMeta: VectorMetadata = {}\n for (const key in record.metadata) {\n if (key !== '__document') {\n evalMeta[key] = record.metadata[key]\n }\n }\n if (evaluateFilter(plan.filter, evalMeta)) {\n deleteIds.push(id)\n }\n }\n }\n }\n\n if (deleteIds.length > 0) {\n await ns.deleteMany({ ids: deleteIds })\n // Call settle after delete-by-filter to wait for absence\n await this.#settle(ns, collection, { absent: deleteIds }, 'delete by filter', mode)\n }\n } else {\n // Delete all via list+deleteMany pattern (no more deleteAll + settleEmpty)\n let page: any = { next: null }\n const allIds: string[] = []\n do {\n const lr = await this.#index!.listPaginated({\n namespace: physicalNs,\n limit: 1000,\n startingToken: page.next,\n })\n if (lr.vectors) allIds.push(...lr.vectors.map((v: any) => v.id))\n page.next = lr.pagination?.next\n } while (page.next)\n\n if (allIds.length > 0) {\n await ns.deleteMany({ ids: allIds })\n }\n // Settle on absence\n await this.#settle(ns, collection, { absent: allIds }, 'delete all', mode)\n }\n } catch (err) {\n // Re-throw consistency timeout directly (don't swallow)\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_CONSISTENCY_TIMEOUT', E_VECTOR_STORE_CONSISTENCY_TIMEOUT)\n )\n throw err\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Check if a filter targets the 'id' field (Pinecone record ID)\nconst isFilterOnId = (filter?: VectorFilter): boolean => {\n if (!filter) return false\n if (isRawFilter(filter)) {\n return false\n }\n if (isFilterCondition(filter)) {\n return filter.field === 'id'\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and && and.length > 0) {\n return and.some((f) => isFilterOnId(f))\n }\n if (or && or.length > 0) {\n return or.some((f) => isFilterOnId(f))\n }\n if (not) {\n return isFilterOnId(not)\n }\n }\n return false\n}\n\n/** Translate a neutral {@link VectorFilter} into a Pinecone metadata filter object. */\nexport const translatePineconeFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'pinecone') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'eq') {\n return { [field]: { $eq: value } }\n }\n if (op === 'ne') {\n return { [field]: { $ne: value } }\n }\n if (op === 'gt') {\n return { [field]: { $gt: value } }\n }\n if (op === 'gte') {\n return { [field]: { $gte: value } }\n }\n if (op === 'lt') {\n return { [field]: { $lt: value } }\n }\n if (op === 'lte') {\n return { [field]: { $lte: value } }\n }\n if (op === 'in') {\n return { [field]: { $in: value } }\n }\n if (op === 'nin') {\n return { [field]: { $nin: value } }\n }\n if (op === 'exists') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n if (op === 'contains') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', op])\n }\n return undefined\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $and: children }\n }\n if (or) {\n const children = or\n .map((f) => translatePineconeFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { $or: children }\n }\n if (not) {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pinecone', 'not'])\n }\n return undefined\n }\n return undefined\n}\n"],"mappings":"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"}
|
|
@@ -11,19 +11,26 @@ import type { VectorFilter } from "./filters";
|
|
|
11
11
|
import type { VectorRecord, DistanceMetric, VectorConsistency } from "./types";
|
|
12
12
|
/** Normalized projection from .select(); REQUIRED on reads — every column opt-in, id included. */
|
|
13
13
|
export interface Projection {
|
|
14
|
+
/** Whether to return each match's id. */
|
|
14
15
|
id: boolean;
|
|
16
|
+
/** Whether to return the stored vector (optionally renamed); `false` to omit. */
|
|
15
17
|
vector: false | {
|
|
16
18
|
name?: string;
|
|
17
19
|
};
|
|
20
|
+
/** Whether to return the document body (optionally from a named field); `false` to omit. */
|
|
18
21
|
document: false | {
|
|
19
22
|
field?: string;
|
|
20
23
|
};
|
|
24
|
+
/** Whether to return metadata (optionally a subset of fields); `false` to omit. */
|
|
21
25
|
metadata: false | {
|
|
22
26
|
fields?: string[];
|
|
23
27
|
};
|
|
24
28
|
}
|
|
29
|
+
/** A compiled nearest-neighbour search operation, consumed by an adapter's `executeSearch`. */
|
|
25
30
|
export interface SearchPlan {
|
|
31
|
+
/** Collection to search. */
|
|
26
32
|
collection: string;
|
|
33
|
+
/** The nearest-neighbour anchor: a client vector, server-embedded text, or an existing record id. */
|
|
27
34
|
near?: {
|
|
28
35
|
vector: number[];
|
|
29
36
|
} | {
|
|
@@ -31,35 +38,55 @@ export interface SearchPlan {
|
|
|
31
38
|
} | {
|
|
32
39
|
id: string;
|
|
33
40
|
};
|
|
41
|
+
/** Optional metadata filter applied alongside the vector search. */
|
|
34
42
|
filter?: VectorFilter;
|
|
43
|
+
/** Maximum number of matches to return. */
|
|
35
44
|
topK: number;
|
|
45
|
+
/** Number of leading matches to skip. */
|
|
36
46
|
offset?: number;
|
|
47
|
+
/** Which fields each match projects. */
|
|
37
48
|
projection: Projection;
|
|
38
49
|
}
|
|
50
|
+
/** A compiled insert-or-replace operation, consumed by an adapter's `executeUpsert`. */
|
|
39
51
|
export interface UpsertPlan {
|
|
52
|
+
/** Collection to write into. */
|
|
40
53
|
collection: string;
|
|
54
|
+
/** Records to insert or replace. */
|
|
41
55
|
records: VectorRecord[];
|
|
42
56
|
/** Per-operation read-after-write override from `.consistency()`; absent = use store/adapter default. */
|
|
43
57
|
consistency?: VectorConsistency;
|
|
44
58
|
}
|
|
59
|
+
/** A compiled delete operation, consumed by an adapter's `executeDelete`. */
|
|
45
60
|
export interface DeletePlan {
|
|
61
|
+
/** Collection to delete from. */
|
|
46
62
|
collection: string;
|
|
63
|
+
/** Ids to delete (the fast path); mutually informative with `filter`. */
|
|
47
64
|
ids?: string[];
|
|
65
|
+
/** Filter selecting the records to delete when `ids` is not used. */
|
|
48
66
|
filter?: VectorFilter;
|
|
49
67
|
/** Per-operation read-after-write override from `.consistency()`; absent = use store/adapter default. */
|
|
50
68
|
consistency?: VectorConsistency;
|
|
51
69
|
}
|
|
70
|
+
/** Declaration of a single metadata field in a {@link CollectionSpec}. */
|
|
52
71
|
export interface CollectionFieldSpec {
|
|
72
|
+
/** Field name. */
|
|
53
73
|
name: string;
|
|
74
|
+
/** Field's scalar type. */
|
|
54
75
|
type: 'string' | 'integer' | 'number' | 'boolean' | 'json';
|
|
76
|
+
/** Whether the backend should index the field for filtering. */
|
|
55
77
|
index?: boolean;
|
|
78
|
+
/** Whether the field accepts null/absent values. */
|
|
56
79
|
nullable?: boolean;
|
|
57
80
|
}
|
|
81
|
+
/** A compiled collection definition, consumed by an adapter's `createCollection`. */
|
|
58
82
|
export interface CollectionSpec {
|
|
83
|
+
/** Name of the collection to create. */
|
|
59
84
|
collection: string;
|
|
85
|
+
/** The vector column's dimensionality and distance metric. */
|
|
60
86
|
vector: {
|
|
61
87
|
dimensions: number;
|
|
62
88
|
metric: DistanceMetric;
|
|
63
89
|
};
|
|
90
|
+
/** The metadata fields the collection carries. */
|
|
64
91
|
fields: CollectionFieldSpec[];
|
|
65
92
|
}
|
|
@@ -5,8 +5,10 @@ import { BaseVectorStore } from "../contract";
|
|
|
5
5
|
import type { VectorFilter } from "../filters";
|
|
6
6
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
7
7
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
8
|
+
/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */
|
|
8
9
|
export declare const translateQdrantFilter: (filter?: VectorFilter) => Record<string, unknown> | undefined;
|
|
9
10
|
export interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {
|
|
11
|
+
/** Connection and authentication parameters for the backend. */
|
|
10
12
|
connection?: {
|
|
11
13
|
url?: string;
|
|
12
14
|
host?: string;
|
|
@@ -18,6 +20,7 @@ export interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
18
20
|
export declare class QdrantVectorStore extends BaseVectorStore {
|
|
19
21
|
#private;
|
|
20
22
|
readonly capabilities: VectorStoreCapabilities;
|
|
23
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
21
24
|
static isAvailable(): boolean;
|
|
22
25
|
isAvailable(): boolean;
|
|
23
26
|
connect(): Promise<void>;
|
|
@@ -29,6 +32,8 @@ export declare class QdrantVectorStore extends BaseVectorStore {
|
|
|
29
32
|
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
30
33
|
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
31
34
|
executeDelete(plan: DeletePlan): Promise<void>;
|
|
35
|
+
/** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
|
|
32
36
|
projectHit(hit: any, projection: any, metric: string): VectorMatch;
|
|
37
|
+
/** Instance wrapper over the module-level {@link translateQdrantFilter}. */
|
|
33
38
|
translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined;
|
|
34
39
|
}
|
|
@@ -9,6 +9,7 @@ const require_batteries_vector_validation = require("./validation.cjs");
|
|
|
9
9
|
/**
|
|
10
10
|
* @module @nhtio/adk/batteries/vector/qdrant
|
|
11
11
|
*/
|
|
12
|
+
/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */
|
|
12
13
|
var translateQdrantFilter = (filter) => {
|
|
13
14
|
if (!filter) return void 0;
|
|
14
15
|
if (require_batteries_vector_filters.isRawFilter(filter)) {
|
|
@@ -117,6 +118,7 @@ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVect
|
|
|
117
118
|
get #opts() {
|
|
118
119
|
return this.options;
|
|
119
120
|
}
|
|
121
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
120
122
|
static isAvailable() {
|
|
121
123
|
return typeof process !== "undefined";
|
|
122
124
|
}
|
|
@@ -261,6 +263,7 @@ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVect
|
|
|
261
263
|
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
262
264
|
}
|
|
263
265
|
}
|
|
266
|
+
/** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
|
|
264
267
|
projectHit(hit, projection, metric) {
|
|
265
268
|
const out = {};
|
|
266
269
|
const payload = hit.payload || {};
|
|
@@ -275,6 +278,7 @@ var QdrantVectorStore = class extends require_batteries_vector_contract.BaseVect
|
|
|
275
278
|
if (projection.score !== false && "score" in hit) out.score = require_batteries_vector_helpers.normalizeScore(hit.score, metric, metric === "euclidean" ? "distance" : "similarity");
|
|
276
279
|
return out;
|
|
277
280
|
}
|
|
281
|
+
/** Instance wrapper over the module-level {@link translateQdrantFilter}. */
|
|
278
282
|
translateQdrantFilter(filter) {
|
|
279
283
|
return translateQdrantFilter(filter);
|
|
280
284
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant.cjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\n }\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\n const metric = this.#opts.metric ?? 'cosine'\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 const res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qdrant.cjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\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 isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\n const metric = this.#opts.metric ?? 'cosine'\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 const res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n /** Instance wrapper over the module-level {@link translateQdrantFilter}. */\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { validateRecords } from "./validation.mjs";
|
|
|
8
8
|
/**
|
|
9
9
|
* @module @nhtio/adk/batteries/vector/qdrant
|
|
10
10
|
*/
|
|
11
|
+
/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */
|
|
11
12
|
var translateQdrantFilter = (filter) => {
|
|
12
13
|
if (!filter) return void 0;
|
|
13
14
|
if (isRawFilter(filter)) {
|
|
@@ -116,6 +117,7 @@ var QdrantVectorStore = class extends BaseVectorStore {
|
|
|
116
117
|
get #opts() {
|
|
117
118
|
return this.options;
|
|
118
119
|
}
|
|
120
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
119
121
|
static isAvailable() {
|
|
120
122
|
return typeof process !== "undefined";
|
|
121
123
|
}
|
|
@@ -260,6 +262,7 @@ var QdrantVectorStore = class extends BaseVectorStore {
|
|
|
260
262
|
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
261
263
|
}
|
|
262
264
|
}
|
|
265
|
+
/** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
|
|
263
266
|
projectHit(hit, projection, metric) {
|
|
264
267
|
const out = {};
|
|
265
268
|
const payload = hit.payload || {};
|
|
@@ -274,6 +277,7 @@ var QdrantVectorStore = class extends BaseVectorStore {
|
|
|
274
277
|
if (projection.score !== false && "score" in hit) out.score = normalizeScore(hit.score, metric, metric === "euclidean" ? "distance" : "similarity");
|
|
275
278
|
return out;
|
|
276
279
|
}
|
|
280
|
+
/** Instance wrapper over the module-level {@link translateQdrantFilter}. */
|
|
277
281
|
translateQdrantFilter(filter) {
|
|
278
282
|
return translateQdrantFilter(filter);
|
|
279
283
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant.mjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\n }\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\n const metric = this.#opts.metric ?? 'cosine'\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 const res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"qdrant.mjs","names":["#opts","#client"],"sources":["../../../src/batteries/vector/qdrant/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/qdrant\n */\n\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\n/** Translate a neutral {@link VectorFilter} into a Qdrant filter object. */\nexport const translateQdrantFilter = (\n filter?: VectorFilter\n): Record<string, unknown> | undefined => {\n if (!filter) return undefined\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'qdrant') {\n return filter.$raw as Record<string, unknown>\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n if (value === undefined) {\n if (op === 'exists') {\n return { must_not: [{ is_empty: { key: field } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (op === 'eq') {\n return { must: [{ key: field, match: { value } }] }\n }\n if (op === 'ne') {\n return { must_not: [{ key: field, match: { value } }] }\n }\n if (op === 'gt') {\n return { must: [{ key: field, range: { gt: value } }] }\n }\n if (op === 'gte') {\n return { must: [{ key: field, range: { gte: value } }] }\n }\n if (op === 'lt') {\n return { must: [{ key: field, range: { lt: value } }] }\n }\n if (op === 'lte') {\n return { must: [{ key: field, range: { lte: value } }] }\n }\n if (op === 'in') {\n return { must: [{ key: field, match: { any: value } }] }\n }\n if (op === 'nin') {\n return { must_not: [{ key: field, match: { any: value } }] }\n }\n if (op === 'exists') {\n return value === false\n ? { must: [{ is_empty: { key: field } }] }\n : { must_not: [{ is_empty: { key: field } }] }\n }\n if (op === 'contains') {\n return { must: [{ key: field, match: { value } }] }\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['qdrant', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n if (and) {\n const children = and\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { must: children }\n }\n if (or) {\n const children = or\n .map((f) => translateQdrantFilter(f) as Record<string, unknown>)\n .filter((c) => c !== undefined)\n if (children.length === 0) return undefined\n if (children.length === 1) return children[0]\n return { should: children }\n }\n if (not) {\n const child = translateQdrantFilter(not)\n if (!child) return { must_not: [] }\n return { must_not: [child] }\n }\n return undefined\n }\n return undefined\n}\n\nexport interface QdrantVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: { url?: string; host?: string; port?: number; apiKey?: string; https?: boolean }\n}\n\nconst getQdrantClient = async () => {\n try {\n const mod = await import('@qdrant/js-client-rest')\n return mod.QdrantClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@qdrant/js-client-rest'])\n }\n}\n\nconst getSha256 = () => {\n try {\n const mod = require('js-sha256')\n return mod.sha256\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['js-sha256'])\n }\n}\n\nconst uuidFromId = (id: string): string => {\n const sha256 = getSha256()\n const h = sha256(id)\n return (\n h.slice(0, 8) +\n '-' +\n h.slice(8, 12) +\n '-' +\n h.slice(12, 16) +\n '-' +\n h.slice(16, 20) +\n '-' +\n h.slice(20, 32)\n )\n}\n\nexport class QdrantVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: true,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (writes use wait=true): visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n get #opts() {\n return this.options as QdrantVectorStoreOptions\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 isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n async connect(): Promise<void> {\n if (this.#client) return\n const QdrantClient = await getQdrantClient()\n const c = this.#opts.connection || {}\n this.#client = new QdrantClient({\n url: c.url,\n host: c.host,\n port: c.port,\n apiKey: c.apiKey,\n https: c.https,\n })\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n }\n }\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n const dist =\n spec.vector.metric === 'cosine' ? 'Cosine' : spec.vector.metric === 'dot' ? 'Dot' : 'Euclid'\n if (ifNotExists && (await this.hasCollection(spec.collection))) return\n try {\n await client.createCollection(spec.collection, {\n vectors: { size: spec.vector.dimensions, distance: dist },\n })\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n if (ifExists && !(await this.hasCollection(collection))) return\n try {\n await client.deleteCollection(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n async hasCollection(collection: string): Promise<boolean> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.getCollection(collection)\n return true\n } catch {\n return false\n }\n }\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'qdrant'])\n }\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const client = this.#client || (await this.connect(), this.#client!)\n const expected = this.#opts.dimensions\n const points: 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 (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n points.push({\n id: uuidFromId(r.id),\n vector,\n payload: { ...r.metadata, __id: r.id, __document: r.document },\n })\n }\n try {\n await client.upsert(plan.collection, { points })\n } catch (err) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const client = this.#client || (await this.connect(), this.#client!)\n const metric = this.#opts.metric ?? 'cosine'\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 const res = await client.scroll(plan.collection, {\n filter: { must: [{ key: '__id', match: { value: plan.near.id } }] },\n limit: 1,\n with_payload: true,\n with_vector: true,\n })\n if (res.points.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.points[0].vector as number[]\n }\n }\n let hits: any[]\n if (queryVector) {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.search(plan.collection, {\n vector: queryVector,\n limit: plan.topK,\n offset: plan.offset,\n filter,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res\n } else {\n const filter = this.translateQdrantFilter(plan.filter)\n const res = await client.scroll(plan.collection, {\n filter,\n limit: plan.topK,\n with_payload: true,\n with_vector: !!plan.projection.vector,\n })\n hits = res.points\n }\n const proj = plan.projection\n return hits.map((hit) => this.projectHit(hit, proj, metric))\n }\n async executeDelete(plan: DeletePlan): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n if (plan.ids) {\n await client.delete(plan.collection, { points: plan.ids.map(uuidFromId) })\n } else if (plan.filter) {\n await client.delete(plan.collection, { filter: this.translateQdrantFilter(plan.filter) })\n } else {\n await client.delete(plan.collection, { filter: {} })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n /** Project a raw Qdrant hit into a {@link VectorMatch} per the requested projection, normalizing its score. */\n projectHit(hit: any, projection: any, metric: string): VectorMatch {\n const out: VectorMatch = {}\n const payload = hit.payload || {}\n if (projection.id) {\n out.id = payload.__id\n }\n if (projection.vector && hit.vector) {\n out.vector = hit.vector as number[]\n }\n if (projection.document) {\n out.document = payload.__document\n }\n if (projection.metadata) {\n const meta: Record<string, unknown> = {}\n for (const k in payload) {\n if (k !== '__id' && k !== '__document') {\n meta[k] = payload[k]\n }\n }\n out.metadata = meta as any\n }\n if (projection.score !== false && 'score' in hit) {\n out.score = normalizeScore(\n hit.score as number,\n metric as any,\n metric === 'euclidean' ? 'distance' : 'similarity'\n )\n }\n return out\n }\n /** Instance wrapper over the module-level {@link translateQdrantFilter}. */\n translateQdrantFilter(filter?: VectorFilter): Record<string, unknown> | undefined {\n return translateQdrantFilter(filter)\n }\n}\n"],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import type { VectorFilter } from "../filters";
|
|
|
15
15
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
16
16
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
17
17
|
export interface RedisVectorStoreOptions extends BaseVectorStoreOptions {
|
|
18
|
+
/** Connection and authentication parameters for the backend. */
|
|
18
19
|
connection?: {
|
|
19
20
|
url?: string;
|
|
20
21
|
username?: string;
|
|
@@ -30,6 +31,7 @@ export declare const translateRedisFilter: (filter?: VectorFilter) => string;
|
|
|
30
31
|
export declare class RedisVectorStore extends BaseVectorStore {
|
|
31
32
|
#private;
|
|
32
33
|
readonly capabilities: VectorStoreCapabilities;
|
|
34
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
33
35
|
static isAvailable(): boolean;
|
|
34
36
|
isAvailable(): boolean;
|
|
35
37
|
connect(): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../chunk-Ble4zEEl.js");
|
|
3
|
-
const require_tool_registry = require("../../tool_registry-
|
|
3
|
+
const require_tool_registry = require("../../tool_registry-CKJPze3j.js");
|
|
4
4
|
require("../../guards.cjs");
|
|
5
5
|
const require_batteries_vector_filters = require("./filters.cjs");
|
|
6
6
|
const require_batteries_vector_helpers = require("./helpers.cjs");
|
|
@@ -110,6 +110,7 @@ var RedisVectorStore = class extends require_batteries_vector_contract.BaseVecto
|
|
|
110
110
|
get #opts() {
|
|
111
111
|
return this.options;
|
|
112
112
|
}
|
|
113
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
113
114
|
static isAvailable() {
|
|
114
115
|
return typeof process !== "undefined";
|
|
115
116
|
}
|