lazlo-ai 1.0.0
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/.env.example +9 -0
- package/README.md +278 -0
- package/dist/cache/semantic.d.ts +39 -0
- package/dist/cache/semantic.d.ts.map +1 -0
- package/dist/cache/semantic.js +134 -0
- package/dist/cache/semantic.js.map +1 -0
- package/dist/chains/llmchain.d.ts +65 -0
- package/dist/chains/llmchain.d.ts.map +1 -0
- package/dist/chains/llmchain.js +137 -0
- package/dist/chains/llmchain.js.map +1 -0
- package/dist/chains/rag.d.ts +23 -0
- package/dist/chains/rag.d.ts.map +1 -0
- package/dist/chains/rag.js +47 -0
- package/dist/chains/rag.js.map +1 -0
- package/dist/core/types.d.ts +130 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/document_loaders/index.d.ts +61 -0
- package/dist/document_loaders/index.d.ts.map +1 -0
- package/dist/document_loaders/index.js +183 -0
- package/dist/document_loaders/index.js.map +1 -0
- package/dist/embeddings/google.d.ts +43 -0
- package/dist/embeddings/google.d.ts.map +1 -0
- package/dist/embeddings/google.js +90 -0
- package/dist/embeddings/google.js.map +1 -0
- package/dist/embeddings/local.d.ts +64 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +95 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/evals/judge.d.ts +22 -0
- package/dist/evals/judge.d.ts.map +1 -0
- package/dist/evals/judge.js +77 -0
- package/dist/evals/judge.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/buffer.d.ts +64 -0
- package/dist/memory/buffer.d.ts.map +1 -0
- package/dist/memory/buffer.js +168 -0
- package/dist/memory/buffer.js.map +1 -0
- package/dist/parsers/output.d.ts +64 -0
- package/dist/parsers/output.d.ts.map +1 -0
- package/dist/parsers/output.js +148 -0
- package/dist/parsers/output.js.map +1 -0
- package/dist/prompts/registry.d.ts +65 -0
- package/dist/prompts/registry.d.ts.map +1 -0
- package/dist/prompts/registry.js +170 -0
- package/dist/prompts/registry.js.map +1 -0
- package/dist/providers/ollama.d.ts +30 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +104 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +46 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +228 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/retrievers/index.d.ts +71 -0
- package/dist/retrievers/index.d.ts.map +1 -0
- package/dist/retrievers/index.js +130 -0
- package/dist/retrievers/index.js.map +1 -0
- package/dist/router/smartrouter.d.ts +36 -0
- package/dist/router/smartrouter.d.ts.map +1 -0
- package/dist/router/smartrouter.js +132 -0
- package/dist/router/smartrouter.js.map +1 -0
- package/dist/text_splitters/index.d.ts +28 -0
- package/dist/text_splitters/index.d.ts.map +1 -0
- package/dist/text_splitters/index.js +109 -0
- package/dist/text_splitters/index.js.map +1 -0
- package/dist/tools/decorator.d.ts +26 -0
- package/dist/tools/decorator.d.ts.map +1 -0
- package/dist/tools/decorator.js +102 -0
- package/dist/tools/decorator.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/keiro.d.ts +20 -0
- package/dist/tools/keiro.d.ts.map +1 -0
- package/dist/tools/keiro.js +67 -0
- package/dist/tools/keiro.js.map +1 -0
- package/dist/tracing/tracer.d.ts +56 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +125 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/utils/logger.d.ts +25 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pricing.d.ts +31 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +108 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/vectorstores/index.d.ts +62 -0
- package/dist/vectorstores/index.d.ts.map +1 -0
- package/dist/vectorstores/index.js +244 -0
- package/dist/vectorstores/index.js.map +1 -0
- package/package.json +48 -0
- package/src/cache/semantic.ts +175 -0
- package/src/chains/llmchain.ts +194 -0
- package/src/chains/rag.ts +65 -0
- package/src/core/types.ts +178 -0
- package/src/document_loaders/index.ts +223 -0
- package/src/embeddings/google.ts +119 -0
- package/src/embeddings/local.ts +118 -0
- package/src/evals/judge.ts +99 -0
- package/src/index.ts +121 -0
- package/src/memory/buffer.ts +222 -0
- package/src/parsers/output.ts +195 -0
- package/src/prompts/registry.ts +205 -0
- package/src/providers/ollama.ts +151 -0
- package/src/providers/openai.ts +320 -0
- package/src/retrievers/index.ts +182 -0
- package/src/router/smartrouter.ts +172 -0
- package/src/text_splitters/index.ts +145 -0
- package/src/tools/decorator.ts +145 -0
- package/src/tools/index.ts +7 -0
- package/src/tools/keiro.ts +92 -0
- package/src/tracing/tracer.ts +178 -0
- package/src/utils/logger.ts +62 -0
- package/src/utils/pricing.ts +133 -0
- package/src/vectorstores/index.ts +338 -0
- package/test-full.mjs +552 -0
- package/test.mjs +74 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider
|
|
3
|
+
*
|
|
4
|
+
* Direct API access to OpenAI models. No massive SDKs, just axios calls.
|
|
5
|
+
*/
|
|
6
|
+
import axios from 'axios';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { calculateCost } from '../utils/pricing.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Circuit Breaker
|
|
11
|
+
// ============================================================================
|
|
12
|
+
class CircuitBreaker {
|
|
13
|
+
failMax;
|
|
14
|
+
resetTimeout;
|
|
15
|
+
failures = 0;
|
|
16
|
+
lastFailure = 0;
|
|
17
|
+
state = 'closed';
|
|
18
|
+
constructor(failMax = 5, resetTimeout = 60000) {
|
|
19
|
+
this.failMax = failMax;
|
|
20
|
+
this.resetTimeout = resetTimeout;
|
|
21
|
+
}
|
|
22
|
+
async execute(fn) {
|
|
23
|
+
if (this.state === 'open') {
|
|
24
|
+
if (Date.now() - this.lastFailure > this.resetTimeout) {
|
|
25
|
+
this.state = 'half-open';
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
throw new Error('Circuit breaker open');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const result = await fn();
|
|
33
|
+
if (this.state === 'half-open') {
|
|
34
|
+
this.state = 'closed';
|
|
35
|
+
this.failures = 0;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.failures++;
|
|
41
|
+
this.lastFailure = Date.now();
|
|
42
|
+
if (this.failures >= this.failMax) {
|
|
43
|
+
this.state = 'open';
|
|
44
|
+
}
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const openAICircuitBreaker = new CircuitBreaker();
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Helper Functions
|
|
52
|
+
// ============================================================================
|
|
53
|
+
function isRetryableError(error) {
|
|
54
|
+
if (axios.isAxiosError(error)) {
|
|
55
|
+
const status = error.response?.status;
|
|
56
|
+
return status === undefined || status === 429 || status >= 500;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
function parseResponseFormat(format) {
|
|
61
|
+
if (!format)
|
|
62
|
+
return undefined;
|
|
63
|
+
if (format.type === 'json_schema' && format.json_schema) {
|
|
64
|
+
return {
|
|
65
|
+
type: 'json_schema',
|
|
66
|
+
json_schema: {
|
|
67
|
+
name: format.json_schema.name,
|
|
68
|
+
schema: format.json_schema.schema,
|
|
69
|
+
strict: format.json_schema.strict ?? true,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return { type: format.type };
|
|
74
|
+
}
|
|
75
|
+
// Simple rate limiting
|
|
76
|
+
let lastRequestTime = 0;
|
|
77
|
+
const MIN_REQUEST_INTERVAL = 100; // ms between requests
|
|
78
|
+
async function rateLimit() {
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
const elapsed = now - lastRequestTime;
|
|
81
|
+
if (elapsed < MIN_REQUEST_INTERVAL) {
|
|
82
|
+
await new Promise(resolve => setTimeout(resolve, MIN_REQUEST_INTERVAL - elapsed));
|
|
83
|
+
}
|
|
84
|
+
lastRequestTime = Date.now();
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// OpenAI Provider
|
|
88
|
+
// ============================================================================
|
|
89
|
+
export class OpenAI {
|
|
90
|
+
supportsTools = true;
|
|
91
|
+
supportsStructuredOutput = true;
|
|
92
|
+
client;
|
|
93
|
+
defaultModel;
|
|
94
|
+
constructor(apiKey, defaultModel = 'gpt-4o', options = {}) {
|
|
95
|
+
const key = apiKey ?? (typeof process !== 'undefined' ? process.env?.OPENAI_API_KEY : undefined);
|
|
96
|
+
if (!key) {
|
|
97
|
+
throw new Error('OPENAI_API_KEY is required');
|
|
98
|
+
}
|
|
99
|
+
this.defaultModel = defaultModel;
|
|
100
|
+
this.client = axios.create({
|
|
101
|
+
baseURL: options.baseURL ?? 'https://api.openai.com/v1',
|
|
102
|
+
headers: {
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
Authorization: `Bearer ${key}`,
|
|
105
|
+
},
|
|
106
|
+
timeout: options.timeout ?? 120000,
|
|
107
|
+
});
|
|
108
|
+
logger.info(`OpenAI Provider ready. Default Model: ${this.defaultModel}`);
|
|
109
|
+
}
|
|
110
|
+
preparePayload(model, messages, options = {}) {
|
|
111
|
+
const payload = {
|
|
112
|
+
model,
|
|
113
|
+
messages,
|
|
114
|
+
};
|
|
115
|
+
if (options.tools) {
|
|
116
|
+
payload.tools = options.tools;
|
|
117
|
+
}
|
|
118
|
+
if (options.responseFormat) {
|
|
119
|
+
payload.response_format = parseResponseFormat(options.responseFormat);
|
|
120
|
+
}
|
|
121
|
+
if (options.temperature !== undefined)
|
|
122
|
+
payload.temperature = options.temperature;
|
|
123
|
+
if (options.maxTokens !== undefined)
|
|
124
|
+
payload.max_tokens = options.maxTokens;
|
|
125
|
+
if (options.topP !== undefined)
|
|
126
|
+
payload.top_p = options.topP;
|
|
127
|
+
if (options.stop !== undefined)
|
|
128
|
+
payload.stop = options.stop;
|
|
129
|
+
if (options.stream !== undefined)
|
|
130
|
+
payload.stream = options.stream;
|
|
131
|
+
return payload;
|
|
132
|
+
}
|
|
133
|
+
async invoke(messages, options = {}) {
|
|
134
|
+
const model = options.model ?? this.defaultModel;
|
|
135
|
+
// Handle string input
|
|
136
|
+
const formattedMessages = typeof messages === 'string'
|
|
137
|
+
? [{ role: 'user', content: messages }]
|
|
138
|
+
: messages;
|
|
139
|
+
// Convert stop to array if needed
|
|
140
|
+
const stop = options.stop
|
|
141
|
+
? (Array.isArray(options.stop) ? options.stop : [options.stop])
|
|
142
|
+
: undefined;
|
|
143
|
+
const payload = this.preparePayload(model, formattedMessages, {
|
|
144
|
+
...options,
|
|
145
|
+
stop,
|
|
146
|
+
});
|
|
147
|
+
return openAICircuitBreaker.execute(async () => {
|
|
148
|
+
await rateLimit();
|
|
149
|
+
try {
|
|
150
|
+
const response = await this.client.post('/chat/completions', payload);
|
|
151
|
+
const data = response.data;
|
|
152
|
+
if (!data.choices?.length) {
|
|
153
|
+
throw new Error('Empty response from OpenAI');
|
|
154
|
+
}
|
|
155
|
+
const choice = data.choices[0];
|
|
156
|
+
const usage = data.usage ?? {};
|
|
157
|
+
const result = {
|
|
158
|
+
content: choice.message?.content ?? '',
|
|
159
|
+
tool_calls: choice.message?.tool_calls,
|
|
160
|
+
usage: {
|
|
161
|
+
prompt_tokens: usage.prompt_tokens ?? 0,
|
|
162
|
+
completion_tokens: usage.completion_tokens ?? 0,
|
|
163
|
+
total_tokens: usage.total_tokens ?? 0,
|
|
164
|
+
},
|
|
165
|
+
model: model,
|
|
166
|
+
finish_reason: choice.finish_reason,
|
|
167
|
+
};
|
|
168
|
+
logger.debug(`OpenAI: ${usage.total_tokens ?? 0} tokens, $${calculateCost(model, usage.prompt_tokens ?? 0, usage.completion_tokens ?? 0).toFixed(6)}`);
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (axios.isAxiosError(error)) {
|
|
173
|
+
logger.error(`OpenAI API error: ${error.message}`);
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
async *stream(messages, options = {}) {
|
|
180
|
+
const model = options.model ?? this.defaultModel;
|
|
181
|
+
const formattedMessages = typeof messages === 'string'
|
|
182
|
+
? [{ role: 'user', content: messages }]
|
|
183
|
+
: messages;
|
|
184
|
+
const payload = this.preparePayload(model, formattedMessages, { ...options, stream: true });
|
|
185
|
+
const response = await this.client.post('/chat/completions', payload, {
|
|
186
|
+
responseType: 'stream',
|
|
187
|
+
});
|
|
188
|
+
for await (const chunk of response.data) {
|
|
189
|
+
const lines = chunk.toString().split('\n').filter((line) => line.trim() !== '');
|
|
190
|
+
for (const line of lines) {
|
|
191
|
+
if (line.startsWith('data: ')) {
|
|
192
|
+
const data = line.slice(6);
|
|
193
|
+
if (data === '[DONE]') {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const parsed = JSON.parse(data);
|
|
198
|
+
const delta = parsed.choices?.[0]?.delta?.content;
|
|
199
|
+
if (delta) {
|
|
200
|
+
yield {
|
|
201
|
+
delta,
|
|
202
|
+
finish_reason: parsed.choices[0]?.finish_reason,
|
|
203
|
+
index: parsed.choices[0]?.index,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Skip malformed JSON
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
close() {
|
|
215
|
+
logger.info('OpenAI client closed.');
|
|
216
|
+
}
|
|
217
|
+
// Alias for compatibility - async version calls the same implementation
|
|
218
|
+
async ainvoke(messages, options) {
|
|
219
|
+
return this.invoke(messages, options);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ============================================================================
|
|
223
|
+
// Factory Function
|
|
224
|
+
// ============================================================================
|
|
225
|
+
export function createOpenAI(apiKey, defaultModel) {
|
|
226
|
+
return new OpenAI(apiKey, defaultModel);
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrievers
|
|
3
|
+
*
|
|
4
|
+
* Base interfaces for document retrieval
|
|
5
|
+
*/
|
|
6
|
+
export interface BaseRetriever {
|
|
7
|
+
getRelevantDocuments(query: string): Promise<Document[]>;
|
|
8
|
+
}
|
|
9
|
+
export interface Document {
|
|
10
|
+
pageContent: string;
|
|
11
|
+
metadata: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface VectorStore {
|
|
14
|
+
similaritySearch(query: string, k?: number): Promise<Document[]>;
|
|
15
|
+
similaritySearchWithScore(query: string, k?: number): Promise<[Document, number][]>;
|
|
16
|
+
addDocuments(documents: Document[]): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Contextual Compression Retriever
|
|
20
|
+
*
|
|
21
|
+
* Compresses retrieved documents based on query context
|
|
22
|
+
*/
|
|
23
|
+
export declare class ContextualCompressionRetriever implements BaseRetriever {
|
|
24
|
+
private baseRetriever;
|
|
25
|
+
private compressor?;
|
|
26
|
+
constructor(options: {
|
|
27
|
+
baseRetriever: BaseRetriever;
|
|
28
|
+
compressor?: (doc: Document, query: string) => Promise<Document>;
|
|
29
|
+
});
|
|
30
|
+
getRelevantDocuments(query: string): Promise<Document[]>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parent Document Retriever
|
|
34
|
+
*
|
|
35
|
+
* Retrieves full parent documents from embedded chunks
|
|
36
|
+
*/
|
|
37
|
+
export declare class ParentDocumentRetriever implements BaseRetriever {
|
|
38
|
+
private childRetriever;
|
|
39
|
+
private idKey;
|
|
40
|
+
private parentDocuments;
|
|
41
|
+
constructor(options: {
|
|
42
|
+
childRetriever: BaseRetriever;
|
|
43
|
+
idKey?: string;
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Add parent documents
|
|
47
|
+
*/
|
|
48
|
+
addParentDocuments(documents: Document[]): void;
|
|
49
|
+
getRelevantDocuments(query: string): Promise<Document[]>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Ensemble Retriever
|
|
53
|
+
*
|
|
54
|
+
* Combines multiple retrievers with weighted scoring
|
|
55
|
+
*/
|
|
56
|
+
export declare class EnsembleRetriever implements BaseRetriever {
|
|
57
|
+
private retrievers;
|
|
58
|
+
constructor(retrievers: {
|
|
59
|
+
retriever: BaseRetriever;
|
|
60
|
+
weight: number;
|
|
61
|
+
}[]);
|
|
62
|
+
getRelevantDocuments(query: string): Promise<Document[]>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a vector store retriever
|
|
66
|
+
*/
|
|
67
|
+
export declare function createVectorStoreRetriever(vectorStore: VectorStore, options?: {
|
|
68
|
+
k?: number;
|
|
69
|
+
filter?: (doc: Document) => boolean;
|
|
70
|
+
}): BaseRetriever;
|
|
71
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retrievers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,aAAa;IAC5B,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACpF,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;;GAIG;AACH,qBAAa,8BAA+B,YAAW,aAAa;IAClE,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAC,CAAsD;gBAE7D,OAAO,EAAE;QACnB,aAAa,EAAE,aAAa,CAAC;QAC7B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;KAClE;IAKK,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAgB/D;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAoC;gBAE/C,OAAO,EAAE;QACnB,cAAc,EAAE,aAAa,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAKD;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI;IAOzC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAuB/D;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,UAAU,CAAiD;gBAEvD,UAAU,EAAE;QAAE,SAAS,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE;IAIhE,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAgC/D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE;IACP,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC;CAChC,GACL,aAAa,CAcf"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrievers
|
|
3
|
+
*
|
|
4
|
+
* Base interfaces for document retrieval
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Contextual Compression Retriever
|
|
9
|
+
*
|
|
10
|
+
* Compresses retrieved documents based on query context
|
|
11
|
+
*/
|
|
12
|
+
export class ContextualCompressionRetriever {
|
|
13
|
+
baseRetriever;
|
|
14
|
+
compressor;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.baseRetriever = options.baseRetriever;
|
|
17
|
+
this.compressor = options.compressor;
|
|
18
|
+
}
|
|
19
|
+
async getRelevantDocuments(query) {
|
|
20
|
+
const docs = await this.baseRetriever.getRelevantDocuments(query);
|
|
21
|
+
if (!this.compressor) {
|
|
22
|
+
return docs;
|
|
23
|
+
}
|
|
24
|
+
// Compress each document
|
|
25
|
+
const compressed = [];
|
|
26
|
+
for (const doc of docs) {
|
|
27
|
+
const compressedDoc = await this.compressor(doc, query);
|
|
28
|
+
compressed.push(compressedDoc);
|
|
29
|
+
}
|
|
30
|
+
return compressed;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parent Document Retriever
|
|
35
|
+
*
|
|
36
|
+
* Retrieves full parent documents from embedded chunks
|
|
37
|
+
*/
|
|
38
|
+
export class ParentDocumentRetriever {
|
|
39
|
+
childRetriever;
|
|
40
|
+
idKey;
|
|
41
|
+
parentDocuments = new Map();
|
|
42
|
+
constructor(options) {
|
|
43
|
+
this.childRetriever = options.childRetriever;
|
|
44
|
+
this.idKey = options.idKey || 'parent_id';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Add parent documents
|
|
48
|
+
*/
|
|
49
|
+
addParentDocuments(documents) {
|
|
50
|
+
for (const doc of documents) {
|
|
51
|
+
const id = doc.metadata[this.idKey] || crypto.randomUUID();
|
|
52
|
+
this.parentDocuments.set(id, doc);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async getRelevantDocuments(query) {
|
|
56
|
+
const childDocs = await this.childRetriever.getRelevantDocuments(query);
|
|
57
|
+
// Get unique parent IDs
|
|
58
|
+
const parentIds = new Set();
|
|
59
|
+
for (const doc of childDocs) {
|
|
60
|
+
const parentId = doc.metadata[this.idKey];
|
|
61
|
+
if (parentId) {
|
|
62
|
+
parentIds.add(parentId);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Return parent documents
|
|
66
|
+
const parents = [];
|
|
67
|
+
for (const id of parentIds) {
|
|
68
|
+
const parent = this.parentDocuments.get(id);
|
|
69
|
+
if (parent) {
|
|
70
|
+
parents.push(parent);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return parents.length > 0 ? parents : childDocs;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Ensemble Retriever
|
|
78
|
+
*
|
|
79
|
+
* Combines multiple retrievers with weighted scoring
|
|
80
|
+
*/
|
|
81
|
+
export class EnsembleRetriever {
|
|
82
|
+
retrievers;
|
|
83
|
+
constructor(retrievers) {
|
|
84
|
+
this.retrievers = retrievers;
|
|
85
|
+
}
|
|
86
|
+
async getRelevantDocuments(query) {
|
|
87
|
+
const allDocs = new Map();
|
|
88
|
+
// Fetch from all retrievers
|
|
89
|
+
for (const { retriever, weight } of this.retrievers) {
|
|
90
|
+
try {
|
|
91
|
+
const docs = await retriever.getRelevantDocuments(query);
|
|
92
|
+
for (let i = 0; i < docs.length; i++) {
|
|
93
|
+
const doc = docs[i];
|
|
94
|
+
const key = `${doc.pageContent.slice(0, 50)}`;
|
|
95
|
+
const score = weight * (docs.length - i) / docs.length;
|
|
96
|
+
if (allDocs.has(key)) {
|
|
97
|
+
allDocs.get(key).score += score;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
allDocs.set(key, { doc, score });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger.warn(`[EnsembleRetriever] Error from retriever: ${error}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Sort by score and return
|
|
109
|
+
const sorted = Array.from(allDocs.values())
|
|
110
|
+
.sort((a, b) => b.score - a.score)
|
|
111
|
+
.map(({ doc }) => doc);
|
|
112
|
+
return sorted;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a vector store retriever
|
|
117
|
+
*/
|
|
118
|
+
export function createVectorStoreRetriever(vectorStore, options = {}) {
|
|
119
|
+
const k = options.k || 4;
|
|
120
|
+
return {
|
|
121
|
+
async getRelevantDocuments(query) {
|
|
122
|
+
let docs = await vectorStore.similaritySearch(query, k);
|
|
123
|
+
if (options.filter) {
|
|
124
|
+
docs = docs.filter(options.filter);
|
|
125
|
+
}
|
|
126
|
+
return docs;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/retrievers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Router - Route prompts to fast or smart models based on complexity
|
|
3
|
+
*/
|
|
4
|
+
import { BaseChatModel } from '../core/types.js';
|
|
5
|
+
export interface RouterOptions {
|
|
6
|
+
fast: BaseChatModel;
|
|
7
|
+
smart: BaseChatModel;
|
|
8
|
+
threshold?: number;
|
|
9
|
+
classifierLLM?: BaseChatModel;
|
|
10
|
+
}
|
|
11
|
+
export declare class SmartRouter {
|
|
12
|
+
private fast;
|
|
13
|
+
private smart;
|
|
14
|
+
private threshold;
|
|
15
|
+
private classifierLLM?;
|
|
16
|
+
private fastCalls;
|
|
17
|
+
private smartCalls;
|
|
18
|
+
constructor(options: RouterOptions);
|
|
19
|
+
private classify;
|
|
20
|
+
invoke(prompt: string, options?: {
|
|
21
|
+
model?: string;
|
|
22
|
+
temperature?: number;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
content: string;
|
|
25
|
+
model: string;
|
|
26
|
+
}>;
|
|
27
|
+
ainvoke(prompt: string, options?: {
|
|
28
|
+
model?: string;
|
|
29
|
+
temperature?: number;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
content: string;
|
|
32
|
+
model: string;
|
|
33
|
+
}>;
|
|
34
|
+
printStats(): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=smartrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartrouter.d.ts","sourceRoot":"","sources":["../../src/router/smartrouter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAW,MAAM,kBAAkB,CAAC;AAqE1D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;gBAEX,OAAO,EAAE,aAAa;YASpB,QAAQ;IA4BhB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACrC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACtC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAI/C,UAAU,IAAI,IAAI;CAoBnB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Router - Route prompts to fast or smart models based on complexity
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Complexity Signals
|
|
7
|
+
// ============================================================================
|
|
8
|
+
const COMPLEX_SIGNALS = [
|
|
9
|
+
'explain', 'compare', 'analyze', 'design', 'implement', 'prove',
|
|
10
|
+
'write code', 'refactor', 'debug', 'architecture', 'difference between',
|
|
11
|
+
'step by step', 'tradeoffs', 'evaluate', 'research', 'synthesize',
|
|
12
|
+
'multi-step', 'complex', 'detailed', 'comprehensive', 'why does',
|
|
13
|
+
'algorithm', 'system', 'distributed', 'optimize', 'refactor',
|
|
14
|
+
];
|
|
15
|
+
const SIMPLE_SIGNALS = [
|
|
16
|
+
'what is', 'who is', 'when did', 'where is', 'define',
|
|
17
|
+
'list', 'how many', 'translate', 'convert', 'yes or no',
|
|
18
|
+
'true or false', 'capital', 'president', 'date of',
|
|
19
|
+
];
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Heuristic Complexity Calculation
|
|
22
|
+
// ============================================================================
|
|
23
|
+
function heuristicComplexity(prompt) {
|
|
24
|
+
const text = prompt.toLowerCase();
|
|
25
|
+
let score = 0.0;
|
|
26
|
+
// Word count factor
|
|
27
|
+
const wordCount = text.split(/\s+/).length;
|
|
28
|
+
if (wordCount > 100) {
|
|
29
|
+
score += 0.3;
|
|
30
|
+
}
|
|
31
|
+
else if (wordCount > 40) {
|
|
32
|
+
score += 0.15;
|
|
33
|
+
}
|
|
34
|
+
// Question count
|
|
35
|
+
const questionCount = (text.match(/\?/g) || []).length;
|
|
36
|
+
score += Math.min(questionCount * 0.1, 0.2);
|
|
37
|
+
// Complex signals
|
|
38
|
+
for (const signal of COMPLEX_SIGNALS) {
|
|
39
|
+
if (text.includes(signal)) {
|
|
40
|
+
score += 0.15;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Simple signals (reduce complexity)
|
|
45
|
+
for (const signal of SIMPLE_SIGNALS) {
|
|
46
|
+
if (text.includes(signal)) {
|
|
47
|
+
score -= 0.15;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Code detection
|
|
52
|
+
if (/```|def |function |class |import |const |let |var /.test(text)) {
|
|
53
|
+
score += 0.25;
|
|
54
|
+
}
|
|
55
|
+
return Math.max(0.0, Math.min(1.0, score));
|
|
56
|
+
}
|
|
57
|
+
export class SmartRouter {
|
|
58
|
+
fast;
|
|
59
|
+
smart;
|
|
60
|
+
threshold;
|
|
61
|
+
classifierLLM;
|
|
62
|
+
fastCalls = 0;
|
|
63
|
+
smartCalls = 0;
|
|
64
|
+
constructor(options) {
|
|
65
|
+
this.fast = options.fast;
|
|
66
|
+
this.smart = options.smart;
|
|
67
|
+
this.threshold = options.threshold ?? 0.5;
|
|
68
|
+
this.classifierLLM = options.classifierLLM;
|
|
69
|
+
logger.info(`SmartRouter ready. Threshold: ${this.threshold}. Classifier: ${this.classifierLLM ? 'LLM' : 'heuristic'}`);
|
|
70
|
+
}
|
|
71
|
+
async classify(prompt) {
|
|
72
|
+
if (!this.classifierLLM) {
|
|
73
|
+
return heuristicComplexity(prompt);
|
|
74
|
+
}
|
|
75
|
+
// Use LLM classifier
|
|
76
|
+
const classificationPrompt = `Rate the complexity of the following task on a scale of 0.0 to 1.0.
|
|
77
|
+
0.0 = trivial fact lookup. 1.0 = requires deep reasoning, code writing, or multi-step analysis.
|
|
78
|
+
Output ONLY a single decimal number, nothing else.
|
|
79
|
+
|
|
80
|
+
Task: ${prompt}`;
|
|
81
|
+
try {
|
|
82
|
+
const response = await this.classifierLLM.invoke([
|
|
83
|
+
{ role: 'user', content: classificationPrompt }
|
|
84
|
+
]);
|
|
85
|
+
const match = response.content.match(/[0-9]*\.?[0-9]+/);
|
|
86
|
+
if (match) {
|
|
87
|
+
return parseFloat(match[0]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
logger.warn(`SmartRouter classifier failed: ${error}. Using heuristic.`);
|
|
92
|
+
}
|
|
93
|
+
return heuristicComplexity(prompt);
|
|
94
|
+
}
|
|
95
|
+
async invoke(prompt, options) {
|
|
96
|
+
const score = await this.classify(prompt);
|
|
97
|
+
if (score >= this.threshold) {
|
|
98
|
+
logger.info(`[SmartRouter] Complexity=${score.toFixed(2)} → SMART model`);
|
|
99
|
+
this.smartCalls++;
|
|
100
|
+
const response = await this.smart.invoke([{ role: 'user', content: prompt }], options);
|
|
101
|
+
return { content: response.content, model: this.smart.defaultModel ?? 'smart' };
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
logger.info(`[SmartRouter] Complexity=${score.toFixed(2)} → FAST model`);
|
|
105
|
+
this.fastCalls++;
|
|
106
|
+
const response = await this.fast.invoke([{ role: 'user', content: prompt }], options);
|
|
107
|
+
return { content: response.content, model: this.fast.defaultModel ?? 'fast' };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async ainvoke(prompt, options) {
|
|
111
|
+
return this.invoke(prompt, options);
|
|
112
|
+
}
|
|
113
|
+
printStats() {
|
|
114
|
+
const total = this.fastCalls + this.smartCalls;
|
|
115
|
+
if (total === 0) {
|
|
116
|
+
console.log('No calls routed yet.');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const fastPct = (this.fastCalls / total * 100).toFixed(1);
|
|
120
|
+
const smartPct = (this.smartCalls / total * 100).toFixed(1);
|
|
121
|
+
console.log(`
|
|
122
|
+
${'='.repeat(50)}
|
|
123
|
+
Lazlo SmartRouter Stats
|
|
124
|
+
${'='.repeat(50)}
|
|
125
|
+
Total calls : ${total}
|
|
126
|
+
Fast model : ${this.fastCalls} (${fastPct}%)
|
|
127
|
+
Smart model : ${this.smartCalls} (${smartPct}%)
|
|
128
|
+
${'='.repeat(50)}
|
|
129
|
+
`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=smartrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartrouter.js","sourceRoot":"","sources":["../../src/router/smartrouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text Splitters - Split documents into chunks
|
|
3
|
+
*/
|
|
4
|
+
import { Document } from '../core/types.js';
|
|
5
|
+
export interface TextSplitterOptions {
|
|
6
|
+
separator?: string;
|
|
7
|
+
chunkSize?: number;
|
|
8
|
+
chunkOverlap?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class CharacterTextSplitter {
|
|
11
|
+
private separator;
|
|
12
|
+
private chunkSize;
|
|
13
|
+
private chunkOverlap;
|
|
14
|
+
constructor(options?: TextSplitterOptions);
|
|
15
|
+
splitText(text: string): string[];
|
|
16
|
+
splitDocuments(documents: Document[]): Document[];
|
|
17
|
+
}
|
|
18
|
+
export declare class RecursiveCharacterTextSplitter extends CharacterTextSplitter {
|
|
19
|
+
private separators;
|
|
20
|
+
constructor(options?: TextSplitterOptions & {
|
|
21
|
+
separators?: string[];
|
|
22
|
+
});
|
|
23
|
+
splitText(text: string): string[];
|
|
24
|
+
private forceSplit;
|
|
25
|
+
}
|
|
26
|
+
export declare function createCharacterSplitter(options?: TextSplitterOptions): CharacterTextSplitter;
|
|
27
|
+
export declare function createRecursiveSplitter(options?: TextSplitterOptions): RecursiveCharacterTextSplitter;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|