@jterrazz/intelligence 2.0.0 → 3.0.1

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.
Files changed (113) hide show
  1. package/README.md +56 -268
  2. package/dist/index.cjs +652 -2017
  3. package/dist/index.d.ts +5 -15
  4. package/dist/index.js +5 -33
  5. package/dist/index.js.map +1 -1
  6. package/dist/middleware/__tests__/logging.middleware.test.js +390 -0
  7. package/dist/middleware/__tests__/logging.middleware.test.js.map +1 -0
  8. package/dist/middleware/logging.middleware.d.ts +21 -0
  9. package/dist/middleware/logging.middleware.js +296 -0
  10. package/dist/middleware/logging.middleware.js.map +1 -0
  11. package/dist/parsing/__tests__/create-schema-prompt.test.js +53 -0
  12. package/dist/parsing/__tests__/create-schema-prompt.test.js.map +1 -0
  13. package/dist/parsing/__tests__/parse-object.test.d.ts +1 -0
  14. package/dist/parsing/__tests__/parse-object.test.js +193 -0
  15. package/dist/parsing/__tests__/parse-object.test.js.map +1 -0
  16. package/dist/parsing/__tests__/parse-text.test.d.ts +1 -0
  17. package/dist/parsing/__tests__/parse-text.test.js +167 -0
  18. package/dist/parsing/__tests__/parse-text.test.js.map +1 -0
  19. package/dist/parsing/create-schema-prompt.d.ts +28 -0
  20. package/dist/parsing/create-schema-prompt.js +42 -0
  21. package/dist/parsing/create-schema-prompt.js.map +1 -0
  22. package/dist/parsing/parse-object.d.ts +33 -0
  23. package/dist/parsing/parse-object.js +360 -0
  24. package/dist/parsing/parse-object.js.map +1 -0
  25. package/dist/parsing/parse-text.d.ts +14 -0
  26. package/dist/parsing/parse-text.js +76 -0
  27. package/dist/parsing/parse-text.js.map +1 -0
  28. package/dist/providers/openrouter.provider.d.ts +36 -0
  29. package/dist/providers/openrouter.provider.js +58 -0
  30. package/dist/providers/openrouter.provider.js.map +1 -0
  31. package/package.json +14 -15
  32. package/dist/adapters/agents/chat-agent.adapter.d.ts +0 -27
  33. package/dist/adapters/agents/chat-agent.adapter.js +0 -356
  34. package/dist/adapters/agents/chat-agent.adapter.js.map +0 -1
  35. package/dist/adapters/agents/resilient-agent.adapter.d.ts +0 -20
  36. package/dist/adapters/agents/resilient-agent.adapter.js +0 -263
  37. package/dist/adapters/agents/resilient-agent.adapter.js.map +0 -1
  38. package/dist/adapters/agents/tool-agent.adapter.d.ts +0 -30
  39. package/dist/adapters/agents/tool-agent.adapter.js +0 -400
  40. package/dist/adapters/agents/tool-agent.adapter.js.map +0 -1
  41. package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -23
  42. package/dist/adapters/models/openrouter-model.adapter.js +0 -148
  43. package/dist/adapters/models/openrouter-model.adapter.js.map +0 -1
  44. package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +0 -120
  45. package/dist/adapters/prompts/__tests__/presets.test.js +0 -31
  46. package/dist/adapters/prompts/__tests__/presets.test.js.map +0 -1
  47. package/dist/adapters/prompts/library/categories/domain.d.ts +0 -11
  48. package/dist/adapters/prompts/library/categories/domain.js +0 -12
  49. package/dist/adapters/prompts/library/categories/domain.js.map +0 -1
  50. package/dist/adapters/prompts/library/categories/format.d.ts +0 -10
  51. package/dist/adapters/prompts/library/categories/format.js +0 -11
  52. package/dist/adapters/prompts/library/categories/format.js.map +0 -1
  53. package/dist/adapters/prompts/library/categories/foundations.d.ts +0 -12
  54. package/dist/adapters/prompts/library/categories/foundations.js +0 -13
  55. package/dist/adapters/prompts/library/categories/foundations.js.map +0 -1
  56. package/dist/adapters/prompts/library/categories/language.d.ts +0 -11
  57. package/dist/adapters/prompts/library/categories/language.js +0 -12
  58. package/dist/adapters/prompts/library/categories/language.js.map +0 -1
  59. package/dist/adapters/prompts/library/categories/persona.d.ts +0 -13
  60. package/dist/adapters/prompts/library/categories/persona.js +0 -14
  61. package/dist/adapters/prompts/library/categories/persona.js.map +0 -1
  62. package/dist/adapters/prompts/library/categories/response.d.ts +0 -9
  63. package/dist/adapters/prompts/library/categories/response.js +0 -10
  64. package/dist/adapters/prompts/library/categories/response.js.map +0 -1
  65. package/dist/adapters/prompts/library/categories/tone.d.ts +0 -9
  66. package/dist/adapters/prompts/library/categories/tone.js +0 -10
  67. package/dist/adapters/prompts/library/categories/tone.js.map +0 -1
  68. package/dist/adapters/prompts/library/categories/verbosity.d.ts +0 -8
  69. package/dist/adapters/prompts/library/categories/verbosity.js +0 -9
  70. package/dist/adapters/prompts/library/categories/verbosity.js.map +0 -1
  71. package/dist/adapters/prompts/library/index.d.ts +0 -68
  72. package/dist/adapters/prompts/library/index.js +0 -26
  73. package/dist/adapters/prompts/library/index.js.map +0 -1
  74. package/dist/adapters/prompts/library/presets.d.ts +0 -17
  75. package/dist/adapters/prompts/library/presets.js +0 -45
  76. package/dist/adapters/prompts/library/presets.js.map +0 -1
  77. package/dist/adapters/prompts/system-prompt.adapter.d.ts +0 -9
  78. package/dist/adapters/prompts/system-prompt.adapter.js +0 -57
  79. package/dist/adapters/prompts/system-prompt.adapter.js.map +0 -1
  80. package/dist/adapters/prompts/user-prompt.adapter.d.ts +0 -9
  81. package/dist/adapters/prompts/user-prompt.adapter.js +0 -57
  82. package/dist/adapters/prompts/user-prompt.adapter.js.map +0 -1
  83. package/dist/adapters/providers/openrouter-provider.adapter.d.ts +0 -34
  84. package/dist/adapters/providers/openrouter-provider.adapter.js +0 -57
  85. package/dist/adapters/providers/openrouter-provider.adapter.js.map +0 -1
  86. package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
  87. package/dist/adapters/tools/safe-tool.adapter.js +0 -283
  88. package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
  89. package/dist/adapters/utils/__tests__/structured-response-parser.test.js +0 -289
  90. package/dist/adapters/utils/__tests__/structured-response-parser.test.js.map +0 -1
  91. package/dist/adapters/utils/structured-response-parser-error.d.ts +0 -8
  92. package/dist/adapters/utils/structured-response-parser-error.js +0 -136
  93. package/dist/adapters/utils/structured-response-parser-error.js.map +0 -1
  94. package/dist/adapters/utils/structured-response-parser.d.ts +0 -60
  95. package/dist/adapters/utils/structured-response-parser.js +0 -347
  96. package/dist/adapters/utils/structured-response-parser.js.map +0 -1
  97. package/dist/ports/agent.port.d.ts +0 -17
  98. package/dist/ports/agent.port.js +0 -7
  99. package/dist/ports/agent.port.js.map +0 -1
  100. package/dist/ports/model.port.d.ts +0 -37
  101. package/dist/ports/model.port.js +0 -5
  102. package/dist/ports/model.port.js.map +0 -1
  103. package/dist/ports/prompt.port.d.ts +0 -9
  104. package/dist/ports/prompt.port.js +0 -5
  105. package/dist/ports/prompt.port.js.map +0 -1
  106. package/dist/ports/provider.port.d.ts +0 -13
  107. package/dist/ports/provider.port.js +0 -5
  108. package/dist/ports/provider.port.js.map +0 -1
  109. package/dist/ports/tool.port.d.ts +0 -11
  110. package/dist/ports/tool.port.js +0 -5
  111. package/dist/ports/tool.port.js.map +0 -1
  112. /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
  113. /package/dist/{adapters/utils/__tests__/structured-response-parser.test.d.ts → parsing/__tests__/create-schema-prompt.test.d.ts} +0 -0
