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,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Embeddings
|
|
3
|
+
*
|
|
4
|
+
* Zero-cost, completely offline embedding generation
|
|
5
|
+
* Uses a simple hash-based approach for demonstration
|
|
6
|
+
* For production, use transformers.js or ONNX runtime
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Local Embeddings
|
|
10
|
+
*
|
|
11
|
+
* Generates embeddings locally without API calls.
|
|
12
|
+
* Uses a deterministic hash-based approach for consistent results.
|
|
13
|
+
* For production use, integrate with transformers.js or ONNX runtime.
|
|
14
|
+
*/
|
|
15
|
+
export declare class LocalEmbeddings {
|
|
16
|
+
readonly dimensions: number;
|
|
17
|
+
private modelName;
|
|
18
|
+
constructor(options?: {
|
|
19
|
+
dimensions?: number;
|
|
20
|
+
modelName?: string;
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Generate embedding using a simple hash-based approach
|
|
24
|
+
* This is NOT suitable for production semantic search
|
|
25
|
+
* but provides consistent results for testing
|
|
26
|
+
*/
|
|
27
|
+
private generateHashEmbedding;
|
|
28
|
+
/**
|
|
29
|
+
* Embed a single text
|
|
30
|
+
*/
|
|
31
|
+
embedQuery(text: string): Promise<number[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Embed multiple texts
|
|
34
|
+
*/
|
|
35
|
+
embedDocuments(texts: string[]): Promise<number[][]>;
|
|
36
|
+
/**
|
|
37
|
+
* Batch embed
|
|
38
|
+
*/
|
|
39
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Factory function
|
|
43
|
+
*/
|
|
44
|
+
export declare function createLocalEmbeddings(options?: {
|
|
45
|
+
dimensions?: number;
|
|
46
|
+
modelName?: string;
|
|
47
|
+
}): LocalEmbeddings;
|
|
48
|
+
/**
|
|
49
|
+
* Mock HuggingFace Embeddings (for compatibility)
|
|
50
|
+
* In production, use @xenova/transformers
|
|
51
|
+
*/
|
|
52
|
+
export declare class HuggingFaceEmbeddings {
|
|
53
|
+
readonly model: string;
|
|
54
|
+
readonly device: string;
|
|
55
|
+
readonly normalize: boolean;
|
|
56
|
+
constructor(options?: {
|
|
57
|
+
model?: string;
|
|
58
|
+
device?: string;
|
|
59
|
+
normalize?: boolean;
|
|
60
|
+
});
|
|
61
|
+
embedQuery(text: string): Promise<number[]>;
|
|
62
|
+
embedDocuments(texts: string[]): Promise<number[][]>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAMrE;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIjD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAI1D;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAGlD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,eAAe,CAElB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,GAAE;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;KAChB;IAQA,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK3C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAG3D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Embeddings
|
|
3
|
+
*
|
|
4
|
+
* Zero-cost, completely offline embedding generation
|
|
5
|
+
* Uses a simple hash-based approach for demonstration
|
|
6
|
+
* For production, use transformers.js or ONNX runtime
|
|
7
|
+
*/
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Local Embeddings
|
|
11
|
+
*
|
|
12
|
+
* Generates embeddings locally without API calls.
|
|
13
|
+
* Uses a deterministic hash-based approach for consistent results.
|
|
14
|
+
* For production use, integrate with transformers.js or ONNX runtime.
|
|
15
|
+
*/
|
|
16
|
+
export class LocalEmbeddings {
|
|
17
|
+
dimensions;
|
|
18
|
+
modelName;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.dimensions = options.dimensions || 384;
|
|
21
|
+
this.modelName = options.modelName || 'local-hash';
|
|
22
|
+
logger.info(`[LocalEmbeddings] Initialized with ${this.dimensions} dimensions`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate embedding using a simple hash-based approach
|
|
26
|
+
* This is NOT suitable for production semantic search
|
|
27
|
+
* but provides consistent results for testing
|
|
28
|
+
*/
|
|
29
|
+
generateHashEmbedding(text) {
|
|
30
|
+
const embedding = new Array(this.dimensions).fill(0);
|
|
31
|
+
// Simple hash to generate consistent embedding
|
|
32
|
+
for (let i = 0; i < text.length; i++) {
|
|
33
|
+
const char = text.charCodeAt(i);
|
|
34
|
+
const idx1 = i % this.dimensions;
|
|
35
|
+
const idx2 = (i * 31 + char) % this.dimensions;
|
|
36
|
+
embedding[idx1] += char / text.length;
|
|
37
|
+
embedding[idx2] += char / text.length;
|
|
38
|
+
}
|
|
39
|
+
// Normalize
|
|
40
|
+
const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
|
|
41
|
+
if (magnitude > 0) {
|
|
42
|
+
for (let i = 0; i < embedding.length; i++) {
|
|
43
|
+
embedding[i] /= magnitude;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return embedding;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Embed a single text
|
|
50
|
+
*/
|
|
51
|
+
async embedQuery(text) {
|
|
52
|
+
return this.generateHashEmbedding(text);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Embed multiple texts
|
|
56
|
+
*/
|
|
57
|
+
async embedDocuments(texts) {
|
|
58
|
+
return texts.map(text => this.generateHashEmbedding(text));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Batch embed
|
|
62
|
+
*/
|
|
63
|
+
async embed(texts) {
|
|
64
|
+
return this.embedDocuments(texts);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Factory function
|
|
69
|
+
*/
|
|
70
|
+
export function createLocalEmbeddings(options) {
|
|
71
|
+
return new LocalEmbeddings(options);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Mock HuggingFace Embeddings (for compatibility)
|
|
75
|
+
* In production, use @xenova/transformers
|
|
76
|
+
*/
|
|
77
|
+
export class HuggingFaceEmbeddings {
|
|
78
|
+
model;
|
|
79
|
+
device;
|
|
80
|
+
normalize;
|
|
81
|
+
constructor(options = {}) {
|
|
82
|
+
this.model = options.model || 'sentence-transformers/all-MiniLM-L6-v2';
|
|
83
|
+
this.device = options.device || 'cpu';
|
|
84
|
+
this.normalize = options.normalize !== false;
|
|
85
|
+
logger.info(`[HuggingFaceEmbeddings] Initialized (mock). For real embeddings, install @xenova/transformers`);
|
|
86
|
+
}
|
|
87
|
+
async embedQuery(text) {
|
|
88
|
+
// Mock implementation
|
|
89
|
+
return new LocalEmbeddings().embedQuery(text);
|
|
90
|
+
}
|
|
91
|
+
async embedDocuments(texts) {
|
|
92
|
+
return new LocalEmbeddings().embedDocuments(texts);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMJudge - Evaluate LLM responses
|
|
3
|
+
*/
|
|
4
|
+
import { BaseChatModel } from '../core/types.js';
|
|
5
|
+
export declare enum EvalCriteria {
|
|
6
|
+
FAITHFULNESS = "faithfulness",
|
|
7
|
+
RELEVANCE = "relevance",
|
|
8
|
+
TOXICITY = "toxicity",
|
|
9
|
+
COHERENCE = "coherence",
|
|
10
|
+
ACCURACY = "accuracy"
|
|
11
|
+
}
|
|
12
|
+
export interface EvalResult {
|
|
13
|
+
score: number;
|
|
14
|
+
explanation: string;
|
|
15
|
+
passed: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class LLMJudge {
|
|
18
|
+
private judgeLLM;
|
|
19
|
+
constructor(judgeLLM: BaseChatModel);
|
|
20
|
+
evaluate(question: string, response: string, criteria: EvalCriteria, context?: string): Promise<EvalResult>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/evals/judge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAW,MAAM,kBAAkB,CAAC;AAO1D,oBAAY,YAAY;IACtB,YAAY,iBAAiB;IAC7B,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,QAAQ,aAAa;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AA0BD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,EAAE,aAAa;IAK7B,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,MAAW,GACnB,OAAO,CAAC,UAAU,CAAC;CAoCvB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMJudge - Evaluate LLM responses
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Evaluation Criteria
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export var EvalCriteria;
|
|
9
|
+
(function (EvalCriteria) {
|
|
10
|
+
EvalCriteria["FAITHFULNESS"] = "faithfulness";
|
|
11
|
+
EvalCriteria["RELEVANCE"] = "relevance";
|
|
12
|
+
EvalCriteria["TOXICITY"] = "toxicity";
|
|
13
|
+
EvalCriteria["COHERENCE"] = "coherence";
|
|
14
|
+
EvalCriteria["ACCURACY"] = "accuracy";
|
|
15
|
+
})(EvalCriteria || (EvalCriteria = {}));
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// LLM Judge
|
|
18
|
+
// ============================================================================
|
|
19
|
+
const EVAL_PROMPT = `You are an impartial, strict evaluator. Your job is to grade the Assistant's response
|
|
20
|
+
based on the following criteria: {criteria}.
|
|
21
|
+
|
|
22
|
+
Question asked by User:
|
|
23
|
+
"{question}"
|
|
24
|
+
|
|
25
|
+
Context provided to Assistant (if any):
|
|
26
|
+
"{context}"
|
|
27
|
+
|
|
28
|
+
Assistant's Response:
|
|
29
|
+
"{response}"
|
|
30
|
+
|
|
31
|
+
Evaluate the response. Output strictly in the following JSON schema:
|
|
32
|
+
{{
|
|
33
|
+
"score": <int from 1 to 10>,
|
|
34
|
+
"explanation": "<brief reason for the score>",
|
|
35
|
+
"passed": <boolean true if score >= 7 else false>
|
|
36
|
+
}}
|
|
37
|
+
`;
|
|
38
|
+
export class LLMJudge {
|
|
39
|
+
judgeLLM;
|
|
40
|
+
constructor(judgeLLM) {
|
|
41
|
+
this.judgeLLM = judgeLLM;
|
|
42
|
+
logger.info('LLMJudge ready. Ready to evaluate responses.');
|
|
43
|
+
}
|
|
44
|
+
async evaluate(question, response, criteria, context = '') {
|
|
45
|
+
const prompt = EVAL_PROMPT
|
|
46
|
+
.replace('{criteria}', criteria)
|
|
47
|
+
.replace('{question}', question)
|
|
48
|
+
.replace('{context}', context)
|
|
49
|
+
.replace('{response}', response);
|
|
50
|
+
const messages = [
|
|
51
|
+
{ role: 'system', content: 'You are a JSON grading API.' },
|
|
52
|
+
{ role: 'user', content: prompt },
|
|
53
|
+
];
|
|
54
|
+
try {
|
|
55
|
+
const result = await this.judgeLLM.invoke(messages, {
|
|
56
|
+
responseFormat: { type: 'json_object' }
|
|
57
|
+
});
|
|
58
|
+
const content = result.content.trim();
|
|
59
|
+
const parsed = JSON.parse(content);
|
|
60
|
+
logger.debug(`[Judge] Score: ${parsed.score}/10 - Passed: ${parsed.passed}`);
|
|
61
|
+
return {
|
|
62
|
+
score: parsed.score ?? 0,
|
|
63
|
+
explanation: parsed.explanation ?? '',
|
|
64
|
+
passed: parsed.passed ?? false,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger.error(`Evaluation failed: ${error}`);
|
|
69
|
+
return {
|
|
70
|
+
score: 0,
|
|
71
|
+
explanation: String(error),
|
|
72
|
+
passed: false,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/evals/judge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,CAAN,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,6CAA6B,CAAA;IAC7B,uCAAuB,CAAA;IACvB,qCAAqB,CAAA;IACrB,uCAAuB,CAAA;IACvB,qCAAqB,CAAA;AACvB,CAAC,EANW,YAAY,KAAZ,YAAY,QAMvB;AAQD,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;CAkBnB,CAAC;AAEF,MAAM,OAAO,QAAQ;IACX,QAAQ,CAAgB;IAEhC,YAAY,QAAuB;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,QAAgB,EAChB,QAAsB,EACtB,UAAkB,EAAE;QAEpB,MAAM,MAAM,GAAG,WAAW;aACvB,OAAO,CAAC,YAAY,EAAE,QAAkB,CAAC;aACzC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;aAC/B,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;aAC7B,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAc;YAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,6BAA6B,EAAE;YAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;SAClC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAClD,cAAc,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;aACxC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,MAAM,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAE7E,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;gBACxB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;gBACrC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO;gBACL,KAAK,EAAE,CAAC;gBACR,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC;gBAC1B,MAAM,EAAE,KAAK;aACd,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazlo - The Anti-Framework for JavaScript/TypeScript
|
|
3
|
+
*
|
|
4
|
+
* A production-grade AI framework that prioritizes performance, transparency, and simplicity.
|
|
5
|
+
*/
|
|
6
|
+
export * from './core/types.js';
|
|
7
|
+
export { OpenAI, createOpenAI } from './providers/openai.js';
|
|
8
|
+
export { Ollama, createOllama } from './providers/ollama.js';
|
|
9
|
+
export { LLMChain, SequentialChain, PromptTemplate } from './chains/llmchain.js';
|
|
10
|
+
export { RetrievalQAChain, createRetrievalChain } from './chains/rag.js';
|
|
11
|
+
export { SmartRouter } from './router/smartrouter.js';
|
|
12
|
+
export { SemanticCache } from './cache/semantic.js';
|
|
13
|
+
export { BufferMemory, TokenBudgetMemory } from './memory/buffer.js';
|
|
14
|
+
export { Tool, tool, createToolDecorator, defineTool, calculator, search, weather, KeiroSearch } from './tools/index.js';
|
|
15
|
+
export { tracer, Tracer } from './tracing/tracer.js';
|
|
16
|
+
export { LLMJudge, EvalCriteria } from './evals/judge.js';
|
|
17
|
+
export { CharacterTextSplitter, RecursiveCharacterTextSplitter, createCharacterSplitter, createRecursiveSplitter } from './text_splitters/index.js';
|
|
18
|
+
export { InMemoryVectorStore, ChromaVectorStore, SQLiteVectorStore, createVectorStore, createChromaVectorStore, createSQLiteVectorStore } from './vectorstores/index.js';
|
|
19
|
+
export { TextLoader, CSVLoader, JSONLoader, loadDocument, loadDocuments } from './document_loaders/index.js';
|
|
20
|
+
export { GoogleEmbeddings, createGoogleEmbeddings } from './embeddings/google.js';
|
|
21
|
+
export { LocalEmbeddings, HuggingFaceEmbeddings, createLocalEmbeddings } from './embeddings/local.js';
|
|
22
|
+
export { JSONOutputParser, XMLOutputParser, CommaSeparatedListParser, MarkdownCodeBlockParser, ToolCallParser, createJSONParser, createXMLParser, createListParser, createMarkdownParser } from './parsers/output.js';
|
|
23
|
+
export { PromptRegistry, SimplePromptTemplate, createPromptRegistry } from './prompts/registry.js';
|
|
24
|
+
export { ContextualCompressionRetriever, ParentDocumentRetriever, EnsembleRetriever, createVectorStoreRetriever } from './retrievers/index.js';
|
|
25
|
+
export type { BaseRetriever } from './retrievers/index.js';
|
|
26
|
+
export { logger } from './utils/logger.js';
|
|
27
|
+
export { getPricing, setPricing, calculateCost, estimateCost, estimateTokens } from './utils/pricing.js';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,cAAc,iBAAiB,CAAC;AAMhC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAM7D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMzE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMpD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAMrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMzH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMrD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAM1D,OAAO,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAMpJ,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAMzK,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAM7G,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAMtG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAMtN,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAMnG,OAAO,EAAE,8BAA8B,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAC/I,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAM3D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazlo - The Anti-Framework for JavaScript/TypeScript
|
|
3
|
+
*
|
|
4
|
+
* A production-grade AI framework that prioritizes performance, transparency, and simplicity.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Core Types
|
|
8
|
+
// ============================================================================
|
|
9
|
+
export * from './core/types.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Providers
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export { OpenAI, createOpenAI } from './providers/openai.js';
|
|
14
|
+
export { Ollama, createOllama } from './providers/ollama.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Chains
|
|
17
|
+
// ============================================================================
|
|
18
|
+
export { LLMChain, SequentialChain, PromptTemplate } from './chains/llmchain.js';
|
|
19
|
+
export { RetrievalQAChain, createRetrievalChain } from './chains/rag.js';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Router
|
|
22
|
+
// ============================================================================
|
|
23
|
+
export { SmartRouter } from './router/smartrouter.js';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Cache
|
|
26
|
+
// ============================================================================
|
|
27
|
+
export { SemanticCache } from './cache/semantic.js';
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Memory
|
|
30
|
+
// ============================================================================
|
|
31
|
+
export { BufferMemory, TokenBudgetMemory } from './memory/buffer.js';
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Tools
|
|
34
|
+
// ============================================================================
|
|
35
|
+
export { Tool, tool, createToolDecorator, defineTool, calculator, search, weather, KeiroSearch } from './tools/index.js';
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Tracing
|
|
38
|
+
// ============================================================================
|
|
39
|
+
export { tracer, Tracer } from './tracing/tracer.js';
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Evals
|
|
42
|
+
// ============================================================================
|
|
43
|
+
export { LLMJudge, EvalCriteria } from './evals/judge.js';
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Text Splitters
|
|
46
|
+
// ============================================================================
|
|
47
|
+
export { CharacterTextSplitter, RecursiveCharacterTextSplitter, createCharacterSplitter, createRecursiveSplitter } from './text_splitters/index.js';
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Vector Stores
|
|
50
|
+
// ============================================================================
|
|
51
|
+
export { InMemoryVectorStore, ChromaVectorStore, SQLiteVectorStore, createVectorStore, createChromaVectorStore, createSQLiteVectorStore } from './vectorstores/index.js';
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Document Loaders
|
|
54
|
+
// ============================================================================
|
|
55
|
+
export { TextLoader, CSVLoader, JSONLoader, loadDocument, loadDocuments } from './document_loaders/index.js';
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Embeddings
|
|
58
|
+
// ============================================================================
|
|
59
|
+
export { GoogleEmbeddings, createGoogleEmbeddings } from './embeddings/google.js';
|
|
60
|
+
export { LocalEmbeddings, HuggingFaceEmbeddings, createLocalEmbeddings } from './embeddings/local.js';
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Output Parsers
|
|
63
|
+
// ============================================================================
|
|
64
|
+
export { JSONOutputParser, XMLOutputParser, CommaSeparatedListParser, MarkdownCodeBlockParser, ToolCallParser, createJSONParser, createXMLParser, createListParser, createMarkdownParser } from './parsers/output.js';
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Prompt Registry
|
|
67
|
+
// ============================================================================
|
|
68
|
+
export { PromptRegistry, SimplePromptTemplate, createPromptRegistry } from './prompts/registry.js';
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Retrievers
|
|
71
|
+
// ============================================================================
|
|
72
|
+
export { ContextualCompressionRetriever, ParentDocumentRetriever, EnsembleRetriever, createVectorStoreRetriever } from './retrievers/index.js';
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Utils
|
|
75
|
+
// ============================================================================
|
|
76
|
+
export { logger } from './utils/logger.js';
|
|
77
|
+
export { getPricing, setPricing, calculateCost, estimateCost, estimateTokens } from './utils/pricing.js';
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Initialize
|
|
80
|
+
// ============================================================================
|
|
81
|
+
import { loadEnvPricing } from './utils/pricing.js';
|
|
82
|
+
loadEnvPricing();
|
|
83
|
+
console.log('⚡ Lazlo JS loaded. The Anti-Framework.');
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffer Memory - Simple conversation history
|
|
3
|
+
*/
|
|
4
|
+
import { Message } from '../core/types.js';
|
|
5
|
+
export interface BufferMemoryOptions {
|
|
6
|
+
memoryKey?: string;
|
|
7
|
+
returnMessages?: boolean;
|
|
8
|
+
maxTokenLimit?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class BufferMemory {
|
|
11
|
+
private messages;
|
|
12
|
+
private memoryKey;
|
|
13
|
+
private returnMessages;
|
|
14
|
+
private maxTokenLimit?;
|
|
15
|
+
constructor(options?: BufferMemoryOptions);
|
|
16
|
+
/**
|
|
17
|
+
* Estimate tokens (rough approximation)
|
|
18
|
+
*/
|
|
19
|
+
private estimateTokens;
|
|
20
|
+
/**
|
|
21
|
+
* Load memory variables for the chain
|
|
22
|
+
*/
|
|
23
|
+
loadMemoryVariables(_inputs?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
24
|
+
/**
|
|
25
|
+
* Save context to memory
|
|
26
|
+
*/
|
|
27
|
+
saveContext(inputs: Record<string, unknown>, outputs: Record<string, string>): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Clear memory
|
|
30
|
+
*/
|
|
31
|
+
clear(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get messages
|
|
34
|
+
*/
|
|
35
|
+
getMessages(): Message[];
|
|
36
|
+
}
|
|
37
|
+
export interface TokenBudgetMemoryOptions {
|
|
38
|
+
summarizerLLM?: any;
|
|
39
|
+
maxTokens?: number;
|
|
40
|
+
summarizeThreshold?: number;
|
|
41
|
+
memoryKey?: string;
|
|
42
|
+
returnMessages?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare class TokenBudgetMemory {
|
|
45
|
+
private messages;
|
|
46
|
+
private summarizerLLM?;
|
|
47
|
+
private maxTokens;
|
|
48
|
+
private summarizeThreshold;
|
|
49
|
+
private memoryKey;
|
|
50
|
+
private returnMessages;
|
|
51
|
+
private summaryPrefix;
|
|
52
|
+
constructor(options?: TokenBudgetMemoryOptions);
|
|
53
|
+
private estimateTokens;
|
|
54
|
+
private compress;
|
|
55
|
+
loadMemoryVariables(_inputs?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
56
|
+
saveContext(inputs: Record<string, unknown>, outputs: Record<string, string>): Promise<void>;
|
|
57
|
+
clear(): Promise<void>;
|
|
58
|
+
get tokenUsage(): {
|
|
59
|
+
estimatedTokens: number;
|
|
60
|
+
budget: number;
|
|
61
|
+
messageCount: number;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/memory/buffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM3C,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,OAAO,GAAE,mBAAwB;IAM7C;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACG,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiClG;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAalG;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACH,WAAW,IAAI,OAAO,EAAE;CAGzB;AAMD,MAAM,WAAW,wBAAwB;IACvC,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AASD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,aAAa,CAAC,CAAM;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,aAAa,CAAM;gBAEf,OAAO,GAAE,wBAA6B;IAQlD,OAAO,CAAC,cAAc;YAQR,QAAQ;IAwBhB,mBAAmB,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA2B5F,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,IAAI,UAAU,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAMlF;CACF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Buffer Memory - Simple conversation history
|
|
3
|
+
*/
|
|
4
|
+
export class BufferMemory {
|
|
5
|
+
messages = [];
|
|
6
|
+
memoryKey;
|
|
7
|
+
returnMessages;
|
|
8
|
+
maxTokenLimit;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.memoryKey = options.memoryKey ?? 'history';
|
|
11
|
+
this.returnMessages = options.returnMessages ?? false;
|
|
12
|
+
this.maxTokenLimit = options.maxTokenLimit;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Estimate tokens (rough approximation)
|
|
16
|
+
*/
|
|
17
|
+
estimateTokens(text) {
|
|
18
|
+
return Math.ceil(text.length / 4);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Load memory variables for the chain
|
|
22
|
+
*/
|
|
23
|
+
async loadMemoryVariables(_inputs = {}) {
|
|
24
|
+
// Trim if over token limit
|
|
25
|
+
if (this.maxTokenLimit) {
|
|
26
|
+
let tokenCount = 0;
|
|
27
|
+
const trimmedMessages = [];
|
|
28
|
+
for (let i = this.messages.length - 1; i >= 0; i--) {
|
|
29
|
+
const msg = this.messages[i];
|
|
30
|
+
const msgTokens = this.estimateTokens(msg.content);
|
|
31
|
+
if (tokenCount + msgTokens <= this.maxTokenLimit) {
|
|
32
|
+
trimmedMessages.unshift(msg);
|
|
33
|
+
tokenCount += msgTokens;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
this.messages = trimmedMessages;
|
|
40
|
+
}
|
|
41
|
+
if (this.returnMessages) {
|
|
42
|
+
return { [this.memoryKey]: [...this.messages] };
|
|
43
|
+
}
|
|
44
|
+
// Return as formatted string
|
|
45
|
+
const history = this.messages
|
|
46
|
+
.map(m => `${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`)
|
|
47
|
+
.join('\n');
|
|
48
|
+
return { [this.memoryKey]: history };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Save context to memory
|
|
52
|
+
*/
|
|
53
|
+
async saveContext(inputs, outputs) {
|
|
54
|
+
// Extract input and output content
|
|
55
|
+
const inputContent = Object.values(inputs)[0]?.toString() ?? '';
|
|
56
|
+
const outputContent = Object.values(outputs)[0]?.toString() ?? '';
|
|
57
|
+
if (inputContent) {
|
|
58
|
+
this.messages.push({ role: 'user', content: inputContent });
|
|
59
|
+
}
|
|
60
|
+
if (outputContent) {
|
|
61
|
+
this.messages.push({ role: 'assistant', content: outputContent });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Clear memory
|
|
66
|
+
*/
|
|
67
|
+
async clear() {
|
|
68
|
+
this.messages = [];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get messages
|
|
72
|
+
*/
|
|
73
|
+
getMessages() {
|
|
74
|
+
return [...this.messages];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const SUMMARIZE_PROMPT = `Summarize the following conversation history into 2-3 concise sentences. Preserve key facts, decisions, and context. Be extremely terse.
|
|
78
|
+
|
|
79
|
+
Conversation:
|
|
80
|
+
{history}
|
|
81
|
+
|
|
82
|
+
Summary:`;
|
|
83
|
+
export class TokenBudgetMemory {
|
|
84
|
+
messages = [];
|
|
85
|
+
summarizerLLM;
|
|
86
|
+
maxTokens;
|
|
87
|
+
summarizeThreshold;
|
|
88
|
+
memoryKey;
|
|
89
|
+
returnMessages;
|
|
90
|
+
summaryPrefix = '';
|
|
91
|
+
constructor(options = {}) {
|
|
92
|
+
this.summarizerLLM = options.summarizerLLM;
|
|
93
|
+
this.maxTokens = options.maxTokens ?? 4000;
|
|
94
|
+
this.summarizeThreshold = options.summarizeThreshold ?? 0.8;
|
|
95
|
+
this.memoryKey = options.memoryKey ?? 'history';
|
|
96
|
+
this.returnMessages = options.returnMessages ?? false;
|
|
97
|
+
}
|
|
98
|
+
estimateTokens() {
|
|
99
|
+
let text = this.messages.map(m => m.content).join('\n');
|
|
100
|
+
if (this.summaryPrefix) {
|
|
101
|
+
text += '\n' + this.summaryPrefix;
|
|
102
|
+
}
|
|
103
|
+
return Math.ceil(text.length / 4);
|
|
104
|
+
}
|
|
105
|
+
async compress() {
|
|
106
|
+
if (!this.messages.length || !this.summarizerLLM)
|
|
107
|
+
return;
|
|
108
|
+
// Keep the second half of messages
|
|
109
|
+
const half = Math.floor(this.messages.length / 2);
|
|
110
|
+
const oldMessages = this.messages.slice(0, half);
|
|
111
|
+
this.messages = this.messages.slice(half);
|
|
112
|
+
const historyStr = oldMessages
|
|
113
|
+
.map(m => `${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`)
|
|
114
|
+
.join('\n');
|
|
115
|
+
const prompt = SUMMARIZE_PROMPT.replace('{history}', this.summaryPrefix ? `Previous summary: ${this.summaryPrefix}\n\n${historyStr}` : historyStr);
|
|
116
|
+
try {
|
|
117
|
+
const response = await this.summarizerLLM.invoke(prompt);
|
|
118
|
+
this.summaryPrefix = typeof response === 'string' ? response : response.content ?? '';
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('[TokenBudgetMemory] Compression failed:', error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async loadMemoryVariables(_inputs = {}) {
|
|
125
|
+
const tokensUsed = this.estimateTokens();
|
|
126
|
+
if (tokensUsed >= this.maxTokens * this.summarizeThreshold) {
|
|
127
|
+
await this.compress();
|
|
128
|
+
}
|
|
129
|
+
if (this.returnMessages) {
|
|
130
|
+
const content = [];
|
|
131
|
+
if (this.summaryPrefix) {
|
|
132
|
+
content.push({ role: 'system', content: `[Earlier context]: ${this.summaryPrefix}` });
|
|
133
|
+
}
|
|
134
|
+
content.push(...this.messages);
|
|
135
|
+
return { [this.memoryKey]: content };
|
|
136
|
+
}
|
|
137
|
+
const parts = [];
|
|
138
|
+
if (this.summaryPrefix) {
|
|
139
|
+
parts.push(`[Earlier context]: ${this.summaryPrefix}`);
|
|
140
|
+
}
|
|
141
|
+
for (const m of this.messages) {
|
|
142
|
+
parts.push(`${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`);
|
|
143
|
+
}
|
|
144
|
+
return { [this.memoryKey]: parts.join('\n') };
|
|
145
|
+
}
|
|
146
|
+
async saveContext(inputs, outputs) {
|
|
147
|
+
const inputContent = Object.values(inputs)[0]?.toString() ?? '';
|
|
148
|
+
const outputContent = Object.values(outputs)[0]?.toString() ?? '';
|
|
149
|
+
if (inputContent) {
|
|
150
|
+
this.messages.push({ role: 'user', content: inputContent });
|
|
151
|
+
}
|
|
152
|
+
if (outputContent) {
|
|
153
|
+
this.messages.push({ role: 'assistant', content: outputContent });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async clear() {
|
|
157
|
+
this.messages = [];
|
|
158
|
+
this.summaryPrefix = '';
|
|
159
|
+
}
|
|
160
|
+
get tokenUsage() {
|
|
161
|
+
return {
|
|
162
|
+
estimatedTokens: this.estimateTokens(),
|
|
163
|
+
budget: this.maxTokens,
|
|
164
|
+
messageCount: this.messages.length,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.js","sourceRoot":"","sources":["../../src/memory/buffer.ts"],"names":[],"mappings":"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"}
|