@nhtio/adk 1.20260604.0 → 1.20260607.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 +261 -0
- package/adk-mcp.mjs +1 -1
- package/batteries/embeddings/openai/adapter.cjs +1 -1
- package/batteries/embeddings/openai/adapter.mjs +1 -1
- package/batteries/embeddings/webllm/adapter.cjs +1 -1
- package/batteries/embeddings/webllm/adapter.mjs +1 -1
- package/batteries/index.d.ts +1 -0
- package/batteries/llm/openai_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/openai_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/openai_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/openai_chat_completions/helpers.cjs +2 -2
- package/batteries/llm/openai_chat_completions/helpers.mjs +2 -2
- 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/webllm_chat_completions/adapter.cjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/adapter.mjs +6 -6
- package/batteries/llm/webllm_chat_completions/adapter.mjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.cjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.cjs.map +1 -1
- package/batteries/llm/webllm_chat_completions/validation.mjs +2 -2
- package/batteries/llm/webllm_chat_completions/validation.mjs.map +1 -1
- package/batteries/storage/flydrive.cjs +1 -1
- package/batteries/storage/flydrive.mjs +2 -2
- package/batteries/storage/in_memory.cjs +1 -1
- package/batteries/storage/in_memory.mjs +1 -1
- package/batteries/storage/opfs.cjs +1 -1
- package/batteries/storage/opfs.mjs +1 -1
- package/batteries/tools/color.cjs +2 -2
- package/batteries/tools/color.mjs +2 -2
- package/batteries/tools/comparison.cjs +3 -3
- package/batteries/tools/comparison.mjs +3 -3
- package/batteries/tools/data_structure.cjs +3 -3
- package/batteries/tools/data_structure.mjs +3 -3
- package/batteries/tools/datetime_extended.cjs +2 -2
- package/batteries/tools/datetime_extended.mjs +2 -2
- package/batteries/tools/datetime_math.cjs +2 -2
- package/batteries/tools/datetime_math.mjs +2 -2
- package/batteries/tools/encoding.cjs +3 -3
- package/batteries/tools/encoding.mjs +3 -3
- package/batteries/tools/formatting.cjs +3 -3
- package/batteries/tools/formatting.mjs +3 -3
- package/batteries/tools/geo_basics.cjs +2 -2
- package/batteries/tools/geo_basics.mjs +2 -2
- package/batteries/tools/math/index.d.ts +16 -5
- package/batteries/tools/math.cjs +340 -22
- package/batteries/tools/math.cjs.map +1 -1
- package/batteries/tools/math.mjs +338 -21
- 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 +4 -4
- package/batteries/tools/parsing.mjs +4 -4
- package/batteries/tools/retrievables.cjs +4 -4
- package/batteries/tools/retrievables.mjs +4 -4
- package/batteries/tools/standing_instructions.cjs +4 -4
- package/batteries/tools/standing_instructions.mjs +4 -4
- package/batteries/tools/statistics.cjs +4 -4
- package/batteries/tools/statistics.mjs +4 -4
- package/batteries/tools/string_processing.cjs +3 -3
- package/batteries/tools/string_processing.mjs +3 -3
- package/batteries/tools/structured_data.cjs +3 -3
- package/batteries/tools/structured_data.mjs +3 -3
- 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 +2 -2
- package/batteries/tools/unit_conversion.mjs +2 -2
- package/batteries/vector/arangodb/index.d.ts +38 -0
- package/batteries/vector/arangodb.cjs +257 -0
- package/batteries/vector/arangodb.cjs.map +1 -0
- package/batteries/vector/arangodb.mjs +255 -0
- package/batteries/vector/arangodb.mjs.map +1 -0
- package/batteries/vector/builder.cjs +297 -0
- package/batteries/vector/builder.cjs.map +1 -0
- package/batteries/vector/builder.d.ts +87 -0
- package/batteries/vector/builder.mjs +294 -0
- package/batteries/vector/builder.mjs.map +1 -0
- package/batteries/vector/chroma/index.d.ts +32 -0
- package/batteries/vector/chroma.cjs +305 -0
- package/batteries/vector/chroma.cjs.map +1 -0
- package/batteries/vector/chroma.mjs +302 -0
- package/batteries/vector/chroma.mjs.map +1 -0
- package/batteries/vector/clickhouse/index.d.ts +39 -0
- package/batteries/vector/clickhouse.cjs +246 -0
- package/batteries/vector/clickhouse.cjs.map +1 -0
- package/batteries/vector/clickhouse.mjs +244 -0
- package/batteries/vector/clickhouse.mjs.map +1 -0
- package/batteries/vector/cloudflare/index.d.ts +43 -0
- package/batteries/vector/cloudflare.cjs +397 -0
- package/batteries/vector/cloudflare.cjs.map +1 -0
- package/batteries/vector/cloudflare.mjs +395 -0
- package/batteries/vector/cloudflare.mjs.map +1 -0
- package/batteries/vector/conformance/index.d.ts +15 -0
- package/batteries/vector/conformance.cjs +209 -0
- package/batteries/vector/conformance.cjs.map +1 -0
- package/batteries/vector/conformance.mjs +205 -0
- package/batteries/vector/conformance.mjs.map +1 -0
- package/batteries/vector/contract.cjs +42 -0
- package/batteries/vector/contract.cjs.map +1 -0
- package/batteries/vector/contract.d.ts +39 -0
- package/batteries/vector/contract.mjs +40 -0
- package/batteries/vector/contract.mjs.map +1 -0
- package/batteries/vector/couchbase/index.d.ts +49 -0
- package/batteries/vector/couchbase.cjs +401 -0
- package/batteries/vector/couchbase.cjs.map +1 -0
- package/batteries/vector/couchbase.mjs +399 -0
- package/batteries/vector/couchbase.mjs.map +1 -0
- package/batteries/vector/duckdb/index.d.ts +33 -0
- package/batteries/vector/duckdb.cjs +218 -0
- package/batteries/vector/duckdb.cjs.map +1 -0
- package/batteries/vector/duckdb.mjs +216 -0
- package/batteries/vector/duckdb.mjs.map +1 -0
- package/batteries/vector/elasticsearch/index.d.ts +43 -0
- package/batteries/vector/elasticsearch.cjs +306 -0
- package/batteries/vector/elasticsearch.cjs.map +1 -0
- package/batteries/vector/elasticsearch.mjs +303 -0
- package/batteries/vector/elasticsearch.mjs.map +1 -0
- package/batteries/vector/exceptions.cjs +126 -0
- package/batteries/vector/exceptions.cjs.map +1 -0
- package/batteries/vector/exceptions.d.ts +142 -0
- package/batteries/vector/exceptions.mjs +107 -0
- package/batteries/vector/exceptions.mjs.map +1 -0
- package/batteries/vector/factory.cjs +28 -0
- package/batteries/vector/factory.cjs.map +1 -0
- package/batteries/vector/factory.d.ts +38 -0
- package/batteries/vector/factory.mjs +25 -0
- package/batteries/vector/factory.mjs.map +1 -0
- package/batteries/vector/filters.cjs +107 -0
- package/batteries/vector/filters.cjs.map +1 -0
- package/batteries/vector/filters.d.ts +34 -0
- package/batteries/vector/filters.mjs +99 -0
- package/batteries/vector/filters.mjs.map +1 -0
- package/batteries/vector/helpers.cjs +23 -0
- package/batteries/vector/helpers.cjs.map +1 -0
- package/batteries/vector/helpers.d.ts +12 -0
- package/batteries/vector/helpers.mjs +17 -0
- package/batteries/vector/helpers.mjs.map +1 -0
- package/batteries/vector/hnswlib/index.d.ts +35 -0
- package/batteries/vector/hnswlib.cjs +237 -0
- package/batteries/vector/hnswlib.cjs.map +1 -0
- package/batteries/vector/hnswlib.mjs +235 -0
- package/batteries/vector/hnswlib.mjs.map +1 -0
- package/batteries/vector/in_memory/index.d.ts +23 -0
- package/batteries/vector/in_memory.cjs +178 -0
- package/batteries/vector/in_memory.cjs.map +1 -0
- package/batteries/vector/in_memory.mjs +176 -0
- package/batteries/vector/in_memory.mjs.map +1 -0
- package/batteries/vector/index.d.ts +18 -0
- package/batteries/vector/lancedb/index.d.ts +34 -0
- package/batteries/vector/lancedb.cjs +224 -0
- package/batteries/vector/lancedb.cjs.map +1 -0
- package/batteries/vector/lancedb.mjs +222 -0
- package/batteries/vector/lancedb.mjs.map +1 -0
- package/batteries/vector/mariadb/index.d.ts +39 -0
- package/batteries/vector/mariadb.cjs +228 -0
- package/batteries/vector/mariadb.cjs.map +1 -0
- package/batteries/vector/mariadb.mjs +226 -0
- package/batteries/vector/mariadb.mjs.map +1 -0
- package/batteries/vector/meilisearch/index.d.ts +36 -0
- package/batteries/vector/meilisearch.cjs +242 -0
- package/batteries/vector/meilisearch.cjs.map +1 -0
- package/batteries/vector/meilisearch.mjs +240 -0
- package/batteries/vector/meilisearch.mjs.map +1 -0
- package/batteries/vector/migrate.cjs +54 -0
- package/batteries/vector/migrate.cjs.map +1 -0
- package/batteries/vector/migrate.d.ts +30 -0
- package/batteries/vector/migrate.mjs +52 -0
- package/batteries/vector/migrate.mjs.map +1 -0
- package/batteries/vector/milvus/index.d.ts +35 -0
- package/batteries/vector/milvus.cjs +357 -0
- package/batteries/vector/milvus.cjs.map +1 -0
- package/batteries/vector/milvus.mjs +354 -0
- package/batteries/vector/milvus.mjs.map +1 -0
- package/batteries/vector/mongodb/index.d.ts +46 -0
- package/batteries/vector/mongodb.cjs +270 -0
- package/batteries/vector/mongodb.cjs.map +1 -0
- package/batteries/vector/mongodb.mjs +268 -0
- package/batteries/vector/mongodb.mjs.map +1 -0
- package/batteries/vector/neo4j/index.d.ts +38 -0
- package/batteries/vector/neo4j.cjs +231 -0
- package/batteries/vector/neo4j.cjs.map +1 -0
- package/batteries/vector/neo4j.mjs +229 -0
- package/batteries/vector/neo4j.mjs.map +1 -0
- package/batteries/vector/opensearch/index.d.ts +46 -0
- package/batteries/vector/opensearch.cjs +316 -0
- package/batteries/vector/opensearch.cjs.map +1 -0
- package/batteries/vector/opensearch.mjs +313 -0
- package/batteries/vector/opensearch.mjs.map +1 -0
- package/batteries/vector/oracle23ai/index.d.ts +45 -0
- package/batteries/vector/oracle23ai.cjs +340 -0
- package/batteries/vector/oracle23ai.cjs.map +1 -0
- package/batteries/vector/oracle23ai.mjs +338 -0
- package/batteries/vector/oracle23ai.mjs.map +1 -0
- package/batteries/vector/orama/index.d.ts +23 -0
- package/batteries/vector/orama.cjs +272 -0
- package/batteries/vector/orama.cjs.map +1 -0
- package/batteries/vector/orama.mjs +270 -0
- package/batteries/vector/orama.mjs.map +1 -0
- package/batteries/vector/pgvector/index.d.ts +43 -0
- package/batteries/vector/pgvector.cjs +411 -0
- package/batteries/vector/pgvector.cjs.map +1 -0
- package/batteries/vector/pgvector.mjs +408 -0
- package/batteries/vector/pgvector.mjs.map +1 -0
- package/batteries/vector/pinecone/index.d.ts +38 -0
- package/batteries/vector/pinecone.cjs +415 -0
- package/batteries/vector/pinecone.cjs.map +1 -0
- package/batteries/vector/pinecone.mjs +412 -0
- package/batteries/vector/pinecone.mjs.map +1 -0
- package/batteries/vector/plan.cjs +2 -0
- package/batteries/vector/plan.d.ts +65 -0
- package/batteries/vector/plan.mjs +0 -0
- package/batteries/vector/qdrant/index.d.ts +34 -0
- package/batteries/vector/qdrant.cjs +286 -0
- package/batteries/vector/qdrant.cjs.map +1 -0
- package/batteries/vector/qdrant.mjs +284 -0
- package/batteries/vector/qdrant.mjs.map +1 -0
- package/batteries/vector/redis/index.d.ts +44 -0
- package/batteries/vector/redis.cjs +391 -0
- package/batteries/vector/redis.cjs.map +1 -0
- package/batteries/vector/redis.mjs +388 -0
- package/batteries/vector/redis.mjs.map +1 -0
- package/batteries/vector/retrievable.cjs +69 -0
- package/batteries/vector/retrievable.cjs.map +1 -0
- package/batteries/vector/retrievable.mjs +67 -0
- package/batteries/vector/retrievable.mjs.map +1 -0
- package/batteries/vector/retrievable_glue.d.ts +24 -0
- package/batteries/vector/s3vectors/index.d.ts +52 -0
- package/batteries/vector/s3vectors.cjs +438 -0
- package/batteries/vector/s3vectors.cjs.map +1 -0
- package/batteries/vector/s3vectors.mjs +436 -0
- package/batteries/vector/s3vectors.mjs.map +1 -0
- package/batteries/vector/schema.cjs +96 -0
- package/batteries/vector/schema.cjs.map +1 -0
- package/batteries/vector/schema.d.ts +40 -0
- package/batteries/vector/schema.mjs +93 -0
- package/batteries/vector/schema.mjs.map +1 -0
- package/batteries/vector/solr/index.d.ts +36 -0
- package/batteries/vector/solr.cjs +230 -0
- package/batteries/vector/solr.cjs.map +1 -0
- package/batteries/vector/solr.mjs +228 -0
- package/batteries/vector/solr.mjs.map +1 -0
- package/batteries/vector/sqlite_vec/index.d.ts +30 -0
- package/batteries/vector/sqlite_vec.cjs +318 -0
- package/batteries/vector/sqlite_vec.cjs.map +1 -0
- package/batteries/vector/sqlite_vec.mjs +316 -0
- package/batteries/vector/sqlite_vec.mjs.map +1 -0
- package/batteries/vector/surrealdb/index.d.ts +37 -0
- package/batteries/vector/surrealdb.cjs +230 -0
- package/batteries/vector/surrealdb.cjs.map +1 -0
- package/batteries/vector/surrealdb.mjs +228 -0
- package/batteries/vector/surrealdb.mjs.map +1 -0
- package/batteries/vector/types.cjs +2 -0
- package/batteries/vector/types.d.ts +100 -0
- package/batteries/vector/types.mjs +0 -0
- package/batteries/vector/typesense/index.d.ts +38 -0
- package/batteries/vector/typesense.cjs +272 -0
- package/batteries/vector/typesense.cjs.map +1 -0
- package/batteries/vector/typesense.mjs +270 -0
- package/batteries/vector/typesense.mjs.map +1 -0
- package/batteries/vector/validation.cjs +90 -0
- package/batteries/vector/validation.cjs.map +1 -0
- package/batteries/vector/validation.d.ts +18 -0
- package/batteries/vector/validation.mjs +83 -0
- package/batteries/vector/validation.mjs.map +1 -0
- package/batteries/vector/vector_store_constructor.cjs +56 -0
- package/batteries/vector/vector_store_constructor.cjs.map +1 -0
- package/batteries/vector/vector_store_constructor.d.ts +30 -0
- package/batteries/vector/vector_store_constructor.mjs +53 -0
- package/batteries/vector/vector_store_constructor.mjs.map +1 -0
- package/batteries/vector/vespa/index.d.ts +39 -0
- package/batteries/vector/vespa.cjs +423 -0
- package/batteries/vector/vespa.cjs.map +1 -0
- package/batteries/vector/vespa.mjs +421 -0
- package/batteries/vector/vespa.mjs.map +1 -0
- package/batteries/vector/weaviate/index.d.ts +57 -0
- package/batteries/vector/weaviate.cjs +325 -0
- package/batteries/vector/weaviate.cjs.map +1 -0
- package/batteries/vector/weaviate.mjs +322 -0
- package/batteries/vector/weaviate.mjs.map +1 -0
- package/batteries/vector.cjs +63 -0
- package/batteries/vector.mjs +14 -0
- package/batteries.cjs +62 -0
- package/batteries.mjs +15 -1
- package/{chunk-kRvK8_k2.mjs → chunk-Bpcn9VDT.mjs} +5 -1
- package/{common-lMrnzoyn.mjs → common-BT0nfCi9.mjs} +8 -8
- package/{common-lMrnzoyn.mjs.map → common-BT0nfCi9.mjs.map} +1 -1
- package/{common-D_e5zYsG.js → common-Cj8TaQ9U.js} +8 -8
- package/{common-D_e5zYsG.js.map → common-Cj8TaQ9U.js.map} +1 -1
- package/common.cjs +7 -7
- package/common.mjs +7 -7
- package/{dispatch_runner-CpuyATj1.js → dispatch_runner-BHBNupqp.js} +2 -2
- package/dispatch_runner-BHBNupqp.js.map +1 -0
- package/{dispatch_runner-CDF3X0nv.mjs → dispatch_runner-DPcS7Y_M.mjs} +2 -2
- package/dispatch_runner-DPcS7Y_M.mjs.map +1 -0
- package/dispatch_runner.cjs +1 -1
- package/dispatch_runner.mjs +1 -1
- package/forge.cjs +4 -4
- package/forge.mjs +4 -4
- package/guards.cjs +8 -8
- package/guards.mjs +8 -8
- package/index.cjs +12 -12
- package/index.mjs +12 -12
- package/lib/classes/tool_registry.d.ts +70 -4
- package/mcp/adk-docs-corpus.json +1 -1
- package/package.json +424 -88
- package/skills/adk-assembly/SKILL.md +2 -2
- package/{spooled_artifact-B8gIIn9h.js → spooled_artifact-BTq6Nzfy.js} +4 -4
- package/spooled_artifact-BTq6Nzfy.js.map +1 -0
- package/{spooled_artifact-CWoKUDEm.mjs → spooled_artifact-CHoZgWwI.mjs} +4 -4
- package/spooled_artifact-CHoZgWwI.mjs.map +1 -0
- package/spooled_artifact.cjs +2 -2
- package/spooled_artifact.mjs +2 -2
- package/{spooled_markdown_artifact-DQX0RCdI.js → spooled_markdown_artifact-CALSDxIx.js} +3 -3
- package/{spooled_markdown_artifact-DQX0RCdI.js.map → spooled_markdown_artifact-CALSDxIx.js.map} +1 -1
- package/{spooled_markdown_artifact-CNle4jXN.mjs → spooled_markdown_artifact-Ci5UL7l4.mjs} +3 -3
- package/{spooled_markdown_artifact-CNle4jXN.mjs.map → spooled_markdown_artifact-Ci5UL7l4.mjs.map} +1 -1
- package/src/types/evaluatex.d.ts +31 -0
- package/{thought-BD6AkkOr.js → thought-BbwhJ1wb.js} +4 -4
- package/thought-BbwhJ1wb.js.map +1 -0
- package/{thought-B_P8LiB6.mjs → thought-D34QQZZ9.mjs} +4 -4
- package/thought-D34QQZZ9.mjs.map +1 -0
- package/{tool-CRZSUcdP.mjs → tool-CMhaDRNd.mjs} +3 -3
- package/tool-CMhaDRNd.mjs.map +1 -0
- package/{tool-CX9vNHAw.js → tool-CVyZkFC7.js} +3 -3
- package/tool-CVyZkFC7.js.map +1 -0
- package/{tool_call-BUeMuCc6.mjs → tool_call-CV5qVNlb.mjs} +3 -3
- package/{tool_call-BUeMuCc6.mjs.map → tool_call-CV5qVNlb.mjs.map} +1 -1
- package/{tool_call--7ti-frB.js → tool_call-Db68hB7y.js} +3 -3
- package/{tool_call--7ti-frB.js.map → tool_call-Db68hB7y.js.map} +1 -1
- package/{tool_registry-BGHg6KTq.mjs → tool_registry-D1pSSlsd.mjs} +109 -22
- package/tool_registry-D1pSSlsd.mjs.map +1 -0
- package/{tool_registry-CtCQ4Xoz.js → tool_registry-DYUYqXvo.js} +109 -22
- package/tool_registry-DYUYqXvo.js.map +1 -0
- package/{turn_runner-BJTtAORU.js → turn_runner-DqWHNP80.js} +5 -5
- package/turn_runner-DqWHNP80.js.map +1 -0
- package/{turn_runner-C02LZHjt.mjs → turn_runner-fg1Wc3dK.mjs} +5 -5
- package/turn_runner-fg1Wc3dK.mjs.map +1 -0
- package/turn_runner.cjs +1 -1
- package/turn_runner.mjs +1 -1
- package/dispatch_runner-CDF3X0nv.mjs.map +0 -1
- package/dispatch_runner-CpuyATj1.js.map +0 -1
- package/spooled_artifact-B8gIIn9h.js.map +0 -1
- package/spooled_artifact-CWoKUDEm.mjs.map +0 -1
- package/thought-BD6AkkOr.js.map +0 -1
- package/thought-B_P8LiB6.mjs.map +0 -1
- package/tool-CRZSUcdP.mjs.map +0 -1
- package/tool-CX9vNHAw.js.map +0 -1
- package/tool_registry-BGHg6KTq.mjs.map +0 -1
- package/tool_registry-CtCQ4Xoz.js.map +0 -1
- package/turn_runner-BJTtAORU.js.map +0 -1
- package/turn_runner-C02LZHjt.mjs.map +0 -1
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../chunk-Ble4zEEl.js");
|
|
3
|
+
const require_batteries_vector_filters = require("./filters.cjs");
|
|
4
|
+
const require_batteries_vector_helpers = require("./helpers.cjs");
|
|
5
|
+
const require_batteries_vector_exceptions = require("./exceptions.cjs");
|
|
6
|
+
const require_batteries_vector_contract = require("./contract.cjs");
|
|
7
|
+
const require_batteries_vector_validation = require("./validation.cjs");
|
|
8
|
+
//#region src/batteries/vector/pgvector/index.ts
|
|
9
|
+
/**
|
|
10
|
+
* @module @nhtio/adk/batteries/vector/pgvector
|
|
11
|
+
*/
|
|
12
|
+
var METRIC_TO_OPERATOR = {
|
|
13
|
+
cosine: {
|
|
14
|
+
op: "<=>",
|
|
15
|
+
opclass: "vector_cosine_ops"
|
|
16
|
+
},
|
|
17
|
+
dot: {
|
|
18
|
+
op: "<#>",
|
|
19
|
+
opclass: "vector_ip_ops"
|
|
20
|
+
},
|
|
21
|
+
euclidean: {
|
|
22
|
+
op: "<->",
|
|
23
|
+
opclass: "vector_l2_ops"
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var translatePgFilter = (filter) => {
|
|
27
|
+
const params = [];
|
|
28
|
+
const walk = (f) => {
|
|
29
|
+
if (require_batteries_vector_filters.isFilterCondition(f)) {
|
|
30
|
+
const { field, op, value } = f;
|
|
31
|
+
if (op === "exists") return value === void 0 || value === true ? `metadata ? '${field}'` : `NOT (metadata ? '${field}')`;
|
|
32
|
+
if (op === "contains") {
|
|
33
|
+
params.push(JSON.stringify(value));
|
|
34
|
+
return `metadata->>'${field}' @> $${params.length}::jsonb`;
|
|
35
|
+
}
|
|
36
|
+
if (op === "in" || op === "nin") {
|
|
37
|
+
params.push(Array.isArray(value) ? value : [value]);
|
|
38
|
+
return `${op === "nin" ? "NOT " : ""}(metadata->>'${field}' = ANY($${params.length}))`;
|
|
39
|
+
}
|
|
40
|
+
if (op === "eq") {
|
|
41
|
+
params.push(value);
|
|
42
|
+
return `metadata->>'${field}' = $${params.length}`;
|
|
43
|
+
}
|
|
44
|
+
if (op === "ne") {
|
|
45
|
+
params.push(value);
|
|
46
|
+
return `metadata->>'${field}' IS DISTINCT FROM $${params.length}`;
|
|
47
|
+
}
|
|
48
|
+
if ([
|
|
49
|
+
"gt",
|
|
50
|
+
"gte",
|
|
51
|
+
"lt",
|
|
52
|
+
"lte"
|
|
53
|
+
].includes(op)) {
|
|
54
|
+
params.push(Number(value));
|
|
55
|
+
return `(metadata->>'${field}')::numeric ${{
|
|
56
|
+
gt: ">",
|
|
57
|
+
gte: ">=",
|
|
58
|
+
lt: "<",
|
|
59
|
+
lte: "<="
|
|
60
|
+
}[op]} $${params.length}`;
|
|
61
|
+
}
|
|
62
|
+
throw new Error(`Unsupported filter operator: ${op}`);
|
|
63
|
+
}
|
|
64
|
+
if (require_batteries_vector_filters.isRawFilter(f)) {
|
|
65
|
+
const { $dialect, $raw, $bindings } = f;
|
|
66
|
+
if (typeof $raw === "string") {
|
|
67
|
+
if ($dialect !== "sql" && $dialect !== "pgvector") throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(["pgvector", String($dialect)]);
|
|
68
|
+
} else if ($raw !== void 0) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UNSUPPORTED_OPERATION(["raw-sql", "pgvector"]);
|
|
69
|
+
const rawStr = typeof $raw === "string" ? $raw : String($raw);
|
|
70
|
+
const bindingCount = (rawStr.match(/\?/g) || []).length;
|
|
71
|
+
if ($bindings && $bindings.length !== bindingCount) throw new Error(`Raw fragment placeholder count (${bindingCount}) does not match bindings length (${$bindings?.length || 0})`);
|
|
72
|
+
if ($bindings && $bindings.length > 0) {
|
|
73
|
+
for (const $binding of $bindings) params.push($binding);
|
|
74
|
+
return rawStr.replace(/\?/g, () => `$${params.length}`);
|
|
75
|
+
}
|
|
76
|
+
return rawStr;
|
|
77
|
+
}
|
|
78
|
+
if (require_batteries_vector_filters.isFilterGroup(f)) {
|
|
79
|
+
const { and, or, not } = f;
|
|
80
|
+
if (and !== void 0) {
|
|
81
|
+
const parts = [];
|
|
82
|
+
for (const child of and) parts.push(walk(child));
|
|
83
|
+
return parts.length ? `(${parts.join(" AND ")})` : "";
|
|
84
|
+
}
|
|
85
|
+
if (or !== void 0) {
|
|
86
|
+
const parts = [];
|
|
87
|
+
for (const child of or) parts.push(walk(child));
|
|
88
|
+
return parts.length ? `(${parts.join(" OR ")})` : "";
|
|
89
|
+
}
|
|
90
|
+
if (not !== void 0) return `NOT (${walk(not)})`;
|
|
91
|
+
return "";
|
|
92
|
+
}
|
|
93
|
+
return "";
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
sql: walk(filter),
|
|
97
|
+
params
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
var PgVectorStore = class extends require_batteries_vector_contract.BaseVectorStore {
|
|
101
|
+
capabilities = {
|
|
102
|
+
transactions: true,
|
|
103
|
+
namedVectors: false,
|
|
104
|
+
rename: true,
|
|
105
|
+
rawSql: true,
|
|
106
|
+
builtInEncoding: false,
|
|
107
|
+
consistency: {
|
|
108
|
+
configurable: false,
|
|
109
|
+
default: "strong",
|
|
110
|
+
modes: ["strong"]
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
#_pool = null;
|
|
114
|
+
#_txClient = null;
|
|
115
|
+
#_externalPool = false;
|
|
116
|
+
constructor(options) {
|
|
117
|
+
super(options);
|
|
118
|
+
}
|
|
119
|
+
get #opts() {
|
|
120
|
+
return this.options;
|
|
121
|
+
}
|
|
122
|
+
static isAvailable() {
|
|
123
|
+
return typeof process !== "undefined";
|
|
124
|
+
}
|
|
125
|
+
isAvailable() {
|
|
126
|
+
return typeof process !== "undefined";
|
|
127
|
+
}
|
|
128
|
+
async connect() {
|
|
129
|
+
if (this.#_pool) return;
|
|
130
|
+
let pg;
|
|
131
|
+
try {
|
|
132
|
+
pg = await import("pg");
|
|
133
|
+
} catch (e) {
|
|
134
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DRIVER_UNAVAILABLE(["pg"]);
|
|
135
|
+
}
|
|
136
|
+
let pool;
|
|
137
|
+
if (this.#opts.pool) {
|
|
138
|
+
pool = this.#opts.pool;
|
|
139
|
+
this.#_externalPool = true;
|
|
140
|
+
} else {
|
|
141
|
+
const connectionConfig = this.#opts.connection;
|
|
142
|
+
if (typeof connectionConfig === "string") pool = new pg.Pool({ connectionString: connectionConfig });
|
|
143
|
+
else if (connectionConfig) pool = new pg.Pool(connectionConfig);
|
|
144
|
+
else pool = new pg.Pool();
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
await pool.query("SELECT 1");
|
|
148
|
+
} catch (e) {
|
|
149
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)]);
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
await pool.query("CREATE EXTENSION IF NOT EXISTS vector");
|
|
153
|
+
} catch (e) {
|
|
154
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)]);
|
|
155
|
+
}
|
|
156
|
+
this.#_pool = pool;
|
|
157
|
+
}
|
|
158
|
+
async close() {
|
|
159
|
+
if (this.#_txClient) {
|
|
160
|
+
this.#_txClient.release?.();
|
|
161
|
+
this.#_txClient = null;
|
|
162
|
+
}
|
|
163
|
+
if (this.#_pool && !this.#_externalPool) await this.#_pool.end();
|
|
164
|
+
this.#_pool = null;
|
|
165
|
+
this.#_txClient = null;
|
|
166
|
+
}
|
|
167
|
+
get clientOrPool() {
|
|
168
|
+
if (this.#_txClient) return this.#_txClient;
|
|
169
|
+
if (!this.#_pool) throw new Error("Not connected");
|
|
170
|
+
return this.#_pool;
|
|
171
|
+
}
|
|
172
|
+
async ensureConnected() {
|
|
173
|
+
await this.connect();
|
|
174
|
+
}
|
|
175
|
+
async createCollection(spec, ifNotExists) {
|
|
176
|
+
await this.ensureConnected();
|
|
177
|
+
const { collection, vector } = spec;
|
|
178
|
+
const { dimensions, metric } = vector;
|
|
179
|
+
const tbl = `"${collection}"`;
|
|
180
|
+
const { opclass } = METRIC_TO_OPERATOR[metric];
|
|
181
|
+
const has = await this.hasCollection(collection);
|
|
182
|
+
if (!ifNotExists && has) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["create", "collection exists"]);
|
|
183
|
+
const createTable = `
|
|
184
|
+
CREATE TABLE IF NOT EXISTS ${tbl} (
|
|
185
|
+
id TEXT PRIMARY KEY,
|
|
186
|
+
embedding vector(${dimensions}),
|
|
187
|
+
document TEXT,
|
|
188
|
+
metadata JSONB
|
|
189
|
+
)
|
|
190
|
+
`;
|
|
191
|
+
const createIndex = `
|
|
192
|
+
CREATE INDEX IF NOT EXISTS "${collection}_embedding_idx" ON ${tbl} USING hnsw (embedding ${opclass})
|
|
193
|
+
`;
|
|
194
|
+
try {
|
|
195
|
+
await this.#_pool.query(createTable);
|
|
196
|
+
await this.#_pool.query(createIndex);
|
|
197
|
+
} catch (e) {
|
|
198
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["create", e?.message ?? String(e)]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async dropCollection(collection, ifExists) {
|
|
202
|
+
await this.ensureConnected();
|
|
203
|
+
const tbl = `"${collection}"`;
|
|
204
|
+
if (!await this.hasCollection(collection)) {
|
|
205
|
+
if (!ifExists) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["drop", "collection does not exist"]);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const dropTbl = `DROP TABLE IF EXISTS ${tbl}`;
|
|
209
|
+
try {
|
|
210
|
+
await this.#_pool.query(dropTbl);
|
|
211
|
+
} catch (e) {
|
|
212
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["drop", e?.message ?? String(e)]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
async hasCollection(collection) {
|
|
216
|
+
await this.ensureConnected();
|
|
217
|
+
const check = `SELECT to_regclass($1) IS NOT NULL AS exists`;
|
|
218
|
+
try {
|
|
219
|
+
return (await this.#_pool.query(check, [collection])).rows[0]?.exists === true;
|
|
220
|
+
} catch {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async renameCollection(from, to) {
|
|
225
|
+
await this.ensureConnected();
|
|
226
|
+
if (!await this.hasCollection(from)) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["rename", "source collection does not exist"]);
|
|
227
|
+
if (await this.hasCollection(to)) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["rename", "target collection already exists"]);
|
|
228
|
+
const rename = `ALTER TABLE "${from}" RENAME TO "${to}"`;
|
|
229
|
+
try {
|
|
230
|
+
await this.#_pool.query(rename);
|
|
231
|
+
} catch (e) {
|
|
232
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_COLLECTION_FAILED(["rename", e?.message ?? String(e)]);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async executeUpsert(plan) {
|
|
236
|
+
await this.ensureConnected();
|
|
237
|
+
require_batteries_vector_validation.validateRecords(plan.records);
|
|
238
|
+
const tbl = `"${plan.collection}"`;
|
|
239
|
+
const dims = this.#opts.dimensions;
|
|
240
|
+
const resolvedRows = [];
|
|
241
|
+
for (const r of plan.records) {
|
|
242
|
+
let vector = r.vector;
|
|
243
|
+
if (!vector && r.document) {
|
|
244
|
+
const [v] = await this.encode([r.document], "document");
|
|
245
|
+
vector = v;
|
|
246
|
+
}
|
|
247
|
+
if (vector && dims !== void 0 && vector.length !== dims) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length]);
|
|
248
|
+
resolvedRows.push({
|
|
249
|
+
id: r.id,
|
|
250
|
+
vector: vector ?? [],
|
|
251
|
+
document: r.document,
|
|
252
|
+
metadata: r.metadata
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const sql = `
|
|
256
|
+
INSERT INTO ${tbl} (id, embedding, document, metadata)
|
|
257
|
+
VALUES ($1, $2::vector, $3, $4)
|
|
258
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
259
|
+
embedding = $2::vector,
|
|
260
|
+
document = $3,
|
|
261
|
+
metadata = $4
|
|
262
|
+
`;
|
|
263
|
+
const client = this.clientOrPool;
|
|
264
|
+
try {
|
|
265
|
+
for (const r of resolvedRows) {
|
|
266
|
+
const vecStr = "[" + r.vector.join(",") + "]";
|
|
267
|
+
await client.query(sql, [
|
|
268
|
+
r.id,
|
|
269
|
+
vecStr,
|
|
270
|
+
r.document ?? null,
|
|
271
|
+
JSON.stringify(r.metadata ?? {})
|
|
272
|
+
]);
|
|
273
|
+
}
|
|
274
|
+
} catch (e) {
|
|
275
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)]);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async executeSearch(plan) {
|
|
279
|
+
await this.ensureConnected();
|
|
280
|
+
const tbl = `"${plan.collection}"`;
|
|
281
|
+
const metric = this.options.metric ?? "euclidean";
|
|
282
|
+
const { op } = METRIC_TO_OPERATOR[metric];
|
|
283
|
+
const filterSql = plan.filter ? (() => {
|
|
284
|
+
const { sql, params } = translatePgFilter(plan.filter);
|
|
285
|
+
if (sql) return {
|
|
286
|
+
sql: ` AND ${sql}`,
|
|
287
|
+
params
|
|
288
|
+
};
|
|
289
|
+
return {
|
|
290
|
+
sql: "",
|
|
291
|
+
params: []
|
|
292
|
+
};
|
|
293
|
+
})() : {
|
|
294
|
+
sql: "",
|
|
295
|
+
params: []
|
|
296
|
+
};
|
|
297
|
+
try {
|
|
298
|
+
if (plan.near) {
|
|
299
|
+
let qvec;
|
|
300
|
+
if ("vector" in plan.near) qvec = plan.near.vector;
|
|
301
|
+
else if ("serverText" in plan.near) {
|
|
302
|
+
const [v] = await this.encode([plan.near.serverText], "query");
|
|
303
|
+
qvec = v;
|
|
304
|
+
} else if ("id" in plan.near) {
|
|
305
|
+
const id = plan.near.id;
|
|
306
|
+
const vecRes = await this.#_pool.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [id]);
|
|
307
|
+
if (vecRes.rows[0]?.embedding) {
|
|
308
|
+
const raw = vecRes.rows[0].embedding;
|
|
309
|
+
if (typeof raw === "string") qvec = raw.replace(/^\[|\]$/g, "").split(",").map((n) => Number.parseFloat(n.trim()));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (!qvec) throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED(["no query vector provided"]);
|
|
313
|
+
const vecStr = "[" + qvec.join(",") + "]";
|
|
314
|
+
const sql = `
|
|
315
|
+
SELECT id, document, metadata, embedding, embedding ${op} $1 AS distance
|
|
316
|
+
FROM ${tbl}
|
|
317
|
+
WHERE 1=1 ${filterSql.sql}
|
|
318
|
+
ORDER BY distance
|
|
319
|
+
LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}
|
|
320
|
+
`;
|
|
321
|
+
const { rows } = await this.#_pool.query(sql, [vecStr, ...filterSql.params]);
|
|
322
|
+
const results = [];
|
|
323
|
+
for (const row of rows) {
|
|
324
|
+
let distance = Number(row.distance);
|
|
325
|
+
let score;
|
|
326
|
+
if (metric === "dot") {
|
|
327
|
+
const inner = -distance;
|
|
328
|
+
score = require_batteries_vector_helpers.normalizeScore(inner, "dot", "similarity");
|
|
329
|
+
distance = inner;
|
|
330
|
+
} else score = require_batteries_vector_helpers.normalizeScore(distance, metric, "distance");
|
|
331
|
+
const parsedMeta = typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata;
|
|
332
|
+
const proj = {};
|
|
333
|
+
if (plan.projection.id) proj.id = row.id;
|
|
334
|
+
if (plan.projection.vector) {
|
|
335
|
+
const rawVec = row.embedding;
|
|
336
|
+
if (typeof rawVec === "string") proj.vector = rawVec.replace(/^\[|\]$/g, "").split(",").map((n) => Number.parseFloat(n.trim()));
|
|
337
|
+
}
|
|
338
|
+
if (plan.projection.document && row.document !== void 0) proj.document = row.document;
|
|
339
|
+
if (plan.projection.metadata && parsedMeta !== void 0) proj.metadata = parsedMeta;
|
|
340
|
+
if (score !== void 0) proj.score = score;
|
|
341
|
+
results.push(proj);
|
|
342
|
+
}
|
|
343
|
+
return results;
|
|
344
|
+
} else {
|
|
345
|
+
const sql = `
|
|
346
|
+
SELECT id, document, metadata, embedding
|
|
347
|
+
FROM ${tbl}
|
|
348
|
+
WHERE 1=1 ${filterSql.sql}
|
|
349
|
+
LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}
|
|
350
|
+
`;
|
|
351
|
+
const { rows } = await this.#_pool.query(sql, [...filterSql.params]);
|
|
352
|
+
const results = [];
|
|
353
|
+
for (const row of rows) {
|
|
354
|
+
const parsedMeta = typeof row.metadata === "string" ? JSON.parse(row.metadata) : row.metadata;
|
|
355
|
+
const proj = {};
|
|
356
|
+
if (plan.projection.id) proj.id = row.id;
|
|
357
|
+
if (plan.projection.vector) {
|
|
358
|
+
const vecRes = await this.#_pool.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [row.id]);
|
|
359
|
+
if (vecRes.rows[0]?.embedding) {
|
|
360
|
+
const rawVec = vecRes.rows[0].embedding;
|
|
361
|
+
if (typeof rawVec === "string") proj.vector = rawVec.replace(/^\[|\]$/g, "").split(",").map((n) => Number.parseFloat(n.trim()));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (plan.projection.document && row.document !== void 0) proj.document = row.document;
|
|
365
|
+
if (plan.projection.metadata && parsedMeta !== void 0) proj.metadata = parsedMeta;
|
|
366
|
+
results.push(proj);
|
|
367
|
+
}
|
|
368
|
+
return results;
|
|
369
|
+
}
|
|
370
|
+
} catch (e) {
|
|
371
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)]);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async executeDelete(plan) {
|
|
375
|
+
await this.ensureConnected();
|
|
376
|
+
const tbl = `"${plan.collection}"`;
|
|
377
|
+
try {
|
|
378
|
+
if (plan.ids && plan.ids.length > 0) {
|
|
379
|
+
const sql = `DELETE FROM ${tbl} WHERE id = ANY($1)`;
|
|
380
|
+
await this.#_pool.query(sql, [plan.ids]);
|
|
381
|
+
} else if (plan.filter) {
|
|
382
|
+
const { sql, params } = translatePgFilter(plan.filter);
|
|
383
|
+
const delSql = `DELETE FROM ${tbl}${sql ? ` WHERE ${sql}` : ""}`;
|
|
384
|
+
await this.#_pool.query(delSql, params);
|
|
385
|
+
} else await this.#_pool.query(`TRUNCATE TABLE ${tbl} RESTART IDENTITY`);
|
|
386
|
+
} catch (e) {
|
|
387
|
+
throw new require_batteries_vector_exceptions.E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)]);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
async transaction(fn) {
|
|
391
|
+
await this.ensureConnected();
|
|
392
|
+
const client = await this.#_pool.connect();
|
|
393
|
+
try {
|
|
394
|
+
await client.query("BEGIN");
|
|
395
|
+
this.#_txClient = client;
|
|
396
|
+
await fn(this.asCallable());
|
|
397
|
+
await client.query("COMMIT");
|
|
398
|
+
} catch (e) {
|
|
399
|
+
await client.query("ROLLBACK");
|
|
400
|
+
throw e;
|
|
401
|
+
} finally {
|
|
402
|
+
this.#_txClient = null;
|
|
403
|
+
client.release();
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
//#endregion
|
|
408
|
+
exports.PgVectorStore = PgVectorStore;
|
|
409
|
+
exports.translatePgFilter = translatePgFilter;
|
|
410
|
+
|
|
411
|
+
//# sourceMappingURL=pgvector.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgvector.cjs","names":["#opts","#_pool","#_externalPool","#_txClient"],"sources":["../../../src/batteries/vector/pgvector/index.ts"],"sourcesContent":["/**\n * @module @nhtio/adk/batteries/vector/pgvector\n */\n\nimport { normalizeScore } from '../helpers'\nimport { validateRecords } from '../validation'\nimport { BaseVectorStore, CallableVectorStore } from '../contract'\nimport { isFilterCondition, isRawFilter, isFilterGroup } from '../filters'\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_FILTER_OPERATOR,\n E_VECTOR_STORE_UNSUPPORTED_OPERATION,\n} from '../exceptions'\nimport type { VectorFilter } from '../filters'\nimport type { SearchPlan, UpsertPlan, DeletePlan, CollectionSpec } from '../plan'\nimport type { VectorMatch, VectorStoreCapabilities, BaseVectorStoreOptions } from '../types'\n\ninterface PgVectorOptions extends BaseVectorStoreOptions {\n connection?:\n | string\n | {\n connectionString?: string\n host?: string\n port?: number\n user?: string\n password?: string\n database?: string\n }\n pool?: any\n}\n\ninterface PGClient {\n query: (sql: string, params?: unknown[]) => Promise<{ rows: any[] }>\n release?: () => void\n}\n\ntype PoolOrClient = any\n\nconst METRIC_TO_OPERATOR: Record<string, { op: string; opclass: string }> = {\n cosine: { op: '<=>', opclass: 'vector_cosine_ops' },\n dot: { op: '<#>', opclass: 'vector_ip_ops' },\n euclidean: { op: '<->', opclass: 'vector_l2_ops' },\n}\n\nexport const translatePgFilter = (filter: VectorFilter): { sql: string; params: unknown[] } => {\n const params: unknown[] = []\n\n const walk = (f: VectorFilter): string => {\n if (isFilterCondition(f)) {\n const { field, op, value } = f\n\n if (op === 'exists') {\n const val = value === undefined || value === true\n return val ? `metadata ? '${field}'` : `NOT (metadata ? '${field}')`\n }\n\n if (op === 'contains') {\n params.push(JSON.stringify(value))\n return `metadata->>'${field}' @> $${params.length}::jsonb`\n }\n\n if (op === 'in' || op === 'nin') {\n params.push(Array.isArray(value) ? value : [value])\n const not = op === 'nin' ? 'NOT ' : ''\n return `${not}(metadata->>'${field}' = ANY($${params.length}))`\n }\n\n if (op === 'eq') {\n params.push(value)\n return `metadata->>'${field}' = $${params.length}`\n }\n\n if (op === 'ne') {\n params.push(value)\n return `metadata->>'${field}' IS DISTINCT FROM $${params.length}`\n }\n\n if (['gt', 'gte', 'lt', 'lte'].includes(op)) {\n params.push(Number(value))\n const opMap: Record<string, string> = { gt: '>', gte: '>=', lt: '<', lte: '<=' }\n return `(metadata->>'${field}')::numeric ${opMap[op]} $${params.length}`\n }\n\n throw new Error(`Unsupported filter operator: ${op}`)\n }\n\n if (isRawFilter(f)) {\n const { $dialect, $raw, $bindings } = f\n\n if (typeof $raw === 'string') {\n if ($dialect !== 'sql' && $dialect !== 'pgvector') {\n throw new E_VECTOR_STORE_UNSUPPORTED_FILTER_OPERATOR(['pgvector', String($dialect)])\n }\n } else if ($raw !== undefined) {\n throw new E_VECTOR_STORE_UNSUPPORTED_OPERATION(['raw-sql', 'pgvector'])\n }\n\n const rawStr = typeof $raw === 'string' ? $raw : String($raw)\n const bindingCount = (rawStr.match(/\\?/g) || []).length\n\n if ($bindings && $bindings.length !== bindingCount) {\n throw new Error(\n `Raw fragment placeholder count (${bindingCount}) does not match bindings length (${$bindings?.length || 0})`\n )\n }\n\n if ($bindings && $bindings.length > 0) {\n for (const $binding of $bindings) {\n params.push($binding)\n }\n return rawStr.replace(/\\?/g, () => `$${params.length}`)\n }\n\n return rawStr\n }\n\n if (isFilterGroup(f)) {\n const { and, or, not } = f\n\n if (and !== undefined) {\n const parts: string[] = []\n for (const child of and) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' AND ')})` : ''\n }\n\n if (or !== undefined) {\n const parts: string[] = []\n for (const child of or) {\n parts.push(walk(child))\n }\n return parts.length ? `(${parts.join(' OR ')})` : ''\n }\n\n if (not !== undefined) {\n return `NOT (${walk(not)})`\n }\n\n return ''\n }\n\n return ''\n }\n\n return { sql: walk(filter), params }\n}\n\nexport class PgVectorStore extends BaseVectorStore {\n readonly capabilities: VectorStoreCapabilities = {\n transactions: true,\n namedVectors: false,\n rename: true,\n rawSql: true,\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\n #_pool: PoolOrClient | null = null\n #_txClient: PGClient | null = null\n #_externalPool = false\n\n constructor(options: PgVectorOptions) {\n super(options)\n }\n\n get #opts(): PgVectorOptions {\n return this.options as PgVectorOptions\n }\n\n static isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n isAvailable(): boolean {\n return typeof process !== 'undefined'\n }\n\n async connect(): Promise<void> {\n if (this.#_pool) {\n return\n }\n\n let pg: any\n\n try {\n pg = await import('pg')\n } catch (e) {\n throw new E_VECTOR_STORE_DRIVER_UNAVAILABLE(['pg'])\n }\n\n let pool: any\n\n if (this.#opts.pool) {\n pool = this.#opts.pool\n this.#_externalPool = true\n } else {\n const connectionConfig = this.#opts.connection\n if (typeof connectionConfig === 'string') {\n pool = new pg.Pool({ connectionString: connectionConfig })\n } else if (connectionConfig) {\n pool = new pg.Pool(connectionConfig)\n } else {\n pool = new pg.Pool()\n }\n }\n\n try {\n await pool.query('SELECT 1')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n try {\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n } catch (e: any) {\n throw new E_VECTOR_STORE_CONNECTION_FAILED([e?.message ?? String(e)])\n }\n\n this.#_pool = pool\n }\n\n async close(): Promise<void> {\n if (this.#_txClient) {\n this.#_txClient.release?.()\n this.#_txClient = null\n }\n\n if (this.#_pool && !this.#_externalPool) {\n await this.#_pool.end()\n }\n\n this.#_pool = null\n this.#_txClient = null\n }\n\n get clientOrPool(): PoolOrClient {\n if (this.#_txClient) {\n return this.#_txClient\n }\n if (!this.#_pool) {\n throw new Error('Not connected')\n }\n return this.#_pool\n }\n\n async ensureConnected(): Promise<void> {\n await this.connect()\n }\n\n async createCollection(spec: CollectionSpec, ifNotExists: boolean): Promise<void> {\n await this.ensureConnected()\n const { collection, vector } = spec\n const { dimensions, metric } = vector\n const tbl = `\"${collection}\"`\n const { opclass } = METRIC_TO_OPERATOR[metric]\n\n const has = await this.hasCollection(collection)\n if (!ifNotExists && has) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', 'collection exists'])\n }\n\n const createTable = `\n CREATE TABLE IF NOT EXISTS ${tbl} (\n id TEXT PRIMARY KEY,\n embedding vector(${dimensions}),\n document TEXT,\n metadata JSONB\n )\n `\n const createIndex = `\n CREATE INDEX IF NOT EXISTS \"${collection}_embedding_idx\" ON ${tbl} USING hnsw (embedding ${opclass})\n `\n\n try {\n await this.#_pool!.query(createTable)\n await this.#_pool!.query(createIndex)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['create', e?.message ?? String(e)])\n }\n }\n\n async dropCollection(collection: string, ifExists: boolean): Promise<void> {\n await this.ensureConnected()\n const tbl = `\"${collection}\"`\n\n const has = await this.hasCollection(collection)\n if (!has) {\n if (!ifExists) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', 'collection does not exist'])\n }\n return\n }\n\n const dropTbl = `DROP TABLE IF EXISTS ${tbl}`\n try {\n await this.#_pool!.query(dropTbl)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['drop', e?.message ?? String(e)])\n }\n }\n\n async hasCollection(collection: string): Promise<boolean> {\n await this.ensureConnected()\n const check = `SELECT to_regclass($1) IS NOT NULL AS exists`\n try {\n const res = await this.#_pool!.query(check, [collection])\n return res.rows[0]?.exists === true\n } catch {\n return false\n }\n }\n\n async renameCollection(from: string, to: string): Promise<void> {\n await this.ensureConnected()\n const hasFrom = await this.hasCollection(from)\n if (!hasFrom) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'source collection does not exist'])\n }\n\n const hasTo = await this.hasCollection(to)\n if (hasTo) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', 'target collection already exists'])\n }\n\n const rename = `ALTER TABLE \"${from}\" RENAME TO \"${to}\"`\n try {\n await this.#_pool!.query(rename)\n } catch (e: any) {\n throw new E_VECTOR_STORE_COLLECTION_FAILED(['rename', e?.message ?? String(e)])\n }\n }\n\n async executeUpsert(plan: UpsertPlan): Promise<void> {\n await this.ensureConnected()\n validateRecords(plan.records)\n\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const dims = this.#opts.dimensions\n\n const resolvedRows: {\n id: string\n vector: number[]\n document?: string\n metadata?: Record<string, unknown>\n }[] = []\n\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\n if (vector && dims !== undefined && vector.length !== dims) {\n throw new E_VECTOR_STORE_DIMENSION_MISMATCH([dims, vector.length])\n }\n\n resolvedRows.push({\n id: r.id,\n vector: vector ?? [],\n document: r.document,\n metadata: r.metadata as Record<string, unknown> | undefined,\n })\n }\n\n const sql = `\n INSERT INTO ${tbl} (id, embedding, document, metadata)\n VALUES ($1, $2::vector, $3, $4)\n ON CONFLICT (id) DO UPDATE SET\n embedding = $2::vector,\n document = $3,\n metadata = $4\n `\n\n const client = this.clientOrPool\n try {\n for (const r of resolvedRows) {\n const vecStr = '[' + r.vector.join(',') + ']'\n await client.query(sql, [\n r.id,\n vecStr,\n r.document ?? null,\n JSON.stringify(r.metadata ?? {}),\n ])\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_UPSERT_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeSearch(plan: SearchPlan): Promise<VectorMatch[]> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n const metric = this.options.metric ?? 'euclidean'\n const { op } = METRIC_TO_OPERATOR[metric]\n\n const filterSql = plan.filter\n ? (() => {\n const { sql, params } = translatePgFilter(plan.filter)\n if (sql) {\n return { sql: ` AND ${sql}`, params }\n }\n return { sql: '', params: [] }\n })()\n : { sql: '', params: [] }\n\n try {\n if (plan.near) {\n let qvec: number[] | undefined\n\n if ('vector' in plan.near) {\n qvec = plan.near.vector\n } else if ('serverText' in plan.near) {\n const [v] = await this.encode([plan.near.serverText], 'query')\n qvec = v\n } else if ('id' in plan.near) {\n const id = plan.near.id\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const raw = vecRes.rows[0].embedding\n if (typeof raw === 'string') {\n const stripped = raw.replace(/^\\[|\\]$/g, '')\n qvec = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n\n if (!qvec) {\n throw new E_VECTOR_STORE_SEARCH_FAILED(['no query vector provided'])\n }\n\n const vecStr = '[' + qvec.join(',') + ']'\n const sql = `\n SELECT id, document, metadata, embedding, embedding ${op} $1 AS distance\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n ORDER BY distance\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [vecStr, ...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n let distance = Number(row.distance)\n\n let score: number | undefined\n if (metric === 'dot') {\n const inner = -distance\n score = normalizeScore(inner, 'dot', 'similarity')\n distance = inner\n } else {\n score = normalizeScore(distance, metric, 'distance')\n }\n\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const rawVec = row.embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n if (score !== undefined) proj.score = score\n\n results.push(proj)\n }\n\n return results\n } else {\n const sql = `\n SELECT id, document, metadata, embedding\n FROM ${tbl}\n WHERE 1=1 ${filterSql.sql}\n LIMIT ${plan.topK} OFFSET ${plan.offset ?? 0}\n `\n const { rows } = await this.#_pool!.query(sql, [...filterSql.params])\n\n const results: VectorMatch[] = []\n\n for (const row of rows) {\n const parsedMeta =\n typeof row.metadata === 'string' ? JSON.parse(row.metadata) : row.metadata\n\n const proj: VectorMatch = {}\n if (plan.projection.id) proj.id = row.id\n if (plan.projection.vector) {\n const vecRes = await this.#_pool!.query(`SELECT embedding FROM ${tbl} WHERE id = $1`, [\n row.id,\n ])\n if (vecRes.rows[0]?.embedding) {\n const rawVec = vecRes.rows[0].embedding\n if (typeof rawVec === 'string') {\n const stripped = rawVec.replace(/^\\[|\\]$/g, '')\n proj.vector = stripped.split(',').map((n) => Number.parseFloat(n.trim()))\n }\n }\n }\n if (plan.projection.document && row.document !== undefined) proj.document = row.document\n if (plan.projection.metadata && parsedMeta !== undefined) proj.metadata = parsedMeta\n\n results.push(proj)\n }\n\n return results\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_SEARCH_FAILED([e?.message ?? String(e)])\n }\n }\n\n async executeDelete(plan: DeletePlan): Promise<void> {\n await this.ensureConnected()\n const collection = plan.collection\n const tbl = `\"${collection}\"`\n\n try {\n if (plan.ids && plan.ids.length > 0) {\n const sql = `DELETE FROM ${tbl} WHERE id = ANY($1)`\n await this.#_pool!.query(sql, [plan.ids])\n } else if (plan.filter) {\n const { sql, params } = translatePgFilter(plan.filter)\n const whereClause = sql ? ` WHERE ${sql}` : ''\n const delSql = `DELETE FROM ${tbl}${whereClause}`\n await this.#_pool!.query(delSql, params)\n } else {\n await this.#_pool!.query(`TRUNCATE TABLE ${tbl} RESTART IDENTITY`)\n }\n } catch (e: any) {\n throw new E_VECTOR_STORE_DELETE_FAILED([e?.message ?? String(e)])\n }\n }\n\n async transaction(fn: (tx: CallableVectorStore) => Promise<void>): Promise<void> {\n await this.ensureConnected()\n\n const pool = this.#_pool!\n const client = await pool.connect()\n\n try {\n await client.query('BEGIN')\n this.#_txClient = client\n await fn(this.asCallable())\n await client.query('COMMIT')\n } catch (e) {\n await client.query('ROLLBACK')\n throw e\n } finally {\n this.#_txClient = null\n client.release()\n }\n }\n}\n"],"mappings":"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"}
|