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.js CHANGED
@@ -1,75 +1,9 @@
1
- var __getOwnPropNames = Object.getOwnPropertyNames;
2
1
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
3
2
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
4
3
  }) : x)(function(x) {
5
4
  if (typeof require !== "undefined") return require.apply(this, arguments);
6
5
  throw Error('Dynamic require of "' + x + '" is not supported');
7
6
  });
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 __require2() {
12
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
- };
14
-
15
- // native/build/Release/llama_embedding.node
16
- var llama_embedding_default;
17
- var init_llama_embedding = __esm({
18
- "native/build/Release/llama_embedding.node"() {
19
- llama_embedding_default = "./llama_embedding-EC3MWSUZ.node";
20
- }
21
- });
22
-
23
- // node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node
24
- var require_llama_embedding = __commonJS({
25
- "node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node"(exports, module) {
26
- "use strict";
27
- init_llama_embedding();
28
- try {
29
- module.exports = __require(llama_embedding_default);
30
- } catch {
31
- }
32
- }
33
- });
34
-
35
- // native/index.js
36
- var require_native = __commonJS({
37
- "native/index.js"(exports, module) {
38
- "use strict";
39
- var binding = require_llama_embedding();
40
- var LlamaEmbedding = class {
41
- constructor(modelPath) {
42
- this.modelPtr = binding.createModel(modelPath);
43
- if (!this.modelPtr) {
44
- throw new Error("Failed to load model");
45
- }
46
- }
47
- embed(text) {
48
- if (typeof text !== "string") {
49
- throw new Error("Text must be a string");
50
- }
51
- const embedding = binding.getEmbedding(this.modelPtr, text);
52
- if (!embedding) {
53
- throw new Error("Failed to generate embedding");
54
- }
55
- return embedding;
56
- }
57
- close() {
58
- if (this.modelPtr) {
59
- binding.destroyModel(this.modelPtr);
60
- this.modelPtr = null;
61
- }
62
- }
63
- };
64
- function create(modelPath) {
65
- return new LlamaEmbedding(modelPath);
66
- }
67
- module.exports = {
68
- create,
69
- LlamaEmbedding
70
- };
71
- }
72
- });
73
7
 
74
8
  // main.ts
75
9
  import * as dotenv from "dotenv";
@@ -90,8 +24,8 @@ var EmbeddingProvider = class {
90
24
  return input.text;
91
25
  }
92
26
  if (input.filePath) {
93
- const fs2 = await import("fs/promises");
94
- return await fs2.readFile(input.filePath, "utf-8");
27
+ const fs = await import("fs/promises");
28
+ return await fs.readFile(input.filePath, "utf-8");
95
29
  }
96
30
  throw new Error("Either text or filePath must be provided");
97
31
  }
