@h-ai/vecdb 0.1.0-alpha.55 → 0.1.0-alpha.56
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/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { core, ok, err } from '@h-ai/core';
|
|
3
3
|
import { spawn } from 'child_process';
|
|
4
4
|
import { setTimeout } from 'timers/promises';
|
|
5
|
+
import { createRequire } from 'module';
|
|
5
6
|
import { createHash } from 'crypto';
|
|
6
7
|
|
|
7
8
|
// src/vecdb-config.ts
|
|
@@ -613,6 +614,7 @@ function createChromaProvider() {
|
|
|
613
614
|
vector: createBaseVectorOps(ctx, vectorDriver)
|
|
614
615
|
};
|
|
615
616
|
}
|
|
617
|
+
var require2 = createRequire(import.meta.url);
|
|
616
618
|
var logger2 = core.logger.child({ module: "vecdb", scope: "lancedb" });
|
|
617
619
|
function escapeLanceFilterValue(value) {
|
|
618
620
|
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/%/g, "\\%").replace(/_/g, "\\_");
|
|
@@ -621,9 +623,9 @@ function createLancedbProvider() {
|
|
|
621
623
|
let connection = null;
|
|
622
624
|
let config = null;
|
|
623
625
|
const collectionMetas = /* @__PURE__ */ new Map();
|
|
624
|
-
|
|
626
|
+
function loadLancedb() {
|
|
625
627
|
try {
|
|
626
|
-
const mod =
|
|
628
|
+
const mod = require2("@lancedb/lancedb");
|
|
627
629
|
return ok(mod);
|
|
628
630
|
} catch (error) {
|
|
629
631
|
logger2.error("Failed to load @lancedb/lancedb", { error });
|
|
@@ -843,7 +845,7 @@ function createLancedbProvider() {
|
|
|
843
845
|
return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM("vecdb_unsupportedType", { params: { type: cfg.type } }));
|
|
844
846
|
}
|
|
845
847
|
const lanceConfig = cfg;
|
|
846
|
-
const loadResult =
|
|
848
|
+
const loadResult = loadLancedb();
|
|
847
849
|
if (!loadResult.success)
|
|
848
850
|
return loadResult;
|
|
849
851
|
const lancedb = loadResult.data;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../messages/en-US.json","../messages/zh-CN.json","../src/vecdb-i18n.ts","../src/vecdb-config.ts","../src/vecdb-types.ts","../src/providers/vecdb-provider-base.ts","../src/providers/vecdb-provider-chroma.ts","../src/providers/vecdb-provider-lancedb.ts","../src/providers/vecdb-provider-pgvector.ts","../src/providers/vecdb-provider-qdrant.ts","../src/vecdb-main.ts"],"names":["core","err","ok","delay","logger","distanceToScore"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"Vector database not initialized, please call vecdb.init() first\",\n \"vecdb_initFailed\": \"Failed to initialize vector database: {error}\",\n \"vecdb_closeFailed\": \"Failed to close vector database: {error}\",\n \"vecdb_configError\": \"Vector database config validation failed: {error}\",\n \"vecdb_initInProgress\": \"Vector database initialization is already in progress\",\n \"vecdb_unsupportedType\": \"Unsupported vector database type: {type}\",\n \"vecdb_driverNotFound\": \"Vector database driver not installed: {driver}, please run pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"Failed to connect to vector database: {error}\",\n \"vecdb_collectionNotFound\": \"Collection not found: {name}\",\n \"vecdb_collectionAlreadyExists\": \"Collection already exists: {name}\",\n \"vecdb_dimensionMismatch\": \"Vector dimension mismatch: expected {expected}, actual {actual}\",\n \"vecdb_insertFailed\": \"Failed to insert vectors: {error}\",\n \"vecdb_deleteFailed\": \"Failed to delete vectors: {error}\",\n \"vecdb_updateFailed\": \"Failed to update vectors: {error}\",\n \"vecdb_queryFailed\": \"Failed to query vectors: {error}\",\n \"vecdb_indexBuildFailed\": \"Failed to build index: {error}\",\n \"vecdb_serializationFailed\": \"Serialization/deserialization failed: {error}\",\n \"vecdb_invalidDimension\": \"Invalid vector dimension: {dimension}, must be a positive integer\",\n \"vecdb_configPathRequired\": \"Database storage path is required\",\n \"vecdb_configDatabaseRequired\": \"Database name is required\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"向量数据库未初始化,请先调用 vecdb.init()\",\n \"vecdb_initFailed\": \"初始化向量数据库失败: {error}\",\n \"vecdb_closeFailed\": \"关闭向量数据库失败: {error}\",\n \"vecdb_configError\": \"向量数据库配置校验失败:{error}\",\n \"vecdb_initInProgress\": \"向量数据库初始化正在进行中\",\n \"vecdb_unsupportedType\": \"不支持的向量数据库类型: {type}\",\n \"vecdb_driverNotFound\": \"向量数据库驱动未安装: {driver},请执行 pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"连接向量数据库失败: {error}\",\n \"vecdb_collectionNotFound\": \"集合不存在: {name}\",\n \"vecdb_collectionAlreadyExists\": \"集合已存在: {name}\",\n \"vecdb_dimensionMismatch\": \"向量维度不匹配: 期望 {expected},实际 {actual}\",\n \"vecdb_insertFailed\": \"插入向量失败: {error}\",\n \"vecdb_deleteFailed\": \"删除向量失败: {error}\",\n \"vecdb_updateFailed\": \"更新向量失败: {error}\",\n \"vecdb_queryFailed\": \"查询向量失败: {error}\",\n \"vecdb_indexBuildFailed\": \"构建索引失败: {error}\",\n \"vecdb_serializationFailed\": \"序列化/反序列化失败: {error}\",\n \"vecdb_invalidDimension\": \"无效的向量维度: {dimension},必须为正整数\",\n \"vecdb_configPathRequired\": \"数据库存储路径不能为空\",\n \"vecdb_configDatabaseRequired\": \"数据库名称不能为空\"\n}\n","/**\n * @h-ai/vecdb — i18n\n *\n * 本文件提供向量数据库模块的 i18n 文案访问入口。\n * @module vecdb-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 向量数据库模块文案 Key 类型\n */\ntype VecdbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取向量数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n */\nexport const vecdbM = core.i18n.createMessageGetter<VecdbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/vecdb — 向量数据库配置 Schema\n *\n * 本文件定义向量数据库模块的错误码常量、Zod Schema 和配置类型。\n * 支持 LanceDB(默认)、pgvector、Qdrant、Chroma 四种后端。\n * @module vecdb-config\n */\n\nimport { z } from 'zod'\nimport { vecdbM } from './vecdb-i18n.js'\n// ─── 向量数据库类型枚举 ───\n\n/**\n * 向量数据库类型枚举\n *\n * 支持的向量数据库类型:\n * - `lancedb` — LanceDB 嵌入式向量数据库(默认)\n * - `pgvector` — PostgreSQL + pgvector 扩展\n * - `qdrant` — Qdrant 向量搜索引擎\n * - `chroma` — Chroma 向量数据库(支持嵌入式自动拉起本地服务)\n */\n/** 向量数据库类型 */\nexport type VecdbType = 'lancedb' | 'pgvector' | 'qdrant' | 'chroma'\n\n// ─── 距离度量 ───\n\n/**\n * 距离度量类型\n *\n * - `cosine` — 余弦相似度(默认,适用于文本嵌入)\n * - `euclidean` — 欧氏距离(L2)\n * - `dot` — 内积(点积)\n */\nexport const DistanceMetricSchema = z.enum(['cosine', 'euclidean', 'dot']).default('cosine')\n\n/** 距离度量类型 */\nexport type DistanceMetric = z.infer<typeof DistanceMetricSchema>\n\nexport const VecdbOperationLogConfigSchema = z.object({\n read: z.boolean().default(false),\n write: z.boolean().default(false),\n maxLength: z.number().int().min(0).default(1000),\n level: z.enum(['info', 'debug', 'trace']).default('debug'),\n})\n\nexport type VecdbOperationLogConfig = z.infer<typeof VecdbOperationLogConfigSchema>\n\nconst OperationLogConfigFieldSchema = {\n operationLog: VecdbOperationLogConfigSchema.optional(),\n}\n\n// ─── LanceDB 配置 ───\n\n/**\n * LanceDB 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'lancedb', path: './data/vecdb' }\n * ```\n */\nconst LancedbConfigSchema = z.object({\n type: z.literal('lancedb'),\n /** 数据库存储路径(本地目录) */\n path: z.string().min(1, vecdbM('vecdb_configPathRequired')),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** LanceDB 配置类型 */\nexport type LancedbConfig = z.infer<typeof LancedbConfigSchema>\n\n// ─── pgvector 配置 ───\n\n/**\n * pgvector 索引类型\n *\n * - `ivfflat` — IVFFlat 索引(适合中等规模数据)\n * - `hnsw` — HNSW 索引(适合大规模数据,检索速度更快)\n */\nconst PgvectorIndexTypeSchema = z.enum(['ivfflat', 'hnsw']).default('hnsw')\n\n/**\n * pgvector 配置 Schema\n *\n * @example\n * ```ts\n * // 使用连接字符串\n * { type: 'pgvector', url: 'postgres://user:pass@localhost:5432/mydb' }\n *\n * // 使用分开的字段\n * {\n * type: 'pgvector',\n * host: 'localhost',\n * port: 5432,\n * database: 'mydb',\n * user: 'admin',\n * password: 'secret'\n * }\n * ```\n */\nconst PgvectorConfigSchema = z.object({\n type: z.literal('pgvector'),\n /** 连接字符串(可选,优先使用) */\n url: z.string().optional(),\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口号(默认 5432) */\n port: z.number().int().min(1).max(65535).default(5432),\n /** 数据库名称 */\n database: z.string().min(1, vecdbM('vecdb_configDatabaseRequired')),\n /** 用户名 */\n user: z.string().optional(),\n /** 密码 */\n password: z.string().optional(),\n /** 索引类型(默认 hnsw) */\n indexType: PgvectorIndexTypeSchema.optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n /** 表名前缀(默认 'vec_') */\n tablePrefix: z.string().default('vec_'),\n ...OperationLogConfigFieldSchema,\n})\n\n/** pgvector 配置类型 */\nexport type PgvectorConfig = z.infer<typeof PgvectorConfigSchema>\n\n// ─── Qdrant 配置 ───\n\n/**\n * Qdrant 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'qdrant', url: 'http://localhost:6333' }\n * ```\n */\nconst QdrantConfigSchema = z.object({\n type: z.literal('qdrant'),\n /** Qdrant 服务器 URL */\n url: z.string().url().default('http://localhost:6333'),\n /** API Key(可选) */\n apiKey: z.string().optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** Qdrant 配置类型 */\nexport type QdrantConfig = z.infer<typeof QdrantConfigSchema>\n\n// ─── Chroma 配置 ───\n\n/**\n * Chroma 配置 Schema\n *\n * Chroma 在 Node 端只有 HTTP 客户端(无进程内嵌入式)。本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且不提供 `url` 时,init 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭;数据落地本地目录,无需手动启动服务。\n * - **直连**:提供 `url`(或已运行的 host:port)时,直接连接已有 Chroma 服务,不拉起进程。\n *\n * @example\n * ```ts\n * // 嵌入式(自动拉起本地服务)\n * { type: 'chroma', path: './data/chroma' }\n *\n * // 直连已有服务\n * { type: 'chroma', url: 'http://localhost:8000' }\n * ```\n */\nconst ChromaConfigSchema = z.object({\n type: z.literal('chroma'),\n /** 本地持久化路径(嵌入式模式:提供且无 url 时自动拉起本地服务) */\n path: z.string().optional(),\n /** 已有 Chroma 服务 URL(提供时直连,不自动拉起进程) */\n url: z.string().url().optional(),\n /** 主机(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口(默认 8000) */\n port: z.number().int().min(1).max(65535).default(8000),\n /** API Key(可选,连接受保护的 Chroma 服务时使用) */\n apiKey: z.string().optional(),\n /** 拉起本地服务的可执行命令(默认 'chroma',可指定绝对路径) */\n serverCommand: z.string().default('chroma'),\n /** 拉起本地服务的就绪等待超时(毫秒,默认 30000) */\n startupTimeout: z.number().int().positive().default(30_000),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** Chroma 配置类型 */\nexport type ChromaConfig = z.infer<typeof ChromaConfigSchema>\n\n// ─── 统一配置 ───\n\n/**\n * 统一向量数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同向量数据库类型的配置。\n */\nexport const VecdbConfigSchema = z.discriminatedUnion('type', [\n LancedbConfigSchema,\n PgvectorConfigSchema,\n QdrantConfigSchema,\n ChromaConfigSchema,\n])\n\n/** 向量数据库配置类型(判别联合体) */\nexport type VecdbConfig = z.infer<typeof VecdbConfigSchema>\n\n/**\n * 向量数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 vecdb.init)更适合接收 VecdbConfigInput。\n */\nexport type VecdbConfigInput = z.input<typeof VecdbConfigSchema>\n","/**\n * @h-ai/vecdb — 类型定义\n *\n * 本文件定义向量数据库模块的核心接口和类型(非配置相关)。\n * 配置相关类型请从 vecdb-config.ts 导入。\n * @module vecdb-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport { core } from '@h-ai/core'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\n/**\n * 向量数据库错误信息映射(错误码:HTTP状态码)。\n *\n * 完整错误码将自动生成为:`hai:vecdb:NNN`\n */\nconst VecdbErrorInfo = {\n CONNECTION_FAILED: '001:500',\n QUERY_FAILED: '002:500',\n COLLECTION_NOT_FOUND: '003:404',\n COLLECTION_ALREADY_EXISTS: '004:409',\n DIMENSION_MISMATCH: '005:400',\n INSERT_FAILED: '006:500',\n DELETE_FAILED: '007:500',\n UPDATE_FAILED: '008:500',\n INDEX_BUILD_FAILED: '009:500',\n NOT_INITIALIZED: '010:500',\n CONFIG_ERROR: '011:500',\n UNSUPPORTED_TYPE: '012:400',\n DRIVER_NOT_FOUND: '013:500',\n SERIALIZATION_FAILED: '014:500',\n} as const satisfies ErrorInfo\n\n/**\n * Vecdb 模块标准错误定义对象。\n */\nexport const HaiVecdbError = core.error.buildHaiErrorsDef('vecdb', VecdbErrorInfo)\n\n// ─── 向量文档 ───\n\n/**\n * 向量文档接口\n *\n * 表示一条存入向量数据库的记录,包含向量、文本内容和元数据。\n *\n * @example\n * ```ts\n * const doc: VectorDocument = {\n * id: 'doc-001',\n * vector: [0.1, 0.2, 0.3, ...],\n * content: '这是文档内容',\n * metadata: { source: 'wiki', page: 1 },\n * }\n * ```\n */\nexport interface VectorDocument {\n /** 文档唯一标识 */\n id: string\n /** 向量数据(浮点数组) */\n vector: number[]\n /** 文本内容(可选,用于存储原始文本) */\n content?: string\n /** 元数据(可选,用于存储附加信息) */\n metadata?: Record<string, unknown>\n}\n\n/**\n * 向量搜索选项\n *\n * @example\n * ```ts\n * const options: VectorSearchOptions = {\n * topK: 10,\n * filter: { source: 'wiki' },\n * minScore: 0.7,\n * }\n * ```\n */\nexport interface VectorSearchOptions {\n /** 返回的最大结果数(默认 10) */\n topK?: number\n /** 元数据过滤条件(键值对,精确匹配) */\n filter?: Record<string, unknown>\n /** 最低相似度阈值(0-1,低于此值的结果将被过滤) */\n minScore?: number\n}\n\n/**\n * 向量搜索结果\n *\n * 包含匹配的文档和相似度得分。\n *\n * @example\n * ```ts\n * const result: VectorSearchResult = {\n * id: 'doc-001',\n * score: 0.95,\n * content: '匹配的文档内容',\n * metadata: { source: 'wiki' },\n * }\n * ```\n */\nexport interface VectorSearchResult {\n /** 文档唯一标识 */\n id: string\n /** 相似度得分(0-1,越高越相似) */\n score: number\n /** 文本内容(如果存储时包含) */\n content?: string\n /** 元数据(如果存储时包含) */\n metadata?: Record<string, unknown>\n /** 原始向量(可选,默认不返回以节省传输) */\n vector?: number[]\n}\n\n// ─── 集合信息 ───\n\n/**\n * 集合信息接口\n *\n * 描述一个向量集合的元信息。\n *\n * @example\n * ```ts\n * const info: CollectionInfo = {\n * name: 'docs',\n * dimension: 1536,\n * metric: 'cosine',\n * count: 42,\n * }\n * ```\n */\nexport interface CollectionInfo {\n /** 集合名称 */\n name: string\n /** 向量维度 */\n dimension: number\n /** 距离度量类型 */\n metric: DistanceMetric\n /** 集合中的文档数量 */\n count: number\n}\n\n// ─── 操作接口 ───\n\n/**\n * 集合管理操作接口\n *\n * 通过 `vecdb.collection` 访问,管理向量集合的创建、删除和查询。\n *\n * @example\n * ```ts\n * // 创建集合\n * await vecdb.collection.create('my-docs', { dimension: 1536 })\n *\n * // 列出集合\n * const result = await vecdb.collection.list()\n * ```\n */\nexport interface CollectionOperations {\n /**\n * 创建集合\n *\n * @param name - 集合名称\n * @param options - 创建选项\n * @returns 成功返回 ok(undefined);集合已存在返回 COLLECTION_ALREADY_EXISTS\n */\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n\n /**\n * 删除集合\n *\n * @param name - 集合名称\n * @returns 成功返回 ok(undefined);集合不存在返回 COLLECTION_NOT_FOUND\n */\n drop: (name: string) => Promise<HaiResult<void>>\n\n /**\n * 判断集合是否存在\n *\n * @param name - 集合名称\n * @returns 存在返回 true,不存在返回 false\n */\n exists: (name: string) => Promise<HaiResult<boolean>>\n\n /**\n * 获取集合信息\n *\n * @param name - 集合名称\n * @returns 集合信息\n */\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n\n /**\n * 列出所有集合\n *\n * @returns 集合名称列表\n */\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 集合创建选项\n *\n * @example\n * ```ts\n * const options: CollectionCreateOptions = {\n * dimension: 1536,\n * metric: 'cosine',\n * }\n * ```\n */\nexport interface CollectionCreateOptions {\n /** 向量维度(必填) */\n dimension: number\n /** 距离度量(可选,默认使用全局配置中的 metric) */\n metric?: DistanceMetric\n}\n\n/**\n * 向量操作接口\n *\n * 通过 `vecdb.vector` 访问,管理向量文档的增删改查和搜索。\n *\n * @example\n * ```ts\n * // 插入向量\n * await vecdb.vector.insert('my-docs', [\n * { id: 'doc-1', vector: [...], content: '文档1' },\n * { id: 'doc-2', vector: [...], content: '文档2' },\n * ])\n *\n * // 搜索向量\n * const result = await vecdb.vector.search('my-docs', queryVector, { topK: 5 })\n * ```\n */\nexport interface VectorOperations {\n /**\n * 插入向量文档\n *\n * @param collection - 集合名称\n * @param documents - 文档列表\n * @returns 成功返回 ok(undefined)\n */\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 更新向量文档(按 id 匹配,整体替换)\n *\n * @param collection - 集合名称\n * @param documents - 待更新的文档(id 必须已存在)\n * @returns 成功返回 ok(undefined)\n */\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 删除向量文档\n *\n * @param collection - 集合名称\n * @param ids - 文档 ID 列表\n * @returns 成功返回 ok(undefined)\n */\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n\n /**\n * 向量搜索\n *\n * @param collection - 集合名称\n * @param vector - 查询向量\n * @param options - 搜索选项\n * @returns 搜索结果列表(按相似度降序排列)\n */\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n\n /**\n * 获取集合中的文档数量\n *\n * @param collection - 集合名称\n * @returns 文档数量\n */\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── VecdbFunctions 接口 ───\n\n/**\n * 向量数据库服务接口(通过 `vecdb` 对象访问)\n *\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * // 初始化(LanceDB)\n * await vecdb.init({ type: 'lancedb', path: './data/vecdb' })\n *\n * // 创建集合\n * await vecdb.collection.create('docs', { dimension: 1536 })\n *\n * // 插入向量\n * await vecdb.vector.insert('docs', [{ id: '1', vector: [...], content: '...' }])\n *\n * // 搜索\n * const result = await vecdb.vector.search('docs', queryVector, { topK: 5 })\n *\n * // 关闭\n * await vecdb.close()\n * ```\n */\nexport interface VecdbFunctions {\n /** 初始化向量数据库连接 */\n init: (config: VecdbConfigInput) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 当前脱敏配置快照(未初始化时为 null) */\n readonly config: VecdbConfig | null\n /**\n * 获取底层后端的原始连接信息(含凭证,未初始化时为 null)\n *\n * 供需要直连同一向量库的外部引擎(如 mem0 OSS)复用后端。返回值包含未脱敏的凭证,\n * 仅供同进程内集成使用,禁止写入日志或返回给外部调用方。\n */\n readonly rawConnection: VecdbConnection | null\n /** 是否已初始化 */\n readonly isInitialized: boolean\n /** 集合管理操作 */\n readonly collection: CollectionOperations\n /** 向量操作 */\n readonly vector: VectorOperations\n}\n\n/**\n * 向量库原始连接信息\n *\n * 由 `vecdb.rawConnection` 暴露,字段按后端类型填充。包含凭证,仅供同进程内集成使用。\n */\nexport interface VecdbConnection {\n /** 后端类型 */\n type: VecdbConfig['type']\n /** 服务 URL(qdrant) */\n url?: string\n /** API Key(qdrant) */\n apiKey?: string\n /** 主机(pgvector) */\n host?: string\n /** 端口(pgvector) */\n port?: number\n /** 数据库名(pgvector) */\n database?: string\n /** 用户名(pgvector) */\n user?: string\n /** 密码(pgvector) */\n password?: string\n /** 连接串(pgvector) */\n connectionString?: string\n /** 本地路径(lancedb) */\n path?: string\n}\n","/**\n * @h-ai/vecdb — Provider 共享基础层\n *\n * 将各 Provider 的共性逻辑抽取为统一实现:连接守卫、运行时异常捕获、HaiResult 包装。\n *\n * 各 Provider 只需提供 CollectionDriver / VectorDriver(原始操作适配器),\n * base 层统一处理初始化检查与 catch-all 安全网。\n * @module vecdb-provider-base\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\nimport type { VecdbConfig, VecdbOperationLogConfig } from '../vecdb-config.js'\nimport type {\n CollectionCreateOptions,\n CollectionInfo,\n CollectionOperations,\n VectorDocument,\n VectorOperations,\n VectorSearchOptions,\n VectorSearchResult,\n} from '../vecdb-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\n// ─── Provider 接口(内部,不暴露给模块消费者) ───\n\n/**\n * 向量数据库 Provider 接口\n *\n * 各后端实现需遵循此接口,提供统一的集合管理和向量操作能力。\n */\nexport interface VecdbProvider {\n /** Provider 名称标识 */\n readonly name: string\n /** 连接到向量数据库 */\n connect: (config: VecdbConfig) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 是否已连接 */\n isConnected: () => boolean\n /** 集合管理操作 */\n collection: CollectionOperations\n /** 向量操作 */\n vector: VectorOperations\n}\n\n// ─── 上下文与适配器接口 ───\n\n/** 操作上下文:由 Provider 在创建 ops 时传入 */\nexport interface VecdbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\n info: (msg: string, meta?: Record<string, unknown>) => void\n debug: (msg: string, meta?: Record<string, unknown>) => void\n trace: (msg: string, meta?: Record<string, unknown>) => void\n }\n /** 当前操作日志配置 */\n operationLog?: () => VecdbOperationLogConfig | undefined\n}\n\n/**\n * 集合操作原始适配器\n *\n * Provider 将引擎特定的集合管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合已存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n */\nexport interface CollectionDriver {\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n drop: (name: string) => Promise<HaiResult<void>>\n exists: (name: string) => Promise<HaiResult<boolean>>\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 向量操作原始适配器\n *\n * Provider 将引擎特定的向量管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合不存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n */\nexport interface VectorDriver {\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── 内部帮助 ───\n\ntype VecdbOperationCategory = 'read' | 'write'\n\nfunction stringifyOperationPayload(payload: unknown, maxLength: number): string {\n if (maxLength <= 0) {\n return ''\n }\n\n try {\n const text = JSON.stringify(payload, (_key, value: unknown) => {\n if (typeof value === 'bigint') {\n return value.toString()\n }\n if (typeof value === 'function') {\n return '[Function]'\n }\n return value\n })\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n catch {\n const text = String(payload)\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n}\n\nexport function logVecdbOperation(\n ctx: VecdbOpsContext,\n category: VecdbOperationCategory,\n operation: string,\n payload: unknown,\n): void {\n const config = ctx.operationLog?.()\n if (!config?.[category]) {\n return\n }\n\n ctx.logger[config.level]('VecDB operation executed', {\n category,\n operation,\n payload: stringifyOperationPayload(payload, config.maxLength),\n })\n}\n\n/** 根据错误定义获取对应的 i18n 错误消息 */\nfunction errorMsgFromCode(def: HaiErrorDef, errorStr: string): string {\n switch (def) {\n case HaiVecdbError.DELETE_FAILED:\n return vecdbM('vecdb_deleteFailed', { params: { error: errorStr } })\n case HaiVecdbError.INSERT_FAILED:\n return vecdbM('vecdb_insertFailed', { params: { error: errorStr } })\n case HaiVecdbError.UPDATE_FAILED:\n return vecdbM('vecdb_updateFailed', { params: { error: errorStr } })\n default:\n return vecdbM('vecdb_queryFailed', { params: { error: errorStr } })\n }\n}\n\n/**\n * 统一操作包装器:guard → delegate → catch-all\n *\n * 1. 连接守卫:未初始化时直接返回 NOT_INITIALIZED\n * 2. 委托给 driver 执行(driver 内部用 HaiResult 表达业务错误)\n * 3. catch-all 安全网:捕获 driver 未预期的运行时异常\n */\nasync function wrapOp<T>(\n ctx: VecdbOpsContext,\n fn: () => Promise<HaiResult<T>>,\n errorDef: HaiErrorDef,\n errorLabel: string,\n errorMeta?: Record<string, unknown>,\n): Promise<HaiResult<T>> {\n if (!ctx.isConnected()) {\n return err(HaiVecdbError.NOT_INITIALIZED, vecdbM('vecdb_notInitialized'))\n }\n try {\n return await fn()\n }\n catch (error) {\n ctx.logger.error(errorLabel, { ...errorMeta, error })\n return err(errorDef, errorMsgFromCode(errorDef, String(error)), error)\n }\n}\n\n// ─── 集合操作工厂 ───\n\n/**\n * 创建标准集合操作\n *\n * 各 Provider 只需提供 CollectionDriver,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseCollectionOps(ctx: VecdbOpsContext, driver: CollectionDriver): CollectionOperations {\n return {\n create: async (name, options) => {\n // 参数校验:dimension 必须为正整数(防止 pgvector SQL 插值注入)\n if (!Number.isInteger(options.dimension) || options.dimension <= 0) {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_invalidDimension', { params: { dimension: String(options.dimension) } }),\n )\n }\n logVecdbOperation(ctx, 'write', 'collection.create', { name, options })\n return wrapOp(\n ctx,\n () => driver.create(name, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to create collection',\n { name },\n )\n },\n drop: (name) => {\n logVecdbOperation(ctx, 'write', 'collection.drop', { name })\n return wrapOp(\n ctx,\n () => driver.drop(name),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to drop collection',\n { name },\n )\n },\n exists: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.exists', { name })\n return wrapOp(\n ctx,\n () => driver.exists(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to check collection',\n { name },\n )\n },\n info: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.info', { name })\n return wrapOp(\n ctx,\n () => driver.info(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to get collection info',\n { name },\n )\n },\n list: () => {\n logVecdbOperation(ctx, 'read', 'collection.list', {})\n return wrapOp(\n ctx,\n () => driver.list(),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to list collections',\n )\n },\n }\n}\n// ─── 向量操作工厂 ───\n\n/**\n * 创建标准向量操作\n *\n * 各 Provider 只需提供 VectorDriver,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseVectorOps(ctx: VecdbOpsContext, driver: VectorDriver): VectorOperations {\n return {\n insert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.insert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.insert(collection, documents),\n HaiVecdbError.INSERT_FAILED,\n 'Failed to insert vectors',\n { collection },\n )\n },\n upsert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.upsert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.upsert(collection, documents),\n HaiVecdbError.UPDATE_FAILED,\n 'Failed to upsert vectors',\n { collection },\n )\n },\n delete: (collection, ids) => {\n logVecdbOperation(ctx, 'write', 'vector.delete', { collection, count: ids.length, ids })\n return wrapOp(\n ctx,\n () => ids.length === 0 ? Promise.resolve(ok(undefined)) : driver.delete(collection, ids),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to delete vectors',\n { collection },\n )\n },\n search: (collection, vector, options) => {\n logVecdbOperation(ctx, 'read', 'vector.search', { collection, vector, options })\n return wrapOp(\n ctx,\n () => driver.search(collection, vector, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to search vectors',\n { collection },\n )\n },\n count: (collection) => {\n logVecdbOperation(ctx, 'read', 'vector.count', { collection })\n return wrapOp(\n ctx,\n () => driver.count(collection),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to count vectors',\n { collection },\n )\n },\n }\n}\n","/**\n * @h-ai/vecdb — Chroma Provider\n *\n * 基于 Chroma 向量数据库的 Provider 实现。Chroma 在 Node 端只有 HTTP 客户端,\n * 本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且无 `url` 时,connect 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭进程。\n * - **直连**:提供 `url` 时直接连接已有服务,不拉起进程。\n *\n * 向量由调用方显式提供,集合不使用 Chroma 内置 embedding function。\n * @module vecdb-provider-chroma\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChildProcess } from 'node:child_process'\nimport type { ChromaConfig, DistanceMetric } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { spawn } from 'node:child_process'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'chroma' })\nconst DIMENSION_METADATA_KEY = 'hai_dimension'\nconst SPACE_METADATA_KEY = 'hnsw:space'\nconst HEARTBEAT_POLL_INTERVAL = 300\n\n/** Chroma Collection 的最小接口定义(避免强依赖可选包) */\ninterface ChromaCollection {\n metadata?: Record<string, unknown> | null\n add: (params: ChromaWriteParams) => Promise<unknown>\n upsert: (params: ChromaWriteParams) => Promise<unknown>\n delete: (params: { ids: string[] }) => Promise<unknown>\n query: (params: { queryEmbeddings: number[][], nResults?: number, where?: Record<string, unknown> }) => Promise<ChromaQueryResult>\n count: () => Promise<number>\n}\n\ninterface ChromaWriteParams {\n ids: string[]\n embeddings: number[][]\n documents?: (string | null)[]\n metadatas?: (Record<string, unknown> | null)[]\n}\n\ninterface ChromaQueryResult {\n ids: string[][]\n distances?: (number[] | null)[] | null\n documents?: ((string | null)[] | null)[] | null\n metadatas?: ((Record<string, unknown> | null)[] | null)[] | null\n}\n\ninterface ChromaClient {\n heartbeat: () => Promise<number>\n getOrCreateCollection: (params: { name: string, metadata?: Record<string, unknown>, embeddingFunction?: unknown }) => Promise<ChromaCollection>\n getCollection: (params: { name: string, embeddingFunction?: unknown }) => Promise<ChromaCollection>\n deleteCollection: (params: { name: string }) => Promise<unknown>\n listCollections: () => Promise<Array<{ name: string } | string>>\n}\n\n/** Chroma 模块的最小接口 */\ninterface ChromaModule {\n ChromaClient: new (params: Record<string, unknown>) => ChromaClient\n}\n\nfunction isChromaModule(value: unknown): value is ChromaModule {\n return typeof value === 'object' && value !== null && typeof (value as { ChromaClient?: unknown }).ChromaClient === 'function'\n}\n\n/**\n * 占位 embedding function:本 Provider 始终显式传入向量,此函数不会被调用。\n * 提供它是为了避免 Chroma 在无 embedding function 时加载默认实现(需额外依赖)。\n */\nconst NOOP_EMBEDDING_FUNCTION = {\n name: 'hai-noop',\n async generate(): Promise<number[][]> {\n throw new Error('Chroma embedding function should not be called: vectors are provided explicitly')\n },\n}\n\n/** DistanceMetric → Chroma hnsw:space */\nfunction toChromaSpace(metric: DistanceMetric): string {\n if (metric === 'euclidean')\n return 'l2'\n if (metric === 'dot')\n return 'ip'\n return 'cosine'\n}\n\n/** Chroma hnsw:space → DistanceMetric */\nfunction fromChromaSpace(space: unknown): DistanceMetric {\n if (space === 'l2')\n return 'euclidean'\n if (space === 'ip')\n return 'dot'\n return 'cosine'\n}\n\n/** 将 Chroma 距离转换为相似度分数 [0, 1] */\nfunction distanceToScore(distance: number, metric: DistanceMetric): number {\n if (metric === 'cosine')\n return Math.max(0, Math.min(1, 1 - distance))\n return 1 / (1 + Math.max(0, distance))\n}\n\n/** 构建 Chroma where 过滤条件(单键直接匹配,多键用 $and) */\nfunction buildWhere(filter?: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!filter)\n return undefined\n const entries = Object.entries(filter)\n if (entries.length === 0)\n return undefined\n if (entries.length === 1)\n return { [entries[0][0]]: entries[0][1] }\n return { $and: entries.map(([key, value]) => ({ [key]: value })) }\n}\n\n/**\n * 创建 Chroma Provider\n */\nexport function createChromaProvider(): VecdbProvider {\n let client: ChromaClient | null = null\n let config: ChromaConfig | null = null\n let serverProcess: ChildProcess | null = null\n\n function isMissingModuleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes('chromadb')\n }\n\n /** 动态加载 Chroma JS 客户端 */\n async function loadChromaModule(): Promise<HaiResult<ChromaModule>> {\n try {\n const mod = await import('chromadb')\n if (!isChromaModule(mod)) {\n const error = new Error('chromadb driver module does not export ChromaClient')\n logger.error('Failed to load Chroma driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error)) {\n logger.error('Failed to load Chroma driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n throw error\n }\n }\n\n /** 拉起本地 Chroma 服务(嵌入式模式) */\n function startEmbeddedServer(chromaConfig: ChromaConfig): void {\n const args = ['run', '--path', chromaConfig.path ?? './data/chroma', '--host', chromaConfig.host, '--port', String(chromaConfig.port)]\n logger.info('Starting embedded Chroma server', { command: chromaConfig.serverCommand, host: chromaConfig.host, port: chromaConfig.port })\n const proc = spawn(chromaConfig.serverCommand, args, { stdio: 'ignore' })\n proc.on('error', (error: Error) => {\n logger.error('Chroma server process error', { error: error.message })\n })\n serverProcess = proc\n }\n\n /** 停止本地 Chroma 服务 */\n function stopEmbeddedServer(): void {\n if (!serverProcess)\n return\n try {\n serverProcess.kill()\n }\n catch (error) {\n logger.warn('Failed to stop Chroma server', { error: error instanceof Error ? error.message : String(error) })\n }\n serverProcess = null\n }\n\n /** 轮询心跳直至就绪或超时 */\n async function waitForHeartbeat(chromaClient: ChromaClient, timeout: number): Promise<void> {\n const deadline = Date.now() + timeout\n let lastError: unknown\n while (Date.now() < deadline) {\n try {\n await chromaClient.heartbeat()\n return\n }\n catch (error) {\n lastError = error\n await delay(HEARTBEAT_POLL_INTERVAL)\n }\n }\n throw new Error(`Chroma heartbeat timed out after ${timeout}ms: ${lastError instanceof Error ? lastError.message : String(lastError)}`)\n }\n\n /** 获取集合(含维度校验所需的 metadata) */\n async function getCollection(name: string): Promise<ChromaCollection> {\n return client!.getCollection({ name, embeddingFunction: NOOP_EMBEDDING_FUNCTION })\n }\n\n /** 读取集合存储的维度 */\n function readDimension(collection: ChromaCollection): number {\n const value = collection.metadata?.[DIMENSION_METADATA_KEY]\n return typeof value === 'number' ? value : 0\n }\n\n function validateDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === 0 || expected === actual)\n return null\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', { params: { expected: String(expected), actual: String(actual) } }),\n )\n }\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const existing = await client!.listCollections()\n const exists = existing.some(item => (typeof item === 'string' ? item : item.name) === name)\n if (exists)\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n await client!.getOrCreateCollection({\n name,\n metadata: { [SPACE_METADATA_KEY]: toChromaSpace(metric), [DIMENSION_METADATA_KEY]: options.dimension },\n embeddingFunction: NOOP_EMBEDDING_FUNCTION,\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n const existing = await client!.listCollections()\n const exists = existing.some(item => (typeof item === 'string' ? item : item.name) === name)\n if (!exists)\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n await client!.deleteCollection({ name })\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n const existing = await client!.listCollections()\n return ok(existing.some(item => (typeof item === 'string' ? item : item.name) === name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n const existing = await client!.listCollections()\n if (!existing.some(item => (typeof item === 'string' ? item : item.name) === name))\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n const collection = await getCollection(name)\n const count = await collection.count()\n return ok({\n name,\n dimension: readDimension(collection),\n metric: fromChromaSpace(collection.metadata?.[SPACE_METADATA_KEY]),\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n const existing = await client!.listCollections()\n return ok(existing.map(item => (typeof item === 'string' ? item : item.name)))\n },\n }\n\n // ─── 向量操作适配器 ───\n\n function toWriteParams(documents: { id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }[]): ChromaWriteParams {\n return {\n ids: documents.map(doc => doc.id),\n embeddings: documents.map(doc => doc.vector),\n documents: documents.map(doc => doc.content ?? null),\n metadatas: documents.map(doc => ({ ...doc.metadata, _content: doc.content ?? '' })),\n }\n }\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.add(toWriteParams(documents))\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.upsert(toWriteParams(documents))\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n const target = await getCollection(collection)\n await target.delete({ ids })\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const target = await getCollection(collection)\n const expected = readDimension(target)\n const validation = validateDimension<VectorSearchResult[]>(expected, vector.length)\n if (validation)\n return validation\n\n const metric = fromChromaSpace(target.metadata?.[SPACE_METADATA_KEY])\n const response = await target.query({ queryEmbeddings: [vector], nResults: topK, where: buildWhere(options?.filter) })\n\n const ids = response.ids[0] ?? []\n const distances = response.distances?.[0] ?? []\n const metadatas = response.metadatas?.[0] ?? []\n\n const results: VectorSearchResult[] = []\n for (let i = 0; i < ids.length; i++) {\n const score = distanceToScore(distances[i] ?? 0, metric)\n if (score < minScore)\n continue\n const metadata = metadatas[i] ?? {}\n const { _content, ...rest } = metadata\n results.push({\n id: ids[i],\n score,\n content: typeof _content === 'string' && _content.length > 0 ? _content : undefined,\n metadata: Object.keys(rest).length > 0 ? rest : undefined,\n })\n }\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n const target = await getCollection(collection)\n return ok(await target.count())\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'chroma',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'chroma')\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n\n const chromaConfig = cfg as ChromaConfig\n const embedded = !!chromaConfig.path && !chromaConfig.url\n\n const loadResult = await loadChromaModule()\n if (!loadResult.success)\n return loadResult\n\n try {\n if (embedded)\n startEmbeddedServer(chromaConfig)\n\n const clientParams: Record<string, unknown> = chromaConfig.url\n ? { path: chromaConfig.url }\n : { host: chromaConfig.host, port: chromaConfig.port }\n if (chromaConfig.apiKey)\n clientParams.auth = { provider: 'token', credentials: chromaConfig.apiKey, tokenHeaderType: 'AUTHORIZATION' }\n\n // chromadb 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n const chromaClient = new loadResult.data.ChromaClient(clientParams) as unknown as ChromaClient\n await waitForHeartbeat(chromaClient, embedded ? chromaConfig.startupTimeout : 5000)\n\n client = chromaClient\n config = chromaConfig\n logger.info('Chroma connected', { embedded, host: chromaConfig.host, port: chromaConfig.port })\n return ok(undefined)\n }\n catch (error) {\n stopEmbeddedServer()\n logger.error('Failed to connect to Chroma', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n stopEmbeddedServer()\n client = null\n config = null\n logger.info('Chroma connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — LanceDB Provider\n *\n * 基于 LanceDB 的向量数据库 Provider 实现。\n * LanceDB 为嵌入式向量数据库,数据存储在本地文件系统中。\n * @module vecdb-provider-lancedb\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { LancedbConfig } from '../vecdb-config.js'\nimport type {\n CollectionInfo,\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'lancedb' })\n\n// ─── LanceDB 类型接口(动态 import 使用,避免强依赖可选包) ───\n\n/** LanceDB 连接的最小接口定义 */\ninterface LanceConnection {\n tableNames: () => Promise<string[]>\n openTable: (name: string) => Promise<LanceTable>\n createTable: (name: string, data: Record<string, unknown>[]) => Promise<LanceTable>\n dropTable: (name: string) => Promise<void>\n}\n\n/** LanceDB Table 的最小接口定义 */\ninterface LanceTable {\n add: (data: Record<string, unknown>[]) => Promise<void>\n delete: (filter: string) => Promise<void>\n countRows: () => Promise<number>\n mergeInsert?: (on: string | string[]) => LanceMergeInsertBuilder\n search: (...args: unknown[]) => LanceSearchQuery\n}\n\n/** LanceDB merge insert builder 的最小接口 */\ninterface LanceMergeInsertBuilder {\n whenMatchedUpdateAll: () => LanceMergeInsertBuilder\n whenNotMatchedInsertAll: () => LanceMergeInsertBuilder\n execute: (data: Record<string, unknown>[]) => Promise<unknown>\n}\n\n/** LanceDB 查询构建器的最小接口 */\ninterface LanceSearchQuery {\n limit: (n: number) => LanceSearchQuery\n where: (filter: string) => LanceSearchQuery\n toArray: () => Promise<Record<string, unknown>[]>\n}\n\n/** 转义 LanceDB filter 表达式中的字符串值(防注入 + LIKE 通配符) */\nfunction escapeLanceFilterValue(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_')\n}\n\n/**\n * 集合元信息(内存维护,LanceDB 不存储维度等信息)\n */\ninterface CollectionMeta {\n /** 向量维度 */\n dimension: number\n /** 距离度量 */\n metric: string\n}\n\n/**\n * 创建 LanceDB Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createLancedbProvider(): VecdbProvider {\n let connection: LanceConnection | null = null\n let config: LancedbConfig | null = null\n\n /** 集合元信息缓存 */\n const collectionMetas = new Map<string, CollectionMeta>()\n\n // ─── 辅助函数 ───\n\n /**\n * 动态加载 @lancedb/lancedb\n */\n async function loadLancedb(): Promise<HaiResult<typeof import('@lancedb/lancedb')>> {\n try {\n const mod = await import('@lancedb/lancedb')\n return ok(mod)\n }\n catch (error) {\n logger.error('Failed to load @lancedb/lancedb', { error })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@lancedb/lancedb' } }), error)\n }\n }\n\n /**\n * 打开或创建 LanceDB Table\n */\n async function openTable(name: string): Promise<LanceTable | null> {\n if (!connection)\n return null\n try {\n const tableNames = await connection.tableNames()\n if (tableNames.includes(name)) {\n return await connection.openTable(name)\n }\n return null\n }\n catch {\n return null\n }\n }\n\n /** 获取集合维度(若未知则返回 null) */\n function getCollectionDimension(name: string): number | null {\n return collectionMetas.get(name)?.dimension ?? null\n }\n\n /** 创建统一的维度不匹配错误结果 */\n function createDimensionMismatchResult<T>(expected: number, actual: number): HaiResult<T> {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(collection: string, vector: number[]): HaiResult<T> | null {\n const expected = getCollectionDimension(collection)\n if (expected === null || vector.length === expected) {\n return null\n }\n\n return createDimensionMismatchResult<T>(expected, vector.length)\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(collection: string, documents: VectorDocument[]): HaiResult<void> | null {\n const expected = getCollectionDimension(collection)\n if (expected === null) {\n return null\n }\n\n for (const document of documents) {\n if (document.vector.length !== expected) {\n return createDimensionMismatchResult<void>(expected, document.vector.length)\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => connection !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const tableNames = await connection!.tableNames()\n if (tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建包含初始记录的表以确定 schema\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const initRecord = {\n id: '__init__',\n vector: Array.from({ length: dimension }).fill(0),\n content: '',\n metadata: '{}',\n }\n\n const table = await connection!.createTable(name, [initRecord])\n // 删除初始记录\n await table.delete('id = \"__init__\"')\n\n collectionMetas.set(name, { dimension, metric })\n\n logger.info('Collection created', { name, dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const tableNames = await connection!.tableNames()\n if (!tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await connection!.dropTable(name)\n collectionMetas.delete(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames.includes(name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = await openTable(name)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const count = await table.countRows()\n const meta = collectionMetas.get(name)\n\n return ok({\n name,\n dimension: meta?.dimension ?? 0,\n metric: (meta?.metric ?? config?.metric ?? 'cosine') as CollectionInfo['metric'],\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateDocumentsDimension(collection, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n await table.add(records)\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateDocumentsDimension(collection, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n if (typeof table.mergeInsert === 'function') {\n await table\n .mergeInsert('id')\n .whenMatchedUpdateAll()\n .whenNotMatchedInsertAll()\n .execute(records)\n }\n else {\n logger.warn('LanceDB mergeInsert is unavailable, falling back to delete/add upsert')\n const ids = documents.map(d => `\"${escapeLanceFilterValue(d.id)}\"`).join(', ')\n await table.delete(`id IN (${ids})`)\n await table.add(records)\n }\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const idList = ids.map(id => `\"${escapeLanceFilterValue(id)}\"`).join(', ')\n await table.delete(`id IN (${idList})`)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n logger.debug('Searching vectors', { collection, topK: options?.topK, hasFilter: !!options?.filter })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(collection, vector)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n let query = table.search(vector).limit(topK)\n\n // 应用元数据过滤\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n // LanceDB 过滤基于 SQL WHERE 子句(metadata 为 JSON 字符串)\n filterParts.push(`metadata LIKE '%\"${escapeLanceFilterValue(key)}\":\"${escapeLanceFilterValue(String(value))}\"%'`)\n }\n if (filterParts.length > 0) {\n query = query.where(filterParts.join(' AND '))\n }\n }\n\n const results = await query.toArray()\n\n const searchResults: VectorSearchResult[] = results\n .map((row: Record<string, unknown>) => {\n // LanceDB 返回 _distance(L2 距离),转换为相似度\n const distance = (row._distance as number) ?? 0\n const score = 1 / (1 + distance)\n\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) as Record<string, unknown> : undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const count = await table.countRows()\n return ok(count)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'lancedb',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'lancedb') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const lanceConfig = cfg as LancedbConfig\n const loadResult = await loadLancedb()\n if (!loadResult.success)\n return loadResult\n\n const lancedb = loadResult.data\n\n try {\n // @lancedb/lancedb 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n connection = await lancedb.connect(lanceConfig.path) as unknown as LanceConnection\n config = lanceConfig\n\n // 恢复已有集合的元信息\n // 限制:LanceDB 不持久化维度/度量元信息,此处通过读取首条记录推断。\n // 若表为空或向量维度与探测维度不匹配,dimension 将为 0。\n const tableNames = await connection!.tableNames()\n await Promise.allSettled(tableNames.map(async (name) => {\n try {\n const table = await connection!.openTable(name)\n const count = await table.countRows()\n if (count === 0)\n return\n // 使用 1 维零向量探测,若真实维度不同 LanceDB 可能报错\n const rows = await table.search(Array.from({ length: 1 }).fill(0)).limit(1).toArray()\n if (rows.length > 0 && rows[0].vector) {\n collectionMetas.set(name, {\n dimension: (rows[0].vector as number[]).length,\n metric: lanceConfig.metric ?? 'cosine',\n })\n }\n }\n catch {\n // 无法推断维度(例如维度不匹配),跳过;info() 将返回 dimension=0\n }\n }))\n\n logger.info('LanceDB connected', { path: lanceConfig.path })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to connect to LanceDB', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n connection = null\n config = null\n collectionMetas.clear()\n logger.info('LanceDB connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return connection !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — pgvector Provider\n *\n * 基于 PostgreSQL + pgvector 扩展的向量数据库 Provider 实现。\n * 使用 pg 驱动连接,支持 IVFFlat 和 HNSW 索引。\n * @module vecdb-provider-pgvector\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PgvectorConfig } from '../vecdb-config.js'\nimport type {\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'pgvector' })\n\n/** pg Pool 的最小接口定义(避免强依赖可选包) */\ninterface PgPool {\n query: (text: string, params?: unknown[]) => Promise<{ rows: Record<string, unknown>[] }>\n end: () => Promise<void>\n}\n\n/** pg 模块的最小接口定义(避免强依赖可选包) */\ninterface PgModule {\n Pool: new (config: unknown) => PgPool\n}\n\nfunction isPgModule(value: unknown): value is PgModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { Pool?: unknown }\n return typeof maybeModule.Pool === 'function'\n}\n\n/**\n * 创建 pgvector Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createPgvectorProvider(): VecdbProvider {\n let pool: PgPool | null = null\n let config: PgvectorConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 获取完整表名(带前缀) */\n function tableName(collection: string): string {\n return `${config?.tablePrefix ?? 'vec_'}${collection}`\n }\n\n /** 双引号转义 SQL 标识符,支持含特殊字符的表名 */\n function quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`\n }\n\n /** 获取距离算符(pgvector 语法) */\n function distanceOp(): string {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine': return '<=>'\n case 'euclidean': return '<->'\n case 'dot': return '<#>'\n default: return '<=>'\n }\n }\n\n /** 将距离转换为相似度得分 [0, 1] */\n function distanceToScore(distance: number): number {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine':\n // cosine distance ∈ [0, 2],相似度 = 1 - distance/2 → [0, 1]\n return 1 - distance / 2\n case 'euclidean':\n return 1 / (1 + distance)\n case 'dot':\n // 内积距离为负内积,得分 = -distance\n return -distance\n default:\n return 1 / (1 + distance)\n }\n }\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 pg 驱动 */\n async function loadPg(): Promise<HaiResult<PgModule>> {\n try {\n const mod = await import('pg')\n if (!isPgModule(mod)) {\n const error = new Error('pg driver module does not export Pool')\n logger.error('Failed to load pg driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, 'pg')) {\n logger.error('Failed to load pg driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n throw error\n }\n }\n\n /** 获取集合维度;集合不存在时返回 COLLECTION_NOT_FOUND */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const table = tableName(name)\n\n const existsResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!existsResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const dimResult = await pool!.query(`\n SELECT atttypmod FROM pg_attribute\n WHERE attrelid = $1::regclass AND attname = 'vector'\n `, [quoteIdent(table)])\n\n return ok(dimResult.rows.length > 0 ? Number(dimResult.rows[0].atttypmod) : 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(expected: number, documents: VectorDocument[]): HaiResult<void> | null {\n for (const document of documents) {\n const validation = validateVectorDimension<void>(expected, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => pool !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n const table = tableName(name)\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const indexType = config?.indexType ?? 'hnsw'\n\n logger.debug('Creating collection', { name, dimension, metric, indexType })\n\n // 检查表是否已存在\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建表\n const qi = quoteIdent(table)\n await pool!.query(`\n CREATE TABLE ${qi} (\n id TEXT PRIMARY KEY,\n vector vector(${dimension}),\n content TEXT,\n metadata JSONB DEFAULT '{}'::jsonb\n )\n `)\n\n // 创建向量索引\n const distOp = distanceOp()\n const opsClass = distOp === '<=>'\n ? 'vector_cosine_ops'\n : distOp === '<->'\n ? 'vector_l2_ops'\n : 'vector_ip_ops'\n\n if (indexType === 'hnsw') {\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING hnsw (vector ${opsClass})\n `)\n }\n else {\n // IVFFlat lists 参数:建表时数据为空,使用 100 作为通用默认值\n // 适用于 100 万行以内的数据集;超大数据集应在数据增长后重建索引\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING ivfflat (vector ${opsClass})\n WITH (lists = 100)\n `)\n }\n\n logger.info('Collection created', { name, dimension, metric, indexType })\n return ok(undefined)\n },\n\n async drop(name) {\n const table = tableName(name)\n\n logger.debug('Dropping collection', { name })\n\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await pool!.query(`DROP TABLE ${quoteIdent(table)}`)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const result = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [tableName(name)],\n )\n return ok(result.rows[0].exists as boolean)\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = tableName(name)\n const dimensionResult = await getCollectionDimension(name)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n // 获取文档数量\n const countResult = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n const count = Number.parseInt(String(countResult.rows[0].count), 10)\n\n return ok({\n name,\n dimension: dimensionResult.data,\n metric: config?.metric ?? 'cosine',\n count,\n })\n },\n\n async list() {\n const prefix = config?.tablePrefix ?? 'vec_'\n\n logger.debug('Listing collections')\n\n const result = await pool!.query(\n `SELECT table_name FROM information_schema.tables WHERE table_name LIKE $1 AND table_schema = 'public'`,\n [`${prefix}%`],\n )\n const names = result.rows.map((row: Record<string, unknown>) =>\n String(row.table_name).slice(prefix.length),\n )\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建多值 INSERT(单条 SQL,避免 await-in-loop N+1 问题)\n // 注意:PostgreSQL 参数上限为 65535,每条文档占 4 个参数,单批最多 ~16383 条\n const qi = quoteIdent(table)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}`,\n params,\n )\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const qi = quoteIdent(table)\n // 构建多值 INSERT ON CONFLICT(单条 SQL,避免 await-in-loop N+1 问题)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}\n ON CONFLICT (id) DO UPDATE SET\n vector = EXCLUDED.vector,\n content = EXCLUDED.content,\n metadata = EXCLUDED.metadata`,\n params,\n )\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n const table = tableName(collection)\n\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(', ')\n await pool!.query(`DELETE FROM ${quoteIdent(table)} WHERE id IN (${placeholders})`, ids)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const table = tableName(collection)\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n const op = distanceOp()\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const vectorStr = `[${vector.join(',')}]`\n\n // 构建过滤条件\n let filterSQL = ''\n const filterParams: unknown[] = [vectorStr, topK]\n let paramIndex = 3\n\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n filterParts.push(`metadata->>$${paramIndex} = $${paramIndex + 1}`)\n filterParams.push(key, String(value))\n paramIndex += 2\n }\n if (filterParts.length > 0) {\n filterSQL = `WHERE ${filterParts.join(' AND ')}`\n }\n }\n\n const result = await pool!.query(\n `SELECT id, content, metadata, vector ${op} $1::vector AS distance\n FROM ${quoteIdent(table)}\n ${filterSQL}\n ORDER BY vector ${op} $1::vector\n LIMIT $2`,\n filterParams,\n )\n\n const searchResults: VectorSearchResult[] = result.rows\n .map((row: Record<string, unknown>) => {\n const score = distanceToScore(row.distance as number)\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata as Record<string, unknown> | undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n const table = tableName(collection)\n\n logger.debug('Counting vectors', { collection })\n\n const result = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n return ok(Number.parseInt(String(result.rows[0].count), 10))\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'pgvector',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'pgvector') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const pgConfig = cfg as PgvectorConfig\n\n try {\n const loadResult = await loadPg()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { Pool } = loadResult.data\n\n const poolConfig = pgConfig.url\n ? { connectionString: pgConfig.url }\n : {\n host: pgConfig.host,\n port: pgConfig.port,\n database: pgConfig.database,\n user: pgConfig.user,\n password: pgConfig.password,\n }\n\n pool = new Pool(poolConfig)\n\n // 确保 pgvector 扩展已启用\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n\n config = pgConfig\n\n logger.info('pgvector connected', { host: pgConfig.host, database: pgConfig.database })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的连接字符串泄漏密码\n logger.error('Failed to connect to pgvector', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n try {\n if (pool) {\n await pool.end()\n }\n pool = null\n config = null\n logger.info('pgvector connection closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to close pgvector connection', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: String(error) } }), error)\n }\n },\n\n isConnected(): boolean {\n return pool !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — Qdrant Provider\n *\n * 基于 Qdrant 向量搜索引擎的 Provider 实现。\n * 使用 @qdrant/js-client-rest 客户端连接。\n * @module vecdb-provider-qdrant\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, QdrantConfig } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createHash } from 'node:crypto'\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\n/** 脱敏 URL 中的用户名和密码 */\nfunction sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url)\n if (parsed.username)\n parsed.username = '***'\n if (parsed.password)\n parsed.password = '***'\n return parsed.toString()\n }\n catch {\n return '(invalid url)'\n }\n}\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'qdrant' })\n\n/** Qdrant Client 的最小接口定义(避免强依赖可选包) */\ninterface QdrantClient {\n getCollections: () => Promise<{ collections: { name: string }[] }>\n getCollection: QdrantGetCollectionMethod\n createCollection: (name: string, params: Record<string, unknown>) => Promise<unknown>\n deleteCollection: (name: string) => Promise<unknown>\n upsert: (collection: string, params: Record<string, unknown>) => Promise<unknown>\n delete: (collection: string, params: Record<string, unknown>) => Promise<unknown>\n search: (collection: string, params: Record<string, unknown>) => Promise<Record<string, unknown>[]>\n}\n\n/** Qdrant getCollection 的返回类型 */\ninterface QdrantCollectionInfo {\n config?: { params?: { vectors?: { size?: number, distance?: string } } }\n points_count?: number\n}\n\n/** Qdrant getCollection 特定错误对象的最小接口 */\ninterface QdrantGetCollectionError {\n getActualType?: () => { status?: number }\n}\n\n/** Qdrant getCollection 方法的最小接口(含 typed error 构造器) */\ninterface QdrantGetCollectionMethod {\n (name: string): Promise<QdrantCollectionInfo>\n Error?: new (...args: never[]) => QdrantGetCollectionError\n}\n\n/** Qdrant 模块的最小接口 */\ninterface QdrantModule {\n QdrantClient: new (config: { url: string, apiKey?: string }) => QdrantClient\n}\n\nfunction isQdrantModule(value: unknown): value is QdrantModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { QdrantClient?: unknown }\n return typeof maybeModule.QdrantClient === 'function'\n}\n\n/**\n * 将字符串 ID 转换为 UUID 格式(Qdrant 要求 UUID 或无符号整数作为 point ID)\n *\n * @param id - 原始字符串 ID\n * @returns UUID 格式字符串\n */\nfunction hashToUuid(id: string): string {\n const hash = createHash('sha256').update(id).digest('hex')\n return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`\n}\n\n/**\n * 将 DistanceMetric 转换为 Qdrant 距离类型名称\n */\nfunction toQdrantDistance(metric: DistanceMetric): string {\n switch (metric) {\n case 'cosine': return 'Cosine'\n case 'euclidean': return 'Euclid'\n case 'dot': return 'Dot'\n default: return 'Cosine'\n }\n}\n\n/**\n * 创建 Qdrant Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createQdrantProvider(): VecdbProvider {\n let client: QdrantClient | null = null\n let config: QdrantConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 Qdrant JS 客户端 */\n async function loadQdrantClient(): Promise<HaiResult<QdrantModule>> {\n try {\n const mod = await import('@qdrant/js-client-rest')\n if (!isQdrantModule(mod)) {\n const error = new Error('@qdrant/js-client-rest driver module does not export QdrantClient')\n logger.error('Failed to load Qdrant driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, '@qdrant/js-client-rest')) {\n logger.error('Failed to load Qdrant driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n throw error\n }\n }\n\n /** 判断 Qdrant 错误是否为 404(集合不存在) */\n function isQdrantNotFoundError(error: unknown): boolean {\n const getCollectionErrorCtor = client?.getCollection.Error\n if (getCollectionErrorCtor && error instanceof getCollectionErrorCtor) {\n return error.getActualType?.().status === 404\n }\n\n const maybeError = error as {\n status?: number\n response?: { status?: number }\n $metadata?: { httpStatusCode?: number }\n }\n\n return maybeError.status === 404\n || maybeError.response?.status === 404\n || maybeError.$metadata?.httpStatusCode === 404\n }\n\n /** 获取集合信息;集合不存在时返回 COLLECTION_NOT_FOUND,其余异常继续抛出 */\n async function getCollectionInfo(name: string): Promise<HaiResult<QdrantCollectionInfo>> {\n try {\n return ok(await client!.getCollection(name))\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n throw error\n }\n }\n\n /** 获取集合维度 */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n return ok(infoResult.data.config?.params?.vectors?.size ?? 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n // 检查集合是否已存在\n const collections = await client!.getCollections()\n const exists = collections.collections.some((c: { name: string }) => c.name === name)\n if (exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n\n await client!.createCollection(name, {\n vectors: {\n size: options.dimension,\n distance: toQdrantDistance(metric),\n },\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n await client!.deleteCollection(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n try {\n await client!.getCollection(name)\n return ok(true)\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return ok(false)\n }\n throw error\n }\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n const collectionInfo = infoResult.data\n\n const vectorsConfig = collectionInfo.config?.params?.vectors\n const dimension = vectorsConfig?.size ?? 0\n\n // 从 Qdrant distance 字符串映射回 DistanceMetric\n const qdrantDistance = vectorsConfig?.distance ?? 'Cosine'\n const metric: DistanceMetric = qdrantDistance === 'Euclid'\n ? 'euclidean'\n : qdrantDistance === 'Dot' ? 'dot' : 'cosine'\n\n return ok({\n name,\n dimension,\n metric,\n count: collectionInfo.points_count ?? 0,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const collections = await client!.getCollections()\n const names = collections.collections.map((c: { name: string }) => c.name)\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n // 限制:Qdrant API 仅提供 upsert,无原生 strict insert;\n // ID 已存在时会静默覆盖而非报错,行为等同于 upsert。\n await client!.upsert(collection, { points })\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n await client!.upsert(collection, { points })\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const uuids = ids.map(hashToUuid)\n await client!.delete(collection, { points: uuids })\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建过滤条件\n let filter: Record<string, unknown> | undefined\n if (options?.filter && Object.keys(options.filter).length > 0) {\n const mustConditions = Object.entries(options.filter).map(([key, value]) => ({\n key,\n match: { value },\n }))\n filter = { must: mustConditions }\n }\n\n const searchResult = await client!.search(collection, {\n vector,\n limit: topK,\n score_threshold: minScore > 0 ? minScore : undefined,\n filter,\n with_payload: true,\n })\n\n const results: VectorSearchResult[] = searchResult.map((point: Record<string, unknown>) => {\n const payload = point.payload as Record<string, unknown> ?? {}\n const { _id, _content, ...metadata } = payload\n return {\n id: (_id as string) ?? '',\n score: point.score as number,\n content: (_content as string) || undefined,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n }\n })\n\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n const infoResult = await getCollectionInfo(collection)\n if (!infoResult.success) {\n return infoResult\n }\n\n return ok(infoResult.data.points_count ?? 0)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'qdrant',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'qdrant') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const qdrantConfig = cfg as QdrantConfig\n\n try {\n const loadResult = await loadQdrantClient()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { QdrantClient: QdrantClientClass } = loadResult.data\n\n // @qdrant/js-client-rest 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n const qdrantClient = new QdrantClientClass({\n url: qdrantConfig.url,\n apiKey: qdrantConfig.apiKey,\n }) as unknown as QdrantClient\n\n // 验证连接\n await qdrantClient.getCollections()\n\n client = qdrantClient\n\n config = qdrantConfig\n logger.info('Qdrant connected', { url: sanitizeUrl(qdrantConfig.url) })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的 URL 或连接信息泄漏\n logger.error('Failed to connect to Qdrant', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n client = null\n config = null\n logger.info('Qdrant connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — 向量数据库服务主入口\n *\n * 本文件提供统一的 `vecdb` 对象,聚合所有向量数据库操作功能。\n * @module vecdb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { VecdbProvider } from './providers/vecdb-provider-base.js'\nimport type { VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport type {\n CollectionOperations,\n VecdbConnection,\n VecdbFunctions,\n VectorOperations,\n} from './vecdb-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { createChromaProvider } from './providers/vecdb-provider-chroma.js'\nimport { createLancedbProvider } from './providers/vecdb-provider-lancedb.js'\nimport { createPgvectorProvider } from './providers/vecdb-provider-pgvector.js'\nimport { createQdrantProvider } from './providers/vecdb-provider-qdrant.js'\nimport { VecdbConfigSchema } from './vecdb-config.js'\nimport { vecdbM } from './vecdb-i18n.js'\nimport { HaiVecdbError } from './vecdb-types.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的向量数据库 Provider(未初始化时为 null) */\nlet currentProvider: VecdbProvider | null = null\n\n/** 当前向量数据库配置(未初始化时为 null) */\nlet currentConfig: VecdbConfig | null = null\n\n/** init() 是否正在执行(并发防护) */\nlet initInProgress = false\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的向量数据库 Provider\n *\n * @param config - 向量数据库配置(已校验、默认值补齐)\n * @returns Provider 实例\n */\nfunction createProvider(config: VecdbConfig): VecdbProvider {\n switch (config.type) {\n case 'lancedb':\n return createLancedbProvider()\n case 'pgvector':\n return createPgvectorProvider()\n case 'qdrant':\n return createQdrantProvider()\n case 'chroma':\n return createChromaProvider()\n }\n}\n\n// ─── 未初始化时的占位操作 ───\n\n/** 未初始化工具集 */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiVecdbError.NOT_INITIALIZED,\n () => vecdbM('vecdb_notInitialized'),\n)\n\n/** 未初始化时的集合操作占位对象 */\nconst notInitializedCollection = notInitialized.proxy<CollectionOperations>()\n\n/** 未初始化时的向量操作占位对象 */\nconst notInitializedVector = notInitialized.proxy<VectorOperations>()\n\n// ─── 统一向量数据库服务对象 ───\n\n/**\n * 向量数据库服务对象\n *\n * 统一的向量数据库访问入口,提供以下功能:\n * - `vecdb.init()` - 初始化连接\n * - `vecdb.close()` - 关闭连接\n * - `vecdb.collection` - 集合管理(创建/删除/查询)\n * - `vecdb.vector` - 向量操作(插入/搜索/删除)\n * - `vecdb.config` - 当前配置\n * - `vecdb.isInitialized` - 初始化状态\n *\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * // 初始化(LanceDB)\n * await vecdb.init({ type: 'lancedb', path: './data/vecdb' })\n *\n * // 集合操作\n * await vecdb.collection.create('docs', { dimension: 1536 })\n *\n * // 向量操作\n * await vecdb.vector.insert('docs', [\n * { id: '1', vector: [...], content: '文档内容' },\n * ])\n *\n * // 搜索\n * const result = await vecdb.vector.search('docs', queryVector, { topK: 5 })\n *\n * // 关闭\n * await vecdb.close()\n * ```\n */\nexport const vecdb: VecdbFunctions = {\n /**\n * 初始化向量数据库连接\n *\n * @param config - 向量数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n */\n async init(config: VecdbConfigInput): Promise<HaiResult<void>> {\n // 并发防护:防止多次同时调用导致 Provider/连接泄漏\n if (initInProgress) {\n logger.warn('Vecdb init already in progress, skipping concurrent call')\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_initInProgress'))\n }\n initInProgress = true\n\n try {\n if (currentProvider) {\n logger.warn('Vecdb module is already initialized, reinitializing')\n const closeResult = await vecdb.close()\n if (!closeResult.success) {\n return closeResult\n }\n }\n\n logger.info('Initializing vecdb module')\n\n const parseResult = VecdbConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('Vecdb config validation failed', { error: parseResult.error.message })\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_configError', { params: { error: parseResult.error.message } }), parseResult.error)\n }\n const parsed = parseResult.data\n\n try {\n const provider = createProvider(parsed)\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('Vecdb module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return connectResult\n }\n currentProvider = provider\n currentConfig = parsed\n logger.info('Vecdb module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module initialization failed', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_initFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n finally {\n initInProgress = false\n }\n },\n\n /**\n * 获取集合管理操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get collection(): CollectionOperations {\n return currentProvider?.collection ?? notInitializedCollection\n },\n\n /**\n * 获取向量操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get vector(): VectorOperations {\n return currentProvider?.vector ?? notInitializedVector\n },\n\n /** 获取当前脱敏配置快照(未初始化时为 null) */\n get config(): VecdbConfig | null {\n return currentConfig ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null\n },\n\n /** 获取底层后端的原始连接信息(含凭证,未初始化时为 null;仅供同进程内集成使用) */\n get rawConnection(): VecdbConnection | null {\n if (!currentConfig)\n return null\n if (currentConfig.type === 'qdrant')\n return { type: 'qdrant', url: currentConfig.url, apiKey: currentConfig.apiKey }\n if (currentConfig.type === 'pgvector') {\n return {\n type: 'pgvector',\n connectionString: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n database: currentConfig.database,\n user: currentConfig.user,\n password: currentConfig.password,\n }\n }\n if (currentConfig.type === 'chroma') {\n return {\n type: 'chroma',\n url: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n apiKey: currentConfig.apiKey,\n path: currentConfig.path,\n }\n }\n return { type: currentConfig.type, path: currentConfig.path }\n },\n\n /** 检查是否已初始化 */\n get isInitialized(): boolean {\n return currentProvider !== null && currentProvider.isConnected()\n },\n\n /**\n * 关闭向量数据库连接\n *\n * 多次调用安全,未初始化时直接返回。\n */\n async close(): Promise<HaiResult<void>> {\n if (!currentProvider) {\n currentConfig = null\n logger.info('Vecdb module already closed, skipping')\n return ok(undefined)\n }\n\n logger.info('Closing vecdb module')\n\n try {\n const closeResult = await currentProvider.close()\n if (!closeResult.success) {\n logger.error('Vecdb module close failed', { code: closeResult.error.code, message: closeResult.error.message })\n return closeResult\n }\n logger.info('Vecdb module closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module close failed', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n finally {\n currentProvider = null\n currentConfig = null\n }\n },\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../messages/en-US.json","../messages/zh-CN.json","../src/vecdb-i18n.ts","../src/vecdb-config.ts","../src/vecdb-types.ts","../src/providers/vecdb-provider-base.ts","../src/providers/vecdb-provider-chroma.ts","../src/providers/vecdb-provider-lancedb.ts","../src/providers/vecdb-provider-pgvector.ts","../src/providers/vecdb-provider-qdrant.ts","../src/vecdb-main.ts"],"names":["core","err","ok","delay","require","logger","distanceToScore"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"Vector database not initialized, please call vecdb.init() first\",\n \"vecdb_initFailed\": \"Failed to initialize vector database: {error}\",\n \"vecdb_closeFailed\": \"Failed to close vector database: {error}\",\n \"vecdb_configError\": \"Vector database config validation failed: {error}\",\n \"vecdb_initInProgress\": \"Vector database initialization is already in progress\",\n \"vecdb_unsupportedType\": \"Unsupported vector database type: {type}\",\n \"vecdb_driverNotFound\": \"Vector database driver not installed: {driver}, please run pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"Failed to connect to vector database: {error}\",\n \"vecdb_collectionNotFound\": \"Collection not found: {name}\",\n \"vecdb_collectionAlreadyExists\": \"Collection already exists: {name}\",\n \"vecdb_dimensionMismatch\": \"Vector dimension mismatch: expected {expected}, actual {actual}\",\n \"vecdb_insertFailed\": \"Failed to insert vectors: {error}\",\n \"vecdb_deleteFailed\": \"Failed to delete vectors: {error}\",\n \"vecdb_updateFailed\": \"Failed to update vectors: {error}\",\n \"vecdb_queryFailed\": \"Failed to query vectors: {error}\",\n \"vecdb_indexBuildFailed\": \"Failed to build index: {error}\",\n \"vecdb_serializationFailed\": \"Serialization/deserialization failed: {error}\",\n \"vecdb_invalidDimension\": \"Invalid vector dimension: {dimension}, must be a positive integer\",\n \"vecdb_configPathRequired\": \"Database storage path is required\",\n \"vecdb_configDatabaseRequired\": \"Database name is required\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"向量数据库未初始化,请先调用 vecdb.init()\",\n \"vecdb_initFailed\": \"初始化向量数据库失败: {error}\",\n \"vecdb_closeFailed\": \"关闭向量数据库失败: {error}\",\n \"vecdb_configError\": \"向量数据库配置校验失败:{error}\",\n \"vecdb_initInProgress\": \"向量数据库初始化正在进行中\",\n \"vecdb_unsupportedType\": \"不支持的向量数据库类型: {type}\",\n \"vecdb_driverNotFound\": \"向量数据库驱动未安装: {driver},请执行 pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"连接向量数据库失败: {error}\",\n \"vecdb_collectionNotFound\": \"集合不存在: {name}\",\n \"vecdb_collectionAlreadyExists\": \"集合已存在: {name}\",\n \"vecdb_dimensionMismatch\": \"向量维度不匹配: 期望 {expected},实际 {actual}\",\n \"vecdb_insertFailed\": \"插入向量失败: {error}\",\n \"vecdb_deleteFailed\": \"删除向量失败: {error}\",\n \"vecdb_updateFailed\": \"更新向量失败: {error}\",\n \"vecdb_queryFailed\": \"查询向量失败: {error}\",\n \"vecdb_indexBuildFailed\": \"构建索引失败: {error}\",\n \"vecdb_serializationFailed\": \"序列化/反序列化失败: {error}\",\n \"vecdb_invalidDimension\": \"无效的向量维度: {dimension},必须为正整数\",\n \"vecdb_configPathRequired\": \"数据库存储路径不能为空\",\n \"vecdb_configDatabaseRequired\": \"数据库名称不能为空\"\n}\n","/**\n * @h-ai/vecdb — i18n\n *\n * 本文件提供向量数据库模块的 i18n 文案访问入口。\n * @module vecdb-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 向量数据库模块文案 Key 类型\n */\ntype VecdbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取向量数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n */\nexport const vecdbM = core.i18n.createMessageGetter<VecdbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/vecdb — 向量数据库配置 Schema\n *\n * 本文件定义向量数据库模块的错误码常量、Zod Schema 和配置类型。\n * 支持 LanceDB(默认)、pgvector、Qdrant、Chroma 四种后端。\n * @module vecdb-config\n */\n\nimport { z } from 'zod'\nimport { vecdbM } from './vecdb-i18n.js'\n// ─── 向量数据库类型枚举 ───\n\n/**\n * 向量数据库类型枚举\n *\n * 支持的向量数据库类型:\n * - `lancedb` — LanceDB 嵌入式向量数据库(默认)\n * - `pgvector` — PostgreSQL + pgvector 扩展\n * - `qdrant` — Qdrant 向量搜索引擎\n * - `chroma` — Chroma 向量数据库(支持嵌入式自动拉起本地服务)\n */\n/** 向量数据库类型 */\nexport type VecdbType = 'lancedb' | 'pgvector' | 'qdrant' | 'chroma'\n\n// ─── 距离度量 ───\n\n/**\n * 距离度量类型\n *\n * - `cosine` — 余弦相似度(默认,适用于文本嵌入)\n * - `euclidean` — 欧氏距离(L2)\n * - `dot` — 内积(点积)\n */\nexport const DistanceMetricSchema = z.enum(['cosine', 'euclidean', 'dot']).default('cosine')\n\n/** 距离度量类型 */\nexport type DistanceMetric = z.infer<typeof DistanceMetricSchema>\n\nexport const VecdbOperationLogConfigSchema = z.object({\n read: z.boolean().default(false),\n write: z.boolean().default(false),\n maxLength: z.number().int().min(0).default(1000),\n level: z.enum(['info', 'debug', 'trace']).default('debug'),\n})\n\nexport type VecdbOperationLogConfig = z.infer<typeof VecdbOperationLogConfigSchema>\n\nconst OperationLogConfigFieldSchema = {\n operationLog: VecdbOperationLogConfigSchema.optional(),\n}\n\n// ─── LanceDB 配置 ───\n\n/**\n * LanceDB 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'lancedb', path: './data/vecdb' }\n * ```\n */\nconst LancedbConfigSchema = z.object({\n type: z.literal('lancedb'),\n /** 数据库存储路径(本地目录) */\n path: z.string().min(1, vecdbM('vecdb_configPathRequired')),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** LanceDB 配置类型 */\nexport type LancedbConfig = z.infer<typeof LancedbConfigSchema>\n\n// ─── pgvector 配置 ───\n\n/**\n * pgvector 索引类型\n *\n * - `ivfflat` — IVFFlat 索引(适合中等规模数据)\n * - `hnsw` — HNSW 索引(适合大规模数据,检索速度更快)\n */\nconst PgvectorIndexTypeSchema = z.enum(['ivfflat', 'hnsw']).default('hnsw')\n\n/**\n * pgvector 配置 Schema\n *\n * @example\n * ```ts\n * // 使用连接字符串\n * { type: 'pgvector', url: 'postgres://user:pass@localhost:5432/mydb' }\n *\n * // 使用分开的字段\n * {\n * type: 'pgvector',\n * host: 'localhost',\n * port: 5432,\n * database: 'mydb',\n * user: 'admin',\n * password: 'secret'\n * }\n * ```\n */\nconst PgvectorConfigSchema = z.object({\n type: z.literal('pgvector'),\n /** 连接字符串(可选,优先使用) */\n url: z.string().optional(),\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口号(默认 5432) */\n port: z.number().int().min(1).max(65535).default(5432),\n /** 数据库名称 */\n database: z.string().min(1, vecdbM('vecdb_configDatabaseRequired')),\n /** 用户名 */\n user: z.string().optional(),\n /** 密码 */\n password: z.string().optional(),\n /** 索引类型(默认 hnsw) */\n indexType: PgvectorIndexTypeSchema.optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n /** 表名前缀(默认 'vec_') */\n tablePrefix: z.string().default('vec_'),\n ...OperationLogConfigFieldSchema,\n})\n\n/** pgvector 配置类型 */\nexport type PgvectorConfig = z.infer<typeof PgvectorConfigSchema>\n\n// ─── Qdrant 配置 ───\n\n/**\n * Qdrant 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'qdrant', url: 'http://localhost:6333' }\n * ```\n */\nconst QdrantConfigSchema = z.object({\n type: z.literal('qdrant'),\n /** Qdrant 服务器 URL */\n url: z.string().url().default('http://localhost:6333'),\n /** API Key(可选) */\n apiKey: z.string().optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** Qdrant 配置类型 */\nexport type QdrantConfig = z.infer<typeof QdrantConfigSchema>\n\n// ─── Chroma 配置 ───\n\n/**\n * Chroma 配置 Schema\n *\n * Chroma 在 Node 端只有 HTTP 客户端(无进程内嵌入式)。本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且不提供 `url` 时,init 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭;数据落地本地目录,无需手动启动服务。\n * - **直连**:提供 `url`(或已运行的 host:port)时,直接连接已有 Chroma 服务,不拉起进程。\n *\n * @example\n * ```ts\n * // 嵌入式(自动拉起本地服务)\n * { type: 'chroma', path: './data/chroma' }\n *\n * // 直连已有服务\n * { type: 'chroma', url: 'http://localhost:8000' }\n * ```\n */\nconst ChromaConfigSchema = z.object({\n type: z.literal('chroma'),\n /** 本地持久化路径(嵌入式模式:提供且无 url 时自动拉起本地服务) */\n path: z.string().optional(),\n /** 已有 Chroma 服务 URL(提供时直连,不自动拉起进程) */\n url: z.string().url().optional(),\n /** 主机(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口(默认 8000) */\n port: z.number().int().min(1).max(65535).default(8000),\n /** API Key(可选,连接受保护的 Chroma 服务时使用) */\n apiKey: z.string().optional(),\n /** 拉起本地服务的可执行命令(默认 'chroma',可指定绝对路径) */\n serverCommand: z.string().default('chroma'),\n /** 拉起本地服务的就绪等待超时(毫秒,默认 30000) */\n startupTimeout: z.number().int().positive().default(30_000),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** Chroma 配置类型 */\nexport type ChromaConfig = z.infer<typeof ChromaConfigSchema>\n\n// ─── 统一配置 ───\n\n/**\n * 统一向量数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同向量数据库类型的配置。\n */\nexport const VecdbConfigSchema = z.discriminatedUnion('type', [\n LancedbConfigSchema,\n PgvectorConfigSchema,\n QdrantConfigSchema,\n ChromaConfigSchema,\n])\n\n/** 向量数据库配置类型(判别联合体) */\nexport type VecdbConfig = z.infer<typeof VecdbConfigSchema>\n\n/**\n * 向量数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 vecdb.init)更适合接收 VecdbConfigInput。\n */\nexport type VecdbConfigInput = z.input<typeof VecdbConfigSchema>\n","/**\n * @h-ai/vecdb — 类型定义\n *\n * 本文件定义向量数据库模块的核心接口和类型(非配置相关)。\n * 配置相关类型请从 vecdb-config.ts 导入。\n * @module vecdb-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport { core } from '@h-ai/core'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\n/**\n * 向量数据库错误信息映射(错误码:HTTP状态码)。\n *\n * 完整错误码将自动生成为:`hai:vecdb:NNN`\n */\nconst VecdbErrorInfo = {\n CONNECTION_FAILED: '001:500',\n QUERY_FAILED: '002:500',\n COLLECTION_NOT_FOUND: '003:404',\n COLLECTION_ALREADY_EXISTS: '004:409',\n DIMENSION_MISMATCH: '005:400',\n INSERT_FAILED: '006:500',\n DELETE_FAILED: '007:500',\n UPDATE_FAILED: '008:500',\n INDEX_BUILD_FAILED: '009:500',\n NOT_INITIALIZED: '010:500',\n CONFIG_ERROR: '011:500',\n UNSUPPORTED_TYPE: '012:400',\n DRIVER_NOT_FOUND: '013:500',\n SERIALIZATION_FAILED: '014:500',\n} as const satisfies ErrorInfo\n\n/**\n * Vecdb 模块标准错误定义对象。\n */\nexport const HaiVecdbError = core.error.buildHaiErrorsDef('vecdb', VecdbErrorInfo)\n\n// ─── 向量文档 ───\n\n/**\n * 向量文档接口\n *\n * 表示一条存入向量数据库的记录,包含向量、文本内容和元数据。\n *\n * @example\n * ```ts\n * const doc: VectorDocument = {\n * id: 'doc-001',\n * vector: [0.1, 0.2, 0.3, ...],\n * content: '这是文档内容',\n * metadata: { source: 'wiki', page: 1 },\n * }\n * ```\n */\nexport interface VectorDocument {\n /** 文档唯一标识 */\n id: string\n /** 向量数据(浮点数组) */\n vector: number[]\n /** 文本内容(可选,用于存储原始文本) */\n content?: string\n /** 元数据(可选,用于存储附加信息) */\n metadata?: Record<string, unknown>\n}\n\n/**\n * 向量搜索选项\n *\n * @example\n * ```ts\n * const options: VectorSearchOptions = {\n * topK: 10,\n * filter: { source: 'wiki' },\n * minScore: 0.7,\n * }\n * ```\n */\nexport interface VectorSearchOptions {\n /** 返回的最大结果数(默认 10) */\n topK?: number\n /** 元数据过滤条件(键值对,精确匹配) */\n filter?: Record<string, unknown>\n /** 最低相似度阈值(0-1,低于此值的结果将被过滤) */\n minScore?: number\n}\n\n/**\n * 向量搜索结果\n *\n * 包含匹配的文档和相似度得分。\n *\n * @example\n * ```ts\n * const result: VectorSearchResult = {\n * id: 'doc-001',\n * score: 0.95,\n * content: '匹配的文档内容',\n * metadata: { source: 'wiki' },\n * }\n * ```\n */\nexport interface VectorSearchResult {\n /** 文档唯一标识 */\n id: string\n /** 相似度得分(0-1,越高越相似) */\n score: number\n /** 文本内容(如果存储时包含) */\n content?: string\n /** 元数据(如果存储时包含) */\n metadata?: Record<string, unknown>\n /** 原始向量(可选,默认不返回以节省传输) */\n vector?: number[]\n}\n\n// ─── 集合信息 ───\n\n/**\n * 集合信息接口\n *\n * 描述一个向量集合的元信息。\n *\n * @example\n * ```ts\n * const info: CollectionInfo = {\n * name: 'docs',\n * dimension: 1536,\n * metric: 'cosine',\n * count: 42,\n * }\n * ```\n */\nexport interface CollectionInfo {\n /** 集合名称 */\n name: string\n /** 向量维度 */\n dimension: number\n /** 距离度量类型 */\n metric: DistanceMetric\n /** 集合中的文档数量 */\n count: number\n}\n\n// ─── 操作接口 ───\n\n/**\n * 集合管理操作接口\n *\n * 通过 `vecdb.collection` 访问,管理向量集合的创建、删除和查询。\n *\n * @example\n * ```ts\n * // 创建集合\n * await vecdb.collection.create('my-docs', { dimension: 1536 })\n *\n * // 列出集合\n * const result = await vecdb.collection.list()\n * ```\n */\nexport interface CollectionOperations {\n /**\n * 创建集合\n *\n * @param name - 集合名称\n * @param options - 创建选项\n * @returns 成功返回 ok(undefined);集合已存在返回 COLLECTION_ALREADY_EXISTS\n */\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n\n /**\n * 删除集合\n *\n * @param name - 集合名称\n * @returns 成功返回 ok(undefined);集合不存在返回 COLLECTION_NOT_FOUND\n */\n drop: (name: string) => Promise<HaiResult<void>>\n\n /**\n * 判断集合是否存在\n *\n * @param name - 集合名称\n * @returns 存在返回 true,不存在返回 false\n */\n exists: (name: string) => Promise<HaiResult<boolean>>\n\n /**\n * 获取集合信息\n *\n * @param name - 集合名称\n * @returns 集合信息\n */\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n\n /**\n * 列出所有集合\n *\n * @returns 集合名称列表\n */\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 集合创建选项\n *\n * @example\n * ```ts\n * const options: CollectionCreateOptions = {\n * dimension: 1536,\n * metric: 'cosine',\n * }\n * ```\n */\nexport interface CollectionCreateOptions {\n /** 向量维度(必填) */\n dimension: number\n /** 距离度量(可选,默认使用全局配置中的 metric) */\n metric?: DistanceMetric\n}\n\n/**\n * 向量操作接口\n *\n * 通过 `vecdb.vector` 访问,管理向量文档的增删改查和搜索。\n *\n * @example\n * ```ts\n * // 插入向量\n * await vecdb.vector.insert('my-docs', [\n * { id: 'doc-1', vector: [...], content: '文档1' },\n * { id: 'doc-2', vector: [...], content: '文档2' },\n * ])\n *\n * // 搜索向量\n * const result = await vecdb.vector.search('my-docs', queryVector, { topK: 5 })\n * ```\n */\nexport interface VectorOperations {\n /**\n * 插入向量文档\n *\n * @param collection - 集合名称\n * @param documents - 文档列表\n * @returns 成功返回 ok(undefined)\n */\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 更新向量文档(按 id 匹配,整体替换)\n *\n * @param collection - 集合名称\n * @param documents - 待更新的文档(id 必须已存在)\n * @returns 成功返回 ok(undefined)\n */\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 删除向量文档\n *\n * @param collection - 集合名称\n * @param ids - 文档 ID 列表\n * @returns 成功返回 ok(undefined)\n */\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n\n /**\n * 向量搜索\n *\n * @param collection - 集合名称\n * @param vector - 查询向量\n * @param options - 搜索选项\n * @returns 搜索结果列表(按相似度降序排列)\n */\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n\n /**\n * 获取集合中的文档数量\n *\n * @param collection - 集合名称\n * @returns 文档数量\n */\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── VecdbFunctions 接口 ───\n\n/**\n * 向量数据库服务接口(通过 `vecdb` 对象访问)\n *\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * // 初始化(LanceDB)\n * await vecdb.init({ type: 'lancedb', path: './data/vecdb' })\n *\n * // 创建集合\n * await vecdb.collection.create('docs', { dimension: 1536 })\n *\n * // 插入向量\n * await vecdb.vector.insert('docs', [{ id: '1', vector: [...], content: '...' }])\n *\n * // 搜索\n * const result = await vecdb.vector.search('docs', queryVector, { topK: 5 })\n *\n * // 关闭\n * await vecdb.close()\n * ```\n */\nexport interface VecdbFunctions {\n /** 初始化向量数据库连接 */\n init: (config: VecdbConfigInput) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 当前脱敏配置快照(未初始化时为 null) */\n readonly config: VecdbConfig | null\n /**\n * 获取底层后端的原始连接信息(含凭证,未初始化时为 null)\n *\n * 供需要直连同一向量库的外部引擎(如 mem0 OSS)复用后端。返回值包含未脱敏的凭证,\n * 仅供同进程内集成使用,禁止写入日志或返回给外部调用方。\n */\n readonly rawConnection: VecdbConnection | null\n /** 是否已初始化 */\n readonly isInitialized: boolean\n /** 集合管理操作 */\n readonly collection: CollectionOperations\n /** 向量操作 */\n readonly vector: VectorOperations\n}\n\n/**\n * 向量库原始连接信息\n *\n * 由 `vecdb.rawConnection` 暴露,字段按后端类型填充。包含凭证,仅供同进程内集成使用。\n */\nexport interface VecdbConnection {\n /** 后端类型 */\n type: VecdbConfig['type']\n /** 服务 URL(qdrant) */\n url?: string\n /** API Key(qdrant) */\n apiKey?: string\n /** 主机(pgvector) */\n host?: string\n /** 端口(pgvector) */\n port?: number\n /** 数据库名(pgvector) */\n database?: string\n /** 用户名(pgvector) */\n user?: string\n /** 密码(pgvector) */\n password?: string\n /** 连接串(pgvector) */\n connectionString?: string\n /** 本地路径(lancedb) */\n path?: string\n}\n","/**\n * @h-ai/vecdb — Provider 共享基础层\n *\n * 将各 Provider 的共性逻辑抽取为统一实现:连接守卫、运行时异常捕获、HaiResult 包装。\n *\n * 各 Provider 只需提供 CollectionDriver / VectorDriver(原始操作适配器),\n * base 层统一处理初始化检查与 catch-all 安全网。\n * @module vecdb-provider-base\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\nimport type { VecdbConfig, VecdbOperationLogConfig } from '../vecdb-config.js'\nimport type {\n CollectionCreateOptions,\n CollectionInfo,\n CollectionOperations,\n VectorDocument,\n VectorOperations,\n VectorSearchOptions,\n VectorSearchResult,\n} from '../vecdb-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\n// ─── Provider 接口(内部,不暴露给模块消费者) ───\n\n/**\n * 向量数据库 Provider 接口\n *\n * 各后端实现需遵循此接口,提供统一的集合管理和向量操作能力。\n */\nexport interface VecdbProvider {\n /** Provider 名称标识 */\n readonly name: string\n /** 连接到向量数据库 */\n connect: (config: VecdbConfig) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 是否已连接 */\n isConnected: () => boolean\n /** 集合管理操作 */\n collection: CollectionOperations\n /** 向量操作 */\n vector: VectorOperations\n}\n\n// ─── 上下文与适配器接口 ───\n\n/** 操作上下文:由 Provider 在创建 ops 时传入 */\nexport interface VecdbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\n info: (msg: string, meta?: Record<string, unknown>) => void\n debug: (msg: string, meta?: Record<string, unknown>) => void\n trace: (msg: string, meta?: Record<string, unknown>) => void\n }\n /** 当前操作日志配置 */\n operationLog?: () => VecdbOperationLogConfig | undefined\n}\n\n/**\n * 集合操作原始适配器\n *\n * Provider 将引擎特定的集合管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合已存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n */\nexport interface CollectionDriver {\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n drop: (name: string) => Promise<HaiResult<void>>\n exists: (name: string) => Promise<HaiResult<boolean>>\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 向量操作原始适配器\n *\n * Provider 将引擎特定的向量管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合不存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n */\nexport interface VectorDriver {\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── 内部帮助 ───\n\ntype VecdbOperationCategory = 'read' | 'write'\n\nfunction stringifyOperationPayload(payload: unknown, maxLength: number): string {\n if (maxLength <= 0) {\n return ''\n }\n\n try {\n const text = JSON.stringify(payload, (_key, value: unknown) => {\n if (typeof value === 'bigint') {\n return value.toString()\n }\n if (typeof value === 'function') {\n return '[Function]'\n }\n return value\n })\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n catch {\n const text = String(payload)\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n}\n\nexport function logVecdbOperation(\n ctx: VecdbOpsContext,\n category: VecdbOperationCategory,\n operation: string,\n payload: unknown,\n): void {\n const config = ctx.operationLog?.()\n if (!config?.[category]) {\n return\n }\n\n ctx.logger[config.level]('VecDB operation executed', {\n category,\n operation,\n payload: stringifyOperationPayload(payload, config.maxLength),\n })\n}\n\n/** 根据错误定义获取对应的 i18n 错误消息 */\nfunction errorMsgFromCode(def: HaiErrorDef, errorStr: string): string {\n switch (def) {\n case HaiVecdbError.DELETE_FAILED:\n return vecdbM('vecdb_deleteFailed', { params: { error: errorStr } })\n case HaiVecdbError.INSERT_FAILED:\n return vecdbM('vecdb_insertFailed', { params: { error: errorStr } })\n case HaiVecdbError.UPDATE_FAILED:\n return vecdbM('vecdb_updateFailed', { params: { error: errorStr } })\n default:\n return vecdbM('vecdb_queryFailed', { params: { error: errorStr } })\n }\n}\n\n/**\n * 统一操作包装器:guard → delegate → catch-all\n *\n * 1. 连接守卫:未初始化时直接返回 NOT_INITIALIZED\n * 2. 委托给 driver 执行(driver 内部用 HaiResult 表达业务错误)\n * 3. catch-all 安全网:捕获 driver 未预期的运行时异常\n */\nasync function wrapOp<T>(\n ctx: VecdbOpsContext,\n fn: () => Promise<HaiResult<T>>,\n errorDef: HaiErrorDef,\n errorLabel: string,\n errorMeta?: Record<string, unknown>,\n): Promise<HaiResult<T>> {\n if (!ctx.isConnected()) {\n return err(HaiVecdbError.NOT_INITIALIZED, vecdbM('vecdb_notInitialized'))\n }\n try {\n return await fn()\n }\n catch (error) {\n ctx.logger.error(errorLabel, { ...errorMeta, error })\n return err(errorDef, errorMsgFromCode(errorDef, String(error)), error)\n }\n}\n\n// ─── 集合操作工厂 ───\n\n/**\n * 创建标准集合操作\n *\n * 各 Provider 只需提供 CollectionDriver,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseCollectionOps(ctx: VecdbOpsContext, driver: CollectionDriver): CollectionOperations {\n return {\n create: async (name, options) => {\n // 参数校验:dimension 必须为正整数(防止 pgvector SQL 插值注入)\n if (!Number.isInteger(options.dimension) || options.dimension <= 0) {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_invalidDimension', { params: { dimension: String(options.dimension) } }),\n )\n }\n logVecdbOperation(ctx, 'write', 'collection.create', { name, options })\n return wrapOp(\n ctx,\n () => driver.create(name, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to create collection',\n { name },\n )\n },\n drop: (name) => {\n logVecdbOperation(ctx, 'write', 'collection.drop', { name })\n return wrapOp(\n ctx,\n () => driver.drop(name),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to drop collection',\n { name },\n )\n },\n exists: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.exists', { name })\n return wrapOp(\n ctx,\n () => driver.exists(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to check collection',\n { name },\n )\n },\n info: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.info', { name })\n return wrapOp(\n ctx,\n () => driver.info(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to get collection info',\n { name },\n )\n },\n list: () => {\n logVecdbOperation(ctx, 'read', 'collection.list', {})\n return wrapOp(\n ctx,\n () => driver.list(),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to list collections',\n )\n },\n }\n}\n// ─── 向量操作工厂 ───\n\n/**\n * 创建标准向量操作\n *\n * 各 Provider 只需提供 VectorDriver,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseVectorOps(ctx: VecdbOpsContext, driver: VectorDriver): VectorOperations {\n return {\n insert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.insert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.insert(collection, documents),\n HaiVecdbError.INSERT_FAILED,\n 'Failed to insert vectors',\n { collection },\n )\n },\n upsert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.upsert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.upsert(collection, documents),\n HaiVecdbError.UPDATE_FAILED,\n 'Failed to upsert vectors',\n { collection },\n )\n },\n delete: (collection, ids) => {\n logVecdbOperation(ctx, 'write', 'vector.delete', { collection, count: ids.length, ids })\n return wrapOp(\n ctx,\n () => ids.length === 0 ? Promise.resolve(ok(undefined)) : driver.delete(collection, ids),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to delete vectors',\n { collection },\n )\n },\n search: (collection, vector, options) => {\n logVecdbOperation(ctx, 'read', 'vector.search', { collection, vector, options })\n return wrapOp(\n ctx,\n () => driver.search(collection, vector, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to search vectors',\n { collection },\n )\n },\n count: (collection) => {\n logVecdbOperation(ctx, 'read', 'vector.count', { collection })\n return wrapOp(\n ctx,\n () => driver.count(collection),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to count vectors',\n { collection },\n )\n },\n }\n}\n","/**\n * @h-ai/vecdb — Chroma Provider\n *\n * 基于 Chroma 向量数据库的 Provider 实现。Chroma 在 Node 端只有 HTTP 客户端,\n * 本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且无 `url` 时,connect 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭进程。\n * - **直连**:提供 `url` 时直接连接已有服务,不拉起进程。\n *\n * 向量由调用方显式提供,集合不使用 Chroma 内置 embedding function。\n * @module vecdb-provider-chroma\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChildProcess } from 'node:child_process'\nimport type { ChromaConfig, DistanceMetric } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { spawn } from 'node:child_process'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'chroma' })\nconst DIMENSION_METADATA_KEY = 'hai_dimension'\nconst SPACE_METADATA_KEY = 'hnsw:space'\nconst HEARTBEAT_POLL_INTERVAL = 300\n\n/** Chroma Collection 的最小接口定义(避免强依赖可选包) */\ninterface ChromaCollection {\n metadata?: Record<string, unknown> | null\n add: (params: ChromaWriteParams) => Promise<unknown>\n upsert: (params: ChromaWriteParams) => Promise<unknown>\n delete: (params: { ids: string[] }) => Promise<unknown>\n query: (params: { queryEmbeddings: number[][], nResults?: number, where?: Record<string, unknown> }) => Promise<ChromaQueryResult>\n count: () => Promise<number>\n}\n\ninterface ChromaWriteParams {\n ids: string[]\n embeddings: number[][]\n documents?: (string | null)[]\n metadatas?: (Record<string, unknown> | null)[]\n}\n\ninterface ChromaQueryResult {\n ids: string[][]\n distances?: (number[] | null)[] | null\n documents?: ((string | null)[] | null)[] | null\n metadatas?: ((Record<string, unknown> | null)[] | null)[] | null\n}\n\ninterface ChromaClient {\n heartbeat: () => Promise<number>\n getOrCreateCollection: (params: { name: string, metadata?: Record<string, unknown>, embeddingFunction?: unknown }) => Promise<ChromaCollection>\n getCollection: (params: { name: string, embeddingFunction?: unknown }) => Promise<ChromaCollection>\n deleteCollection: (params: { name: string }) => Promise<unknown>\n listCollections: () => Promise<Array<{ name: string } | string>>\n}\n\n/** Chroma 模块的最小接口 */\ninterface ChromaModule {\n ChromaClient: new (params: Record<string, unknown>) => ChromaClient\n}\n\nfunction isChromaModule(value: unknown): value is ChromaModule {\n return typeof value === 'object' && value !== null && typeof (value as { ChromaClient?: unknown }).ChromaClient === 'function'\n}\n\n/**\n * 占位 embedding function:本 Provider 始终显式传入向量,此函数不会被调用。\n * 提供它是为了避免 Chroma 在无 embedding function 时加载默认实现(需额外依赖)。\n */\nconst NOOP_EMBEDDING_FUNCTION = {\n name: 'hai-noop',\n async generate(): Promise<number[][]> {\n throw new Error('Chroma embedding function should not be called: vectors are provided explicitly')\n },\n}\n\n/** DistanceMetric → Chroma hnsw:space */\nfunction toChromaSpace(metric: DistanceMetric): string {\n if (metric === 'euclidean')\n return 'l2'\n if (metric === 'dot')\n return 'ip'\n return 'cosine'\n}\n\n/** Chroma hnsw:space → DistanceMetric */\nfunction fromChromaSpace(space: unknown): DistanceMetric {\n if (space === 'l2')\n return 'euclidean'\n if (space === 'ip')\n return 'dot'\n return 'cosine'\n}\n\n/** 将 Chroma 距离转换为相似度分数 [0, 1] */\nfunction distanceToScore(distance: number, metric: DistanceMetric): number {\n if (metric === 'cosine')\n return Math.max(0, Math.min(1, 1 - distance))\n return 1 / (1 + Math.max(0, distance))\n}\n\n/** 构建 Chroma where 过滤条件(单键直接匹配,多键用 $and) */\nfunction buildWhere(filter?: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!filter)\n return undefined\n const entries = Object.entries(filter)\n if (entries.length === 0)\n return undefined\n if (entries.length === 1)\n return { [entries[0][0]]: entries[0][1] }\n return { $and: entries.map(([key, value]) => ({ [key]: value })) }\n}\n\n/**\n * 创建 Chroma Provider\n */\nexport function createChromaProvider(): VecdbProvider {\n let client: ChromaClient | null = null\n let config: ChromaConfig | null = null\n let serverProcess: ChildProcess | null = null\n\n function isMissingModuleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes('chromadb')\n }\n\n /** 动态加载 Chroma JS 客户端 */\n async function loadChromaModule(): Promise<HaiResult<ChromaModule>> {\n try {\n const mod = await import('chromadb')\n if (!isChromaModule(mod)) {\n const error = new Error('chromadb driver module does not export ChromaClient')\n logger.error('Failed to load Chroma driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error)) {\n logger.error('Failed to load Chroma driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n throw error\n }\n }\n\n /** 拉起本地 Chroma 服务(嵌入式模式) */\n function startEmbeddedServer(chromaConfig: ChromaConfig): void {\n const args = ['run', '--path', chromaConfig.path ?? './data/chroma', '--host', chromaConfig.host, '--port', String(chromaConfig.port)]\n logger.info('Starting embedded Chroma server', { command: chromaConfig.serverCommand, host: chromaConfig.host, port: chromaConfig.port })\n const proc = spawn(chromaConfig.serverCommand, args, { stdio: 'ignore' })\n proc.on('error', (error: Error) => {\n logger.error('Chroma server process error', { error: error.message })\n })\n serverProcess = proc\n }\n\n /** 停止本地 Chroma 服务 */\n function stopEmbeddedServer(): void {\n if (!serverProcess)\n return\n try {\n serverProcess.kill()\n }\n catch (error) {\n logger.warn('Failed to stop Chroma server', { error: error instanceof Error ? error.message : String(error) })\n }\n serverProcess = null\n }\n\n /** 轮询心跳直至就绪或超时 */\n async function waitForHeartbeat(chromaClient: ChromaClient, timeout: number): Promise<void> {\n const deadline = Date.now() + timeout\n let lastError: unknown\n while (Date.now() < deadline) {\n try {\n await chromaClient.heartbeat()\n return\n }\n catch (error) {\n lastError = error\n await delay(HEARTBEAT_POLL_INTERVAL)\n }\n }\n throw new Error(`Chroma heartbeat timed out after ${timeout}ms: ${lastError instanceof Error ? lastError.message : String(lastError)}`)\n }\n\n /** 获取集合(含维度校验所需的 metadata) */\n async function getCollection(name: string): Promise<ChromaCollection> {\n return client!.getCollection({ name, embeddingFunction: NOOP_EMBEDDING_FUNCTION })\n }\n\n /** 读取集合存储的维度 */\n function readDimension(collection: ChromaCollection): number {\n const value = collection.metadata?.[DIMENSION_METADATA_KEY]\n return typeof value === 'number' ? value : 0\n }\n\n function validateDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === 0 || expected === actual)\n return null\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', { params: { expected: String(expected), actual: String(actual) } }),\n )\n }\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const existing = await client!.listCollections()\n const exists = existing.some(item => (typeof item === 'string' ? item : item.name) === name)\n if (exists)\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n await client!.getOrCreateCollection({\n name,\n metadata: { [SPACE_METADATA_KEY]: toChromaSpace(metric), [DIMENSION_METADATA_KEY]: options.dimension },\n embeddingFunction: NOOP_EMBEDDING_FUNCTION,\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n const existing = await client!.listCollections()\n const exists = existing.some(item => (typeof item === 'string' ? item : item.name) === name)\n if (!exists)\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n await client!.deleteCollection({ name })\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n const existing = await client!.listCollections()\n return ok(existing.some(item => (typeof item === 'string' ? item : item.name) === name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n const existing = await client!.listCollections()\n if (!existing.some(item => (typeof item === 'string' ? item : item.name) === name))\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n const collection = await getCollection(name)\n const count = await collection.count()\n return ok({\n name,\n dimension: readDimension(collection),\n metric: fromChromaSpace(collection.metadata?.[SPACE_METADATA_KEY]),\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n const existing = await client!.listCollections()\n return ok(existing.map(item => (typeof item === 'string' ? item : item.name)))\n },\n }\n\n // ─── 向量操作适配器 ───\n\n function toWriteParams(documents: { id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }[]): ChromaWriteParams {\n return {\n ids: documents.map(doc => doc.id),\n embeddings: documents.map(doc => doc.vector),\n documents: documents.map(doc => doc.content ?? null),\n metadatas: documents.map(doc => ({ ...doc.metadata, _content: doc.content ?? '' })),\n }\n }\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.add(toWriteParams(documents))\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.upsert(toWriteParams(documents))\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n const target = await getCollection(collection)\n await target.delete({ ids })\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const target = await getCollection(collection)\n const expected = readDimension(target)\n const validation = validateDimension<VectorSearchResult[]>(expected, vector.length)\n if (validation)\n return validation\n\n const metric = fromChromaSpace(target.metadata?.[SPACE_METADATA_KEY])\n const response = await target.query({ queryEmbeddings: [vector], nResults: topK, where: buildWhere(options?.filter) })\n\n const ids = response.ids[0] ?? []\n const distances = response.distances?.[0] ?? []\n const metadatas = response.metadatas?.[0] ?? []\n\n const results: VectorSearchResult[] = []\n for (let i = 0; i < ids.length; i++) {\n const score = distanceToScore(distances[i] ?? 0, metric)\n if (score < minScore)\n continue\n const metadata = metadatas[i] ?? {}\n const { _content, ...rest } = metadata\n results.push({\n id: ids[i],\n score,\n content: typeof _content === 'string' && _content.length > 0 ? _content : undefined,\n metadata: Object.keys(rest).length > 0 ? rest : undefined,\n })\n }\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n const target = await getCollection(collection)\n return ok(await target.count())\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'chroma',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'chroma')\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n\n const chromaConfig = cfg as ChromaConfig\n const embedded = !!chromaConfig.path && !chromaConfig.url\n\n const loadResult = await loadChromaModule()\n if (!loadResult.success)\n return loadResult\n\n try {\n if (embedded)\n startEmbeddedServer(chromaConfig)\n\n const clientParams: Record<string, unknown> = chromaConfig.url\n ? { path: chromaConfig.url }\n : { host: chromaConfig.host, port: chromaConfig.port }\n if (chromaConfig.apiKey)\n clientParams.auth = { provider: 'token', credentials: chromaConfig.apiKey, tokenHeaderType: 'AUTHORIZATION' }\n\n // chromadb 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n const chromaClient = new loadResult.data.ChromaClient(clientParams) as unknown as ChromaClient\n await waitForHeartbeat(chromaClient, embedded ? chromaConfig.startupTimeout : 5000)\n\n client = chromaClient\n config = chromaConfig\n logger.info('Chroma connected', { embedded, host: chromaConfig.host, port: chromaConfig.port })\n return ok(undefined)\n }\n catch (error) {\n stopEmbeddedServer()\n logger.error('Failed to connect to Chroma', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n stopEmbeddedServer()\n client = null\n config = null\n logger.info('Chroma connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — LanceDB Provider\n *\n * 基于 LanceDB 的向量数据库 Provider 实现。\n * LanceDB 为嵌入式向量数据库,数据存储在本地文件系统中。\n * @module vecdb-provider-lancedb\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { LancedbConfig } from '../vecdb-config.js'\nimport type {\n CollectionInfo,\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createRequire } from 'node:module'\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\n// @lancedb/lancedb 为可选原生依赖,用 require 运行时加载(见 loadLancedb)\nconst require = createRequire(import.meta.url)\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'lancedb' })\n\n// ─── LanceDB 类型接口(动态 import 使用,避免强依赖可选包) ───\n\n/** LanceDB 连接的最小接口定义 */\ninterface LanceConnection {\n tableNames: () => Promise<string[]>\n openTable: (name: string) => Promise<LanceTable>\n createTable: (name: string, data: Record<string, unknown>[]) => Promise<LanceTable>\n dropTable: (name: string) => Promise<void>\n}\n\n/** LanceDB Table 的最小接口定义 */\ninterface LanceTable {\n add: (data: Record<string, unknown>[]) => Promise<void>\n delete: (filter: string) => Promise<void>\n countRows: () => Promise<number>\n mergeInsert?: (on: string | string[]) => LanceMergeInsertBuilder\n search: (...args: unknown[]) => LanceSearchQuery\n}\n\n/** LanceDB merge insert builder 的最小接口 */\ninterface LanceMergeInsertBuilder {\n whenMatchedUpdateAll: () => LanceMergeInsertBuilder\n whenNotMatchedInsertAll: () => LanceMergeInsertBuilder\n execute: (data: Record<string, unknown>[]) => Promise<unknown>\n}\n\n/** LanceDB 查询构建器的最小接口 */\ninterface LanceSearchQuery {\n limit: (n: number) => LanceSearchQuery\n where: (filter: string) => LanceSearchQuery\n toArray: () => Promise<Record<string, unknown>[]>\n}\n\n/** 转义 LanceDB filter 表达式中的字符串值(防注入 + LIKE 通配符) */\nfunction escapeLanceFilterValue(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_')\n}\n\n/**\n * 集合元信息(内存维护,LanceDB 不存储维度等信息)\n */\ninterface CollectionMeta {\n /** 向量维度 */\n dimension: number\n /** 距离度量 */\n metric: string\n}\n\n/**\n * 创建 LanceDB Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createLancedbProvider(): VecdbProvider {\n let connection: LanceConnection | null = null\n let config: LancedbConfig | null = null\n\n /** 集合元信息缓存 */\n const collectionMetas = new Map<string, CollectionMeta>()\n\n // ─── 辅助函数 ───\n\n /**\n * 加载 @lancedb/lancedb。\n *\n * 用 require 而非 import():import() 会被打包器(如 SvelteKit adapter-node)静态跟随并尝试\n * 内联原生 .node 二进制导致构建失败;require 为运行时调用,打包器不跟随,消费方无需将\n * @lancedb/lancedb 声明为直接依赖(与 @h-ai/reldb 加载 better-sqlite3 的方式一致)。\n */\n function loadLancedb(): HaiResult<typeof import('@lancedb/lancedb')> {\n try {\n const mod = require('@lancedb/lancedb') as typeof import('@lancedb/lancedb')\n return ok(mod)\n }\n catch (error) {\n logger.error('Failed to load @lancedb/lancedb', { error })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@lancedb/lancedb' } }), error)\n }\n }\n\n /**\n * 打开或创建 LanceDB Table\n */\n async function openTable(name: string): Promise<LanceTable | null> {\n if (!connection)\n return null\n try {\n const tableNames = await connection.tableNames()\n if (tableNames.includes(name)) {\n return await connection.openTable(name)\n }\n return null\n }\n catch {\n return null\n }\n }\n\n /** 获取集合维度(若未知则返回 null) */\n function getCollectionDimension(name: string): number | null {\n return collectionMetas.get(name)?.dimension ?? null\n }\n\n /** 创建统一的维度不匹配错误结果 */\n function createDimensionMismatchResult<T>(expected: number, actual: number): HaiResult<T> {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(collection: string, vector: number[]): HaiResult<T> | null {\n const expected = getCollectionDimension(collection)\n if (expected === null || vector.length === expected) {\n return null\n }\n\n return createDimensionMismatchResult<T>(expected, vector.length)\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(collection: string, documents: VectorDocument[]): HaiResult<void> | null {\n const expected = getCollectionDimension(collection)\n if (expected === null) {\n return null\n }\n\n for (const document of documents) {\n if (document.vector.length !== expected) {\n return createDimensionMismatchResult<void>(expected, document.vector.length)\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => connection !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const tableNames = await connection!.tableNames()\n if (tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建包含初始记录的表以确定 schema\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const initRecord = {\n id: '__init__',\n vector: Array.from({ length: dimension }).fill(0),\n content: '',\n metadata: '{}',\n }\n\n const table = await connection!.createTable(name, [initRecord])\n // 删除初始记录\n await table.delete('id = \"__init__\"')\n\n collectionMetas.set(name, { dimension, metric })\n\n logger.info('Collection created', { name, dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const tableNames = await connection!.tableNames()\n if (!tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await connection!.dropTable(name)\n collectionMetas.delete(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames.includes(name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = await openTable(name)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const count = await table.countRows()\n const meta = collectionMetas.get(name)\n\n return ok({\n name,\n dimension: meta?.dimension ?? 0,\n metric: (meta?.metric ?? config?.metric ?? 'cosine') as CollectionInfo['metric'],\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateDocumentsDimension(collection, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n await table.add(records)\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateDocumentsDimension(collection, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n if (typeof table.mergeInsert === 'function') {\n await table\n .mergeInsert('id')\n .whenMatchedUpdateAll()\n .whenNotMatchedInsertAll()\n .execute(records)\n }\n else {\n logger.warn('LanceDB mergeInsert is unavailable, falling back to delete/add upsert')\n const ids = documents.map(d => `\"${escapeLanceFilterValue(d.id)}\"`).join(', ')\n await table.delete(`id IN (${ids})`)\n await table.add(records)\n }\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const idList = ids.map(id => `\"${escapeLanceFilterValue(id)}\"`).join(', ')\n await table.delete(`id IN (${idList})`)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n logger.debug('Searching vectors', { collection, topK: options?.topK, hasFilter: !!options?.filter })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(collection, vector)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n let query = table.search(vector).limit(topK)\n\n // 应用元数据过滤\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n // LanceDB 过滤基于 SQL WHERE 子句(metadata 为 JSON 字符串)\n filterParts.push(`metadata LIKE '%\"${escapeLanceFilterValue(key)}\":\"${escapeLanceFilterValue(String(value))}\"%'`)\n }\n if (filterParts.length > 0) {\n query = query.where(filterParts.join(' AND '))\n }\n }\n\n const results = await query.toArray()\n\n const searchResults: VectorSearchResult[] = results\n .map((row: Record<string, unknown>) => {\n // LanceDB 返回 _distance(L2 距离),转换为相似度\n const distance = (row._distance as number) ?? 0\n const score = 1 / (1 + distance)\n\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) as Record<string, unknown> : undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const count = await table.countRows()\n return ok(count)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'lancedb',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'lancedb') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const lanceConfig = cfg as LancedbConfig\n const loadResult = loadLancedb()\n if (!loadResult.success)\n return loadResult\n\n const lancedb = loadResult.data\n\n try {\n // @lancedb/lancedb 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n connection = await lancedb.connect(lanceConfig.path) as unknown as LanceConnection\n config = lanceConfig\n\n // 恢复已有集合的元信息\n // 限制:LanceDB 不持久化维度/度量元信息,此处通过读取首条记录推断。\n // 若表为空或向量维度与探测维度不匹配,dimension 将为 0。\n const tableNames = await connection!.tableNames()\n await Promise.allSettled(tableNames.map(async (name) => {\n try {\n const table = await connection!.openTable(name)\n const count = await table.countRows()\n if (count === 0)\n return\n // 使用 1 维零向量探测,若真实维度不同 LanceDB 可能报错\n const rows = await table.search(Array.from({ length: 1 }).fill(0)).limit(1).toArray()\n if (rows.length > 0 && rows[0].vector) {\n collectionMetas.set(name, {\n dimension: (rows[0].vector as number[]).length,\n metric: lanceConfig.metric ?? 'cosine',\n })\n }\n }\n catch {\n // 无法推断维度(例如维度不匹配),跳过;info() 将返回 dimension=0\n }\n }))\n\n logger.info('LanceDB connected', { path: lanceConfig.path })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to connect to LanceDB', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n connection = null\n config = null\n collectionMetas.clear()\n logger.info('LanceDB connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return connection !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — pgvector Provider\n *\n * 基于 PostgreSQL + pgvector 扩展的向量数据库 Provider 实现。\n * 使用 pg 驱动连接,支持 IVFFlat 和 HNSW 索引。\n * @module vecdb-provider-pgvector\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PgvectorConfig } from '../vecdb-config.js'\nimport type {\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'pgvector' })\n\n/** pg Pool 的最小接口定义(避免强依赖可选包) */\ninterface PgPool {\n query: (text: string, params?: unknown[]) => Promise<{ rows: Record<string, unknown>[] }>\n end: () => Promise<void>\n}\n\n/** pg 模块的最小接口定义(避免强依赖可选包) */\ninterface PgModule {\n Pool: new (config: unknown) => PgPool\n}\n\nfunction isPgModule(value: unknown): value is PgModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { Pool?: unknown }\n return typeof maybeModule.Pool === 'function'\n}\n\n/**\n * 创建 pgvector Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createPgvectorProvider(): VecdbProvider {\n let pool: PgPool | null = null\n let config: PgvectorConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 获取完整表名(带前缀) */\n function tableName(collection: string): string {\n return `${config?.tablePrefix ?? 'vec_'}${collection}`\n }\n\n /** 双引号转义 SQL 标识符,支持含特殊字符的表名 */\n function quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`\n }\n\n /** 获取距离算符(pgvector 语法) */\n function distanceOp(): string {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine': return '<=>'\n case 'euclidean': return '<->'\n case 'dot': return '<#>'\n default: return '<=>'\n }\n }\n\n /** 将距离转换为相似度得分 [0, 1] */\n function distanceToScore(distance: number): number {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine':\n // cosine distance ∈ [0, 2],相似度 = 1 - distance/2 → [0, 1]\n return 1 - distance / 2\n case 'euclidean':\n return 1 / (1 + distance)\n case 'dot':\n // 内积距离为负内积,得分 = -distance\n return -distance\n default:\n return 1 / (1 + distance)\n }\n }\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 pg 驱动 */\n async function loadPg(): Promise<HaiResult<PgModule>> {\n try {\n const mod = await import('pg')\n if (!isPgModule(mod)) {\n const error = new Error('pg driver module does not export Pool')\n logger.error('Failed to load pg driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, 'pg')) {\n logger.error('Failed to load pg driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n throw error\n }\n }\n\n /** 获取集合维度;集合不存在时返回 COLLECTION_NOT_FOUND */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const table = tableName(name)\n\n const existsResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!existsResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const dimResult = await pool!.query(`\n SELECT atttypmod FROM pg_attribute\n WHERE attrelid = $1::regclass AND attname = 'vector'\n `, [quoteIdent(table)])\n\n return ok(dimResult.rows.length > 0 ? Number(dimResult.rows[0].atttypmod) : 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(expected: number, documents: VectorDocument[]): HaiResult<void> | null {\n for (const document of documents) {\n const validation = validateVectorDimension<void>(expected, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => pool !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n const table = tableName(name)\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const indexType = config?.indexType ?? 'hnsw'\n\n logger.debug('Creating collection', { name, dimension, metric, indexType })\n\n // 检查表是否已存在\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建表\n const qi = quoteIdent(table)\n await pool!.query(`\n CREATE TABLE ${qi} (\n id TEXT PRIMARY KEY,\n vector vector(${dimension}),\n content TEXT,\n metadata JSONB DEFAULT '{}'::jsonb\n )\n `)\n\n // 创建向量索引\n const distOp = distanceOp()\n const opsClass = distOp === '<=>'\n ? 'vector_cosine_ops'\n : distOp === '<->'\n ? 'vector_l2_ops'\n : 'vector_ip_ops'\n\n if (indexType === 'hnsw') {\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING hnsw (vector ${opsClass})\n `)\n }\n else {\n // IVFFlat lists 参数:建表时数据为空,使用 100 作为通用默认值\n // 适用于 100 万行以内的数据集;超大数据集应在数据增长后重建索引\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING ivfflat (vector ${opsClass})\n WITH (lists = 100)\n `)\n }\n\n logger.info('Collection created', { name, dimension, metric, indexType })\n return ok(undefined)\n },\n\n async drop(name) {\n const table = tableName(name)\n\n logger.debug('Dropping collection', { name })\n\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await pool!.query(`DROP TABLE ${quoteIdent(table)}`)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const result = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [tableName(name)],\n )\n return ok(result.rows[0].exists as boolean)\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = tableName(name)\n const dimensionResult = await getCollectionDimension(name)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n // 获取文档数量\n const countResult = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n const count = Number.parseInt(String(countResult.rows[0].count), 10)\n\n return ok({\n name,\n dimension: dimensionResult.data,\n metric: config?.metric ?? 'cosine',\n count,\n })\n },\n\n async list() {\n const prefix = config?.tablePrefix ?? 'vec_'\n\n logger.debug('Listing collections')\n\n const result = await pool!.query(\n `SELECT table_name FROM information_schema.tables WHERE table_name LIKE $1 AND table_schema = 'public'`,\n [`${prefix}%`],\n )\n const names = result.rows.map((row: Record<string, unknown>) =>\n String(row.table_name).slice(prefix.length),\n )\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建多值 INSERT(单条 SQL,避免 await-in-loop N+1 问题)\n // 注意:PostgreSQL 参数上限为 65535,每条文档占 4 个参数,单批最多 ~16383 条\n const qi = quoteIdent(table)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}`,\n params,\n )\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const qi = quoteIdent(table)\n // 构建多值 INSERT ON CONFLICT(单条 SQL,避免 await-in-loop N+1 问题)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}\n ON CONFLICT (id) DO UPDATE SET\n vector = EXCLUDED.vector,\n content = EXCLUDED.content,\n metadata = EXCLUDED.metadata`,\n params,\n )\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n const table = tableName(collection)\n\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(', ')\n await pool!.query(`DELETE FROM ${quoteIdent(table)} WHERE id IN (${placeholders})`, ids)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const table = tableName(collection)\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n const op = distanceOp()\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const vectorStr = `[${vector.join(',')}]`\n\n // 构建过滤条件\n let filterSQL = ''\n const filterParams: unknown[] = [vectorStr, topK]\n let paramIndex = 3\n\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n filterParts.push(`metadata->>$${paramIndex} = $${paramIndex + 1}`)\n filterParams.push(key, String(value))\n paramIndex += 2\n }\n if (filterParts.length > 0) {\n filterSQL = `WHERE ${filterParts.join(' AND ')}`\n }\n }\n\n const result = await pool!.query(\n `SELECT id, content, metadata, vector ${op} $1::vector AS distance\n FROM ${quoteIdent(table)}\n ${filterSQL}\n ORDER BY vector ${op} $1::vector\n LIMIT $2`,\n filterParams,\n )\n\n const searchResults: VectorSearchResult[] = result.rows\n .map((row: Record<string, unknown>) => {\n const score = distanceToScore(row.distance as number)\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata as Record<string, unknown> | undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n const table = tableName(collection)\n\n logger.debug('Counting vectors', { collection })\n\n const result = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n return ok(Number.parseInt(String(result.rows[0].count), 10))\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'pgvector',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'pgvector') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const pgConfig = cfg as PgvectorConfig\n\n try {\n const loadResult = await loadPg()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { Pool } = loadResult.data\n\n const poolConfig = pgConfig.url\n ? { connectionString: pgConfig.url }\n : {\n host: pgConfig.host,\n port: pgConfig.port,\n database: pgConfig.database,\n user: pgConfig.user,\n password: pgConfig.password,\n }\n\n pool = new Pool(poolConfig)\n\n // 确保 pgvector 扩展已启用\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n\n config = pgConfig\n\n logger.info('pgvector connected', { host: pgConfig.host, database: pgConfig.database })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的连接字符串泄漏密码\n logger.error('Failed to connect to pgvector', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n try {\n if (pool) {\n await pool.end()\n }\n pool = null\n config = null\n logger.info('pgvector connection closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to close pgvector connection', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: String(error) } }), error)\n }\n },\n\n isConnected(): boolean {\n return pool !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — Qdrant Provider\n *\n * 基于 Qdrant 向量搜索引擎的 Provider 实现。\n * 使用 @qdrant/js-client-rest 客户端连接。\n * @module vecdb-provider-qdrant\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, QdrantConfig } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createHash } from 'node:crypto'\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\n/** 脱敏 URL 中的用户名和密码 */\nfunction sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url)\n if (parsed.username)\n parsed.username = '***'\n if (parsed.password)\n parsed.password = '***'\n return parsed.toString()\n }\n catch {\n return '(invalid url)'\n }\n}\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'qdrant' })\n\n/** Qdrant Client 的最小接口定义(避免强依赖可选包) */\ninterface QdrantClient {\n getCollections: () => Promise<{ collections: { name: string }[] }>\n getCollection: QdrantGetCollectionMethod\n createCollection: (name: string, params: Record<string, unknown>) => Promise<unknown>\n deleteCollection: (name: string) => Promise<unknown>\n upsert: (collection: string, params: Record<string, unknown>) => Promise<unknown>\n delete: (collection: string, params: Record<string, unknown>) => Promise<unknown>\n search: (collection: string, params: Record<string, unknown>) => Promise<Record<string, unknown>[]>\n}\n\n/** Qdrant getCollection 的返回类型 */\ninterface QdrantCollectionInfo {\n config?: { params?: { vectors?: { size?: number, distance?: string } } }\n points_count?: number\n}\n\n/** Qdrant getCollection 特定错误对象的最小接口 */\ninterface QdrantGetCollectionError {\n getActualType?: () => { status?: number }\n}\n\n/** Qdrant getCollection 方法的最小接口(含 typed error 构造器) */\ninterface QdrantGetCollectionMethod {\n (name: string): Promise<QdrantCollectionInfo>\n Error?: new (...args: never[]) => QdrantGetCollectionError\n}\n\n/** Qdrant 模块的最小接口 */\ninterface QdrantModule {\n QdrantClient: new (config: { url: string, apiKey?: string }) => QdrantClient\n}\n\nfunction isQdrantModule(value: unknown): value is QdrantModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { QdrantClient?: unknown }\n return typeof maybeModule.QdrantClient === 'function'\n}\n\n/**\n * 将字符串 ID 转换为 UUID 格式(Qdrant 要求 UUID 或无符号整数作为 point ID)\n *\n * @param id - 原始字符串 ID\n * @returns UUID 格式字符串\n */\nfunction hashToUuid(id: string): string {\n const hash = createHash('sha256').update(id).digest('hex')\n return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`\n}\n\n/**\n * 将 DistanceMetric 转换为 Qdrant 距离类型名称\n */\nfunction toQdrantDistance(metric: DistanceMetric): string {\n switch (metric) {\n case 'cosine': return 'Cosine'\n case 'euclidean': return 'Euclid'\n case 'dot': return 'Dot'\n default: return 'Cosine'\n }\n}\n\n/**\n * 创建 Qdrant Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createQdrantProvider(): VecdbProvider {\n let client: QdrantClient | null = null\n let config: QdrantConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 Qdrant JS 客户端 */\n async function loadQdrantClient(): Promise<HaiResult<QdrantModule>> {\n try {\n const mod = await import('@qdrant/js-client-rest')\n if (!isQdrantModule(mod)) {\n const error = new Error('@qdrant/js-client-rest driver module does not export QdrantClient')\n logger.error('Failed to load Qdrant driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, '@qdrant/js-client-rest')) {\n logger.error('Failed to load Qdrant driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n throw error\n }\n }\n\n /** 判断 Qdrant 错误是否为 404(集合不存在) */\n function isQdrantNotFoundError(error: unknown): boolean {\n const getCollectionErrorCtor = client?.getCollection.Error\n if (getCollectionErrorCtor && error instanceof getCollectionErrorCtor) {\n return error.getActualType?.().status === 404\n }\n\n const maybeError = error as {\n status?: number\n response?: { status?: number }\n $metadata?: { httpStatusCode?: number }\n }\n\n return maybeError.status === 404\n || maybeError.response?.status === 404\n || maybeError.$metadata?.httpStatusCode === 404\n }\n\n /** 获取集合信息;集合不存在时返回 COLLECTION_NOT_FOUND,其余异常继续抛出 */\n async function getCollectionInfo(name: string): Promise<HaiResult<QdrantCollectionInfo>> {\n try {\n return ok(await client!.getCollection(name))\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n throw error\n }\n }\n\n /** 获取集合维度 */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n return ok(infoResult.data.config?.params?.vectors?.size ?? 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n // 检查集合是否已存在\n const collections = await client!.getCollections()\n const exists = collections.collections.some((c: { name: string }) => c.name === name)\n if (exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n\n await client!.createCollection(name, {\n vectors: {\n size: options.dimension,\n distance: toQdrantDistance(metric),\n },\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n await client!.deleteCollection(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n try {\n await client!.getCollection(name)\n return ok(true)\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return ok(false)\n }\n throw error\n }\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n const collectionInfo = infoResult.data\n\n const vectorsConfig = collectionInfo.config?.params?.vectors\n const dimension = vectorsConfig?.size ?? 0\n\n // 从 Qdrant distance 字符串映射回 DistanceMetric\n const qdrantDistance = vectorsConfig?.distance ?? 'Cosine'\n const metric: DistanceMetric = qdrantDistance === 'Euclid'\n ? 'euclidean'\n : qdrantDistance === 'Dot' ? 'dot' : 'cosine'\n\n return ok({\n name,\n dimension,\n metric,\n count: collectionInfo.points_count ?? 0,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const collections = await client!.getCollections()\n const names = collections.collections.map((c: { name: string }) => c.name)\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n // 限制:Qdrant API 仅提供 upsert,无原生 strict insert;\n // ID 已存在时会静默覆盖而非报错,行为等同于 upsert。\n await client!.upsert(collection, { points })\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n await client!.upsert(collection, { points })\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const uuids = ids.map(hashToUuid)\n await client!.delete(collection, { points: uuids })\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建过滤条件\n let filter: Record<string, unknown> | undefined\n if (options?.filter && Object.keys(options.filter).length > 0) {\n const mustConditions = Object.entries(options.filter).map(([key, value]) => ({\n key,\n match: { value },\n }))\n filter = { must: mustConditions }\n }\n\n const searchResult = await client!.search(collection, {\n vector,\n limit: topK,\n score_threshold: minScore > 0 ? minScore : undefined,\n filter,\n with_payload: true,\n })\n\n const results: VectorSearchResult[] = searchResult.map((point: Record<string, unknown>) => {\n const payload = point.payload as Record<string, unknown> ?? {}\n const { _id, _content, ...metadata } = payload\n return {\n id: (_id as string) ?? '',\n score: point.score as number,\n content: (_content as string) || undefined,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n }\n })\n\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n const infoResult = await getCollectionInfo(collection)\n if (!infoResult.success) {\n return infoResult\n }\n\n return ok(infoResult.data.points_count ?? 0)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'qdrant',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'qdrant') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const qdrantConfig = cfg as QdrantConfig\n\n try {\n const loadResult = await loadQdrantClient()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { QdrantClient: QdrantClientClass } = loadResult.data\n\n // @qdrant/js-client-rest 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n const qdrantClient = new QdrantClientClass({\n url: qdrantConfig.url,\n apiKey: qdrantConfig.apiKey,\n }) as unknown as QdrantClient\n\n // 验证连接\n await qdrantClient.getCollections()\n\n client = qdrantClient\n\n config = qdrantConfig\n logger.info('Qdrant connected', { url: sanitizeUrl(qdrantConfig.url) })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的 URL 或连接信息泄漏\n logger.error('Failed to connect to Qdrant', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n client = null\n config = null\n logger.info('Qdrant connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — 向量数据库服务主入口\n *\n * 本文件提供统一的 `vecdb` 对象,聚合所有向量数据库操作功能。\n * @module vecdb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { VecdbProvider } from './providers/vecdb-provider-base.js'\nimport type { VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport type {\n CollectionOperations,\n VecdbConnection,\n VecdbFunctions,\n VectorOperations,\n} from './vecdb-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { createChromaProvider } from './providers/vecdb-provider-chroma.js'\nimport { createLancedbProvider } from './providers/vecdb-provider-lancedb.js'\nimport { createPgvectorProvider } from './providers/vecdb-provider-pgvector.js'\nimport { createQdrantProvider } from './providers/vecdb-provider-qdrant.js'\nimport { VecdbConfigSchema } from './vecdb-config.js'\nimport { vecdbM } from './vecdb-i18n.js'\nimport { HaiVecdbError } from './vecdb-types.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的向量数据库 Provider(未初始化时为 null) */\nlet currentProvider: VecdbProvider | null = null\n\n/** 当前向量数据库配置(未初始化时为 null) */\nlet currentConfig: VecdbConfig | null = null\n\n/** init() 是否正在执行(并发防护) */\nlet initInProgress = false\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的向量数据库 Provider\n *\n * @param config - 向量数据库配置(已校验、默认值补齐)\n * @returns Provider 实例\n */\nfunction createProvider(config: VecdbConfig): VecdbProvider {\n switch (config.type) {\n case 'lancedb':\n return createLancedbProvider()\n case 'pgvector':\n return createPgvectorProvider()\n case 'qdrant':\n return createQdrantProvider()\n case 'chroma':\n return createChromaProvider()\n }\n}\n\n// ─── 未初始化时的占位操作 ───\n\n/** 未初始化工具集 */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiVecdbError.NOT_INITIALIZED,\n () => vecdbM('vecdb_notInitialized'),\n)\n\n/** 未初始化时的集合操作占位对象 */\nconst notInitializedCollection = notInitialized.proxy<CollectionOperations>()\n\n/** 未初始化时的向量操作占位对象 */\nconst notInitializedVector = notInitialized.proxy<VectorOperations>()\n\n// ─── 统一向量数据库服务对象 ───\n\n/**\n * 向量数据库服务对象\n *\n * 统一的向量数据库访问入口,提供以下功能:\n * - `vecdb.init()` - 初始化连接\n * - `vecdb.close()` - 关闭连接\n * - `vecdb.collection` - 集合管理(创建/删除/查询)\n * - `vecdb.vector` - 向量操作(插入/搜索/删除)\n * - `vecdb.config` - 当前配置\n * - `vecdb.isInitialized` - 初始化状态\n *\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * // 初始化(LanceDB)\n * await vecdb.init({ type: 'lancedb', path: './data/vecdb' })\n *\n * // 集合操作\n * await vecdb.collection.create('docs', { dimension: 1536 })\n *\n * // 向量操作\n * await vecdb.vector.insert('docs', [\n * { id: '1', vector: [...], content: '文档内容' },\n * ])\n *\n * // 搜索\n * const result = await vecdb.vector.search('docs', queryVector, { topK: 5 })\n *\n * // 关闭\n * await vecdb.close()\n * ```\n */\nexport const vecdb: VecdbFunctions = {\n /**\n * 初始化向量数据库连接\n *\n * @param config - 向量数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n */\n async init(config: VecdbConfigInput): Promise<HaiResult<void>> {\n // 并发防护:防止多次同时调用导致 Provider/连接泄漏\n if (initInProgress) {\n logger.warn('Vecdb init already in progress, skipping concurrent call')\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_initInProgress'))\n }\n initInProgress = true\n\n try {\n if (currentProvider) {\n logger.warn('Vecdb module is already initialized, reinitializing')\n const closeResult = await vecdb.close()\n if (!closeResult.success) {\n return closeResult\n }\n }\n\n logger.info('Initializing vecdb module')\n\n const parseResult = VecdbConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('Vecdb config validation failed', { error: parseResult.error.message })\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_configError', { params: { error: parseResult.error.message } }), parseResult.error)\n }\n const parsed = parseResult.data\n\n try {\n const provider = createProvider(parsed)\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('Vecdb module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return connectResult\n }\n currentProvider = provider\n currentConfig = parsed\n logger.info('Vecdb module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module initialization failed', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_initFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n finally {\n initInProgress = false\n }\n },\n\n /**\n * 获取集合管理操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get collection(): CollectionOperations {\n return currentProvider?.collection ?? notInitializedCollection\n },\n\n /**\n * 获取向量操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get vector(): VectorOperations {\n return currentProvider?.vector ?? notInitializedVector\n },\n\n /** 获取当前脱敏配置快照(未初始化时为 null) */\n get config(): VecdbConfig | null {\n return currentConfig ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null\n },\n\n /** 获取底层后端的原始连接信息(含凭证,未初始化时为 null;仅供同进程内集成使用) */\n get rawConnection(): VecdbConnection | null {\n if (!currentConfig)\n return null\n if (currentConfig.type === 'qdrant')\n return { type: 'qdrant', url: currentConfig.url, apiKey: currentConfig.apiKey }\n if (currentConfig.type === 'pgvector') {\n return {\n type: 'pgvector',\n connectionString: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n database: currentConfig.database,\n user: currentConfig.user,\n password: currentConfig.password,\n }\n }\n if (currentConfig.type === 'chroma') {\n return {\n type: 'chroma',\n url: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n apiKey: currentConfig.apiKey,\n path: currentConfig.path,\n }\n }\n return { type: currentConfig.type, path: currentConfig.path }\n },\n\n /** 检查是否已初始化 */\n get isInitialized(): boolean {\n return currentProvider !== null && currentProvider.isConnected()\n },\n\n /**\n * 关闭向量数据库连接\n *\n * 多次调用安全,未初始化时直接返回。\n */\n async close(): Promise<HaiResult<void>> {\n if (!currentProvider) {\n currentConfig = null\n logger.info('Vecdb module already closed, skipping')\n return ok(undefined)\n }\n\n logger.info('Closing vecdb module')\n\n try {\n const closeResult = await currentProvider.close()\n if (!closeResult.success) {\n logger.error('Vecdb module close failed', { code: closeResult.error.code, message: closeResult.error.message })\n return closeResult\n }\n logger.info('Vecdb module closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module close failed', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n finally {\n currentProvider = null\n currentConfig = null\n }\n },\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/vecdb",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.56",
|
|
5
5
|
"description": "Hai Framework vector database module for LanceDB, pgvector, Qdrant, and Chroma.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"exports": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"zod": "^4.4.3",
|
|
27
|
-
"@h-ai/core": "0.1.0-alpha.
|
|
27
|
+
"@h-ai/core": "0.1.0-alpha.56"
|
|
28
28
|
},
|
|
29
29
|
"optionalDependencies": {
|
|
30
30
|
"@lancedb/lancedb": "^0.27.2",
|