rag-lite-ts 2.2.0 → 2.3.1
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/README.md +88 -5
- package/dist/cjs/cli/indexer.js +73 -15
- package/dist/cjs/cli/search.js +77 -2
- package/dist/cjs/cli/ui-server.d.ts +5 -0
- package/dist/cjs/cli/ui-server.js +152 -0
- package/dist/cjs/cli.js +53 -7
- package/dist/cjs/core/abstract-generator.d.ts +97 -0
- package/dist/cjs/core/abstract-generator.js +222 -0
- package/dist/cjs/core/binary-index-format.js +53 -10
- package/dist/cjs/core/db.d.ts +56 -0
- package/dist/cjs/core/db.js +105 -0
- package/dist/cjs/core/generator-registry.d.ts +114 -0
- package/dist/cjs/core/generator-registry.js +280 -0
- package/dist/cjs/core/index.d.ts +4 -0
- package/dist/cjs/core/index.js +11 -0
- package/dist/cjs/core/ingestion.js +3 -0
- package/dist/cjs/core/knowledge-base-manager.d.ts +109 -0
- package/dist/cjs/core/knowledge-base-manager.js +256 -0
- package/dist/cjs/core/lazy-dependency-loader.d.ts +43 -0
- package/dist/cjs/core/lazy-dependency-loader.js +111 -2
- package/dist/cjs/core/prompt-templates.d.ts +138 -0
- package/dist/cjs/core/prompt-templates.js +225 -0
- package/dist/cjs/core/response-generator.d.ts +132 -0
- package/dist/cjs/core/response-generator.js +69 -0
- package/dist/cjs/core/search-pipeline.js +1 -1
- package/dist/cjs/core/search.d.ts +72 -1
- package/dist/cjs/core/search.js +80 -7
- package/dist/cjs/core/types.d.ts +1 -0
- package/dist/cjs/core/vector-index-messages.d.ts +52 -0
- package/dist/cjs/core/vector-index-messages.js +5 -0
- package/dist/cjs/core/vector-index-worker.d.ts +6 -0
- package/dist/cjs/core/vector-index-worker.js +314 -0
- package/dist/cjs/core/vector-index.d.ts +45 -10
- package/dist/cjs/core/vector-index.js +279 -218
- package/dist/cjs/factories/generator-factory.d.ts +88 -0
- package/dist/cjs/factories/generator-factory.js +151 -0
- package/dist/cjs/factories/index.d.ts +1 -0
- package/dist/cjs/factories/index.js +5 -0
- package/dist/cjs/factories/ingestion-factory.js +3 -7
- package/dist/cjs/factories/search-factory.js +11 -0
- package/dist/cjs/index-manager.d.ts +23 -3
- package/dist/cjs/index-manager.js +84 -15
- package/dist/cjs/index.d.ts +11 -1
- package/dist/cjs/index.js +19 -1
- package/dist/cjs/text/generators/causal-lm-generator.d.ts +65 -0
- package/dist/cjs/text/generators/causal-lm-generator.js +197 -0
- package/dist/cjs/text/generators/index.d.ts +10 -0
- package/dist/cjs/text/generators/index.js +10 -0
- package/dist/cjs/text/generators/instruct-generator.d.ts +62 -0
- package/dist/cjs/text/generators/instruct-generator.js +192 -0
- package/dist/esm/cli/indexer.js +73 -15
- package/dist/esm/cli/search.js +77 -2
- package/dist/esm/cli/ui-server.d.ts +5 -0
- package/dist/esm/cli/ui-server.js +152 -0
- package/dist/esm/cli.js +53 -7
- package/dist/esm/core/abstract-generator.d.ts +97 -0
- package/dist/esm/core/abstract-generator.js +222 -0
- package/dist/esm/core/binary-index-format.js +53 -10
- package/dist/esm/core/db.d.ts +56 -0
- package/dist/esm/core/db.js +105 -0
- package/dist/esm/core/generator-registry.d.ts +114 -0
- package/dist/esm/core/generator-registry.js +280 -0
- package/dist/esm/core/index.d.ts +4 -0
- package/dist/esm/core/index.js +11 -0
- package/dist/esm/core/ingestion.js +3 -0
- package/dist/esm/core/knowledge-base-manager.d.ts +109 -0
- package/dist/esm/core/knowledge-base-manager.js +256 -0
- package/dist/esm/core/lazy-dependency-loader.d.ts +43 -0
- package/dist/esm/core/lazy-dependency-loader.js +111 -2
- package/dist/esm/core/prompt-templates.d.ts +138 -0
- package/dist/esm/core/prompt-templates.js +225 -0
- package/dist/esm/core/response-generator.d.ts +132 -0
- package/dist/esm/core/response-generator.js +69 -0
- package/dist/esm/core/search-pipeline.js +1 -1
- package/dist/esm/core/search.d.ts +72 -1
- package/dist/esm/core/search.js +80 -7
- package/dist/esm/core/types.d.ts +1 -0
- package/dist/esm/core/vector-index-messages.d.ts +52 -0
- package/dist/esm/core/vector-index-messages.js +5 -0
- package/dist/esm/core/vector-index-worker.d.ts +6 -0
- package/dist/esm/core/vector-index-worker.js +314 -0
- package/dist/esm/core/vector-index.d.ts +45 -10
- package/dist/esm/core/vector-index.js +279 -218
- package/dist/esm/factories/generator-factory.d.ts +88 -0
- package/dist/esm/factories/generator-factory.js +151 -0
- package/dist/esm/factories/index.d.ts +1 -0
- package/dist/esm/factories/index.js +5 -0
- package/dist/esm/factories/ingestion-factory.js +3 -7
- package/dist/esm/factories/search-factory.js +11 -0
- package/dist/esm/index-manager.d.ts +23 -3
- package/dist/esm/index-manager.js +84 -15
- package/dist/esm/index.d.ts +11 -1
- package/dist/esm/index.js +19 -1
- package/dist/esm/text/generators/causal-lm-generator.d.ts +65 -0
- package/dist/esm/text/generators/causal-lm-generator.js +197 -0
- package/dist/esm/text/generators/index.d.ts +10 -0
- package/dist/esm/text/generators/index.js +10 -0
- package/dist/esm/text/generators/instruct-generator.d.ts +62 -0
- package/dist/esm/text/generators/instruct-generator.js +192 -0
- package/package.json +14 -7
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORE MODULE — Response Generator Interface for RAG Response Generation
|
|
3
|
+
*
|
|
4
|
+
* Model-agnostic interfaces supporting text generation from retrieved context.
|
|
5
|
+
* Designed for runtime polymorphism and extensibility, following the same
|
|
6
|
+
* patterns established by the UniversalEmbedder interface.
|
|
7
|
+
*
|
|
8
|
+
* SUPPORTED MODELS:
|
|
9
|
+
* - HuggingFaceTB/SmolLM2-135M-Instruct (instruct, balanced, recommended, 3 chunks default)
|
|
10
|
+
* - HuggingFaceTB/SmolLM2-360M-Instruct (instruct, higher quality, 5 chunks default)
|
|
11
|
+
*
|
|
12
|
+
* PREREQUISITES:
|
|
13
|
+
* - Reranking must be enabled for response generation
|
|
14
|
+
*
|
|
15
|
+
* @experimental This feature is experimental and may change in future versions.
|
|
16
|
+
*/
|
|
17
|
+
import type { SearchResult } from './types.js';
|
|
18
|
+
/** Supported generator model types */
|
|
19
|
+
export type GeneratorModelType = 'causal-lm' | 'instruct';
|
|
20
|
+
/** Generation request containing query and retrieved context */
|
|
21
|
+
export interface GenerationRequest {
|
|
22
|
+
query: string;
|
|
23
|
+
chunks: SearchResult[];
|
|
24
|
+
systemPrompt?: string;
|
|
25
|
+
maxTokens?: number;
|
|
26
|
+
temperature?: number;
|
|
27
|
+
topP?: number;
|
|
28
|
+
topK?: number;
|
|
29
|
+
repetitionPenalty?: number;
|
|
30
|
+
stopSequences?: string[];
|
|
31
|
+
includeSourceAttribution?: boolean;
|
|
32
|
+
/** Maximum number of chunks to include in context (overrides model default) */
|
|
33
|
+
maxChunksForContext?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Result of text generation */
|
|
36
|
+
export interface GenerationResult {
|
|
37
|
+
response: string;
|
|
38
|
+
tokensUsed: number;
|
|
39
|
+
truncated: boolean;
|
|
40
|
+
modelName: string;
|
|
41
|
+
generationTimeMs: number;
|
|
42
|
+
metadata: {
|
|
43
|
+
promptTokens: number;
|
|
44
|
+
completionTokens: number;
|
|
45
|
+
chunksIncluded: number;
|
|
46
|
+
totalChunks: number;
|
|
47
|
+
finishReason: 'complete' | 'length' | 'stop_sequence' | 'error';
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Generator model capabilities */
|
|
51
|
+
export interface GeneratorCapabilities {
|
|
52
|
+
supportsStreaming: boolean;
|
|
53
|
+
supportsSystemPrompt: boolean;
|
|
54
|
+
instructionTuned: boolean;
|
|
55
|
+
maxContextLength: number;
|
|
56
|
+
defaultMaxOutputTokens: number;
|
|
57
|
+
recommendedTemperature: number;
|
|
58
|
+
/** Maximum number of chunks to use for context (default varies by model) */
|
|
59
|
+
defaultMaxChunksForContext: number;
|
|
60
|
+
}
|
|
61
|
+
/** Generator model requirements */
|
|
62
|
+
export interface GeneratorRequirements {
|
|
63
|
+
transformersJsVersion: string;
|
|
64
|
+
minimumMemory: number;
|
|
65
|
+
requiredFeatures: readonly string[];
|
|
66
|
+
platformSupport: readonly string[];
|
|
67
|
+
}
|
|
68
|
+
/** Complete generator model information */
|
|
69
|
+
export interface GeneratorModelInfo {
|
|
70
|
+
name: string;
|
|
71
|
+
type: GeneratorModelType;
|
|
72
|
+
version: string;
|
|
73
|
+
capabilities: GeneratorCapabilities;
|
|
74
|
+
requirements: GeneratorRequirements;
|
|
75
|
+
isDefault?: boolean;
|
|
76
|
+
description?: string;
|
|
77
|
+
}
|
|
78
|
+
/** Generator validation result */
|
|
79
|
+
export interface GeneratorValidationResult {
|
|
80
|
+
isValid: boolean;
|
|
81
|
+
errors: string[];
|
|
82
|
+
warnings: string[];
|
|
83
|
+
suggestions: string[];
|
|
84
|
+
}
|
|
85
|
+
/** Options for creating generator instances */
|
|
86
|
+
export interface GeneratorCreationOptions {
|
|
87
|
+
cachePath?: string;
|
|
88
|
+
timeout?: number;
|
|
89
|
+
enableGPU?: boolean;
|
|
90
|
+
defaultGenerationOptions?: Partial<GenerationRequest>;
|
|
91
|
+
customConfig?: Record<string, any>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Universal response generator interface
|
|
95
|
+
* @experimental This feature is experimental and may change in future versions.
|
|
96
|
+
*/
|
|
97
|
+
export interface ResponseGenerator {
|
|
98
|
+
readonly modelName: string;
|
|
99
|
+
readonly modelType: GeneratorModelType;
|
|
100
|
+
readonly maxContextLength: number;
|
|
101
|
+
readonly maxOutputLength: number;
|
|
102
|
+
generate(request: GenerationRequest): Promise<GenerationResult>;
|
|
103
|
+
generateStream?(request: GenerationRequest): AsyncIterable<string>;
|
|
104
|
+
loadModel(): Promise<void>;
|
|
105
|
+
isLoaded(): boolean;
|
|
106
|
+
getModelInfo(): GeneratorModelInfo;
|
|
107
|
+
cleanup(): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
export type GenerateFunction = (query: string, chunks: SearchResult[], options?: Partial<GenerationRequest>) => Promise<GenerationResult>;
|
|
110
|
+
export type CreateGeneratorFunction = (modelName: string, options?: GeneratorCreationOptions) => Promise<ResponseGenerator>;
|
|
111
|
+
export declare class GeneratorValidationError extends Error {
|
|
112
|
+
readonly modelName: string;
|
|
113
|
+
readonly availableModels: readonly string[];
|
|
114
|
+
constructor(modelName: string, availableModels: readonly string[], message: string);
|
|
115
|
+
}
|
|
116
|
+
export declare class GenerationError extends Error {
|
|
117
|
+
readonly modelName: string;
|
|
118
|
+
readonly stage: 'loading' | 'tokenization' | 'generation' | 'decoding';
|
|
119
|
+
readonly cause?: Error | undefined;
|
|
120
|
+
constructor(modelName: string, stage: 'loading' | 'tokenization' | 'generation' | 'decoding', message: string, cause?: Error | undefined);
|
|
121
|
+
}
|
|
122
|
+
export declare class ContextWindowError extends Error {
|
|
123
|
+
readonly requiredTokens: number;
|
|
124
|
+
readonly availableTokens: number;
|
|
125
|
+
constructor(requiredTokens: number, availableTokens: number, message: string);
|
|
126
|
+
}
|
|
127
|
+
export declare function supportsStreaming(generator: ResponseGenerator): generator is ResponseGenerator & {
|
|
128
|
+
generateStream(request: GenerationRequest): AsyncIterable<string>;
|
|
129
|
+
};
|
|
130
|
+
export declare function isInstructModel(generator: ResponseGenerator): boolean;
|
|
131
|
+
export declare function createGenerateFunction(generator: ResponseGenerator): GenerateFunction;
|
|
132
|
+
//# sourceMappingURL=response-generator.d.ts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORE MODULE — Response Generator Interface for RAG Response Generation
|
|
3
|
+
*
|
|
4
|
+
* Model-agnostic interfaces supporting text generation from retrieved context.
|
|
5
|
+
* Designed for runtime polymorphism and extensibility, following the same
|
|
6
|
+
* patterns established by the UniversalEmbedder interface.
|
|
7
|
+
*
|
|
8
|
+
* SUPPORTED MODELS:
|
|
9
|
+
* - HuggingFaceTB/SmolLM2-135M-Instruct (instruct, balanced, recommended, 3 chunks default)
|
|
10
|
+
* - HuggingFaceTB/SmolLM2-360M-Instruct (instruct, higher quality, 5 chunks default)
|
|
11
|
+
*
|
|
12
|
+
* PREREQUISITES:
|
|
13
|
+
* - Reranking must be enabled for response generation
|
|
14
|
+
*
|
|
15
|
+
* @experimental This feature is experimental and may change in future versions.
|
|
16
|
+
*/
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// ERROR CLASSES
|
|
19
|
+
// =============================================================================
|
|
20
|
+
export class GeneratorValidationError extends Error {
|
|
21
|
+
modelName;
|
|
22
|
+
availableModels;
|
|
23
|
+
constructor(modelName, availableModels, message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.modelName = modelName;
|
|
26
|
+
this.availableModels = availableModels;
|
|
27
|
+
this.name = 'GeneratorValidationError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class GenerationError extends Error {
|
|
31
|
+
modelName;
|
|
32
|
+
stage;
|
|
33
|
+
cause;
|
|
34
|
+
constructor(modelName, stage, message, cause) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.modelName = modelName;
|
|
37
|
+
this.stage = stage;
|
|
38
|
+
this.cause = cause;
|
|
39
|
+
this.name = 'GenerationError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class ContextWindowError extends Error {
|
|
43
|
+
requiredTokens;
|
|
44
|
+
availableTokens;
|
|
45
|
+
constructor(requiredTokens, availableTokens, message) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.requiredTokens = requiredTokens;
|
|
48
|
+
this.availableTokens = availableTokens;
|
|
49
|
+
this.name = 'ContextWindowError';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// UTILITY FUNCTIONS
|
|
54
|
+
// =============================================================================
|
|
55
|
+
export function supportsStreaming(generator) {
|
|
56
|
+
return typeof generator.generateStream === 'function';
|
|
57
|
+
}
|
|
58
|
+
export function isInstructModel(generator) {
|
|
59
|
+
return generator.modelType === 'instruct';
|
|
60
|
+
}
|
|
61
|
+
export function createGenerateFunction(generator) {
|
|
62
|
+
return async (query, chunks, options) => {
|
|
63
|
+
if (!generator.isLoaded()) {
|
|
64
|
+
await generator.loadModel();
|
|
65
|
+
}
|
|
66
|
+
return generator.generate({ query, chunks, ...options });
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=response-generator.js.map
|
|
@@ -123,7 +123,7 @@ export class SearchPipelineCoordinator {
|
|
|
123
123
|
throw new Error('Index manager not set. Set index manager before executing pipeline.');
|
|
124
124
|
}
|
|
125
125
|
try {
|
|
126
|
-
return this.indexManager.search(queryVector, topK);
|
|
126
|
+
return await this.indexManager.search(queryVector, topK);
|
|
127
127
|
}
|
|
128
128
|
catch (error) {
|
|
129
129
|
if (error instanceof Error && error.message.includes('No embedding ID found for hash')) {
|
|
@@ -6,17 +6,54 @@ import { IndexManager } from '../index-manager.js';
|
|
|
6
6
|
import { DatabaseConnection } from './db.js';
|
|
7
7
|
import type { SearchResult, SearchOptions } from './types.js';
|
|
8
8
|
import type { EmbedFunction, RerankFunction } from './interfaces.js';
|
|
9
|
+
import type { GenerateFunction } from './response-generator.js';
|
|
9
10
|
/**
|
|
10
11
|
* Search engine that provides semantic search capabilities
|
|
11
12
|
* Implements the core search pipeline: query embedding → vector search → metadata retrieval → optional reranking
|
|
12
13
|
* Uses explicit dependency injection for clean architecture
|
|
13
14
|
*/
|
|
15
|
+
/**
|
|
16
|
+
* Extended search options with generation support
|
|
17
|
+
* @experimental Generation features are experimental
|
|
18
|
+
*/
|
|
19
|
+
export interface ExtendedSearchOptions extends SearchOptions {
|
|
20
|
+
/** Enable AI response generation from search results */
|
|
21
|
+
generateResponse?: boolean;
|
|
22
|
+
/** Generator model to use (default: SmolLM2-135M-Instruct) */
|
|
23
|
+
generatorModel?: string;
|
|
24
|
+
/** Generation options */
|
|
25
|
+
generationOptions?: {
|
|
26
|
+
maxTokens?: number;
|
|
27
|
+
temperature?: number;
|
|
28
|
+
systemPrompt?: string;
|
|
29
|
+
/** Maximum chunks to use for context (overrides model default) */
|
|
30
|
+
maxChunksForContext?: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search result with optional generated response
|
|
35
|
+
* @experimental Generation features are experimental
|
|
36
|
+
*/
|
|
37
|
+
export interface SearchResultWithGeneration {
|
|
38
|
+
/** Search results (chunks) */
|
|
39
|
+
results: SearchResult[];
|
|
40
|
+
/** Generated response (if generation was enabled) */
|
|
41
|
+
generation?: {
|
|
42
|
+
response: string;
|
|
43
|
+
modelUsed: string;
|
|
44
|
+
tokensUsed: number;
|
|
45
|
+
truncated: boolean;
|
|
46
|
+
chunksUsedForContext: number;
|
|
47
|
+
generationTimeMs: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
14
50
|
export declare class SearchEngine {
|
|
15
51
|
private embedFn;
|
|
16
52
|
private indexManager;
|
|
17
53
|
private db;
|
|
18
54
|
private rerankFn?;
|
|
19
55
|
private contentResolver?;
|
|
56
|
+
private generateFn?;
|
|
20
57
|
/**
|
|
21
58
|
* Creates a new SearchEngine with explicit dependency injection
|
|
22
59
|
*
|
|
@@ -71,7 +108,41 @@ export declare class SearchEngine {
|
|
|
71
108
|
* const search = new SearchEngine(customEmbedFn, indexManager, db);
|
|
72
109
|
* ```
|
|
73
110
|
*/
|
|
74
|
-
constructor(embedFn: EmbedFunction, indexManager: IndexManager, db: DatabaseConnection, rerankFn?: RerankFunction | undefined, contentResolver?: import('./content-resolver.js').ContentResolver);
|
|
111
|
+
constructor(embedFn: EmbedFunction, indexManager: IndexManager, db: DatabaseConnection, rerankFn?: RerankFunction | undefined, contentResolver?: import('./content-resolver.js').ContentResolver, generateFn?: GenerateFunction);
|
|
112
|
+
/**
|
|
113
|
+
* Set or update the generate function
|
|
114
|
+
* @experimental This method is experimental and may change
|
|
115
|
+
*/
|
|
116
|
+
setGenerateFunction(generateFn: GenerateFunction | undefined): void;
|
|
117
|
+
/**
|
|
118
|
+
* Check if generation is available
|
|
119
|
+
* @experimental This method is experimental and may change
|
|
120
|
+
*/
|
|
121
|
+
hasGenerationCapability(): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Perform semantic search with optional AI response generation
|
|
124
|
+
*
|
|
125
|
+
* This method extends the standard search with optional response generation.
|
|
126
|
+
* When generation is enabled, the retrieved chunks are used as context for
|
|
127
|
+
* an AI model to generate a synthesized response.
|
|
128
|
+
*
|
|
129
|
+
* @param query - Search query string
|
|
130
|
+
* @param options - Extended search options including generation settings
|
|
131
|
+
* @returns Promise resolving to search results with optional generated response
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* // Search with generation
|
|
136
|
+
* const result = await search.searchWithGeneration('How does auth work?', {
|
|
137
|
+
* top_k: 5,
|
|
138
|
+
* generateResponse: true
|
|
139
|
+
* });
|
|
140
|
+
* console.log(result.generation?.response);
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* @experimental This method is experimental and may change in future versions.
|
|
144
|
+
*/
|
|
145
|
+
searchWithGeneration(query: string, options?: ExtendedSearchOptions): Promise<SearchResultWithGeneration>;
|
|
75
146
|
/**
|
|
76
147
|
* Perform semantic search on the indexed documents
|
|
77
148
|
* Implements the core search pipeline: query embedding → vector search → metadata retrieval → optional reranking
|
package/dist/esm/core/search.js
CHANGED
|
@@ -5,17 +5,13 @@
|
|
|
5
5
|
import { getChunksByEmbeddingIds } from './db.js';
|
|
6
6
|
import { config } from './config.js';
|
|
7
7
|
import { createMissingDependencyError } from './actionable-error-messages.js';
|
|
8
|
-
/**
|
|
9
|
-
* Search engine that provides semantic search capabilities
|
|
10
|
-
* Implements the core search pipeline: query embedding → vector search → metadata retrieval → optional reranking
|
|
11
|
-
* Uses explicit dependency injection for clean architecture
|
|
12
|
-
*/
|
|
13
8
|
export class SearchEngine {
|
|
14
9
|
embedFn;
|
|
15
10
|
indexManager;
|
|
16
11
|
db;
|
|
17
12
|
rerankFn;
|
|
18
13
|
contentResolver;
|
|
14
|
+
generateFn;
|
|
19
15
|
/**
|
|
20
16
|
* Creates a new SearchEngine with explicit dependency injection
|
|
21
17
|
*
|
|
@@ -70,7 +66,7 @@ export class SearchEngine {
|
|
|
70
66
|
* const search = new SearchEngine(customEmbedFn, indexManager, db);
|
|
71
67
|
* ```
|
|
72
68
|
*/
|
|
73
|
-
constructor(embedFn, indexManager, db, rerankFn, contentResolver) {
|
|
69
|
+
constructor(embedFn, indexManager, db, rerankFn, contentResolver, generateFn) {
|
|
74
70
|
this.embedFn = embedFn;
|
|
75
71
|
this.indexManager = indexManager;
|
|
76
72
|
this.db = db;
|
|
@@ -93,6 +89,83 @@ export class SearchEngine {
|
|
|
93
89
|
}
|
|
94
90
|
// Initialize ContentResolver if provided, or create lazily when needed
|
|
95
91
|
this.contentResolver = contentResolver;
|
|
92
|
+
// Initialize GenerateFunction if provided (experimental)
|
|
93
|
+
this.generateFn = generateFn;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Set or update the generate function
|
|
97
|
+
* @experimental This method is experimental and may change
|
|
98
|
+
*/
|
|
99
|
+
setGenerateFunction(generateFn) {
|
|
100
|
+
this.generateFn = generateFn;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if generation is available
|
|
104
|
+
* @experimental This method is experimental and may change
|
|
105
|
+
*/
|
|
106
|
+
hasGenerationCapability() {
|
|
107
|
+
return this.generateFn !== undefined;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Perform semantic search with optional AI response generation
|
|
111
|
+
*
|
|
112
|
+
* This method extends the standard search with optional response generation.
|
|
113
|
+
* When generation is enabled, the retrieved chunks are used as context for
|
|
114
|
+
* an AI model to generate a synthesized response.
|
|
115
|
+
*
|
|
116
|
+
* @param query - Search query string
|
|
117
|
+
* @param options - Extended search options including generation settings
|
|
118
|
+
* @returns Promise resolving to search results with optional generated response
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* // Search with generation
|
|
123
|
+
* const result = await search.searchWithGeneration('How does auth work?', {
|
|
124
|
+
* top_k: 5,
|
|
125
|
+
* generateResponse: true
|
|
126
|
+
* });
|
|
127
|
+
* console.log(result.generation?.response);
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @experimental This method is experimental and may change in future versions.
|
|
131
|
+
*/
|
|
132
|
+
async searchWithGeneration(query, options = {}) {
|
|
133
|
+
// Perform standard search
|
|
134
|
+
const results = await this.search(query, options);
|
|
135
|
+
// If generation not requested or no results, return without generation
|
|
136
|
+
if (!options.generateResponse || results.length === 0) {
|
|
137
|
+
return { results };
|
|
138
|
+
}
|
|
139
|
+
// Check if generation is available
|
|
140
|
+
if (!this.generateFn) {
|
|
141
|
+
console.warn('⚠️ [EXPERIMENTAL] Generation requested but no generator configured');
|
|
142
|
+
return { results };
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
console.log('🤖 [EXPERIMENTAL] Generating response from search results...');
|
|
146
|
+
const generationResult = await this.generateFn(query, results, {
|
|
147
|
+
maxTokens: options.generationOptions?.maxTokens,
|
|
148
|
+
temperature: options.generationOptions?.temperature,
|
|
149
|
+
systemPrompt: options.generationOptions?.systemPrompt,
|
|
150
|
+
maxChunksForContext: options.generationOptions?.maxChunksForContext
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
results,
|
|
154
|
+
generation: {
|
|
155
|
+
response: generationResult.response,
|
|
156
|
+
modelUsed: generationResult.modelName,
|
|
157
|
+
tokensUsed: generationResult.tokensUsed,
|
|
158
|
+
truncated: generationResult.truncated,
|
|
159
|
+
chunksUsedForContext: generationResult.metadata.chunksIncluded,
|
|
160
|
+
generationTimeMs: generationResult.generationTimeMs
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error('❌ [EXPERIMENTAL] Generation failed:', error instanceof Error ? error.message : 'Unknown error');
|
|
166
|
+
// Return results without generation on error
|
|
167
|
+
return { results };
|
|
168
|
+
}
|
|
96
169
|
}
|
|
97
170
|
/**
|
|
98
171
|
* Perform semantic search on the indexed documents
|
|
@@ -140,7 +213,7 @@ export class SearchEngine {
|
|
|
140
213
|
let searchResult;
|
|
141
214
|
try {
|
|
142
215
|
const contentType = options.contentType;
|
|
143
|
-
searchResult = this.indexManager.search(queryVector, topK, contentType);
|
|
216
|
+
searchResult = await this.indexManager.search(queryVector, topK, contentType);
|
|
144
217
|
}
|
|
145
218
|
catch (error) {
|
|
146
219
|
if (error instanceof Error && error.message.includes('No embedding ID found for hash')) {
|
package/dist/esm/core/types.d.ts
CHANGED
|
@@ -63,4 +63,5 @@ export interface Document {
|
|
|
63
63
|
}
|
|
64
64
|
export type { DatabaseConnection } from './db.js';
|
|
65
65
|
export type { ContentChunk as ChunkResult } from './db.js';
|
|
66
|
+
export type { GenerationRequest, GenerationResult, GenerateFunction, ResponseGenerator, GeneratorModelInfo } from './response-generator.js';
|
|
66
67
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message protocol for VectorIndex worker thread communication
|
|
3
|
+
*/
|
|
4
|
+
export interface VectorIndexRequest {
|
|
5
|
+
id: number;
|
|
6
|
+
type: 'init' | 'loadIndex' | 'saveIndex' | 'addVector' | 'addVectors' | 'search' | 'getCurrentCount' | 'resizeIndex' | 'reset' | 'cleanup' | 'indexExists' | 'setEf';
|
|
7
|
+
payload?: any;
|
|
8
|
+
}
|
|
9
|
+
export interface VectorIndexResponse {
|
|
10
|
+
id: number;
|
|
11
|
+
type: 'success' | 'error';
|
|
12
|
+
payload?: any;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface InitPayload {
|
|
16
|
+
dimensions: number;
|
|
17
|
+
maxElements: number;
|
|
18
|
+
M?: number;
|
|
19
|
+
efConstruction?: number;
|
|
20
|
+
seed?: number;
|
|
21
|
+
indexPath: string;
|
|
22
|
+
}
|
|
23
|
+
export interface LoadIndexPayload {
|
|
24
|
+
indexPath: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AddVectorPayload {
|
|
27
|
+
id: number;
|
|
28
|
+
vector: ArrayBuffer;
|
|
29
|
+
dimensions: number;
|
|
30
|
+
}
|
|
31
|
+
export interface AddVectorsPayload {
|
|
32
|
+
vectors: Array<{
|
|
33
|
+
id: number;
|
|
34
|
+
vector: ArrayBuffer;
|
|
35
|
+
dimensions: number;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface SearchPayload {
|
|
39
|
+
queryVector: ArrayBuffer;
|
|
40
|
+
dimensions: number;
|
|
41
|
+
k: number;
|
|
42
|
+
}
|
|
43
|
+
export interface ResizeIndexPayload {
|
|
44
|
+
newMaxElements: number;
|
|
45
|
+
}
|
|
46
|
+
export interface SetEfPayload {
|
|
47
|
+
ef: number;
|
|
48
|
+
}
|
|
49
|
+
export interface IndexExistsPayload {
|
|
50
|
+
indexPath: string;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=vector-index-messages.d.ts.map
|