@nhtio/adk 1.20260607.2 → 1.20260609.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +185 -0
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/openai/exceptions.cjs +1 -1
- package/batteries/embeddings/openai/exceptions.mjs +1 -1
- package/batteries/embeddings/openai/types.d.ts +7 -0
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/exceptions.cjs +1 -1
- package/batteries/embeddings/webllm/exceptions.mjs +1 -1
- package/batteries/llm/chat_common/helpers.d.ts +165 -0
- package/batteries/llm/chat_common/types.d.ts +309 -0
- package/batteries/llm/index.d.ts +5 -0
- package/batteries/llm/ollama/adapter.cjs +736 -0
- package/batteries/llm/ollama/adapter.cjs.map +1 -0
- package/batteries/llm/ollama/adapter.d.ts +64 -0
- package/batteries/llm/ollama/adapter.mjs +734 -0
- package/batteries/llm/ollama/adapter.mjs.map +1 -0
- package/batteries/llm/ollama/exceptions.cjs +105 -0
- package/batteries/llm/ollama/exceptions.cjs.map +1 -0
- package/batteries/llm/ollama/exceptions.d.ts +112 -0
- package/batteries/llm/ollama/exceptions.mjs +96 -0
- package/batteries/llm/ollama/exceptions.mjs.map +1 -0
- package/batteries/llm/ollama/helpers.cjs +487 -0
- package/batteries/llm/ollama/helpers.cjs.map +1 -0
- package/batteries/llm/ollama/helpers.d.ts +158 -0
- package/batteries/llm/ollama/helpers.mjs +450 -0
- package/batteries/llm/ollama/helpers.mjs.map +1 -0
- package/batteries/llm/ollama/index.d.ts +29 -0
- package/batteries/llm/ollama/types.cjs +2 -0
- package/batteries/llm/ollama/types.d.ts +334 -0
- package/batteries/llm/ollama/types.mjs +0 -0
- package/batteries/llm/ollama/validation.cjs +130 -0
- package/batteries/llm/ollama/validation.cjs.map +1 -0
- package/batteries/llm/ollama/validation.d.ts +31 -0
- package/batteries/llm/ollama/validation.mjs +127 -0
- package/batteries/llm/ollama/validation.mjs.map +1 -0
- package/batteries/llm/ollama.cjs +54 -0
- package/batteries/llm/ollama.mjs +6 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +36 -19
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +23 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/openai_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +80 -320
- package/batteries/llm/openai_chat_completions/helpers.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.d.ts +68 -144
- package/batteries/llm/openai_chat_completions/helpers.mjs +40 -280
- package/batteries/llm/openai_chat_completions/helpers.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/types.d.ts +273 -181
- package/batteries/llm/openai_chat_completions/validation.cjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/validation.mjs +2 -2
- package/batteries/llm/openai_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions.cjs +29 -28
- package/batteries/llm/openai_chat_completions.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/adapter.cjs +38 -19
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.d.ts +18 -0
- package/batteries/llm/webllm_chat_completions/adapter.mjs +25 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.cjs +1 -1
- package/batteries/llm/webllm_chat_completions/exceptions.mjs +1 -1
- package/batteries/llm/webllm_chat_completions/helpers.cjs +29 -28
- package/batteries/llm/webllm_chat_completions/helpers.mjs +2 -1
- package/batteries/llm/webllm_chat_completions/types.d.ts +21 -0
- package/batteries/llm/webllm_chat_completions/validation.cjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.d.ts +12 -0
- package/batteries/llm/webllm_chat_completions/validation.mjs +13 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions.cjs +29 -28
- package/batteries/llm/webllm_chat_completions.mjs +2 -1
- package/batteries/llm.cjs +44 -28
- package/batteries/llm.mjs +9 -4
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +1 -1
- package/batteries/storage/in_memory/index.d.ts +1 -1
- package/batteries/storage/in_memory.cjs +2 -2
- package/batteries/storage/in_memory.cjs.map +1 -1
- package/batteries/storage/in_memory.mjs +2 -2
- package/batteries/storage/in_memory.mjs.map +1 -1
- package/batteries/storage/opfs/index.d.ts +19 -0
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.cjs.map +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/storage/opfs.mjs.map +1 -1
- package/batteries/tools/color.cjs +3 -2
- package/batteries/tools/color.cjs.map +1 -1
- package/batteries/tools/color.mjs +3 -2
- package/batteries/tools/color.mjs.map +1 -1
- package/batteries/tools/comparison.cjs +4 -3
- package/batteries/tools/comparison.cjs.map +1 -1
- package/batteries/tools/comparison.mjs +4 -3
- package/batteries/tools/comparison.mjs.map +1 -1
- package/batteries/tools/data_structure.cjs +30 -10
- package/batteries/tools/data_structure.cjs.map +1 -1
- package/batteries/tools/data_structure.mjs +30 -10
- package/batteries/tools/data_structure.mjs.map +1 -1
- package/batteries/tools/datetime_extended.cjs +5 -10
- package/batteries/tools/datetime_extended.cjs.map +1 -1
- package/batteries/tools/datetime_extended.mjs +5 -10
- package/batteries/tools/datetime_extended.mjs.map +1 -1
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +13 -4
- package/batteries/tools/encoding.cjs.map +1 -1
- package/batteries/tools/encoding.mjs +13 -4
- package/batteries/tools/encoding.mjs.map +1 -1
- package/batteries/tools/formatting.cjs +4 -4
- package/batteries/tools/formatting.cjs.map +1 -1
- package/batteries/tools/formatting.mjs +4 -4
- package/batteries/tools/formatting.mjs.map +1 -1
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/index.d.ts +1 -0
- package/batteries/tools/math.cjs +10 -8
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +10 -8
- package/batteries/tools/math.mjs.map +1 -1
- package/batteries/tools/memory.cjs +5 -5
- package/batteries/tools/memory.mjs +5 -5
- package/batteries/tools/parsing.cjs +9 -5
- package/batteries/tools/parsing.cjs.map +1 -1
- package/batteries/tools/parsing.mjs +9 -5
- package/batteries/tools/parsing.mjs.map +1 -1
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/searxng/exceptions.d.ts +21 -0
- package/batteries/tools/searxng/index.d.ts +150 -0
- package/batteries/tools/searxng.cjs +5 -0
- package/batteries/tools/searxng.mjs +2 -0
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +54 -43
- package/batteries/tools/statistics.cjs.map +1 -1
- package/batteries/tools/statistics.mjs +54 -43
- package/batteries/tools/statistics.mjs.map +1 -1
- package/batteries/tools/string_processing.cjs +5 -5
- package/batteries/tools/string_processing.cjs.map +1 -1
- package/batteries/tools/string_processing.mjs +5 -5
- package/batteries/tools/string_processing.mjs.map +1 -1
- package/batteries/tools/structured_data.cjs +8 -13
- package/batteries/tools/structured_data.cjs.map +1 -1
- package/batteries/tools/structured_data.mjs +8 -13
- package/batteries/tools/structured_data.mjs.map +1 -1
- package/batteries/tools/text_analysis.cjs +3 -3
- package/batteries/tools/text_analysis.mjs +3 -3
- package/batteries/tools/text_comparison.cjs +2 -2
- package/batteries/tools/text_comparison.mjs +2 -2
- package/batteries/tools/time.cjs +2 -2
- package/batteries/tools/time.mjs +2 -2
- package/batteries/tools/unit_conversion.cjs +10 -8
- package/batteries/tools/unit_conversion.cjs.map +1 -1
- package/batteries/tools/unit_conversion.mjs +10 -8
- package/batteries/tools/unit_conversion.mjs.map +1 -1
- package/batteries/tools.cjs +3 -0
- package/batteries/tools.mjs +2 -1
- package/batteries/vector/arangodb/index.d.ts +2 -0
- package/batteries/vector/arangodb.cjs +2 -1
- package/batteries/vector/arangodb.cjs.map +1 -1
- package/batteries/vector/arangodb.mjs +2 -1
- package/batteries/vector/arangodb.mjs.map +1 -1
- package/batteries/vector/builder.cjs +31 -0
- package/batteries/vector/builder.cjs.map +1 -1
- package/batteries/vector/builder.d.ts +58 -0
- package/batteries/vector/builder.mjs +31 -0
- package/batteries/vector/builder.mjs.map +1 -1
- package/batteries/vector/chroma/index.d.ts +4 -0
- package/batteries/vector/chroma.cjs +3 -0
- package/batteries/vector/chroma.cjs.map +1 -1
- package/batteries/vector/chroma.mjs +3 -0
- package/batteries/vector/chroma.mjs.map +1 -1
- package/batteries/vector/clickhouse/index.d.ts +2 -0
- package/batteries/vector/clickhouse.cjs +2 -1
- package/batteries/vector/clickhouse.cjs.map +1 -1
- package/batteries/vector/clickhouse.mjs +2 -1
- package/batteries/vector/clickhouse.mjs.map +1 -1
- package/batteries/vector/cloudflare/index.d.ts +2 -0
- package/batteries/vector/cloudflare.cjs +2 -1
- package/batteries/vector/cloudflare.cjs.map +1 -1
- package/batteries/vector/cloudflare.mjs +2 -1
- package/batteries/vector/cloudflare.mjs.map +1 -1
- package/batteries/vector/conformance/index.d.ts +22 -0
- package/batteries/vector/conformance.cjs +22 -0
- package/batteries/vector/conformance.cjs.map +1 -1
- package/batteries/vector/conformance.mjs +22 -0
- package/batteries/vector/conformance.mjs.map +1 -1
- package/batteries/vector/contract.cjs +22 -0
- package/batteries/vector/contract.cjs.map +1 -1
- package/batteries/vector/contract.d.ts +51 -0
- package/batteries/vector/contract.mjs +22 -0
- package/batteries/vector/contract.mjs.map +1 -1
- package/batteries/vector/couchbase/index.d.ts +2 -0
- package/batteries/vector/couchbase.cjs +2 -1
- package/batteries/vector/couchbase.cjs.map +1 -1
- package/batteries/vector/couchbase.mjs +2 -1
- package/batteries/vector/couchbase.mjs.map +1 -1
- package/batteries/vector/duckdb/index.d.ts +2 -0
- package/batteries/vector/duckdb.cjs +2 -1
- package/batteries/vector/duckdb.cjs.map +1 -1
- package/batteries/vector/duckdb.mjs +2 -1
- package/batteries/vector/duckdb.mjs.map +1 -1
- package/batteries/vector/elasticsearch/index.d.ts +2 -0
- package/batteries/vector/elasticsearch.cjs +2 -1
- package/batteries/vector/elasticsearch.cjs.map +1 -1
- package/batteries/vector/elasticsearch.mjs +2 -1
- package/batteries/vector/elasticsearch.mjs.map +1 -1
- package/batteries/vector/exceptions.cjs +1 -1
- package/batteries/vector/exceptions.mjs +1 -1
- package/batteries/vector/factory.cjs +6 -0
- package/batteries/vector/factory.cjs.map +1 -1
- package/batteries/vector/factory.d.ts +14 -0
- package/batteries/vector/factory.mjs +6 -0
- package/batteries/vector/factory.mjs.map +1 -1
- package/batteries/vector/filters.cjs +22 -1
- package/batteries/vector/filters.cjs.map +1 -1
- package/batteries/vector/filters.d.ts +38 -0
- package/batteries/vector/filters.mjs +22 -1
- package/batteries/vector/filters.mjs.map +1 -1
- package/batteries/vector/helpers.cjs +13 -0
- package/batteries/vector/helpers.cjs.map +1 -1
- package/batteries/vector/helpers.d.ts +14 -0
- package/batteries/vector/helpers.mjs +13 -0
- package/batteries/vector/helpers.mjs.map +1 -1
- package/batteries/vector/hnswlib/index.d.ts +2 -0
- package/batteries/vector/hnswlib.cjs +2 -1
- package/batteries/vector/hnswlib.cjs.map +1 -1
- package/batteries/vector/hnswlib.mjs +2 -1
- package/batteries/vector/hnswlib.mjs.map +1 -1
- package/batteries/vector/in_memory/index.d.ts +1 -0
- package/batteries/vector/in_memory.cjs +1 -0
- package/batteries/vector/in_memory.cjs.map +1 -1
- package/batteries/vector/in_memory.mjs +1 -0
- package/batteries/vector/in_memory.mjs.map +1 -1
- package/batteries/vector/lancedb/index.d.ts +2 -0
- package/batteries/vector/lancedb.cjs +2 -1
- package/batteries/vector/lancedb.cjs.map +1 -1
- package/batteries/vector/lancedb.mjs +2 -1
- package/batteries/vector/lancedb.mjs.map +1 -1
- package/batteries/vector/mariadb/index.d.ts +2 -0
- package/batteries/vector/mariadb.cjs +2 -1
- package/batteries/vector/mariadb.cjs.map +1 -1
- package/batteries/vector/mariadb.mjs +2 -1
- package/batteries/vector/mariadb.mjs.map +1 -1
- package/batteries/vector/meilisearch/index.d.ts +2 -0
- package/batteries/vector/meilisearch.cjs +2 -1
- package/batteries/vector/meilisearch.cjs.map +1 -1
- package/batteries/vector/meilisearch.mjs +2 -1
- package/batteries/vector/meilisearch.mjs.map +1 -1
- package/batteries/vector/migrate.cjs +18 -1
- package/batteries/vector/migrate.cjs.map +1 -1
- package/batteries/vector/migrate.d.ts +31 -0
- package/batteries/vector/migrate.mjs +18 -1
- package/batteries/vector/migrate.mjs.map +1 -1
- package/batteries/vector/milvus/index.d.ts +5 -0
- package/batteries/vector/milvus.cjs +4 -0
- package/batteries/vector/milvus.cjs.map +1 -1
- package/batteries/vector/milvus.mjs +4 -0
- package/batteries/vector/milvus.mjs.map +1 -1
- package/batteries/vector/mongodb/index.d.ts +2 -0
- package/batteries/vector/mongodb.cjs +2 -1
- package/batteries/vector/mongodb.cjs.map +1 -1
- package/batteries/vector/mongodb.mjs +2 -1
- package/batteries/vector/mongodb.mjs.map +1 -1
- package/batteries/vector/neo4j/index.d.ts +2 -0
- package/batteries/vector/neo4j.cjs +2 -1
- package/batteries/vector/neo4j.cjs.map +1 -1
- package/batteries/vector/neo4j.mjs +2 -1
- package/batteries/vector/neo4j.mjs.map +1 -1
- package/batteries/vector/opensearch/index.d.ts +2 -0
- package/batteries/vector/opensearch.cjs +2 -1
- package/batteries/vector/opensearch.cjs.map +1 -1
- package/batteries/vector/opensearch.mjs +2 -1
- package/batteries/vector/opensearch.mjs.map +1 -1
- package/batteries/vector/oracle23ai/index.d.ts +2 -0
- package/batteries/vector/oracle23ai.cjs +2 -1
- package/batteries/vector/oracle23ai.cjs.map +1 -1
- package/batteries/vector/oracle23ai.mjs +2 -1
- package/batteries/vector/oracle23ai.mjs.map +1 -1
- package/batteries/vector/orama/index.d.ts +1 -0
- package/batteries/vector/orama.cjs +1 -0
- package/batteries/vector/orama.cjs.map +1 -1
- package/batteries/vector/orama.mjs +1 -0
- package/batteries/vector/orama.mjs.map +1 -1
- package/batteries/vector/pgvector/index.d.ts +9 -2
- package/batteries/vector/pgvector.cjs +4 -0
- package/batteries/vector/pgvector.cjs.map +1 -1
- package/batteries/vector/pgvector.mjs +4 -0
- package/batteries/vector/pgvector.mjs.map +1 -1
- package/batteries/vector/pinecone/index.d.ts +5 -0
- package/batteries/vector/pinecone.cjs +3 -1
- package/batteries/vector/pinecone.cjs.map +1 -1
- package/batteries/vector/pinecone.mjs +3 -1
- package/batteries/vector/pinecone.mjs.map +1 -1
- package/batteries/vector/plan.d.ts +27 -0
- package/batteries/vector/qdrant/index.d.ts +5 -0
- package/batteries/vector/qdrant.cjs +4 -0
- package/batteries/vector/qdrant.cjs.map +1 -1
- package/batteries/vector/qdrant.mjs +4 -0
- package/batteries/vector/qdrant.mjs.map +1 -1
- package/batteries/vector/redis/index.d.ts +2 -0
- package/batteries/vector/redis.cjs +2 -1
- package/batteries/vector/redis.cjs.map +1 -1
- package/batteries/vector/redis.mjs +2 -1
- package/batteries/vector/redis.mjs.map +1 -1
- package/batteries/vector/retrievable.cjs +9 -1
- package/batteries/vector/retrievable.cjs.map +1 -1
- package/batteries/vector/retrievable.mjs +9 -1
- package/batteries/vector/retrievable.mjs.map +1 -1
- package/batteries/vector/retrievable_glue.d.ts +21 -0
- package/batteries/vector/s3vectors/index.d.ts +2 -0
- package/batteries/vector/s3vectors.cjs +2 -1
- package/batteries/vector/s3vectors.cjs.map +1 -1
- package/batteries/vector/s3vectors.mjs +2 -1
- package/batteries/vector/s3vectors.mjs.map +1 -1
- package/batteries/vector/schema.cjs +28 -0
- package/batteries/vector/schema.cjs.map +1 -1
- package/batteries/vector/schema.d.ts +39 -0
- package/batteries/vector/schema.mjs +28 -0
- package/batteries/vector/schema.mjs.map +1 -1
- package/batteries/vector/solr/index.d.ts +2 -0
- package/batteries/vector/solr.cjs +2 -1
- package/batteries/vector/solr.cjs.map +1 -1
- package/batteries/vector/solr.mjs +2 -1
- package/batteries/vector/solr.mjs.map +1 -1
- package/batteries/vector/sqlite_vec/index.d.ts +6 -3
- package/batteries/vector/sqlite_vec.cjs +2 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -1
- package/batteries/vector/sqlite_vec.mjs +2 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -1
- package/batteries/vector/surrealdb/index.d.ts +2 -0
- package/batteries/vector/surrealdb.cjs +2 -1
- package/batteries/vector/surrealdb.cjs.map +1 -1
- package/batteries/vector/surrealdb.mjs +2 -1
- package/batteries/vector/surrealdb.mjs.map +1 -1
- package/batteries/vector/types.d.ts +27 -0
- package/batteries/vector/typesense/index.d.ts +2 -0
- package/batteries/vector/typesense.cjs +2 -1
- package/batteries/vector/typesense.cjs.map +1 -1
- package/batteries/vector/typesense.mjs +2 -1
- package/batteries/vector/typesense.mjs.map +1 -1
- package/batteries/vector/validation.cjs +14 -0
- package/batteries/vector/validation.cjs.map +1 -1
- package/batteries/vector/validation.d.ts +14 -0
- package/batteries/vector/validation.mjs +14 -0
- package/batteries/vector/validation.mjs.map +1 -1
- package/batteries/vector/vector_store_constructor.cjs +1 -1
- package/batteries/vector/vector_store_constructor.cjs.map +1 -1
- package/batteries/vector/vector_store_constructor.d.ts +1 -1
- package/batteries/vector/vector_store_constructor.mjs +1 -1
- package/batteries/vector/vector_store_constructor.mjs.map +1 -1
- package/batteries/vector/vespa/index.d.ts +2 -0
- package/batteries/vector/vespa.cjs +2 -1
- package/batteries/vector/vespa.cjs.map +1 -1
- package/batteries/vector/vespa.mjs +2 -1
- package/batteries/vector/vespa.mjs.map +1 -1
- package/batteries/vector/weaviate/index.d.ts +2 -0
- package/batteries/vector/weaviate.cjs +2 -1
- package/batteries/vector/weaviate.cjs.map +1 -1
- package/batteries/vector/weaviate.mjs +2 -1
- package/batteries/vector/weaviate.mjs.map +1 -1
- package/batteries.cjs +46 -28
- package/batteries.mjs +10 -5
- package/{common-BT0nfCi9.mjs → common-DYDUi99O.mjs} +9 -9
- package/common-DYDUi99O.mjs.map +1 -0
- package/{common-Cj8TaQ9U.js → common-DZl3ADJs.js} +9 -9
- package/common-DZl3ADJs.js.map +1 -0
- package/common.cjs +7 -7
- package/common.d.ts +1 -1
- package/common.mjs +7 -7
- package/{dispatch_runner-DPcS7Y_M.mjs → dispatch_runner--ZhdDWRZ.mjs} +27 -5
- package/{dispatch_runner-DPcS7Y_M.mjs.map → dispatch_runner--ZhdDWRZ.mjs.map} +1 -1
- package/{dispatch_runner-BHBNupqp.js → dispatch_runner-nHDKkxye.js} +27 -5
- package/{dispatch_runner-BHBNupqp.js.map → dispatch_runner-nHDKkxye.js.map} +1 -1
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.d.ts +1 -1
- package/dispatch_runner.mjs +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.cjs.map +1 -1
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.d.ts +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs +1 -0
- package/eslint/rules/artifact_tool_forbids_artifact_constructor.mjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.cjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.cjs.map +1 -1
- package/eslint/rules/no_model_in_tool_handler.d.ts +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs +1 -0
- package/eslint/rules/no_model_in_tool_handler.mjs.map +1 -1
- package/eslint/rules/require_validator_any_required.cjs +1 -0
- package/eslint/rules/require_validator_any_required.cjs.map +1 -1
- package/eslint/rules/require_validator_any_required.d.ts +1 -0
- package/eslint/rules/require_validator_any_required.mjs +1 -0
- package/eslint/rules/require_validator_any_required.mjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.cjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.cjs.map +1 -1
- package/eslint/rules/thought_payload_requires_replay_tag.d.ts +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs +1 -0
- package/eslint/rules/thought_payload_requires_replay_tag.mjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.cjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.cjs.map +1 -1
- package/eslint/rules/token_encoding_requires_context_window.d.ts +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs +1 -0
- package/eslint/rules/token_encoding_requires_context_window.mjs.map +1 -1
- package/eslint.cjs +1 -1
- package/eslint.mjs +1 -1
- package/{exceptions-BeWH2FwP.mjs → exceptions-BDhN0Xzr.mjs} +3 -2
- package/exceptions-BDhN0Xzr.mjs.map +1 -0
- package/{exceptions-CitH5wZI.js → exceptions-BRXrUKiW.js} +3 -2
- package/exceptions-BRXrUKiW.js.map +1 -0
- package/exceptions.cjs +2 -2
- package/exceptions.mjs +2 -2
- package/factories.cjs +1 -1
- package/factories.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.d.ts +1 -1
- package/forge.mjs +4 -4
- package/guards.cjs +9 -9
- package/guards.mjs +9 -9
- package/helpers-DSTFxTiC.js +497 -0
- package/helpers-DSTFxTiC.js.map +1 -0
- package/helpers-xhrQbMAG.mjs +306 -0
- package/helpers-xhrQbMAG.mjs.map +1 -0
- package/index.cjs +13 -13
- package/index.mjs +13 -13
- package/lib/classes/base_exception.d.ts +1 -0
- package/lib/classes/media.d.ts +10 -0
- package/lib/classes/retrievable.d.ts +1 -1
- package/lib/classes/spooled_json_artifact.d.ts +1 -1
- package/lib/classes/spooled_markdown_artifact.d.ts +1 -0
- package/lib/classes/tokenizable.d.ts +3 -0
- package/lib/classes/tool.d.ts +8 -0
- package/lib/classes/turn_gate.d.ts +6 -0
- package/lib/dispatch_runner.d.ts +4 -32
- package/lib/helpers/bignum.cjs +82 -0
- package/lib/helpers/bignum.cjs.map +1 -0
- package/lib/helpers/bignum.d.ts +52 -0
- package/lib/helpers/bignum.mjs +74 -0
- package/lib/helpers/bignum.mjs.map +1 -0
- package/lib/turn_runner.d.ts +1 -1
- package/lib/types/dispatch_runner.d.ts +83 -0
- package/lib/utils/exceptions.d.ts +1 -1
- package/lib/utils/retry.cjs.map +1 -1
- package/lib/utils/retry.d.ts +2 -0
- package/lib/utils/retry.mjs.map +1 -1
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +264 -224
- package/{runtime-j92CNi5z.mjs → runtime-Bz5zA8wc.mjs} +2 -2
- package/{runtime-j92CNi5z.mjs.map → runtime-Bz5zA8wc.mjs.map} +1 -1
- package/{runtime-MFFcJrRv.js → runtime-DslE1aBw.js} +2 -2
- package/{runtime-MFFcJrRv.js.map → runtime-DslE1aBw.js.map} +1 -1
- package/searxng-Bkrwhwhw.js +269 -0
- package/searxng-Bkrwhwhw.js.map +1 -0
- package/searxng-CyA-nEu5.mjs +257 -0
- package/searxng-CyA-nEu5.mjs.map +1 -0
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-CHoZgWwI.mjs → spooled_artifact-7eePq7JA.mjs} +5 -5
- package/{spooled_artifact-CHoZgWwI.mjs.map → spooled_artifact-7eePq7JA.mjs.map} +1 -1
- package/{spooled_artifact-BTq6Nzfy.js → spooled_artifact-DX8LLyUX.js} +5 -5
- package/{spooled_artifact-BTq6Nzfy.js.map → spooled_artifact-DX8LLyUX.js.map} +1 -1
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-CALSDxIx.js → spooled_markdown_artifact-ClX72lek.js} +4 -4
- package/spooled_markdown_artifact-ClX72lek.js.map +1 -0
- package/{spooled_markdown_artifact-Ci5UL7l4.mjs → spooled_markdown_artifact-wkrBF3oX.mjs} +4 -4
- package/spooled_markdown_artifact-wkrBF3oX.mjs.map +1 -0
- package/{thought-D34QQZZ9.mjs → thought-B_vxAiKU.mjs} +5 -5
- package/{thought-D34QQZZ9.mjs.map → thought-B_vxAiKU.mjs.map} +1 -1
- package/{thought-BbwhJ1wb.js → thought-DLwpF7MI.js} +5 -5
- package/{thought-BbwhJ1wb.js.map → thought-DLwpF7MI.js.map} +1 -1
- package/{tool-CVyZkFC7.js → tool-D5WGVIcI.js} +4 -4
- package/{tool-CVyZkFC7.js.map → tool-D5WGVIcI.js.map} +1 -1
- package/{tool-CMhaDRNd.mjs → tool-wMYMVl60.mjs} +4 -4
- package/{tool-CMhaDRNd.mjs.map → tool-wMYMVl60.mjs.map} +1 -1
- package/{tool_call-CV5qVNlb.mjs → tool_call-B4-_-vjG.mjs} +5 -5
- package/tool_call-B4-_-vjG.mjs.map +1 -0
- package/{tool_call-Db68hB7y.js → tool_call-DixVlW40.js} +5 -5
- package/tool_call-DixVlW40.js.map +1 -0
- package/{tool_registry-D1pSSlsd.mjs → tool_registry-791Vrjtf.mjs} +4 -3
- package/tool_registry-791Vrjtf.mjs.map +1 -0
- package/{tool_registry-DYUYqXvo.js → tool_registry-CKJPze3j.js} +4 -3
- package/tool_registry-CKJPze3j.js.map +1 -0
- package/{turn_runner-DqWHNP80.js → turn_runner-HXImLGIn.js} +7 -7
- package/turn_runner-HXImLGIn.js.map +1 -0
- package/{turn_runner-fg1Wc3dK.mjs → turn_runner-ZyYO-Kti.mjs} +7 -7
- package/turn_runner-ZyYO-Kti.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/types.d.ts +1 -1
- package/common-BT0nfCi9.mjs.map +0 -1
- package/common-Cj8TaQ9U.js.map +0 -1
- package/exceptions-BeWH2FwP.mjs.map +0 -1
- package/exceptions-CitH5wZI.js.map +0 -1
- package/spooled_markdown_artifact-CALSDxIx.js.map +0 -1
- package/spooled_markdown_artifact-Ci5UL7l4.mjs.map +0 -1
- package/tool_call-CV5qVNlb.mjs.map +0 -1
- package/tool_call-Db68hB7y.js.map +0 -1
- package/tool_registry-D1pSSlsd.mjs.map +0 -1
- package/tool_registry-DYUYqXvo.js.map +0 -1
- package/turn_runner-DqWHNP80.js.map +0 -1
- package/turn_runner-fg1Wc3dK.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oracle23ai.cjs","names":["#opts","#conn","#oracledb","#dims","#metrics","#table","#parseMeta","#project"],"sources":["../../../src/batteries/vector/oracle23ai/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/oracle23ai\n *\n * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column\n * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.\n * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata\n * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter\n * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted\n * identifiers for safety.\n *\n * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.\n * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.\n *\n * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to\n * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the\n * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.\n *\n * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst getOracle = async (): Promise<any> => {\n try {\n // oracledb ships no type declarations; import the specifier dynamically as untyped.\n const mod = await import(/* @vite-ignore */ 'oracledb' as string)\n return mod.default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['oracledb'])\n }\n}\n\n// Build a double-quoted Oracle identifier, safely escaping embedded double quotes.\nconst ident = (name: string): string => '\"' + name.replace(/\"/g, '\"\"') + '\"'\n\nexport interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n connectString: string // 'host:1521/FREEPDB1'\n user: string\n password: string\n tablePrefix?: string // logical collection → `${tablePrefix}${collection}` table\n }\n}\n\nexport class Oracle23aiVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #oracledb: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): Oracle23aiVectorStoreOptions {\n return this.options as Oracle23aiVectorStoreOptions\n }\n\n // Map a logical collection name to its physical table (with optional prefix).\n #table(collection: string): string {\n const prefix = this.#opts.connection.tablePrefix ?? ''\n return prefix + collection\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#conn) return\n this.#oracledb = await getOracle()\n const c = this.#opts.connection\n try {\n this.#conn = await this.#oracledb.getConnection({\n user: c.user,\n password: c.password,\n connectString: c.connectString,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#conn) {\n await this.#conn.close()\n this.#conn = null\n this.#oracledb = null\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 async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const coll = spec.collection\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n this.#dims.set(coll, dims)\n this.#metrics.set(coll, metric)\n\n const T = ident(this.#table(coll))\n const tableName = this.#table(coll)\n\n try {\n // Check if table exists\n const checkRows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n const exists = checkRows.rows.length > 0\n\n if (exists) {\n if (ifNotExists) {\n // Clear existing table\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n return\n }\n // Drop and recreate\n await this.#conn!.execute(`DROP TABLE ${T}`)\n }\n\n // Create table\n const sql = `CREATE TABLE ${T} (\n id VARCHAR2(512) PRIMARY KEY,\n vec VECTOR(${dims}, FLOAT32),\n document CLOB,\n metadata CLOB\n )`\n await this.#conn!.execute(sql)\n await this.#conn!.commit()\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 const T = ident(this.#table(collection))\n try {\n await this.#conn!.execute(`DROP TABLE ${T}`)\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n if (err?.message && err.message.includes('ORA-00942')) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'table does not exist'])\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const tableName = this.#table(collection)\n const rows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n return rows.rows.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'oracle23ai'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n\n const T = ident(this.#table(plan.collection))\n\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\n const vecBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(vector),\n }\n\n const doc = r.document ?? ''\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n\n // MERGE upsert\n await this.#conn!.execute(\n `MERGE INTO ${T} d\n USING (SELECT :id AS id FROM dual) s\n ON (d.id = s.id)\n WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta\n WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)\n VALUES (:id, :vec, :doc, :meta)`,\n {\n id: r.id,\n vec: vecBind,\n doc,\n meta,\n },\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n }\n await this.#conn!.commit()\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const coll = plan.collection\n const metric: DistanceMetric = this.#metrics.get(coll) ?? this.#opts.metric ?? 'cosine'\n const T = ident(this.#table(coll))\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#conn!.execute(\n `SELECT vec FROM ${T} WHERE id = :id`,\n [plan.near.id],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: { VEC: { type: this.#oracledb!.DB_TYPE_VECTOR } },\n }\n )\n if (rows.rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n const arr = rows.rows[0].VEC as Float32Array\n queryVector = Array.from(arr)\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n const k = plan.filter ? 1000 : plan.topK + offset\n const metricSql =\n metric === 'cosine'\n ? 'COSINE'\n : metric === 'euclidean'\n ? 'EUCLIDEAN'\n : metric === 'dot'\n ? 'DOT'\n : 'COSINE'\n\n const qBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(queryVector),\n }\n\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist\n FROM ${T}\n ORDER BY dist\n FETCH APPROX FIRST :k ROWS ONLY`,\n { q: qBind, k },\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n const storedVec = Array.from(row.VEC as Float32Array)\n const score = computeScore(storedVec, queryVector!, metric)\n result.push(this.#project(row, plan, score))\n }\n\n // Apply offset/slice after filtering\n return result.slice(offset, offset + plan.topK)\n } else {\n // Filter-scan: no KNN, read all rows\n const cap = 1000\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`,\n [cap],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n result.push(this.#project(row, plan, undefined))\n }\n return result.slice(offset, offset + plan.topK)\n }\n } catch (err: any) {\n if (err?.message && err.message.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, score?: number): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.ID as string\n if (proj.vector) out.vector = (Array.from(row.VEC as Float32Array) as number[]).map(Number)\n if (proj.document) out.document = (row.DOCUMENT ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA)\n if (score !== undefined) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const T = ident(this.#table(plan.collection))\n try {\n if (plan.ids && plan.ids.length > 0) {\n const ids = plan.ids\n const bindObj: any = {}\n ids.forEach((id, i) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n } else if (plan.filter) {\n const rows = await this.#conn!.execute(\n `SELECT id, metadata FROM ${T}`,\n {},\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n const targets = rows.rows\n .filter((r: any) => evaluateFilter(plan.filter!, this.#parseMeta(r.METADATA)))\n .map((r: any) => r.ID as string)\n if (targets.length > 0) {\n const bindObj: any = {}\n targets.forEach((id: string, i: number) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id: string, i: number) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n }\n } else {\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Score recomputation helpers (copied from couchbase/index.ts verbatim)\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n for (const [i, av] of a.entries()) {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n s += element * b[i]\n }\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n const d = element - b[i]\n s += d * d\n }\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oracle23ai.cjs","names":["#opts","#conn","#oracledb","#dims","#metrics","#table","#parseMeta","#project"],"sources":["../../../src/batteries/vector/oracle23ai/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/oracle23ai\n *\n * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column\n * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.\n * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata\n * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter\n * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted\n * identifiers for safety.\n *\n * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.\n * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.\n *\n * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to\n * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the\n * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.\n *\n * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst getOracle = async (): Promise<any> => {\n try {\n // oracledb ships no type declarations; import the specifier dynamically as untyped.\n const mod = await import(/* @vite-ignore */ 'oracledb' as string)\n return mod.default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['oracledb'])\n }\n}\n\n// Build a double-quoted Oracle identifier, safely escaping embedded double quotes.\nconst ident = (name: string): string => '\"' + name.replace(/\"/g, '\"\"') + '\"'\n\nexport interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: {\n connectString: string // 'host:1521/FREEPDB1'\n user: string\n password: string\n tablePrefix?: string // logical collection → `${tablePrefix}${collection}` table\n }\n}\n\nexport class Oracle23aiVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #oracledb: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): Oracle23aiVectorStoreOptions {\n return this.options as Oracle23aiVectorStoreOptions\n }\n\n // Map a logical collection name to its physical table (with optional prefix).\n #table(collection: string): string {\n const prefix = this.#opts.connection.tablePrefix ?? ''\n return prefix + collection\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#conn) return\n this.#oracledb = await getOracle()\n const c = this.#opts.connection\n try {\n this.#conn = await this.#oracledb.getConnection({\n user: c.user,\n password: c.password,\n connectString: c.connectString,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#conn) {\n await this.#conn.close()\n this.#conn = null\n this.#oracledb = null\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 async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const coll = spec.collection\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n this.#dims.set(coll, dims)\n this.#metrics.set(coll, metric)\n\n const T = ident(this.#table(coll))\n const tableName = this.#table(coll)\n\n try {\n // Check if table exists\n const checkRows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n const exists = checkRows.rows.length > 0\n\n if (exists) {\n if (ifNotExists) {\n // Clear existing table\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n return\n }\n // Drop and recreate\n await this.#conn!.execute(`DROP TABLE ${T}`)\n }\n\n // Create table\n const sql = `CREATE TABLE ${T} (\n id VARCHAR2(512) PRIMARY KEY,\n vec VECTOR(${dims}, FLOAT32),\n document CLOB,\n metadata CLOB\n )`\n await this.#conn!.execute(sql)\n await this.#conn!.commit()\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 const T = ident(this.#table(collection))\n try {\n await this.#conn!.execute(`DROP TABLE ${T}`)\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n if (err?.message && err.message.includes('ORA-00942')) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'table does not exist'])\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const tableName = this.#table(collection)\n const rows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n return rows.rows.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'oracle23ai'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n\n const T = ident(this.#table(plan.collection))\n\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\n const vecBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(vector),\n }\n\n const doc = r.document ?? ''\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n\n // MERGE upsert\n await this.#conn!.execute(\n `MERGE INTO ${T} d\n USING (SELECT :id AS id FROM dual) s\n ON (d.id = s.id)\n WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta\n WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)\n VALUES (:id, :vec, :doc, :meta)`,\n {\n id: r.id,\n vec: vecBind,\n doc,\n meta,\n },\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n }\n await this.#conn!.commit()\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const coll = plan.collection\n const metric: DistanceMetric = this.#metrics.get(coll) ?? this.#opts.metric ?? 'cosine'\n const T = ident(this.#table(coll))\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#conn!.execute(\n `SELECT vec FROM ${T} WHERE id = :id`,\n [plan.near.id],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: { VEC: { type: this.#oracledb!.DB_TYPE_VECTOR } },\n }\n )\n if (rows.rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n const arr = rows.rows[0].VEC as Float32Array\n queryVector = Array.from(arr)\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n const k = plan.filter ? 1000 : plan.topK + offset\n const metricSql =\n metric === 'cosine'\n ? 'COSINE'\n : metric === 'euclidean'\n ? 'EUCLIDEAN'\n : metric === 'dot'\n ? 'DOT'\n : 'COSINE'\n\n const qBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(queryVector),\n }\n\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist\n FROM ${T}\n ORDER BY dist\n FETCH APPROX FIRST :k ROWS ONLY`,\n { q: qBind, k },\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n const storedVec = Array.from(row.VEC as Float32Array)\n const score = computeScore(storedVec, queryVector!, metric)\n result.push(this.#project(row, plan, score))\n }\n\n // Apply offset/slice after filtering\n return result.slice(offset, offset + plan.topK)\n } else {\n // Filter-scan: no KNN, read all rows\n const cap = 1000\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`,\n [cap],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n result.push(this.#project(row, plan, undefined))\n }\n return result.slice(offset, offset + plan.topK)\n }\n } catch (err: any) {\n if (err?.message && err.message.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, score?: number): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.ID as string\n if (proj.vector) out.vector = (Array.from(row.VEC as Float32Array) as number[]).map(Number)\n if (proj.document) out.document = (row.DOCUMENT ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA)\n if (score !== undefined) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const T = ident(this.#table(plan.collection))\n try {\n if (plan.ids && plan.ids.length > 0) {\n const ids = plan.ids\n const bindObj: any = {}\n ids.forEach((id, i) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n } else if (plan.filter) {\n const rows = await this.#conn!.execute(\n `SELECT id, metadata FROM ${T}`,\n {},\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n const targets = rows.rows\n .filter((r: any) => evaluateFilter(plan.filter!, this.#parseMeta(r.METADATA)))\n .map((r: any) => r.ID as string)\n if (targets.length > 0) {\n const bindObj: any = {}\n targets.forEach((id: string, i: number) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id: string, i: number) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n }\n } else {\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Score recomputation helpers (copied from couchbase/index.ts verbatim)\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n for (const [i, av] of a.entries()) {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n s += element * b[i]\n }\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n const d = element - b[i]\n s += d * d\n }\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as isInstanceOf } from "../../tool_registry-
|
|
1
|
+
import { s as isInstanceOf } from "../../tool_registry-791Vrjtf.mjs";
|
|
2
2
|
import "../../guards.mjs";
|
|
3
3
|
import { evaluateFilter } from "./filters.mjs";
|
|
4
4
|
import { normalizeScore } from "./helpers.mjs";
|
|
@@ -60,6 +60,7 @@ var Oracle23aiVectorStore = class extends BaseVectorStore {
|
|
|
60
60
|
#table(collection) {
|
|
61
61
|
return (this.#opts.connection.tablePrefix ?? "") + collection;
|
|
62
62
|
}
|
|
63
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
63
64
|
static isAvailable() {
|
|
64
65
|
return typeof process !== "undefined";
|
|
65
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oracle23ai.mjs","names":["#opts","#conn","#oracledb","#dims","#metrics","#table","#parseMeta","#project"],"sources":["../../../src/batteries/vector/oracle23ai/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/oracle23ai\n *\n * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column\n * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.\n * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata\n * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter\n * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted\n * identifiers for safety.\n *\n * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.\n * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.\n *\n * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to\n * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the\n * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.\n *\n * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst getOracle = async (): Promise<any> => {\n try {\n // oracledb ships no type declarations; import the specifier dynamically as untyped.\n const mod = await import(/* @vite-ignore */ 'oracledb' as string)\n return mod.default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['oracledb'])\n }\n}\n\n// Build a double-quoted Oracle identifier, safely escaping embedded double quotes.\nconst ident = (name: string): string => '\"' + name.replace(/\"/g, '\"\"') + '\"'\n\nexport interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {\n connection: {\n connectString: string // 'host:1521/FREEPDB1'\n user: string\n password: string\n tablePrefix?: string // logical collection → `${tablePrefix}${collection}` table\n }\n}\n\nexport class Oracle23aiVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #oracledb: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): Oracle23aiVectorStoreOptions {\n return this.options as Oracle23aiVectorStoreOptions\n }\n\n // Map a logical collection name to its physical table (with optional prefix).\n #table(collection: string): string {\n const prefix = this.#opts.connection.tablePrefix ?? ''\n return prefix + collection\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#conn) return\n this.#oracledb = await getOracle()\n const c = this.#opts.connection\n try {\n this.#conn = await this.#oracledb.getConnection({\n user: c.user,\n password: c.password,\n connectString: c.connectString,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#conn) {\n await this.#conn.close()\n this.#conn = null\n this.#oracledb = null\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 async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const coll = spec.collection\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n this.#dims.set(coll, dims)\n this.#metrics.set(coll, metric)\n\n const T = ident(this.#table(coll))\n const tableName = this.#table(coll)\n\n try {\n // Check if table exists\n const checkRows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n const exists = checkRows.rows.length > 0\n\n if (exists) {\n if (ifNotExists) {\n // Clear existing table\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n return\n }\n // Drop and recreate\n await this.#conn!.execute(`DROP TABLE ${T}`)\n }\n\n // Create table\n const sql = `CREATE TABLE ${T} (\n id VARCHAR2(512) PRIMARY KEY,\n vec VECTOR(${dims}, FLOAT32),\n document CLOB,\n metadata CLOB\n )`\n await this.#conn!.execute(sql)\n await this.#conn!.commit()\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 const T = ident(this.#table(collection))\n try {\n await this.#conn!.execute(`DROP TABLE ${T}`)\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n if (err?.message && err.message.includes('ORA-00942')) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'table does not exist'])\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const tableName = this.#table(collection)\n const rows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n return rows.rows.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'oracle23ai'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n\n const T = ident(this.#table(plan.collection))\n\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\n const vecBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(vector),\n }\n\n const doc = r.document ?? ''\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n\n // MERGE upsert\n await this.#conn!.execute(\n `MERGE INTO ${T} d\n USING (SELECT :id AS id FROM dual) s\n ON (d.id = s.id)\n WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta\n WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)\n VALUES (:id, :vec, :doc, :meta)`,\n {\n id: r.id,\n vec: vecBind,\n doc,\n meta,\n },\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n }\n await this.#conn!.commit()\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const coll = plan.collection\n const metric: DistanceMetric = this.#metrics.get(coll) ?? this.#opts.metric ?? 'cosine'\n const T = ident(this.#table(coll))\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#conn!.execute(\n `SELECT vec FROM ${T} WHERE id = :id`,\n [plan.near.id],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: { VEC: { type: this.#oracledb!.DB_TYPE_VECTOR } },\n }\n )\n if (rows.rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n const arr = rows.rows[0].VEC as Float32Array\n queryVector = Array.from(arr)\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n const k = plan.filter ? 1000 : plan.topK + offset\n const metricSql =\n metric === 'cosine'\n ? 'COSINE'\n : metric === 'euclidean'\n ? 'EUCLIDEAN'\n : metric === 'dot'\n ? 'DOT'\n : 'COSINE'\n\n const qBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(queryVector),\n }\n\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist\n FROM ${T}\n ORDER BY dist\n FETCH APPROX FIRST :k ROWS ONLY`,\n { q: qBind, k },\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n const storedVec = Array.from(row.VEC as Float32Array)\n const score = computeScore(storedVec, queryVector!, metric)\n result.push(this.#project(row, plan, score))\n }\n\n // Apply offset/slice after filtering\n return result.slice(offset, offset + plan.topK)\n } else {\n // Filter-scan: no KNN, read all rows\n const cap = 1000\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`,\n [cap],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n result.push(this.#project(row, plan, undefined))\n }\n return result.slice(offset, offset + plan.topK)\n }\n } catch (err: any) {\n if (err?.message && err.message.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, score?: number): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.ID as string\n if (proj.vector) out.vector = (Array.from(row.VEC as Float32Array) as number[]).map(Number)\n if (proj.document) out.document = (row.DOCUMENT ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA)\n if (score !== undefined) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const T = ident(this.#table(plan.collection))\n try {\n if (plan.ids && plan.ids.length > 0) {\n const ids = plan.ids\n const bindObj: any = {}\n ids.forEach((id, i) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n } else if (plan.filter) {\n const rows = await this.#conn!.execute(\n `SELECT id, metadata FROM ${T}`,\n {},\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n const targets = rows.rows\n .filter((r: any) => evaluateFilter(plan.filter!, this.#parseMeta(r.METADATA)))\n .map((r: any) => r.ID as string)\n if (targets.length > 0) {\n const bindObj: any = {}\n targets.forEach((id: string, i: number) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id: string, i: number) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n }\n } else {\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Score recomputation helpers (copied from couchbase/index.ts verbatim)\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n for (const [i, av] of a.entries()) {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n s += element * b[i]\n }\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n const d = element - b[i]\n s += d * d\n }\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oracle23ai.mjs","names":["#opts","#conn","#oracledb","#dims","#metrics","#table","#parseMeta","#project"],"sources":["../../../src/batteries/vector/oracle23ai/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/oracle23ai\n *\n * Oracle 23ai AI Vector Search adapter. Vectors live in a `VECTOR(dims, FLOAT32)` column\n * written with `DB_TYPE_VECTOR` (oracledb thin mode, default) and read back as Float32Array.\n * KNN search uses `VECTOR_DISTANCE(vec, :q, COSINE|EUCLIDEAN|DOT)` ordered ascending. Metadata\n * is a CLOB containing a JSON string, filtered with the neutral evaluator for exact cross-adapter\n * parity. Each collection maps to a table named `<tablePrefix><collection>` with double-quoted\n * identifiers for safety.\n *\n * The connecting user must default to a non-SYSTEM tablespace (e.g. USERS) and have CREATE TABLE.\n * Oracle 23ai provides strong consistency: commits are synchronous, so there is no settle-poll.\n *\n * Score contract: do NOT trust the raw VECTOR_DISTANCE as a [0,1] score. Instead, use SQL only to\n * order candidates, then recompute the [0,1] similarity locally using the stored `vec` and the\n * computeScore helper, ensuring the [0,1] contract regardless of metric semantics.\n *\n * Driver: `oracledb` (pure-JS thin mode, no Instant Client required).\n */\n\nimport { evaluateFilter } from '../filters'\nimport { normalizeScore } from '../helpers'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { isInstanceOf } from '@nhtio/adk/guards'\nimport {\n E_VECTOR_STORE_DRIVER_UNAVAILABLE,\n E_VECTOR_STORE_CONNECTION_FAILED,\n E_VECTOR_STORE_COLLECTION_FAILED,\n E_VECTOR_STORE_UPSERT_FAILED,\n E_VECTOR_STORE_SEARCH_FAILED,\n E_VECTOR_STORE_DELETE_FAILED,\n E_VECTOR_STORE_DIMENSION_MISMATCH,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type {\n VectorMatch,\n VectorStoreCapabilities,\n BaseVectorStoreOptions,\n VectorMetadata,\n DistanceMetric,\n} from '../types'\n\nconst getOracle = async (): Promise<any> => {\n try {\n // oracledb ships no type declarations; import the specifier dynamically as untyped.\n const mod = await import(/* @vite-ignore */ 'oracledb' as string)\n return mod.default ?? mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['oracledb'])\n }\n}\n\n// Build a double-quoted Oracle identifier, safely escaping embedded double quotes.\nconst ident = (name: string): string => '\"' + name.replace(/\"/g, '\"\"') + '\"'\n\nexport interface Oracle23aiVectorStoreOptions extends BaseVectorStoreOptions {\n /** Connection and authentication parameters for the backend. */\n connection: {\n connectString: string // 'host:1521/FREEPDB1'\n user: string\n password: string\n tablePrefix?: string // logical collection → `${tablePrefix}${collection}` table\n }\n}\n\nexport class Oracle23aiVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: false,\n rawSql: false,\n builtInEncoding: false,\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n\n #oracledb: any | null = null\n #conn: any | null = null\n #dims: Map<string, number> = new Map()\n #metrics: Map<string, DistanceMetric> = new Map()\n\n get #opts(): Oracle23aiVectorStoreOptions {\n return this.options as Oracle23aiVectorStoreOptions\n }\n\n // Map a logical collection name to its physical table (with optional prefix).\n #table(collection: string): string {\n const prefix = this.#opts.connection.tablePrefix ?? ''\n return prefix + collection\n }\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#conn) return\n this.#oracledb = await getOracle()\n const c = this.#opts.connection\n try {\n this.#conn = await this.#oracledb.getConnection({\n user: c.user,\n password: c.password,\n connectString: c.connectString,\n })\n } catch (err) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([String(err)])\n }\n }\n\n async close(): Promise<void> {\n if (this.#conn) {\n await this.#conn.close()\n this.#conn = null\n this.#oracledb = null\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 async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n const coll = spec.collection\n const dims = spec.vector.dimensions\n const metric = spec.vector.metric\n this.#dims.set(coll, dims)\n this.#metrics.set(coll, metric)\n\n const T = ident(this.#table(coll))\n const tableName = this.#table(coll)\n\n try {\n // Check if table exists\n const checkRows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n const exists = checkRows.rows.length > 0\n\n if (exists) {\n if (ifNotExists) {\n // Clear existing table\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n return\n }\n // Drop and recreate\n await this.#conn!.execute(`DROP TABLE ${T}`)\n }\n\n // Create table\n const sql = `CREATE TABLE ${T} (\n id VARCHAR2(512) PRIMARY KEY,\n vec VECTOR(${dims}, FLOAT32),\n document CLOB,\n metadata CLOB\n )`\n await this.#conn!.execute(sql)\n await this.#conn!.commit()\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 const T = ident(this.#table(collection))\n try {\n await this.#conn!.execute(`DROP TABLE ${T}`)\n this.#dims.delete(collection)\n this.#metrics.delete(collection)\n } catch (err: any) {\n if (err?.message && err.message.includes('ORA-00942')) {\n if (ifExists) return\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', 'table does not exist'])\n }\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['dropCollection', String(err)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n const tableName = this.#table(collection)\n const rows = await this.#conn!.execute(\n `SELECT 1 FROM user_tables WHERE table_name = :n`,\n [tableName],\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n return rows.rows.length > 0\n }\n\n async renameCollection(_from: string, _to: string): Promise<void> {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['renameCollection', 'oracle23ai'])\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#opts.dimensions ?? this.#dims.get(plan.collection)\n\n const T = ident(this.#table(plan.collection))\n\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\n const vecBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(vector),\n }\n\n const doc = r.document ?? ''\n const meta = r.metadata ? JSON.stringify(r.metadata) : '{}'\n\n // MERGE upsert\n await this.#conn!.execute(\n `MERGE INTO ${T} d\n USING (SELECT :id AS id FROM dual) s\n ON (d.id = s.id)\n WHEN MATCHED THEN UPDATE SET vec = :vec, document = :doc, metadata = :meta\n WHEN NOT MATCHED THEN INSERT (id, vec, document, metadata)\n VALUES (:id, :vec, :doc, :meta)`,\n {\n id: r.id,\n vec: vecBind,\n doc,\n meta,\n },\n { outFormat: this.#oracledb!.OUT_FORMAT_OBJECT }\n )\n }\n await this.#conn!.commit()\n } catch (err) {\n if (\n isInstanceOf(err, 'E_VECTOR_STORE_DIMENSION_MISMATCH', E_VECTOR_STORE_DIMENSION_MISMATCH) ||\n isInstanceOf(err, 'E_VECTOR_STORE_UPSERT_FAILED', E_VECTOR_STORE_UPSERT_FAILED)\n ) {\n throw err\n }\n throw new E_VECTOR_STORE_UPSERT_FAILED([String(err)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const coll = plan.collection\n const metric: DistanceMetric = this.#metrics.get(coll) ?? this.#opts.metric ?? 'cosine'\n const T = ident(this.#table(coll))\n\n let queryVector: number[] | undefined\n if (plan.near) {\n if ('vector' in plan.near) {\n queryVector = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n queryVector = v\n } else if ('id' in plan.near) {\n const rows = await this.#conn!.execute(\n `SELECT vec FROM ${T} WHERE id = :id`,\n [plan.near.id],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: { VEC: { type: this.#oracledb!.DB_TYPE_VECTOR } },\n }\n )\n if (rows.rows.length === 0) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['Referenced id not found: ' + plan.near.id])\n }\n const arr = rows.rows[0].VEC as Float32Array\n queryVector = Array.from(arr)\n }\n }\n\n const offset = plan.offset ?? 0\n\n try {\n if (queryVector) {\n const k = plan.filter ? 1000 : plan.topK + offset\n const metricSql =\n metric === 'cosine'\n ? 'COSINE'\n : metric === 'euclidean'\n ? 'EUCLIDEAN'\n : metric === 'dot'\n ? 'DOT'\n : 'COSINE'\n\n const qBind = {\n type: this.#oracledb!.DB_TYPE_VECTOR,\n val: Float32Array.from(queryVector),\n }\n\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata, VECTOR_DISTANCE(vec, :q, ${metricSql}) AS dist\n FROM ${T}\n ORDER BY dist\n FETCH APPROX FIRST :k ROWS ONLY`,\n { q: qBind, k },\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n const storedVec = Array.from(row.VEC as Float32Array)\n const score = computeScore(storedVec, queryVector!, metric)\n result.push(this.#project(row, plan, score))\n }\n\n // Apply offset/slice after filtering\n return result.slice(offset, offset + plan.topK)\n } else {\n // Filter-scan: no KNN, read all rows\n const cap = 1000\n const rows = await this.#conn!.execute(\n `SELECT id, vec, document, metadata FROM ${T} FETCH FIRST :cap ROWS ONLY`,\n [cap],\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n DOCUMENT: { type: this.#oracledb!.STRING },\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n\n const result: VectorMatch[] = []\n for (const row of rows.rows) {\n const meta = this.#parseMeta(row.METADATA)\n if (plan.filter && !evaluateFilter(plan.filter, meta)) {\n continue\n }\n result.push(this.#project(row, plan, undefined))\n }\n return result.slice(offset, offset + plan.topK)\n }\n } catch (err: any) {\n if (err?.message && err.message.includes('Referenced id not found')) {\n throw err\n }\n throw new E_VECTOR_STORE_SEARCH_FAILED([String(err)])\n }\n }\n\n #project(row: any, plan: SearchPlan, score?: number): VectorMatch {\n const proj = plan.projection\n const out: VectorMatch = {}\n if (proj.id) out.id = row.ID as string\n if (proj.vector) out.vector = (Array.from(row.VEC as Float32Array) as number[]).map(Number)\n if (proj.document) out.document = (row.DOCUMENT ?? undefined) as string | undefined\n if (proj.metadata) out.metadata = this.#parseMeta(row.METADATA)\n if (score !== undefined) out.score = score\n return out\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const T = ident(this.#table(plan.collection))\n try {\n if (plan.ids && plan.ids.length > 0) {\n const ids = plan.ids\n const bindObj: any = {}\n ids.forEach((id, i) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${ids.map((_id, i) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n } else if (plan.filter) {\n const rows = await this.#conn!.execute(\n `SELECT id, metadata FROM ${T}`,\n {},\n {\n outFormat: this.#oracledb!.OUT_FORMAT_OBJECT,\n fetchInfo: {\n METADATA: { type: this.#oracledb!.STRING },\n },\n }\n )\n const targets = rows.rows\n .filter((r: any) => evaluateFilter(plan.filter!, this.#parseMeta(r.METADATA)))\n .map((r: any) => r.ID as string)\n if (targets.length > 0) {\n const bindObj: any = {}\n targets.forEach((id: string, i: number) => {\n bindObj['id' + i] = id\n })\n const sql = `DELETE FROM ${T} WHERE id IN (${targets.map((_id: string, i: number) => ':id' + i).join(', ')})`\n await this.#conn!.execute(sql, bindObj)\n await this.#conn!.commit()\n }\n } else {\n await this.#conn!.execute(`DELETE FROM ${T}`)\n await this.#conn!.commit()\n }\n } catch (err) {\n throw new E_VECTOR_STORE_DELETE_FAILED([String(err)])\n }\n }\n}\n\n// Score recomputation helpers (copied from couchbase/index.ts verbatim)\n\nconst cosineSim = (a: number[], b: number[]): number => {\n let dot = 0\n let normA = 0\n let normB = 0\n for (const [i, av] of a.entries()) {\n const bv = b[i]\n dot += av * bv\n normA += av * av\n normB += bv * bv\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\nconst dotProd = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n s += element * b[i]\n }\n return s\n}\n\nconst euclideanDist = (a: number[], b: number[]): number => {\n let s = 0\n for (const [i, element] of a.entries()) {\n const d = element - b[i]\n s += d * d\n }\n return Math.sqrt(s)\n}\n\nconst computeScore = (vec: number[], query: number[], metric: DistanceMetric): number => {\n if (metric === 'cosine') {\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n } else if (metric === 'dot') {\n const raw = dotProd(vec, query)\n return normalizeScore(raw, 'dot', 'similarity')\n } else if (metric === 'euclidean') {\n const raw = euclideanDist(vec, query)\n return normalizeScore(raw, 'euclidean', 'distance')\n } else {\n // Fallback\n const raw = cosineSim(vec, query)\n return normalizeScore(raw, 'cosine', 'similarity')\n }\n}\n"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ export interface OramaVectorStoreOptions extends BaseVectorStoreOptions {
|
|
|
9
9
|
export declare class OramaVectorStore extends BaseVectorStore {
|
|
10
10
|
#private;
|
|
11
11
|
readonly capabilities: VectorStoreCapabilities;
|
|
12
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
12
13
|
static isAvailable(): boolean;
|
|
13
14
|
isAvailable(): boolean;
|
|
14
15
|
connect(): Promise<void>;
|
|
@@ -26,6 +26,7 @@ var OramaVectorStore = class extends require_batteries_vector_contract.BaseVecto
|
|
|
26
26
|
#dims = /* @__PURE__ */ new Map();
|
|
27
27
|
#orama = null;
|
|
28
28
|
#dbs = /* @__PURE__ */ new Map();
|
|
29
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
29
30
|
static isAvailable() {
|
|
30
31
|
return true;
|
|
31
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orama.cjs","names":["#orama","#dbs","#collections","#dims","#coll","#getDb","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/orama/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/orama\n */\n\nimport { clamp01 } from '../helpers'\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface OramaVectorStoreOptions extends BaseVectorStoreOptions {}\n\nexport class OramaVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n #orama: any | null = null\n #dbs = new Map<string, any>()\n\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n\n async connect(): Promise<void> {\n if (!this.#orama) {\n try {\n const mod = await import('@orama/orama')\n this.#orama = mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@orama/orama'])\n }\n }\n }\n\n async close(): Promise<void> {\n this.#dbs.clear()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (this.#orama) {\n const db = this.#orama.create({\n schema: {\n embedding: `vector[${spec.vector.dimensions}]`,\n metadataJson: 'string',\n },\n })\n this.#dbs.set(spec.collection, db)\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n this.#dbs.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n const db = this.#dbs.get(from)\n if (db) {\n this.#dbs.set(to, db)\n this.#dbs.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n #getDb(collection: string): any {\n return this.#dbs.get(collection)\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n const row: StoredRow = {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n }\n m.set(r.id, row)\n if (db) {\n const doc: any = {\n id: r.id,\n metadataJson: JSON.stringify(row.metadata ?? {}),\n embedding: vector,\n }\n await this.#orama.insert(db, doc)\n }\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n if (db) {\n for (const id of plan.ids) await this.#orama.remove(db, id)\n }\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter!, (row.metadata ?? {}) as any)) {\n m.delete(id)\n if (db) await this.#orama.remove(db, id)\n }\n }\n return\n }\n m.clear()\n if (db) {\n const allIds = this.#orama.select(db, { limit: 10000 })\n if (allIds.hits) {\n for (const h of allIds.hits) await this.#orama.remove(db, h.id)\n }\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n let rows = [...m.values()]\n let scored: { row: StoredRow; score?: number }[]\n\n if (plan.near && 'vector' in plan.near) {\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: plan.near.vector, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n } else {\n rows = rows.filter(() => true)\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n if (db && qv) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row }))\n }\n\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return clamp01(raw)\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return clamp01(raw)\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return clamp01(1 / (1 + raw))\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"orama.cjs","names":["#orama","#dbs","#collections","#dims","#coll","#getDb","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/orama/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/orama\n */\n\nimport { clamp01 } from '../helpers'\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface OramaVectorStoreOptions extends BaseVectorStoreOptions {}\n\nexport class OramaVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n #orama: any | null = null\n #dbs = new Map<string, any>()\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n\n async connect(): Promise<void> {\n if (!this.#orama) {\n try {\n const mod = await import('@orama/orama')\n this.#orama = mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@orama/orama'])\n }\n }\n }\n\n async close(): Promise<void> {\n this.#dbs.clear()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (this.#orama) {\n const db = this.#orama.create({\n schema: {\n embedding: `vector[${spec.vector.dimensions}]`,\n metadataJson: 'string',\n },\n })\n this.#dbs.set(spec.collection, db)\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n this.#dbs.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n const db = this.#dbs.get(from)\n if (db) {\n this.#dbs.set(to, db)\n this.#dbs.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n #getDb(collection: string): any {\n return this.#dbs.get(collection)\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n const row: StoredRow = {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n }\n m.set(r.id, row)\n if (db) {\n const doc: any = {\n id: r.id,\n metadataJson: JSON.stringify(row.metadata ?? {}),\n embedding: vector,\n }\n await this.#orama.insert(db, doc)\n }\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n if (db) {\n for (const id of plan.ids) await this.#orama.remove(db, id)\n }\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter!, (row.metadata ?? {}) as any)) {\n m.delete(id)\n if (db) await this.#orama.remove(db, id)\n }\n }\n return\n }\n m.clear()\n if (db) {\n const allIds = this.#orama.select(db, { limit: 10000 })\n if (allIds.hits) {\n for (const h of allIds.hits) await this.#orama.remove(db, h.id)\n }\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n let rows = [...m.values()]\n let scored: { row: StoredRow; score?: number }[]\n\n if (plan.near && 'vector' in plan.near) {\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: plan.near.vector, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n } else {\n rows = rows.filter(() => true)\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n if (db && qv) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row }))\n }\n\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return clamp01(raw)\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return clamp01(raw)\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return clamp01(1 / (1 + raw))\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ var OramaVectorStore = class extends BaseVectorStore {
|
|
|
24
24
|
#dims = /* @__PURE__ */ new Map();
|
|
25
25
|
#orama = null;
|
|
26
26
|
#dbs = /* @__PURE__ */ new Map();
|
|
27
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
27
28
|
static isAvailable() {
|
|
28
29
|
return true;
|
|
29
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orama.mjs","names":["#orama","#dbs","#collections","#dims","#coll","#getDb","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/orama/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/orama\n */\n\nimport { clamp01 } from '../helpers'\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface OramaVectorStoreOptions extends BaseVectorStoreOptions {}\n\nexport class OramaVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n #orama: any | null = null\n #dbs = new Map<string, any>()\n\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n\n async connect(): Promise<void> {\n if (!this.#orama) {\n try {\n const mod = await import('@orama/orama')\n this.#orama = mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@orama/orama'])\n }\n }\n }\n\n async close(): Promise<void> {\n this.#dbs.clear()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (this.#orama) {\n const db = this.#orama.create({\n schema: {\n embedding: `vector[${spec.vector.dimensions}]`,\n metadataJson: 'string',\n },\n })\n this.#dbs.set(spec.collection, db)\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n this.#dbs.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n const db = this.#dbs.get(from)\n if (db) {\n this.#dbs.set(to, db)\n this.#dbs.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n #getDb(collection: string): any {\n return this.#dbs.get(collection)\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n const row: StoredRow = {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n }\n m.set(r.id, row)\n if (db) {\n const doc: any = {\n id: r.id,\n metadataJson: JSON.stringify(row.metadata ?? {}),\n embedding: vector,\n }\n await this.#orama.insert(db, doc)\n }\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n if (db) {\n for (const id of plan.ids) await this.#orama.remove(db, id)\n }\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter!, (row.metadata ?? {}) as any)) {\n m.delete(id)\n if (db) await this.#orama.remove(db, id)\n }\n }\n return\n }\n m.clear()\n if (db) {\n const allIds = this.#orama.select(db, { limit: 10000 })\n if (allIds.hits) {\n for (const h of allIds.hits) await this.#orama.remove(db, h.id)\n }\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n let rows = [...m.values()]\n let scored: { row: StoredRow; score?: number }[]\n\n if (plan.near && 'vector' in plan.near) {\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: plan.near.vector, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n } else {\n rows = rows.filter(() => true)\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n if (db && qv) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row }))\n }\n\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return clamp01(raw)\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return clamp01(raw)\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return clamp01(1 / (1 + raw))\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"orama.mjs","names":["#orama","#dbs","#collections","#dims","#coll","#getDb","#cosineLikeScore","#scoreVec","#project","#dot"],"sources":["../../../src/batteries/vector/orama/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/orama\n */\n\nimport { clamp01 } from '../helpers'\nimport { evaluateFilter } from '../filters'\nimport { BaseVectorStore } from '../contract'\nimport { validateRecords } from '../validation'\nimport { E_VECTOR_STORE_DRIVER_UNAVAILABLE, E_VECTOR_STORE_DIMENSION_MISMATCH } from '../exceptions'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec, Projection } from '../plan'\n\ninterface StoredRow {\n id: string\n vector?: number[]\n document?: string\n metadata?: Record<string, unknown>\n}\n\nexport interface OramaVectorStoreOptions extends BaseVectorStoreOptions {}\n\nexport class OramaVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: false,\n namedVectors: false,\n rename: true,\n rawSql: false,\n builtInEncoding: false,\n // Strongly consistent: a write is visible on resolve, so the option is a no-op.\n consistency: { configurable: false, default: 'strong', modes: ['strong'] },\n }\n #collections = new Map<string, Map<string, StoredRow>>()\n #dims = new Map<string, number>()\n #orama: any | null = null\n #dbs = new Map<string, any>()\n\n /** Static availability probe: whether this adapter's runtime driver can load in the current environment. */\n static isAvailable(): boolean {\n return true\n }\n isAvailable(): boolean {\n return true\n }\n\n async connect(): Promise<void> {\n if (!this.#orama) {\n try {\n const mod = await import('@orama/orama')\n this.#orama = mod\n } catch {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['@orama/orama'])\n }\n }\n }\n\n async close(): Promise<void> {\n this.#dbs.clear()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n if (this.#collections.has(spec.collection)) {\n if (!ifNotExists) {\n throw new Error(`Collection \"${spec.collection}\" already exists`)\n }\n return\n }\n this.#collections.set(spec.collection, new Map())\n this.#dims.set(spec.collection, spec.vector.dimensions)\n if (this.#orama) {\n const db = this.#orama.create({\n schema: {\n embedding: `vector[${spec.vector.dimensions}]`,\n metadataJson: 'string',\n },\n })\n this.#dbs.set(spec.collection, db)\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n if (!this.#collections.has(collection)) {\n if (!ifExists) {\n throw new Error(`Collection \"${collection}\" does not exist`)\n }\n return\n }\n this.#collections.delete(collection)\n this.#dims.delete(collection)\n this.#dbs.delete(collection)\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n return this.#collections.has(collection)\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n const m = this.#collections.get(from)\n if (!m) {\n throw new Error(`Collection \"${from}\" does not exist`)\n }\n if (this.#collections.has(to)) {\n throw new Error(`Collection \"${to}\" already exists`)\n }\n this.#collections.set(to, m)\n this.#collections.delete(from)\n const d = this.#dims.get(from)\n if (d !== undefined) {\n this.#dims.set(to, d)\n this.#dims.delete(from)\n }\n const db = this.#dbs.get(from)\n if (db) {\n this.#dbs.set(to, db)\n this.#dbs.delete(from)\n }\n }\n\n #coll(collection: string): Map<string, StoredRow> {\n let m = this.#collections.get(collection)\n if (!m) {\n m = new Map()\n this.#collections.set(collection, m)\n }\n return m\n }\n\n #getDb(collection: string): any {\n return this.#dbs.get(collection)\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n if (plan.records.length === 0) return\n validateRecords(plan.records)\n const expected = this.#dims.get(plan.collection)\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\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 && expected !== undefined && vector.length !== expected) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([expected, vector.length])\n }\n const row: StoredRow = {\n id: r.id,\n vector,\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n }\n m.set(r.id, row)\n if (db) {\n const doc: any = {\n id: r.id,\n metadataJson: JSON.stringify(row.metadata ?? {}),\n embedding: vector,\n }\n await this.#orama.insert(db, doc)\n }\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n if (plan.ids) {\n for (const id of plan.ids) m.delete(id)\n if (db) {\n for (const id of plan.ids) await this.#orama.remove(db, id)\n }\n return\n }\n if (plan.filter) {\n for (const [id, row] of [...m]) {\n if (evaluateFilter(plan.filter!, (row.metadata ?? {}) as any)) {\n m.delete(id)\n if (db) await this.#orama.remove(db, id)\n }\n }\n return\n }\n m.clear()\n if (db) {\n const allIds = this.#orama.select(db, { limit: 10000 })\n if (allIds.hits) {\n for (const h of allIds.hits) await this.#orama.remove(db, h.id)\n }\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n const m = this.#coll(plan.collection)\n const db = this.#getDb(plan.collection)\n let rows = [...m.values()]\n let scored: { row: StoredRow; score?: number }[]\n\n if (plan.near && 'vector' in plan.near) {\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: plan.near.vector, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n } else {\n rows = rows.filter(() => true)\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: this.#cosineLikeScore(plan.near as { vector: number[] }, row, plan),\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'serverText' in plan.near) {\n const [qv] = await this.encode([plan.near.serverText], 'query')\n if (db) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row, score: this.#scoreVec(qv, row.vector, plan) }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else if (plan.near && 'id' in plan.near) {\n const ref = m.get(plan.near.id)\n const qv = ref?.vector\n if (db && qv) {\n const r = await this.#orama.search(db, {\n mode: 'vector',\n vector: { value: qv, property: 'embedding' },\n limit: plan.topK + (plan.offset ?? 0),\n similarity: 0,\n })\n const ids = new Set(r.hits.map((h: any) => h.id))\n const idMap = new Map(rows.filter((row) => ids.has(row.id)).map((row) => [row.id, row]))\n rows = r.hits.map((h: any) => idMap.get(h.id)).filter(Boolean) as StoredRow[]\n }\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({\n row,\n score: qv ? this.#scoreVec(qv, row.vector, plan) : undefined,\n }))\n scored.sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n } else {\n if (plan.filter)\n rows = rows.filter((row) => evaluateFilter(plan.filter!, (row.metadata ?? {}) as any))\n scored = rows.map((row) => ({ row }))\n }\n\n const limited = scored.slice(plan.offset ?? 0, (plan.offset ?? 0) + plan.topK)\n return limited.map(({ row, score }) => this.#project(row, score, plan.projection))\n }\n\n #scoreVec(q: number[], v: number[] | undefined, _plan: SearchPlan): number | undefined {\n if (!v) return undefined\n const metric = this.options.metric ?? 'cosine'\n let raw: number\n if (metric === 'cosine') {\n const dot = this.#dot(q, v)\n const na = Math.sqrt(this.#dot(q, q))\n const nb = Math.sqrt(this.#dot(v, v))\n raw = na && nb ? dot / (na * nb) : 0\n return clamp01(raw)\n }\n if (metric === 'dot') {\n raw = this.#dot(q, v)\n return clamp01(raw)\n }\n let s = 0\n for (let i = 0; i < Math.min(q.length, v.length); i++) {\n const d = q[i] - v[i]\n s += d * d\n }\n raw = Math.sqrt(s)\n return clamp01(1 / (1 + raw))\n }\n\n #cosineLikeScore(\n near: { vector: number[] },\n row: StoredRow,\n plan: SearchPlan\n ): number | undefined {\n return this.#scoreVec(near.vector, row.vector, plan)\n }\n\n #dot(a: number[], b: number[]): number {\n let s = 0\n for (let i = 0; i < Math.min(a.length, b.length); i++) s += a[i] * b[i]\n return s\n }\n\n #project(row: StoredRow, score: number | undefined, p: Projection): VectorMatch {\n const out: VectorMatch = {}\n if (p.id) out.id = row.id\n if (score !== undefined) out.score = score\n if (p.vector && row.vector) out.vector = row.vector\n if (p.document && row.document !== undefined) out.document = row.document\n if (p.metadata && row.metadata !== undefined) out.metadata = row.metadata as any\n return out\n }\n}\n"],"mappings":"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"}
|
|
@@ -5,7 +5,9 @@ import { BaseVectorStore, CallableVectorStore } from "../contract";
|
|
|
5
5
|
import type { VectorFilter } from "../filters";
|
|
6
6
|
import type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from "../plan";
|
|
7
7
|
import type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from "../types";
|
|
8
|
-
|
|
8
|
+
/** Construction options for {@link PgVectorStore}. */
|
|
9
|
+
export interface PgVectorStoreOptions extends BaseVectorStoreOptions {
|
|
10
|
+
/** Connection details: a connection string, or a discrete host/port/credentials object. */
|
|
9
11
|
connection?: string | {
|
|
10
12
|
connectionString?: string;
|
|
11
13
|
host?: string;
|
|
@@ -14,9 +16,11 @@ interface PgVectorOptions extends BaseVectorStoreOptions {
|
|
|
14
16
|
password?: string;
|
|
15
17
|
database?: string;
|
|
16
18
|
};
|
|
19
|
+
/** An existing `pg` Pool/Client to reuse instead of constructing one from `connection`. */
|
|
17
20
|
pool?: any;
|
|
18
21
|
}
|
|
19
22
|
type PoolOrClient = any;
|
|
23
|
+
/** Translate a neutral {@link VectorFilter} into a parameterized SQL `WHERE` fragment plus its bind params. */
|
|
20
24
|
export declare const translatePgFilter: (filter: VectorFilter) => {
|
|
21
25
|
sql: string;
|
|
22
26
|
params: unknown[];
|
|
@@ -24,12 +28,15 @@ export declare const translatePgFilter: (filter: VectorFilter) => {
|
|
|
24
28
|
export declare class PgVectorStore extends BaseVectorStore {
|
|
25
29
|
#private;
|
|
26
30
|
readonly capabilities: VectorStoreCapabilities;
|
|
27
|
-
constructor(options:
|
|
31
|
+
constructor(options: PgVectorStoreOptions);
|
|
32
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
28
33
|
static isAvailable(): boolean;
|
|
29
34
|
isAvailable(): boolean;
|
|
30
35
|
connect(): Promise<void>;
|
|
31
36
|
close(): Promise<void>;
|
|
37
|
+
/** The active transaction client when inside a transaction, otherwise the connection pool. */
|
|
32
38
|
get clientOrPool(): PoolOrClient;
|
|
39
|
+
/** Ensure the pool is connected (idempotent); a no-op once connected. */
|
|
33
40
|
ensureConnected(): Promise<void>;
|
|
34
41
|
createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void>;
|
|
35
42
|
dropCollection(collection: string, ifExists: boolean): Promise<void>;
|
|
@@ -23,6 +23,7 @@ var METRIC_TO_OPERATOR = {
|
|
|
23
23
|
opclass: "vector_l2_ops"
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
|
+
/** Translate a neutral {@link VectorFilter} into a parameterized SQL `WHERE` fragment plus its bind params. */
|
|
26
27
|
var translatePgFilter = (filter) => {
|
|
27
28
|
const params = [];
|
|
28
29
|
const walk = (f) => {
|
|
@@ -119,6 +120,7 @@ var PgVectorStore = class extends require_batteries_vector_contract.BaseVectorSt
|
|
|
119
120
|
get #opts() {
|
|
120
121
|
return this.options;
|
|
121
122
|
}
|
|
123
|
+
/** Static availability probe: whether this adapter's runtime driver can load in the current environment. */
|
|
122
124
|
static isAvailable() {
|
|
123
125
|
return typeof process !== "undefined";
|
|
124
126
|
}
|
|
@@ -164,11 +166,13 @@ var PgVectorStore = class extends require_batteries_vector_contract.BaseVectorSt
|
|
|
164
166
|
this.#_pool = null;
|
|
165
167
|
this.#_txClient = null;
|
|
166
168
|
}
|
|
169
|
+
/** The active transaction client when inside a transaction, otherwise the connection pool. */
|
|
167
170
|
get clientOrPool() {
|
|
168
171
|
if (this.#_txClient) return this.#_txClient;
|
|
169
172
|
if (!this.#_pool) throw new Error("Not connected");
|
|
170
173
|
return this.#_pool;
|
|
171
174
|
}
|
|
175
|
+
/** Ensure the pool is connected (idempotent); a no-op once connected. */
|
|
172
176
|
async ensureConnected() {
|
|
173
177
|
await this.connect();
|
|
174
178
|
}
|