@@ -358,6 +292,9 @@ var GeminiProvider = class extends EmbeddingProvider {
358
292
  import { Mistral } from "@mistralai/mistralai";
359
293
  var logger4 = Logger.createModuleLogger("mistral");
360
294
  var MistralProvider = class extends EmbeddingProvider {
295
+ getModel() {
296
+ return this.config.model || "mistral-embed";
297
+ }
361
298
  constructor(config2) {
362
299
  super(config2);
363
300
  if (!config2.apiKey) {
@@ -448,10 +385,32 @@ var MistralProvider = class extends EmbeddingProvider {
448
385
 
449
386
  // src/providers/llamacpp.ts
450
387
  import { access, constants } from "fs/promises";
388
+ import { join, resolve } from "path";
451
389
  var nativeModule = null;
452
390
  try {
453
- nativeModule = require_native();
454
- logger.info("Using native Llama.cpp module");
391
+ const possiblePaths = [
392
+ "../../native",
393
+ // Development
394
+ "vecbox/native",
395
+ // Installed as dependency
396
+ "./native",
397
+ // Same directory
398
+ "../native",
399
+ // One level up
400
+ "../vecbox/native"
401
+ // When installed via npm
402
+ ];
403
+ for (const path of possiblePaths) {
404
+ try {
405
+ nativeModule = __require(path);
406
+ logger.info(`Using native Llama.cpp module from: ${path}`);
407
+ break;
408
+ } catch (e) {
409
+ }
410
+ }
411
+ if (!nativeModule) {
412
+ throw new Error("Native module not found in any path");
413
+ }
455
414
  } catch (error) {
456
415
  logger.warn("Native module not available, falling back to HTTP");
457
416
  }
@@ -503,20 +462,6 @@ var LlamaCppProvider = class extends EmbeddingProvider {
503
462
  return false;
504
463
  }
505
464
  }
506
- async loadGGUFModel(modelPath) {
507
- try {
508
- logger.debug(`Loading GGUF model from: ${modelPath}`);
509
- const modelBuffer = await fs.readFile(modelPath);
510
- if (!modelBuffer) {
511
- throw new Error(`Failed to read model file: ${modelPath}`);
512
- }
513
- logger.debug(`Model file loaded, size: ${modelBuffer.length} bytes`);
514
- return modelBuffer;
515
- } catch (error) {
516
- logger.error(`Failed to load GGUF model: ${error instanceof Error ? error.message : String(error)}`);
517
- throw error;
518
- }
519
- }
520
465
  generateEmbedding(modelBuffer, text) {
521
466
  logger.debug(`Generating embedding with model buffer (${modelBuffer.length} bytes)`);
522
467
  const embedding = [];
@@ -541,7 +486,7 @@ var LlamaCppProvider = class extends EmbeddingProvider {
541
486
  provider: "llamacpp"
542
487
  };
543
488
  }
544
- throw new Error("Direct Llama.cpp core integration not yet implemented. Please use HTTP fallback or wait for next version.");
489
+ throw new Error("Direct Llama.cpp integration requires native module. Please ensure native module is properly compiled.");
545
490
  } catch (error) {
546
491
  logger.error(`Llama.cpp embedding failed: ${error instanceof Error ? error.message : String(error)}`);
547
492
  throw error;
@@ -551,53 +496,25 @@ var LlamaCppProvider = class extends EmbeddingProvider {
551
496
  try {
552
497
  logger.debug(`Batch embedding ${inputs.length} texts with llama.cpp`);
553
498
  if (this.useNative && this.nativeModel) {
554
- const embeddings2 = [];
499
+ const embeddings = [];
555
500
  for (const input of inputs) {
556
501
  const text = await this.readInput(input);
557
502
  if (text.trim()) {
558
503
  const embedding = this.nativeModel.embed(text);
559
- embeddings2.push(embedding);
504
+ embeddings.push(embedding);
560
505
  }
561
506
  }
562
- if (embeddings2.length === 0) {
507
+ if (embeddings.length === 0) {
563
508
  throw new Error("No valid texts to embed");
564
509
  }
565
510
  return {
566
- embeddings: embeddings2,
567
- dimensions: embeddings2[0]?.length || 0,
511
+ embeddings,
512
+ dimensions: embeddings[0]?.length || 0,
568
513
  model: this.getModel(),
569
514
  provider: "llamacpp"
570
515
  };
571
516
  }
572
- const texts = [];
573
- for (const input of inputs) {
574
- const text = await this.readInput(input);
575
- if (text.trim()) {
576
- texts.push(text);
577
- }
578
- }
579
- if (texts.length === 0) {
580
- throw new Error("No valid texts to embed");
581
- }
582
- const modelPath = await this.getModelPath();
583
- const requests = inputs.map((input, v) => ({
584
- input: input.text || "",
585
- model: modelPath,
586
- pooling: "mean",
587
- normalize: 2
588
- }));
589
- const embeddings = [];
590
- for (const request of requests) {
591
- const result = await this.executeLlamaEmbedding([JSON.stringify(request)]);
592
- const embedding = this.parseRawOutput(result.stdout);
593
- embeddings.push(embedding);
594
- }
595
- return {
596
- embeddings,
597
- dimensions: embeddings[0]?.length || 0,
598
- model: this.getModel(),
599
- provider: "llamacpp"
600
- };
517
+ throw new Error("Direct Llama.cpp integration requires native module. Please ensure native module is properly compiled.");
601
518
  } catch (error) {
602
519
  logger.error(`Llama.cpp batch embedding failed: ${error instanceof Error ? error.message : String(error)}`);
603
520
  throw error;
@@ -619,6 +536,29 @@ var LlamaCppProvider = class extends EmbeddingProvider {
619
536
  getModel() {
620
537
  return this.modelPath;
621
538
  }
539
+ async getModelPath() {
540
+ if (this.modelPath.startsWith("/") || this.modelPath.startsWith("./")) {
541
+ return this.modelPath;
542
+ }
543
+ const possiblePaths = [
544
+ resolve(this.modelPath),
545
+ // Current directory
546
+ join("core/models", this.modelPath),
547
+ // core/models subdirectory
548
+ join("models", this.modelPath),
549
+ // models subdirectory
550
+ join(__dirname, "../../core/models", this.modelPath)
551
+ // Relative to dist
552
+ ];
553
+ for (const path of possiblePaths) {
554
+ try {
555
+ await access(path, constants.F_OK);
556
+ return path;
557
+ } catch (e) {
558
+ }
559
+ }
560
+ return this.modelPath;
561
+ }
622
562
  };
623
563
 
624
564
  // src/factory/EmbeddingFactory.ts
@@ -706,16 +646,16 @@ function createProvider(config2) {
706
646
  }
707
647
 
708
648
  // index.ts
709
- var VERSION = "1.0.0";
649
+ var VERSION = "0.2.3";
710
650
  function getVersion() {
711
651
  return VERSION;
712
652
  }
713
653
  var LIB_INFO = {
714
- name: "embedbox",
654
+ name: "vecbox",
715
655
  version: VERSION,
716
656
  description: "A minimal and powerful embedding library",
717
- homepage: "https://embedbox.dev",
718
- repository: "https://github.com/embedbox/embedbox.git",
657
+ homepage: "https://boxsafe.dev",
658
+ repository: "https://github.com/boxsafe/vecbox.git",
719
659
  supportedProviders: [
720
660
  "openai",
721
661
  "gemini",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["node-file:/home/inky/Development/vecbox/native/build/Release/llama_embedding.node","../native/index.js","../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","../index.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","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","/**\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"],"mappings":"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","names":["config","fs","logger","logger","config","logger","config","logger","config","config","embeddings","logger","config","logger","config"]}
1
+ {"version":3,"sources":["../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","../index.ts"],"sourcesContent":["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","/**\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"],"mappings":"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","names":["config","logger","logger","config","logger","config","logger","config","config","logger","config","logger","config"]}
package/native/index.js CHANGED
@@ -1,4 +1,16 @@
1
- const binding = require('./build/Release/llama_embedding.node');
1
+ // Try to load the native binding from different locations
2
+ let binding;
3
+ try {
4
+ binding = require('./llama_embedding.node');
5
+ } catch (error) {
6
+ try {
7
+ binding = require('./build/Release/llama_embedding.node');
8
+ } catch (fallbackError) {
9
+ throw new Error(`Failed to load native binding: ${fallbackError.message}`);
10
+ }
11
+ }
12
+
13
+ console.log(`Native binding loaded from: ${binding ? 'success' : 'failed'}`);
2
14
 
3
15
  class LlamaEmbedding {
4
16
  constructor(modelPath) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vecbox",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "A minimal and powerful embedding library that supports multiple providers with automatic detection and fallback capabilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -66,6 +66,8 @@
66
66
  "openai": "^6.21.0"
67
67
  },
68
68
  "devDependencies": {
69
- "tsup": "^8.5.1"
69
+ "@types/node": "^25.2.3",
70
+ "tsup": "^8.5.1",
71
+ "typescript": "^5.9.3"
70
72
  }
71
73
  }