vecbox 0.2.2 → 0.2.3

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.cjs CHANGED
@@ -5,12 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __esm = (fn, res) => function __init() {
9
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
- };
11
- var __commonJS = (cb, mod) => function __require() {
12
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
- };
14
8
  var __export = (target, all) => {
15
9
  for (var name in all)
16
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -33,65 +27,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
33
27
  ));
34
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
29
 
36
- // native/build/Release/llama_embedding.node
37
- var llama_embedding_default;
38
- var init_llama_embedding = __esm({
39
- "native/build/Release/llama_embedding.node"() {
40
- llama_embedding_default = "./llama_embedding-EC3MWSUZ.node";
41
- }
42
- });
43
-
44
- // node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node
45
- var require_llama_embedding = __commonJS({
46
- "node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node"(exports2, module2) {
47
- "use strict";
48
- init_llama_embedding();
49
- try {
50
- module2.exports = require(llama_embedding_default);
51
- } catch {
52
- }
53
- }
54
- });
55
-
56
- // native/index.js
57
- var require_native = __commonJS({
58
- "native/index.js"(exports2, module2) {
59
- "use strict";
60
- var binding = require_llama_embedding();
61
- var LlamaEmbedding = class {
62
- constructor(modelPath) {
63
- this.modelPtr = binding.createModel(modelPath);
64
- if (!this.modelPtr) {
65
- throw new Error("Failed to load model");
66
- }
67
- }
68
- embed(text) {
69
- if (typeof text !== "string") {
70
- throw new Error("Text must be a string");
71
- }
72
- const embedding = binding.getEmbedding(this.modelPtr, text);
73
- if (!embedding) {
74
- throw new Error("Failed to generate embedding");
75
- }
76
- return embedding;
77
- }
78
- close() {
79
- if (this.modelPtr) {
80
- binding.destroyModel(this.modelPtr);
81
- this.modelPtr = null;
82
- }
83
- }
84
- };
85
- function create(modelPath) {
86
- return new LlamaEmbedding(modelPath);
87
- }
88
- module2.exports = {
89
- create,
90
- LlamaEmbedding
91
- };
92
- }
93
- });
94
-
95
30
  // index.ts
96
31
  var index_exports = {};
