@nhtio/adk 1.20260607.2 → 1.20260609.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +230 -0
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/openai/exceptions.cjs +1 -1
- package/batteries/embeddings/openai/exceptions.mjs +1 -1
- package/batteries/embeddings/openai/types.d.ts +7 -0
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/exceptions.cjs +1 -1
- package/batteries/embeddings/webllm/exceptions.mjs +1 -1
- package/batteries/llm/chat_common/helpers.d.ts +165 -0
- package/batteries/llm/chat_common/types.d.ts +309 -0
- package/batteries/llm/index.d.ts +5 -0
- package/batteries/llm/ollama/adapter.cjs +736 -0
- package/batteries/llm/ollama/adapter.cjs.map +1 -0
- package/batteries/llm/ollama/adapter.d.ts +64 -0
- package/batteries/llm/ollama/adapter.mjs +734 -0
- package/batteries/llm/ollama/adapter.mjs.map +1 -0
- package/batteries/llm/ollama/exceptions.cjs +105 -0
- package/batteries/llm/ollama/exceptions.cjs.map +1 -0
- package/batteries/llm/ollama/exceptions.d.ts +112 -0
- package/batteries/llm/ollama/exceptions.mjs +96 -0
- package/batteries/llm/ollama/exceptions.mjs.map +1 -0
- package/batteries/llm/ollama/helpers.cjs +487 -0
- package/batteries/llm/ollama/helpers.cjs.map +1 -0
- package/batteries/llm/ollama/helpers.d.ts +158 -0
- package/batteries/llm/ollama/helpers.mjs +450 -0
- package/batteries/llm/ollama/helpers.mjs.map +1 -0
- package/batteries/llm/ollama/index.d.ts +29 -0
- package/batteries/llm/ollama/types.cjs +2 -0
- package/batteries/llm/ollama/types.d.ts +334 -0
- package/batteries/llm/ollama/types.mjs +0 -0
- package/batteries/llm/ollama/validation.cjs +130 -0
- package/batteries/llm/ollama/validation.cjs.map +1 -0
- package/batteries/llm/ollama/validation.d.ts +31 -0
- package/batteries/llm/ollama/validation.mjs +127 -0
- package/batteries/llm/ollama/validation.mjs.map +1 -0
- package/batteries/llm/ollama.cjs +54 -0
- package/batteries/llm/ollama.mjs +6 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
- package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
- package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
- package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
- package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions.cjs +29 -28
- package/batteries/llm/openai_chat_completions.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
- package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
- package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
- package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
- package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions.cjs +29 -28
- package/batteries/llm/webllm_chat_completions.mjs +2 -1
- package/batteries/llm.cjs +44 -28
- package/batteries/llm.mjs +9 -4
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +1 -1
- package/batteries/storage/in_memory/index.d.ts +1 -1
- package/batteries/storage/in_memory.cjs +2 -2
- package/batteries/storage/in_memory.cjs.map +1 -1
- package/batteries/storage/in_memory.mjs +2 -2
- package/batteries/storage/in_memory.mjs.map +1 -1
- package/batteries/storage/opfs/index.d.ts +19 -0
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.cjs.map +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/storage/opfs.mjs.map +1 -1
- package/batteries/tools/_shared/index.d.ts +121 -0
- package/batteries/tools/_shared.cjs +157 -0
- package/batteries/tools/_shared.cjs.map +1 -0
- package/batteries/tools/_shared.mjs +149 -0
- package/batteries/tools/_shared.mjs.map +1 -0
- package/batteries/tools/color.cjs +3 -2
- package/batteries/tools/color.cjs.map +1 -1
- package/batteries/tools/color.mjs +3 -2
- package/batteries/tools/color.mjs.map +1 -1
- package/batteries/tools/comparison.cjs +4 -3
- package/batteries/tools/comparison.cjs.map +1 -1
- package/batteries/tools/comparison.mjs +4 -3
- package/batteries/tools/comparison.mjs.map +1 -1
- package/batteries/tools/data_structure.cjs +30 -10
- package/batteries/tools/data_structure.cjs.map +1 -1
- package/batteries/tools/data_structure.mjs +30 -10
- package/batteries/tools/data_structure.mjs.map +1 -1
- package/batteries/tools/datetime_extended.cjs +5 -10
- package/batteries/tools/datetime_extended.cjs.map +1 -1
- package/batteries/tools/datetime_extended.mjs +5 -10
- package/batteries/tools/datetime_extended.mjs.map +1 -1
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +13 -4
- package/batteries/tools/encoding.cjs.map +1 -1
- package/batteries/tools/encoding.mjs +13 -4
- package/batteries/tools/encoding.mjs.map +1 -1
- package/batteries/tools/formatting.cjs +4 -4
- package/batteries/tools/formatting.cjs.map +1 -1
- package/batteries/tools/formatting.mjs +4 -4
- package/batteries/tools/formatting.mjs.map +1 -1
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/index.d.ts +3 -0
- package/batteries/tools/math.cjs +10 -8
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +10 -8
- package/batteries/tools/math.mjs.map +1 -1
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +9 -5
- package/batteries/tools/parsing.cjs.map +1 -1
- package/batteries/tools/parsing.mjs +9 -5
- package/batteries/tools/parsing.mjs.map +1 -1
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/scrapper/exceptions.d.ts +21 -0
- package/batteries/tools/scrapper/index.d.ts +172 -0
- package/batteries/tools/scrapper/shared.d.ts +139 -0
- package/batteries/tools/scrapper.cjs +8 -0
- package/batteries/tools/scrapper.mjs +2 -0
- package/batteries/tools/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +177 -0
- package/batteries/tools/searxng.cjs +6 -0
- package/batteries/tools/searxng.mjs +2 -0
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +54 -43
- package/batteries/tools/statistics.cjs.map +1 -1
- package/batteries/tools/statistics.mjs +54 -43
- package/batteries/tools/statistics.mjs.map +1 -1
- package/batteries/tools/string_processing.cjs +5 -5
- package/batteries/tools/string_processing.cjs.map +1 -1
- package/batteries/tools/string_processing.mjs +5 -5
- package/batteries/tools/string_processing.mjs.map +1 -1
- package/batteries/tools/structured_data.cjs +8 -13
- package/batteries/tools/structured_data.cjs.map +1 -1
- package/batteries/tools/structured_data.mjs +8 -13
- package/batteries/tools/structured_data.mjs.map +1 -1
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +10 -8
- package/batteries/tools/unit_conversion.cjs.map +1 -1
- package/batteries/tools/unit_conversion.mjs +10 -8
- package/batteries/tools/unit_conversion.mjs.map +1 -1
- package/batteries/tools/web_retrieval/index.d.ts +186 -0
- package/batteries/tools/web_retrieval.cjs +206 -0
- package/batteries/tools/web_retrieval.cjs.map +1 -0
- package/batteries/tools/web_retrieval.mjs +201 -0
- package/batteries/tools/web_retrieval.mjs.map +1 -0
- package/batteries/tools.cjs +15 -0
- package/batteries/tools.mjs +4 -1
- package/batteries/vector/arangodb/index.d.ts +2 -0
- package/batteries/vector/arangodb.cjs +2 -1
- package/batteries/vector/arangodb.cjs.map +1 -1
- package/batteries/vector/arangodb.mjs +2 -1
- package/batteries/vector/arangodb.mjs.map +1 -1
- package/batteries/vector/builder.cjs +31 -0
- package/batteries/vector/builder.cjs.map +1 -1
- package/batteries/vector/builder.d.ts +58 -0
- package/batteries/vector/builder.mjs +31 -0
- package/batteries/vector/builder.mjs.map +1 -1
- package/batteries/vector/chroma/index.d.ts +4 -0
- package/batteries/vector/chroma.cjs +3 -0
- package/batteries/vector/chroma.cjs.map +1 -1
- package/batteries/vector/chroma.mjs +3 -0
- package/batteries/vector/chroma.mjs.map +1 -1
- package/batteries/vector/clickhouse/index.d.ts +2 -0
- package/batteries/vector/clickhouse.cjs +2 -1
- package/batteries/vector/clickhouse.cjs.map +1 -1
- package/batteries/vector/clickhouse.mjs +2 -1
- package/batteries/vector/clickhouse.mjs.map +1 -1
- package/batteries/vector/cloudflare/index.d.ts +2 -0
- package/batteries/vector/cloudflare.cjs +2 -1
- package/batteries/vector/cloudflare.cjs.map +1 -1
- package/batteries/vector/cloudflare.mjs +2 -1
- package/batteries/vector/cloudflare.mjs.map +1 -1
- package/batteries/vector/conformance/index.d.ts +22 -0
- package/batteries/vector/conformance.cjs +22 -0
- package/batteries/vector/conformance.cjs.map +1 -1
- package/batteries/vector/conformance.mjs +22 -0
- package/batteries/vector/conformance.mjs.map +1 -1
- package/batteries/vector/contract.cjs +22 -0
- package/batteries/vector/contract.cjs.map +1 -1
- package/batteries/vector/contract.d.ts +51 -0
- package/batteries/vector/contract.mjs +22 -0
- package/batteries/vector/contract.mjs.map +1 -1
- package/batteries/vector/couchbase/index.d.ts +2 -0
- package/batteries/vector/couchbase.cjs +2 -1
- package/batteries/vector/couchbase.cjs.map +1 -1
- package/batteries/vector/couchbase.mjs +2 -1
- package/batteries/vector/couchbase.mjs.map +1 -1
- package/batteries/vector/duckdb/index.d.ts +2 -0
- package/batteries/vector/duckdb.cjs +2 -1
- package/batteries/vector/duckdb.cjs.map +1 -1
- package/batteries/vector/duckdb.mjs +2 -1
- package/batteries/vector/duckdb.mjs.map +1 -1
- package/batteries/vector/elasticsearch/index.d.ts +2 -0
- package/batteries/vector/elasticsearch.cjs +2 -1
- package/batteries/vector/elasticsearch.cjs.map +1 -1
- package/batteries/vector/elasticsearch.mjs +2 -1
- package/batteries/vector/elasticsearch.mjs.map +1 -1
- package/batteries/vector/exceptions.cjs +1 -1
- package/batteries/vector/exceptions.mjs +1 -1
- package/batteries/vector/factory.cjs +6 -0
- package/batteries/vector/factory.cjs.map +1 -1
- package/batteries/vector/factory.d.ts +14 -0
- package/batteries/vector/factory.mjs +6 -0
- package/batteries/vector/factory.mjs.map +1 -1
- package/batteries/vector/filters.cjs +22 -1
- package/batteries/vector/filters.cjs.map +1 -1
- package/batteries/vector/filters.d.ts +38 -0
- package/batteries/vector/filters.mjs +22 -1
- package/batteries/vector/filters.mjs.map +1 -1
- package/batteries/vector/helpers.cjs +13 -0
- package/batteries/vector/helpers.cjs.map +1 -1
- package/batteries/vector/helpers.d.ts +14 -0
- package/batteries/vector/helpers.mjs +13 -0
- package/batteries/vector/helpers.mjs.map +1 -1
- package/batteries/vector/hnswlib/index.d.ts +2 -0
- package/batteries/vector/hnswlib.cjs +2 -1
- package/batteries/vector/hnswlib.cjs.map +1 -1
- package/batteries/vector/hnswlib.mjs +2 -1
- package/batteries/vector/hnswlib.mjs.map +1 -1
- package/batteries/vector/in_memory/index.d.ts +1 -0
- package/batteries/vector/in_memory.cjs +1 -0
- package/batteries/vector/in_memory.cjs.map +1 -1
- package/batteries/vector/in_memory.mjs +1 -0
- package/batteries/vector/in_memory.mjs.map +1 -1
- package/batteries/vector/lancedb/index.d.ts +2 -0
- package/batteries/vector/lancedb.cjs +2 -1
- package/batteries/vector/lancedb.cjs.map +1 -1
- package/batteries/vector/lancedb.mjs +2 -1
- package/batteries/vector/lancedb.mjs.map +1 -1
- package/batteries/vector/mariadb/index.d.ts +2 -0
- package/batteries/vector/mariadb.cjs +2 -1
- package/batteries/vector/mariadb.cjs.map +1 -1
- package/batteries/vector/mariadb.mjs +2 -1
- package/batteries/vector/mariadb.mjs.map +1 -1
- package/batteries/vector/meilisearch/index.d.ts +2 -0
- package/batteries/vector/meilisearch.cjs +2 -1
- package/batteries/vector/meilisearch.cjs.map +1 -1
- package/batteries/vector/meilisearch.mjs +2 -1
- package/batteries/vector/meilisearch.mjs.map +1 -1
- package/batteries/vector/migrate.cjs +18 -1
- package/batteries/vector/migrate.cjs.map +1 -1
- package/batteries/vector/migrate.d.ts +31 -0
- package/batteries/vector/migrate.mjs +18 -1
- package/batteries/vector/migrate.mjs.map +1 -1
- package/batteries/vector/milvus/index.d.ts +5 -0
- package/batteries/vector/milvus.cjs +4 -0
- package/batteries/vector/milvus.cjs.map +1 -1
- package/batteries/vector/milvus.mjs +4 -0
- package/batteries/vector/milvus.mjs.map +1 -1
- package/batteries/vector/mongodb/index.d.ts +2 -0
- package/batteries/vector/mongodb.cjs +2 -1
- package/batteries/vector/mongodb.cjs.map +1 -1
- package/batteries/vector/mongodb.mjs +2 -1
- package/batteries/vector/mongodb.mjs.map +1 -1
- package/batteries/vector/neo4j/index.d.ts +2 -0
- package/batteries/vector/neo4j.cjs +2 -1
- package/batteries/vector/neo4j.cjs.map +1 -1
- package/batteries/vector/neo4j.mjs +2 -1
- package/batteries/vector/neo4j.mjs.map +1 -1
- package/batteries/vector/opensearch/index.d.ts +2 -0
- package/batteries/vector/opensearch.cjs +2 -1
- package/batteries/vector/opensearch.cjs.map +1 -1
- package/batteries/vector/opensearch.mjs +2 -1
- package/batteries/vector/opensearch.mjs.map +1 -1
- package/batteries/vector/oracle23ai/index.d.ts +2 -0
- package/batteries/vector/oracle23ai.cjs +2 -1
- package/batteries/vector/oracle23ai.cjs.map +1 -1
- package/batteries/vector/oracle23ai.mjs +2 -1
- package/batteries/vector/oracle23ai.mjs.map +1 -1
- package/batteries/vector/orama/index.d.ts +1 -0
- package/batteries/vector/orama.cjs +1 -0
- package/batteries/vector/orama.cjs.map +1 -1
- package/batteries/vector/orama.mjs +1 -0
- package/batteries/vector/orama.mjs.map +1 -1
- package/batteries/vector/pgvector/index.d.ts +9 -2
- package/batteries/vector/pgvector.cjs +4 -0
- package/batteries/vector/pgvector.cjs.map +1 -1
- package/batteries/vector/pgvector.mjs +4 -0
- package/batteries/vector/pgvector.mjs.map +1 -1
- package/batteries/vector/pinecone/index.d.ts +5 -0
- package/batteries/vector/pinecone.cjs +3 -1
- package/batteries/vector/pinecone.cjs.map +1 -1
- package/batteries/vector/pinecone.mjs +3 -1
- package/batteries/vector/pinecone.mjs.map +1 -1
- package/batteries/vector/plan.d.ts +27 -0
- package/batteries/vector/qdrant/index.d.ts +5 -0
- package/batteries/vector/qdrant.cjs +4 -0
- package/batteries/vector/qdrant.cjs.map +1 -1
- package/batteries/vector/qdrant.mjs +4 -0
- package/batteries/vector/qdrant.mjs.map +1 -1
- package/batteries/vector/redis/index.d.ts +2 -0
- package/batteries/vector/redis.cjs +2 -1
- package/batteries/vector/redis.cjs.map +1 -1
- package/batteries/vector/redis.mjs +2 -1
- package/batteries/vector/redis.mjs.map +1 -1
- package/batteries/vector/retrievable.cjs +9 -1
- package/batteries/vector/retrievable.cjs.map +1 -1
- package/batteries/vector/retrievable.mjs +9 -1
- package/batteries/vector/retrievable.mjs.map +1 -1
- package/batteries/vector/retrievable_glue.d.ts +21 -0
- package/batteries/vector/s3vectors/index.d.ts +2 -0
- package/batteries/vector/s3vectors.cjs +2 -1
- package/batteries/vector/s3vectors.cjs.map +1 -1
- package/batteries/vector/s3vectors.mjs +2 -1
- package/batteries/vector/s3vectors.mjs.map +1 -1
- package/batteries/vector/schema.cjs +28 -0
- package/batteries/vector/schema.cjs.map +1 -1
- package/batteries/vector/schema.d.ts +39 -0
- package/batteries/vector/schema.mjs +28 -0
- package/batteries/vector/schema.mjs.map +1 -1
- package/batteries/vector/solr/index.d.ts +2 -0
- package/batteries/vector/solr.cjs +2 -1
- package/batteries/vector/solr.cjs.map +1 -1
- package/batteries/vector/solr.mjs +2 -1
- package/batteries/vector/solr.mjs.map +1 -1
- package/batteries/vector/sqlite_vec/index.d.ts +6 -3
- package/batteries/vector/sqlite_vec.cjs +2 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -1
- package/batteries/vector/sqlite_vec.mjs +2 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -1
- package/batteries/vector/surrealdb/index.d.ts +2 -0
- package/batteries/vector/surrealdb.cjs +2 -1
- package/batteries/vector/surrealdb.cjs.map +1 -1
- package/batteries/vector/surrealdb.mjs +2 -1
- package/batteries/vector/surrealdb.mjs.map +1 -1
- package/batteries/vector/types.d.ts +27 -0
- package/batteries/vector/typesense/index.d.ts +2 -0
- package/batteries/vector/typesense.cjs +2 -1
- package/batteries/vector/typesense.cjs.map +1 -1
- package/batteries/vector/typesense.mjs +2 -1
- package/batteries/vector/typesense.mjs.map +1 -1
- package/batteries/vector/validation.cjs +14 -0
- package/batteries/vector/validation.cjs.map +1 -1
- package/batteries/vector/validation.d.ts +14 -0
- package/batteries/vector/validation.mjs +14 -0
- package/batteries/vector/validation.mjs.map +1 -1
- package/batteries/vector/vector_store_constructor.cjs +1 -1
- package/batteries/vector/vector_store_constructor.cjs.map +1 -1
- package/batteries/vector/vector_store_constructor.d.ts +1 -1
- package/batteries/vector/vector_store_constructor.mjs +1 -1
- package/batteries/vector/vector_store_constructor.mjs.map +1 -1
- package/batteries/vector/vespa/index.d.ts +2 -0
- package/batteries/vector/vespa.cjs +2 -1
- package/batteries/vector/vespa.cjs.map +1 -1
- package/batteries/vector/vespa.mjs +2 -1
- package/batteries/vector/vespa.mjs.map +1 -1
- package/batteries/vector/weaviate/index.d.ts +2 -0
- package/batteries/vector/weaviate.cjs +2 -1
- package/batteries/vector/weaviate.cjs.map +1 -1
- package/batteries/vector/weaviate.mjs +2 -1
- package/batteries/vector/weaviate.mjs.map +1 -1
- package/batteries.cjs +58 -28
- package/batteries.mjs +12 -5
- package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
- package/common-DYDUi99O.mjs.map +1 -0
- package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
- package/common-DZl3ADJs.js.map +1 -0
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
- package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
- package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
- package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.d.ts +1 -1
- package/dispatch_runner.mjs +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
- package/eslint/rules/require_validator_any_required.cjs +1 -0
- package/eslint/rules/require_validator_any_required.cjs.map +1 -1
- package/eslint/rules/require_validator_any_required.d.ts +1 -0
- package/eslint/rules/require_validator_any_required.mjs +1 -0
- package/eslint/rules/require_validator_any_required.mjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
- package/eslint/rules.cjs +1 -1
- package/eslint/rules.mjs +1 -1
- package/eslint.cjs +2 -2
- package/eslint.mjs +2 -2
- package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
- package/exceptions-BDhN0Xzr.mjs.map +1 -0
- package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
- package/exceptions-BRXrUKiW.js.map +1 -0
- package/exceptions.cjs +2 -2
- package/exceptions.mjs +2 -2
- package/factories.cjs +1 -1
- package/factories.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.d.ts +1 -1
- package/forge.mjs +4 -4
- package/guards.cjs +9 -9
- package/guards.mjs +9 -9
- package/helpers-DSTFxTiC.js +497 -0
- package/helpers-DSTFxTiC.js.map +1 -0
- package/helpers-xhrQbMAG.mjs +306 -0
- package/helpers-xhrQbMAG.mjs.map +1 -0
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/base_exception.d.ts +1 -0
- package/lib/classes/media.d.ts +10 -0
- package/lib/classes/retrievable.d.ts +1 -1
- package/lib/classes/spooled_json_artifact.d.ts +1 -1
- package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
- package/lib/classes/tokenizable.d.ts +3 -0
- package/lib/classes/tool.d.ts +8 -0
- package/lib/classes/turn_gate.d.ts +6 -0
- package/lib/dispatch_runner.d.ts +4 -32
- package/lib/helpers/bignum.cjs +82 -0
- package/lib/helpers/bignum.cjs.map +1 -0
- package/lib/helpers/bignum.d.ts +52 -0
- package/lib/helpers/bignum.mjs +74 -0
- package/lib/helpers/bignum.mjs.map +1 -0
- package/lib/turn_runner.d.ts +1 -1
- package/lib/types/dispatch_runner.d.ts +83 -0
- package/lib/utils/exceptions.d.ts +1 -1
- package/lib/utils/retry.cjs.map +1 -1
- package/lib/utils/retry.d.ts +2 -0
- package/lib/utils/retry.mjs.map +1 -1
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +259 -204
- package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
- package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
- package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
- package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
- package/scrapper-BHM1mCde.mjs +432 -0
- package/scrapper-BHM1mCde.mjs.map +1 -0
- package/scrapper-BeweWurk.js +462 -0
- package/scrapper-BeweWurk.js.map +1 -0
- package/searxng-BJFulNcK.mjs +247 -0
- package/searxng-BJFulNcK.mjs.map +1 -0
- package/searxng-B_D--V5q.js +265 -0
- package/searxng-B_D--V5q.js.map +1 -0
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
- package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
- package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
- package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
- package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
- package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
- package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
- package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
- package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
- package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
- package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
- package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
- package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
- package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
- package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
- package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
- package/tool_call-B4-_-vjG.mjs.map +1 -0
- package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
- package/tool_call-DixVlW40.js.map +1 -0
- package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
- package/tool_registry-791Vrjtf.mjs.map +1 -0
- package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
- package/tool_registry-CKJPze3j.js.map +1 -0
- package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
- package/turn_runner-HXImLGIn.js.map +1 -0
- package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
- package/turn_runner-ZyYO-Kti.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/types.d.ts +1 -1
- package/common-BT0nfCi9.mjs.map +0 -1
- package/common-Cj8TaQ9U.js.map +0 -1
- package/exceptions-BeWH2FwP.mjs.map +0 -1
- package/exceptions-CitH5wZI.js.map +0 -1
- package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
- package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
- package/tool_call-CV5qVNlb.mjs.map +0 -1
- package/tool_call-Db68hB7y.js.map +0 -1
- package/tool_registry-D1pSSlsd.mjs.map +0 -1
- package/tool_registry-DYUYqXvo.js.map +0 -1
- package/turn_runner-DqWHNP80.js.map +0 -1
- package/turn_runner-fg1Wc3dK.mjs.map +0 -1
|
@@ -4,27 +4,58 @@
|
|
|
4
4
|
* @module @nhtio/adk/batteries/vector/migrate
|
|
5
5
|
*/
|
|
6
6
|
import type { VectorSchemaBuilder } from "./schema";
|
|
7
|
+
/** The context passed to each migration's `up`/`down` — exposes the schema builder. */
|
|
7
8
|
export interface VectorMigrationContext {
|
|
9
|
+
/** Schema facade for performing collection DDL within the migration. */
|
|
8
10
|
schema: VectorSchemaBuilder;
|
|
9
11
|
}
|
|
12
|
+
/** A single migration module: a name plus its forward (`up`) and reverse (`down`) steps. */
|
|
10
13
|
export interface VectorMigration {
|
|
14
|
+
/** Unique migration name, used as its ledger key. */
|
|
11
15
|
name: string;
|
|
16
|
+
/** Apply the migration. */
|
|
12
17
|
up: (ctx: VectorMigrationContext) => Promise<void>;
|
|
18
|
+
/** Reverse the migration. */
|
|
13
19
|
down: (ctx: VectorMigrationContext) => Promise<void>;
|
|
14
20
|
}
|
|
21
|
+
/** Persistence for which migrations have run; backed by a store-provided implementation. */
|
|
15
22
|
export interface MigrationLedger {
|
|
23
|
+
/** Resolve the names of migrations already applied, in application order. */
|
|
16
24
|
applied(): Promise<string[]>;
|
|
25
|
+
/** Record `name` as applied. */
|
|
17
26
|
record(name: string): Promise<void>;
|
|
27
|
+
/** Remove `name` from the applied set (on rollback). */
|
|
18
28
|
remove(name: string): Promise<void>;
|
|
19
29
|
}
|
|
30
|
+
/** Construction options for a {@link VectorMigrator}. */
|
|
20
31
|
export interface VectorMigrateOptions {
|
|
32
|
+
/** The ordered set of migration modules. */
|
|
21
33
|
migrations: VectorMigration[];
|
|
34
|
+
/** Ledger tracking which migrations have run. */
|
|
22
35
|
ledger: MigrationLedger;
|
|
36
|
+
/** Schema facade handed to each migration. */
|
|
23
37
|
schema: VectorSchemaBuilder;
|
|
24
38
|
}
|
|
39
|
+
/** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */
|
|
25
40
|
export declare class VectorMigrator {
|
|
26
41
|
#private;
|
|
42
|
+
/**
|
|
43
|
+
* @param opts - The migrations, ledger, and schema facade to run against.
|
|
44
|
+
*/
|
|
27
45
|
constructor(opts: VectorMigrateOptions);
|
|
46
|
+
/**
|
|
47
|
+
* Apply every not-yet-applied migration in order, recording each in the ledger.
|
|
48
|
+
*
|
|
49
|
+
* @returns The names of the migrations applied during this run.
|
|
50
|
+
* @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.
|
|
51
|
+
*/
|
|
28
52
|
latest(): Promise<string[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Reverse the most recently applied migration and remove it from the ledger.
|
|
55
|
+
*
|
|
56
|
+
* @returns The name of the rolled-back migration, or `null` when nothing was applied.
|
|
57
|
+
* @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or
|
|
58
|
+
* its `down` throws.
|
|
59
|
+
*/
|
|
29
60
|
rollback(): Promise<string | null>;
|
|
30
61
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { o as isError } from "../../tool_registry-
|
|
1
|
+
import { o as isError } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { E_VECTOR_STORE_MIGRATION_FAILED } from "./exceptions.mjs";
|
|
4
4
|
//#region src/batteries/vector/migrate.ts
|
|
@@ -7,15 +7,25 @@ import { E_VECTOR_STORE_MIGRATION_FAILED } from "./exceptions.mjs";
|
|
|
7
7
|
*
|
|
8
8
|
* @module @nhtio/adk/batteries/vector/migrate
|
|
9
9
|
*/
|
|
10
|
+
/** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */
|
|
10
11
|
var VectorMigrator = class {
|
|
11
12
|
#migrations;
|
|
12
13
|
#ledger;
|
|
13
14
|
#schema;
|
|
15
|
+
/**
|
|
16
|
+
* @param opts - The migrations, ledger, and schema facade to run against.
|
|
17
|
+
*/
|
|
14
18
|
constructor(opts) {
|
|
15
19
|
this.#migrations = opts.migrations;
|
|
16
20
|
this.#ledger = opts.ledger;
|
|
17
21
|
this.#schema = opts.schema;
|
|
18
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Apply every not-yet-applied migration in order, recording each in the ledger.
|
|
25
|
+
*
|
|
26
|
+
* @returns The names of the migrations applied during this run.
|
|
27
|
+
* @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.
|
|
28
|
+
*/
|
|
19
29
|
async latest() {
|
|
20
30
|
const applied = await this.#ledger.applied();
|
|
21
31
|
const toApply = this.#migrations.filter((m) => !applied.includes(m.name));
|
|
@@ -30,6 +40,13 @@ var VectorMigrator = class {
|
|
|
30
40
|
}
|
|
31
41
|
return appliedThisRun;
|
|
32
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Reverse the most recently applied migration and remove it from the ledger.
|
|
45
|
+
*
|
|
46
|
+
* @returns The name of the rolled-back migration, or `null` when nothing was applied.
|
|
47
|
+
* @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or
|
|
48
|
+
* its `down` throws.
|
|
49
|
+
*/
|
|
33
50
|
async rollback() {
|
|
34
51
|
const applied = await this.#ledger.applied();
|
|
35
52
|
if (applied.length === 0) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.mjs","names":["#migrations","#ledger","#schema"],"sources":["../../../src/batteries/vector/migrate.ts"],"sourcesContent":["/**\n * Knex-style migration runner for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/migrate\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_VECTOR_STORE_MIGRATION_FAILED } from './exceptions'\nimport type { VectorSchemaBuilder } from './schema'\n\n
|
|
1
|
+
{"version":3,"file":"migrate.mjs","names":["#migrations","#ledger","#schema"],"sources":["../../../src/batteries/vector/migrate.ts"],"sourcesContent":["/**\n * Knex-style migration runner for the vector battery.\n *\n * @module @nhtio/adk/batteries/vector/migrate\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_VECTOR_STORE_MIGRATION_FAILED } from './exceptions'\nimport type { VectorSchemaBuilder } from './schema'\n\n/** The context passed to each migration's `up`/`down` — exposes the schema builder. */\nexport interface VectorMigrationContext {\n /** Schema facade for performing collection DDL within the migration. */\n schema: VectorSchemaBuilder\n}\n\n/** A single migration module: a name plus its forward (`up`) and reverse (`down`) steps. */\nexport interface VectorMigration {\n /** Unique migration name, used as its ledger key. */\n name: string\n /** Apply the migration. */\n up: (ctx: VectorMigrationContext) => Promise<void>\n /** Reverse the migration. */\n down: (ctx: VectorMigrationContext) => Promise<void>\n}\n\n/** Persistence for which migrations have run; backed by a store-provided implementation. */\nexport interface MigrationLedger {\n /** Resolve the names of migrations already applied, in application order. */\n applied(): Promise<string[]>\n /** Record `name` as applied. */\n record(name: string): Promise<void>\n /** Remove `name` from the applied set (on rollback). */\n remove(name: string): Promise<void>\n}\n\n/** Construction options for a {@link VectorMigrator}. */\nexport interface VectorMigrateOptions {\n /** The ordered set of migration modules. */\n migrations: VectorMigration[]\n /** Ledger tracking which migrations have run. */\n ledger: MigrationLedger\n /** Schema facade handed to each migration. */\n schema: VectorSchemaBuilder\n}\n\n/** Knex-style migration runner: applies pending migrations forward and rolls the last one back. */\nexport class VectorMigrator {\n readonly #migrations: VectorMigration[]\n readonly #ledger: MigrationLedger\n readonly #schema: VectorSchemaBuilder\n\n /**\n * @param opts - The migrations, ledger, and schema facade to run against.\n */\n constructor(opts: VectorMigrateOptions) {\n this.#migrations = opts.migrations\n this.#ledger = opts.ledger\n this.#schema = opts.schema\n }\n\n /**\n * Apply every not-yet-applied migration in order, recording each in the ledger.\n *\n * @returns The names of the migrations applied during this run.\n * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when a migration's `up` throws.\n */\n async latest(): Promise<string[]> {\n const applied = await this.#ledger.applied()\n const toApply = this.#migrations.filter((m) => !applied.includes(m.name))\n\n const appliedThisRun: string[] = []\n\n for (const migration of toApply) {\n try {\n await migration.up({ schema: this.#schema })\n await this.#ledger.record(migration.name)\n appliedThisRun.push(migration.name)\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([migration.name, msg(err)])\n }\n }\n\n return appliedThisRun\n }\n\n /**\n * Reverse the most recently applied migration and remove it from the ledger.\n *\n * @returns The name of the rolled-back migration, or `null` when nothing was applied.\n * @throws {@link @nhtio/adk/batteries!E_VECTOR_STORE_MIGRATION_FAILED} when the migration module is missing or\n * its `down` throws.\n */\n async rollback(): Promise<string | null> {\n const applied = await this.#ledger.applied()\n\n if (applied.length === 0) {\n return null\n }\n\n const lastApplied = applied[applied.length - 1]\n const migration = this.#migrations.find((m) => m.name === lastApplied)\n\n if (!migration) {\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, 'migration module not found'])\n }\n\n try {\n await migration.down({ schema: this.#schema })\n await this.#ledger.remove(lastApplied)\n return lastApplied\n } catch (err) {\n const msg = (value: unknown): string => (isError(value) ? value.message : String(value))\n throw new E_VECTOR_STORE_MIGRATION_FAILED([lastApplied, msg(err)])\n }\n }\n}\n"],"mappings":";;;;;;;;;;AA+CA,IAAa,iBAAb,MAA4B;CAC1B;CACA;CACA;;;;CAKA,YAAY,MAA4B;EACtC,KAAKA,cAAc,KAAK;EACxB,KAAKC,UAAU,KAAK;EACpB,KAAKC,UAAU,KAAK;CACtB;;;;;;;CAQA,MAAM,SAA4B;EAChC,MAAM,UAAU,MAAM,KAAKD,QAAQ,QAAQ;EAC3C,MAAM,UAAU,KAAKD,YAAY,QAAQ,MAAM,CAAC,QAAQ,SAAS,EAAE,IAAI,CAAC;EAExE,MAAM,iBAA2B,CAAC;EAElC,KAAK,MAAM,aAAa,SACtB,IAAI;GACF,MAAM,UAAU,GAAG,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC3C,MAAM,KAAKD,QAAQ,OAAO,UAAU,IAAI;GACxC,eAAe,KAAK,UAAU,IAAI;EACpC,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,gCAAgC,CAAC,UAAU,MAAM,IAAI,GAAG,CAAC,CAAC;EACtE;EAGF,OAAO;CACT;;;;;;;;CASA,MAAM,WAAmC;EACvC,MAAM,UAAU,MAAM,KAAKA,QAAQ,QAAQ;EAE3C,IAAI,QAAQ,WAAW,GACrB,OAAO;EAGT,MAAM,cAAc,QAAQ,QAAQ,SAAS;EAC7C,MAAM,YAAY,KAAKD,YAAY,MAAM,MAAM,EAAE,SAAS,WAAW;EAErE,IAAI,CAAC,WACH,MAAM,IAAI,gCAAgC,CAAC,aAAa,4BAA4B,CAAC;EAGvF,IAAI;GACF,MAAM,UAAU,KAAK,EAAE,QAAQ,KAAKE,QAAQ,CAAC;GAC7C,MAAM,KAAKD,QAAQ,OAAO,WAAW;GACrC,OAAO;EACT,SAAS,KAAK;GACZ,MAAM,OAAO,UAA4B,QAAQ,KAAK,IAAI,MAAM,UAAU,OAAO,KAAK;GACtF,MAAM,IAAI,gCAAgC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;EACnE;CACF;AACF"}
|
|
@@ -6,6 +6,7 @@ import type { VectorFilter } from "../filters";
|
|
|
6
6
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
7
7
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
8
8
|
export interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {
|
|
9
|
+
/** Connection and authentication parameters for the backend. */
|
|
9
10
|
connection?: {
|
|
10
11
|
address?: string;
|
|
11
12
|
url?: string;
|
|
@@ -18,6 +19,7 @@ export interface MilvusVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
18
19
|
export declare class MilvusVectorStore extends BaseVectorStore {
|
|
19
20
|
#private;
|
|
20
21
|
readonly capabilities: VectorStoreCapabilities;
|
|
22
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
21
23
|
static isAvailable(): boolean;
|
|
22
24
|
isAvailable(): boolean;
|
|
23
25
|
connect(): Promise<void>;
|
|
@@ -29,7 +31,10 @@ export declare class MilvusVectorStore extends BaseVectorStore {
|
|
|
29
31
|
executeUpsert(plan: UpsertPlan): Promise<void>;
|
|
30
32
|
executeSearch(plan: SearchPlan): Promise<VectorMatch[]>;
|
|
31
33
|
executeDelete(plan: DeletePlan): Promise<void>;
|
|
34
|
+
/** Project a raw Milvus hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
|
|
32
35
|
projectHit(hit: any, projection: any, metric: string): VectorMatch;
|
|
36
|
+
/** Instance wrapper over the module-level {@link translateMilvusFilter}. */
|
|
33
37
|
translateMilvusFilter(filter?: VectorFilter): string;
|
|
34
38
|
}
|
|
39
|
+
/** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */
|
|
35
40
|
export declare const translateMilvusFilter: (filter?: VectorFilter) => string;
|
|
@@ -47,6 +47,7 @@ var MilvusVectorStore = class extends require_batteries_vector_contract.BaseVect
|
|
|
47
47
|
get #opts() {
|
|
48
48
|
return this.options;
|
|
49
49
|
}
|
|
50
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
50
51
|
static isAvailable() {
|
|
51
52
|
return typeof process !== "undefined";
|
|
52
53
|
}
|
|
@@ -271,6 +272,7 @@ var MilvusVectorStore = class extends require_batteries_vector_contract.BaseVect
|
|
|
271
272
|
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([String(err)]);
|
|
272
273
|
}
|
|
273
274
|
}
|
|
275
|
+
/** Project a raw Milvus hit into a {@link VectorMatch} per the requested projection, normalizing its score. */
|
|
274
276
|
projectHit(hit, projection, metric) {
|
|
275
277
|
const out = {};
|
|
276
278
|
if (projection.id) out.id = hit.id;
|
|
@@ -283,10 +285,12 @@ var MilvusVectorStore = class extends require_batteries_vector_contract.BaseVect
|
|
|
283
285
|
}
|
|
284
286
|
return out;
|
|
285
287
|
}
|
|
288
|
+
/** Instance wrapper over the module-level {@link translateMilvusFilter}. */
|
|
286
289
|
translateMilvusFilter(filter) {
|
|
287
290
|
return translateMilvusFilter(filter);
|
|
288
291
|
}
|
|
289
292
|
};
|
|
293
|
+
/** Translate a neutral {@link VectorFilter} into a Milvus boolean filter expression string. */
|
|
290
294
|
var translateMilvusFilter = (filter) => {
|
|
291
295
|
if (!filter) return "";
|
|
292
296
|
if (require_batteries_vector_filters.isRawFilter(filter)) {
|
|
@@ -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":"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"}
|
|
@@ -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
|
}
|