@animalabs/membrane 0.5.46 → 0.5.50
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/dist/membrane.d.ts.map +1 -1
- package/dist/membrane.js +104 -11
- package/dist/membrane.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +11 -1
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +23 -4
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/types/yielding-stream.d.ts +10 -1
- package/dist/types/yielding-stream.d.ts.map +1 -1
- package/dist/types/yielding-stream.js.map +1 -1
- package/package.json +5 -1
- package/src/membrane.ts +127 -13
- package/src/providers/anthropic.ts +12 -0
- package/src/providers/bedrock.ts +21 -4
- package/src/types/yielding-stream.ts +10 -1
- package/dist/context/index.d.ts +0 -12
- package/dist/context/index.js +0 -11
- package/dist/context/index.js.map +0 -1
- package/dist/context/process.d.ts +0 -43
- package/dist/context/process.js +0 -381
- package/dist/context/process.js.map +0 -1
- package/dist/context/types.d.ts +0 -164
- package/dist/context/types.js +0 -61
- package/dist/context/types.js.map +0 -1
- package/dist/formatters/anthropic-xml.d.ts +0 -63
- package/dist/formatters/anthropic-xml.js +0 -417
- package/dist/formatters/anthropic-xml.js.map +0 -1
- package/dist/formatters/completions.d.ts +0 -68
- package/dist/formatters/completions.js +0 -261
- package/dist/formatters/completions.js.map +0 -1
- package/dist/formatters/index.d.ts +0 -8
- package/dist/formatters/index.js +0 -7
- package/dist/formatters/index.js.map +0 -1
- package/dist/formatters/native.d.ts +0 -35
- package/dist/formatters/native.js +0 -336
- package/dist/formatters/native.js.map +0 -1
- package/dist/formatters/types.d.ts +0 -167
- package/dist/formatters/types.js +0 -7
- package/dist/formatters/types.js.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.js +0 -20
- package/dist/index.js.map +0 -1
- package/dist/membrane.d.ts +0 -146
- package/dist/providers/anthropic.d.ts +0 -36
- package/dist/providers/bedrock.d.ts +0 -43
- package/dist/providers/gemini.d.ts +0 -68
- package/dist/providers/gemini.js +0 -538
- package/dist/providers/gemini.js.map +0 -1
- package/dist/providers/index.d.ts +0 -13
- package/dist/providers/index.js +0 -13
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/mock.d.ts +0 -90
- package/dist/providers/mock.d.ts.map +0 -1
- package/dist/providers/mock.js +0 -210
- package/dist/providers/mock.js.map +0 -1
- package/dist/providers/openai-compatible.d.ts +0 -82
- package/dist/providers/openai-compatible.js +0 -480
- package/dist/providers/openai-compatible.js.map +0 -1
- package/dist/providers/openai-completions.d.ts +0 -89
- package/dist/providers/openai-completions.js +0 -347
- package/dist/providers/openai-completions.js.map +0 -1
- package/dist/providers/openai-responses.d.ts +0 -77
- package/dist/providers/openai-responses.js +0 -333
- package/dist/providers/openai-responses.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -77
- package/dist/providers/openai.js +0 -533
- package/dist/providers/openai.js.map +0 -1
- package/dist/providers/openrouter.d.ts +0 -82
- package/dist/providers/openrouter.js +0 -556
- package/dist/providers/openrouter.js.map +0 -1
- package/dist/providers/utils.d.ts +0 -44
- package/dist/providers/utils.d.ts.map +0 -1
- package/dist/providers/utils.js +0 -100
- package/dist/providers/utils.js.map +0 -1
- package/dist/registry/default-pricing.d.ts +0 -3
- package/dist/registry/default-pricing.d.ts.map +0 -1
- package/dist/registry/default-pricing.js +0 -75
- package/dist/registry/default-pricing.js.map +0 -1
- package/dist/transforms/chat.d.ts +0 -52
- package/dist/transforms/chat.js +0 -136
- package/dist/transforms/chat.js.map +0 -1
- package/dist/transforms/index.d.ts +0 -5
- package/dist/transforms/index.js +0 -7
- package/dist/transforms/index.js.map +0 -1
- package/dist/types/config.d.ts +0 -110
- package/dist/types/config.js +0 -21
- package/dist/types/config.js.map +0 -1
- package/dist/types/content.d.ts +0 -87
- package/dist/types/content.d.ts.map +0 -1
- package/dist/types/content.js +0 -40
- package/dist/types/content.js.map +0 -1
- package/dist/types/errors.d.ts +0 -50
- package/dist/types/errors.d.ts.map +0 -1
- package/dist/types/errors.js +0 -253
- package/dist/types/errors.js.map +0 -1
- package/dist/types/index.d.ts +0 -20
- package/dist/types/index.js +0 -10
- package/dist/types/index.js.map +0 -1
- package/dist/types/message.d.ts +0 -52
- package/dist/types/message.d.ts.map +0 -1
- package/dist/types/message.js +0 -38
- package/dist/types/message.js.map +0 -1
- package/dist/types/provider.d.ts +0 -169
- package/dist/types/provider.d.ts.map +0 -1
- package/dist/types/provider.js +0 -5
- package/dist/types/provider.js.map +0 -1
- package/dist/types/request.d.ts +0 -116
- package/dist/types/request.d.ts.map +0 -1
- package/dist/types/request.js +0 -5
- package/dist/types/request.js.map +0 -1
- package/dist/types/response.d.ts +0 -131
- package/dist/types/response.d.ts.map +0 -1
- package/dist/types/response.js +0 -7
- package/dist/types/response.js.map +0 -1
- package/dist/types/streaming.d.ts +0 -194
- package/dist/types/streaming.js +0 -5
- package/dist/types/streaming.js.map +0 -1
- package/dist/types/tools.d.ts +0 -71
- package/dist/types/tools.d.ts.map +0 -1
- package/dist/types/tools.js +0 -5
- package/dist/types/tools.js.map +0 -1
- package/dist/utils/cost.d.ts +0 -10
- package/dist/utils/cost.d.ts.map +0 -1
- package/dist/utils/cost.js +0 -19
- package/dist/utils/cost.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/stream-parser.d.ts +0 -84
- package/dist/utils/stream-parser.js +0 -418
- package/dist/utils/stream-parser.js.map +0 -1
- package/dist/utils/tool-parser.d.ts +0 -134
- package/dist/utils/tool-parser.js +0 -600
- package/dist/utils/tool-parser.js.map +0 -1
- package/dist/yielding-stream.d.ts +0 -60
- package/dist/yielding-stream.js +0 -206
- package/dist/yielding-stream.js.map +0 -1
package/dist/context/process.js
DELETED
|
@@ -1,381 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context processing - main entry point
|
|
3
|
-
*/
|
|
4
|
-
import { createInitialState, defaultTokenEstimator, DEFAULT_CONTEXT_CONFIG, } from './types.js';
|
|
5
|
-
// ============================================================================
|
|
6
|
-
// Main Entry Point
|
|
7
|
-
// ============================================================================
|
|
8
|
-
/**
|
|
9
|
-
* Process context and stream LLM response.
|
|
10
|
-
*
|
|
11
|
-
* This function handles:
|
|
12
|
-
* - Rolling/truncation based on thresholds
|
|
13
|
-
* - Cache marker placement for prompt caching
|
|
14
|
-
* - Hard limit enforcement
|
|
15
|
-
* - State management
|
|
16
|
-
*
|
|
17
|
-
* @param membrane - Configured Membrane instance
|
|
18
|
-
* @param input - Messages, config, and context settings
|
|
19
|
-
* @param state - Previous state (null for first call)
|
|
20
|
-
* @param options - Stream options
|
|
21
|
-
* @returns Response, updated state, and context info
|
|
22
|
-
*/
|
|
23
|
-
export async function processContext(membrane, input, state, options) {
|
|
24
|
-
// Merge config with defaults
|
|
25
|
-
const contextConfig = mergeConfig(input.context);
|
|
26
|
-
const tokenEstimator = contextConfig.tokenEstimator ?? defaultTokenEstimator;
|
|
27
|
-
// Initialize or continue state
|
|
28
|
-
let currentState = state ?? createInitialState();
|
|
29
|
-
// Detect discontinuity (new conversation or branch switch)
|
|
30
|
-
const isDiscontinuous = detectDiscontinuity(input.messages, currentState);
|
|
31
|
-
if (isDiscontinuous) {
|
|
32
|
-
currentState = createInitialState();
|
|
33
|
-
}
|
|
34
|
-
// Calculate tokens for all messages
|
|
35
|
-
const messageTokens = input.messages.map(m => ({
|
|
36
|
-
message: m,
|
|
37
|
-
tokens: tokenEstimator(m),
|
|
38
|
-
id: getMessageId(m),
|
|
39
|
-
}));
|
|
40
|
-
const totalTokens = messageTokens.reduce((sum, m) => sum + m.tokens, 0);
|
|
41
|
-
const totalCharacters = calculateCharacters(input.messages);
|
|
42
|
-
// Determine if we should roll
|
|
43
|
-
const rollDecision = shouldRoll(currentState, input.messages.length, totalTokens, totalCharacters, contextConfig);
|
|
44
|
-
// Apply rolling/truncation if needed
|
|
45
|
-
let keptMessages = input.messages;
|
|
46
|
-
let messagesDropped = 0;
|
|
47
|
-
let didRoll = false;
|
|
48
|
-
let hardLimitHit = false;
|
|
49
|
-
if (rollDecision.shouldRoll) {
|
|
50
|
-
const truncateResult = truncateMessages(messageTokens, rollDecision.targetTokens, rollDecision.targetMessages, contextConfig);
|
|
51
|
-
keptMessages = truncateResult.kept.map(m => m.message);
|
|
52
|
-
messagesDropped = truncateResult.dropped;
|
|
53
|
-
didRoll = true;
|
|
54
|
-
hardLimitHit = rollDecision.reason === 'hard_limit';
|
|
55
|
-
}
|
|
56
|
-
// Recalculate tokens after truncation
|
|
57
|
-
const keptTokens = keptMessages.map(m => ({
|
|
58
|
-
message: m,
|
|
59
|
-
tokens: tokenEstimator(m),
|
|
60
|
-
id: getMessageId(m),
|
|
61
|
-
}));
|
|
62
|
-
const keptTotalTokens = keptTokens.reduce((sum, m) => sum + m.tokens, 0);
|
|
63
|
-
// Place cache markers
|
|
64
|
-
const cacheMarkers = placeCacheMarkers(keptMessages, keptTokens, currentState, didRoll, contextConfig);
|
|
65
|
-
// Apply cache markers to messages
|
|
66
|
-
const messagesWithCache = applyCacheMarkers(keptMessages, cacheMarkers);
|
|
67
|
-
// Calculate cached/uncached tokens
|
|
68
|
-
const lastMarker = cacheMarkers[cacheMarkers.length - 1];
|
|
69
|
-
const cachedTokens = lastMarker?.tokenEstimate ?? 0;
|
|
70
|
-
const uncachedTokens = keptTotalTokens - cachedTokens;
|
|
71
|
-
// Build request
|
|
72
|
-
const request = {
|
|
73
|
-
messages: messagesWithCache,
|
|
74
|
-
system: input.system,
|
|
75
|
-
tools: input.tools,
|
|
76
|
-
config: input.config,
|
|
77
|
-
};
|
|
78
|
-
// Stream response - pass through all options
|
|
79
|
-
const response = await membrane.stream(request, {
|
|
80
|
-
onChunk: options?.onChunk,
|
|
81
|
-
signal: options?.signal,
|
|
82
|
-
onToolCalls: options?.onToolCalls,
|
|
83
|
-
onPreToolContent: options?.onPreToolContent,
|
|
84
|
-
onUsage: options?.onUsage,
|
|
85
|
-
maxToolDepth: options?.maxToolDepth,
|
|
86
|
-
});
|
|
87
|
-
// Determine cachedStartMessageId
|
|
88
|
-
// - On roll: use first message ID after truncation (anchor for stable fetches)
|
|
89
|
-
// - No roll: keep existing (maintains fetch window stability)
|
|
90
|
-
const cachedStartMessageId = didRoll
|
|
91
|
-
? (keptMessages.length > 0 ? getMessageId(keptMessages[0]) : undefined)
|
|
92
|
-
: currentState.cachedStartMessageId;
|
|
93
|
-
// Update state
|
|
94
|
-
const newState = {
|
|
95
|
-
cacheMarkers,
|
|
96
|
-
windowMessageIds: keptMessages.map(m => getMessageId(m)),
|
|
97
|
-
messagesSinceRoll: didRoll ? 1 : currentState.messagesSinceRoll + 1,
|
|
98
|
-
tokensSinceRoll: didRoll ? keptTotalTokens : currentState.tokensSinceRoll + keptTotalTokens,
|
|
99
|
-
inGracePeriod: rollDecision.enteredGrace || (currentState.inGracePeriod && !didRoll),
|
|
100
|
-
lastRollTime: didRoll ? new Date().toISOString() : currentState.lastRollTime,
|
|
101
|
-
cachedStartMessageId,
|
|
102
|
-
};
|
|
103
|
-
// Build info
|
|
104
|
-
const info = {
|
|
105
|
-
didRoll,
|
|
106
|
-
messagesDropped,
|
|
107
|
-
messagesKept: keptMessages.length,
|
|
108
|
-
cacheMarkers,
|
|
109
|
-
cachedTokens,
|
|
110
|
-
uncachedTokens,
|
|
111
|
-
totalTokens: keptTotalTokens,
|
|
112
|
-
hardLimitHit,
|
|
113
|
-
cachedStartMessageId,
|
|
114
|
-
};
|
|
115
|
-
return { response, state: newState, info };
|
|
116
|
-
}
|
|
117
|
-
// ============================================================================
|
|
118
|
-
// Helper Functions
|
|
119
|
-
// ============================================================================
|
|
120
|
-
function mergeConfig(config) {
|
|
121
|
-
return {
|
|
122
|
-
rolling: {
|
|
123
|
-
...DEFAULT_CONTEXT_CONFIG.rolling,
|
|
124
|
-
...config.rolling,
|
|
125
|
-
},
|
|
126
|
-
limits: {
|
|
127
|
-
...DEFAULT_CONTEXT_CONFIG.limits,
|
|
128
|
-
...config.limits,
|
|
129
|
-
},
|
|
130
|
-
cache: {
|
|
131
|
-
...DEFAULT_CONTEXT_CONFIG.cache,
|
|
132
|
-
...config.cache,
|
|
133
|
-
},
|
|
134
|
-
tokenEstimator: config.tokenEstimator,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
function getMessageId(message) {
|
|
138
|
-
return message.metadata?.sourceId ?? `msg-${Math.random().toString(36).slice(2)}`;
|
|
139
|
-
}
|
|
140
|
-
function detectDiscontinuity(messages, state) {
|
|
141
|
-
if (state.windowMessageIds.length === 0) {
|
|
142
|
-
return false; // First call, not a discontinuity
|
|
143
|
-
}
|
|
144
|
-
const currentIds = new Set(messages.map(m => getMessageId(m)));
|
|
145
|
-
const overlap = state.windowMessageIds.filter(id => currentIds.has(id));
|
|
146
|
-
// If less than 50% overlap, consider it a new conversation
|
|
147
|
-
return overlap.length < state.windowMessageIds.length * 0.5;
|
|
148
|
-
}
|
|
149
|
-
export function calculateCharacters(messages) {
|
|
150
|
-
let chars = 0;
|
|
151
|
-
for (const msg of messages) {
|
|
152
|
-
for (const block of msg.content) {
|
|
153
|
-
if (block.type === 'text') {
|
|
154
|
-
chars += block.text.length;
|
|
155
|
-
}
|
|
156
|
-
else if (block.type === 'tool_result') {
|
|
157
|
-
const content = typeof block.content === 'string'
|
|
158
|
-
? block.content
|
|
159
|
-
: JSON.stringify(block.content);
|
|
160
|
-
chars += content.length;
|
|
161
|
-
}
|
|
162
|
-
// Images not counted for character limits
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return chars;
|
|
166
|
-
}
|
|
167
|
-
export function shouldRoll(state, messageCount, totalTokens, totalCharacters, config) {
|
|
168
|
-
const { rolling, limits } = config;
|
|
169
|
-
const unit = rolling.unit ?? 'messages';
|
|
170
|
-
const threshold = rolling.threshold;
|
|
171
|
-
const grace = rolling.grace ?? 0;
|
|
172
|
-
const maxThreshold = threshold + grace;
|
|
173
|
-
// Check hard limits first (always enforced)
|
|
174
|
-
if (limits?.maxCharacters && totalCharacters > limits.maxCharacters) {
|
|
175
|
-
return {
|
|
176
|
-
shouldRoll: true,
|
|
177
|
-
reason: 'hard_limit',
|
|
178
|
-
targetTokens: limits.maxTokens,
|
|
179
|
-
targetMessages: limits.maxMessages,
|
|
180
|
-
enteredGrace: false,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
if (limits?.maxTokens && totalTokens > limits.maxTokens) {
|
|
184
|
-
return {
|
|
185
|
-
shouldRoll: true,
|
|
186
|
-
reason: 'hard_limit',
|
|
187
|
-
targetTokens: limits.maxTokens,
|
|
188
|
-
targetMessages: limits.maxMessages,
|
|
189
|
-
enteredGrace: false,
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
if (limits?.maxMessages && messageCount > limits.maxMessages) {
|
|
193
|
-
return {
|
|
194
|
-
shouldRoll: true,
|
|
195
|
-
reason: 'hard_limit',
|
|
196
|
-
targetTokens: limits.maxTokens,
|
|
197
|
-
targetMessages: limits.maxMessages,
|
|
198
|
-
enteredGrace: false,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
// Check rolling threshold
|
|
202
|
-
const current = unit === 'messages' ? state.messagesSinceRoll : state.tokensSinceRoll;
|
|
203
|
-
if (current >= maxThreshold) {
|
|
204
|
-
// Exceeded grace, must roll
|
|
205
|
-
return {
|
|
206
|
-
shouldRoll: true,
|
|
207
|
-
reason: 'grace_exceeded',
|
|
208
|
-
targetTokens: unit === 'tokens' ? threshold : undefined,
|
|
209
|
-
targetMessages: unit === 'messages' ? threshold : undefined,
|
|
210
|
-
enteredGrace: false,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
if (!state.inGracePeriod && current >= threshold) {
|
|
214
|
-
// Just entered grace period
|
|
215
|
-
return {
|
|
216
|
-
shouldRoll: false,
|
|
217
|
-
enteredGrace: true,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
shouldRoll: false,
|
|
222
|
-
enteredGrace: false,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
export function truncateMessages(messages, targetTokens, targetMessages, config) {
|
|
226
|
-
// Truncate from the beginning, keeping most recent
|
|
227
|
-
if (targetMessages && messages.length > targetMessages) {
|
|
228
|
-
const startIdx = messages.length - targetMessages;
|
|
229
|
-
return {
|
|
230
|
-
kept: messages.slice(startIdx),
|
|
231
|
-
dropped: startIdx,
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
if (targetTokens) {
|
|
235
|
-
let tokenSum = 0;
|
|
236
|
-
let startIdx = messages.length;
|
|
237
|
-
// Count from end backwards
|
|
238
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
239
|
-
tokenSum += messages[i].tokens;
|
|
240
|
-
if (tokenSum > targetTokens) {
|
|
241
|
-
startIdx = i + 1;
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
startIdx = i;
|
|
245
|
-
}
|
|
246
|
-
return {
|
|
247
|
-
kept: messages.slice(startIdx),
|
|
248
|
-
dropped: startIdx,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
// Default: use buffer from config
|
|
252
|
-
const buffer = config?.rolling.buffer ?? 20;
|
|
253
|
-
const unit = config?.rolling.unit ?? 'messages';
|
|
254
|
-
if (unit === 'messages') {
|
|
255
|
-
const targetCount = Math.max(buffer * 2, messages.length - buffer);
|
|
256
|
-
if (messages.length > targetCount) {
|
|
257
|
-
const startIdx = messages.length - targetCount;
|
|
258
|
-
return {
|
|
259
|
-
kept: messages.slice(startIdx),
|
|
260
|
-
dropped: startIdx,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
return { kept: messages, dropped: 0 };
|
|
265
|
-
}
|
|
266
|
-
export function placeCacheMarkers(messages, messageTokens, state, didRoll, config) {
|
|
267
|
-
const cacheConfig = config.cache ?? {};
|
|
268
|
-
if (cacheConfig.enabled === false) {
|
|
269
|
-
return [];
|
|
270
|
-
}
|
|
271
|
-
const numPoints = cacheConfig.points ?? 1;
|
|
272
|
-
const minTokens = cacheConfig.minTokens ?? 1024;
|
|
273
|
-
const preferUser = cacheConfig.preferUserMessages ?? true;
|
|
274
|
-
const totalTokens = messageTokens.reduce((sum, m) => sum + m.tokens, 0);
|
|
275
|
-
// Not enough tokens for caching
|
|
276
|
-
if (totalTokens < minTokens) {
|
|
277
|
-
return [];
|
|
278
|
-
}
|
|
279
|
-
// If we didn't roll, try to keep existing markers stable
|
|
280
|
-
if (!didRoll && state.cacheMarkers.length > 0) {
|
|
281
|
-
const currentIds = new Set(messages.map(m => getMessageId(m)));
|
|
282
|
-
const validMarkers = state.cacheMarkers.filter(m => currentIds.has(m.messageId));
|
|
283
|
-
if (validMarkers.length > 0) {
|
|
284
|
-
// Recalculate token estimates for valid markers
|
|
285
|
-
return validMarkers.map(marker => {
|
|
286
|
-
const idx = messages.findIndex(m => getMessageId(m) === marker.messageId);
|
|
287
|
-
const tokenEstimate = messageTokens
|
|
288
|
-
.slice(0, idx + 1)
|
|
289
|
-
.reduce((sum, m) => sum + m.tokens, 0);
|
|
290
|
-
return {
|
|
291
|
-
messageId: marker.messageId,
|
|
292
|
-
messageIndex: idx,
|
|
293
|
-
tokenEstimate,
|
|
294
|
-
};
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
// Place new markers using arithmetic positioning
|
|
299
|
-
const markers = [];
|
|
300
|
-
const buffer = config.rolling.buffer ?? 20;
|
|
301
|
-
// For single point: place at (length - buffer)
|
|
302
|
-
// For multiple points: distribute evenly in cacheable portion
|
|
303
|
-
const cacheableEnd = Math.max(0, messages.length - buffer);
|
|
304
|
-
if (cacheableEnd === 0) {
|
|
305
|
-
return []; // Nothing to cache
|
|
306
|
-
}
|
|
307
|
-
// Calculate step size for multiple cache points
|
|
308
|
-
const step = Math.floor(cacheableEnd / numPoints);
|
|
309
|
-
if (step === 0) {
|
|
310
|
-
return []; // Not enough messages for requested cache points
|
|
311
|
-
}
|
|
312
|
-
let runningTokens = 0;
|
|
313
|
-
let currentIdx = 0;
|
|
314
|
-
for (let point = 1; point <= numPoints; point++) {
|
|
315
|
-
const targetIdx = Math.min(point * step - 1, cacheableEnd - 1);
|
|
316
|
-
// Accumulate tokens up to target
|
|
317
|
-
while (currentIdx <= targetIdx && currentIdx < messageTokens.length) {
|
|
318
|
-
runningTokens += messageTokens[currentIdx].tokens;
|
|
319
|
-
currentIdx++;
|
|
320
|
-
}
|
|
321
|
-
let markerIdx = targetIdx;
|
|
322
|
-
let markerTokens = runningTokens;
|
|
323
|
-
// Adjust to user message if preferred
|
|
324
|
-
if (preferUser) {
|
|
325
|
-
const adjusted = findNearestUserMessage(messages, markerIdx, messageTokens);
|
|
326
|
-
if (adjusted) {
|
|
327
|
-
markerIdx = adjusted.index;
|
|
328
|
-
markerTokens = adjusted.tokens;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
// Skip if below minimum
|
|
332
|
-
if (markerTokens < minTokens) {
|
|
333
|
-
continue;
|
|
334
|
-
}
|
|
335
|
-
// Skip if duplicate
|
|
336
|
-
if (markers.some(m => m.messageIndex === markerIdx)) {
|
|
337
|
-
continue;
|
|
338
|
-
}
|
|
339
|
-
markers.push({
|
|
340
|
-
messageId: getMessageId(messages[markerIdx]),
|
|
341
|
-
messageIndex: markerIdx,
|
|
342
|
-
tokenEstimate: markerTokens,
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
return markers;
|
|
346
|
-
}
|
|
347
|
-
function findNearestUserMessage(messages, startIdx, messageTokens) {
|
|
348
|
-
// Search backwards for a user message (non-assistant participant)
|
|
349
|
-
const maxSearch = 5;
|
|
350
|
-
let tokens = messageTokens.slice(0, startIdx + 1).reduce((sum, m) => sum + m.tokens, 0);
|
|
351
|
-
for (let i = startIdx; i >= Math.max(0, startIdx - maxSearch); i--) {
|
|
352
|
-
const msg = messages[i];
|
|
353
|
-
// Heuristic: if participant isn't a common assistant name, it's probably a user
|
|
354
|
-
const participant = msg.participant.toLowerCase();
|
|
355
|
-
const isUser = !['claude', 'assistant', 'bot', 'ai'].includes(participant);
|
|
356
|
-
if (isUser) {
|
|
357
|
-
return { index: i, tokens };
|
|
358
|
-
}
|
|
359
|
-
tokens -= messageTokens[i].tokens;
|
|
360
|
-
}
|
|
361
|
-
return null;
|
|
362
|
-
}
|
|
363
|
-
export function applyCacheMarkers(messages, cacheMarkers) {
|
|
364
|
-
if (cacheMarkers.length === 0) {
|
|
365
|
-
return messages;
|
|
366
|
-
}
|
|
367
|
-
const markerIndices = new Set(cacheMarkers.map(m => m.messageIndex));
|
|
368
|
-
return messages.map((msg, idx) => {
|
|
369
|
-
if (markerIndices.has(idx)) {
|
|
370
|
-
return {
|
|
371
|
-
...msg,
|
|
372
|
-
metadata: {
|
|
373
|
-
...msg.metadata,
|
|
374
|
-
cacheControl: { type: 'ephemeral' },
|
|
375
|
-
},
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
return msg;
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
//# sourceMappingURL=process.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/context/process.ts"],"names":[],"mappings":"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"}
|
package/dist/context/types.d.ts
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context management types
|
|
3
|
-
*/
|
|
4
|
-
import type { NormalizedMessage, NormalizedResponse, AbortedResponse, GenerationConfig, ToolDefinition } from '../types/index.js';
|
|
5
|
-
export interface CacheMarker {
|
|
6
|
-
/** Message ID (from metadata.sourceId) */
|
|
7
|
-
messageId: string;
|
|
8
|
-
/** Index in the message array */
|
|
9
|
-
messageIndex: number;
|
|
10
|
-
/** Estimated tokens up to this point */
|
|
11
|
-
tokenEstimate: number;
|
|
12
|
-
}
|
|
13
|
-
export interface ContextConfig {
|
|
14
|
-
/** Rolling configuration */
|
|
15
|
-
rolling: {
|
|
16
|
-
/** Threshold before roll triggers */
|
|
17
|
-
threshold: number;
|
|
18
|
-
/** Buffer to leave uncached after roll */
|
|
19
|
-
buffer: number;
|
|
20
|
-
/** Grace period before forced roll (optional) */
|
|
21
|
-
grace?: number;
|
|
22
|
-
/** Unit for threshold/buffer/grace (default: 'messages') */
|
|
23
|
-
unit?: 'messages' | 'tokens';
|
|
24
|
-
};
|
|
25
|
-
/** Hard limits (always enforced) */
|
|
26
|
-
limits?: {
|
|
27
|
-
/** Maximum characters (default: 500000) */
|
|
28
|
-
maxCharacters?: number;
|
|
29
|
-
/** Maximum tokens */
|
|
30
|
-
maxTokens?: number;
|
|
31
|
-
/** Maximum messages */
|
|
32
|
-
maxMessages?: number;
|
|
33
|
-
};
|
|
34
|
-
/** Cache settings */
|
|
35
|
-
cache?: {
|
|
36
|
-
/** Enable caching (default: true) */
|
|
37
|
-
enabled?: boolean;
|
|
38
|
-
/** Number of cache points (default: 1, max: 4 for Anthropic) */
|
|
39
|
-
points?: 1 | 2 | 3 | 4;
|
|
40
|
-
/** Minimum tokens before caching (default: 1024) */
|
|
41
|
-
minTokens?: number;
|
|
42
|
-
/** Prefer user messages for cache markers (OpenRouter workaround) */
|
|
43
|
-
preferUserMessages?: boolean;
|
|
44
|
-
};
|
|
45
|
-
/** Custom token estimator (default: chars / 4) */
|
|
46
|
-
tokenEstimator?: (message: NormalizedMessage) => number;
|
|
47
|
-
}
|
|
48
|
-
export interface ContextState {
|
|
49
|
-
/** Current cache markers */
|
|
50
|
-
cacheMarkers: CacheMarker[];
|
|
51
|
-
/** Message IDs in current window (for continuity detection) */
|
|
52
|
-
windowMessageIds: string[];
|
|
53
|
-
/** Messages since last roll */
|
|
54
|
-
messagesSinceRoll: number;
|
|
55
|
-
/** Tokens since last roll */
|
|
56
|
-
tokensSinceRoll: number;
|
|
57
|
-
/** Whether we're in grace period */
|
|
58
|
-
inGracePeriod: boolean;
|
|
59
|
-
/** Last roll timestamp (ISO string) */
|
|
60
|
-
lastRollTime?: string;
|
|
61
|
-
/**
|
|
62
|
-
* First message ID of the cached window.
|
|
63
|
-
*
|
|
64
|
-
* Use this to anchor your message fetch window - fetch from this message ID
|
|
65
|
-
* onwards to ensure cache stability. Only changes when a roll occurs.
|
|
66
|
-
*
|
|
67
|
-
* This helps callers maintain stable fetch windows:
|
|
68
|
-
* - Discord bots can use this as the `after` parameter when fetching messages
|
|
69
|
-
* - Other message sources can use it as a pagination cursor
|
|
70
|
-
*/
|
|
71
|
-
cachedStartMessageId?: string;
|
|
72
|
-
}
|
|
73
|
-
export interface ContextInput {
|
|
74
|
-
/** Conversation messages */
|
|
75
|
-
messages: NormalizedMessage[];
|
|
76
|
-
/** System prompt */
|
|
77
|
-
system?: string;
|
|
78
|
-
/** Tool definitions */
|
|
79
|
-
tools?: ToolDefinition[];
|
|
80
|
-
/** Generation config (model, maxTokens, etc.) */
|
|
81
|
-
config: GenerationConfig;
|
|
82
|
-
/** Context management config */
|
|
83
|
-
context: ContextConfig;
|
|
84
|
-
}
|
|
85
|
-
export interface ContextInfo {
|
|
86
|
-
/** Whether a roll occurred */
|
|
87
|
-
didRoll: boolean;
|
|
88
|
-
/** Number of messages dropped in roll */
|
|
89
|
-
messagesDropped: number;
|
|
90
|
-
/** Number of messages kept */
|
|
91
|
-
messagesKept: number;
|
|
92
|
-
/** Current cache markers */
|
|
93
|
-
cacheMarkers: CacheMarker[];
|
|
94
|
-
/** Estimated cached tokens */
|
|
95
|
-
cachedTokens: number;
|
|
96
|
-
/** Estimated uncached tokens */
|
|
97
|
-
uncachedTokens: number;
|
|
98
|
-
/** Total estimated tokens */
|
|
99
|
-
totalTokens: number;
|
|
100
|
-
/** Whether hard limit was hit */
|
|
101
|
-
hardLimitHit: boolean;
|
|
102
|
-
/**
|
|
103
|
-
* First message ID of the cached window.
|
|
104
|
-
* Useful for callers to anchor their message fetch window.
|
|
105
|
-
*/
|
|
106
|
-
cachedStartMessageId?: string;
|
|
107
|
-
}
|
|
108
|
-
export interface ContextOutput {
|
|
109
|
-
/** The LLM response (may be aborted) */
|
|
110
|
-
response: NormalizedResponse | AbortedResponse;
|
|
111
|
-
/** Updated state (save this for next call) */
|
|
112
|
-
state: ContextState;
|
|
113
|
-
/** Info about what happened */
|
|
114
|
-
info: ContextInfo;
|
|
115
|
-
}
|
|
116
|
-
import type { ToolCall, ToolResult, ToolContext } from '../types/tools.js';
|
|
117
|
-
import type { BasicUsage } from '../types/response.js';
|
|
118
|
-
/**
|
|
119
|
-
* Callback for tool execution within processContext.
|
|
120
|
-
* Return tool results to continue the stream; throw to abort.
|
|
121
|
-
*/
|
|
122
|
-
export type ContextToolCallback = (calls: ToolCall[], context: ToolContext) => Promise<ToolResult[]>;
|
|
123
|
-
/**
|
|
124
|
-
* Callback for pre-tool content notification.
|
|
125
|
-
* Called with content that appeared before tool calls (useful for UI preview).
|
|
126
|
-
*/
|
|
127
|
-
export type ContextPreToolCallback = (content: string) => Promise<void> | void;
|
|
128
|
-
export interface ContextStreamOptions {
|
|
129
|
-
/** Callback for streaming chunks */
|
|
130
|
-
onChunk?: (chunk: string) => void;
|
|
131
|
-
/** Abort signal */
|
|
132
|
-
signal?: AbortSignal;
|
|
133
|
-
/**
|
|
134
|
-
* Called when tool calls are detected; return results to continue.
|
|
135
|
-
* If not provided, tool calls are not executed (stream stops at tool_use).
|
|
136
|
-
*/
|
|
137
|
-
onToolCalls?: ContextToolCallback;
|
|
138
|
-
/**
|
|
139
|
-
* Called with content before tool calls (for UI preview / progressive display).
|
|
140
|
-
*/
|
|
141
|
-
onPreToolContent?: ContextPreToolCallback;
|
|
142
|
-
/**
|
|
143
|
-
* Called with usage updates during streaming.
|
|
144
|
-
*/
|
|
145
|
-
onUsage?: (usage: BasicUsage) => void;
|
|
146
|
-
/**
|
|
147
|
-
* Maximum tool execution depth (default: 10).
|
|
148
|
-
* Prevents infinite tool loops.
|
|
149
|
-
*/
|
|
150
|
-
maxToolDepth?: number;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Create initial empty state
|
|
154
|
-
*/
|
|
155
|
-
export declare function createInitialState(): ContextState;
|
|
156
|
-
/**
|
|
157
|
-
* Default token estimator (chars / 4)
|
|
158
|
-
*/
|
|
159
|
-
export declare function defaultTokenEstimator(message: NormalizedMessage): number;
|
|
160
|
-
/**
|
|
161
|
-
* Default context config
|
|
162
|
-
*/
|
|
163
|
-
export declare const DEFAULT_CONTEXT_CONFIG: ContextConfig;
|
|
164
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/context/types.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Context management types
|
|
3
|
-
*/
|
|
4
|
-
// ============================================================================
|
|
5
|
-
// Helpers
|
|
6
|
-
// ============================================================================
|
|
7
|
-
/**
|
|
8
|
-
* Create initial empty state
|
|
9
|
-
*/
|
|
10
|
-
export function createInitialState() {
|
|
11
|
-
return {
|
|
12
|
-
cacheMarkers: [],
|
|
13
|
-
windowMessageIds: [],
|
|
14
|
-
messagesSinceRoll: 0,
|
|
15
|
-
tokensSinceRoll: 0,
|
|
16
|
-
inGracePeriod: false,
|
|
17
|
-
cachedStartMessageId: undefined,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Default token estimator (chars / 4)
|
|
22
|
-
*/
|
|
23
|
-
export function defaultTokenEstimator(message) {
|
|
24
|
-
let chars = 0;
|
|
25
|
-
for (const block of message.content) {
|
|
26
|
-
if (block.type === 'text') {
|
|
27
|
-
chars += block.text.length;
|
|
28
|
-
}
|
|
29
|
-
else if (block.type === 'tool_result') {
|
|
30
|
-
const content = typeof block.content === 'string'
|
|
31
|
-
? block.content
|
|
32
|
-
: JSON.stringify(block.content);
|
|
33
|
-
chars += content.length;
|
|
34
|
-
}
|
|
35
|
-
else if (block.type === 'image') {
|
|
36
|
-
// Images: ~1500 tokens regardless of size (Anthropic)
|
|
37
|
-
chars += 6000; // 1500 * 4
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return Math.ceil(chars / 4);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Default context config
|
|
44
|
-
*/
|
|
45
|
-
export const DEFAULT_CONTEXT_CONFIG = {
|
|
46
|
-
rolling: {
|
|
47
|
-
threshold: 50,
|
|
48
|
-
buffer: 20,
|
|
49
|
-
unit: 'messages',
|
|
50
|
-
},
|
|
51
|
-
limits: {
|
|
52
|
-
maxCharacters: 500000,
|
|
53
|
-
},
|
|
54
|
-
cache: {
|
|
55
|
-
enabled: true,
|
|
56
|
-
points: 1,
|
|
57
|
-
minTokens: 1024,
|
|
58
|
-
preferUserMessages: true,
|
|
59
|
-
},
|
|
60
|
-
};
|
|
61
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwOH,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,EAAE;QACpB,iBAAiB,EAAE,CAAC;QACpB,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,KAAK;QACpB,oBAAoB,EAAE,SAAS;KAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;gBAC/C,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;QAC1B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,sDAAsD;YACtD,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,OAAO,EAAE;QACP,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,UAAU;KACjB;IACD,MAAM,EAAE;QACN,aAAa,EAAE,MAAM;KACtB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,IAAI;QACf,kBAAkB,EAAE,IAAI;KACzB;CACF,CAAC"}
|