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.
Files changed (126) hide show
  1. package/.env.example +9 -0
  2. package/README.md +278 -0
  3. package/dist/cache/semantic.d.ts +39 -0
  4. package/dist/cache/semantic.d.ts.map +1 -0
  5. package/dist/cache/semantic.js +134 -0
  6. package/dist/cache/semantic.js.map +1 -0
  7. package/dist/chains/llmchain.d.ts +65 -0
  8. package/dist/chains/llmchain.d.ts.map +1 -0
  9. package/dist/chains/llmchain.js +137 -0
  10. package/dist/chains/llmchain.js.map +1 -0
  11. package/dist/chains/rag.d.ts +23 -0
  12. package/dist/chains/rag.d.ts.map +1 -0
  13. package/dist/chains/rag.js +47 -0
  14. package/dist/chains/rag.js.map +1 -0
  15. package/dist/core/types.d.ts +130 -0
  16. package/dist/core/types.d.ts.map +1 -0
  17. package/dist/core/types.js +8 -0
  18. package/dist/core/types.js.map +1 -0
  19. package/dist/document_loaders/index.d.ts +61 -0
  20. package/dist/document_loaders/index.d.ts.map +1 -0
  21. package/dist/document_loaders/index.js +183 -0
  22. package/dist/document_loaders/index.js.map +1 -0
  23. package/dist/embeddings/google.d.ts +43 -0
  24. package/dist/embeddings/google.d.ts.map +1 -0
  25. package/dist/embeddings/google.js +90 -0
  26. package/dist/embeddings/google.js.map +1 -0
  27. package/dist/embeddings/local.d.ts +64 -0
  28. package/dist/embeddings/local.d.ts.map +1 -0
  29. package/dist/embeddings/local.js +95 -0
  30. package/dist/embeddings/local.js.map +1 -0
  31. package/dist/evals/judge.d.ts +22 -0
  32. package/dist/evals/judge.d.ts.map +1 -0
  33. package/dist/evals/judge.js +77 -0
  34. package/dist/evals/judge.js.map +1 -0
  35. package/dist/index.d.ts +28 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +84 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/memory/buffer.d.ts +64 -0
  40. package/dist/memory/buffer.d.ts.map +1 -0
  41. package/dist/memory/buffer.js +168 -0
  42. package/dist/memory/buffer.js.map +1 -0
  43. package/dist/parsers/output.d.ts +64 -0
  44. package/dist/parsers/output.d.ts.map +1 -0
  45. package/dist/parsers/output.js +148 -0
  46. package/dist/parsers/output.js.map +1 -0
  47. package/dist/prompts/registry.d.ts +65 -0
  48. package/dist/prompts/registry.d.ts.map +1 -0
  49. package/dist/prompts/registry.js +170 -0
  50. package/dist/prompts/registry.js.map +1 -0
  51. package/dist/providers/ollama.d.ts +30 -0
  52. package/dist/providers/ollama.d.ts.map +1 -0
  53. package/dist/providers/ollama.js +104 -0
  54. package/dist/providers/ollama.js.map +1 -0
  55. package/dist/providers/openai.d.ts +46 -0
  56. package/dist/providers/openai.d.ts.map +1 -0
  57. package/dist/providers/openai.js +228 -0
  58. package/dist/providers/openai.js.map +1 -0
  59. package/dist/retrievers/index.d.ts +71 -0
  60. package/dist/retrievers/index.d.ts.map +1 -0
  61. package/dist/retrievers/index.js +130 -0
  62. package/dist/retrievers/index.js.map +1 -0
  63. package/dist/router/smartrouter.d.ts +36 -0
  64. package/dist/router/smartrouter.d.ts.map +1 -0
  65. package/dist/router/smartrouter.js +132 -0
  66. package/dist/router/smartrouter.js.map +1 -0
  67. package/dist/text_splitters/index.d.ts +28 -0
  68. package/dist/text_splitters/index.d.ts.map +1 -0
  69. package/dist/text_splitters/index.js +109 -0
  70. package/dist/text_splitters/index.js.map +1 -0
  71. package/dist/tools/decorator.d.ts +26 -0
  72. package/dist/tools/decorator.d.ts.map +1 -0
  73. package/dist/tools/decorator.js +102 -0
  74. package/dist/tools/decorator.js.map +1 -0
  75. package/dist/tools/index.d.ts +7 -0
  76. package/dist/tools/index.d.ts.map +1 -0
  77. package/dist/tools/index.js +6 -0
  78. package/dist/tools/index.js.map +1 -0
  79. package/dist/tools/keiro.d.ts +20 -0
  80. package/dist/tools/keiro.d.ts.map +1 -0
  81. package/dist/tools/keiro.js +67 -0
  82. package/dist/tools/keiro.js.map +1 -0
  83. package/dist/tracing/tracer.d.ts +56 -0
  84. package/dist/tracing/tracer.d.ts.map +1 -0
  85. package/dist/tracing/tracer.js +125 -0
  86. package/dist/tracing/tracer.js.map +1 -0
  87. package/dist/utils/logger.d.ts +25 -0
  88. package/dist/utils/logger.d.ts.map +1 -0
  89. package/dist/utils/logger.js +50 -0
  90. package/dist/utils/logger.js.map +1 -0
  91. package/dist/utils/pricing.d.ts +31 -0
  92. package/dist/utils/pricing.d.ts.map +1 -0
  93. package/dist/utils/pricing.js +108 -0
  94. package/dist/utils/pricing.js.map +1 -0
  95. package/dist/vectorstores/index.d.ts +62 -0
  96. package/dist/vectorstores/index.d.ts.map +1 -0
  97. package/dist/vectorstores/index.js +244 -0
  98. package/dist/vectorstores/index.js.map +1 -0
  99. package/package.json +48 -0
  100. package/src/cache/semantic.ts +175 -0
  101. package/src/chains/llmchain.ts +194 -0
  102. package/src/chains/rag.ts +65 -0
  103. package/src/core/types.ts +178 -0
  104. package/src/document_loaders/index.ts +223 -0
  105. package/src/embeddings/google.ts +119 -0
  106. package/src/embeddings/local.ts +118 -0
  107. package/src/evals/judge.ts +99 -0
  108. package/src/index.ts +121 -0
  109. package/src/memory/buffer.ts +222 -0
  110. package/src/parsers/output.ts +195 -0
  111. package/src/prompts/registry.ts +205 -0
  112. package/src/providers/ollama.ts +151 -0
  113. package/src/providers/openai.ts +320 -0
  114. package/src/retrievers/index.ts +182 -0
  115. package/src/router/smartrouter.ts +172 -0
  116. package/src/text_splitters/index.ts +145 -0
  117. package/src/tools/decorator.ts +145 -0
  118. package/src/tools/index.ts +7 -0
  119. package/src/tools/keiro.ts +92 -0
  120. package/src/tracing/tracer.ts +178 -0
  121. package/src/utils/logger.ts +62 -0
  122. package/src/utils/pricing.ts +133 -0
  123. package/src/vectorstores/index.ts +338 -0
  124. package/test-full.mjs +552 -0
  125. package/test.mjs +74 -0
  126. 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