97
32
  __export(index_exports, {
@@ -126,8 +61,8 @@ var EmbeddingProvider = class {
126
61
  return input.text;
127
62
  }
128
63
  if (input.filePath) {
129
- const fs2 = await import("fs/promises");
130
- return await fs2.readFile(input.filePath, "utf-8");
64
+ const fs = await import("fs/promises");
65
+ return await fs.readFile(input.filePath, "utf-8");
131
66
  }
132
67
  throw new Error("Either text or filePath must be provided");
133
68
  }
@@ -394,6 +329,9 @@ var GeminiProvider = class extends EmbeddingProvider {
394
329
  var import_mistralai = require("@mistralai/mistralai");
395
330
  var logger4 = Logger.createModuleLogger("mistral");
396
331
  var MistralProvider = class extends EmbeddingProvider {
332
+ getModel() {
333
+ return this.config.model || "mistral-embed";
334
+ }
397
335
  constructor(config2) {
398
336
  super(config2);
399
337
  if (!config2.apiKey) {
@@ -484,10 +422,32 @@ var MistralProvider = class extends EmbeddingProvider {
484
422
 
485
423
  // src/providers/llamacpp.ts
486
424
  var import_promises = require("fs/promises");
425
+ var import_path = require("path");
487
426
  var nativeModule = null;
488
427
  try {
489
- nativeModule = require_native();
490
- logger.info("Using native Llama.cpp module");
428
+ const possiblePaths = [
429
+ "../../native",
430
+ // Development
431
+ "vecbox/native",
432
+ // Installed as dependency
433
+ "./native",
434
+ // Same directory
435
+ "../native",
436
+ // One level up
437
+ "../vecbox/native"
438
+ // When installed via npm
439
+ ];
440
+ for (const path of possiblePaths) {
441
+ try {
442
+ nativeModule = require(path);
443
+ logger.info(`Using native Llama.cpp module from: ${path}`);
444
+ break;
445
+ } catch (e) {
446
+ }
447
+ }
448
+ if (!nativeModule) {
449
+ throw new Error("Native module not found in any path");
450
+ }
491
451
  } catch (error) {
492
452
  logger.warn("Native module not available, falling back to HTTP");
493
453
  }
@@ -539,20 +499,6 @@ var LlamaCppProvider = class extends EmbeddingProvider {
539
499
  return false;
540
500
  }
541
501
  }
542
- async loadGGUFModel(modelPath) {
543
- try {
544
- logger.debug(`Loading GGUF model from: ${modelPath}`);
545
- const modelBuffer = await fs.readFile(modelPath);
546
- if (!modelBuffer) {
547
- throw new Error(`Failed to read model file: ${modelPath}`);
548
- }
549
- logger.debug(`Model file loaded, size: ${modelBuffer.length} bytes`);
550
- return modelBuffer;
551
- } catch (error) {
552
- logger.error(`Failed to load GGUF model: ${error instanceof Error ? error.message : String(error)}`);
553
- throw error;
554
- }
555
- }
556
502
  generateEmbedding(modelBuffer, text) {
557
503
  logger.debug(`Generating embedding with model buffer (${modelBuffer.length} bytes)`);
558
504
  const embedding = [];
@@ -577,7 +523,7 @@ var LlamaCppProvider = class extends EmbeddingProvider {
577
523
  provider: "llamacpp"
578
524
  };
579
525
  }
580
- throw new Error("Direct Llama.cpp core integration not yet implemented. Please use HTTP fallback or wait for next version.");
526
+ throw new Error("Direct Llama.cpp integration requires native module. Please ensure native module is properly compiled.");
581
527
  } catch (error) {
582
528
  logger.error(`Llama.cpp embedding failed: ${error instanceof Error ? error.message : String(error)}`);
583
529
  throw error;
@@ -587,53 +533,25 @@ var LlamaCppProvider = class extends EmbeddingProvider {
587
533
  try {
588
534
  logger.debug(`Batch embedding ${inputs.length} texts with llama.cpp`);
589
535
  if (this.useNative && this.nativeModel) {
590
- const embeddings2 = [];
536
+ const embeddings = [];
591
537
  for (const input of inputs) {
592
538
  const text = await this.readInput(input);
593
539
  if (text.trim()) {
594
540
  const embedding = this.nativeModel.embed(text);
595
- embeddings2.push(embedding);
541
+ embeddings.push(embedding);
596
542
  }
597
543
  }
598
- if (embeddings2.length === 0) {
544
+ if (embeddings.length === 0) {
599
545
  throw new Error("No valid texts to embed");
600
546
  }
601
547
  return {
602
- embeddings: embeddings2,
603
- dimensions: embeddings2[0]?.length || 0,
548
+ embeddings,
549
+ dimensions: embeddings[0]?.length || 0,
604
550
  model: this.getModel(),
605
551
  provider: "llamacpp"
606
552
  };
607
553
  }
608
- const texts = [];
609
- for (const input of inputs) {
610
- const text = await this.readInput(input);
611
- if (text.trim()) {
612
- texts.push(text);
613
- }
614
- }
615
- if (texts.length === 0) {
616
- throw new Error("No valid texts to embed");
617
- }
618
- const modelPath = await this.getModelPath();
619
- const requests = inputs.map((input, v) => ({
620
- input: input.text || "",
621
- model: modelPath,
622
- pooling: "mean",
623
- normalize: 2
624
- }));
625
- const embeddings = [];
626
- for (const request of requests) {
627
- const result = await this.executeLlamaEmbedding([JSON.stringify(request)]);
628
- const embedding = this.parseRawOutput(result.stdout);
629
- embeddings.push(embedding);
630
- }
631
- return {
632
- embeddings,
633
- dimensions: embeddings[0]?.length || 0,
634
- model: this.getModel(),
635
- provider: "llamacpp"
636
- };
554
+ throw new Error("Direct Llama.cpp integration requires native module. Please ensure native module is properly compiled.");
637
555
  } catch (error) {
638
556
  logger.error(`Llama.cpp batch embedding failed: ${error instanceof Error ? error.message : String(error)}`);
639
557
  throw error;
@@ -655,6 +573,29 @@ var LlamaCppProvider = class extends EmbeddingProvider {
655
573
  getModel() {
656
574
  return this.modelPath;
657
575
  }
576
+ async getModelPath() {
577
+ if (this.modelPath.startsWith("/") || this.modelPath.startsWith("./")) {
578
+ return this.modelPath;
579
+ }
580
+ const possiblePaths = [
581
+ (0, import_path.resolve)(this.modelPath),
582
+ // Current directory
583
+ (0, import_path.join)("core/models", this.modelPath),
584
+ // core/models subdirectory
585
+ (0, import_path.join)("models", this.modelPath),
586
+ // models subdirectory
587
+ (0, import_path.join)(__dirname, "../../core/models", this.modelPath)
588
+ // Relative to dist
589
+ ];
590
+ for (const path of possiblePaths) {
591
+ try {
592
+ await (0, import_promises.access)(path, import_promises.constants.F_OK);
593
+ return path;
594
+ } catch (e) {
595
+ }
596
+ }
597
+ return this.modelPath;
598
+ }
658
599
  };
659
600
 
660
601
  // src/factory/EmbeddingFactory.ts
@@ -742,16 +683,16 @@ function createProvider(config2) {
742
683
  }
743
684
 
744
685
  // index.ts
745
- var VERSION = "1.0.0";
686
+ var VERSION = "0.2.3";
746
687
  function getVersion() {
747
688
  return VERSION;
748
689
  }
749
690
  var LIB_INFO = {
750
- name: "embedbox",
691
+ name: "vecbox",
751
692
  version: VERSION,
752
693
  description: "A minimal and powerful embedding library",
753
- homepage: "https://embedbox.dev",
754
- repository: "https://github.com/embedbox/embedbox.git",
694
+ homepage: "https://boxsafe.dev",
695
+ repository: "https://github.com/boxsafe/vecbox.git",
755
696
  supportedProviders: [
756
697
  "openai",
757
698
  "gemini",
@@ -1 +1 @@
1
- {"version":3,"sources":["node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node","../native/index.js","../index.ts","../main.ts","../src/providers/openai.ts","../src/providers/base/EmbeddingProvider.ts","../src/util/logger.ts","../src/providers/gemini.ts","../src/providers/mistral.ts","../src/providers/llamacpp.ts","../src/factory/EmbeddingFactory.ts"],"sourcesContent":["\n import path from \"/home/inky/Development/vecbox/native/build/Release/llama_embedding.node\"\n try { module.exports = require(path) }\n catch {}\n ","const binding = require('./build/Release/llama_embedding.node');\n\nclass LlamaEmbedding {\n constructor(modelPath) {\n this.modelPtr = binding.createModel(modelPath);\n if (!this.modelPtr) {\n throw new Error('Failed to load model');\n }\n }\n\n embed(text) {\n if (typeof text !== 'string') {\n throw new Error('Text must be a string');\n }\n \n const embedding = binding.getEmbedding(this.modelPtr, text);\n if (!embedding) {\n throw new Error('Failed to generate embedding');\n }\n \n return embedding;\n }\n\n close() {\n if (this.modelPtr) {\n binding.destroyModel(this.modelPtr);\n this.modelPtr = null;\n }\n }\n}\n\nfunction create(modelPath) {\n return new LlamaEmbedding(modelPath);\n}\n\nmodule.exports = {\n create,\n LlamaEmbedding\n};\n","/**\n * Embedbox v1.0.0 - Main Entry Point\n * \n * A minimal and powerful embedding library that supports multiple providers\n * with automatic detection and fallback capabilities.\n */\n\n// Export main functions\nexport { embed, autoEmbed, getSupportedProviders, createProvider } from './main.js';\n\n// Export types\nexport type { \n EmbedConfig, \n EmbedInput, \n EmbedResult, \n BatchEmbedResult, \n ProviderType \n} from './src/types/index.js';\n\n// Export provider factory for advanced usage\nexport { EmbeddingFactory } from './src/factory/EmbeddingFactory.js';\n\n// Export base provider for custom implementations\nexport { EmbeddingProvider } from './src/providers/base/EmbeddingProvider.js';\n\n// Version information\nexport const VERSION = '1.0.0';\n\n/**\n * Get library version\n */\nexport function getVersion(): string {\n return VERSION;\n}\n\n/**\n * Library information\n */\nexport const LIB_INFO = {\n name: 'embedbox',\n version: VERSION,\n description: 'A minimal and powerful embedding library',\n homepage: 'https://embedbox.dev',\n repository: 'https://github.com/embedbox/embedbox.git',\n supportedProviders: [\n 'openai',\n 'gemini', \n 'mistral',\n 'llamacpp'\n ] as const\n} as const;\n","import * as dotenv from 'dotenv';\nimport { EmbeddingFactory } from '@src/factory/EmbeddingFactory.js';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index.js';\nimport { Logger } from '@src/util/logger.js';\n\n// Load environment variables\ndotenv.config();\n\nconst logger = Logger.createModuleLogger('main');\n\n/**\n * Main embedding interface - Simple and minimal API\n * \n * @param config - Provider configuration\n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function embed(\n config: EmbedConfig,\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n try {\n logger.info(`Starting embedding with provider: ${config.provider}`);\n \n // Create provider instance\n const provider = EmbeddingFactory.create(config);\n \n // Check if provider is ready\n const isReady = await provider.isReady();\n if (!isReady) {\n throw new Error(`Provider ${config.provider} is not ready`);\n }\n \n // Handle single input or batch\n if (Array.isArray(input)) {\n logger.debug(`Processing batch of ${input.length} items`);\n return await provider.embedBatch(input);\n } else {\n logger.debug(`Processing single item`);\n return await provider.embed(input);\n }\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Embedding failed: ${errorMessage}`);\n throw error;\n }\n}\n\n/**\n * Convenience function for quick embedding with auto-detection\n * \n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function autoEmbed(\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n logger.info('Auto-detecting best provider...');\n \n // Try providers in order of preference\n const providers = [\n { provider: 'llamacpp' as const, model: 'nomic-embed-text-v1.5.Q4_K_M.gguf' }, // Local & free (llama.cpp)\n { provider: 'openai' as const, model: 'text-embedding-3-small', apiKey: process.env.OPENAI_API_KEY || undefined },\n { provider: 'gemini' as const, model: 'gemini-embedding-001', apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || undefined },\n { provider: 'mistral' as const, model: 'mistral-embed', apiKey: process.env.MISTRAL_API_KEY || undefined },\n ];\n \n for (const config of providers) {\n try {\n // Llama.cpp provider doesn't need API key and should be tried first\n if (config.provider === 'llamacpp' || config.apiKey) {\n logger.info(`Trying provider: ${config.provider}`);\n // Create a clean config object without undefined properties\n const cleanConfig: EmbedConfig = {\n provider: config.provider,\n model: config.model,\n };\n \n if (config.apiKey) {\n cleanConfig.apiKey = config.apiKey;\n }\n \n return await embed(cleanConfig, input);\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(`Provider ${config.provider} failed: ${errorMessage}`);\n continue;\n }\n }\n \n throw new Error('No available embedding provider found');\n}\n\n/**\n * Get supported providers\n */\nexport function getSupportedProviders() {\n return EmbeddingFactory.getSupportedProviders();\n}\n\n/**\n * Create a specific provider instance\n */\nexport function createProvider(config: EmbedConfig) {\n return EmbeddingFactory.create(config);\n}\n\n// Export types for external use\nexport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult, ProviderType } from './src/types/index.js';","import OpenAI from 'openai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('openai');\n\nexport class OpenAIProvider extends EmbeddingProvider {\n private client: OpenAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n timeout: config.timeout || 30000,\n });\n\n logger.info('OpenAI provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: text,\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from OpenAI API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: texts,\n });\n\n const embeddings = response.data.map(item => item.embedding);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Common OpenAI embedding dimensions\n const model = this.getModel();\n if (model.includes('text-embedding-3-large')) return 3072;\n if (model.includes('text-embedding-3-small')) return 1536;\n if (model.includes('text-embedding-ada-002')) return 1536;\n return 1536; // default\n }\n\n getProviderName(): string {\n return 'OpenAI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch (error: unknown) {\n logger.error(`OpenAI readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\n\nexport abstract class EmbeddingProvider {\n protected config: EmbedConfig;\n\n constructor(config: EmbedConfig) {\n this.config = config;\n }\n\n abstract embed(input: EmbedInput): Promise<EmbedResult>;\n abstract embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult>;\n abstract getDimensions(): number;\n abstract getProviderName(): string;\n abstract isReady(): Promise<boolean>;\n\n protected getModel(): string {\n return this.config.model || 'default';\n }\n\n protected async readInput(input: EmbedInput): Promise<string> {\n if (input.text) {\n return input.text;\n }\n \n if (input.filePath) {\n const fs = await import('fs/promises');\n return await fs.readFile(input.filePath, 'utf-8');\n }\n \n throw new Error('Either text or filePath must be provided');\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n module: string;\n timestamp: Date;\n}\n\nexport class Logger {\n private static instance: Logger;\n private currentLevel: LogLevel;\n private moduleName: string;\n\n // ANSI color codes - simplified for better readability\n private static readonly COLORS = {\n RESET: '\\x1b[0m',\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green \n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n };\n\n private static readonly LEVEL_NAMES = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n };\n\n constructor(moduleName: string = 'embedbox', level: LogLevel = LogLevel.INFO) {\n this.moduleName = moduleName;\n this.currentLevel = level;\n }\n\n static getInstance(moduleName?: string, level?: LogLevel): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(moduleName || 'embedbox', level);\n }\n return Logger.instance;\n }\n\n setLevel(level: LogLevel): void {\n this.currentLevel = level;\n }\n\n getLevel(): LogLevel {\n return this.currentLevel;\n }\n\n private formatMessage(level: LogLevel, message: string): string {\n const levelName = Logger.LEVEL_NAMES[level];\n const color = Logger.COLORS[levelName as keyof typeof Logger.COLORS];\n const reset = Logger.COLORS.RESET;\n\n return `${color}[${levelName}(${this.moduleName})]${reset} ${message}\\n\\n`;\n }\n\n private log(level: LogLevel, message: string): void {\n if (level < this.currentLevel) {\n return;\n }\n\n const formattedMessage = this.formatMessage(level, message);\n process.stdout.write(formattedMessage);\n }\n\n debug(message: string): void {\n this.log(LogLevel.DEBUG, message);\n }\n\n info(message: string): void {\n this.log(LogLevel.INFO, message);\n }\n\n warn(message: string): void {\n this.log(LogLevel.WARN, message);\n }\n\n error(message: string): void {\n this.log(LogLevel.ERROR, message);\n }\n\n // Static methods for quick access\n static debug(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.debug(message);\n }\n\n static info(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.info(message);\n }\n\n static warn(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.warn(message);\n }\n\n static error(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.error(message);\n }\n\n // Method to create a logger instance for a specific module\n static createModuleLogger(moduleName: string, level?: LogLevel): Logger {\n return new Logger(`embedbox:${moduleName}`, level);\n }\n}\n\n// Export a default logger instance\nexport const logger = Logger.getInstance();\n\n// Export convenience functions\nexport const log = {\n debug: (message: string, moduleName?: string) => Logger.debug(message, moduleName),\n info: (message: string, moduleName?: string) => Logger.info(message, moduleName),\n warn: (message: string, moduleName?: string) => Logger.warn(message, moduleName),\n error: (message: string, moduleName?: string) => Logger.error(message, moduleName),\n};\n","import { GoogleGenerativeAI } from '@google/generative-ai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('gemini');\n\nexport class GeminiProvider extends EmbeddingProvider {\n private client: GoogleGenerativeAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Google API key is required');\n }\n\n this.client = new GoogleGenerativeAI(config.apiKey);\n logger.info('Gemini provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n // Get the embedding model\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n // Use the embedding task\n const result = await model.embedContent(text);\n const embedding = result.embedding;\n\n return {\n embedding: embedding.values,\n dimensions: embedding.values.length,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n const results = await Promise.all(\n texts.map(text => model.embedContent(text))\n );\n\n const embeddings = results.map((result: { embedding: { values: number[] } }) => result.embedding.values);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n const model = this.getModel();\n if (model.includes('gemini-embedding-001')) return 3072;\n if (model.includes('text-embedding-004')) return 768;\n if (model.includes('embedding-001')) return 768;\n if (model.includes('multimodalembedding')) return 768;\n return 3072; // default for Gemini embeddings\n }\n\n getProviderName(): string {\n return 'Google Gemini';\n }\n\n protected getModel(): string {\n return this.config.model || 'gemini-embedding-001';\n }\n\n async isReady(): Promise<boolean> {\n try {\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n // Test with a simple embedding\n await model.embedContent('test');\n return true;\n } catch (error: unknown) {\n logger.error(`Gemini readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { Mistral } from '@mistralai/mistralai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('mistral');\n\nexport class MistralProvider extends EmbeddingProvider {\n private client: Mistral;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Mistral API key is required');\n }\n\n this.client = new Mistral({\n apiKey: config.apiKey,\n serverURL: config.baseUrl,\n timeoutMs: config.timeout || 30000,\n });\n\n logger.info('Mistral provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: [text],\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from Mistral API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: texts,\n });\n\n const embeddings = response.data.map((item) => {\n if (!item.embedding) throw new Error('No embedding returned from Mistral API');\n return item.embedding as number[];\n });\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Mistral embedding dimensions\n const model = this.getModel();\n if (model.includes('mistral-embed')) return 1024;\n return 1024; // default for Mistral\n }\n\n getProviderName(): string {\n return 'Mistral AI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n // Test with a simple embedding request\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: ['test'],\n });\n return response.data.length > 0;\n } catch (error: unknown) {\n logger.error(`Mistral readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { access, constants } from 'fs/promises';\nimport { join, resolve } from 'path';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { logger } from '@src/util/logger';\nimport * as http from 'http';\n\n/**\n * Llama.cpp Provider - Local embeddings using llama.cpp directly\n * Uses native N-API module for better performance\n */\n\n// Try to import native module\nlet nativeModule: any = null;\ntry {\n nativeModule = require('../../native');\n logger.info('Using native Llama.cpp module');\n} catch (error) {\n logger.warn('Native module not available, falling back to HTTP');\n}\n\n// Extend EmbedConfig to include llamaPath\ninterface LlamaCppConfig extends EmbedConfig {\n llamaPath?: string;\n}\n\nexport class LlamaCppProvider extends EmbeddingProvider {\n private llamaPath: string;\n private modelPath: string;\n private useNative: boolean;\n private nativeModel: any = null;\n\n constructor(config: LlamaCppConfig) {\n super({ ...config, provider: 'llamacpp' });\n this.modelPath = config.model || 'nomic-embed-text-v1.5.Q4_K_M.gguf';\n this.llamaPath = config.llamaPath || './llama.cpp/build/bin/llama-embedding';\n this.useNative = !!nativeModule;\n \n if (this.useNative) {\n try {\n this.nativeModel = nativeModule.create(this.modelPath);\n logger.info(`Llama.cpp provider initialized with native module: ${this.modelPath}`);\n } catch (error) {\n logger.error(`Failed to initialize native module: ${error}`);\n this.useNative = false;\n }\n } else {\n logger.info(`Llama.cpp provider initialized with HTTP fallback: ${this.modelPath}`);\n }\n }\n\n // Public API methods\n getProviderName(): string {\n return 'Llama.cpp';\n }\n\n getDimensions(): number {\n // Known dimensions for common models\n const model = this.getModel();\n if (model.includes('nomic-embed-text-v1.5')) return 768;\n if (model.includes('nomic-embed-text-v1')) return 768;\n if (model.includes('all-MiniLM-L6-v2')) return 384;\n if (model.includes('bge-base')) return 768;\n if (model.includes('bert-base')) return 768;\n return 768; // default\n }\n\n async isReady(): Promise<boolean> {\n try {\n if (this.useNative && this.nativeModel) {\n // Native module is ready if model was loaded successfully\n return true;\n }\n \n // Fallback to HTTP check\n await access(this.llamaPath, constants.F_OK);\n await access(this.llamaPath, constants.X_OK);\n \n // Check if model file exists\n const modelPath = await this.getModelPath();\n await access(modelPath, constants.F_OK);\n \n logger.debug('Llama.cpp provider is ready');\n return true;\n } catch (error: unknown) {\n logger.error(`Llama.cpp readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n\n private async loadGGUFModel(modelPath: string): Promise<Buffer> {\n try {\n logger.debug(`Loading GGUF model from: ${modelPath}`);\n \n // Read model file\n const modelBuffer = await fs.readFile(modelPath);\n \n if (!modelBuffer) {\n throw new Error(`Failed to read model file: ${modelPath}`);\n }\n \n logger.debug(`Model file loaded, size: ${modelBuffer.length} bytes`);\n return modelBuffer;\n } catch (error) {\n logger.error(`Failed to load GGUF model: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n }\n\n private generateEmbedding(modelBuffer: Buffer, text: string): number[] {\n // Use the loaded model to generate embedding\n logger.debug(`Generating embedding with model buffer (${modelBuffer.length} bytes)`);\n \n // TODO: Implement actual Llama.cpp embedding generation\n // For now, return mock embedding based on text length\n const embedding = [];\n for (let i = 0; i < Math.min(text.length, 768); i++) {\n embedding.push(Math.sin(i * 0.1) * (i % 10));\n }\n \n return embedding;\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n logger.debug(`Embedding text with llama.cpp: ${this.getModel()}`);\n \n const text = await this.readInput(input);\n if (!text.trim()) {\n throw new Error('Text input cannot be empty');\n }\n\n // Use native module for now\n if (this.useNative && this.nativeModel) {\n const embedding = this.nativeModel.embed(text);\n \n return {\n embedding,\n dimensions: embedding.length,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // TODO: Implement direct Llama.cpp core usage in future\n throw new Error('Direct Llama.cpp core integration not yet implemented. Please use HTTP fallback or wait for next version.');\n } catch (error: unknown) {\n logger.error(`Llama.cpp embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n logger.debug(`Batch embedding ${inputs.length} texts with llama.cpp`);\n \n if (this.useNative && this.nativeModel) {\n // Use native module for batch\n const embeddings: number[][] = [];\n \n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n const embedding = this.nativeModel.embed(text);\n embeddings.push(embedding);\n }\n }\n \n if (embeddings.length === 0) {\n throw new Error('No valid texts to embed');\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // Fallback to HTTP batch processing\n const texts = [];\n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n texts.push(text);\n }\n }\n \n if (texts.length === 0) {\n throw new Error('No valid texts to embed');\n }\n\n // For batch processing, use HTTP API\n const modelPath = await this.getModelPath();\n const requests = inputs.map((input, v) => ({\n input: input.text || '',\n model: modelPath,\n pooling: 'mean',\n normalize: 2\n }));\n\n // Execute batch requests (for now, do individual requests)\n const embeddings: number[][] = [];\n for (const request of requests) {\n const result = await this.executeLlamaEmbedding([JSON.stringify(request)]);\n const embedding = this.parseRawOutput(result.stdout);\n embeddings.push(embedding);\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n } catch (error: unknown) {\n logger.error(`Llama.cpp batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n // Cleanup method\n async cleanup(): Promise<void> {\n if (this.useNative && this.nativeModel) {\n try {\n this.nativeModel.close();\n this.nativeModel = null;\n logger.info('Native Llama.cpp model closed');\n } catch (error) {\n logger.error(`Error closing native model: ${error}`);\n }\n }\n }\n\n // Protected methods\n protected getModel(): string {\n return this.modelPath;\n }\n}\n","import type { EmbedConfig, ProviderType } from '@src/types/index';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport { OpenAIProvider } from '@providers/openai';\nimport { GeminiProvider } from '@providers/gemini';\nimport { MistralProvider } from '@providers/mistral';\nimport { LlamaCppProvider } from '@providers/llamacpp';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('factory');\n\nexport class EmbeddingFactory {\n private static providers = new Map<ProviderType, new (config: EmbedConfig) => EmbeddingProvider>([\n ['openai', OpenAIProvider],\n ['gemini', GeminiProvider],\n ['mistral', MistralProvider],\n ['llamacpp', LlamaCppProvider], // Local embeddings with llama.cpp\n ]);\n\n static create(config: EmbedConfig) {\n logger.info(`Creating provider: ${config.provider}`);\n \n const ProviderClass = this.providers.get(config.provider);\n if (!ProviderClass) {\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n\n return new ProviderClass(config);\n }\n\n static getSupportedProviders(): ProviderType[] {\n return Array.from(this.providers.keys());\n }\n}\n"],"mappings":"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","names":["exports","module","exports","module","config","fs","logger","logger","config","OpenAI","logger","config","logger","config","config","embeddings","logger","config","logger","config"]}
1
+ {"version":3,"sources":["../index.ts","../main.ts","../src/providers/openai.ts","../src/providers/base/EmbeddingProvider.ts","../src/util/logger.ts","../src/providers/gemini.ts","../src/providers/mistral.ts","../src/providers/llamacpp.ts","../src/factory/EmbeddingFactory.ts"],"sourcesContent":["/**\n * Vecbox v0.2.3 - Main Entry Point\n * \n * A minimal and powerful vector library that supports multiple providers\n * with automatic detection and fallback capabilities.\n */\n\n// Export main functions\nexport { embed, autoEmbed, getSupportedProviders, createProvider } from './main.js';\n\n// Export types\nexport type { \n EmbedConfig, \n EmbedInput, \n EmbedResult, \n BatchEmbedResult, \n ProviderType \n} from './src/types/index.js';\n\n// Export provider factory for advanced usage\nexport { EmbeddingFactory } from './src/factory/EmbeddingFactory.js';\n\n// Export base provider for custom implementations\nexport { EmbeddingProvider } from './src/providers/base/EmbeddingProvider.js';\n\n// Version information\nexport const VERSION = '0.2.3';\n\n/**\n * Get library version\n */\nexport function getVersion(): string {\n return VERSION;\n}\n\n/**\n * Library information\n */\nexport const LIB_INFO = {\n name: 'vecbox',\n version: VERSION,\n description: 'A minimal and powerful embedding library',\n homepage: 'https://boxsafe.dev',\n repository: 'https://github.com/boxsafe/vecbox.git',\n supportedProviders: [\n 'openai',\n 'gemini', \n 'mistral',\n 'llamacpp'\n ] as const\n} as const;\n","import * as dotenv from 'dotenv';\nimport { EmbeddingFactory } from '@src/factory/EmbeddingFactory.js';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index.js';\nimport { Logger } from '@src/util/logger.js';\n\n// Load environment variables\ndotenv.config();\n\nconst logger = Logger.createModuleLogger('main');\n\n/**\n * Main embedding interface - Simple and minimal API\n * \n * @param config - Provider configuration\n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function embed(\n config: EmbedConfig,\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n try {\n logger.info(`Starting embedding with provider: ${config.provider}`);\n \n // Create provider instance\n const provider = EmbeddingFactory.create(config);\n \n // Check if provider is ready\n const isReady = await provider.isReady();\n if (!isReady) {\n throw new Error(`Provider ${config.provider} is not ready`);\n }\n \n // Handle single input or batch\n if (Array.isArray(input)) {\n logger.debug(`Processing batch of ${input.length} items`);\n return await provider.embedBatch(input);\n } else {\n logger.debug(`Processing single item`);\n return await provider.embed(input);\n }\n \n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(`Embedding failed: ${errorMessage}`);\n throw error;\n }\n}\n\n/**\n * Convenience function for quick embedding with auto-detection\n * \n * @param input - Text or file to embed\n * @returns Promise<EmbedResult | BatchEmbedResult>\n */\nexport async function autoEmbed(\n input: EmbedInput | EmbedInput[]\n): Promise<EmbedResult | BatchEmbedResult> {\n logger.info('Auto-detecting best provider...');\n \n // Try providers in order of preference\n const providers = [\n { provider: 'llamacpp' as const, model: 'nomic-embed-text-v1.5.Q4_K_M.gguf' }, // Local & free (llama.cpp)\n { provider: 'openai' as const, model: 'text-embedding-3-small', apiKey: process.env.OPENAI_API_KEY || undefined },\n { provider: 'gemini' as const, model: 'gemini-embedding-001', apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY || undefined },\n { provider: 'mistral' as const, model: 'mistral-embed', apiKey: process.env.MISTRAL_API_KEY || undefined },\n ];\n \n for (const config of providers) {\n try {\n // Llama.cpp provider doesn't need API key and should be tried first\n if (config.provider === 'llamacpp' || config.apiKey) {\n logger.info(`Trying provider: ${config.provider}`);\n // Create a clean config object without undefined properties\n const cleanConfig: EmbedConfig = {\n provider: config.provider,\n model: config.model,\n };\n \n if (config.apiKey) {\n cleanConfig.apiKey = config.apiKey;\n }\n \n return await embed(cleanConfig, input);\n }\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(`Provider ${config.provider} failed: ${errorMessage}`);\n continue;\n }\n }\n \n throw new Error('No available embedding provider found');\n}\n\n/**\n * Get supported providers\n */\nexport function getSupportedProviders() {\n return EmbeddingFactory.getSupportedProviders();\n}\n\n/**\n * Create a specific provider instance\n */\nexport function createProvider(config: EmbedConfig) {\n return EmbeddingFactory.create(config);\n}\n\n// Export types for external use\nexport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult, ProviderType } from './src/types/index.js';","import OpenAI from 'openai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('openai');\n\nexport class OpenAIProvider extends EmbeddingProvider {\n private client: OpenAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: config.baseUrl,\n timeout: config.timeout || 30000,\n });\n\n logger.info('OpenAI provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: text,\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from OpenAI API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n input: texts,\n });\n\n const embeddings = response.data.map(item => item.embedding);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'openai',\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`OpenAI batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Common OpenAI embedding dimensions\n const model = this.getModel();\n if (model.includes('text-embedding-3-large')) return 3072;\n if (model.includes('text-embedding-3-small')) return 1536;\n if (model.includes('text-embedding-ada-002')) return 1536;\n return 1536; // default\n }\n\n getProviderName(): string {\n return 'OpenAI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n await this.client.models.list();\n return true;\n } catch (error: unknown) {\n logger.error(`OpenAI readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\n\nexport abstract class EmbeddingProvider {\n protected config: EmbedConfig;\n\n constructor(config: EmbedConfig) {\n this.config = config;\n }\n\n abstract embed(input: EmbedInput): Promise<EmbedResult>;\n abstract embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult>;\n abstract getDimensions(): number;\n abstract getProviderName(): string;\n abstract isReady(): Promise<boolean>;\n\n protected getModel(): string {\n return this.config.model || 'default';\n }\n\n protected async readInput(input: EmbedInput): Promise<string> {\n if (input.text) {\n return input.text;\n }\n \n if (input.filePath) {\n const fs = await import('fs/promises');\n return await fs.readFile(input.filePath, 'utf-8');\n }\n \n throw new Error('Either text or filePath must be provided');\n }\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n module: string;\n timestamp: Date;\n}\n\nexport class Logger {\n private static instance: Logger;\n private currentLevel: LogLevel;\n private moduleName: string;\n\n // ANSI color codes - simplified for better readability\n private static readonly COLORS = {\n RESET: '\\x1b[0m',\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green \n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n };\n\n private static readonly LEVEL_NAMES = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n };\n\n constructor(moduleName: string = 'embedbox', level: LogLevel = LogLevel.INFO) {\n this.moduleName = moduleName;\n this.currentLevel = level;\n }\n\n static getInstance(moduleName?: string, level?: LogLevel): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(moduleName || 'embedbox', level);\n }\n return Logger.instance;\n }\n\n setLevel(level: LogLevel): void {\n this.currentLevel = level;\n }\n\n getLevel(): LogLevel {\n return this.currentLevel;\n }\n\n private formatMessage(level: LogLevel, message: string): string {\n const levelName = Logger.LEVEL_NAMES[level];\n const color = Logger.COLORS[levelName as keyof typeof Logger.COLORS];\n const reset = Logger.COLORS.RESET;\n\n return `${color}[${levelName}(${this.moduleName})]${reset} ${message}\\n\\n`;\n }\n\n private log(level: LogLevel, message: string): void {\n if (level < this.currentLevel) {\n return;\n }\n\n const formattedMessage = this.formatMessage(level, message);\n process.stdout.write(formattedMessage);\n }\n\n debug(message: string): void {\n this.log(LogLevel.DEBUG, message);\n }\n\n info(message: string): void {\n this.log(LogLevel.INFO, message);\n }\n\n warn(message: string): void {\n this.log(LogLevel.WARN, message);\n }\n\n error(message: string): void {\n this.log(LogLevel.ERROR, message);\n }\n\n // Static methods for quick access\n static debug(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.debug(message);\n }\n\n static info(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.info(message);\n }\n\n static warn(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.warn(message);\n }\n\n static error(message: string, moduleName?: string): void {\n const logger = new Logger(moduleName || 'embedbox');\n logger.error(message);\n }\n\n // Method to create a logger instance for a specific module\n static createModuleLogger(moduleName: string, level?: LogLevel): Logger {\n return new Logger(`embedbox:${moduleName}`, level);\n }\n}\n\n// Export a default logger instance\nexport const logger = Logger.getInstance();\n\n// Export convenience functions\nexport const log = {\n debug: (message: string, moduleName?: string) => Logger.debug(message, moduleName),\n info: (message: string, moduleName?: string) => Logger.info(message, moduleName),\n warn: (message: string, moduleName?: string) => Logger.warn(message, moduleName),\n error: (message: string, moduleName?: string) => Logger.error(message, moduleName),\n};\n","import { GoogleGenerativeAI } from '@google/generative-ai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('gemini');\n\nexport class GeminiProvider extends EmbeddingProvider {\n private client: GoogleGenerativeAI;\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Google API key is required');\n }\n\n this.client = new GoogleGenerativeAI(config.apiKey);\n logger.info('Gemini provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n // Get the embedding model\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n // Use the embedding task\n const result = await model.embedContent(text);\n const embedding = result.embedding;\n\n return {\n embedding: embedding.values,\n dimensions: embedding.values.length,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n\n const results = await Promise.all(\n texts.map(text => model.embedContent(text))\n );\n\n const embeddings = results.map((result: { embedding: { values: number[] } }) => result.embedding.values);\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'gemini',\n };\n } catch (error: unknown) {\n logger.error(`Gemini batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n const model = this.getModel();\n if (model.includes('gemini-embedding-001')) return 3072;\n if (model.includes('text-embedding-004')) return 768;\n if (model.includes('embedding-001')) return 768;\n if (model.includes('multimodalembedding')) return 768;\n return 3072; // default for Gemini embeddings\n }\n\n getProviderName(): string {\n return 'Google Gemini';\n }\n\n protected getModel(): string {\n return this.config.model || 'gemini-embedding-001';\n }\n\n async isReady(): Promise<boolean> {\n try {\n const model = this.client.getGenerativeModel({ \n model: this.getModel() \n });\n // Test with a simple embedding\n await model.embedContent('test');\n return true;\n } catch (error: unknown) {\n logger.error(`Gemini readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { Mistral } from '@mistralai/mistralai';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('mistral');\n\nexport class MistralProvider extends EmbeddingProvider {\n private client: Mistral;\n\n protected getModel(): string {\n return this.config.model || 'mistral-embed';\n }\n\n constructor(config: EmbedConfig) {\n super(config);\n \n if (!config.apiKey) {\n throw new Error('Mistral API key is required');\n }\n\n this.client = new Mistral({\n apiKey: config.apiKey,\n serverURL: config.baseUrl,\n timeoutMs: config.timeout || 30000,\n });\n\n logger.info('Mistral provider initialized');\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n const text = await this.readInput(input);\n logger.debug(`Embedding text with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: [text],\n });\n\n const embedding = response.data[0];\n if (!embedding) {\n throw new Error('No embedding returned from Mistral API');\n }\n\n return {\n embedding: embedding.embedding || [],\n dimensions: embedding.embedding?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n const texts = await Promise.all(inputs.map(input => this.readInput(input)));\n logger.debug(`Batch embedding ${texts.length} texts with model: ${this.getModel()}`);\n\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: texts,\n });\n\n const embeddings = response.data.map((item) => {\n if (!item.embedding) throw new Error('No embedding returned from Mistral API');\n return item.embedding as number[];\n });\n\n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: response.model,\n provider: 'mistral',\n usage: response.usage?.promptTokens && response.usage?.totalTokens ? {\n promptTokens: response.usage.promptTokens,\n totalTokens: response.usage.totalTokens,\n } : undefined,\n };\n } catch (error: unknown) {\n logger.error(`Mistral batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n getDimensions(): number {\n // Mistral embedding dimensions\n const model = this.getModel();\n if (model.includes('mistral-embed')) return 1024;\n return 1024; // default for Mistral\n }\n\n getProviderName(): string {\n return 'Mistral AI';\n }\n\n async isReady(): Promise<boolean> {\n try {\n // Test with a simple embedding request\n const response = await this.client.embeddings.create({\n model: this.getModel(),\n inputs: ['test'],\n });\n return response.data.length > 0;\n } catch (error: unknown) {\n logger.error(`Mistral readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n}\n","import { access, constants, readFile as fsReadFile } from 'fs/promises';\nimport { join, resolve } from 'path';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport type { EmbedConfig, EmbedInput, EmbedResult, BatchEmbedResult } from '@src/types/index';\nimport { logger } from '@src/util/logger';\nimport * as http from 'http';\n\n/**\n * Llama.cpp Provider - Local embeddings using llama.cpp directly\n * Uses native N-API module for better performance\n */\n\n// Try to import native module\nlet nativeModule: any = null;\ntry {\n // Try different paths for native module\n const possiblePaths = [\n '../../native', // Development\n 'vecbox/native', // Installed as dependency\n './native', // Same directory\n '../native', // One level up\n '../vecbox/native' // When installed via npm\n ];\n \n for (const path of possiblePaths) {\n try {\n nativeModule = require(path);\n logger.info(`Using native Llama.cpp module from: ${path}`);\n break;\n } catch (e) {\n // Continue to next path\n }\n }\n \n if (!nativeModule) {\n throw new Error('Native module not found in any path');\n }\n} catch (error) {\n logger.warn('Native module not available, falling back to HTTP');\n}\n\n// Extend EmbedConfig to include llamaPath\ninterface LlamaCppConfig extends EmbedConfig {\n llamaPath?: string;\n}\n\nexport class LlamaCppProvider extends EmbeddingProvider {\n private llamaPath: string;\n private modelPath: string;\n private useNative: boolean;\n private nativeModel: any = null;\n\n constructor(config: LlamaCppConfig) {\n super({ ...config, provider: 'llamacpp' });\n this.modelPath = config.model || 'nomic-embed-text-v1.5.Q4_K_M.gguf';\n this.llamaPath = config.llamaPath || './llama.cpp/build/bin/llama-embedding';\n this.useNative = !!nativeModule;\n \n if (this.useNative) {\n try {\n this.nativeModel = nativeModule.create(this.modelPath);\n logger.info(`Llama.cpp provider initialized with native module: ${this.modelPath}`);\n } catch (error) {\n logger.error(`Failed to initialize native module: ${error}`);\n this.useNative = false;\n }\n } else {\n logger.info(`Llama.cpp provider initialized with HTTP fallback: ${this.modelPath}`);\n }\n }\n\n // Public API methods\n getProviderName(): string {\n return 'Llama.cpp';\n }\n\n getDimensions(): number {\n // Known dimensions for common models\n const model = this.getModel();\n if (model.includes('nomic-embed-text-v1.5')) return 768;\n if (model.includes('nomic-embed-text-v1')) return 768;\n if (model.includes('all-MiniLM-L6-v2')) return 384;\n if (model.includes('bge-base')) return 768;\n if (model.includes('bert-base')) return 768;\n return 768; // default\n }\n\n async isReady(): Promise<boolean> {\n try {\n if (this.useNative && this.nativeModel) {\n // Native module is ready if model was loaded successfully\n return true;\n }\n \n // Fallback to HTTP check\n await access(this.llamaPath, constants.F_OK);\n await access(this.llamaPath, constants.X_OK);\n \n // Check if model file exists\n const modelPath = await this.getModelPath();\n await access(modelPath, constants.F_OK);\n \n logger.debug('Llama.cpp provider is ready');\n return true;\n } catch (error: unknown) {\n logger.error(`Llama.cpp readiness check failed: ${(error instanceof Error ? error.message : String(error))}`);\n return false;\n }\n }\n\n private generateEmbedding(modelBuffer: Buffer, text: string): number[] {\n // Use the loaded model to generate embedding\n logger.debug(`Generating embedding with model buffer (${modelBuffer.length} bytes)`);\n \n // TODO: Implement actual Llama.cpp embedding generation\n // For now, return mock embedding based on text length\n const embedding = [];\n for (let i = 0; i < Math.min(text.length, 768); i++) {\n embedding.push(Math.sin(i * 0.1) * (i % 10));\n }\n \n return embedding;\n }\n\n async embed(input: EmbedInput): Promise<EmbedResult> {\n try {\n logger.debug(`Embedding text with llama.cpp: ${this.getModel()}`);\n \n const text = await this.readInput(input);\n if (!text.trim()) {\n throw new Error('Text input cannot be empty');\n }\n\n // Use native module for now\n if (this.useNative && this.nativeModel) {\n const embedding = this.nativeModel.embed(text);\n \n return {\n embedding,\n dimensions: embedding.length,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // Fallback: return error if native module not available\n throw new Error('Direct Llama.cpp integration requires native module. Please ensure native module is properly compiled.');\n } catch (error: unknown) {\n logger.error(`Llama.cpp embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n async embedBatch(inputs: EmbedInput[]): Promise<BatchEmbedResult> {\n try {\n logger.debug(`Batch embedding ${inputs.length} texts with llama.cpp`);\n \n if (this.useNative && this.nativeModel) {\n // Use native module for batch\n const embeddings: number[][] = [];\n \n for (const input of inputs) {\n const text = await this.readInput(input);\n if (text.trim()) {\n const embedding = this.nativeModel.embed(text);\n embeddings.push(embedding);\n }\n }\n \n if (embeddings.length === 0) {\n throw new Error('No valid texts to embed');\n }\n \n return {\n embeddings,\n dimensions: embeddings[0]?.length || 0,\n model: this.getModel(),\n provider: 'llamacpp',\n };\n }\n\n // Fallback: return error if native module not available\n throw new Error('Direct Llama.cpp integration requires native module. Please ensure native module is properly compiled.');\n } catch (error: unknown) {\n logger.error(`Llama.cpp batch embedding failed: ${(error instanceof Error ? error.message : String(error))}`);\n throw error;\n }\n }\n\n // Cleanup method\n async cleanup(): Promise<void> {\n if (this.useNative && this.nativeModel) {\n try {\n this.nativeModel.close();\n this.nativeModel = null;\n logger.info('Native Llama.cpp model closed');\n } catch (error) {\n logger.error(`Error closing native model: ${error}`);\n }\n }\n }\n\n // Protected methods\n protected getModel(): string {\n return this.modelPath;\n }\n\n private async getModelPath(): Promise<string> {\n // If modelPath is already absolute, return as-is\n if (this.modelPath.startsWith('/') || this.modelPath.startsWith('./')) {\n return this.modelPath;\n }\n \n // Try to resolve model path relative to current directory\n const possiblePaths = [\n resolve(this.modelPath), // Current directory\n join('core/models', this.modelPath), // core/models subdirectory\n join('models', this.modelPath), // models subdirectory\n join(__dirname, '../../core/models', this.modelPath), // Relative to dist\n ];\n \n for (const path of possiblePaths) {\n try {\n await access(path, constants.F_OK);\n return path;\n } catch (e) {\n // Continue to next path\n }\n }\n \n // Return original path if none found (will fail later with proper error)\n return this.modelPath;\n }\n}\n","import type { EmbedConfig, ProviderType } from '@src/types/index';\nimport { EmbeddingProvider } from '@providers/base/EmbeddingProvider';\nimport { OpenAIProvider } from '@providers/openai';\nimport { GeminiProvider } from '@providers/gemini';\nimport { MistralProvider } from '@providers/mistral';\nimport { LlamaCppProvider } from '@providers/llamacpp';\nimport { Logger } from '@src/util/logger';\n\nconst logger = Logger.createModuleLogger('factory');\n\nexport class EmbeddingFactory {\n private static providers = new Map<ProviderType, new (config: EmbedConfig) => EmbeddingProvider>([\n ['openai', OpenAIProvider],\n ['gemini', GeminiProvider],\n ['mistral', MistralProvider],\n ['llamacpp', LlamaCppProvider], // Local embeddings with llama.cpp\n ]);\n\n static create(config: EmbedConfig) {\n logger.info(`Creating provider: ${config.provider}`);\n \n const ProviderClass = this.providers.get(config.provider);\n if (!ProviderClass) {\n throw new Error(`Unsupported provider: ${config.provider}`);\n }\n\n return new ProviderClass(config);\n }\n\n static getSupportedProviders(): ProviderType[] {\n return Array.from(this.providers.keys());\n }\n}\n"],"mappings":"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","names":["config","logger","logger","config","OpenAI","logger","config","logger","config","config","logger","config","logger","config"]}
package/dist/index.d.cts CHANGED
@@ -75,13 +75,13 @@ declare class EmbeddingFactory {
75
75
  }
76
76
 
77
77
  /**
78
- * Embedbox v1.0.0 - Main Entry Point
78
+ * Vecbox v0.2.3 - Main Entry Point
79
79
  *
80
- * A minimal and powerful embedding library that supports multiple providers
80
+ * A minimal and powerful vector library that supports multiple providers
81
81
  * with automatic detection and fallback capabilities.
82
82
  */
83
83
 
84
- declare const VERSION = "1.0.0";
84
+ declare const VERSION = "0.2.3";
85
85
  /**
86
86
  * Get library version
87
87
  */
@@ -90,11 +90,11 @@ declare function getVersion(): string;
90
90
  * Library information
91
91
  */
92
92
  declare const LIB_INFO: {
93
- readonly name: "embedbox";
94
- readonly version: "1.0.0";
93
+ readonly name: "vecbox";
94
+ readonly version: "0.2.3";
95
95
  readonly description: "A minimal and powerful embedding library";
96
- readonly homepage: "https://embedbox.dev";
97
- readonly repository: "https://github.com/embedbox/embedbox.git";
96
+ readonly homepage: "https://boxsafe.dev";
97
+ readonly repository: "https://github.com/boxsafe/vecbox.git";
98
98
  readonly supportedProviders: readonly ["openai", "gemini", "mistral", "llamacpp"];
99
99
  };
100
100
 
package/dist/index.d.ts CHANGED
@@ -75,13 +75,13 @@ declare class EmbeddingFactory {
75
75
  }
76
76
 
77
77
  /**
78
- * Embedbox v1.0.0 - Main Entry Point
78
+ * Vecbox v0.2.3 - Main Entry Point
79
79
  *
80
- * A minimal and powerful embedding library that supports multiple providers
80
+ * A minimal and powerful vector library that supports multiple providers
81
81
  * with automatic detection and fallback capabilities.
82
82
  */
83
83
 
84
- declare const VERSION = "1.0.0";
84
+ declare const VERSION = "0.2.3";
85
85
  /**
86
86
  * Get library version
87
87
  */
@@ -90,11 +90,11 @@ declare function getVersion(): string;
90
90
  * Library information
91
91
  */
92
92
  declare const LIB_INFO: {
93
- readonly name: "embedbox";
94
- readonly version: "1.0.0";
93
+ readonly name: "vecbox";
94
+ readonly version: "0.2.3";
95
95
  readonly description: "A minimal and powerful embedding library";
96
- readonly homepage: "https://embedbox.dev";
97
- readonly repository: "https://github.com/embedbox/embedbox.git";
96
+ readonly homepage: "https://boxsafe.dev";
97
+ readonly repository: "https://github.com/boxsafe/vecbox.git";
98
98
  readonly supportedProviders: readonly ["openai", "gemini", "mistral", "llamacpp"];
99
99
  };
100
100