ai.matey.utils 0.2.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/dist/cjs/conversation-history.js +139 -0
- package/dist/cjs/conversation-history.js.map +1 -0
- package/dist/cjs/index.js +42 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/model-cache.js +163 -0
- package/dist/cjs/model-cache.js.map +1 -0
- package/dist/cjs/parameter-normalizer.js +451 -0
- package/dist/cjs/parameter-normalizer.js.map +1 -0
- package/dist/cjs/streaming-modes.js +277 -0
- package/dist/cjs/streaming-modes.js.map +1 -0
- package/dist/cjs/streaming.js +892 -0
- package/dist/cjs/streaming.js.map +1 -0
- package/dist/cjs/structured-output.js +398 -0
- package/dist/cjs/structured-output.js.map +1 -0
- package/dist/cjs/system-message.js +222 -0
- package/dist/cjs/system-message.js.map +1 -0
- package/dist/cjs/validation.js +534 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/cjs/warnings.js +301 -0
- package/dist/cjs/warnings.js.map +1 -0
- package/dist/esm/conversation-history.js +134 -0
- package/dist/esm/conversation-history.js.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/model-cache.js +158 -0
- package/dist/esm/model-cache.js.map +1 -0
- package/dist/esm/parameter-normalizer.js +434 -0
- package/dist/esm/parameter-normalizer.js.map +1 -0
- package/dist/esm/streaming-modes.js +265 -0
- package/dist/esm/streaming-modes.js.map +1 -0
- package/dist/esm/streaming.js +860 -0
- package/dist/esm/streaming.js.map +1 -0
- package/dist/esm/structured-output.js +387 -0
- package/dist/esm/structured-output.js.map +1 -0
- package/dist/esm/system-message.js +213 -0
- package/dist/esm/system-message.js.map +1 -0
- package/dist/esm/validation.js +523 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/esm/warnings.js +284 -0
- package/dist/esm/warnings.js.map +1 -0
- package/dist/types/conversation-history.d.ts +70 -0
- package/dist/types/conversation-history.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/model-cache.d.ts +88 -0
- package/dist/types/model-cache.d.ts.map +1 -0
- package/dist/types/parameter-normalizer.d.ts +154 -0
- package/dist/types/parameter-normalizer.d.ts.map +1 -0
- package/dist/types/streaming-modes.d.ts +139 -0
- package/dist/types/streaming-modes.d.ts.map +1 -0
- package/dist/types/streaming.d.ts +384 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/structured-output.d.ts +157 -0
- package/dist/types/structured-output.d.ts.map +1 -0
- package/dist/types/system-message.d.ts +78 -0
- package/dist/types/system-message.d.ts.map +1 -0
- package/dist/types/validation.d.ts +46 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/warnings.d.ts +149 -0
- package/dist/types/warnings.d.ts.map +1 -0
- package/package.json +75 -0
- package/readme.md +280 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Warning Utilities
|
|
4
|
+
*
|
|
5
|
+
* Helpers for creating, formatting, and managing semantic drift warnings.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createWarning = createWarning;
|
|
11
|
+
exports.createNormalizationWarning = createNormalizationWarning;
|
|
12
|
+
exports.createClampingWarning = createClampingWarning;
|
|
13
|
+
exports.createUnsupportedParameterWarning = createUnsupportedParameterWarning;
|
|
14
|
+
exports.createUnsupportedCapabilityWarning = createUnsupportedCapabilityWarning;
|
|
15
|
+
exports.createTokenLimitWarning = createTokenLimitWarning;
|
|
16
|
+
exports.createStopSequencesTruncatedWarning = createStopSequencesTruncatedWarning;
|
|
17
|
+
exports.mergeWarnings = mergeWarnings;
|
|
18
|
+
exports.filterWarningsBySeverity = filterWarningsBySeverity;
|
|
19
|
+
exports.filterWarningsByCategory = filterWarningsByCategory;
|
|
20
|
+
exports.groupWarningsByCategory = groupWarningsByCategory;
|
|
21
|
+
exports.hasWarning = hasWarning;
|
|
22
|
+
exports.formatWarning = formatWarning;
|
|
23
|
+
exports.formatWarnings = formatWarnings;
|
|
24
|
+
exports.getWarningSummary = getWarningSummary;
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Warning Creation
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Create a warning object.
|
|
30
|
+
*
|
|
31
|
+
* @param category Warning category
|
|
32
|
+
* @param message Human-readable message
|
|
33
|
+
* @param options Additional warning options
|
|
34
|
+
* @returns Warning object
|
|
35
|
+
*/
|
|
36
|
+
function createWarning(category, message, options = {}) {
|
|
37
|
+
return {
|
|
38
|
+
category,
|
|
39
|
+
severity: options.severity ?? 'warning',
|
|
40
|
+
message,
|
|
41
|
+
field: options.field,
|
|
42
|
+
originalValue: options.originalValue,
|
|
43
|
+
transformedValue: options.transformedValue,
|
|
44
|
+
source: options.source,
|
|
45
|
+
details: options.details,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a parameter normalization warning.
|
|
50
|
+
*
|
|
51
|
+
* @param field Parameter field name
|
|
52
|
+
* @param originalValue Original value
|
|
53
|
+
* @param transformedValue Transformed value
|
|
54
|
+
* @param message Optional custom message
|
|
55
|
+
* @param source Source adapter
|
|
56
|
+
* @returns Warning object
|
|
57
|
+
*/
|
|
58
|
+
function createNormalizationWarning(field, originalValue, transformedValue, message, source) {
|
|
59
|
+
return createWarning('parameter-normalized', message ||
|
|
60
|
+
`Parameter '${field}' normalized from ${String(originalValue)} to ${String(transformedValue)}`, {
|
|
61
|
+
severity: 'info',
|
|
62
|
+
field,
|
|
63
|
+
originalValue,
|
|
64
|
+
transformedValue,
|
|
65
|
+
source,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a parameter clamping warning.
|
|
70
|
+
*
|
|
71
|
+
* @param field Parameter field name
|
|
72
|
+
* @param originalValue Original value
|
|
73
|
+
* @param clampedValue Clamped value
|
|
74
|
+
* @param min Minimum allowed value
|
|
75
|
+
* @param max Maximum allowed value
|
|
76
|
+
* @param source Source adapter
|
|
77
|
+
* @returns Warning object
|
|
78
|
+
*/
|
|
79
|
+
function createClampingWarning(field, originalValue, clampedValue, min, max, source) {
|
|
80
|
+
return createWarning('parameter-clamped', `Parameter '${field}' clamped from ${String(originalValue)} to ${String(clampedValue)} (valid range: ${min}-${max})`, {
|
|
81
|
+
severity: 'warning',
|
|
82
|
+
field,
|
|
83
|
+
originalValue,
|
|
84
|
+
transformedValue: clampedValue,
|
|
85
|
+
source,
|
|
86
|
+
details: { min, max },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create an unsupported parameter warning.
|
|
91
|
+
*
|
|
92
|
+
* @param field Parameter field name
|
|
93
|
+
* @param value Parameter value
|
|
94
|
+
* @param source Source adapter
|
|
95
|
+
* @returns Warning object
|
|
96
|
+
*/
|
|
97
|
+
function createUnsupportedParameterWarning(field, value, source) {
|
|
98
|
+
return createWarning('parameter-unsupported', `Parameter '${field}' is not supported by provider (value: ${String(value)})`, {
|
|
99
|
+
severity: 'warning',
|
|
100
|
+
field,
|
|
101
|
+
originalValue: value,
|
|
102
|
+
source,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create a capability unsupported warning.
|
|
107
|
+
*
|
|
108
|
+
* @param capability Capability name
|
|
109
|
+
* @param source Source adapter
|
|
110
|
+
* @returns Warning object
|
|
111
|
+
*/
|
|
112
|
+
function createUnsupportedCapabilityWarning(capability, source) {
|
|
113
|
+
return createWarning('capability-unsupported', `Capability '${capability}' is not supported by provider`, {
|
|
114
|
+
severity: 'warning',
|
|
115
|
+
field: capability,
|
|
116
|
+
source,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a token limit exceeded warning.
|
|
121
|
+
*
|
|
122
|
+
* @param estimatedTokens Estimated token count
|
|
123
|
+
* @param maxTokens Maximum tokens allowed
|
|
124
|
+
* @param source Source adapter
|
|
125
|
+
* @returns Warning object
|
|
126
|
+
*/
|
|
127
|
+
function createTokenLimitWarning(estimatedTokens, maxTokens, source) {
|
|
128
|
+
return createWarning('token-limit-exceeded', `Estimated tokens (${estimatedTokens}) may exceed provider limit (${maxTokens})`, {
|
|
129
|
+
severity: 'warning',
|
|
130
|
+
source,
|
|
131
|
+
details: { estimatedTokens, maxTokens },
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a stop sequences truncated warning.
|
|
136
|
+
*
|
|
137
|
+
* @param originalCount Original number of stop sequences
|
|
138
|
+
* @param maxCount Maximum allowed
|
|
139
|
+
* @param source Source adapter
|
|
140
|
+
* @returns Warning object
|
|
141
|
+
*/
|
|
142
|
+
function createStopSequencesTruncatedWarning(originalCount, maxCount, source) {
|
|
143
|
+
return createWarning('stop-sequences-truncated', `Stop sequences truncated from ${originalCount} to ${maxCount} (provider limit)`, {
|
|
144
|
+
severity: 'warning',
|
|
145
|
+
field: 'stopSequences',
|
|
146
|
+
originalValue: originalCount,
|
|
147
|
+
transformedValue: maxCount,
|
|
148
|
+
source,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Warning Manipulation
|
|
153
|
+
// ============================================================================
|
|
154
|
+
/**
|
|
155
|
+
* Merge warning arrays, removing duplicates.
|
|
156
|
+
*
|
|
157
|
+
* @param warningArrays Arrays of warnings to merge
|
|
158
|
+
* @returns Merged and deduplicated warnings
|
|
159
|
+
*/
|
|
160
|
+
function mergeWarnings(...warningArrays) {
|
|
161
|
+
const warnings = [];
|
|
162
|
+
const seen = new Set();
|
|
163
|
+
for (const array of warningArrays) {
|
|
164
|
+
if (!array) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
for (const warning of array) {
|
|
168
|
+
// Create a key for deduplication
|
|
169
|
+
const key = `${warning.category}:${warning.field}:${warning.message}`;
|
|
170
|
+
if (!seen.has(key)) {
|
|
171
|
+
seen.add(key);
|
|
172
|
+
warnings.push(warning);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return warnings;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Filter warnings by severity.
|
|
180
|
+
*
|
|
181
|
+
* @param warnings Warnings to filter
|
|
182
|
+
* @param minSeverity Minimum severity level
|
|
183
|
+
* @returns Filtered warnings
|
|
184
|
+
*/
|
|
185
|
+
function filterWarningsBySeverity(warnings, minSeverity) {
|
|
186
|
+
const severityOrder = {
|
|
187
|
+
info: 0,
|
|
188
|
+
warning: 1,
|
|
189
|
+
error: 2,
|
|
190
|
+
};
|
|
191
|
+
const minLevel = severityOrder[minSeverity];
|
|
192
|
+
return warnings.filter((w) => severityOrder[w.severity] >= minLevel);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Filter warnings by category.
|
|
196
|
+
*
|
|
197
|
+
* @param warnings Warnings to filter
|
|
198
|
+
* @param categories Categories to include
|
|
199
|
+
* @returns Filtered warnings
|
|
200
|
+
*/
|
|
201
|
+
function filterWarningsByCategory(warnings, categories) {
|
|
202
|
+
const categorySet = new Set(categories);
|
|
203
|
+
return warnings.filter((w) => categorySet.has(w.category));
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Group warnings by category.
|
|
207
|
+
*
|
|
208
|
+
* @param warnings Warnings to group
|
|
209
|
+
* @returns Map of category to warnings
|
|
210
|
+
*/
|
|
211
|
+
function groupWarningsByCategory(warnings) {
|
|
212
|
+
const groups = new Map();
|
|
213
|
+
for (const warning of warnings) {
|
|
214
|
+
const group = groups.get(warning.category) || [];
|
|
215
|
+
group.push(warning);
|
|
216
|
+
groups.set(warning.category, group);
|
|
217
|
+
}
|
|
218
|
+
return groups;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Check if warnings array contains a specific warning type.
|
|
222
|
+
*
|
|
223
|
+
* @param warnings Warnings to check
|
|
224
|
+
* @param category Warning category to look for
|
|
225
|
+
* @param field Optional field name to match
|
|
226
|
+
* @returns true if warning exists
|
|
227
|
+
*/
|
|
228
|
+
function hasWarning(warnings, category, field) {
|
|
229
|
+
if (!warnings) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
return warnings.some((w) => w.category === category && (field === undefined || w.field === field));
|
|
233
|
+
}
|
|
234
|
+
// ============================================================================
|
|
235
|
+
// Warning Formatting
|
|
236
|
+
// ============================================================================
|
|
237
|
+
/**
|
|
238
|
+
* Format a single warning as a string.
|
|
239
|
+
*
|
|
240
|
+
* @param warning Warning to format
|
|
241
|
+
* @param includeDetails Include full details
|
|
242
|
+
* @returns Formatted warning string
|
|
243
|
+
*/
|
|
244
|
+
function formatWarning(warning, includeDetails = false) {
|
|
245
|
+
const prefix = `[${warning.severity.toUpperCase()}]`;
|
|
246
|
+
const source = warning.source ? ` (${warning.source})` : '';
|
|
247
|
+
if (!includeDetails) {
|
|
248
|
+
return `${prefix} ${warning.message}${source}`;
|
|
249
|
+
}
|
|
250
|
+
const parts = [
|
|
251
|
+
`${prefix} ${warning.message}${source}`,
|
|
252
|
+
warning.field ? ` Field: ${warning.field}` : null,
|
|
253
|
+
warning.originalValue !== undefined
|
|
254
|
+
? ` Original: ${JSON.stringify(warning.originalValue)}`
|
|
255
|
+
: null,
|
|
256
|
+
warning.transformedValue !== undefined
|
|
257
|
+
? ` Transformed: ${JSON.stringify(warning.transformedValue)}`
|
|
258
|
+
: null,
|
|
259
|
+
warning.details ? ` Details: ${JSON.stringify(warning.details)}` : null,
|
|
260
|
+
].filter(Boolean);
|
|
261
|
+
return parts.join('\n');
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Format multiple warnings as a string.
|
|
265
|
+
*
|
|
266
|
+
* @param warnings Warnings to format
|
|
267
|
+
* @param includeDetails Include full details
|
|
268
|
+
* @returns Formatted warnings string
|
|
269
|
+
*/
|
|
270
|
+
function formatWarnings(warnings, includeDetails = false) {
|
|
271
|
+
if (warnings.length === 0) {
|
|
272
|
+
return 'No warnings';
|
|
273
|
+
}
|
|
274
|
+
const formatted = warnings.map((w) => formatWarning(w, includeDetails));
|
|
275
|
+
return formatted.join('\n');
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get a summary of warnings by category.
|
|
279
|
+
*
|
|
280
|
+
* @param warnings Warnings to summarize
|
|
281
|
+
* @returns Summary object with counts
|
|
282
|
+
*/
|
|
283
|
+
function getWarningSummary(warnings) {
|
|
284
|
+
const summary = {
|
|
285
|
+
total: warnings.length,
|
|
286
|
+
byCategory: {},
|
|
287
|
+
bySeverity: {
|
|
288
|
+
info: 0,
|
|
289
|
+
warning: 0,
|
|
290
|
+
error: 0,
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
for (const warning of warnings) {
|
|
294
|
+
// Count by category
|
|
295
|
+
summary.byCategory[warning.category] = (summary.byCategory[warning.category] || 0) + 1;
|
|
296
|
+
// Count by severity
|
|
297
|
+
summary.bySeverity[warning.severity]++;
|
|
298
|
+
}
|
|
299
|
+
return summary;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=warnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warnings.js","sourceRoot":"","sources":["../../src/warnings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation History Management Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for managing conversation history with configurable trimming strategies.
|
|
5
|
+
* Used by both middleware and wrappers for consistent history management.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Trim conversation history to keep only the most recent messages.
|
|
11
|
+
*
|
|
12
|
+
* @param history - Current conversation history
|
|
13
|
+
* @param maxHistorySize - Maximum number of message pairs to keep
|
|
14
|
+
* - 0: Return empty array (no history)
|
|
15
|
+
* - -1: Return full history (no trimming)
|
|
16
|
+
* - N > 0: Keep last N user/assistant pairs
|
|
17
|
+
* @param strategy - Trimming strategy
|
|
18
|
+
* - 'fifo': First-in-first-out, remove oldest messages
|
|
19
|
+
* - 'smart': Preserve system messages, trim user/assistant pairs
|
|
20
|
+
* @returns Trimmed history
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const history = [
|
|
25
|
+
* { role: 'system', content: 'You are helpful' },
|
|
26
|
+
* { role: 'user', content: 'Hi' },
|
|
27
|
+
* { role: 'assistant', content: 'Hello!' },
|
|
28
|
+
* { role: 'user', content: 'How are you?' },
|
|
29
|
+
* { role: 'assistant', content: 'I am well!' },
|
|
30
|
+
* ];
|
|
31
|
+
*
|
|
32
|
+
* // Keep last 1 pair + system message
|
|
33
|
+
* const trimmed = trimHistory(history, 1, 'smart');
|
|
34
|
+
* // Result: system message + last user/assistant pair
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function trimHistory(history, maxHistorySize, strategy = 'fifo') {
|
|
38
|
+
// No history
|
|
39
|
+
if (maxHistorySize === 0) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
// Unlimited history
|
|
43
|
+
if (maxHistorySize < 0) {
|
|
44
|
+
return Array.from(history);
|
|
45
|
+
}
|
|
46
|
+
// No trimming needed
|
|
47
|
+
if (history.length === 0) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
if (strategy === 'smart') {
|
|
51
|
+
return trimHistorySmart(history, maxHistorySize);
|
|
52
|
+
}
|
|
53
|
+
// FIFO strategy: keep last N pairs (2N messages)
|
|
54
|
+
return trimHistoryFifo(history, maxHistorySize);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* FIFO trimming: Keep last N message pairs
|
|
58
|
+
*/
|
|
59
|
+
function trimHistoryFifo(history, maxPairs) {
|
|
60
|
+
const maxMessages = maxPairs * 2;
|
|
61
|
+
if (history.length <= maxMessages) {
|
|
62
|
+
return Array.from(history);
|
|
63
|
+
}
|
|
64
|
+
// Keep last 2N messages
|
|
65
|
+
return Array.from(history.slice(-maxMessages));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Smart trimming: Preserve system messages, trim user/assistant pairs
|
|
69
|
+
*/
|
|
70
|
+
function trimHistorySmart(history, maxPairs) {
|
|
71
|
+
// Separate system messages from conversation
|
|
72
|
+
const systemMessages = [];
|
|
73
|
+
const conversationMessages = [];
|
|
74
|
+
for (const message of history) {
|
|
75
|
+
if (message.role === 'system') {
|
|
76
|
+
systemMessages.push(message);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
conversationMessages.push(message);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Trim conversation to last N pairs
|
|
83
|
+
const maxConversationMessages = maxPairs * 2;
|
|
84
|
+
const trimmedConversation = conversationMessages.length <= maxConversationMessages
|
|
85
|
+
? conversationMessages
|
|
86
|
+
: conversationMessages.slice(-maxConversationMessages);
|
|
87
|
+
// Combine: system messages first, then conversation
|
|
88
|
+
return [...systemMessages, ...trimmedConversation];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Count message pairs in history (excluding system messages)
|
|
92
|
+
*
|
|
93
|
+
* @param history - Conversation history
|
|
94
|
+
* @returns Number of user/assistant pairs
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const history = [
|
|
99
|
+
* { role: 'system', content: 'You are helpful' },
|
|
100
|
+
* { role: 'user', content: 'Hi' },
|
|
101
|
+
* { role: 'assistant', content: 'Hello!' },
|
|
102
|
+
* ];
|
|
103
|
+
*
|
|
104
|
+
* countMessagePairs(history); // 1
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export function countMessagePairs(history) {
|
|
108
|
+
const nonSystemMessages = history.filter((m) => m.role !== 'system');
|
|
109
|
+
return Math.floor(nonSystemMessages.length / 2);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if history needs trimming
|
|
113
|
+
*
|
|
114
|
+
* @param history - Current history
|
|
115
|
+
* @param maxHistorySize - Maximum pairs to keep
|
|
116
|
+
* @param strategy - Trimming strategy
|
|
117
|
+
* @returns True if history exceeds limit
|
|
118
|
+
*/
|
|
119
|
+
export function shouldTrimHistory(history, maxHistorySize, strategy = 'fifo') {
|
|
120
|
+
if (maxHistorySize === 0) {
|
|
121
|
+
return history.length > 0;
|
|
122
|
+
}
|
|
123
|
+
if (maxHistorySize < 0) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
if (strategy === 'smart') {
|
|
127
|
+
const pairs = countMessagePairs(history);
|
|
128
|
+
return pairs > maxHistorySize;
|
|
129
|
+
}
|
|
130
|
+
// FIFO: check total message count
|
|
131
|
+
const maxMessages = maxHistorySize * 2;
|
|
132
|
+
return history.length > maxMessages;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=conversation-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-history.js","sourceRoot":"","sources":["../../src/conversation-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility Functions
|
|
3
|
+
*
|
|
4
|
+
* Collection of utility functions for validation, normalization, and streaming.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
// Validation utilities
|
|
9
|
+
export * from './validation.js';
|
|
10
|
+
// System message utilities
|
|
11
|
+
export * from './system-message.js';
|
|
12
|
+
// Parameter normalization utilities
|
|
13
|
+
export * from './parameter-normalizer.js';
|
|
14
|
+
// Streaming utilities
|
|
15
|
+
export * from './streaming.js';
|
|
16
|
+
// Streaming mode conversion utilities
|
|
17
|
+
export * from './streaming-modes.js';
|
|
18
|
+
// Warning utilities
|
|
19
|
+
export * from './warnings.js';
|
|
20
|
+
// Conversation history utilities
|
|
21
|
+
export * from './conversation-history.js';
|
|
22
|
+
// Model cache utilities
|
|
23
|
+
export * from './model-cache.js';
|
|
24
|
+
// Structured output utilities (Zod integration)
|
|
25
|
+
export * from './structured-output.js';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uBAAuB;AACvB,cAAc,iBAAiB,CAAC;AAEhC,2BAA2B;AAC3B,cAAc,qBAAqB,CAAC;AAEpC,oCAAoC;AACpC,cAAc,2BAA2B,CAAC;AAE1C,sBAAsB;AACtB,cAAc,gBAAgB,CAAC;AAE/B,sCAAsC;AACtC,cAAc,sBAAsB,CAAC;AAErC,oBAAoB;AACpB,cAAc,eAAe,CAAC;AAE9B,iCAAiC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,wBAAwB;AACxB,cAAc,kBAAkB,CAAC;AAEjC,gDAAgD;AAChD,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Cache
|
|
3
|
+
*
|
|
4
|
+
* In-memory caching for model lists to reduce API calls.
|
|
5
|
+
* Supports both global (shared) and instance-scoped caches.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Model Cache Implementation
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* In-memory cache for model lists with TTL-based expiration.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const cache = new ModelCache();
|
|
18
|
+
*
|
|
19
|
+
* // Set with 1 hour TTL
|
|
20
|
+
* cache.set('openai-backend', modelResult, 3600000);
|
|
21
|
+
*
|
|
22
|
+
* // Get (returns null if expired or not found)
|
|
23
|
+
* const cached = cache.get('openai-backend');
|
|
24
|
+
*
|
|
25
|
+
* // Invalidate specific backend
|
|
26
|
+
* cache.invalidate('openai-backend');
|
|
27
|
+
*
|
|
28
|
+
* // Clear all
|
|
29
|
+
* cache.clear();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class ModelCache {
|
|
33
|
+
cache;
|
|
34
|
+
constructor() {
|
|
35
|
+
this.cache = new Map();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get cached model list for a backend.
|
|
39
|
+
*
|
|
40
|
+
* @param backendName Unique backend identifier
|
|
41
|
+
* @returns Cached result or null if not found/expired
|
|
42
|
+
*/
|
|
43
|
+
get(backendName) {
|
|
44
|
+
const entry = this.cache.get(backendName);
|
|
45
|
+
if (!entry) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// Check if expired
|
|
49
|
+
if (Date.now() > entry.expiresAt) {
|
|
50
|
+
this.cache.delete(backendName);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// Return cached result with updated source
|
|
54
|
+
return {
|
|
55
|
+
...entry.result,
|
|
56
|
+
source: 'cache',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Cache a model list result.
|
|
61
|
+
*
|
|
62
|
+
* @param backendName Unique backend identifier
|
|
63
|
+
* @param result Model list result to cache
|
|
64
|
+
* @param ttl Time to live in milliseconds
|
|
65
|
+
*/
|
|
66
|
+
set(backendName, result, ttl) {
|
|
67
|
+
const expiresAt = Date.now() + ttl;
|
|
68
|
+
this.cache.set(backendName, {
|
|
69
|
+
result,
|
|
70
|
+
expiresAt,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if backend has cached models.
|
|
75
|
+
*
|
|
76
|
+
* @param backendName Unique backend identifier
|
|
77
|
+
* @returns true if cache exists and not expired
|
|
78
|
+
*/
|
|
79
|
+
has(backendName) {
|
|
80
|
+
return this.get(backendName) !== null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Invalidate (remove) cached models for a backend.
|
|
84
|
+
*
|
|
85
|
+
* @param backendName Unique backend identifier
|
|
86
|
+
*/
|
|
87
|
+
invalidate(backendName) {
|
|
88
|
+
this.cache.delete(backendName);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Clear all cached model lists.
|
|
92
|
+
*/
|
|
93
|
+
clear() {
|
|
94
|
+
this.cache.clear();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get number of cached backends.
|
|
98
|
+
*/
|
|
99
|
+
size() {
|
|
100
|
+
// Count only non-expired entries
|
|
101
|
+
let count = 0;
|
|
102
|
+
const now = Date.now();
|
|
103
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
104
|
+
if (now <= entry.expiresAt) {
|
|
105
|
+
count++;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Clean up expired entry
|
|
109
|
+
this.cache.delete(key);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return count;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get all cached backend names (excluding expired).
|
|
116
|
+
*/
|
|
117
|
+
keys() {
|
|
118
|
+
const keys = [];
|
|
119
|
+
const now = Date.now();
|
|
120
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
121
|
+
if (now <= entry.expiresAt) {
|
|
122
|
+
keys.push(key);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Clean up expired entry
|
|
126
|
+
this.cache.delete(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return keys;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Global Cache Instance
|
|
134
|
+
// ============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* Global model cache shared across all adapter instances.
|
|
137
|
+
*
|
|
138
|
+
* This is the default cache used when `modelsCacheScope: 'global'`.
|
|
139
|
+
* Reduces redundant API calls when multiple adapters share the same backend.
|
|
140
|
+
*/
|
|
141
|
+
export const globalModelCache = new ModelCache();
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Cache Factory
|
|
144
|
+
// ============================================================================
|
|
145
|
+
/**
|
|
146
|
+
* Create or get model cache based on scope strategy.
|
|
147
|
+
*
|
|
148
|
+
* @param scope Cache scope strategy
|
|
149
|
+
* @returns Model cache instance
|
|
150
|
+
*/
|
|
151
|
+
export function getModelCache(scope = 'global') {
|
|
152
|
+
if (scope === 'global') {
|
|
153
|
+
return globalModelCache;
|
|
154
|
+
}
|
|
155
|
+
// Create new instance-scoped cache
|
|
156
|
+
return new ModelCache();
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=model-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/model-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,UAAU;IACb,KAAK,CAA0B;IAEvC;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,WAAmB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,OAAO;YACL,GAAG,KAAK,CAAC,MAAM;YACf,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,WAAmB,EAAE,MAAwB,EAAE,GAAW;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;QAEnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;YAC1B,MAAM;YACN,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,WAAmB;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,WAAmB;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,iCAAiC;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC3B,KAAK,EAAE,CAAC;YACV,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,IAAI;QACF,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,UAAU,EAAE,CAAC;AAEjD,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAA+B,QAAQ;IACnE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,mCAAmC;IACnC,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC"}
|