@@ -1,400 +0,0 @@
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 _class_call_check(instance, Constructor) {
31
- if (!(instance instanceof Constructor)) {
32
- throw new TypeError("Cannot call a class as a function");
33
- }
34
- }
35
- function _defineProperties(target, props) {
36
- for(var i = 0; i < props.length; i++){
37
- var descriptor = props[i];
38
- descriptor.enumerable = descriptor.enumerable || false;
39
- descriptor.configurable = true;
40
- if ("value" in descriptor) descriptor.writable = true;
41
- Object.defineProperty(target, descriptor.key, descriptor);
42
- }
43
- }
44
- function _create_class(Constructor, protoProps, staticProps) {
45
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
46
- if (staticProps) _defineProperties(Constructor, staticProps);
47
- return Constructor;
48
- }
49
- function _define_property(obj, key, value) {
50
- if (key in obj) {
51
- Object.defineProperty(obj, key, {
52
- value: value,
53
- enumerable: true,
54
- configurable: true,
55
- writable: true
56
- });
57
- } else {
58
- obj[key] = value;
59
- }
60
- return obj;
61
- }
62
- function _instanceof(left, right) {
63
- if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
64
- return !!right[Symbol.hasInstance](left);
65
- } else {
66
- return left instanceof right;
67
- }
68
- }
69
- function _ts_generator(thisArg, body) {
70
- var f, y, t, _ = {
71
- label: 0,
72
- sent: function() {
73
- if (t[0] & 1) throw t[1];
74
- return t[1];
75
- },
76
- trys: [],
77
- ops: []
78
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
79
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
80
- return this;
81
- }), g;
82
- function verb(n) {
83
- return function(v) {
84
- return step([
85
- n,
86
- v
87
- ]);
88
- };
89
- }
90
- function step(op) {
91
- if (f) throw new TypeError("Generator is already executing.");
92
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
93
- 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;
94
- if (y = 0, t) op = [
95
- op[0] & 2,
96
- t.value
97
- ];
98
- switch(op[0]){
99
- case 0:
100
- case 1:
101
- t = op;
102
- break;
103
- case 4:
104
- _.label++;
105
- return {
106
- value: op[1],
107
- done: false
108
- };
109
- case 5:
110
- _.label++;
111
- y = op[1];
112
- op = [
113
- 0
114
- ];
115
- continue;
116
- case 7:
117
- op = _.ops.pop();
118
- _.trys.pop();
119
- continue;
120
- default:
121
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
122
- _ = 0;
123
- continue;
124
- }
125
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
126
- _.label = op[1];
127
- break;
128
- }
129
- if (op[0] === 6 && _.label < t[1]) {
130
- _.label = t[1];
131
- t = op;
132
- break;
133
- }
134
- if (t && _.label < t[2]) {
135
- _.label = t[2];
136
- _.ops.push(op);
137
- break;
138
- }
139
- if (t[2]) _.ops.pop();
140
- _.trys.pop();
141
- continue;
142
- }
143
- op = body.call(thisArg, _);
144
- } catch (e) {
145
- op = [
146
- 6,
147
- e
148
- ];
149
- y = 0;
150
- } finally{
151
- f = t = 0;
152
- }
153
- if (op[0] & 5) throw op[1];
154
- return {
155
- value: op[0] ? op[1] : void 0,
156
- done: true
157
- };
158
- }
159
- }
160
- import { ChatPromptTemplate } from '@langchain/core/prompts';
161
- import { AgentExecutor, createStructuredChatAgent } from 'langchain/agents';
162
- import { z } from 'zod/v4';
163
- import { StructuredResponseParser } from '../utils/structured-response-parser.js';
164
- var SYSTEM_PROMPT_TEMPLATE = '\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<GLOBAL_WRAPPER_OUTPUT_FORMAT>\nCRITICAL: The format instructions in this section are the ONLY valid way to structure your response. Your entire response MUST be a single JSON markdown code block. Any formatting guidelines within the <OBJECTIVE> section apply ONLY to the content inside the "RESPOND:" part of your final "action_input".\n\nREQUIRED: You have two ways to respond:\n\n1. **Call a tool** to gather information. For this, you MUST output a JSON blob with the tool\'s name and its input.\n *Valid tool names are: {tool_names}*\n ```json\n {{\n "action": "tool_name_to_use",\n "action_input": "the input for the tool, or an empty object {{}} if no input is needed"\n }}\n ```\n\n2. **Provide the Final Answer** once you have enough information. For this, you MUST output a JSON blob with the "Final Answer" action.\n The "action_input" for a "Final Answer" MUST be a string that begins with either "RESPOND: " for a message or "SILENT: " for no message. This prefix is a literal part of the output string and MUST NOT be omitted.\n - To send a message:\n ```json\n {{\n "action": "Final Answer",\n "action_input": "RESPOND: <your response message>"\n }}\n ```\n - To stay silent:\n ```json\n {{\n "action": "Final Answer",\n "action_input": "SILENT: <your reason for staying silent>"\n }}\n ```\n\n YOU MUST ALWAYS INCLUDE "RESPOND:" OR "SILENT:" IN YOUR FINAL ANSWER\'S "action_input". FAILURE TO DO SO WILL CAUSE AN ERROR.\n\n{schema_format}\n</OUTPUT_FORMAT>\n\n<EXECUTION_CONTEXT>\nThis is internal data for your reference.\n\n<TOOLS>\n{tools}\n</TOOLS>\n\n<WORKING_MEMORY>\nThis is your internal thought process and previous tool usage.\n{agent_scratchpad}\n</WORKING_MEMORY>\n</EXECUTION_CONTEXT>\n';
165
- /**
166
- * A tool-enabled agent that uses tools and a structured prompt to accomplish tasks.
167
- * It can decide whether to respond or remain silent and supports schema-validated responses.
168
- * @template TOutput - The TypeScript type of the output
169
- */ export var ToolAgent = /*#__PURE__*/ function() {
170
- "use strict";
171
- function ToolAgent(name, options) {
172
- _class_call_check(this, ToolAgent);
173
- _define_property(this, "name", void 0);
174
- _define_property(this, "options", void 0);
175
- this.name = name;
176
- this.options = options;
177
- }
178
- _create_class(ToolAgent, [
179
- {
180
- key: "run",
181
- value: function run(input) {
182
- return _async_to_generator(function() {
183
- var _this_options_logger, _this_options_logger1, executor, userInput, result, agentResponse, _this_options_logger2, _agentResponse_message, message, _this_options_logger3, validatedResponse, _this_options_logger4, error, _this_options_logger5;
184
- return _ts_generator(this, function(_state) {
185
- switch(_state.label){
186
- case 0:
187
- (_this_options_logger = this.options.logger) === null || _this_options_logger === void 0 ? void 0 : _this_options_logger.debug('Starting chat execution', {
188
- agent: this.name
189
- });
190
- _state.label = 1;
191
- case 1:
192
- _state.trys.push([
193
- 1,
194
- 4,
195
- ,
196
- 5
197
- ]);
198
- return [
199
- 4,
200
- this.createExecutor()
201
- ];
202
- case 2:
203
- executor = _state.sent();
204
- userInput = this.resolveUserInput(input);
205
- return [
206
- 4,
207
- executor.invoke({
208
- input: userInput
209
- })
210
- ];
211
- case 3:
212
- result = _state.sent();
213
- (_this_options_logger1 = this.options.logger) === null || _this_options_logger1 === void 0 ? void 0 : _this_options_logger1.debug('Agent execution completed', {
214
- agent: this.name,
215
- hasOutput: 'output' in result
216
- });
217
- if (!result || typeof result.output !== 'string') {
218
- throw new Error('Agent returned an invalid result structure.');
219
- }
220
- agentResponse = this.parseAgentOutput(result.output);
221
- if (!agentResponse) {
222
- return [
223
- 2,
224
- null
225
- ];
226
- }
227
- if (!agentResponse.shouldRespond) {
228
- ;
229
- (_this_options_logger2 = this.options.logger) === null || _this_options_logger2 === void 0 ? void 0 : _this_options_logger2.debug('Agent chose to remain silent', {
230
- agent: this.name,
231
- reason: agentResponse.reason
232
- });
233
- return [
234
- 2,
235
- null
236
- ];
237
- }
238
- message = (_agentResponse_message = agentResponse.message) !== null && _agentResponse_message !== void 0 ? _agentResponse_message : '';
239
- if (this.options.schema) {
240
- ;
241
- validatedResponse = this.validateResponseContent(message, this.options.schema);
242
- (_this_options_logger3 = this.options.logger) === null || _this_options_logger3 === void 0 ? void 0 : _this_options_logger3.debug('Execution finished; response content validated.', {
243
- agent: this.name
244
- });
245
- return [
246
- 2,
247
- validatedResponse
248
- ];
249
- } else {
250
- ;
251
- (_this_options_logger4 = this.options.logger) === null || _this_options_logger4 === void 0 ? void 0 : _this_options_logger4.debug('Execution finished', {
252
- agent: this.name
253
- });
254
- // When no schema is provided, we assume TOutput is string (default), so message is the result
255
- return [
256
- 2,
257
- message
258
- ];
259
- }
260
- return [
261
- 3,
262
- 5
263
- ];
264
- case 4:
265
- error = _state.sent();
266
- (_this_options_logger5 = this.options.logger) === null || _this_options_logger5 === void 0 ? void 0 : _this_options_logger5.error('Chat execution failed', {
267
- agent: this.name,
268
- error: _instanceof(error, Error) ? error.message : 'Unknown error'
269
- });
270
- return [
271
- 2,
272
- null
273
- ];
274
- case 5:
275
- return [
276
- 2
277
- ];
278
- }
279
- });
280
- }).call(this);
281
- }
282
- },
283
- {
284
- key: "createExecutor",
285
- value: function createExecutor() {
286
- return _async_to_generator(function() {
287
- var model, tools, schemaFormatInstructions, jsonSchema, isPrimitiveType, jsonSchemaString, prompt, agent;
288
- return _ts_generator(this, function(_state) {
289
- switch(_state.label){
290
- case 0:
291
- model = this.options.model.getLangchainModel();
292
- tools = this.options.tools.map(function(tool) {
293
- return tool.getDynamicTool();
294
- });
295
- // Add schema format instructions if schema is provided
296
- schemaFormatInstructions = '';
297
- if (this.options.schema) {
298
- jsonSchema = z.toJSONSchema(this.options.schema);
299
- isPrimitiveType = [
300
- 'boolean',
301
- 'integer',
302
- 'number',
303
- 'string'
304
- ].includes(jsonSchema.type);
305
- jsonSchemaString = JSON.stringify(jsonSchema, null, 2).replace(/{/g, '{{').replace(/}/g, '}}');
306
- if (isPrimitiveType) {
307
- schemaFormatInstructions = '\n\nSCHEMA VALIDATION: When providing a "RESPOND:" answer, the content after "RESPOND: " must be a '.concat(jsonSchema.type, " value that matches this schema description:\n\n```json\n").concat(jsonSchemaString, '\n```\n\nExample format:\n```json\n{{\n "action": "Final Answer",\n "action_input": "RESPOND: your ').concat(jsonSchema.type, ' value here"\n}}\n```\n\nDo not wrap the ').concat(jsonSchema.type, ' value in JSON - just provide the raw value after "RESPOND: ".');
308
- } else {
309
- schemaFormatInstructions = '\n\nSCHEMA VALIDATION: When providing a "RESPOND:" answer, the content after "RESPOND: " must be valid JSON that matches this JSON schema description:\n\n```json\n'.concat(jsonSchemaString, '\n```\n\nExample format:\n```json\n{{\n "action": "Final Answer",\n "action_input": "RESPOND: {{\\"field1\\": \\"value1\\", \\"field2\\": \\"value2\\"}}"\n}}\n```\n');
310
- }
311
- }
312
- prompt = ChatPromptTemplate.fromMessages([
313
- [
314
- 'system',
315
- SYSTEM_PROMPT_TEMPLATE.replace('{mission_prompt}', this.options.systemPrompt.generate()).replace('{schema_format}', schemaFormatInstructions)
316
- ],
317
- [
318
- 'human',
319
- '{input}'
320
- ]
321
- ]);
322
- return [
323
- 4,
324
- createStructuredChatAgent({
325
- llm: model,
326
- prompt: prompt,
327
- tools: tools
328
- })
329
- ];
330
- case 1:
331
- agent = _state.sent();
332
- return [
333
- 2,
334
- AgentExecutor.fromAgentAndTools({
335
- agent: agent,
336
- tools: tools,
337
- verbose: this.options.verbose
338
- })
339
- ];
340
- }
341
- });
342
- }).call(this);
343
- }
344
- },
345
- {
346
- key: "parseAgentOutput",
347
- value: function parseAgentOutput(output) {
348
- var _this_options_logger;
349
- var text = output.trim();
350
- var respondMatch = text.match(/^RESPOND:\s*([\s\S]+)$/i);
351
- if (respondMatch) {
352
- return {
353
- message: respondMatch[1].trim(),
354
- shouldRespond: true
355
- };
356
- }
357
- var silentMatch = text.match(/^SILENT:\s*([\s\S]+)$/i);
358
- if (silentMatch) {
359
- return {
360
- reason: silentMatch[1].trim(),
361
- shouldRespond: false
362
- };
363
- }
364
- (_this_options_logger = this.options.logger) === null || _this_options_logger === void 0 ? void 0 : _this_options_logger.error("Agent output was missing 'RESPOND:' or 'SILENT:' prefix.", {
365
- agent: this.name,
366
- rawOutput: output
367
- });
368
- return null;
369
- }
370
- },
371
- {
372
- key: "resolveUserInput",
373
- value: function resolveUserInput(input) {
374
- if (input) {
375
- return input.generate();
376
- }
377
- return 'Proceed with your instructions.';
378
- }
379
- },
380
- {
381
- key: "validateResponseContent",
382
- value: function validateResponseContent(content, schema) {
383
- try {
384
- return new StructuredResponseParser(schema).parse(content);
385
- } catch (error) {
386
- var _this_options_logger;
387
- (_this_options_logger = this.options.logger) === null || _this_options_logger === void 0 ? void 0 : _this_options_logger.error('Failed to validate response content against schema.', {
388
- agent: this.name,
389
- error: _instanceof(error, Error) ? error.message : 'Unknown error',
390
- rawContent: content
391
- });
392
- throw new Error('Invalid response content from model.');
393
- }
394
- }
395
- }
396
- ]);
397
- return ToolAgent;
398
- }();
399
-
400
- //# sourceMappingURL=tool-agent.adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/adapters/agents/tool-agent.adapter.ts"],"sourcesContent":["import { type LoggerPort } from '@jterrazz/logger';\nimport { ChatPromptTemplate } from '@langchain/core/prompts';\nimport { AgentExecutor, createStructuredChatAgent } from 'langchain/agents';\nimport { z } from 'zod/v4';\n\nimport { type AgentPort } from '../../ports/agent.port.js';\nimport type { ModelPort } from '../../ports/model.port.js';\nimport type { PromptPort } from '../../ports/prompt.port.js';\nimport type { ToolPort } from '../../ports/tool.port.js';\n\nimport { StructuredResponseParser } from '../utils/structured-response-parser.js';\n\nimport type { SystemPrompt } from '../prompts/system-prompt.adapter.js';\n\nexport interface ToolAgentOptions<TOutput = string> {\n logger?: LoggerPort;\n model: ModelPort;\n schema?: z.ZodSchema<TOutput>;\n systemPrompt: SystemPrompt;\n tools: ToolPort[];\n verbose?: boolean;\n}\n\nconst SYSTEM_PROMPT_TEMPLATE = `\n<OBJECTIVE>\n{mission_prompt}\n</OBJECTIVE>\n\n<GLOBAL_WRAPPER_OUTPUT_FORMAT>\nCRITICAL: The format instructions in this section are the ONLY valid way to structure your response. Your entire response MUST be a single JSON markdown code block. Any formatting guidelines within the <OBJECTIVE> section apply ONLY to the content inside the \"RESPOND:\" part of your final \"action_input\".\n\nREQUIRED: You have two ways to respond:\n\n1. **Call a tool** to gather information. For this, you MUST output a JSON blob with the tool's name and its input.\n *Valid tool names are: {tool_names}*\n \\`\\`\\`json\n {{\n \"action\": \"tool_name_to_use\",\n \"action_input\": \"the input for the tool, or an empty object {{}} if no input is needed\"\n }}\n \\`\\`\\`\n\n2. **Provide the Final Answer** once you have enough information. For this, you MUST output a JSON blob with the \"Final Answer\" action.\n The \"action_input\" for a \"Final Answer\" MUST be a string that begins with either \"RESPOND: \" for a message or \"SILENT: \" for no message. This prefix is a literal part of the output string and MUST NOT be omitted.\n - To send a message:\n \\`\\`\\`json\n {{\n \"action\": \"Final Answer\",\n \"action_input\": \"RESPOND: <your response message>\"\n }}\n \\`\\`\\`\n - To stay silent:\n \\`\\`\\`json\n {{\n \"action\": \"Final Answer\",\n \"action_input\": \"SILENT: <your reason for staying silent>\"\n }}\n \\`\\`\\`\n\n YOU MUST ALWAYS INCLUDE \"RESPOND:\" OR \"SILENT:\" IN YOUR FINAL ANSWER'S \"action_input\". FAILURE TO DO SO WILL CAUSE AN ERROR.\n\n{schema_format}\n</OUTPUT_FORMAT>\n\n<EXECUTION_CONTEXT>\nThis is internal data for your reference.\n\n<TOOLS>\n{tools}\n</TOOLS>\n\n<WORKING_MEMORY>\nThis is your internal thought process and previous tool usage.\n{agent_scratchpad}\n</WORKING_MEMORY>\n</EXECUTION_CONTEXT>\n`;\n\n/**\n * A tool-enabled agent that uses tools and a structured prompt to accomplish tasks.\n * It can decide whether to respond or remain silent and supports schema-validated responses.\n * @template TOutput - The TypeScript type of the output\n */\nexport class ToolAgent<TOutput = string> implements AgentPort<PromptPort, TOutput> {\n constructor(\n public readonly name: string,\n private readonly options: ToolAgentOptions<TOutput>,\n ) {}\n\n async run(input?: PromptPort): Promise<null | TOutput> {\n this.options.logger?.debug('Starting chat execution', { agent: this.name });\n\n try {\n const executor = await this.createExecutor();\n const userInput = this.resolveUserInput(input);\n\n const result = await executor.invoke({ input: userInput });\n\n this.options.logger?.debug('Agent execution completed', {\n agent: this.name,\n hasOutput: 'output' in result,\n });\n\n if (!result || typeof result.output !== 'string') {\n throw new Error('Agent returned an invalid result structure.');\n }\n\n const agentResponse = this.parseAgentOutput(result.output);\n\n if (!agentResponse) {\n return null;\n }\n\n if (!agentResponse.shouldRespond) {\n this.options.logger?.debug('Agent chose to remain silent', {\n agent: this.name,\n reason: agentResponse.reason,\n });\n return null;\n }\n\n const message = agentResponse.message ?? '';\n\n if (this.options.schema) {\n const validatedResponse = this.validateResponseContent(\n message,\n this.options.schema,\n );\n\n this.options.logger?.debug('Execution finished; response content validated.', {\n agent: this.name,\n });\n return validatedResponse;\n } else {\n this.options.logger?.debug('Execution finished', { agent: this.name });\n // When no schema is provided, we assume TOutput is string (default), so message is the result\n return message as TOutput;\n }\n } catch (error) {\n this.options.logger?.error('Chat execution failed', {\n agent: this.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return null;\n }\n }\n\n private async createExecutor(): Promise<AgentExecutor> {\n const model = this.options.model.getLangchainModel();\n const tools = this.options.tools.map((tool) => tool.getDynamicTool());\n\n // Add schema format instructions if schema is provided\n let schemaFormatInstructions = '';\n if (this.options.schema) {\n const jsonSchema = z.toJSONSchema(this.options.schema);\n const isPrimitiveType = ['boolean', 'integer', 'number', 'string'].includes(\n jsonSchema.type as string,\n );\n const jsonSchemaString = JSON.stringify(jsonSchema, null, 2)\n .replace(/{/g, '{{')\n .replace(/}/g, '}}');\n\n if (isPrimitiveType) {\n schemaFormatInstructions = `\n\nSCHEMA VALIDATION: When providing a \"RESPOND:\" answer, the content after \"RESPOND: \" must be a ${jsonSchema.type} value that matches this schema description:\n\n\\`\\`\\`json\n${jsonSchemaString}\n\\`\\`\\`\n\nExample format:\n\\`\\`\\`json\n{{\n \"action\": \"Final Answer\",\n \"action_input\": \"RESPOND: your ${jsonSchema.type} value here\"\n}}\n\\`\\`\\`\n\nDo not wrap the ${jsonSchema.type} value in JSON - just provide the raw value after \"RESPOND: \".`;\n } else {\n schemaFormatInstructions = `\n\nSCHEMA VALIDATION: When providing a \"RESPOND:\" answer, the content after \"RESPOND: \" must be valid JSON that matches this JSON schema description:\n\n\\`\\`\\`json\n${jsonSchemaString}\n\\`\\`\\`\n\nExample format:\n\\`\\`\\`json\n{{\n \"action\": \"Final Answer\",\n \"action_input\": \"RESPOND: {{\\\\\"field1\\\\\": \\\\\"value1\\\\\", \\\\\"field2\\\\\": \\\\\"value2\\\\\"}}\"\n}}\n\\`\\`\\`\n`;\n }\n }\n\n const prompt = ChatPromptTemplate.fromMessages([\n [\n 'system',\n SYSTEM_PROMPT_TEMPLATE.replace(\n '{mission_prompt}',\n this.options.systemPrompt.generate(),\n ).replace('{schema_format}', schemaFormatInstructions),\n ],\n ['human', '{input}'],\n ]);\n\n const agent = await createStructuredChatAgent({\n llm: model,\n prompt,\n tools,\n });\n\n return AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n verbose: this.options.verbose,\n });\n }\n\n private parseAgentOutput(output: string): null | {\n message?: string;\n reason?: string;\n shouldRespond: boolean;\n } {\n const text = output.trim();\n\n const respondMatch = text.match(/^RESPOND:\\s*([\\s\\S]+)$/i);\n if (respondMatch) {\n return { message: respondMatch[1].trim(), shouldRespond: true };\n }\n\n const silentMatch = text.match(/^SILENT:\\s*([\\s\\S]+)$/i);\n if (silentMatch) {\n return { reason: silentMatch[1].trim(), shouldRespond: false };\n }\n\n this.options.logger?.error(\"Agent output was missing 'RESPOND:' or 'SILENT:' prefix.\", {\n agent: this.name,\n rawOutput: output,\n });\n\n return null;\n }\n\n private resolveUserInput(input?: PromptPort): string {\n if (input) {\n return input.generate();\n }\n return 'Proceed with your instructions.';\n }\n\n private validateResponseContent<TResponse>(\n content: string,\n schema: z.ZodSchema<TResponse>,\n ): TResponse {\n try {\n return new StructuredResponseParser(schema).parse(content);\n } catch (error) {\n this.options.logger?.error('Failed to validate response content against schema.', {\n agent: this.name,\n error: error instanceof Error ? error.message : 'Unknown error',\n rawContent: content,\n });\n throw new Error('Invalid response content from model.');\n }\n }\n}\n"],"names":["ChatPromptTemplate","AgentExecutor","createStructuredChatAgent","z","StructuredResponseParser","SYSTEM_PROMPT_TEMPLATE","ToolAgent","name","options","run","input","executor","userInput","result","agentResponse","message","validatedResponse","error","logger","debug","agent","createExecutor","resolveUserInput","invoke","hasOutput","output","Error","parseAgentOutput","shouldRespond","reason","schema","validateResponseContent","model","tools","schemaFormatInstructions","jsonSchema","isPrimitiveType","jsonSchemaString","prompt","getLangchainModel","map","tool","getDynamicTool","toJSONSchema","includes","type","JSON","stringify","replace","fromMessages","systemPrompt","generate","llm","fromAgentAndTools","verbose","text","trim","respondMatch","match","silentMatch","rawOutput","content","parse","rawContent"],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { BaseLanguageModel } from '@langchain/core/language_models/base';
2
- import type { LanguageModelV1 } from 'ai';
3
- import type { ModelConfig, ModelPort } from '../../ports/model.port.js';
4
- import type { OpenRouterConfig } from '../providers/openrouter-provider.adapter.js';
5
- /**
6
- * OpenRouter model wrapper supporting both LangChain and Vercel AI SDK
7
- */
8
- export declare class OpenRouterModel implements ModelPort {
9
- private readonly providerConfig;
10
- private readonly modelName;
11
- private readonly langchainModel;
12
- private readonly modelConfig;
13
- private readonly vercelModel;
14
- constructor(providerConfig: OpenRouterConfig, modelName: string, modelConfig?: ModelConfig);
15
- /**
16
- * Get the configured LangChain language model instance
17
- */
18
- getLangchainModel(): BaseLanguageModel;
19
- /**
20
- * Get the configured Vercel AI SDK language model instance
21
- */
22
- getVercelModel(): LanguageModelV1;
23
- }
@@ -1,148 +0,0 @@
1
- function _class_call_check(instance, Constructor) {
2
- if (!(instance instanceof Constructor)) {
3
- throw new TypeError("Cannot call a class as a function");
4
- }
5
- }
6
- function _defineProperties(target, props) {
7
- for(var i = 0; i < props.length; i++){
8
- var descriptor = props[i];
9
- descriptor.enumerable = descriptor.enumerable || false;
10
- descriptor.configurable = true;
11
- if ("value" in descriptor) descriptor.writable = true;
12
- Object.defineProperty(target, descriptor.key, descriptor);
13
- }
14
- }
15
- function _create_class(Constructor, protoProps, staticProps) {
16
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
17
- if (staticProps) _defineProperties(Constructor, staticProps);
18
- return Constructor;
19
- }
20
- function _define_property(obj, key, value) {
21
- if (key in obj) {
22
- Object.defineProperty(obj, key, {
23
- value: value,
24
- enumerable: true,
25
- configurable: true,
26
- writable: true
27
- });
28
- } else {
29
- obj[key] = value;
30
- }
31
- return obj;
32
- }
33
- function _object_spread(target) {
34
- for(var i = 1; i < arguments.length; i++){
35
- var source = arguments[i] != null ? arguments[i] : {};
36
- var ownKeys = Object.keys(source);
37
- if (typeof Object.getOwnPropertySymbols === "function") {
38
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
39
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
40
- }));
41
- }
42
- ownKeys.forEach(function(key) {
43
- _define_property(target, key, source[key]);
44
- });
45
- }
46
- return target;
47
- }
48
- function ownKeys(object, enumerableOnly) {
49
- var keys = Object.keys(object);
50
- if (Object.getOwnPropertySymbols) {
51
- var symbols = Object.getOwnPropertySymbols(object);
52
- if (enumerableOnly) {
53
- symbols = symbols.filter(function(sym) {
54
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
55
- });
56
- }
57
- keys.push.apply(keys, symbols);
58
- }
59
- return keys;
60
- }
61
- function _object_spread_props(target, source) {
62
- source = source != null ? source : {};
63
- if (Object.getOwnPropertyDescriptors) {
64
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
65
- } else {
66
- ownKeys(Object(source)).forEach(function(key) {
67
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
68
- });
69
- }
70
- return target;
71
- }
72
- import { ChatOpenAI } from '@langchain/openai';
73
- import { createOpenRouter } from '@openrouter/ai-sdk-provider';
74
- /**
75
- * OpenRouter model wrapper supporting both LangChain and Vercel AI SDK
76
- */ export var OpenRouterModel = /*#__PURE__*/ function() {
77
- "use strict";
78
- function OpenRouterModel(providerConfig, modelName) {
79
- var modelConfig = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
80
- _class_call_check(this, OpenRouterModel);
81
- var _this_providerConfig_metadata, _this_providerConfig_metadata1;
82
- _define_property(this, "providerConfig", void 0);
83
- _define_property(this, "modelName", void 0);
84
- _define_property(this, "langchainModel", void 0);
85
- _define_property(this, "modelConfig", void 0);
86
- _define_property(this, "vercelModel", void 0);
87
- this.providerConfig = providerConfig;
88
- this.modelName = modelName;
89
- this.modelConfig = _object_spread({
90
- maxTokens: 256000,
91
- reasoning: {
92
- effort: 'high',
93
- exclude: true
94
- }
95
- }, modelConfig);
96
- // LangChain model setup
97
- this.langchainModel = new ChatOpenAI(_object_spread_props(_object_spread({
98
- configuration: {
99
- baseURL: 'https://openrouter.ai/api/v1',
100
- defaultHeaders: _object_spread({}, ((_this_providerConfig_metadata = this.providerConfig.metadata) === null || _this_providerConfig_metadata === void 0 ? void 0 : _this_providerConfig_metadata.website) && {
101
- 'HTTP-Referer': this.providerConfig.metadata.website
102
- }, ((_this_providerConfig_metadata1 = this.providerConfig.metadata) === null || _this_providerConfig_metadata1 === void 0 ? void 0 : _this_providerConfig_metadata1.application) && {
103
- 'X-Title': this.providerConfig.metadata.application
104
- })
105
- },
106
- maxTokens: this.modelConfig.maxTokens
107
- }, this.modelConfig.reasoning && {
108
- modelKwargs: {
109
- reasoning: this.modelConfig.reasoning
110
- }
111
- }), {
112
- modelName: this.modelName,
113
- openAIApiKey: this.providerConfig.apiKey
114
- }));
115
- // Vercel AI SDK model setup
116
- var openrouter = createOpenRouter({
117
- apiKey: this.providerConfig.apiKey
118
- });
119
- this.vercelModel = openrouter(this.modelName, _object_spread({}, this.modelConfig.maxTokens && {
120
- maxTokens: this.modelConfig.maxTokens
121
- }, this.modelConfig.reasoning && {
122
- extraBody: {
123
- reasoning: this.modelConfig.reasoning
124
- }
125
- }));
126
- }
127
- _create_class(OpenRouterModel, [
128
- {
129
- /**
130
- * Get the configured LangChain language model instance
131
- */ key: "getLangchainModel",
132
- value: function getLangchainModel() {
133
- return this.langchainModel;
134
- }
135
- },
136
- {
137
- /**
138
- * Get the configured Vercel AI SDK language model instance
139
- */ key: "getVercelModel",
140
- value: function getVercelModel() {
141
- return this.vercelModel;
142
- }
143
- }
144
- ]);
145
- return OpenRouterModel;
146
- }();
147
-
148
- //# sourceMappingURL=openrouter-model.adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/adapters/models/openrouter-model.adapter.ts"],"sourcesContent":["import type { BaseLanguageModel } from '@langchain/core/language_models/base';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { createOpenRouter } from '@openrouter/ai-sdk-provider';\nimport type { LanguageModelV1 } from 'ai';\n\nimport type { ModelConfig, ModelPort } from '../../ports/model.port.js';\n\nimport type { OpenRouterConfig } from '../providers/openrouter-provider.adapter.js';\n\n/**\n * OpenRouter model wrapper supporting both LangChain and Vercel AI SDK\n */\nexport class OpenRouterModel implements ModelPort {\n private readonly langchainModel: BaseLanguageModel;\n private readonly modelConfig: ModelConfig;\n private readonly vercelModel: LanguageModelV1;\n\n constructor(\n private readonly providerConfig: OpenRouterConfig,\n private readonly modelName: string,\n modelConfig: ModelConfig = {},\n ) {\n this.modelConfig = {\n maxTokens: 256_000,\n reasoning: {\n effort: 'high',\n exclude: true,\n },\n ...modelConfig,\n };\n\n // LangChain model setup\n this.langchainModel = new ChatOpenAI({\n configuration: {\n baseURL: 'https://openrouter.ai/api/v1',\n defaultHeaders: {\n ...(this.providerConfig.metadata?.website && {\n 'HTTP-Referer': this.providerConfig.metadata.website,\n }),\n ...(this.providerConfig.metadata?.application && {\n 'X-Title': this.providerConfig.metadata.application,\n }),\n },\n },\n maxTokens: this.modelConfig.maxTokens,\n ...(this.modelConfig.reasoning && {\n modelKwargs: {\n reasoning: this.modelConfig.reasoning,\n },\n }),\n modelName: this.modelName,\n openAIApiKey: this.providerConfig.apiKey,\n });\n\n // Vercel AI SDK model setup\n const openrouter = createOpenRouter({\n apiKey: this.providerConfig.apiKey,\n });\n\n this.vercelModel = openrouter(this.modelName, {\n ...(this.modelConfig.maxTokens && { maxTokens: this.modelConfig.maxTokens }),\n ...(this.modelConfig.reasoning && {\n extraBody: {\n reasoning: this.modelConfig.reasoning,\n },\n }),\n });\n }\n\n /**\n * Get the configured LangChain language model instance\n */\n getLangchainModel(): BaseLanguageModel {\n return this.langchainModel;\n }\n\n /**\n * Get the configured Vercel AI SDK language model instance\n */\n getVercelModel(): LanguageModelV1 {\n return this.vercelModel;\n }\n}\n"],"names":["ChatOpenAI","createOpenRouter","OpenRouterModel","providerConfig","modelName","modelConfig","langchainModel","vercelModel","maxTokens","reasoning","effort","exclude","configuration","baseURL","defaultHeaders","metadata","website","application","modelKwargs","openAIApiKey","apiKey","openrouter","extraBody","getLangchainModel","getVercelModel"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAASA,UAAU,QAAQ,oBAAoB;AAC/C,SAASC,gBAAgB,QAAQ,8BAA8B;AAO/D;;CAEC,GACD,OAAO,IAAA,AAAMC,gCAAN;;aAAMA,gBAML,AAAiBC,cAAgC,EACjD,AAAiBC,SAAiB;YAClCC,cAAAA,iEAA2B,CAAC;gCARvBH;YAwBW,+BAGA;;;QA1BpB,uBAAiBI,kBAAjB,KAAA;QACA,uBAAiBD,eAAjB,KAAA;QACA,uBAAiBE,eAAjB,KAAA;aAGqBJ,iBAAAA;aACAC,YAAAA;QAGjB,IAAI,CAACC,WAAW,GAAG;YACfG,WAAW;YACXC,WAAW;gBACPC,QAAQ;gBACRC,SAAS;YACb;WACGN;QAGP,wBAAwB;QACxB,IAAI,CAACC,cAAc,GAAG,IAAIN,WAAW;YACjCY,eAAe;gBACXC,SAAS;gBACTC,gBAAgB,mBACR,EAAA,gCAAA,IAAI,CAACX,cAAc,CAACY,QAAQ,cAA5B,oDAAA,8BAA8BC,OAAO,KAAI;oBACzC,gBAAgB,IAAI,CAACb,cAAc,CAACY,QAAQ,CAACC,OAAO;gBACxD,GACI,EAAA,iCAAA,IAAI,CAACb,cAAc,CAACY,QAAQ,cAA5B,qDAAA,+BAA8BE,WAAW,KAAI;oBAC7C,WAAW,IAAI,CAACd,cAAc,CAACY,QAAQ,CAACE,WAAW;gBACvD;YAER;YACAT,WAAW,IAAI,CAACH,WAAW,CAACG,SAAS;WACjC,IAAI,CAACH,WAAW,CAACI,SAAS,IAAI;YAC9BS,aAAa;gBACTT,WAAW,IAAI,CAACJ,WAAW,CAACI,SAAS;YACzC;QACJ;YACAL,WAAW,IAAI,CAACA,SAAS;YACzBe,cAAc,IAAI,CAAChB,cAAc,CAACiB,MAAM;;QAG5C,4BAA4B;QAC5B,IAAMC,aAAapB,iBAAiB;YAChCmB,QAAQ,IAAI,CAACjB,cAAc,CAACiB,MAAM;QACtC;QAEA,IAAI,CAACb,WAAW,GAAGc,WAAW,IAAI,CAACjB,SAAS,EAAE,mBACtC,IAAI,CAACC,WAAW,CAACG,SAAS,IAAI;YAAEA,WAAW,IAAI,CAACH,WAAW,CAACG,SAAS;QAAC,GACtE,IAAI,CAACH,WAAW,CAACI,SAAS,IAAI;YAC9Ba,WAAW;gBACPb,WAAW,IAAI,CAACJ,WAAW,CAACI,SAAS;YACzC;QACJ;;kBArDCP;;YAyDT;;KAEC,GACDqB,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACjB,cAAc;YAC9B;;;YAEA;;KAEC,GACDkB,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACjB,WAAW;YAC3B;;;WArESL;IAsEZ"}