ai.matey.middleware 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/caching.js +226 -0
- package/dist/cjs/caching.js.map +1 -0
- package/dist/cjs/conversation-history.js +213 -0
- package/dist/cjs/conversation-history.js.map +1 -0
- package/dist/cjs/cost-tracking.js +355 -0
- package/dist/cjs/cost-tracking.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logging.js +174 -0
- package/dist/cjs/logging.js.map +1 -0
- package/dist/cjs/opentelemetry.js +499 -0
- package/dist/cjs/opentelemetry.js.map +1 -0
- package/dist/cjs/retry.js +205 -0
- package/dist/cjs/retry.js.map +1 -0
- package/dist/cjs/security.js +175 -0
- package/dist/cjs/security.js.map +1 -0
- package/dist/cjs/telemetry.js +216 -0
- package/dist/cjs/telemetry.js.map +1 -0
- package/dist/cjs/transform.js +284 -0
- package/dist/cjs/transform.js.map +1 -0
- package/dist/cjs/validation.js +506 -0
- package/dist/cjs/validation.js.map +1 -0
- package/dist/esm/caching.js +221 -0
- package/dist/esm/caching.js.map +1 -0
- package/dist/esm/conversation-history.js +207 -0
- package/dist/esm/conversation-history.js.map +1 -0
- package/dist/esm/cost-tracking.js +347 -0
- package/dist/esm/cost-tracking.js.map +1 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logging.js +171 -0
- package/dist/esm/logging.js.map +1 -0
- package/dist/esm/opentelemetry.js +458 -0
- package/dist/esm/opentelemetry.js.map +1 -0
- package/dist/esm/retry.js +198 -0
- package/dist/esm/retry.js.map +1 -0
- package/dist/esm/security.js +169 -0
- package/dist/esm/security.js.map +1 -0
- package/dist/esm/telemetry.js +210 -0
- package/dist/esm/telemetry.js.map +1 -0
- package/dist/esm/transform.js +272 -0
- package/dist/esm/transform.js.map +1 -0
- package/dist/esm/validation.js +494 -0
- package/dist/esm/validation.js.map +1 -0
- package/dist/types/caching.d.ts +98 -0
- package/dist/types/caching.d.ts.map +1 -0
- package/dist/types/conversation-history.d.ts +188 -0
- package/dist/types/conversation-history.d.ts.map +1 -0
- package/dist/types/cost-tracking.d.ts +262 -0
- package/dist/types/cost-tracking.d.ts.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logging.d.ts +82 -0
- package/dist/types/logging.d.ts.map +1 -0
- package/dist/types/opentelemetry.d.ts +219 -0
- package/dist/types/opentelemetry.d.ts.map +1 -0
- package/dist/types/retry.d.ts +86 -0
- package/dist/types/retry.d.ts.map +1 -0
- package/dist/types/security.d.ts +120 -0
- package/dist/types/security.d.ts.map +1 -0
- package/dist/types/telemetry.d.ts +120 -0
- package/dist/types/telemetry.d.ts.map +1 -0
- package/dist/types/transform.d.ts +184 -0
- package/dist/types/transform.d.ts.map +1 -0
- package/dist/types/validation.d.ts +356 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/package.json +203 -0
- package/readme.md +103 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Transform Middleware
|
|
4
|
+
*
|
|
5
|
+
* Transforms requests and responses with custom functions.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createTransformMiddleware = createTransformMiddleware;
|
|
11
|
+
exports.createPromptRewriter = createPromptRewriter;
|
|
12
|
+
exports.createParameterModifier = createParameterModifier;
|
|
13
|
+
exports.createResponseFilter = createResponseFilter;
|
|
14
|
+
exports.createSystemMessageInjector = createSystemMessageInjector;
|
|
15
|
+
exports.createMessageFilter = createMessageFilter;
|
|
16
|
+
exports.createContentSanitizer = createContentSanitizer;
|
|
17
|
+
exports.composeRequestTransformers = composeRequestTransformers;
|
|
18
|
+
exports.composeResponseTransformers = composeResponseTransformers;
|
|
19
|
+
exports.composeMessageTransformers = composeMessageTransformers;
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Middleware Factory
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Create transform middleware.
|
|
25
|
+
*
|
|
26
|
+
* Applies custom transformations to requests and responses.
|
|
27
|
+
*
|
|
28
|
+
* @param config Transform configuration
|
|
29
|
+
* @returns Transform middleware
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // Add system message prefix
|
|
34
|
+
* const transform = createTransformMiddleware({
|
|
35
|
+
* transformRequest: (request) => ({
|
|
36
|
+
* ...request,
|
|
37
|
+
* messages: [
|
|
38
|
+
* { role: 'system', content: 'You are helpful.' },
|
|
39
|
+
* ...request.messages
|
|
40
|
+
* ]
|
|
41
|
+
* })
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* bridge.use(transform);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
function createTransformMiddleware(config = {}) {
|
|
48
|
+
const { transformRequest, transformResponse, transformMessages } = config;
|
|
49
|
+
return async (context, next) => {
|
|
50
|
+
let request = context.request;
|
|
51
|
+
// Apply message transformations
|
|
52
|
+
if (transformMessages) {
|
|
53
|
+
const transformedMessages = await Promise.all(request.messages.map((msg) => Promise.resolve(transformMessages(msg))));
|
|
54
|
+
request = {
|
|
55
|
+
...request,
|
|
56
|
+
messages: transformedMessages,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Apply request transformation
|
|
60
|
+
if (transformRequest) {
|
|
61
|
+
request = await transformRequest(request);
|
|
62
|
+
}
|
|
63
|
+
// Update context with transformed request
|
|
64
|
+
context.request = request;
|
|
65
|
+
// Call next middleware/handler
|
|
66
|
+
let response = await next();
|
|
67
|
+
// Apply response transformation
|
|
68
|
+
if (transformResponse) {
|
|
69
|
+
response = await transformResponse(response);
|
|
70
|
+
}
|
|
71
|
+
return response;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// Built-in Transformers
|
|
76
|
+
// ============================================================================
|
|
77
|
+
/**
|
|
78
|
+
* Create a prompt rewriting transformer.
|
|
79
|
+
*
|
|
80
|
+
* @param rewriter Function to rewrite prompt text
|
|
81
|
+
* @returns Message transformer
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* const transformer = createPromptRewriter((text) => {
|
|
86
|
+
* return text.replace(/foo/g, 'bar');
|
|
87
|
+
* });
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
function createPromptRewriter(rewriter) {
|
|
91
|
+
return async (message) => {
|
|
92
|
+
// Only transform text content
|
|
93
|
+
if (typeof message.content === 'string') {
|
|
94
|
+
return {
|
|
95
|
+
...message,
|
|
96
|
+
content: await rewriter(message.content),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Transform text in content blocks
|
|
100
|
+
if (Array.isArray(message.content)) {
|
|
101
|
+
const transformedContent = await Promise.all(message.content.map(async (block) => {
|
|
102
|
+
if (block.type === 'text') {
|
|
103
|
+
return {
|
|
104
|
+
...block,
|
|
105
|
+
text: await rewriter(block.text),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return block;
|
|
109
|
+
}));
|
|
110
|
+
return {
|
|
111
|
+
...message,
|
|
112
|
+
content: transformedContent,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return message;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a parameter modifier transformer.
|
|
120
|
+
*
|
|
121
|
+
* @param modifier Function to modify parameters
|
|
122
|
+
* @returns Request transformer
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const transformer = createParameterModifier((params) => ({
|
|
127
|
+
* ...params,
|
|
128
|
+
* temperature: Math.min(params.temperature ?? 0.7, 0.9)
|
|
129
|
+
* }));
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
function createParameterModifier(modifier) {
|
|
133
|
+
return async (request) => {
|
|
134
|
+
return {
|
|
135
|
+
...request,
|
|
136
|
+
parameters: await modifier(request.parameters),
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create a response filter transformer.
|
|
142
|
+
*
|
|
143
|
+
* @param filter Function to filter/modify response
|
|
144
|
+
* @returns Response transformer
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* const transformer = createResponseFilter((response) => {
|
|
149
|
+
* // Remove custom metadata
|
|
150
|
+
* const { custom, ...metadata } = response.metadata;
|
|
151
|
+
* return { ...response, metadata };
|
|
152
|
+
* });
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
function createResponseFilter(filter) {
|
|
156
|
+
return filter;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Create a system message injector.
|
|
160
|
+
*
|
|
161
|
+
* @param systemMessage System message to inject
|
|
162
|
+
* @param position Where to inject ('start' or 'end')
|
|
163
|
+
* @returns Request transformer
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* const transformer = createSystemMessageInjector(
|
|
168
|
+
* 'You are a helpful assistant.',
|
|
169
|
+
* 'start'
|
|
170
|
+
* );
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
function createSystemMessageInjector(systemMessage, position = 'start') {
|
|
174
|
+
return (request) => {
|
|
175
|
+
const systemMsg = {
|
|
176
|
+
role: 'system',
|
|
177
|
+
content: systemMessage,
|
|
178
|
+
};
|
|
179
|
+
const messages = position === 'start' ? [systemMsg, ...request.messages] : [...request.messages, systemMsg];
|
|
180
|
+
return {
|
|
181
|
+
...request,
|
|
182
|
+
messages,
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a message filter transformer.
|
|
188
|
+
*
|
|
189
|
+
* @param predicate Function to determine if message should be kept
|
|
190
|
+
* @returns Request transformer
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```typescript
|
|
194
|
+
* // Remove all system messages
|
|
195
|
+
* const transformer = createMessageFilter(
|
|
196
|
+
* (msg) => msg.role !== 'system'
|
|
197
|
+
* );
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
function createMessageFilter(predicate) {
|
|
201
|
+
return async (request) => {
|
|
202
|
+
const filteredMessages = [];
|
|
203
|
+
for (const message of request.messages) {
|
|
204
|
+
if (await predicate(message)) {
|
|
205
|
+
filteredMessages.push(message);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
...request,
|
|
210
|
+
messages: filteredMessages,
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Create a content sanitizer transformer.
|
|
216
|
+
*
|
|
217
|
+
* @param sanitizer Function to sanitize message content
|
|
218
|
+
* @returns Message transformer
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* // Remove sensitive data
|
|
223
|
+
* const transformer = createContentSanitizer((text) => {
|
|
224
|
+
* return text.replace(/\b\d{3}-\d{2}-\d{4}\b/g, '[SSN]');
|
|
225
|
+
* });
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
function createContentSanitizer(sanitizer) {
|
|
229
|
+
return createPromptRewriter(sanitizer);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Compose multiple request transformers.
|
|
233
|
+
*
|
|
234
|
+
* @param transformers Request transformers to compose
|
|
235
|
+
* @returns Composed request transformer
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```typescript
|
|
239
|
+
* const composed = composeRequestTransformers(
|
|
240
|
+
* createSystemMessageInjector('Be helpful'),
|
|
241
|
+
* createParameterModifier(params => ({ ...params, temperature: 0.7 }))
|
|
242
|
+
* );
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
function composeRequestTransformers(...transformers) {
|
|
246
|
+
return async (request) => {
|
|
247
|
+
let result = request;
|
|
248
|
+
for (const transformer of transformers) {
|
|
249
|
+
result = await transformer(result);
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Compose multiple response transformers.
|
|
256
|
+
*
|
|
257
|
+
* @param transformers Response transformers to compose
|
|
258
|
+
* @returns Composed response transformer
|
|
259
|
+
*/
|
|
260
|
+
function composeResponseTransformers(...transformers) {
|
|
261
|
+
return async (response) => {
|
|
262
|
+
let result = response;
|
|
263
|
+
for (const transformer of transformers) {
|
|
264
|
+
result = await transformer(result);
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Compose multiple message transformers.
|
|
271
|
+
*
|
|
272
|
+
* @param transformers Message transformers to compose
|
|
273
|
+
* @returns Composed message transformer
|
|
274
|
+
*/
|
|
275
|
+
function composeMessageTransformers(...transformers) {
|
|
276
|
+
return async (message) => {
|
|
277
|
+
let result = message;
|
|
278
|
+
for (const transformer of transformers) {
|
|
279
|
+
result = await transformer(result);
|
|
280
|
+
}
|
|
281
|
+
return result;
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/transform.ts"],"names":[],"mappings":"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"}
|