@h-ai/vecdb 0.1.0-alpha5

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.
@@ -0,0 +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-lancedb.ts","../src/providers/vecdb-provider-pgvector.ts","../src/providers/vecdb-provider-qdrant.ts","../src/vecdb-main.ts"],"names":["core","err","logger","ok"],"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_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_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 三种后端。\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 */\nexport const VecdbTypeSchema = z.enum(['lancedb', 'pgvector', 'qdrant'])\n\n/** 向量数据库类型 */\nexport type VecdbType = z.infer<typeof VecdbTypeSchema>\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\n// ─── LanceDB 配置 ───\n\n/**\n * LanceDB 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'lancedb', path: './data/vecdb' }\n * ```\n */\nexport const 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})\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 */\nexport const 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 */\nexport const 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})\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 */\nexport const 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})\n\n/** Qdrant 配置类型 */\nexport type QdrantConfig = z.infer<typeof QdrantConfigSchema>\n\n// ─── 统一配置 ───\n\n/**\n * 统一向量数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同向量数据库类型的配置。\n */\nexport const VecdbConfigSchema = z.discriminatedUnion('type', [\n LancedbConfigSchema,\n PgvectorConfigSchema,\n QdrantConfigSchema,\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 */\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 */\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 */\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 readonly isInitialized: boolean\n /** 集合管理操作 */\n readonly collection: CollectionOperations\n /** 向量操作 */\n readonly vector: VectorOperations\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 } 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 } 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 }\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\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: (name, options) => wrapOp(\n ctx,\n () => driver.create(name, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to create collection',\n { name },\n ),\n drop: name => wrapOp(\n ctx,\n () => driver.drop(name),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to drop collection',\n { name },\n ),\n exists: name => wrapOp(\n ctx,\n () => driver.exists(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to check collection',\n { name },\n ),\n info: name => wrapOp(\n ctx,\n () => driver.info(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to get collection info',\n { name },\n ),\n list: () => 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) => wrapOp(\n ctx,\n () => driver.insert(collection, documents),\n HaiVecdbError.INSERT_FAILED,\n 'Failed to insert vectors',\n { collection },\n ),\n upsert: (collection, documents) => wrapOp(\n ctx,\n () => driver.upsert(collection, documents),\n HaiVecdbError.UPDATE_FAILED,\n 'Failed to upsert vectors',\n { collection },\n ),\n delete: (collection, ids) => wrapOp(\n ctx,\n () => driver.delete(collection, ids),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to delete vectors',\n { collection },\n ),\n search: (collection, vector, options) => wrapOp(\n ctx,\n () => driver.search(collection, vector, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to search vectors',\n { collection },\n ),\n count: collection => wrapOp(\n ctx,\n () => driver.count(collection),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to count vectors',\n { collection },\n ),\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 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 search: (...args: unknown[]) => LanceSearchQuery\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 // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => connection !== null, logger }\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 }, () => 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 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 // LanceDB 不支持原子 upsert,当前实现为 delete + add 两步操作。\n // 若在 delete 之后、add 之前发生错误,已删除的记录将丢失。\n // TODO: LanceDB 未来支持 mergeInsert 后可替换为原子操作\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 // 先删除已存在的记录,再插入\n const ids = documents.map(d => `\"${escapeLanceFilterValue(d.id)}\"`).join(', ')\n await table.delete(`id IN (${ids})`)\n await table.add(records)\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 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 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/**\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 // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => pool !== null, logger }\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 const table = tableName(name)\n\n logger.debug('Getting collection info', { name })\n\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 // 获取文档数量\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 // 获取向量维度(从列定义中提取)\n const dimResult = await pool!.query(`\n SELECT atttypmod FROM pg_attribute\n WHERE attrelid = $1::regclass AND attname = 'vector'\n `, [quoteIdent(table)])\n const dimension = dimResult.rows.length > 0 ? Number(dimResult.rows[0].atttypmod) : 0\n\n return ok({\n name,\n dimension,\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 // 构建多值 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 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 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 // 动态加载 pg\n const { Pool } = await import('pg')\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\nconst logger = core.logger.child({ module: 'vecdb', scope: 'qdrant' })\n\n/** Qdrant Client 的最小接口定义(避免强依赖可选包) */\ninterface QdrantClient {\n getCollections: () => Promise<{ collections: { name: string }[] }>\n getCollection: (name: string) => Promise<{ config?: { params?: { vectors?: { size?: number, distance?: string } } }, points_count?: number }>\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/**\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 const ctx = { isConnected: () => client !== null, logger }\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 // 先用 getCollection 确认存在,不存在时会抛出异常\n try {\n await client!.getCollection(name)\n }\n catch {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\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 {\n // 限制:Qdrant SDK getCollection 在集合不存在时抛出 404 异常,\n // 但网络错误也会抛异常,当前无法区分两者。\n // 网络不可用时可能误判为“不存在”。\n return ok(false)\n }\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n let collectionInfo: Awaited<ReturnType<QdrantClient['getCollection']>>\n try {\n collectionInfo = await client!.getCollection(name)\n }\n catch {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\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 points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n _id: doc.id,\n content: doc.content ?? '',\n ...doc.metadata,\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 points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n _id: doc.id,\n content: doc.content ?? '',\n ...doc.metadata,\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 // 构建过滤条件\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 info = await client!.getCollection(collection)\n return ok(info.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 { QdrantClient: QdrantClientClass } = await import('@qdrant/js-client-rest')\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: 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 VecdbFunctions,\n VectorOperations,\n} from './vecdb-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\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 }\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 await vecdb.close()\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\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 ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@h-ai/vecdb",
3
+ "type": "module",
4
+ "version": "0.1.0-alpha5",
5
+ "description": "Hai Framework vector database module for LanceDB, pgvector, and Qdrant.",
6
+ "license": "Apache-2.0",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "dependencies": {
23
+ "zod": "^4.3.6",
24
+ "@h-ai/core": "0.1.0-alpha5"
25
+ },
26
+ "optionalDependencies": {
27
+ "@lancedb/lancedb": "^0.26.2",
28
+ "@qdrant/js-client-rest": "^1.13.0",
29
+ "pg": "^8.13.1"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^25.1.0",
33
+ "@types/pg": "^8.11.10",
34
+ "rimraf": "^6.0.1",
35
+ "testcontainers": "^11.11.0",
36
+ "tsup": "^8.3.5",
37
+ "typescript": "^5.7.2",
38
+ "vitest": "^4.0.18"
39
+ },
40
+ "scripts": {
41
+ "build": "tsup",
42
+ "dev": "tsup --watch",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "typecheck": "tsc --noEmit",
46
+ "lint": "eslint .",
47
+ "lint:fix": "eslint . --fix",
48
+ "clean": "rimraf dist .turbo"
49
+ }
50
+ }