@jterrazz/intelligence 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -268
- package/dist/index.cjs +656 -2017
- package/dist/index.d.ts +5 -15
- package/dist/index.js +5 -33
- package/dist/index.js.map +1 -1
- package/dist/middleware/__tests__/logging.middleware.test.js +390 -0
- package/dist/middleware/__tests__/logging.middleware.test.js.map +1 -0
- package/dist/middleware/logging.middleware.d.ts +21 -0
- package/dist/middleware/logging.middleware.js +296 -0
- package/dist/middleware/logging.middleware.js.map +1 -0
- package/dist/parsing/__tests__/create-schema-prompt.test.js +53 -0
- package/dist/parsing/__tests__/create-schema-prompt.test.js.map +1 -0
- package/dist/parsing/__tests__/parse-object.test.d.ts +1 -0
- package/dist/parsing/__tests__/parse-object.test.js +193 -0
- package/dist/parsing/__tests__/parse-object.test.js.map +1 -0
- package/dist/parsing/__tests__/parse-text.test.d.ts +1 -0
- package/dist/parsing/__tests__/parse-text.test.js +159 -0
- package/dist/parsing/__tests__/parse-text.test.js.map +1 -0
- package/dist/parsing/create-schema-prompt.d.ts +28 -0
- package/dist/parsing/create-schema-prompt.js +42 -0
- package/dist/parsing/create-schema-prompt.js.map +1 -0
- package/dist/parsing/parse-object.d.ts +33 -0
- package/dist/parsing/parse-object.js +360 -0
- package/dist/parsing/parse-object.js.map +1 -0
- package/dist/parsing/parse-text.d.ts +14 -0
- package/dist/parsing/parse-text.js +80 -0
- package/dist/parsing/parse-text.js.map +1 -0
- package/dist/providers/openrouter.provider.d.ts +36 -0
- package/dist/providers/openrouter.provider.js +58 -0
- package/dist/providers/openrouter.provider.js.map +1 -0
- package/package.json +14 -15
- package/dist/adapters/agents/chat-agent.adapter.d.ts +0 -27
- package/dist/adapters/agents/chat-agent.adapter.js +0 -356
- package/dist/adapters/agents/chat-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/resilient-agent.adapter.d.ts +0 -20
- package/dist/adapters/agents/resilient-agent.adapter.js +0 -263
- package/dist/adapters/agents/resilient-agent.adapter.js.map +0 -1
- package/dist/adapters/agents/tool-agent.adapter.d.ts +0 -30
- package/dist/adapters/agents/tool-agent.adapter.js +0 -400
- package/dist/adapters/agents/tool-agent.adapter.js.map +0 -1
- package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -23
- package/dist/adapters/models/openrouter-model.adapter.js +0 -148
- package/dist/adapters/models/openrouter-model.adapter.js.map +0 -1
- package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +0 -120
- package/dist/adapters/prompts/__tests__/presets.test.js +0 -31
- package/dist/adapters/prompts/__tests__/presets.test.js.map +0 -1
- package/dist/adapters/prompts/library/categories/domain.d.ts +0 -11
- package/dist/adapters/prompts/library/categories/domain.js +0 -12
- package/dist/adapters/prompts/library/categories/domain.js.map +0 -1
- package/dist/adapters/prompts/library/categories/format.d.ts +0 -10
- package/dist/adapters/prompts/library/categories/format.js +0 -11
- package/dist/adapters/prompts/library/categories/format.js.map +0 -1
- package/dist/adapters/prompts/library/categories/foundations.d.ts +0 -12
- package/dist/adapters/prompts/library/categories/foundations.js +0 -13
- package/dist/adapters/prompts/library/categories/foundations.js.map +0 -1
- package/dist/adapters/prompts/library/categories/language.d.ts +0 -11
- package/dist/adapters/prompts/library/categories/language.js +0 -12
- package/dist/adapters/prompts/library/categories/language.js.map +0 -1
- package/dist/adapters/prompts/library/categories/persona.d.ts +0 -13
- package/dist/adapters/prompts/library/categories/persona.js +0 -14
- package/dist/adapters/prompts/library/categories/persona.js.map +0 -1
- package/dist/adapters/prompts/library/categories/response.d.ts +0 -9
- package/dist/adapters/prompts/library/categories/response.js +0 -10
- package/dist/adapters/prompts/library/categories/response.js.map +0 -1
- package/dist/adapters/prompts/library/categories/tone.d.ts +0 -9
- package/dist/adapters/prompts/library/categories/tone.js +0 -10
- package/dist/adapters/prompts/library/categories/tone.js.map +0 -1
- package/dist/adapters/prompts/library/categories/verbosity.d.ts +0 -8
- package/dist/adapters/prompts/library/categories/verbosity.js +0 -9
- package/dist/adapters/prompts/library/categories/verbosity.js.map +0 -1
- package/dist/adapters/prompts/library/index.d.ts +0 -68
- package/dist/adapters/prompts/library/index.js +0 -26
- package/dist/adapters/prompts/library/index.js.map +0 -1
- package/dist/adapters/prompts/library/presets.d.ts +0 -17
- package/dist/adapters/prompts/library/presets.js +0 -45
- package/dist/adapters/prompts/library/presets.js.map +0 -1
- package/dist/adapters/prompts/system-prompt.adapter.d.ts +0 -9
- package/dist/adapters/prompts/system-prompt.adapter.js +0 -57
- package/dist/adapters/prompts/system-prompt.adapter.js.map +0 -1
- package/dist/adapters/prompts/user-prompt.adapter.d.ts +0 -9
- package/dist/adapters/prompts/user-prompt.adapter.js +0 -57
- package/dist/adapters/prompts/user-prompt.adapter.js.map +0 -1
- package/dist/adapters/providers/openrouter-provider.adapter.d.ts +0 -34
- package/dist/adapters/providers/openrouter-provider.adapter.js +0 -57
- package/dist/adapters/providers/openrouter-provider.adapter.js.map +0 -1
- package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
- package/dist/adapters/tools/safe-tool.adapter.js +0 -283
- package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
- package/dist/adapters/utils/__tests__/structured-response-parser.test.js +0 -289
- package/dist/adapters/utils/__tests__/structured-response-parser.test.js.map +0 -1
- package/dist/adapters/utils/structured-response-parser-error.d.ts +0 -8
- package/dist/adapters/utils/structured-response-parser-error.js +0 -136
- package/dist/adapters/utils/structured-response-parser-error.js.map +0 -1
- package/dist/adapters/utils/structured-response-parser.d.ts +0 -60
- package/dist/adapters/utils/structured-response-parser.js +0 -347
- package/dist/adapters/utils/structured-response-parser.js.map +0 -1
- package/dist/ports/agent.port.d.ts +0 -17
- package/dist/ports/agent.port.js +0 -7
- package/dist/ports/agent.port.js.map +0 -1
- package/dist/ports/model.port.d.ts +0 -37
- package/dist/ports/model.port.js +0 -5
- package/dist/ports/model.port.js.map +0 -1
- package/dist/ports/prompt.port.d.ts +0 -9
- package/dist/ports/prompt.port.js +0 -5
- package/dist/ports/prompt.port.js.map +0 -1
- package/dist/ports/provider.port.d.ts +0 -13
- package/dist/ports/provider.port.js +0 -5
- package/dist/ports/provider.port.js.map +0 -1
- package/dist/ports/tool.port.d.ts +0 -11
- package/dist/ports/tool.port.js +0 -5
- package/dist/ports/tool.port.js.map +0 -1
- /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
- /package/dist/{adapters/utils/__tests__/structured-response-parser.test.d.ts → parsing/__tests__/create-schema-prompt.test.d.ts} +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export { SystemPrompt } from './adapters/prompts/system-prompt.adapter.js';
|
|
7
|
-
export { UserPrompt } from './adapters/prompts/user-prompt.adapter.js';
|
|
8
|
-
export { type OpenRouterConfig, type OpenRouterMetadata, OpenRouterProvider, } from './adapters/providers/openrouter-provider.adapter.js';
|
|
9
|
-
export { SafeTool } from './adapters/tools/safe-tool.adapter.js';
|
|
10
|
-
export { StructuredResponseParser } from './adapters/utils/structured-response-parser.js';
|
|
11
|
-
export * from './ports/agent.port.js';
|
|
12
|
-
export * from './ports/model.port.js';
|
|
13
|
-
export * from './ports/prompt.port.js';
|
|
14
|
-
export * from './ports/provider.port.js';
|
|
15
|
-
export * from './ports/tool.port.js';
|
|
1
|
+
export { createLoggingMiddleware, type LoggingMiddlewareOptions, } from './middleware/logging.middleware.js';
|
|
2
|
+
export { createSchemaPrompt } from './parsing/create-schema-prompt.js';
|
|
3
|
+
export { parseObject, ParseObjectError } from './parsing/parse-object.js';
|
|
4
|
+
export { parseText, type ParseTextOptions } from './parsing/parse-text.js';
|
|
5
|
+
export { createOpenRouterProvider, type ModelOptions, type OpenRouterConfig, type OpenRouterMetadata, type OpenRouterProvider, } from './providers/openrouter.provider.js';
|
package/dist/index.js
CHANGED
|
@@ -1,35 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export { ToolAgent } from './adapters/agents/tool-agent.adapter.js';
|
|
7
|
-
// =============================================================================
|
|
8
|
-
// MODEL PROVIDERS
|
|
9
|
-
// =============================================================================
|
|
10
|
-
export { OpenRouterModel } from './adapters/models/openrouter-model.adapter.js';
|
|
11
|
-
export { PROMPT_LIBRARY as PROMPTS } from './adapters/prompts/library/index.js';
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// PROMPTS
|
|
14
|
-
// =============================================================================
|
|
15
|
-
export { SystemPrompt } from './adapters/prompts/system-prompt.adapter.js';
|
|
16
|
-
export { UserPrompt } from './adapters/prompts/user-prompt.adapter.js';
|
|
17
|
-
export { OpenRouterProvider } from './adapters/providers/openrouter-provider.adapter.js';
|
|
18
|
-
// =============================================================================
|
|
19
|
-
// TOOLS
|
|
20
|
-
// =============================================================================
|
|
21
|
-
export { SafeTool } from './adapters/tools/safe-tool.adapter.js';
|
|
22
|
-
// =============================================================================
|
|
23
|
-
// UTILITIES
|
|
24
|
-
// =============================================================================
|
|
25
|
-
export { StructuredResponseParser } from './adapters/utils/structured-response-parser.js';
|
|
26
|
-
// =============================================================================
|
|
27
|
-
// PORTS (Interfaces)
|
|
28
|
-
// =============================================================================
|
|
29
|
-
export * from './ports/agent.port.js';
|
|
30
|
-
export * from './ports/model.port.js';
|
|
31
|
-
export * from './ports/prompt.port.js';
|
|
32
|
-
export * from './ports/provider.port.js';
|
|
33
|
-
export * from './ports/tool.port.js';
|
|
1
|
+
export { createLoggingMiddleware } from './middleware/logging.middleware.js';
|
|
2
|
+
export { createSchemaPrompt } from './parsing/create-schema-prompt.js';
|
|
3
|
+
export { parseObject, ParseObjectError } from './parsing/parse-object.js';
|
|
4
|
+
export { parseText } from './parsing/parse-text.js';
|
|
5
|
+
export { createOpenRouterProvider } from './providers/openrouter.provider.js';
|
|
34
6
|
|
|
35
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n createLoggingMiddleware,\n type LoggingMiddlewareOptions,\n} from './middleware/logging.middleware.js';\nexport { createSchemaPrompt } from './parsing/create-schema-prompt.js';\nexport { parseObject, ParseObjectError } from './parsing/parse-object.js';\nexport { parseText, type ParseTextOptions } from './parsing/parse-text.js';\nexport {\n createOpenRouterProvider,\n type ModelOptions,\n type OpenRouterConfig,\n type OpenRouterMetadata,\n type OpenRouterProvider,\n} from './providers/openrouter.provider.js';\n"],"names":["createLoggingMiddleware","createSchemaPrompt","parseObject","ParseObjectError","parseText","createOpenRouterProvider"],"mappings":"AAAA,SACIA,uBAAuB,QAEpB,qCAAqC;AAC5C,SAASC,kBAAkB,QAAQ,oCAAoC;AACvE,SAASC,WAAW,EAAEC,gBAAgB,QAAQ,4BAA4B;AAC1E,SAASC,SAAS,QAA+B,0BAA0B;AAC3E,SACIC,wBAAwB,QAKrB,qCAAqC"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
2
|
+
try {
|
|
3
|
+
var info = gen[key](arg);
|
|
4
|
+
var value = info.value;
|
|
5
|
+
} catch (error) {
|
|
6
|
+
reject(error);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (info.done) {
|
|
10
|
+
resolve(value);
|
|
11
|
+
} else {
|
|
12
|
+
Promise.resolve(value).then(_next, _throw);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _async_to_generator(fn) {
|
|
16
|
+
return function() {
|
|
17
|
+
var self = this, args = arguments;
|
|
18
|
+
return new Promise(function(resolve, reject) {
|
|
19
|
+
var gen = fn.apply(self, args);
|
|
20
|
+
function _next(value) {
|
|
21
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
22
|
+
}
|
|
23
|
+
function _throw(err) {
|
|
24
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
25
|
+
}
|
|
26
|
+
_next(undefined);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function _ts_generator(thisArg, body) {
|
|
31
|
+
var f, y, t, _ = {
|
|
32
|
+
label: 0,
|
|
33
|
+
sent: function() {
|
|
34
|
+
if (t[0] & 1) throw t[1];
|
|
35
|
+
return t[1];
|
|
36
|
+
},
|
|
37
|
+
trys: [],
|
|
38
|
+
ops: []
|
|
39
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
40
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
41
|
+
return this;
|
|
42
|
+
}), g;
|
|
43
|
+
function verb(n) {
|
|
44
|
+
return function(v) {
|
|
45
|
+
return step([
|
|
46
|
+
n,
|
|
47
|
+
v
|
|
48
|
+
]);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function step(op) {
|
|
52
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
53
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
54
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
55
|
+
if (y = 0, t) op = [
|
|
56
|
+
op[0] & 2,
|
|
57
|
+
t.value
|
|
58
|
+
];
|
|
59
|
+
switch(op[0]){
|
|
60
|
+
case 0:
|
|
61
|
+
case 1:
|
|
62
|
+
t = op;
|
|
63
|
+
break;
|
|
64
|
+
case 4:
|
|
65
|
+
_.label++;
|
|
66
|
+
return {
|
|
67
|
+
value: op[1],
|
|
68
|
+
done: false
|
|
69
|
+
};
|
|
70
|
+
case 5:
|
|
71
|
+
_.label++;
|
|
72
|
+
y = op[1];
|
|
73
|
+
op = [
|
|
74
|
+
0
|
|
75
|
+
];
|
|
76
|
+
continue;
|
|
77
|
+
case 7:
|
|
78
|
+
op = _.ops.pop();
|
|
79
|
+
_.trys.pop();
|
|
80
|
+
continue;
|
|
81
|
+
default:
|
|
82
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
83
|
+
_ = 0;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
87
|
+
_.label = op[1];
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
91
|
+
_.label = t[1];
|
|
92
|
+
t = op;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
if (t && _.label < t[2]) {
|
|
96
|
+
_.label = t[2];
|
|
97
|
+
_.ops.push(op);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
if (t[2]) _.ops.pop();
|
|
101
|
+
_.trys.pop();
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
op = body.call(thisArg, _);
|
|
105
|
+
} catch (e) {
|
|
106
|
+
op = [
|
|
107
|
+
6,
|
|
108
|
+
e
|
|
109
|
+
];
|
|
110
|
+
y = 0;
|
|
111
|
+
} finally{
|
|
112
|
+
f = t = 0;
|
|
113
|
+
}
|
|
114
|
+
if (op[0] & 5) throw op[1];
|
|
115
|
+
return {
|
|
116
|
+
value: op[0] ? op[1] : void 0,
|
|
117
|
+
done: true
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
122
|
+
import { createLoggingMiddleware } from '../logging.middleware.js';
|
|
123
|
+
function createMockLogger() {
|
|
124
|
+
var logger = {
|
|
125
|
+
child: vi.fn(function() {
|
|
126
|
+
return logger;
|
|
127
|
+
}),
|
|
128
|
+
debug: vi.fn(),
|
|
129
|
+
error: vi.fn(),
|
|
130
|
+
info: vi.fn(),
|
|
131
|
+
warn: vi.fn()
|
|
132
|
+
};
|
|
133
|
+
return logger;
|
|
134
|
+
}
|
|
135
|
+
function createMockGenerateResult() {
|
|
136
|
+
return {
|
|
137
|
+
content: [
|
|
138
|
+
{
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: 'Hello world'
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
finishReason: 'stop',
|
|
144
|
+
usage: {
|
|
145
|
+
inputTokens: 10,
|
|
146
|
+
outputTokens: 20,
|
|
147
|
+
totalTokens: 30
|
|
148
|
+
},
|
|
149
|
+
warnings: []
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function createMockStreamResult() {
|
|
153
|
+
return {
|
|
154
|
+
stream: new ReadableStream(),
|
|
155
|
+
warnings: []
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
describe('createLoggingMiddleware', function() {
|
|
159
|
+
describe('wrapGenerate', function() {
|
|
160
|
+
it('logs request start and completion on success', function() {
|
|
161
|
+
return _async_to_generator(function() {
|
|
162
|
+
var _middleware_wrapGenerate, logger, middleware, mockResult, doGenerate, result;
|
|
163
|
+
return _ts_generator(this, function(_state) {
|
|
164
|
+
switch(_state.label){
|
|
165
|
+
case 0:
|
|
166
|
+
logger = createMockLogger();
|
|
167
|
+
middleware = createLoggingMiddleware({
|
|
168
|
+
logger: logger
|
|
169
|
+
});
|
|
170
|
+
mockResult = createMockGenerateResult();
|
|
171
|
+
doGenerate = vi.fn().mockResolvedValue(mockResult);
|
|
172
|
+
return [
|
|
173
|
+
4,
|
|
174
|
+
(_middleware_wrapGenerate = middleware.wrapGenerate) === null || _middleware_wrapGenerate === void 0 ? void 0 : _middleware_wrapGenerate.call(middleware, {
|
|
175
|
+
doGenerate: doGenerate,
|
|
176
|
+
doStream: vi.fn(),
|
|
177
|
+
params: {},
|
|
178
|
+
model: {}
|
|
179
|
+
})
|
|
180
|
+
];
|
|
181
|
+
case 1:
|
|
182
|
+
result = _state.sent();
|
|
183
|
+
expect(logger.debug).toHaveBeenCalledTimes(2);
|
|
184
|
+
expect(logger.debug).toHaveBeenNthCalledWith(1, 'Model request started', {});
|
|
185
|
+
expect(logger.debug).toHaveBeenNthCalledWith(2, 'Model request completed', expect.objectContaining({
|
|
186
|
+
durationMs: expect.any(Number),
|
|
187
|
+
finishReason: 'stop',
|
|
188
|
+
usage: mockResult.usage
|
|
189
|
+
}));
|
|
190
|
+
expect(result).toBe(mockResult);
|
|
191
|
+
return [
|
|
192
|
+
2
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
})();
|
|
197
|
+
});
|
|
198
|
+
it('logs error on failure', function() {
|
|
199
|
+
return _async_to_generator(function() {
|
|
200
|
+
var _middleware_wrapGenerate, logger, middleware, error, doGenerate;
|
|
201
|
+
return _ts_generator(this, function(_state) {
|
|
202
|
+
switch(_state.label){
|
|
203
|
+
case 0:
|
|
204
|
+
logger = createMockLogger();
|
|
205
|
+
middleware = createLoggingMiddleware({
|
|
206
|
+
logger: logger
|
|
207
|
+
});
|
|
208
|
+
error = new Error('API error');
|
|
209
|
+
doGenerate = vi.fn().mockRejectedValue(error);
|
|
210
|
+
return [
|
|
211
|
+
4,
|
|
212
|
+
expect((_middleware_wrapGenerate = middleware.wrapGenerate) === null || _middleware_wrapGenerate === void 0 ? void 0 : _middleware_wrapGenerate.call(middleware, {
|
|
213
|
+
doGenerate: doGenerate,
|
|
214
|
+
doStream: vi.fn(),
|
|
215
|
+
params: {},
|
|
216
|
+
model: {}
|
|
217
|
+
})).rejects.toThrow('API error')
|
|
218
|
+
];
|
|
219
|
+
case 1:
|
|
220
|
+
_state.sent();
|
|
221
|
+
expect(logger.debug).toHaveBeenCalledWith('Model request started', {});
|
|
222
|
+
expect(logger.error).toHaveBeenCalledWith('Model request failed', expect.objectContaining({
|
|
223
|
+
durationMs: expect.any(Number),
|
|
224
|
+
error: 'API error'
|
|
225
|
+
}));
|
|
226
|
+
return [
|
|
227
|
+
2
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
})();
|
|
232
|
+
});
|
|
233
|
+
it('includes params and content when verbose is true', function() {
|
|
234
|
+
return _async_to_generator(function() {
|
|
235
|
+
var _middleware_wrapGenerate, logger, middleware, mockResult, mockParams, doGenerate;
|
|
236
|
+
return _ts_generator(this, function(_state) {
|
|
237
|
+
switch(_state.label){
|
|
238
|
+
case 0:
|
|
239
|
+
logger = createMockLogger();
|
|
240
|
+
middleware = createLoggingMiddleware({
|
|
241
|
+
logger: logger,
|
|
242
|
+
verbose: true
|
|
243
|
+
});
|
|
244
|
+
mockResult = createMockGenerateResult();
|
|
245
|
+
mockParams = {
|
|
246
|
+
prompt: 'Hello'
|
|
247
|
+
};
|
|
248
|
+
doGenerate = vi.fn().mockResolvedValue(mockResult);
|
|
249
|
+
return [
|
|
250
|
+
4,
|
|
251
|
+
(_middleware_wrapGenerate = middleware.wrapGenerate) === null || _middleware_wrapGenerate === void 0 ? void 0 : _middleware_wrapGenerate.call(middleware, {
|
|
252
|
+
doGenerate: doGenerate,
|
|
253
|
+
doStream: vi.fn(),
|
|
254
|
+
params: mockParams,
|
|
255
|
+
model: {}
|
|
256
|
+
})
|
|
257
|
+
];
|
|
258
|
+
case 1:
|
|
259
|
+
_state.sent();
|
|
260
|
+
expect(logger.debug).toHaveBeenNthCalledWith(1, 'Model request started', expect.objectContaining({
|
|
261
|
+
params: mockParams
|
|
262
|
+
}));
|
|
263
|
+
expect(logger.debug).toHaveBeenNthCalledWith(2, 'Model request completed', expect.objectContaining({
|
|
264
|
+
content: mockResult.content
|
|
265
|
+
}));
|
|
266
|
+
return [
|
|
267
|
+
2
|
|
268
|
+
];
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
})();
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe('wrapStream', function() {
|
|
275
|
+
it('logs stream start on success', function() {
|
|
276
|
+
return _async_to_generator(function() {
|
|
277
|
+
var _middleware_wrapStream, logger, middleware, mockResult, doStream, result;
|
|
278
|
+
return _ts_generator(this, function(_state) {
|
|
279
|
+
switch(_state.label){
|
|
280
|
+
case 0:
|
|
281
|
+
logger = createMockLogger();
|
|
282
|
+
middleware = createLoggingMiddleware({
|
|
283
|
+
logger: logger
|
|
284
|
+
});
|
|
285
|
+
mockResult = createMockStreamResult();
|
|
286
|
+
doStream = vi.fn().mockResolvedValue(mockResult);
|
|
287
|
+
return [
|
|
288
|
+
4,
|
|
289
|
+
(_middleware_wrapStream = middleware.wrapStream) === null || _middleware_wrapStream === void 0 ? void 0 : _middleware_wrapStream.call(middleware, {
|
|
290
|
+
doGenerate: vi.fn(),
|
|
291
|
+
doStream: doStream,
|
|
292
|
+
params: {},
|
|
293
|
+
model: {}
|
|
294
|
+
})
|
|
295
|
+
];
|
|
296
|
+
case 1:
|
|
297
|
+
result = _state.sent();
|
|
298
|
+
expect(logger.debug).toHaveBeenCalledWith('Model stream started', {});
|
|
299
|
+
expect(result === null || result === void 0 ? void 0 : result.stream).toBe(mockResult.stream);
|
|
300
|
+
return [
|
|
301
|
+
2
|
|
302
|
+
];
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
})();
|
|
306
|
+
});
|
|
307
|
+
it('logs error on stream failure', function() {
|
|
308
|
+
return _async_to_generator(function() {
|
|
309
|
+
var _middleware_wrapStream, logger, middleware, error, doStream;
|
|
310
|
+
return _ts_generator(this, function(_state) {
|
|
311
|
+
switch(_state.label){
|
|
312
|
+
case 0:
|
|
313
|
+
logger = createMockLogger();
|
|
314
|
+
middleware = createLoggingMiddleware({
|
|
315
|
+
logger: logger
|
|
316
|
+
});
|
|
317
|
+
error = new Error('Stream error');
|
|
318
|
+
doStream = vi.fn().mockRejectedValue(error);
|
|
319
|
+
return [
|
|
320
|
+
4,
|
|
321
|
+
expect((_middleware_wrapStream = middleware.wrapStream) === null || _middleware_wrapStream === void 0 ? void 0 : _middleware_wrapStream.call(middleware, {
|
|
322
|
+
doGenerate: vi.fn(),
|
|
323
|
+
doStream: doStream,
|
|
324
|
+
params: {},
|
|
325
|
+
model: {}
|
|
326
|
+
})).rejects.toThrow('Stream error')
|
|
327
|
+
];
|
|
328
|
+
case 1:
|
|
329
|
+
_state.sent();
|
|
330
|
+
expect(logger.error).toHaveBeenCalledWith('Model stream failed', expect.objectContaining({
|
|
331
|
+
durationMs: expect.any(Number),
|
|
332
|
+
error: 'Stream error'
|
|
333
|
+
}));
|
|
334
|
+
return [
|
|
335
|
+
2
|
|
336
|
+
];
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
})();
|
|
340
|
+
});
|
|
341
|
+
it('includes params when verbose is true', function() {
|
|
342
|
+
return _async_to_generator(function() {
|
|
343
|
+
var _middleware_wrapStream, logger, middleware, mockResult, mockParams, doStream;
|
|
344
|
+
return _ts_generator(this, function(_state) {
|
|
345
|
+
switch(_state.label){
|
|
346
|
+
case 0:
|
|
347
|
+
logger = createMockLogger();
|
|
348
|
+
middleware = createLoggingMiddleware({
|
|
349
|
+
logger: logger,
|
|
350
|
+
verbose: true
|
|
351
|
+
});
|
|
352
|
+
mockResult = createMockStreamResult();
|
|
353
|
+
mockParams = {
|
|
354
|
+
prompt: 'Hello'
|
|
355
|
+
};
|
|
356
|
+
doStream = vi.fn().mockResolvedValue(mockResult);
|
|
357
|
+
return [
|
|
358
|
+
4,
|
|
359
|
+
(_middleware_wrapStream = middleware.wrapStream) === null || _middleware_wrapStream === void 0 ? void 0 : _middleware_wrapStream.call(middleware, {
|
|
360
|
+
doGenerate: vi.fn(),
|
|
361
|
+
doStream: doStream,
|
|
362
|
+
params: mockParams,
|
|
363
|
+
model: {}
|
|
364
|
+
})
|
|
365
|
+
];
|
|
366
|
+
case 1:
|
|
367
|
+
_state.sent();
|
|
368
|
+
expect(logger.debug).toHaveBeenCalledWith('Model stream started', expect.objectContaining({
|
|
369
|
+
params: mockParams
|
|
370
|
+
}));
|
|
371
|
+
return [
|
|
372
|
+
2
|
|
373
|
+
];
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
})();
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
describe('middleware structure', function() {
|
|
380
|
+
it('returns middleware with v2 version', function() {
|
|
381
|
+
var logger = createMockLogger();
|
|
382
|
+
var middleware = createLoggingMiddleware({
|
|
383
|
+
logger: logger
|
|
384
|
+
});
|
|
385
|
+
expect(middleware.middlewareVersion).toBe('v2');
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
//# sourceMappingURL=logging.middleware.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/middleware/__tests__/logging.middleware.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from 'vitest';\n\nimport { createLoggingMiddleware } from '../logging.middleware.js';\n\nfunction createMockLogger() {\n const logger = {\n child: vi.fn(() => logger),\n debug: vi.fn(),\n error: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n };\n return logger;\n}\n\nfunction createMockGenerateResult() {\n return {\n content: [{ type: 'text' as const, text: 'Hello world' }],\n finishReason: 'stop' as const,\n usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },\n warnings: [],\n };\n}\n\nfunction createMockStreamResult() {\n return {\n stream: new ReadableStream(),\n warnings: [],\n };\n}\n\ndescribe('createLoggingMiddleware', () => {\n describe('wrapGenerate', () => {\n it('logs request start and completion on success', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const mockResult = createMockGenerateResult();\n const doGenerate = vi.fn().mockResolvedValue(mockResult);\n\n const result = await middleware.wrapGenerate?.({\n doGenerate,\n doStream: vi.fn(),\n params: {} as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenCalledTimes(2);\n expect(logger.debug).toHaveBeenNthCalledWith(1, 'Model request started', {});\n expect(logger.debug).toHaveBeenNthCalledWith(\n 2,\n 'Model request completed',\n expect.objectContaining({\n durationMs: expect.any(Number),\n finishReason: 'stop',\n usage: mockResult.usage,\n }),\n );\n expect(result).toBe(mockResult);\n });\n\n it('logs error on failure', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const error = new Error('API error');\n const doGenerate = vi.fn().mockRejectedValue(error);\n\n await expect(\n middleware.wrapGenerate?.({\n doGenerate,\n doStream: vi.fn(),\n params: {} as never,\n model: {} as never,\n }),\n ).rejects.toThrow('API error');\n\n expect(logger.debug).toHaveBeenCalledWith('Model request started', {});\n expect(logger.error).toHaveBeenCalledWith(\n 'Model request failed',\n expect.objectContaining({\n durationMs: expect.any(Number),\n error: 'API error',\n }),\n );\n });\n\n it('includes params and content when verbose is true', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger, verbose: true });\n const mockResult = createMockGenerateResult();\n const mockParams = { prompt: 'Hello' };\n const doGenerate = vi.fn().mockResolvedValue(mockResult);\n\n await middleware.wrapGenerate?.({\n doGenerate,\n doStream: vi.fn(),\n params: mockParams as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenNthCalledWith(\n 1,\n 'Model request started',\n expect.objectContaining({ params: mockParams }),\n );\n expect(logger.debug).toHaveBeenNthCalledWith(\n 2,\n 'Model request completed',\n expect.objectContaining({ content: mockResult.content }),\n );\n });\n });\n\n describe('wrapStream', () => {\n it('logs stream start on success', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const mockResult = createMockStreamResult();\n const doStream = vi.fn().mockResolvedValue(mockResult);\n\n const result = await middleware.wrapStream?.({\n doGenerate: vi.fn(),\n doStream,\n params: {} as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenCalledWith('Model stream started', {});\n expect(result?.stream).toBe(mockResult.stream);\n });\n\n it('logs error on stream failure', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const error = new Error('Stream error');\n const doStream = vi.fn().mockRejectedValue(error);\n\n await expect(\n middleware.wrapStream?.({\n doGenerate: vi.fn(),\n doStream,\n params: {} as never,\n model: {} as never,\n }),\n ).rejects.toThrow('Stream error');\n\n expect(logger.error).toHaveBeenCalledWith(\n 'Model stream failed',\n expect.objectContaining({\n durationMs: expect.any(Number),\n error: 'Stream error',\n }),\n );\n });\n\n it('includes params when verbose is true', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger, verbose: true });\n const mockResult = createMockStreamResult();\n const mockParams = { prompt: 'Hello' };\n const doStream = vi.fn().mockResolvedValue(mockResult);\n\n await middleware.wrapStream?.({\n doGenerate: vi.fn(),\n doStream,\n params: mockParams as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenCalledWith(\n 'Model stream started',\n expect.objectContaining({ params: mockParams }),\n );\n });\n });\n\n describe('middleware structure', () => {\n it('returns middleware with v2 version', () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n\n expect(middleware.middlewareVersion).toBe('v2');\n });\n });\n});\n"],"names":["describe","expect","it","vi","createLoggingMiddleware","createMockLogger","logger","child","fn","debug","error","info","warn","createMockGenerateResult","content","type","text","finishReason","usage","inputTokens","outputTokens","totalTokens","warnings","createMockStreamResult","stream","ReadableStream","middleware","mockResult","doGenerate","result","mockResolvedValue","wrapGenerate","doStream","params","model","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","objectContaining","durationMs","any","Number","toBe","Error","mockRejectedValue","rejects","toThrow","toHaveBeenCalledWith","mockParams","verbose","prompt","wrapStream","middlewareVersion"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { LoggerPort } from '@jterrazz/logger';
|
|
2
|
+
import type { LanguageModelMiddleware } from 'ai';
|
|
3
|
+
export interface LoggingMiddlewareOptions {
|
|
4
|
+
logger: LoggerPort;
|
|
5
|
+
/** Include request/response details in logs (default: false) */
|
|
6
|
+
verbose?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates AI SDK middleware that logs model requests and responses.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { wrapLanguageModel } from 'ai';
|
|
14
|
+
*
|
|
15
|
+
* const model = wrapLanguageModel({
|
|
16
|
+
* model: openrouter('anthropic/claude-sonnet-4-20250514'),
|
|
17
|
+
* middleware: createLoggingMiddleware({ logger }),
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function createLoggingMiddleware(options: LoggingMiddlewareOptions): LanguageModelMiddleware;
|