@matteuccimarco/slim-langchain 0.1.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/LICENSE +21 -0
- package/README.md +222 -0
- package/dist/chunk-XICIEIQL.mjs +178 -0
- package/dist/chunk-XICIEIQL.mjs.map +1 -0
- package/dist/index.d.mts +43 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +250 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +49 -0
- package/dist/index.mjs.map +1 -0
- package/dist/memory-Btlz_Pf_.d.mts +192 -0
- package/dist/memory-Btlz_Pf_.d.ts +192 -0
- package/dist/memory.d.mts +1 -0
- package/dist/memory.d.ts +1 -0
- package/dist/memory.js +203 -0
- package/dist/memory.js.map +1 -0
- package/dist/memory.mjs +11 -0
- package/dist/memory.mjs.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marco Matteucci
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# @matteuccimarco/slim-langchain
|
|
2
|
+
|
|
3
|
+
LangChain integration with SLIM compression. Reduce token usage and storage by 40% for chat histories and memory.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @matteuccimarco/slim-langchain
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Chat Message History
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { SlimChatMessageHistory } from '@matteuccimarco/slim-langchain';
|
|
17
|
+
|
|
18
|
+
const history = new SlimChatMessageHistory();
|
|
19
|
+
|
|
20
|
+
// Add messages
|
|
21
|
+
history.addUserMessage("What's the weather like?");
|
|
22
|
+
history.addAIMessage("It's sunny and 72°F today!");
|
|
23
|
+
history.addUserMessage("Should I bring an umbrella?");
|
|
24
|
+
history.addAIMessage("No, you won't need one. Clear skies all day.");
|
|
25
|
+
|
|
26
|
+
// Export as SLIM (40% smaller than JSON)
|
|
27
|
+
const slim = history.toSlim();
|
|
28
|
+
console.log(slim);
|
|
29
|
+
// {sessionId:default,messages:|4|role,content|human,What's the weather like?|ai,It's sunny and 72°F today!|...}
|
|
30
|
+
|
|
31
|
+
// Get compression stats
|
|
32
|
+
const stats = history.getStats();
|
|
33
|
+
console.log(`Saved ${stats.savings}% - ${stats.jsonSize} bytes → ${stats.slimSize} bytes`);
|
|
34
|
+
|
|
35
|
+
// Restore from SLIM
|
|
36
|
+
const restored = SlimChatMessageHistory.fromSlim(slim);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Conversation Memory
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import { SlimConversationMemory } from '@matteuccimarco/slim-langchain';
|
|
43
|
+
|
|
44
|
+
const memory = new SlimConversationMemory();
|
|
45
|
+
|
|
46
|
+
// Save conversation turns
|
|
47
|
+
memory.saveContext(
|
|
48
|
+
{ input: "What's the capital of France?" },
|
|
49
|
+
{ output: "The capital of France is Paris." }
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
memory.saveContext(
|
|
53
|
+
{ input: "What's its population?" },
|
|
54
|
+
{ output: "Paris has a population of about 2.2 million in the city proper." }
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Load for prompt
|
|
58
|
+
const variables = memory.loadMemoryVariables();
|
|
59
|
+
console.log(variables.history);
|
|
60
|
+
// Human: What's the capital of France?
|
|
61
|
+
// AI: The capital of France is Paris.
|
|
62
|
+
// Human: What's its population?
|
|
63
|
+
// AI: Paris has a population of about 2.2 million in the city proper.
|
|
64
|
+
|
|
65
|
+
// Export for storage (Redis, DB, etc.)
|
|
66
|
+
const slim = memory.toSlim();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Serialization Utilities
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { slimSerialize, slimDeserialize, estimateTokenSavings } from '@matteuccimarco/slim-langchain';
|
|
73
|
+
|
|
74
|
+
// Serialize any data
|
|
75
|
+
const data = {
|
|
76
|
+
messages: [
|
|
77
|
+
{ role: 'user', content: 'Hello' },
|
|
78
|
+
{ role: 'assistant', content: 'Hi there!' },
|
|
79
|
+
],
|
|
80
|
+
metadata: { model: 'gpt-4', temperature: 0.7 }
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const slim = slimSerialize(data);
|
|
84
|
+
const restored = slimDeserialize(slim);
|
|
85
|
+
|
|
86
|
+
// Estimate token savings
|
|
87
|
+
const json = JSON.stringify(data);
|
|
88
|
+
const savings = estimateTokenSavings(json, slim);
|
|
89
|
+
console.log(`Saved ~${savings.savedTokens} tokens (${savings.savingsPercent}%)`);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Use Cases
|
|
93
|
+
|
|
94
|
+
### Storage Backend (Redis, PostgreSQL)
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { SlimChatMessageHistory } from '@matteuccimarco/slim-langchain';
|
|
98
|
+
import Redis from 'ioredis';
|
|
99
|
+
|
|
100
|
+
const redis = new Redis();
|
|
101
|
+
|
|
102
|
+
// Save to Redis
|
|
103
|
+
async function saveHistory(sessionId: string, history: SlimChatMessageHistory) {
|
|
104
|
+
const slim = history.toSlim();
|
|
105
|
+
await redis.set(`chat:${sessionId}`, slim, 'EX', 3600);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Load from Redis
|
|
109
|
+
async function loadHistory(sessionId: string): Promise<SlimChatMessageHistory> {
|
|
110
|
+
const slim = await redis.get(`chat:${sessionId}`);
|
|
111
|
+
if (!slim) return new SlimChatMessageHistory({ sessionId });
|
|
112
|
+
return SlimChatMessageHistory.fromSlim(slim);
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Reduce Context Window Usage
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import { SlimConversationMemory } from '@matteuccimarco/slim-langchain';
|
|
120
|
+
|
|
121
|
+
// For long conversations, SLIM reduces the memory footprint
|
|
122
|
+
const memory = new SlimConversationMemory();
|
|
123
|
+
|
|
124
|
+
// After 100 messages...
|
|
125
|
+
const stats = memory.getStats();
|
|
126
|
+
// JSON: 25,000 bytes (~6,250 tokens)
|
|
127
|
+
// SLIM: 15,000 bytes (~3,750 tokens)
|
|
128
|
+
// Saved: 2,500 tokens per request!
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## API Reference
|
|
132
|
+
|
|
133
|
+
### SlimChatMessageHistory
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
class SlimChatMessageHistory {
|
|
137
|
+
constructor(options?: { sessionId?: string; enabled?: boolean });
|
|
138
|
+
|
|
139
|
+
addUserMessage(content: string): void;
|
|
140
|
+
addAIMessage(content: string): void;
|
|
141
|
+
addSystemMessage(content: string): void;
|
|
142
|
+
addFunctionMessage(content: string, name: string): void;
|
|
143
|
+
addMessage(message: Message): void;
|
|
144
|
+
|
|
145
|
+
getMessages(): Message[];
|
|
146
|
+
clear(): void;
|
|
147
|
+
length: number;
|
|
148
|
+
|
|
149
|
+
toSlim(): string;
|
|
150
|
+
toJSON(): string;
|
|
151
|
+
getStats(): { jsonSize: number; slimSize: number; savings: number };
|
|
152
|
+
|
|
153
|
+
static fromSlim(slim: string): SlimChatMessageHistory;
|
|
154
|
+
static fromJSON(json: string): SlimChatMessageHistory;
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### SlimConversationMemory
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
class SlimConversationMemory {
|
|
162
|
+
constructor(options?: {
|
|
163
|
+
sessionId?: string;
|
|
164
|
+
humanPrefix?: string; // default: 'Human'
|
|
165
|
+
aiPrefix?: string; // default: 'AI'
|
|
166
|
+
memoryKey?: string; // default: 'history'
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
saveContext(inputs: { input: string }, outputs: { output: string }): void;
|
|
170
|
+
loadMemoryVariables(): Record<string, string>;
|
|
171
|
+
clear(): void;
|
|
172
|
+
getMessages(): Message[];
|
|
173
|
+
|
|
174
|
+
toSlim(): string;
|
|
175
|
+
getStats(): { jsonSize: number; slimSize: number; savings: number };
|
|
176
|
+
|
|
177
|
+
static fromSlim(slim: string): SlimConversationMemory;
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Serialization Functions
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
function slimSerialize(data: unknown): string;
|
|
185
|
+
function slimDeserialize<T>(slim: string): T;
|
|
186
|
+
function serializeMessages(messages: Message[]): string;
|
|
187
|
+
function deserializeMessages(slim: string): Message[];
|
|
188
|
+
function estimateTokenSavings(original: string, slim: string): {
|
|
189
|
+
originalTokens: number;
|
|
190
|
+
slimTokens: number;
|
|
191
|
+
savedTokens: number;
|
|
192
|
+
savingsPercent: number;
|
|
193
|
+
};
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Benchmarks
|
|
197
|
+
|
|
198
|
+
| Conversation Length | JSON Size | SLIM Size | Token Savings |
|
|
199
|
+
|--------------------|-----------|-----------|---------------|
|
|
200
|
+
| 10 messages | 2.5 KB | 1.5 KB | ~250 tokens |
|
|
201
|
+
| 50 messages | 12.5 KB | 7.5 KB | ~1,250 tokens |
|
|
202
|
+
| 100 messages | 25 KB | 15 KB | ~2,500 tokens |
|
|
203
|
+
|
|
204
|
+
### Cost Savings Example
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
1M API calls/month with 100-message context
|
|
208
|
+
|
|
209
|
+
Without SLIM:
|
|
210
|
+
- 6,250 tokens/call × 1M = 6.25B tokens
|
|
211
|
+
- GPT-4 ($30/1M): $187,500/month
|
|
212
|
+
|
|
213
|
+
With SLIM (40% reduction):
|
|
214
|
+
- 3,750 tokens/call × 1M = 3.75B tokens
|
|
215
|
+
- GPT-4 ($30/1M): $112,500/month
|
|
216
|
+
|
|
217
|
+
Monthly savings: $75,000 (40%)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## License
|
|
221
|
+
|
|
222
|
+
MIT
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// src/memory.ts
|
|
2
|
+
import { encode, decode } from "slim-protocol-core";
|
|
3
|
+
var SlimChatMessageHistory = class _SlimChatMessageHistory {
|
|
4
|
+
constructor(options = {}) {
|
|
5
|
+
this.messages = [];
|
|
6
|
+
this.sessionId = options.sessionId || "default";
|
|
7
|
+
this.enabled = options.enabled !== false;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Add a human/user message
|
|
11
|
+
*/
|
|
12
|
+
addUserMessage(content) {
|
|
13
|
+
this.messages.push({ role: "human", content });
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Add an AI/assistant message
|
|
17
|
+
*/
|
|
18
|
+
addAIMessage(content) {
|
|
19
|
+
this.messages.push({ role: "ai", content });
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add a system message
|
|
23
|
+
*/
|
|
24
|
+
addSystemMessage(content) {
|
|
25
|
+
this.messages.push({ role: "system", content });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Add a function message
|
|
29
|
+
*/
|
|
30
|
+
addFunctionMessage(content, name) {
|
|
31
|
+
this.messages.push({ role: "function", content, name });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Add a generic message
|
|
35
|
+
*/
|
|
36
|
+
addMessage(message) {
|
|
37
|
+
this.messages.push(message);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get all messages
|
|
41
|
+
*/
|
|
42
|
+
getMessages() {
|
|
43
|
+
return [...this.messages];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Clear all messages
|
|
47
|
+
*/
|
|
48
|
+
clear() {
|
|
49
|
+
this.messages = [];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get message count
|
|
53
|
+
*/
|
|
54
|
+
get length() {
|
|
55
|
+
return this.messages.length;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Export history as SLIM string
|
|
59
|
+
*/
|
|
60
|
+
toSlim() {
|
|
61
|
+
return encode({
|
|
62
|
+
sessionId: this.sessionId,
|
|
63
|
+
messages: this.messages
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Export history as JSON string (for comparison)
|
|
68
|
+
*/
|
|
69
|
+
toJSON() {
|
|
70
|
+
return JSON.stringify({
|
|
71
|
+
sessionId: this.sessionId,
|
|
72
|
+
messages: this.messages
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get compression stats
|
|
77
|
+
*/
|
|
78
|
+
getStats() {
|
|
79
|
+
const json = this.toJSON();
|
|
80
|
+
const slim = this.toSlim();
|
|
81
|
+
const jsonSize = json.length;
|
|
82
|
+
const slimSize = slim.length;
|
|
83
|
+
const savings = jsonSize > 0 ? Math.round((1 - slimSize / jsonSize) * 100) : 0;
|
|
84
|
+
return { jsonSize, slimSize, savings };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create from SLIM string
|
|
88
|
+
*/
|
|
89
|
+
static fromSlim(slim) {
|
|
90
|
+
const data = decode(slim);
|
|
91
|
+
const history = new _SlimChatMessageHistory({ sessionId: data.sessionId });
|
|
92
|
+
history.messages = data.messages || [];
|
|
93
|
+
return history;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create from JSON string
|
|
97
|
+
*/
|
|
98
|
+
static fromJSON(json) {
|
|
99
|
+
const data = JSON.parse(json);
|
|
100
|
+
const history = new _SlimChatMessageHistory({ sessionId: data.sessionId });
|
|
101
|
+
history.messages = data.messages || [];
|
|
102
|
+
return history;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
var SlimConversationMemory = class _SlimConversationMemory {
|
|
106
|
+
constructor(options = {}) {
|
|
107
|
+
this.humanPrefix = "Human";
|
|
108
|
+
this.aiPrefix = "AI";
|
|
109
|
+
this.memoryKey = "history";
|
|
110
|
+
this.history = new SlimChatMessageHistory(options);
|
|
111
|
+
this.humanPrefix = options.humanPrefix || "Human";
|
|
112
|
+
this.aiPrefix = options.aiPrefix || "AI";
|
|
113
|
+
this.memoryKey = options.memoryKey || "history";
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Save context from a conversation turn
|
|
117
|
+
*/
|
|
118
|
+
saveContext(inputs, outputs) {
|
|
119
|
+
this.history.addUserMessage(inputs.input);
|
|
120
|
+
this.history.addAIMessage(outputs.output);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Load memory variables for prompt
|
|
124
|
+
*/
|
|
125
|
+
loadMemoryVariables() {
|
|
126
|
+
const messages = this.history.getMessages();
|
|
127
|
+
const buffer = messages.map((m) => {
|
|
128
|
+
if (m.role === "human") return `${this.humanPrefix}: ${m.content}`;
|
|
129
|
+
if (m.role === "ai") return `${this.aiPrefix}: ${m.content}`;
|
|
130
|
+
if (m.role === "system") return `System: ${m.content}`;
|
|
131
|
+
return m.content;
|
|
132
|
+
}).join("\n");
|
|
133
|
+
return { [this.memoryKey]: buffer };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear memory
|
|
137
|
+
*/
|
|
138
|
+
clear() {
|
|
139
|
+
this.history.clear();
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get all messages
|
|
143
|
+
*/
|
|
144
|
+
getMessages() {
|
|
145
|
+
return this.history.getMessages();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Export as SLIM
|
|
149
|
+
*/
|
|
150
|
+
toSlim() {
|
|
151
|
+
return this.history.toSlim();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get compression stats
|
|
155
|
+
*/
|
|
156
|
+
getStats() {
|
|
157
|
+
return this.history.getStats();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create from SLIM
|
|
161
|
+
*/
|
|
162
|
+
static fromSlim(slim, options) {
|
|
163
|
+
const memory = new _SlimConversationMemory(options);
|
|
164
|
+
const restored = SlimChatMessageHistory.fromSlim(slim);
|
|
165
|
+
for (const msg of restored.getMessages()) {
|
|
166
|
+
memory.history.addMessage(msg);
|
|
167
|
+
}
|
|
168
|
+
return memory;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
var memory_default = { SlimChatMessageHistory, SlimConversationMemory };
|
|
172
|
+
|
|
173
|
+
export {
|
|
174
|
+
SlimChatMessageHistory,
|
|
175
|
+
SlimConversationMemory,
|
|
176
|
+
memory_default
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=chunk-XICIEIQL.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/memory.ts"],"sourcesContent":["/**\r\n * SLIM Memory implementations for LangChain\r\n */\r\n\r\nimport { encode, decode } from 'slim-protocol-core';\r\nimport { SlimMemoryOptions, Message, SerializedMemory } from './types';\r\n\r\n/**\r\n * Chat message history with SLIM compression\r\n *\r\n * @example\r\n * ```typescript\r\n * const history = new SlimChatMessageHistory();\r\n * history.addUserMessage(\"Hello\");\r\n * history.addAIMessage(\"Hi there!\");\r\n *\r\n * // Export as SLIM (40% smaller)\r\n * const slim = history.toSlim();\r\n *\r\n * // Import from SLIM\r\n * const restored = SlimChatMessageHistory.fromSlim(slim);\r\n * ```\r\n */\r\nexport class SlimChatMessageHistory {\r\n private messages: Message[] = [];\r\n private sessionId: string;\r\n private enabled: boolean;\r\n\r\n constructor(options: SlimMemoryOptions = {}) {\r\n this.sessionId = options.sessionId || 'default';\r\n this.enabled = options.enabled !== false;\r\n }\r\n\r\n /**\r\n * Add a human/user message\r\n */\r\n addUserMessage(content: string): void {\r\n this.messages.push({ role: 'human', content });\r\n }\r\n\r\n /**\r\n * Add an AI/assistant message\r\n */\r\n addAIMessage(content: string): void {\r\n this.messages.push({ role: 'ai', content });\r\n }\r\n\r\n /**\r\n * Add a system message\r\n */\r\n addSystemMessage(content: string): void {\r\n this.messages.push({ role: 'system', content });\r\n }\r\n\r\n /**\r\n * Add a function message\r\n */\r\n addFunctionMessage(content: string, name: string): void {\r\n this.messages.push({ role: 'function', content, name });\r\n }\r\n\r\n /**\r\n * Add a generic message\r\n */\r\n addMessage(message: Message): void {\r\n this.messages.push(message);\r\n }\r\n\r\n /**\r\n * Get all messages\r\n */\r\n getMessages(): Message[] {\r\n return [...this.messages];\r\n }\r\n\r\n /**\r\n * Clear all messages\r\n */\r\n clear(): void {\r\n this.messages = [];\r\n }\r\n\r\n /**\r\n * Get message count\r\n */\r\n get length(): number {\r\n return this.messages.length;\r\n }\r\n\r\n /**\r\n * Export history as SLIM string\r\n */\r\n toSlim(): string {\r\n return encode({\r\n sessionId: this.sessionId,\r\n messages: this.messages,\r\n });\r\n }\r\n\r\n /**\r\n * Export history as JSON string (for comparison)\r\n */\r\n toJSON(): string {\r\n return JSON.stringify({\r\n sessionId: this.sessionId,\r\n messages: this.messages,\r\n });\r\n }\r\n\r\n /**\r\n * Get compression stats\r\n */\r\n getStats(): { jsonSize: number; slimSize: number; savings: number } {\r\n const json = this.toJSON();\r\n const slim = this.toSlim();\r\n const jsonSize = json.length;\r\n const slimSize = slim.length;\r\n const savings = jsonSize > 0 ? Math.round((1 - slimSize / jsonSize) * 100) : 0;\r\n return { jsonSize, slimSize, savings };\r\n }\r\n\r\n /**\r\n * Create from SLIM string\r\n */\r\n static fromSlim(slim: string): SlimChatMessageHistory {\r\n const data = decode(slim) as unknown as { sessionId: string; messages: Message[] };\r\n const history = new SlimChatMessageHistory({ sessionId: data.sessionId });\r\n history.messages = data.messages || [];\r\n return history;\r\n }\r\n\r\n /**\r\n * Create from JSON string\r\n */\r\n static fromJSON(json: string): SlimChatMessageHistory {\r\n const data = JSON.parse(json) as { sessionId: string; messages: Message[] };\r\n const history = new SlimChatMessageHistory({ sessionId: data.sessionId });\r\n history.messages = data.messages || [];\r\n return history;\r\n }\r\n}\r\n\r\n/**\r\n * Conversation buffer memory with SLIM compression\r\n *\r\n * @example\r\n * ```typescript\r\n * const memory = new SlimConversationMemory();\r\n *\r\n * memory.saveContext(\r\n * { input: \"What's the weather?\" },\r\n * { output: \"It's sunny and 72°F\" }\r\n * );\r\n *\r\n * const variables = memory.loadMemoryVariables();\r\n * // { history: \"Human: What's the weather?\\nAI: It's sunny and 72°F\" }\r\n *\r\n * // Export for storage\r\n * const slim = memory.toSlim();\r\n * ```\r\n */\r\nexport class SlimConversationMemory {\r\n private history: SlimChatMessageHistory;\r\n private humanPrefix: string = 'Human';\r\n private aiPrefix: string = 'AI';\r\n private memoryKey: string = 'history';\r\n\r\n constructor(options: SlimMemoryOptions & {\r\n humanPrefix?: string;\r\n aiPrefix?: string;\r\n memoryKey?: string;\r\n } = {}) {\r\n this.history = new SlimChatMessageHistory(options);\r\n this.humanPrefix = options.humanPrefix || 'Human';\r\n this.aiPrefix = options.aiPrefix || 'AI';\r\n this.memoryKey = options.memoryKey || 'history';\r\n }\r\n\r\n /**\r\n * Save context from a conversation turn\r\n */\r\n saveContext(\r\n inputs: { input: string; [key: string]: unknown },\r\n outputs: { output: string; [key: string]: unknown }\r\n ): void {\r\n this.history.addUserMessage(inputs.input);\r\n this.history.addAIMessage(outputs.output);\r\n }\r\n\r\n /**\r\n * Load memory variables for prompt\r\n */\r\n loadMemoryVariables(): Record<string, string> {\r\n const messages = this.history.getMessages();\r\n const buffer = messages\r\n .map((m) => {\r\n if (m.role === 'human') return `${this.humanPrefix}: ${m.content}`;\r\n if (m.role === 'ai') return `${this.aiPrefix}: ${m.content}`;\r\n if (m.role === 'system') return `System: ${m.content}`;\r\n return m.content;\r\n })\r\n .join('\\n');\r\n\r\n return { [this.memoryKey]: buffer };\r\n }\r\n\r\n /**\r\n * Clear memory\r\n */\r\n clear(): void {\r\n this.history.clear();\r\n }\r\n\r\n /**\r\n * Get all messages\r\n */\r\n getMessages(): Message[] {\r\n return this.history.getMessages();\r\n }\r\n\r\n /**\r\n * Export as SLIM\r\n */\r\n toSlim(): string {\r\n return this.history.toSlim();\r\n }\r\n\r\n /**\r\n * Get compression stats\r\n */\r\n getStats(): { jsonSize: number; slimSize: number; savings: number } {\r\n return this.history.getStats();\r\n }\r\n\r\n /**\r\n * Create from SLIM\r\n */\r\n static fromSlim(slim: string, options?: { humanPrefix?: string; aiPrefix?: string; memoryKey?: string }): SlimConversationMemory {\r\n const memory = new SlimConversationMemory(options);\r\n const restored = SlimChatMessageHistory.fromSlim(slim);\r\n for (const msg of restored.getMessages()) {\r\n memory.history.addMessage(msg);\r\n }\r\n return memory;\r\n }\r\n}\r\n\r\nexport default { SlimChatMessageHistory, SlimConversationMemory };\r\n"],"mappings":"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","names":[]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { M as Message, S as SlimSerializeOptions, a as SerializedMemory } from './memory-Btlz_Pf_.mjs';
|
|
2
|
+
export { c as SlimChatMessageHistory, d as SlimConversationMemory, b as SlimMemoryOptions } from './memory-Btlz_Pf_.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SLIM serialization utilities for LangChain
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Serialize LangChain messages to SLIM format
|
|
10
|
+
*/
|
|
11
|
+
declare function serializeMessages(messages: Message[], options?: SlimSerializeOptions): string;
|
|
12
|
+
/**
|
|
13
|
+
* Deserialize SLIM string back to messages
|
|
14
|
+
*/
|
|
15
|
+
declare function deserializeMessages(slim: string): Message[];
|
|
16
|
+
/**
|
|
17
|
+
* Serialize any object to SLIM
|
|
18
|
+
*/
|
|
19
|
+
declare function slimSerialize(data: unknown): string;
|
|
20
|
+
/**
|
|
21
|
+
* Deserialize SLIM string to object
|
|
22
|
+
*/
|
|
23
|
+
declare function slimDeserialize<T = unknown>(slim: string): T;
|
|
24
|
+
/**
|
|
25
|
+
* Serialize memory state to SLIM
|
|
26
|
+
*/
|
|
27
|
+
declare function serializeMemory(memory: SerializedMemory): string;
|
|
28
|
+
/**
|
|
29
|
+
* Deserialize SLIM to memory state
|
|
30
|
+
*/
|
|
31
|
+
declare function deserializeMemory(slim: string): SerializedMemory;
|
|
32
|
+
/**
|
|
33
|
+
* Calculate token savings estimate
|
|
34
|
+
* Rough estimate: 1 token ≈ 4 characters
|
|
35
|
+
*/
|
|
36
|
+
declare function estimateTokenSavings(original: string, slim: string): {
|
|
37
|
+
originalTokens: number;
|
|
38
|
+
slimTokens: number;
|
|
39
|
+
savedTokens: number;
|
|
40
|
+
savingsPercent: number;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { Message, SerializedMemory, SlimSerializeOptions, deserializeMemory, deserializeMessages, estimateTokenSavings, serializeMemory, serializeMessages, slimDeserialize, slimSerialize };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { M as Message, S as SlimSerializeOptions, a as SerializedMemory } from './memory-Btlz_Pf_.js';
|
|
2
|
+
export { c as SlimChatMessageHistory, d as SlimConversationMemory, b as SlimMemoryOptions } from './memory-Btlz_Pf_.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SLIM serialization utilities for LangChain
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Serialize LangChain messages to SLIM format
|
|
10
|
+
*/
|
|
11
|
+
declare function serializeMessages(messages: Message[], options?: SlimSerializeOptions): string;
|
|
12
|
+
/**
|
|
13
|
+
* Deserialize SLIM string back to messages
|
|
14
|
+
*/
|
|
15
|
+
declare function deserializeMessages(slim: string): Message[];
|
|
16
|
+
/**
|
|
17
|
+
* Serialize any object to SLIM
|
|
18
|
+
*/
|
|
19
|
+
declare function slimSerialize(data: unknown): string;
|
|
20
|
+
/**
|
|
21
|
+
* Deserialize SLIM string to object
|
|
22
|
+
*/
|
|
23
|
+
declare function slimDeserialize<T = unknown>(slim: string): T;
|
|
24
|
+
/**
|
|
25
|
+
* Serialize memory state to SLIM
|
|
26
|
+
*/
|
|
27
|
+
declare function serializeMemory(memory: SerializedMemory): string;
|
|
28
|
+
/**
|
|
29
|
+
* Deserialize SLIM to memory state
|
|
30
|
+
*/
|
|
31
|
+
declare function deserializeMemory(slim: string): SerializedMemory;
|
|
32
|
+
/**
|
|
33
|
+
* Calculate token savings estimate
|
|
34
|
+
* Rough estimate: 1 token ≈ 4 characters
|
|
35
|
+
*/
|
|
36
|
+
declare function estimateTokenSavings(original: string, slim: string): {
|
|
37
|
+
originalTokens: number;
|
|
38
|
+
slimTokens: number;
|
|
39
|
+
savedTokens: number;
|
|
40
|
+
savingsPercent: number;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { Message, SerializedMemory, SlimSerializeOptions, deserializeMemory, deserializeMessages, estimateTokenSavings, serializeMemory, serializeMessages, slimDeserialize, slimSerialize };
|