@nhtio/adk 1.20260607.2 → 1.20260609.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +185 -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/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 +1 -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/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +150 -0
- package/batteries/tools/searxng.cjs +5 -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.cjs +3 -0
- package/batteries/tools.mjs +2 -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 +46 -28
- package/batteries.mjs +10 -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.d.ts +1 -1
- 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.cjs +1 -1
- package/eslint.mjs +1 -1
- 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 +13 -13
- package/index.mjs +13 -13
- 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 +264 -224
- 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/searxng-Bkrwhwhw.js +269 -0
- package/searxng-Bkrwhwhw.js.map +1 -0
- package/searxng-CyA-nEu5.mjs +257 -0
- package/searxng-CyA-nEu5.mjs.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":"milvus.cjs","names":["#opts","#client","#dims"],"sources":["../../../src/batteries/vector/milvus/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/milvus\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_CONNECTION_FAILED,\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 interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n address?: string\n url?: string\n token?: string\n username?: string\n password?: string\n ssl?: boolean\n }\n}\n\nconst getMilvusClient = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.MilvusClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst getDataType = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.DataType\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst mapMetricToMilvus = (metric: string): string => {\n if (metric === 'cosine') return 'COSINE'\n if (metric === 'dot') return 'IP'\n if (metric === 'euclidean') return 'L2'\n return 'COSINE'\n}\n\nexport class MilvusVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (search/query use consistency_level 'Strong'); the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n get #opts() {\n return this.options as MilvusVectorStoreOptions\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 MilvusClient = await getMilvusClient()\n const c = this.#opts.connection || {}\n let address = c.address\n if (!address && c.url) {\n try {\n const url = new URL(c.url)\n const host = url.hostname\n const port = url.port || (url.protocol === 'https:' ? '443' : '19530')\n address = `${host}:${port}`\n } catch {\n throw new E_VECTOR_STORE_CONNECTION_FAILED(['Invalid connection URL'])\n }\n }\n if (!address) {\n address = 'localhost:19530'\n }\n try {\n this.#client = new MilvusClient({\n address,\n token: c.token,\n username: c.username,\n password: c.password,\n ssl: c.ssl,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.closeConnection?.()\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 collectionName = spec.collection\n const metric = spec.vector.metric ?? 'cosine'\n const dim = spec.vector.dimensions\n if (ifNotExists && (await this.hasCollection(collectionName))) return\n try {\n const has = await client.hasCollection({ collection_name: collectionName })\n if (has.value && !ifNotExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n if (has.value && ifNotExists) return\n const DataType = await getDataType()\n await client.createCollection({\n collection_name: collectionName,\n fields: [\n { name: 'id', data_type: DataType.VarChar, is_primary_key: true, max_length: 512 },\n { name: 'vector', data_type: DataType.FloatVector, dim },\n { name: 'document', data_type: DataType.VarChar, max_length: 65535 },\n { name: 'metadata', data_type: DataType.JSON },\n ],\n })\n const indexType = 'AUTOINDEX'\n const metricType = mapMetricToMilvus(metric)\n await client.createIndex({\n collection_name: collectionName,\n field_name: 'vector',\n index_type: indexType,\n metric_type: metricType,\n })\n await client.loadCollectionSync({ collection_name: collectionName })\n this.#dims.set(collectionName, dim)\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 const has = await client.hasCollection({ collection_name: collection })\n if (!has.value && !ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n await client.dropCollection({ collection_name: collection })\n this.#dims.delete(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 const r = await client.hasCollection({ collection_name: collection })\n return !!r.value\n } catch {\n return false\n }\n }\n async renameCollection(from: string, to: string): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.renameCollection({ old_collection_name: from, new_collection_name: to })\n if (this.#dims.has(from)) {\n this.#dims.set(to, this.#dims.get(from)!)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['renameCollection', String(err)])\n }\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 collectionName = plan.collection\n const dim = this.#dims.get(collectionName)\n const rows: 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 (dim !== undefined && vector.length !== dim) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dim, vector.length])\n }\n rows.push({\n id: r.id,\n vector,\n document: r.document ?? '',\n metadata: r.metadata ?? {},\n })\n }\n try {\n await client.upsert({ collection_name: collectionName, data: rows })\n await client.flushSync({ collection_names: [collectionName] })\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.query({\n collection_name: plan.collection,\n filter: `id == \"${plan.near.id}\"`,\n output_fields: ['vector'],\n })\n if (res.data.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.data[0].vector as number[]\n }\n }\n const outputFields = ['id', 'document', 'metadata']\n if (plan.projection.vector) {\n outputFields.push('vector')\n }\n const milvusFilter = translateMilvusFilter(plan.filter)\n let results: any\n if (queryVector) {\n results = await client.search({\n collection_name: plan.collection,\n data: [queryVector],\n limit: plan.topK,\n offset: plan.offset,\n filter: milvusFilter,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n } else {\n results = await client.query({\n collection_name: plan.collection,\n filter: milvusFilter || '',\n limit: plan.topK,\n offset: plan.offset,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n }\n const hitList = results.results || results.data || []\n const proj = plan.projection\n return hitList.map((hit: any) => 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 const collectionName = plan.collection\n if (plan.ids) {\n const filter = `id in [${plan.ids.map((i) => JSON.stringify(i)).join(',')}]`\n await client.delete({ collection_name: collectionName, filter })\n } else if (plan.filter) {\n const filter = translateMilvusFilter(plan.filter)\n await client.delete({ collection_name: collectionName, filter })\n } else {\n await client.delete({ collection_name: collectionName, filter: 'id != \"\"' })\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 if (projection.id) {\n out.id = hit.id\n }\n if (projection.vector && 'vector' in hit) {\n out.vector = hit.vector\n }\n if (projection.document) {\n out.document = hit.document\n }\n if (projection.metadata) {\n out.metadata = hit.metadata\n }\n if ('score' in hit && hit.score !== undefined) {\n const kind = metric === 'euclidean' ? 'distance' : 'similarity'\n out.score = normalizeScore(hit.score as number, metric as any, kind)\n }\n return out\n }\n translateMilvusFilter(filter?: VectorFilter): string {\n return translateMilvusFilter(filter)\n }\n}\n\nexport const translateMilvusFilter = (filter?: VectorFilter): string => {\n if (!filter) return ''\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'milvus' && typeof filter.$raw === 'string') {\n return filter.$raw\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const jsonField = `metadata[\"${field}\"]`\n if (value === undefined) {\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n const toJsonValue = (v: unknown): string => {\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n return `[${v.map(toJsonValue).join(',')}]`\n }\n return JSON.stringify(v)\n }\n if (op === 'eq') return `${jsonField} == ${toJsonValue(value)}`\n if (op === 'ne') return `${jsonField} != ${toJsonValue(value)}`\n if (op === 'gt') return `${jsonField} > ${toJsonValue(value)}`\n if (op === 'gte') return `${jsonField} >= ${toJsonValue(value)}`\n if (op === 'lt') return `${jsonField} < ${toJsonValue(value)}`\n if (op === 'lte') return `${jsonField} <= ${toJsonValue(value)}`\n if (op === 'in') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'nin') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} not in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n if (op === 'contains') {\n return `json_contains(${jsonField}, ${toJsonValue(value)})`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n const parts: string[] = []\n if (and) {\n const children = and.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' && ')})`)\n }\n if (or) {\n const children = or.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' || ')})`)\n }\n if (not) {\n const child = translateMilvusFilter(not)\n if (child === '') return ''\n parts.push(`!(${child})`)\n }\n if (parts.length === 0) return ''\n if (parts.length === 1) return parts[0]\n return parts.join(' && ')\n }\n return ''\n}\n"],"mappings":";;;;;;;;;;;AAiCA,IAAM,kBAAkB,YAAY;CAClC,IAAI;EAEF,QAAO,MADW,OAAO,6BACd;CACb,QAAQ;EACN,MAAM,IAAI,oCAAA,kCAAkC,CAAC,0BAA0B,CAAC;CAC1E;AACF;AAEA,IAAM,cAAc,YAAY;CAC9B,IAAI;EAEF,QAAO,MADW,OAAO,6BACd;CACb,QAAQ;EACN,MAAM,IAAI,oCAAA,kCAAkC,CAAC,0BAA0B,CAAC;CAC1E;AACF;AAEA,IAAM,qBAAqB,WAA2B;CACpD,IAAI,WAAW,UAAU,OAAO;CAChC,IAAI,WAAW,OAAO,OAAO;CAC7B,IAAI,WAAW,aAAa,OAAO;CACnC,OAAO;AACT;AAEA,IAAa,oBAAb,cAAuC,kCAAA,gBAAgB;CACrD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CACA,UAAsB;CACtB,wBAA6B,IAAI,IAAI;CACrC,IAAIA,QAAQ;EACV,OAAO,KAAK;CACd;CACA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CACA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,SAAS;EAClB,MAAM,eAAe,MAAM,gBAAgB;EAC3C,MAAM,IAAI,KAAKD,MAAM,cAAc,CAAC;EACpC,IAAI,UAAU,EAAE;EAChB,IAAI,CAAC,WAAW,EAAE,KAChB,IAAI;GACF,MAAM,MAAM,IAAI,IAAI,EAAE,GAAG;GAGzB,UAAU,GAFG,IAAI,SAEC,GADL,IAAI,SAAS,IAAI,aAAa,WAAW,QAAQ;EAEhE,QAAQ;GACN,MAAM,IAAI,oCAAA,iCAAiC,CAAC,wBAAwB,CAAC;EACvE;EAEF,IAAI,CAAC,SACH,UAAU;EAEZ,IAAI;GACF,KAAKC,UAAU,IAAI,aAAa;IAC9B;IACA,OAAO,EAAE;IACT,UAAU,EAAE;IACZ,UAAU,EAAE;IACZ,KAAK,EAAE;GACT,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,OAAO,GAAG,CAAC,CAAC;EAC1D;CACF;CACA,MAAM,QAAuB;EAC3B,IAAI,KAAKA,SAAS;GAChB,MAAM,KAAKA,QAAQ,kBAAkB;GACrC,KAAKA,UAAU;EACjB;CACF;CACA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,iBAAiB,KAAK;EAC5B,MAAM,SAAS,KAAK,OAAO,UAAU;EACrC,MAAM,MAAM,KAAK,OAAO;EACxB,IAAI,eAAgB,MAAM,KAAK,cAAc,cAAc,GAAI;EAC/D,IAAI;GACF,MAAM,MAAM,MAAM,OAAO,cAAc,EAAE,iBAAiB,eAAe,CAAC;GAC1E,IAAI,IAAI,SAAS,CAAC,aAChB,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,mBAAmB,CAAC;GAE5E,IAAI,IAAI,SAAS,aAAa;GAC9B,MAAM,WAAW,MAAM,YAAY;GACnC,MAAM,OAAO,iBAAiB;IAC5B,iBAAiB;IACjB,QAAQ;KACN;MAAE,MAAM;MAAM,WAAW,SAAS;MAAS,gBAAgB;MAAM,YAAY;KAAI;KACjF;MAAE,MAAM;MAAU,WAAW,SAAS;MAAa;KAAI;KACvD;MAAE,MAAM;MAAY,WAAW,SAAS;MAAS,YAAY;KAAM;KACnE;MAAE,MAAM;MAAY,WAAW,SAAS;KAAK;IAC/C;GACF,CAAC;GACD,MAAM,YAAY;GAClB,MAAM,aAAa,kBAAkB,MAAM;GAC3C,MAAM,OAAO,YAAY;IACvB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,aAAa;GACf,CAAC;GACD,MAAM,OAAO,mBAAmB,EAAE,iBAAiB,eAAe,CAAC;GACnE,KAAKC,MAAM,IAAI,gBAAgB,GAAG;EACpC,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CACA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI,YAAY,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EACzD,IAAI;GAEF,IAAI,EAAC,MADa,OAAO,cAAc,EAAE,iBAAiB,WAAW,CAAC,GAC7D,SAAS,CAAC,UACjB,MAAM,IAAI,oCAAA,iCAAiC,CAAC,QAAQ,2BAA2B,CAAC;GAElF,MAAM,OAAO,eAAe,EAAE,iBAAiB,WAAW,CAAC;GAC3D,KAAKC,MAAM,OAAO,UAAU;EAC9B,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC;EAC5E;CACF;CACA,MAAM,cAAc,YAAsC;EACxD,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GAEF,OAAO,CAAC,EAAC,MADO,OAAO,cAAc,EAAE,iBAAiB,WAAW,CAAC,GACzD;EACb,QAAQ;GACN,OAAO;EACT;CACF;CACA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,MAAM,OAAO,iBAAiB;IAAE,qBAAqB;IAAM,qBAAqB;GAAG,CAAC;GACpF,IAAI,KAAKC,MAAM,IAAI,IAAI,GAAG;IACxB,KAAKA,MAAM,IAAI,IAAI,KAAKA,MAAM,IAAI,IAAI,CAAE;IACxC,KAAKA,MAAM,OAAO,IAAI;GACxB;EACF,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CACA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,oCAAA,gBAAgB,KAAK,OAAO;EAC5B,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,iBAAiB,KAAK;EAC5B,MAAM,MAAM,KAAKC,MAAM,IAAI,cAAc;EACzC,MAAM,OAAc,CAAC;EACrB,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,IAAI,SAAS,EAAE;GACf,IAAI,CAAC,UAAU,EAAE,UAAU;IACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;IACtD,SAAS;GACX;GACA,IAAI,CAAC,QACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,oCAAoC,CAAC;GAE/E,IAAI,QAAQ,KAAA,KAAa,OAAO,WAAW,KACzC,MAAM,IAAI,oCAAA,kCAAkC,CAAC,KAAK,OAAO,MAAM,CAAC;GAElE,KAAK,KAAK;IACR,IAAI,EAAE;IACN;IACA,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY,CAAC;GAC3B,CAAC;EACH;EACA,IAAI;GACF,MAAM,OAAO,OAAO;IAAE,iBAAiB;IAAgB,MAAM;GAAK,CAAC;GACnE,MAAM,OAAO,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,CAAC;EAC/D,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,MAAM,cAAc,MAA0C;EAC5D,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,SAAS,KAAKD,MAAM,UAAU;EACpC,IAAI;EACJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAC5B,MAAM,MAAM,MAAM,OAAO,MAAM;KAC7B,iBAAiB,KAAK;KACtB,QAAQ,UAAU,KAAK,KAAK,GAAG;KAC/B,eAAe,CAAC,QAAQ;IAC1B,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,GACtB,MAAM,IAAI,oCAAA,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,IAAI,KAAK,GAAG;GAC5B;;EAEF,MAAM,eAAe;GAAC;GAAM;GAAY;EAAU;EAClD,IAAI,KAAK,WAAW,QAClB,aAAa,KAAK,QAAQ;EAE5B,MAAM,eAAe,sBAAsB,KAAK,MAAM;EACtD,IAAI;EACJ,IAAI,aACF,UAAU,MAAM,OAAO,OAAO;GAC5B,iBAAiB,KAAK;GACtB,MAAM,CAAC,WAAW;GAClB,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,QAAQ;GACR,eAAe;GACf,mBAAmB;EACrB,CAAC;OAED,UAAU,MAAM,OAAO,MAAM;GAC3B,iBAAiB,KAAK;GACtB,QAAQ,gBAAgB;GACxB,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,eAAe;GACf,mBAAmB;EACrB,CAAC;EAEH,MAAM,UAAU,QAAQ,WAAW,QAAQ,QAAQ,CAAC;EACpD,MAAM,OAAO,KAAK;EAClB,OAAO,QAAQ,KAAK,QAAa,KAAK,WAAW,KAAK,MAAM,MAAM,CAAC;CACrE;CACA,MAAM,cAAc,MAAiC;EACnD,MAAM,SAAS,KAAKC,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,MAAM,iBAAiB,KAAK;GAC5B,IAAI,KAAK,KAAK;IACZ,MAAM,SAAS,UAAU,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE;IAC1E,MAAM,OAAO,OAAO;KAAE,iBAAiB;KAAgB;IAAO,CAAC;GACjE,OAAO,IAAI,KAAK,QAAQ;IACtB,MAAM,SAAS,sBAAsB,KAAK,MAAM;IAChD,MAAM,OAAO,OAAO;KAAE,iBAAiB;KAAgB;IAAO,CAAC;GACjE,OACE,MAAM,OAAO,OAAO;IAAE,iBAAiB;IAAgB,QAAQ;GAAW,CAAC;EAE/E,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,WAAW,KAAU,YAAiB,QAA6B;EACjE,MAAM,MAAmB,CAAC;EAC1B,IAAI,WAAW,IACb,IAAI,KAAK,IAAI;EAEf,IAAI,WAAW,UAAU,YAAY,KACnC,IAAI,SAAS,IAAI;EAEnB,IAAI,WAAW,UACb,IAAI,WAAW,IAAI;EAErB,IAAI,WAAW,UACb,IAAI,WAAW,IAAI;EAErB,IAAI,WAAW,OAAO,IAAI,UAAU,KAAA,GAAW;GAC7C,MAAM,OAAO,WAAW,cAAc,aAAa;GACnD,IAAI,QAAQ,iCAAA,eAAe,IAAI,OAAiB,QAAe,IAAI;EACrE;EACA,OAAO;CACT;CACA,sBAAsB,QAA+B;EACnD,OAAO,sBAAsB,MAAM;CACrC;AACF;AAEA,IAAa,yBAAyB,WAAkC;CACtE,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,iCAAA,YAAY,MAAM,GAAG;EACvB,IAAI,OAAO,aAAa,YAAY,OAAO,OAAO,SAAS,UACzD,OAAO,OAAO;EAEhB,MAAM,IAAI,oCAAA,2CAA2C,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,CAAC;CAC1F;CACA,IAAI,iCAAA,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,MAAM,YAAY,aAAa,MAAM;EACrC,IAAI,UAAU,KAAA,GAAW;GACvB,IAAI,OAAO,UACT,OAAO,UAAU;GAEnB,MAAM,IAAI,oCAAA,2CAA2C,CAAC,UAAU,EAAE,CAAC;EACrE;EACA,MAAM,eAAe,MAAuB;GAC1C,IAAI,OAAO,MAAM,UAAU,OAAO,KAAK,UAAU,CAAC;GAClD,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,OAAO,OAAO,CAAC;GACpE,IAAI,MAAM,QAAQ,CAAC,GACjB,OAAO,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,GAAG,EAAE;GAE1C,OAAO,KAAK,UAAU,CAAC;EACzB;EACA,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC5D,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC5D,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,KAAK,YAAY,KAAK;EAC3D,IAAI,OAAO,OAAO,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC7D,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,KAAK,YAAY,KAAK;EAC3D,IAAI,OAAO,OAAO,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC7D,IAAI,OAAO,MAAM;GACf,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;GAClC,OAAO,GAAG,UAAU,OAAO,MAAM,IAAI,WAAW,EAAE,KAAK,GAAG,EAAE;EAC9D;EACA,IAAI,OAAO,OAAO;GAChB,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;GAClC,OAAO,GAAG,UAAU,WAAW,MAAM,IAAI,WAAW,EAAE,KAAK,GAAG,EAAE;EAClE;EACA,IAAI,OAAO,UACT,OAAO,UAAU;EAEnB,IAAI,OAAO,YACT,OAAO,iBAAiB,UAAU,IAAI,YAAY,KAAK,EAAE;EAE3D,MAAM,IAAI,oCAAA,2CAA2C,CAAC,UAAU,EAAE,CAAC;CACrE;CACA,IAAI,iCAAA,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,MAAM,QAAkB,CAAC;EACzB,IAAI,KAAK;GACP,MAAM,WAAW,IAAI,KAAK,MAAM,sBAAsB,CAAC,CAAC,EAAE,QAAQ,MAAM,MAAM,EAAE;GAChF,IAAI,SAAS,WAAW,GAAG,OAAO;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,MAAM,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE,EAAE;EACzC;EACA,IAAI,IAAI;GACN,MAAM,WAAW,GAAG,KAAK,MAAM,sBAAsB,CAAC,CAAC,EAAE,QAAQ,MAAM,MAAM,EAAE;GAC/E,IAAI,SAAS,WAAW,GAAG,OAAO;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,MAAM,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE,EAAE;EACzC;EACA,IAAI,KAAK;GACP,MAAM,QAAQ,sBAAsB,GAAG;GACvC,IAAI,UAAU,IAAI,OAAO;GACzB,MAAM,KAAK,KAAK,MAAM,EAAE;EAC1B;EACA,IAAI,MAAM,WAAW,GAAG,OAAO;EAC/B,IAAI,MAAM,WAAW,GAAG,OAAO,MAAM;EACrC,OAAO,MAAM,KAAK,MAAM;CAC1B;CACA,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"milvus.cjs","names":["#opts","#client","#dims"],"sources":["../../../src/batteries/vector/milvus/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/milvus\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_CONNECTION_FAILED,\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 interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: {\n address?: string\n url?: string\n token?: string\n username?: string\n password?: string\n ssl?: boolean\n }\n}\n\nconst getMilvusClient = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.MilvusClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst getDataType = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.DataType\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst mapMetricToMilvus = (metric: string): string => {\n if (metric === 'cosine') return 'COSINE'\n if (metric === 'dot') return 'IP'\n if (metric === 'euclidean') return 'L2'\n return 'COSINE'\n}\n\nexport class MilvusVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (search/query use consistency_level 'Strong'); the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n get #opts() {\n return this.options as MilvusVectorStoreOptions\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 MilvusClient = await getMilvusClient()\n const c = this.#opts.connection || {}\n let address = c.address\n if (!address && c.url) {\n try {\n const url = new URL(c.url)\n const host = url.hostname\n const port = url.port || (url.protocol === 'https:' ? '443' : '19530')\n address = `${host}:${port}`\n } catch {\n throw new E_VECTOR_STORE_CONNECTION_FAILED(['Invalid connection URL'])\n }\n }\n if (!address) {\n address = 'localhost:19530'\n }\n try {\n this.#client = new MilvusClient({\n address,\n token: c.token,\n username: c.username,\n password: c.password,\n ssl: c.ssl,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.closeConnection?.()\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 collectionName = spec.collection\n const metric = spec.vector.metric ?? 'cosine'\n const dim = spec.vector.dimensions\n if (ifNotExists && (await this.hasCollection(collectionName))) return\n try {\n const has = await client.hasCollection({ collection_name: collectionName })\n if (has.value && !ifNotExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n if (has.value && ifNotExists) return\n const DataType = await getDataType()\n await client.createCollection({\n collection_name: collectionName,\n fields: [\n { name: 'id', data_type: DataType.VarChar, is_primary_key: true, max_length: 512 },\n { name: 'vector', data_type: DataType.FloatVector, dim },\n { name: 'document', data_type: DataType.VarChar, max_length: 65535 },\n { name: 'metadata', data_type: DataType.JSON },\n ],\n })\n const indexType = 'AUTOINDEX'\n const metricType = mapMetricToMilvus(metric)\n await client.createIndex({\n collection_name: collectionName,\n field_name: 'vector',\n index_type: indexType,\n metric_type: metricType,\n })\n await client.loadCollectionSync({ collection_name: collectionName })\n this.#dims.set(collectionName, dim)\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 const has = await client.hasCollection({ collection_name: collection })\n if (!has.value && !ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n await client.dropCollection({ collection_name: collection })\n this.#dims.delete(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 const r = await client.hasCollection({ collection_name: collection })\n return !!r.value\n } catch {\n return false\n }\n }\n async renameCollection(from: string, to: string): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.renameCollection({ old_collection_name: from, new_collection_name: to })\n if (this.#dims.has(from)) {\n this.#dims.set(to, this.#dims.get(from)!)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['renameCollection', String(err)])\n }\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 collectionName = plan.collection\n const dim = this.#dims.get(collectionName)\n const rows: 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 (dim !== undefined && vector.length !== dim) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dim, vector.length])\n }\n rows.push({\n id: r.id,\n vector,\n document: r.document ?? '',\n metadata: r.metadata ?? {},\n })\n }\n try {\n await client.upsert({ collection_name: collectionName, data: rows })\n await client.flushSync({ collection_names: [collectionName] })\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.query({\n collection_name: plan.collection,\n filter: `id == \"${plan.near.id}\"`,\n output_fields: ['vector'],\n })\n if (res.data.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.data[0].vector as number[]\n }\n }\n const outputFields = ['id', 'document', 'metadata']\n if (plan.projection.vector) {\n outputFields.push('vector')\n }\n const milvusFilter = translateMilvusFilter(plan.filter)\n let results: any\n if (queryVector) {\n results = await client.search({\n collection_name: plan.collection,\n data: [queryVector],\n limit: plan.topK,\n offset: plan.offset,\n filter: milvusFilter,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n } else {\n results = await client.query({\n collection_name: plan.collection,\n filter: milvusFilter || '',\n limit: plan.topK,\n offset: plan.offset,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n }\n const hitList = results.results || results.data || []\n const proj = plan.projection\n return hitList.map((hit: any) => 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 const collectionName = plan.collection\n if (plan.ids) {\n const filter = `id in [${plan.ids.map((i) => JSON.stringify(i)).join(',')}]`\n await client.delete({ collection_name: collectionName, filter })\n } else if (plan.filter) {\n const filter = translateMilvusFilter(plan.filter)\n await client.delete({ collection_name: collectionName, filter })\n } else {\n await client.delete({ collection_name: collectionName, filter: 'id != \"\"' })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n /** Project a raw Milvus 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 if (projection.id) {\n out.id = hit.id\n }\n if (projection.vector && 'vector' in hit) {\n out.vector = hit.vector\n }\n if (projection.document) {\n out.document = hit.document\n }\n if (projection.metadata) {\n out.metadata = hit.metadata\n }\n if ('score' in hit && hit.score !== undefined) {\n const kind = metric === 'euclidean' ? 'distance' : 'similarity'\n out.score = normalizeScore(hit.score as number, metric as any, kind)\n }\n return out\n }\n /** Instance wrapper over the module-level {@link translateMilvusFilter}. */\n translateMilvusFilter(filter?: VectorFilter): string {\n return translateMilvusFilter(filter)\n }\n}\n\n/** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */\nexport const translateMilvusFilter = (filter?: VectorFilter): string => {\n if (!filter) return ''\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'milvus' && typeof filter.$raw === 'string') {\n return filter.$raw\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const jsonField = `metadata[\"${field}\"]`\n if (value === undefined) {\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n const toJsonValue = (v: unknown): string => {\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n return `[${v.map(toJsonValue).join(',')}]`\n }\n return JSON.stringify(v)\n }\n if (op === 'eq') return `${jsonField} == ${toJsonValue(value)}`\n if (op === 'ne') return `${jsonField} != ${toJsonValue(value)}`\n if (op === 'gt') return `${jsonField} > ${toJsonValue(value)}`\n if (op === 'gte') return `${jsonField} >= ${toJsonValue(value)}`\n if (op === 'lt') return `${jsonField} < ${toJsonValue(value)}`\n if (op === 'lte') return `${jsonField} <= ${toJsonValue(value)}`\n if (op === 'in') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'nin') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} not in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n if (op === 'contains') {\n return `json_contains(${jsonField}, ${toJsonValue(value)})`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n const parts: string[] = []\n if (and) {\n const children = and.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' && ')})`)\n }\n if (or) {\n const children = or.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' || ')})`)\n }\n if (not) {\n const child = translateMilvusFilter(not)\n if (child === '') return ''\n parts.push(`!(${child})`)\n }\n if (parts.length === 0) return ''\n if (parts.length === 1) return parts[0]\n return parts.join(' && ')\n }\n return ''\n}\n"],"mappings":";;;;;;;;;;;AAkCA,IAAM,kBAAkB,YAAY;CAClC,IAAI;EAEF,QAAO,MADW,OAAO,6BACd;CACb,QAAQ;EACN,MAAM,IAAI,oCAAA,kCAAkC,CAAC,0BAA0B,CAAC;CAC1E;AACF;AAEA,IAAM,cAAc,YAAY;CAC9B,IAAI;EAEF,QAAO,MADW,OAAO,6BACd;CACb,QAAQ;EACN,MAAM,IAAI,oCAAA,kCAAkC,CAAC,0BAA0B,CAAC;CAC1E;AACF;AAEA,IAAM,qBAAqB,WAA2B;CACpD,IAAI,WAAW,UAAU,OAAO;CAChC,IAAI,WAAW,OAAO,OAAO;CAC7B,IAAI,WAAW,aAAa,OAAO;CACnC,OAAO;AACT;AAEA,IAAa,oBAAb,cAAuC,kCAAA,gBAAgB;CACrD,eAAiD;EAC/C,cAAc;EACd,cAAc;EACd,QAAQ;EACR,QAAQ;EACR,iBAAiB;EAEjB,aAAa;GAAE,cAAc;GAAO,SAAS;GAAU,OAAO,CAAC,QAAQ;EAAE;CAC3E;CACA,UAAsB;CACtB,wBAA6B,IAAI,IAAI;CACrC,IAAIA,QAAQ;EACV,OAAO,KAAK;CACd;;CAEA,OAAO,cAAuB;EAC5B,OAAO,OAAO,YAAY;CAC5B;CACA,cAAuB;EACrB,OAAO,OAAO,YAAY;CAC5B;CACA,MAAM,UAAyB;EAC7B,IAAI,KAAKC,SAAS;EAClB,MAAM,eAAe,MAAM,gBAAgB;EAC3C,MAAM,IAAI,KAAKD,MAAM,cAAc,CAAC;EACpC,IAAI,UAAU,EAAE;EAChB,IAAI,CAAC,WAAW,EAAE,KAChB,IAAI;GACF,MAAM,MAAM,IAAI,IAAI,EAAE,GAAG;GAGzB,UAAU,GAFG,IAAI,SAEC,GADL,IAAI,SAAS,IAAI,aAAa,WAAW,QAAQ;EAEhE,QAAQ;GACN,MAAM,IAAI,oCAAA,iCAAiC,CAAC,wBAAwB,CAAC;EACvE;EAEF,IAAI,CAAC,SACH,UAAU;EAEZ,IAAI;GACF,KAAKC,UAAU,IAAI,aAAa;IAC9B;IACA,OAAO,EAAE;IACT,UAAU,EAAE;IACZ,UAAU,EAAE;IACZ,KAAK,EAAE;GACT,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,OAAO,GAAG,CAAC,CAAC;EAC1D;CACF;CACA,MAAM,QAAuB;EAC3B,IAAI,KAAKA,SAAS;GAChB,MAAM,KAAKA,QAAQ,kBAAkB;GACrC,KAAKA,UAAU;EACjB;CACF;CACA,MAAM,iBAAiB,MAAsB,aAAqC;EAChF,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,iBAAiB,KAAK;EAC5B,MAAM,SAAS,KAAK,OAAO,UAAU;EACrC,MAAM,MAAM,KAAK,OAAO;EACxB,IAAI,eAAgB,MAAM,KAAK,cAAc,cAAc,GAAI;EAC/D,IAAI;GACF,MAAM,MAAM,MAAM,OAAO,cAAc,EAAE,iBAAiB,eAAe,CAAC;GAC1E,IAAI,IAAI,SAAS,CAAC,aAChB,MAAM,IAAI,oCAAA,iCAAiC,CAAC,UAAU,mBAAmB,CAAC;GAE5E,IAAI,IAAI,SAAS,aAAa;GAC9B,MAAM,WAAW,MAAM,YAAY;GACnC,MAAM,OAAO,iBAAiB;IAC5B,iBAAiB;IACjB,QAAQ;KACN;MAAE,MAAM;MAAM,WAAW,SAAS;MAAS,gBAAgB;MAAM,YAAY;KAAI;KACjF;MAAE,MAAM;MAAU,WAAW,SAAS;MAAa;KAAI;KACvD;MAAE,MAAM;MAAY,WAAW,SAAS;MAAS,YAAY;KAAM;KACnE;MAAE,MAAM;MAAY,WAAW,SAAS;KAAK;IAC/C;GACF,CAAC;GACD,MAAM,YAAY;GAClB,MAAM,aAAa,kBAAkB,MAAM;GAC3C,MAAM,OAAO,YAAY;IACvB,iBAAiB;IACjB,YAAY;IACZ,YAAY;IACZ,aAAa;GACf,CAAC;GACD,MAAM,OAAO,mBAAmB,EAAE,iBAAiB,eAAe,CAAC;GACnE,KAAKC,MAAM,IAAI,gBAAgB,GAAG;EACpC,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CACA,MAAM,eAAe,YAAoB,UAAkC;EACzE,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI,YAAY,CAAE,MAAM,KAAK,cAAc,UAAU,GAAI;EACzD,IAAI;GAEF,IAAI,EAAC,MADa,OAAO,cAAc,EAAE,iBAAiB,WAAW,CAAC,GAC7D,SAAS,CAAC,UACjB,MAAM,IAAI,oCAAA,iCAAiC,CAAC,QAAQ,2BAA2B,CAAC;GAElF,MAAM,OAAO,eAAe,EAAE,iBAAiB,WAAW,CAAC;GAC3D,KAAKC,MAAM,OAAO,UAAU;EAC9B,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC;EAC5E;CACF;CACA,MAAM,cAAc,YAAsC;EACxD,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GAEF,OAAO,CAAC,EAAC,MADO,OAAO,cAAc,EAAE,iBAAiB,WAAW,CAAC,GACzD;EACb,QAAQ;GACN,OAAO;EACT;CACF;CACA,MAAM,iBAAiB,MAAc,IAA2B;EAC9D,MAAM,SAAS,KAAKA,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,MAAM,OAAO,iBAAiB;IAAE,qBAAqB;IAAM,qBAAqB;GAAG,CAAC;GACpF,IAAI,KAAKC,MAAM,IAAI,IAAI,GAAG;IACxB,KAAKA,MAAM,IAAI,IAAI,KAAKA,MAAM,IAAI,IAAI,CAAE;IACxC,KAAKA,MAAM,OAAO,IAAI;GACxB;EACF,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,iCAAiC,CAAC,oBAAoB,OAAO,GAAG,CAAC,CAAC;EAC9E;CACF;CACA,MAAM,cAAc,MAAiC;EACnD,IAAI,KAAK,QAAQ,WAAW,GAAG;EAC/B,oCAAA,gBAAgB,KAAK,OAAO;EAC5B,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,iBAAiB,KAAK;EAC5B,MAAM,MAAM,KAAKC,MAAM,IAAI,cAAc;EACzC,MAAM,OAAc,CAAC;EACrB,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,IAAI,SAAS,EAAE;GACf,IAAI,CAAC,UAAU,EAAE,UAAU;IACzB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU;IACtD,SAAS;GACX;GACA,IAAI,CAAC,QACH,MAAM,IAAI,oCAAA,6BAA6B,CAAC,oCAAoC,CAAC;GAE/E,IAAI,QAAQ,KAAA,KAAa,OAAO,WAAW,KACzC,MAAM,IAAI,oCAAA,kCAAkC,CAAC,KAAK,OAAO,MAAM,CAAC;GAElE,KAAK,KAAK;IACR,IAAI,EAAE;IACN;IACA,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY,CAAC;GAC3B,CAAC;EACH;EACA,IAAI;GACF,MAAM,OAAO,OAAO;IAAE,iBAAiB;IAAgB,MAAM;GAAK,CAAC;GACnE,MAAM,OAAO,UAAU,EAAE,kBAAkB,CAAC,cAAc,EAAE,CAAC;EAC/D,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;CACA,MAAM,cAAc,MAA0C;EAC5D,MAAM,SAAS,KAAKD,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,MAAM,SAAS,KAAKD,MAAM,UAAU;EACpC,IAAI;EACJ,IAAI,KAAK;OACH,YAAY,KAAK,MACnB,cAAc,KAAK,KAAK;QACnB,IAAI,gBAAgB,KAAK,MAAM;IACpC,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG,OAAO;IAC7D,cAAc;GAChB,OAAO,IAAI,QAAQ,KAAK,MAAM;IAC5B,MAAM,MAAM,MAAM,OAAO,MAAM;KAC7B,iBAAiB,KAAK;KACtB,QAAQ,UAAU,KAAK,KAAK,GAAG;KAC/B,eAAe,CAAC,QAAQ;IAC1B,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,GACtB,MAAM,IAAI,oCAAA,6BAA6B,CAAC,8BAA8B,KAAK,KAAK,EAAE,CAAC;IAErF,cAAc,IAAI,KAAK,GAAG;GAC5B;;EAEF,MAAM,eAAe;GAAC;GAAM;GAAY;EAAU;EAClD,IAAI,KAAK,WAAW,QAClB,aAAa,KAAK,QAAQ;EAE5B,MAAM,eAAe,sBAAsB,KAAK,MAAM;EACtD,IAAI;EACJ,IAAI,aACF,UAAU,MAAM,OAAO,OAAO;GAC5B,iBAAiB,KAAK;GACtB,MAAM,CAAC,WAAW;GAClB,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,QAAQ;GACR,eAAe;GACf,mBAAmB;EACrB,CAAC;OAED,UAAU,MAAM,OAAO,MAAM;GAC3B,iBAAiB,KAAK;GACtB,QAAQ,gBAAgB;GACxB,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,eAAe;GACf,mBAAmB;EACrB,CAAC;EAEH,MAAM,UAAU,QAAQ,WAAW,QAAQ,QAAQ,CAAC;EACpD,MAAM,OAAO,KAAK;EAClB,OAAO,QAAQ,KAAK,QAAa,KAAK,WAAW,KAAK,MAAM,MAAM,CAAC;CACrE;CACA,MAAM,cAAc,MAAiC;EACnD,MAAM,SAAS,KAAKC,YAAY,MAAM,KAAK,QAAQ,GAAG,KAAKA;EAC3D,IAAI;GACF,MAAM,iBAAiB,KAAK;GAC5B,IAAI,KAAK,KAAK;IACZ,MAAM,SAAS,UAAU,KAAK,IAAI,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE;IAC1E,MAAM,OAAO,OAAO;KAAE,iBAAiB;KAAgB;IAAO,CAAC;GACjE,OAAO,IAAI,KAAK,QAAQ;IACtB,MAAM,SAAS,sBAAsB,KAAK,MAAM;IAChD,MAAM,OAAO,OAAO;KAAE,iBAAiB;KAAgB;IAAO,CAAC;GACjE,OACE,MAAM,OAAO,OAAO;IAAE,iBAAiB;IAAgB,QAAQ;GAAW,CAAC;EAE/E,SAAS,KAAK;GACZ,MAAM,IAAI,oCAAA,6BAA6B,CAAC,OAAO,GAAG,CAAC,CAAC;EACtD;CACF;;CAEA,WAAW,KAAU,YAAiB,QAA6B;EACjE,MAAM,MAAmB,CAAC;EAC1B,IAAI,WAAW,IACb,IAAI,KAAK,IAAI;EAEf,IAAI,WAAW,UAAU,YAAY,KACnC,IAAI,SAAS,IAAI;EAEnB,IAAI,WAAW,UACb,IAAI,WAAW,IAAI;EAErB,IAAI,WAAW,UACb,IAAI,WAAW,IAAI;EAErB,IAAI,WAAW,OAAO,IAAI,UAAU,KAAA,GAAW;GAC7C,MAAM,OAAO,WAAW,cAAc,aAAa;GACnD,IAAI,QAAQ,iCAAA,eAAe,IAAI,OAAiB,QAAe,IAAI;EACrE;EACA,OAAO;CACT;;CAEA,sBAAsB,QAA+B;EACnD,OAAO,sBAAsB,MAAM;CACrC;AACF;;AAGA,IAAa,yBAAyB,WAAkC;CACtE,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,iCAAA,YAAY,MAAM,GAAG;EACvB,IAAI,OAAO,aAAa,YAAY,OAAO,OAAO,SAAS,UACzD,OAAO,OAAO;EAEhB,MAAM,IAAI,oCAAA,2CAA2C,CAAC,UAAU,OAAO,OAAO,QAAQ,CAAC,CAAC;CAC1F;CACA,IAAI,iCAAA,kBAAkB,MAAM,GAAG;EAC7B,MAAM,EAAE,OAAO,IAAI,UAAU;EAC7B,MAAM,YAAY,aAAa,MAAM;EACrC,IAAI,UAAU,KAAA,GAAW;GACvB,IAAI,OAAO,UACT,OAAO,UAAU;GAEnB,MAAM,IAAI,oCAAA,2CAA2C,CAAC,UAAU,EAAE,CAAC;EACrE;EACA,MAAM,eAAe,MAAuB;GAC1C,IAAI,OAAO,MAAM,UAAU,OAAO,KAAK,UAAU,CAAC;GAClD,IAAI,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,OAAO,OAAO,CAAC;GACpE,IAAI,MAAM,QAAQ,CAAC,GACjB,OAAO,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,GAAG,EAAE;GAE1C,OAAO,KAAK,UAAU,CAAC;EACzB;EACA,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC5D,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC5D,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,KAAK,YAAY,KAAK;EAC3D,IAAI,OAAO,OAAO,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC7D,IAAI,OAAO,MAAM,OAAO,GAAG,UAAU,KAAK,YAAY,KAAK;EAC3D,IAAI,OAAO,OAAO,OAAO,GAAG,UAAU,MAAM,YAAY,KAAK;EAC7D,IAAI,OAAO,MAAM;GACf,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;GAClC,OAAO,GAAG,UAAU,OAAO,MAAM,IAAI,WAAW,EAAE,KAAK,GAAG,EAAE;EAC9D;EACA,IAAI,OAAO,OAAO;GAChB,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;GAClC,OAAO,GAAG,UAAU,WAAW,MAAM,IAAI,WAAW,EAAE,KAAK,GAAG,EAAE;EAClE;EACA,IAAI,OAAO,UACT,OAAO,UAAU;EAEnB,IAAI,OAAO,YACT,OAAO,iBAAiB,UAAU,IAAI,YAAY,KAAK,EAAE;EAE3D,MAAM,IAAI,oCAAA,2CAA2C,CAAC,UAAU,EAAE,CAAC;CACrE;CACA,IAAI,iCAAA,cAAc,MAAM,GAAG;EACzB,MAAM,EAAE,KAAK,IAAI,QAAQ;EACzB,MAAM,QAAkB,CAAC;EACzB,IAAI,KAAK;GACP,MAAM,WAAW,IAAI,KAAK,MAAM,sBAAsB,CAAC,CAAC,EAAE,QAAQ,MAAM,MAAM,EAAE;GAChF,IAAI,SAAS,WAAW,GAAG,OAAO;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,MAAM,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE,EAAE;EACzC;EACA,IAAI,IAAI;GACN,MAAM,WAAW,GAAG,KAAK,MAAM,sBAAsB,CAAC,CAAC,EAAE,QAAQ,MAAM,MAAM,EAAE;GAC/E,IAAI,SAAS,WAAW,GAAG,OAAO;GAClC,IAAI,SAAS,WAAW,GAAG,OAAO,SAAS;GAC3C,MAAM,KAAK,IAAI,SAAS,KAAK,MAAM,EAAE,EAAE;EACzC;EACA,IAAI,KAAK;GACP,MAAM,QAAQ,sBAAsB,GAAG;GACvC,IAAI,UAAU,IAAI,OAAO;GACzB,MAAM,KAAK,KAAK,MAAM,EAAE;EAC1B;EACA,IAAI,MAAM,WAAW,GAAG,OAAO;EAC/B,IAAI,MAAM,WAAW,GAAG,OAAO,MAAM;EACrC,OAAO,MAAM,KAAK,MAAM;CAC1B;CACA,OAAO;AACT"}
|
|
@@ -45,6 +45,7 @@ var MilvusVectorStore = class extends BaseVectorStore {
|
|
|
45
45
|
get #opts() {
|
|
46
46
|
return this.options;
|
|
47
47
|
}
|
|
48
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
48
49
|
static isAvailable() {
|
|
49
50
|
return typeof process !== "undefined";
|
|
50
51
|
}
|
|
@@ -269,6 +270,7 @@ var MilvusVectorStore = class extends BaseVectorStore {
|
|
|
269
270
|
throw new E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
270
271
|
}
|
|
271
272
|
}
|
|
273
|
+
/** Project a raw Milvus hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
|
|
272
274
|
projectHit(hit, projection, metric) {
|
|
273
275
|
const out = {};
|
|
274
276
|
if (projection.id) out.id = hit.id;
|
|
@@ -281,10 +283,12 @@ var MilvusVectorStore = class extends BaseVectorStore {
|
|
|
281
283
|
}
|
|
282
284
|
return out;
|
|
283
285
|
}
|
|
286
|
+
/** Instance wrapper over the module-level {@link translateMilvusFilter}. */
|
|
284
287
|
translateMilvusFilter(filter) {
|
|
285
288
|
return translateMilvusFilter(filter);
|
|
286
289
|
}
|
|
287
290
|
};
|
|
291
|
+
/** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */
|
|
288
292
|
var translateMilvusFilter = (filter) => {
|
|
289
293
|
if (!filter) return "";
|
|
290
294
|
if (isRawFilter(filter)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"milvus.mjs","names":["#opts","#client","#dims"],"sources":["../../../src/batteries/vector/milvus/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/milvus\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_CONNECTION_FAILED,\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 interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {\n connection?: {\n address?: string\n url?: string\n token?: string\n username?: string\n password?: string\n ssl?: boolean\n }\n}\n\nconst getMilvusClient = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.MilvusClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst getDataType = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.DataType\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst mapMetricToMilvus = (metric: string): string => {\n if (metric === 'cosine') return 'COSINE'\n if (metric === 'dot') return 'IP'\n if (metric === 'euclidean') return 'L2'\n return 'COSINE'\n}\n\nexport class MilvusVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (search/query use consistency_level 'Strong'); the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n get #opts() {\n return this.options as MilvusVectorStoreOptions\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 MilvusClient = await getMilvusClient()\n const c = this.#opts.connection || {}\n let address = c.address\n if (!address && c.url) {\n try {\n const url = new URL(c.url)\n const host = url.hostname\n const port = url.port || (url.protocol === 'https:' ? '443' : '19530')\n address = `${host}:${port}`\n } catch {\n throw new E_VECTOR_STORE_CONNECTION_FAILED(['Invalid connection URL'])\n }\n }\n if (!address) {\n address = 'localhost:19530'\n }\n try {\n this.#client = new MilvusClient({\n address,\n token: c.token,\n username: c.username,\n password: c.password,\n ssl: c.ssl,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.closeConnection?.()\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 collectionName = spec.collection\n const metric = spec.vector.metric ?? 'cosine'\n const dim = spec.vector.dimensions\n if (ifNotExists && (await this.hasCollection(collectionName))) return\n try {\n const has = await client.hasCollection({ collection_name: collectionName })\n if (has.value && !ifNotExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n if (has.value && ifNotExists) return\n const DataType = await getDataType()\n await client.createCollection({\n collection_name: collectionName,\n fields: [\n { name: 'id', data_type: DataType.VarChar, is_primary_key: true, max_length: 512 },\n { name: 'vector', data_type: DataType.FloatVector, dim },\n { name: 'document', data_type: DataType.VarChar, max_length: 65535 },\n { name: 'metadata', data_type: DataType.JSON },\n ],\n })\n const indexType = 'AUTOINDEX'\n const metricType = mapMetricToMilvus(metric)\n await client.createIndex({\n collection_name: collectionName,\n field_name: 'vector',\n index_type: indexType,\n metric_type: metricType,\n })\n await client.loadCollectionSync({ collection_name: collectionName })\n this.#dims.set(collectionName, dim)\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 const has = await client.hasCollection({ collection_name: collection })\n if (!has.value && !ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n await client.dropCollection({ collection_name: collection })\n this.#dims.delete(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 const r = await client.hasCollection({ collection_name: collection })\n return !!r.value\n } catch {\n return false\n }\n }\n async renameCollection(from: string, to: string): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.renameCollection({ old_collection_name: from, new_collection_name: to })\n if (this.#dims.has(from)) {\n this.#dims.set(to, this.#dims.get(from)!)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['renameCollection', String(err)])\n }\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 collectionName = plan.collection\n const dim = this.#dims.get(collectionName)\n const rows: 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 (dim !== undefined && vector.length !== dim) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dim, vector.length])\n }\n rows.push({\n id: r.id,\n vector,\n document: r.document ?? '',\n metadata: r.metadata ?? {},\n })\n }\n try {\n await client.upsert({ collection_name: collectionName, data: rows })\n await client.flushSync({ collection_names: [collectionName] })\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.query({\n collection_name: plan.collection,\n filter: `id == \"${plan.near.id}\"`,\n output_fields: ['vector'],\n })\n if (res.data.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.data[0].vector as number[]\n }\n }\n const outputFields = ['id', 'document', 'metadata']\n if (plan.projection.vector) {\n outputFields.push('vector')\n }\n const milvusFilter = translateMilvusFilter(plan.filter)\n let results: any\n if (queryVector) {\n results = await client.search({\n collection_name: plan.collection,\n data: [queryVector],\n limit: plan.topK,\n offset: plan.offset,\n filter: milvusFilter,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n } else {\n results = await client.query({\n collection_name: plan.collection,\n filter: milvusFilter || '',\n limit: plan.topK,\n offset: plan.offset,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n }\n const hitList = results.results || results.data || []\n const proj = plan.projection\n return hitList.map((hit: any) => 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 const collectionName = plan.collection\n if (plan.ids) {\n const filter = `id in [${plan.ids.map((i) => JSON.stringify(i)).join(',')}]`\n await client.delete({ collection_name: collectionName, filter })\n } else if (plan.filter) {\n const filter = translateMilvusFilter(plan.filter)\n await client.delete({ collection_name: collectionName, filter })\n } else {\n await client.delete({ collection_name: collectionName, filter: 'id != \"\"' })\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 if (projection.id) {\n out.id = hit.id\n }\n if (projection.vector && 'vector' in hit) {\n out.vector = hit.vector\n }\n if (projection.document) {\n out.document = hit.document\n }\n if (projection.metadata) {\n out.metadata = hit.metadata\n }\n if ('score' in hit && hit.score !== undefined) {\n const kind = metric === 'euclidean' ? 'distance' : 'similarity'\n out.score = normalizeScore(hit.score as number, metric as any, kind)\n }\n return out\n }\n translateMilvusFilter(filter?: VectorFilter): string {\n return translateMilvusFilter(filter)\n }\n}\n\nexport const translateMilvusFilter = (filter?: VectorFilter): string => {\n if (!filter) return ''\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'milvus' && typeof filter.$raw === 'string') {\n return filter.$raw\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const jsonField = `metadata[\"${field}\"]`\n if (value === undefined) {\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n const toJsonValue = (v: unknown): string => {\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n return `[${v.map(toJsonValue).join(',')}]`\n }\n return JSON.stringify(v)\n }\n if (op === 'eq') return `${jsonField} == ${toJsonValue(value)}`\n if (op === 'ne') return `${jsonField} != ${toJsonValue(value)}`\n if (op === 'gt') return `${jsonField} > ${toJsonValue(value)}`\n if (op === 'gte') return `${jsonField} >= ${toJsonValue(value)}`\n if (op === 'lt') return `${jsonField} < ${toJsonValue(value)}`\n if (op === 'lte') return `${jsonField} <= ${toJsonValue(value)}`\n if (op === 'in') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'nin') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} not in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n if (op === 'contains') {\n return `json_contains(${jsonField}, ${toJsonValue(value)})`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n const parts: string[] = []\n if (and) {\n const children = and.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' && ')})`)\n }\n if (or) {\n const children = or.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' || ')})`)\n }\n if (not) {\n const child = translateMilvusFilter(not)\n if (child === '') return ''\n parts.push(`!(${child})`)\n }\n if (parts.length === 0) return ''\n if (parts.length === 1) return parts[0]\n return parts.join(' && ')\n }\n return ''\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"milvus.mjs","names":["#opts","#client","#dims"],"sources":["../../../src/batteries/vector/milvus/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/milvus\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_CONNECTION_FAILED,\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 interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection?: {\n address?: string\n url?: string\n token?: string\n username?: string\n password?: string\n ssl?: boolean\n }\n}\n\nconst getMilvusClient = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.MilvusClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst getDataType = async () => {\n try {\n const mod = await import('@zilliz/milvus2-sdk-node')\n return mod.DataType\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@zilliz/milvus2-sdk-node'])\n }\n}\n\nconst mapMetricToMilvus = (metric: string): string => {\n if (metric === 'cosine') return 'COSINE'\n if (metric === 'dot') return 'IP'\n if (metric === 'euclidean') return 'L2'\n return 'COSINE'\n}\n\nexport class MilvusVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent (search/query use consistency_level 'Strong'); the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #client: any | null = null\n #dims: Map<string, number> = new Map()\n get #opts() {\n return this.options as MilvusVectorStoreOptions\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 MilvusClient = await getMilvusClient()\n const c = this.#opts.connection || {}\n let address = c.address\n if (!address && c.url) {\n try {\n const url = new URL(c.url)\n const host = url.hostname\n const port = url.port || (url.protocol === 'https:' ? '443' : '19530')\n address = `${host}:${port}`\n } catch {\n throw new E_VECTOR_STORE_CONNECTION_FAILED(['Invalid connection URL'])\n }\n }\n if (!address) {\n address = 'localhost:19530'\n }\n try {\n this.#client = new MilvusClient({\n address,\n token: c.token,\n username: c.username,\n password: c.password,\n ssl: c.ssl,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.closeConnection?.()\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 collectionName = spec.collection\n const metric = spec.vector.metric ?? 'cosine'\n const dim = spec.vector.dimensions\n if (ifNotExists && (await this.hasCollection(collectionName))) return\n try {\n const has = await client.hasCollection({ collection_name: collectionName })\n if (has.value && !ifNotExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n if (has.value && ifNotExists) return\n const DataType = await getDataType()\n await client.createCollection({\n collection_name: collectionName,\n fields: [\n { name: 'id', data_type: DataType.VarChar, is_primary_key: true, max_length: 512 },\n { name: 'vector', data_type: DataType.FloatVector, dim },\n { name: 'document', data_type: DataType.VarChar, max_length: 65535 },\n { name: 'metadata', data_type: DataType.JSON },\n ],\n })\n const indexType = 'AUTOINDEX'\n const metricType = mapMetricToMilvus(metric)\n await client.createIndex({\n collection_name: collectionName,\n field_name: 'vector',\n index_type: indexType,\n metric_type: metricType,\n })\n await client.loadCollectionSync({ collection_name: collectionName })\n this.#dims.set(collectionName, dim)\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 const has = await client.hasCollection({ collection_name: collection })\n if (!has.value && !ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n await client.dropCollection({ collection_name: collection })\n this.#dims.delete(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 const r = await client.hasCollection({ collection_name: collection })\n return !!r.value\n } catch {\n return false\n }\n }\n async renameCollection(from: string, to: string): Promise<void> {\n const client = this.#client || (await this.connect(), this.#client!)\n try {\n await client.renameCollection({ old_collection_name: from, new_collection_name: to })\n if (this.#dims.has(from)) {\n this.#dims.set(to, this.#dims.get(from)!)\n this.#dims.delete(from)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['renameCollection', String(err)])\n }\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 collectionName = plan.collection\n const dim = this.#dims.get(collectionName)\n const rows: 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 (dim !== undefined && vector.length !== dim) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dim, vector.length])\n }\n rows.push({\n id: r.id,\n vector,\n document: r.document ?? '',\n metadata: r.metadata ?? {},\n })\n }\n try {\n await client.upsert({ collection_name: collectionName, data: rows })\n await client.flushSync({ collection_names: [collectionName] })\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.query({\n collection_name: plan.collection,\n filter: `id == \"${plan.near.id}\"`,\n output_fields: ['vector'],\n })\n if (res.data.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = res.data[0].vector as number[]\n }\n }\n const outputFields = ['id', 'document', 'metadata']\n if (plan.projection.vector) {\n outputFields.push('vector')\n }\n const milvusFilter = translateMilvusFilter(plan.filter)\n let results: any\n if (queryVector) {\n results = await client.search({\n collection_name: plan.collection,\n data: [queryVector],\n limit: plan.topK,\n offset: plan.offset,\n filter: milvusFilter,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n } else {\n results = await client.query({\n collection_name: plan.collection,\n filter: milvusFilter || '',\n limit: plan.topK,\n offset: plan.offset,\n output_fields: outputFields,\n consistency_level: 'Strong',\n })\n }\n const hitList = results.results || results.data || []\n const proj = plan.projection\n return hitList.map((hit: any) => 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 const collectionName = plan.collection\n if (plan.ids) {\n const filter = `id in [${plan.ids.map((i) => JSON.stringify(i)).join(',')}]`\n await client.delete({ collection_name: collectionName, filter })\n } else if (plan.filter) {\n const filter = translateMilvusFilter(plan.filter)\n await client.delete({ collection_name: collectionName, filter })\n } else {\n await client.delete({ collection_name: collectionName, filter: 'id != \"\"' })\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n /** Project a raw Milvus 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 if (projection.id) {\n out.id = hit.id\n }\n if (projection.vector && 'vector' in hit) {\n out.vector = hit.vector\n }\n if (projection.document) {\n out.document = hit.document\n }\n if (projection.metadata) {\n out.metadata = hit.metadata\n }\n if ('score' in hit && hit.score !== undefined) {\n const kind = metric === 'euclidean' ? 'distance' : 'similarity'\n out.score = normalizeScore(hit.score as number, metric as any, kind)\n }\n return out\n }\n /** Instance wrapper over the module-level {@link translateMilvusFilter}. */\n translateMilvusFilter(filter?: VectorFilter): string {\n return translateMilvusFilter(filter)\n }\n}\n\n/** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */\nexport const translateMilvusFilter = (filter?: VectorFilter): string => {\n if (!filter) return ''\n if (isRawFilter(filter)) {\n if (filter.$dialect === 'milvus' && typeof filter.$raw === 'string') {\n return filter.$raw\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', String(filter.$dialect)])\n }\n if (isFilterCondition(filter)) {\n const { field, op, value } = filter\n const jsonField = `metadata[\"${field}\"]`\n if (value === undefined) {\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n const toJsonValue = (v: unknown): string => {\n if (typeof v === 'string') return JSON.stringify(v)\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n if (Array.isArray(v)) {\n return `[${v.map(toJsonValue).join(',')}]`\n }\n return JSON.stringify(v)\n }\n if (op === 'eq') return `${jsonField} == ${toJsonValue(value)}`\n if (op === 'ne') return `${jsonField} != ${toJsonValue(value)}`\n if (op === 'gt') return `${jsonField} > ${toJsonValue(value)}`\n if (op === 'gte') return `${jsonField} >= ${toJsonValue(value)}`\n if (op === 'lt') return `${jsonField} < ${toJsonValue(value)}`\n if (op === 'lte') return `${jsonField} <= ${toJsonValue(value)}`\n if (op === 'in') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'nin') {\n if (!Array.isArray(value)) return ''\n return `${jsonField} not in [${value.map(toJsonValue).join(',')}]`\n }\n if (op === 'exists') {\n return `exists ${jsonField}`\n }\n if (op === 'contains') {\n return `json_contains(${jsonField}, ${toJsonValue(value)})`\n }\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['milvus', op])\n }\n if (isFilterGroup(filter)) {\n const { and, or, not } = filter\n const parts: string[] = []\n if (and) {\n const children = and.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' && ')})`)\n }\n if (or) {\n const children = or.map((f) => translateMilvusFilter(f)).filter((c) => c !== '')\n if (children.length === 0) return ''\n if (children.length === 1) return children[0]\n parts.push(`(${children.join(' || ')})`)\n }\n if (not) {\n const child = translateMilvusFilter(not)\n if (child === '') return ''\n parts.push(`!(${child})`)\n }\n if (parts.length === 0) return ''\n if (parts.length === 1) return parts[0]\n return parts.join(' && ')\n }\n return ''\n}\n"],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import { BaseVectorStore } from "../contract";
|
|
|
17
17
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
18
18
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
19
19
|
export interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
20
|
+
/** Connection and authentication parameters for the backend. */
|
|
20
21
|
connection: {
|
|
21
22
|
url: string;
|
|
22
23
|
database?: string;
|
|
@@ -32,6 +33,7 @@ export interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
32
33
|
export declare class MongoDBVectorStore extends BaseVectorStore {
|
|
33
34
|
#private;
|
|
34
35
|
readonly capabilities: VectorStoreCapabilities;
|
|
36
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
35
37
|
static isAvailable(): boolean;
|
|
36
38
|
isAvailable(): boolean;
|
|
37
39
|
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_exceptions = require("./exceptions.cjs");
|
|
@@ -50,6 +50,7 @@ var MongoDBVectorStore = class extends require_batteries_vector_contract.BaseVec
|
|
|
50
50
|
get #opts() {
|
|
51
51
|
return this.options;
|
|
52
52
|
}
|
|
53
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
53
54
|
static isAvailable() {
|
|
54
55
|
return typeof process !== "undefined";
|
|
55
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb.cjs","names":["#opts","#client","#db","#col","#name","#sleep","#dims","#settlePresent","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mongodb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mongodb\n *\n * MongoDB Atlas Vector Search adapter. Each collection is a MongoDB collection with an Atlas\n * `vectorSearch` index on `vec`; KNN uses the `$vectorSearch` aggregation stage (cosine\n * `vectorSearchScore`, [0,1]). Metadata is a JSON string field filtered with the neutral filter\n * tree's JS reference evaluator for cross-adapter parity.\n *\n * Consistency note: the *document* collection is strongly consistent, but the Atlas vector\n * *index* updates asynchronously after a write (~1s). So filter-scans, fetch-by-id and the\n * delete read-back use a plain `find()` (immediate), and only KNN goes through `$vectorSearch` —\n * after which the adapter polls until the just-inserted ids are index-visible (strong mode).\n *\n * Driver: `mongodb`. Works against `mongodb/mongodb-atlas-local` or a real Atlas cluster.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst INDEX = 'vec_idx'\n\nexport interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n url: string\n database?: string\n /**\n * When set, the physical MongoDB collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the Atlas vectorSearch\n * index builds asynchronously, so a fresh collection per use avoids drop+rebuild churn.\n */\n collectionPrefix?: string\n }\n}\n\nconst getMongo = async () => {\n try {\n const mod = await import('mongodb')\n return mod.MongoClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mongodb'])\n }\n}\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dotProduct' : 'cosine'\n\nexport class MongoDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // The document store is strongly consistent; KNN settles on the async index after writes.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MongoDBVectorStoreOptions {\n return this.options as MongoDBVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const MongoClient = await getMongo()\n const c = this.#opts.connection\n try {\n this.#client = new MongoClient(c.url)\n await this.#client.connect()\n this.#db = this.#client.db(c.database ?? 'vector')\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n this.#db = null\n }\n }\n\n // Map a logical collection name to its physical MongoDB collection (optional prefix).\n #name(collection: string): string {\n const prefix = this.#opts.connection?.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n async #col(collection: string): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db.collection(this.#name(collection))\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const physical = this.#name(spec.collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length > 0) {\n if (ifNotExists) {\n // Clear any residual documents so each store starts empty.\n await this.#db.collection(physical).deleteMany({})\n return\n }\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n }\n await this.#db.createCollection(physical).catch(() => undefined)\n const col = this.#db.collection(physical)\n // Create the Atlas vectorSearch index if absent, then wait until it's queryable.\n const existing = await col\n .listSearchIndexes()\n .toArray()\n .catch(() => [])\n if (!existing.find((i: any) => i.name === INDEX)) {\n await col.createSearchIndex({\n name: INDEX,\n type: 'vectorSearch',\n definition: {\n fields: [\n {\n type: 'vector',\n path: 'vec',\n numDimensions: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n },\n ],\n },\n })\n }\n for (let i = 0; i < 60; i++) {\n const list = await col.listSearchIndexes().toArray()\n const idx = list.find((x: any) => x.name === INDEX)\n if (idx?.queryable) break\n await this.#sleep(1000)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n const physical = this.#name(collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length === 0) {\n if (ifExists) return\n throw new Error('collection not found: ' + collection)\n }\n // Clear documents (fast/immediate) and drop the collection; the search index goes with it.\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n if (!this.#db) await this.connect()\n const names = await this.#db.listCollections({ name: this.#name(collection) }).toArray()\n return names.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'mongodb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const col = await this.#col(plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const ids: string[] = []\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await col.updateOne(\n { id: r.id },\n {\n $set: {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n },\n },\n { upsert: true }\n )\n ids.push(r.id)\n }\n // Settle: wait until the just-written ids are visible to $vectorSearch (the index is async).\n await this.#settlePresent(col, ids, expected ?? this.#dims.get(plan.collection) ?? 0)\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n // Poll $vectorSearch until every id in `ids` appears (bounded). Best-effort: returns on timeout.\n async #settlePresent(col: any, ids: string[], dims: number): Promise<void> {\n if (ids.length === 0 || dims <= 0) return\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen: Set<string>\n try {\n const res = await col\n .aggregate([\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector: probe,\n numCandidates: Math.max(ids.length * 10, 50),\n limit: Math.max(ids.length * 5, 50),\n },\n },\n { $project: { id: 1 } },\n ])\n .toArray()\n seen = new Set(res.map((d: any) => d.id))\n } catch {\n seen = new Set()\n }\n if (ids.every((id) => seen.has(id))) return\n await this.#sleep(300)\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const col = await this.#col(plan.collection)\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 // Plain find() — strongly consistent, no index lag.\n const doc = await col.findOne({ id: plan.near.id })\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const pipeline: any[] = [\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector,\n numCandidates: Math.max(k * 10, 100),\n limit: k,\n },\n },\n {\n $project: {\n id: 1,\n vec: 1,\n document: 1,\n metadata: 1,\n score: { $meta: 'vectorSearchScore' },\n },\n },\n ]\n const docs = await col.aggregate(pipeline).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: plain find() (strongly consistent, no $vectorSearch index lag).\n const docs = await col.find({}).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (isKnn && typeof doc.score === 'number') {\n // Atlas vectorSearchScore for cosine is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const col = await this.#col(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await col.deleteMany({ id: { $in: plan.ids } })\n } else if (plan.filter) {\n // Plain find() to resolve target ids (immediate), then delete by id.\n const docs = await col.find({}).toArray()\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) await col.deleteMany({ id: { $in: targets } })\n } else {\n await col.deleteMany({})\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongodb.cjs","names":["#opts","#client","#db","#col","#name","#sleep","#dims","#settlePresent","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mongodb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mongodb\n *\n * MongoDB Atlas Vector Search adapter. Each collection is a MongoDB collection with an Atlas\n * `vectorSearch` index on `vec`; KNN uses the `$vectorSearch` aggregation stage (cosine\n * `vectorSearchScore`, [0,1]). Metadata is a JSON string field filtered with the neutral filter\n * tree's JS reference evaluator for cross-adapter parity.\n *\n * Consistency note: the *document* collection is strongly consistent, but the Atlas vector\n * *index* updates asynchronously after a write (~1s). So filter-scans, fetch-by-id and the\n * delete read-back use a plain `find()` (immediate), and only KNN goes through `$vectorSearch` —\n * after which the adapter polls until the just-inserted ids are index-visible (strong mode).\n *\n * Driver: `mongodb`. Works against `mongodb/mongodb-atlas-local` or a real Atlas cluster.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst INDEX = 'vec_idx'\n\nexport interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: {\n url: string\n database?: string\n /**\n * When set, the physical MongoDB collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the Atlas vectorSearch\n * index builds asynchronously, so a fresh collection per use avoids drop+rebuild churn.\n */\n collectionPrefix?: string\n }\n}\n\nconst getMongo = async () => {\n try {\n const mod = await import('mongodb')\n return mod.MongoClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mongodb'])\n }\n}\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dotProduct' : 'cosine'\n\nexport class MongoDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // The document store is strongly consistent; KNN settles on the async index after writes.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MongoDBVectorStoreOptions {\n return this.options as MongoDBVectorStoreOptions\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\n async connect(): Promise<void> {\n if (this.#client) return\n const MongoClient = await getMongo()\n const c = this.#opts.connection\n try {\n this.#client = new MongoClient(c.url)\n await this.#client.connect()\n this.#db = this.#client.db(c.database ?? 'vector')\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n this.#db = null\n }\n }\n\n // Map a logical collection name to its physical MongoDB collection (optional prefix).\n #name(collection: string): string {\n const prefix = this.#opts.connection?.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n async #col(collection: string): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db.collection(this.#name(collection))\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const physical = this.#name(spec.collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length > 0) {\n if (ifNotExists) {\n // Clear any residual documents so each store starts empty.\n await this.#db.collection(physical).deleteMany({})\n return\n }\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n }\n await this.#db.createCollection(physical).catch(() => undefined)\n const col = this.#db.collection(physical)\n // Create the Atlas vectorSearch index if absent, then wait until it's queryable.\n const existing = await col\n .listSearchIndexes()\n .toArray()\n .catch(() => [])\n if (!existing.find((i: any) => i.name === INDEX)) {\n await col.createSearchIndex({\n name: INDEX,\n type: 'vectorSearch',\n definition: {\n fields: [\n {\n type: 'vector',\n path: 'vec',\n numDimensions: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n },\n ],\n },\n })\n }\n for (let i = 0; i < 60; i++) {\n const list = await col.listSearchIndexes().toArray()\n const idx = list.find((x: any) => x.name === INDEX)\n if (idx?.queryable) break\n await this.#sleep(1000)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n const physical = this.#name(collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length === 0) {\n if (ifExists) return\n throw new Error('collection not found: ' + collection)\n }\n // Clear documents (fast/immediate) and drop the collection; the search index goes with it.\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n if (!this.#db) await this.connect()\n const names = await this.#db.listCollections({ name: this.#name(collection) }).toArray()\n return names.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'mongodb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const col = await this.#col(plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const ids: string[] = []\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await col.updateOne(\n { id: r.id },\n {\n $set: {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n },\n },\n { upsert: true }\n )\n ids.push(r.id)\n }\n // Settle: wait until the just-written ids are visible to $vectorSearch (the index is async).\n await this.#settlePresent(col, ids, expected ?? this.#dims.get(plan.collection) ?? 0)\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n // Poll $vectorSearch until every id in `ids` appears (bounded). Best-effort: returns on timeout.\n async #settlePresent(col: any, ids: string[], dims: number): Promise<void> {\n if (ids.length === 0 || dims <= 0) return\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen: Set<string>\n try {\n const res = await col\n .aggregate([\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector: probe,\n numCandidates: Math.max(ids.length * 10, 50),\n limit: Math.max(ids.length * 5, 50),\n },\n },\n { $project: { id: 1 } },\n ])\n .toArray()\n seen = new Set(res.map((d: any) => d.id))\n } catch {\n seen = new Set()\n }\n if (ids.every((id) => seen.has(id))) return\n await this.#sleep(300)\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const col = await this.#col(plan.collection)\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 // Plain find() — strongly consistent, no index lag.\n const doc = await col.findOne({ id: plan.near.id })\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const pipeline: any[] = [\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector,\n numCandidates: Math.max(k * 10, 100),\n limit: k,\n },\n },\n {\n $project: {\n id: 1,\n vec: 1,\n document: 1,\n metadata: 1,\n score: { $meta: 'vectorSearchScore' },\n },\n },\n ]\n const docs = await col.aggregate(pipeline).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: plain find() (strongly consistent, no $vectorSearch index lag).\n const docs = await col.find({}).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (isKnn && typeof doc.score === 'number') {\n // Atlas vectorSearchScore for cosine is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const col = await this.#col(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await col.deleteMany({ id: { $in: plan.ids } })\n } else if (plan.filter) {\n // Plain find() to resolve target ids (immediate), then delete by id.\n const docs = await col.find({}).toArray()\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) await col.deleteMany({ id: { $in: targets } })\n } else {\n await col.deleteMany({})\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as isInstanceOf } from "../../tool_registry-
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { evaluateFilter } from "./filters.mjs";
|
|
4
4
|
import { E_VECTOR_STORE_COLLECTION_FAILED, E_VECTOR_STORE_CONNECTION_FAILED, E_VECTOR_STORE_DELETE_FAILED, E_VECTOR_STORE_DIMENSION_MISMATCH, E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_SEARCH_FAILED, E_VECTOR_STORE_UNSUPPORTED_OPERATION, E_VECTOR_STORE_UPSERT_FAILED } from "./exceptions.mjs";
|
|
@@ -48,6 +48,7 @@ var MongoDBVectorStore = class extends BaseVectorStore {
|
|
|
48
48
|
get #opts() {
|
|
49
49
|
return this.options;
|
|
50
50
|
}
|
|
51
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
51
52
|
static isAvailable() {
|
|
52
53
|
return typeof process !== "undefined";
|
|
53
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb.mjs","names":["#opts","#client","#db","#col","#name","#sleep","#dims","#settlePresent","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mongodb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mongodb\n *\n * MongoDB Atlas Vector Search adapter. Each collection is a MongoDB collection with an Atlas\n * `vectorSearch` index on `vec`; KNN uses the `$vectorSearch` aggregation stage (cosine\n * `vectorSearchScore`, [0,1]). Metadata is a JSON string field filtered with the neutral filter\n * tree's JS reference evaluator for cross-adapter parity.\n *\n * Consistency note: the *document* collection is strongly consistent, but the Atlas vector\n * *index* updates asynchronously after a write (~1s). So filter-scans, fetch-by-id and the\n * delete read-back use a plain `find()` (immediate), and only KNN goes through `$vectorSearch` —\n * after which the adapter polls until the just-inserted ids are index-visible (strong mode).\n *\n * Driver: `mongodb`. Works against `mongodb/mongodb-atlas-local` or a real Atlas cluster.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst INDEX = 'vec_idx'\n\nexport interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n url: string\n database?: string\n /**\n * When set, the physical MongoDB collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the Atlas vectorSearch\n * index builds asynchronously, so a fresh collection per use avoids drop+rebuild churn.\n */\n collectionPrefix?: string\n }\n}\n\nconst getMongo = async () => {\n try {\n const mod = await import('mongodb')\n return mod.MongoClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mongodb'])\n }\n}\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dotProduct' : 'cosine'\n\nexport class MongoDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // The document store is strongly consistent; KNN settles on the async index after writes.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MongoDBVectorStoreOptions {\n return this.options as MongoDBVectorStoreOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#client) return\n const MongoClient = await getMongo()\n const c = this.#opts.connection\n try {\n this.#client = new MongoClient(c.url)\n await this.#client.connect()\n this.#db = this.#client.db(c.database ?? 'vector')\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n this.#db = null\n }\n }\n\n // Map a logical collection name to its physical MongoDB collection (optional prefix).\n #name(collection: string): string {\n const prefix = this.#opts.connection?.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n async #col(collection: string): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db.collection(this.#name(collection))\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const physical = this.#name(spec.collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length > 0) {\n if (ifNotExists) {\n // Clear any residual documents so each store starts empty.\n await this.#db.collection(physical).deleteMany({})\n return\n }\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n }\n await this.#db.createCollection(physical).catch(() => undefined)\n const col = this.#db.collection(physical)\n // Create the Atlas vectorSearch index if absent, then wait until it's queryable.\n const existing = await col\n .listSearchIndexes()\n .toArray()\n .catch(() => [])\n if (!existing.find((i: any) => i.name === INDEX)) {\n await col.createSearchIndex({\n name: INDEX,\n type: 'vectorSearch',\n definition: {\n fields: [\n {\n type: 'vector',\n path: 'vec',\n numDimensions: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n },\n ],\n },\n })\n }\n for (let i = 0; i < 60; i++) {\n const list = await col.listSearchIndexes().toArray()\n const idx = list.find((x: any) => x.name === INDEX)\n if (idx?.queryable) break\n await this.#sleep(1000)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n const physical = this.#name(collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length === 0) {\n if (ifExists) return\n throw new Error('collection not found: ' + collection)\n }\n // Clear documents (fast/immediate) and drop the collection; the search index goes with it.\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n if (!this.#db) await this.connect()\n const names = await this.#db.listCollections({ name: this.#name(collection) }).toArray()\n return names.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'mongodb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const col = await this.#col(plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const ids: string[] = []\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await col.updateOne(\n { id: r.id },\n {\n $set: {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n },\n },\n { upsert: true }\n )\n ids.push(r.id)\n }\n // Settle: wait until the just-written ids are visible to $vectorSearch (the index is async).\n await this.#settlePresent(col, ids, expected ?? this.#dims.get(plan.collection) ?? 0)\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n // Poll $vectorSearch until every id in `ids` appears (bounded). Best-effort: returns on timeout.\n async #settlePresent(col: any, ids: string[], dims: number): Promise<void> {\n if (ids.length === 0 || dims <= 0) return\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen: Set<string>\n try {\n const res = await col\n .aggregate([\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector: probe,\n numCandidates: Math.max(ids.length * 10, 50),\n limit: Math.max(ids.length * 5, 50),\n },\n },\n { $project: { id: 1 } },\n ])\n .toArray()\n seen = new Set(res.map((d: any) => d.id))\n } catch {\n seen = new Set()\n }\n if (ids.every((id) => seen.has(id))) return\n await this.#sleep(300)\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const col = await this.#col(plan.collection)\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 // Plain find() — strongly consistent, no index lag.\n const doc = await col.findOne({ id: plan.near.id })\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const pipeline: any[] = [\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector,\n numCandidates: Math.max(k * 10, 100),\n limit: k,\n },\n },\n {\n $project: {\n id: 1,\n vec: 1,\n document: 1,\n metadata: 1,\n score: { $meta: 'vectorSearchScore' },\n },\n },\n ]\n const docs = await col.aggregate(pipeline).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: plain find() (strongly consistent, no $vectorSearch index lag).\n const docs = await col.find({}).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (isKnn && typeof doc.score === 'number') {\n // Atlas vectorSearchScore for cosine is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const col = await this.#col(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await col.deleteMany({ id: { $in: plan.ids } })\n } else if (plan.filter) {\n // Plain find() to resolve target ids (immediate), then delete by id.\n const docs = await col.find({}).toArray()\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) await col.deleteMany({ id: { $in: targets } })\n } else {\n await col.deleteMany({})\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mongodb.mjs","names":["#opts","#client","#db","#col","#name","#sleep","#dims","#settlePresent","#parseMeta","#project"],"sources":["../../../src/batteries/vector/mongodb/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/mongodb\n *\n * MongoDB Atlas Vector Search adapter. Each collection is a MongoDB collection with an Atlas\n * `vectorSearch` index on `vec`; KNN uses the `$vectorSearch` aggregation stage (cosine\n * `vectorSearchScore`, [0,1]). Metadata is a JSON string field filtered with the neutral filter\n * tree's JS reference evaluator for cross-adapter parity.\n *\n * Consistency note: the *document* collection is strongly consistent, but the Atlas vector\n * *index* updates asynchronously after a write (~1s). So filter-scans, fetch-by-id and the\n * delete read-back use a plain `find()` (immediate), and only KNN goes through `$vectorSearch` —\n * after which the adapter polls until the just-inserted ids are index-visible (strong mode).\n *\n * Driver: `mongodb`. Works against `mongodb/mongodb-atlas-local` or a real Atlas cluster.\n */\n\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst INDEX = 'vec_idx'\n\nexport interface MongoDBVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: {\n url: string\n database?: string\n /**\n * When set, the physical MongoDB collection becomes `${collectionPrefix}${collection}`. The\n * logical collection the builder/base see is unchanged. Lets callers (and the test suite)\n * isolate otherwise identically-named collections — useful because the Atlas vectorSearch\n * index builds asynchronously, so a fresh collection per use avoids drop+rebuild churn.\n */\n collectionPrefix?: string\n }\n}\n\nconst getMongo = async () => {\n try {\n const mod = await import('mongodb')\n return mod.MongoClient\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['mongodb'])\n }\n}\n\nconst similarity = (metric: DistanceMetric): string =>\n metric === 'euclidean' ? 'euclidean' : metric === 'dot' ? 'dotProduct' : 'cosine'\n\nexport class MongoDBVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n // The document store is strongly consistent; KNN settles on the async index after writes.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #client: any | null = null\n #db: any | null = null\n #dims: Map<string, number> = new Map()\n\n get #opts(): MongoDBVectorStoreOptions {\n return this.options as MongoDBVectorStoreOptions\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\n async connect(): Promise<void> {\n if (this.#client) return\n const MongoClient = await getMongo()\n const c = this.#opts.connection\n try {\n this.#client = new MongoClient(c.url)\n await this.#client.connect()\n this.#db = this.#client.db(c.database ?? 'vector')\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#client) {\n await this.#client.close()\n this.#client = null\n this.#db = null\n }\n }\n\n // Map a logical collection name to its physical MongoDB collection (optional prefix).\n #name(collection: string): string {\n const prefix = this.#opts.connection?.collectionPrefix\n return prefix ? `${prefix}${collection}` : collection\n }\n\n async #col(collection: string): Promise<any> {\n if (!this.#db) await this.connect()\n return this.#db.collection(this.#name(collection))\n }\n\n async #sleep(ms: number): Promise<void> {\n await new Promise((r) => setTimeout(r, ms))\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n this.#dims.set(spec.collection, spec.vector.dimensions)\n const physical = this.#name(spec.collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length > 0) {\n if (ifNotExists) {\n // Clear any residual documents so each store starts empty.\n await this.#db.collection(physical).deleteMany({})\n return\n }\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n }\n await this.#db.createCollection(physical).catch(() => undefined)\n const col = this.#db.collection(physical)\n // Create the Atlas vectorSearch index if absent, then wait until it's queryable.\n const existing = await col\n .listSearchIndexes()\n .toArray()\n .catch(() => [])\n if (!existing.find((i: any) => i.name === INDEX)) {\n await col.createSearchIndex({\n name: INDEX,\n type: 'vectorSearch',\n definition: {\n fields: [\n {\n type: 'vector',\n path: 'vec',\n numDimensions: spec.vector.dimensions,\n similarity: similarity(spec.vector.metric),\n },\n ],\n },\n })\n }\n for (let i = 0; i < 60; i++) {\n const list = await col.listSearchIndexes().toArray()\n const idx = list.find((x: any) => x.name === INDEX)\n if (idx?.queryable) break\n await this.#sleep(1000)\n }\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['createCollection', String(err)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#db) await this.connect()\n const physical = this.#name(collection)\n try {\n const names = await this.#db.listCollections({ name: physical }).toArray()\n if (names.length === 0) {\n if (ifExists) return\n throw new Error('collection not found: ' + collection)\n }\n // Clear documents (fast/immediate) and drop the collection; the search index goes with it.\n await this.#db\n .collection(physical)\n .drop()\n .catch(() => undefined)\n this.#dims.delete(collection)\n } catch (err) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n if (!this.#db) await this.connect()\n const names = await this.#db.listCollections({ name: this.#name(collection) }).toArray()\n return names.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'mongodb'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const col = await this.#col(plan.collection)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n const ids: string[] = []\n try {\n for (const r of plan.records) {\n let vector = r.vector\n if (!vector && r.document) {\n const [v] = await this.encode([r.document], 'document')\n vector = v\n }\n if (!vector) {\n throw new E_VECTOR_STORE_UPSERT_FAILED(['Record missing vector and document'])\n }\n if (expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n await col.updateOne(\n { id: r.id },\n {\n $set: {\n id: r.id,\n vec: vector,\n document: r.document ?? '',\n metadata: r.metadata ? JSON.stringify(r.metadata) : '{}',\n },\n },\n { upsert: true }\n )\n ids.push(r.id)\n }\n // Settle: wait until the just-written ids are visible to $vectorSearch (the index is async).\n await this.#settlePresent(col, ids, expected ?? this.#dims.get(plan.collection) ?? 0)\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n // Poll $vectorSearch until every id in `ids` appears (bounded). Best-effort: returns on timeout.\n async #settlePresent(col: any, ids: string[], dims: number): Promise<void> {\n if (ids.length === 0 || dims <= 0) return\n const probe = new Array(dims).fill(0)\n probe[0] = 1\n const deadline = Date.now() + 10_000\n while (Date.now() < deadline) {\n let seen: Set<string>\n try {\n const res = await col\n .aggregate([\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector: probe,\n numCandidates: Math.max(ids.length * 10, 50),\n limit: Math.max(ids.length * 5, 50),\n },\n },\n { $project: { id: 1 } },\n ])\n .toArray()\n seen = new Set(res.map((d: any) => d.id))\n } catch {\n seen = new Set()\n }\n if (ids.every((id) => seen.has(id))) return\n await this.#sleep(300)\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const col = await this.#col(plan.collection)\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 // Plain find() — strongly consistent, no index lag.\n const doc = await col.findOne({ id: plan.near.id })\n if (!doc) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n queryVector = doc.vec as number[]\n }\n }\n\n const offset = plan.offset ?? 0\n try {\n if (queryVector) {\n const k = (plan.filter ? 1000 : plan.topK + offset) || 10\n const pipeline: any[] = [\n {\n $vectorSearch: {\n index: INDEX,\n path: 'vec',\n queryVector,\n numCandidates: Math.max(k * 10, 100),\n limit: k,\n },\n },\n {\n $project: {\n id: 1,\n vec: 1,\n document: 1,\n metadata: 1,\n score: { $meta: 'vectorSearchScore' },\n },\n },\n ]\n const docs = await col.aggregate(pipeline).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, true))\n } else {\n // Filter-scan: plain find() (strongly consistent, no $vectorSearch index lag).\n const docs = await col.find({}).toArray()\n const filtered = plan.filter\n ? docs.filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n : docs\n return filtered\n .slice(offset, offset + plan.topK)\n .map((d: any) => this.#project(d, plan, false))\n }\n } catch (err) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #parseMeta(val: unknown): VectorMetadata {\n if (typeof val === 'string') {\n try {\n return JSON.parse(val) as VectorMetadata\n } catch {\n return {}\n }\n }\n if (val && typeof val === 'object') return val as VectorMetadata\n return {}\n }\n\n #project(doc: any, plan: SearchPlan, isKnn: boolean): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = doc.id as string\n if (proj.vector && Array.isArray(doc.vec)) out.vector = (doc.vec as number[]).map(Number)\n if (proj.document) out.document = (doc.document ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(doc.metadata)\n if (isKnn && typeof doc.score === 'number') {\n // Atlas vectorSearchScore for cosine is already in [0,1], higher = closer.\n out.score = doc.score\n }\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const col = await this.#col(plan.collection)\n try {\n if (plan.ids && plan.ids.length > 0) {\n await col.deleteMany({ id: { $in: plan.ids } })\n } else if (plan.filter) {\n // Plain find() to resolve target ids (immediate), then delete by id.\n const docs = await col.find({}).toArray()\n const targets = docs\n .filter((d: any) => evaluateFilter(plan.filter!, this.#parseMeta(d.metadata)))\n .map((d: any) => d.id as string)\n if (targets.length > 0) await col.deleteMany({ id: { $in: targets } })\n } else {\n await col.deleteMany({})\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { BaseVectorStore } from "../contract";
|
|
|
14
14
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
15
15
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
16
16
|
export interface Neo4jVectorStoreOptions extends BaseVectorStoreOptions {
|
|
17
|
+
/** Connection and authentication parameters for the backend. */
|
|
17
18
|
connection: {
|
|
18
19
|
url: string;
|
|
19
20
|
username?: string;
|
|
@@ -24,6 +25,7 @@ export interface Neo4jVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
24
25
|
export declare class Neo4jVectorStore extends BaseVectorStore {
|
|
25
26
|
#private;
|
|
26
27
|
readonly capabilities: VectorStoreCapabilities;
|
|
28
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
27
29
|
static isAvailable(): boolean;
|
|
28
30
|
isAvailable(): boolean;
|
|
29
31
|
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_exceptions = require("./exceptions.cjs");
|
|
@@ -50,6 +50,7 @@ var Neo4jVectorStore = class extends require_batteries_vector_contract.BaseVecto
|
|
|
50
50
|
get #opts() {
|
|
51
51
|
return this.options;
|
|
52
52
|
}
|
|
53
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
53
54
|
static isAvailable() {
|
|
54
55
|
return typeof process !== "undefined";
|
|
55
56
|
}
|