@x12i/ai-gateway 7.9.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 (179) hide show
  1. package/README.md +4259 -0
  2. package/config.defaults.json +31 -0
  3. package/dist/activity-manager.d.ts +206 -0
  4. package/dist/activity-manager.js +1051 -0
  5. package/dist/config/activity-tracking-config.d.ts +11 -0
  6. package/dist/config/activity-tracking-config.js +15 -0
  7. package/dist/config.defaults.json +31 -0
  8. package/dist/content-normalizer/content-normalizer.d.ts +46 -0
  9. package/dist/content-normalizer/content-normalizer.js +393 -0
  10. package/dist/content-normalizer/index.d.ts +7 -0
  11. package/dist/content-normalizer/index.js +6 -0
  12. package/dist/content-normalizer/types.d.ts +33 -0
  13. package/dist/content-normalizer/types.js +4 -0
  14. package/dist/defaults/instructions-blocks.json +61 -0
  15. package/dist/defaults/model-config.json +16 -0
  16. package/dist/defaults/template-rendering.json +6 -0
  17. package/dist/flex-md-loader.d.ts +109 -0
  18. package/dist/flex-md-loader.js +940 -0
  19. package/dist/gateway-config.d.ts +49 -0
  20. package/dist/gateway-config.js +292 -0
  21. package/dist/gateway-conversion.d.ts +29 -0
  22. package/dist/gateway-conversion.js +174 -0
  23. package/dist/gateway-instructions.d.ts +30 -0
  24. package/dist/gateway-instructions.js +62 -0
  25. package/dist/gateway-memory.d.ts +51 -0
  26. package/dist/gateway-memory.js +207 -0
  27. package/dist/gateway-messages.d.ts +23 -0
  28. package/dist/gateway-messages.js +83 -0
  29. package/dist/gateway-meta.d.ts +25 -0
  30. package/dist/gateway-meta.js +87 -0
  31. package/dist/gateway-provider-auto-register.d.ts +17 -0
  32. package/dist/gateway-provider-auto-register.js +159 -0
  33. package/dist/gateway-provider.d.ts +54 -0
  34. package/dist/gateway-provider.js +202 -0
  35. package/dist/gateway-rate-limiter-constants.d.ts +16 -0
  36. package/dist/gateway-rate-limiter-constants.js +16 -0
  37. package/dist/gateway-rate-limiter.d.ts +56 -0
  38. package/dist/gateway-rate-limiter.js +107 -0
  39. package/dist/gateway-retry.d.ts +49 -0
  40. package/dist/gateway-retry.js +204 -0
  41. package/dist/gateway-utils.d.ts +21 -0
  42. package/dist/gateway-utils.js +181 -0
  43. package/dist/gateway-validation.d.ts +13 -0
  44. package/dist/gateway-validation.js +50 -0
  45. package/dist/gateway.d.ts +39 -0
  46. package/dist/gateway.js +430 -0
  47. package/dist/index.d.ts +36 -0
  48. package/dist/index.js +55 -0
  49. package/dist/instruction-errors.d.ts +16 -0
  50. package/dist/instruction-errors.js +29 -0
  51. package/dist/instruction-optimizer.d.ts +113 -0
  52. package/dist/instruction-optimizer.js +293 -0
  53. package/dist/instructions-parser.d.ts +31 -0
  54. package/dist/instructions-parser.js +56 -0
  55. package/dist/logger-factory.d.ts +17 -0
  56. package/dist/logger-factory.js +42 -0
  57. package/dist/message-builder.d.ts +41 -0
  58. package/dist/message-builder.js +522 -0
  59. package/dist/object-types-library-integration.d.ts +22 -0
  60. package/dist/object-types-library-integration.js +27 -0
  61. package/dist/object-types-library.d.ts +351 -0
  62. package/dist/object-types-library.js +210 -0
  63. package/dist/output-auditor.d.ts +44 -0
  64. package/dist/output-auditor.js +49 -0
  65. package/dist/request-report-generator.d.ts +60 -0
  66. package/dist/request-report-generator.js +169 -0
  67. package/dist/response-analyzer/format-type-detector.d.ts +35 -0
  68. package/dist/response-analyzer/format-type-detector.js +115 -0
  69. package/dist/response-analyzer/index.d.ts +9 -0
  70. package/dist/response-analyzer/index.js +8 -0
  71. package/dist/response-analyzer/object-type-detector.d.ts +42 -0
  72. package/dist/response-analyzer/object-type-detector.js +95 -0
  73. package/dist/response-analyzer/response-analyzer.d.ts +38 -0
  74. package/dist/response-analyzer/response-analyzer.js +97 -0
  75. package/dist/response-analyzer/types.d.ts +97 -0
  76. package/dist/response-analyzer/types.js +4 -0
  77. package/dist/response-fallback-fixer.d.ts +11 -0
  78. package/dist/response-fallback-fixer.js +123 -0
  79. package/dist/runtime-objects.d.ts +52 -0
  80. package/dist/runtime-objects.js +46 -0
  81. package/dist/template-parser.d.ts +58 -0
  82. package/dist/template-parser.js +99 -0
  83. package/dist/template-render-merge.d.ts +9 -0
  84. package/dist/template-render-merge.js +40 -0
  85. package/dist/troubleshooting-helper.d.ts +123 -0
  86. package/dist/troubleshooting-helper.js +596 -0
  87. package/dist/types.d.ts +1173 -0
  88. package/dist/types.js +6 -0
  89. package/dist/usage-tracker.d.ts +78 -0
  90. package/dist/usage-tracker.js +79 -0
  91. package/dist-cjs/activity-manager.cjs +1056 -0
  92. package/dist-cjs/activity-manager.d.ts +206 -0
  93. package/dist-cjs/config/activity-tracking-config.cjs +18 -0
  94. package/dist-cjs/config/activity-tracking-config.d.ts +11 -0
  95. package/dist-cjs/config.defaults.json +31 -0
  96. package/dist-cjs/content-normalizer/content-normalizer.cjs +398 -0
  97. package/dist-cjs/content-normalizer/content-normalizer.d.ts +46 -0
  98. package/dist-cjs/content-normalizer/index.cjs +12 -0
  99. package/dist-cjs/content-normalizer/index.d.ts +7 -0
  100. package/dist-cjs/content-normalizer/types.cjs +5 -0
  101. package/dist-cjs/content-normalizer/types.d.ts +33 -0
  102. package/dist-cjs/defaults/instructions-blocks.json +61 -0
  103. package/dist-cjs/defaults/model-config.json +16 -0
  104. package/dist-cjs/defaults/template-rendering.json +6 -0
  105. package/dist-cjs/flex-md-loader.cjs +986 -0
  106. package/dist-cjs/flex-md-loader.d.ts +109 -0
  107. package/dist-cjs/gateway-config.cjs +331 -0
  108. package/dist-cjs/gateway-config.d.ts +49 -0
  109. package/dist-cjs/gateway-conversion.cjs +212 -0
  110. package/dist-cjs/gateway-conversion.d.ts +29 -0
  111. package/dist-cjs/gateway-instructions.cjs +67 -0
  112. package/dist-cjs/gateway-instructions.d.ts +30 -0
  113. package/dist-cjs/gateway-memory.cjs +211 -0
  114. package/dist-cjs/gateway-memory.d.ts +51 -0
  115. package/dist-cjs/gateway-messages.cjs +86 -0
  116. package/dist-cjs/gateway-messages.d.ts +23 -0
  117. package/dist-cjs/gateway-meta.cjs +90 -0
  118. package/dist-cjs/gateway-meta.d.ts +25 -0
  119. package/dist-cjs/gateway-provider-auto-register.cjs +195 -0
  120. package/dist-cjs/gateway-provider-auto-register.d.ts +17 -0
  121. package/dist-cjs/gateway-provider.cjs +214 -0
  122. package/dist-cjs/gateway-provider.d.ts +54 -0
  123. package/dist-cjs/gateway-rate-limiter-constants.cjs +19 -0
  124. package/dist-cjs/gateway-rate-limiter-constants.d.ts +16 -0
  125. package/dist-cjs/gateway-rate-limiter.cjs +111 -0
  126. package/dist-cjs/gateway-rate-limiter.d.ts +56 -0
  127. package/dist-cjs/gateway-retry.cjs +212 -0
  128. package/dist-cjs/gateway-retry.d.ts +49 -0
  129. package/dist-cjs/gateway-utils.cjs +219 -0
  130. package/dist-cjs/gateway-utils.d.ts +21 -0
  131. package/dist-cjs/gateway-validation.cjs +54 -0
  132. package/dist-cjs/gateway-validation.d.ts +13 -0
  133. package/dist-cjs/gateway.cjs +434 -0
  134. package/dist-cjs/gateway.d.ts +39 -0
  135. package/dist-cjs/index.cjs +108 -0
  136. package/dist-cjs/index.d.ts +36 -0
  137. package/dist-cjs/instruction-errors.cjs +34 -0
  138. package/dist-cjs/instruction-errors.d.ts +16 -0
  139. package/dist-cjs/instruction-optimizer.cjs +299 -0
  140. package/dist-cjs/instruction-optimizer.d.ts +113 -0
  141. package/dist-cjs/instructions-parser.cjs +61 -0
  142. package/dist-cjs/instructions-parser.d.ts +31 -0
  143. package/dist-cjs/logger-factory.cjs +45 -0
  144. package/dist-cjs/logger-factory.d.ts +17 -0
  145. package/dist-cjs/message-builder.cjs +558 -0
  146. package/dist-cjs/message-builder.d.ts +41 -0
  147. package/dist-cjs/object-types-library-integration.cjs +32 -0
  148. package/dist-cjs/object-types-library-integration.d.ts +22 -0
  149. package/dist-cjs/object-types-library.cjs +215 -0
  150. package/dist-cjs/object-types-library.d.ts +351 -0
  151. package/dist-cjs/output-auditor.cjs +52 -0
  152. package/dist-cjs/output-auditor.d.ts +44 -0
  153. package/dist-cjs/request-report-generator.cjs +172 -0
  154. package/dist-cjs/request-report-generator.d.ts +60 -0
  155. package/dist-cjs/response-analyzer/format-type-detector.cjs +119 -0
  156. package/dist-cjs/response-analyzer/format-type-detector.d.ts +35 -0
  157. package/dist-cjs/response-analyzer/index.cjs +14 -0
  158. package/dist-cjs/response-analyzer/index.d.ts +9 -0
  159. package/dist-cjs/response-analyzer/object-type-detector.cjs +99 -0
  160. package/dist-cjs/response-analyzer/object-type-detector.d.ts +42 -0
  161. package/dist-cjs/response-analyzer/response-analyzer.cjs +101 -0
  162. package/dist-cjs/response-analyzer/response-analyzer.d.ts +38 -0
  163. package/dist-cjs/response-analyzer/types.cjs +5 -0
  164. package/dist-cjs/response-analyzer/types.d.ts +97 -0
  165. package/dist-cjs/response-fallback-fixer.cjs +126 -0
  166. package/dist-cjs/response-fallback-fixer.d.ts +11 -0
  167. package/dist-cjs/runtime-objects.cjs +52 -0
  168. package/dist-cjs/runtime-objects.d.ts +52 -0
  169. package/dist-cjs/template-parser.cjs +136 -0
  170. package/dist-cjs/template-parser.d.ts +58 -0
  171. package/dist-cjs/template-render-merge.cjs +43 -0
  172. package/dist-cjs/template-render-merge.d.ts +9 -0
  173. package/dist-cjs/troubleshooting-helper.cjs +611 -0
  174. package/dist-cjs/troubleshooting-helper.d.ts +123 -0
  175. package/dist-cjs/types.cjs +7 -0
  176. package/dist-cjs/types.d.ts +1173 -0
  177. package/dist-cjs/usage-tracker.cjs +83 -0
  178. package/dist-cjs/usage-tracker.d.ts +78 -0
  179. package/package.json +91 -0
@@ -0,0 +1,434 @@
1
+ "use strict";
2
+ /**
3
+ * @x12i/ai-gateway
4
+ *
5
+ * Simplified AI Gateway - Clean proxy implementation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AIGateway = void 0;
9
+ const gateway_validation_js_1 = require("./gateway-validation.cjs");
10
+ const activity_manager_js_1 = require("./activity-manager.cjs");
11
+ const gateway_config_js_1 = require("./gateway-config.cjs");
12
+ const message_builder_js_1 = require("./message-builder.cjs");
13
+ const flex_md_loader_js_1 = require("./flex-md-loader.cjs");
14
+ const gateway_utils_js_1 = require("./gateway-utils.cjs");
15
+ const gateway_provider_auto_register_js_1 = require("./gateway-provider-auto-register.cjs");
16
+ const runtime_objects_js_1 = require("./runtime-objects.cjs");
17
+ /** Error message thrown by the router when no provider is registered or specified */
18
+ const NO_PROVIDER_ERROR = 'No provider specified and no providers registered';
19
+ const NO_PROVIDER_HINT = ' Set OPEN_ROUTER_KEY (or OPENROUTER_API_KEY) in the environment to use OpenRouter, or register a provider with the router (e.g. via autoRegisterProviders or gateway config).';
20
+ /**
21
+ * Simplified AI Gateway - Clean proxy implementation
22
+ */
23
+ class AIGateway {
24
+ router;
25
+ config;
26
+ logger;
27
+ activityManager;
28
+ messageBuilderConfig;
29
+ _autoRegisterDone = false;
30
+ constructor(config = {}, activityManager) {
31
+ this.config = config;
32
+ this.activityManager = activityManager;
33
+ // Load configuration and initialize components
34
+ const { defaultModelConfig, defaultInstructionsBlocks, defaultTemplateRendering } = (0, gateway_config_js_1.loadConfig)();
35
+ const components = (0, gateway_config_js_1.initializeGatewayComponents)(config, defaultModelConfig, defaultInstructionsBlocks, defaultTemplateRendering);
36
+ this.logger = components.logger;
37
+ this.router = components.router;
38
+ this.activityManager = components.activityManager;
39
+ this.messageBuilderConfig = components.messageBuilderConfig;
40
+ (0, runtime_objects_js_1.setGatewayRuntimeClients)({
41
+ activix: this.activityManager?.getTracker(),
42
+ logger: this.logger
43
+ });
44
+ this.logger.info('AI Gateway initialized with full component stack', {
45
+ hasActivityManager: !!this.activityManager,
46
+ hasMessageBuilder: !!this.messageBuilderConfig
47
+ });
48
+ }
49
+ /**
50
+ * Invoke chat request (without structured output requirements)
51
+ */
52
+ async invokeChat(request) {
53
+ const startTime = Date.now();
54
+ // Basic validation
55
+ (0, gateway_validation_js_1.validateChatRequest)(request);
56
+ if (!this.activityManager) {
57
+ (0, activity_manager_js_1.ensureGatewayRequestIdentity)(request);
58
+ }
59
+ (0, runtime_objects_js_1.setGatewayLastJobId)(resolveRuntimeJobId(request));
60
+ // Generate simple task type ID
61
+ const taskTypeId = request.taskTypeId || `task-${Date.now()}`;
62
+ // Simple message construction
63
+ const messages = this.buildSimpleMessages(request);
64
+ // Merge config (modelConfig > request.config > gateway defaults)
65
+ const mergedConfig = await (0, gateway_utils_js_1.mergeConfig)(request, this.config, this.logger);
66
+ // Lazy auto-register providers from env (OPENAI_API_KEY, etc.) so consumers don't have to call init
67
+ if (!this._autoRegisterDone) {
68
+ await (0, gateway_provider_auto_register_js_1.autoRegisterProviders)(this.router, this.logger);
69
+ this._autoRegisterDone = true;
70
+ }
71
+ // Start activity tracking if available
72
+ let activity = undefined;
73
+ if (this.activityManager) {
74
+ try {
75
+ activity = await this.activityManager.startActivity(request, startTime);
76
+ }
77
+ catch (activityError) {
78
+ // Log activity tracking error but don't fail the request
79
+ this.logger.warn('Failed to start activity tracking', {
80
+ aiRequestId: request.aiRequestId,
81
+ error: activityError instanceof Error ? activityError.message : String(activityError)
82
+ });
83
+ }
84
+ }
85
+ try {
86
+ // Call router directly with merged config
87
+ const response = await this.router.invoke({
88
+ request: {
89
+ messages,
90
+ config: mergedConfig,
91
+ identity: request.identity
92
+ },
93
+ mode: 'sync'
94
+ });
95
+ // Create enhanced response
96
+ const enhancedResponse = {
97
+ content: response.content || '',
98
+ metadata: {
99
+ aiRequestId: request.aiRequestId,
100
+ identity: request.identity,
101
+ latencyMs: Date.now() - startTime,
102
+ tokens: response.usage || { prompt: 0, completion: 0, total: 0 },
103
+ taskTypeId,
104
+ agentType: 'chat'
105
+ }
106
+ };
107
+ // Track activity success if activity was started
108
+ if (activity) {
109
+ try {
110
+ await this.activityManager.logSuccess(activity, {
111
+ response: enhancedResponse,
112
+ endTime: Date.now(),
113
+ duration: Date.now() - startTime
114
+ });
115
+ }
116
+ catch (activityError) {
117
+ // Log activity tracking error but don't fail the request
118
+ this.logger.warn('Failed to track activity success', {
119
+ aiRequestId: request.aiRequestId,
120
+ error: activityError instanceof Error ? activityError.message : String(activityError)
121
+ });
122
+ }
123
+ }
124
+ return enhancedResponse;
125
+ }
126
+ catch (error) {
127
+ const err = error instanceof Error ? error : new Error(String(error));
128
+ if (err.message.includes(NO_PROVIDER_ERROR)) {
129
+ throw new Error(err.message + NO_PROVIDER_HINT);
130
+ }
131
+ throw err;
132
+ }
133
+ }
134
+ /**
135
+ * Invoke AI request (with structured output support)
136
+ */
137
+ async invoke(request) {
138
+ const startTime = Date.now();
139
+ // Basic validation
140
+ (0, gateway_validation_js_1.validateAIRequest)(request);
141
+ if (!this.activityManager) {
142
+ (0, activity_manager_js_1.ensureGatewayRequestIdentity)(request);
143
+ }
144
+ (0, runtime_objects_js_1.setGatewayLastJobId)(resolveRuntimeJobId(request));
145
+ // Generate simple task type ID
146
+ const taskTypeId = request.taskTypeId || `task-${Date.now()}`;
147
+ // Resolve instructions and build messages using proper components
148
+ let resolvedRequest = request;
149
+ let messages = [];
150
+ // Create parsedSnapshot to store parsed request data and messages
151
+ const parsedSnapshot = {};
152
+ // Use proper instruction resolution and message building
153
+ let builtMessages;
154
+ try {
155
+ builtMessages = await (0, message_builder_js_1.buildMessages)(request, this.messageBuilderConfig, {
156
+ parsedSnapshot
157
+ });
158
+ messages = builtMessages.messages;
159
+ resolvedRequest = request;
160
+ }
161
+ catch (error) {
162
+ // If message building fails (e.g., prompt/instruction resolution error), log as bad request
163
+ const err = error instanceof Error ? error : new Error(String(error));
164
+ const endTime = Date.now();
165
+ const duration = endTime - startTime;
166
+ // Determine if this is a prompt/instruction resolution error
167
+ // If a key was provided but couldn't be resolved to content, it's a bad request
168
+ const errWithCode = err; // Type assertion for error with optional code property
169
+ const isResolutionError = err.name === 'InstructionNotFoundError' ||
170
+ err.name === 'InstructionBackendError' ||
171
+ err.name === 'TemplateResolutionError' ||
172
+ errWithCode.code === 'PROMPT_NOT_FOUND' ||
173
+ errWithCode.code === 'PROMPT_RESOLUTION_ERROR' ||
174
+ errWithCode.code === 'PROMPT_RENDERED_EMPTY' ||
175
+ errWithCode.code === 'TEMPLATE_RESOLUTION_ERROR' ||
176
+ errWithCode.code === 'TEMPLATE_VARIABLE_MISSING' ||
177
+ err.message.includes('Failed to resolve') ||
178
+ err.message.includes('Failed to render prompt template') ||
179
+ err.message.includes('not found') ||
180
+ err.message.includes('Instruction not found') ||
181
+ err.message.includes('Prompt not found');
182
+ if (isResolutionError && this.activityManager) {
183
+ // Log to bad requests collection
184
+ await this.activityManager.logBadRequest(request, err, {
185
+ endTime,
186
+ duration,
187
+ error: err.message,
188
+ errorType: errWithCode.code || 'MessageBuildError',
189
+ diagnosticInfo: {
190
+ errorCode: errWithCode.code,
191
+ errorName: err.name,
192
+ failureType: 'validation-failure',
193
+ stage: 'message-building',
194
+ prompt: request.prompt,
195
+ instructions: typeof request.instructions === 'string' ? request.instructions.substring(0, 100) : '(object)'
196
+ },
197
+ failureType: 'validation-failure'
198
+ }, startTime);
199
+ }
200
+ // Re-throw the error so it propagates to the caller
201
+ throw err;
202
+ }
203
+ // Store messages in parsedSnapshot for activity tracking
204
+ parsedSnapshot.messages = messages;
205
+ // parsed.instructions and parsed.prompt are set by buildMessages to the resolved/rendered content
206
+ // (after key resolution and Rendrix). Do not overwrite with raw request keys.
207
+ if (parsedSnapshot.context === undefined) {
208
+ parsedSnapshot.context = request.context;
209
+ }
210
+ // Attach parsedSnapshot to request for activity tracking
211
+ request._parsedRequest = parsedSnapshot;
212
+ // Merge config (modelConfig > request.config > gateway defaults)
213
+ const mergedConfig = await (0, gateway_utils_js_1.mergeConfig)(request, this.config, this.logger);
214
+ // Lazy auto-register providers from env (OPENAI_API_KEY, etc.) so consumers don't have to call init
215
+ if (!this._autoRegisterDone) {
216
+ await (0, gateway_provider_auto_register_js_1.autoRegisterProviders)(this.router, this.logger);
217
+ this._autoRegisterDone = true;
218
+ }
219
+ // Start activity tracking if available
220
+ let activity = undefined;
221
+ if (this.activityManager) {
222
+ try {
223
+ activity = await this.activityManager.startActivity(request, startTime);
224
+ }
225
+ catch (activityError) {
226
+ // Log activity tracking error but don't fail the request
227
+ this.logger.warn('Failed to start activity tracking', {
228
+ aiRequestId: request.aiRequestId,
229
+ error: activityError instanceof Error ? activityError.message : String(activityError)
230
+ });
231
+ }
232
+ }
233
+ try {
234
+ // Call router directly with merged config
235
+ const response = await this.router.invoke({
236
+ request: {
237
+ messages,
238
+ config: mergedConfig,
239
+ identity: request.identity
240
+ },
241
+ mode: 'sync'
242
+ });
243
+ // Contract output processing removed - expectedSchema no longer supported
244
+ // Create enhanced response - extract content properly from router response
245
+ const routerResponse = response;
246
+ // Extract content from router response - router returns outputText, not content
247
+ let content = routerResponse.content || routerResponse.outputText || '';
248
+ // If content is still empty, try to extract from ai-activities metadata
249
+ if (!content && routerResponse.metadata?.['ai-activities-response']?.outputText) {
250
+ content = routerResponse.metadata['ai-activities-response'].outputText;
251
+ }
252
+ // Parse content using available parsers (flex-md, content normalizer, etc.)
253
+ let parsedContent = undefined;
254
+ let contentType = undefined;
255
+ let parsingMethod = undefined;
256
+ // Actually use flex-md parsing - extract structured data from markdown
257
+ try {
258
+ this.logger.debug('Attempting flex-md extraction', {
259
+ aiRequestId: request.aiRequestId,
260
+ contentLength: content.length,
261
+ hasInstructions: !!resolvedRequest.instructions
262
+ });
263
+ // Let flex-md extract structured data from the response content
264
+ const extractionResult = await (0, flex_md_loader_js_1.extractJsonFromFlexMd)(content);
265
+ this.logger.debug('Flex-md extraction result', {
266
+ aiRequestId: request.aiRequestId,
267
+ hasResult: !!extractionResult,
268
+ hasJson: !!(extractionResult && extractionResult.json),
269
+ method: extractionResult?.method,
270
+ jsonType: extractionResult?.json ? typeof extractionResult.json : 'none'
271
+ });
272
+ if (extractionResult && extractionResult.json) {
273
+ // Successfully extracted structured data
274
+ parsedContent = extractionResult.json;
275
+ this.logger.info('Flex-md extraction successful - parsed into structured object', {
276
+ aiRequestId: request.aiRequestId,
277
+ method: extractionResult.method,
278
+ extractedKeys: Object.keys(extractionResult.json)
279
+ });
280
+ }
281
+ else {
282
+ // Extraction failed, fall back to raw text wrapper
283
+ this.logger.warn('Flex-md extraction failed - no structured data extracted', {
284
+ aiRequestId: request.aiRequestId,
285
+ hasResult: !!extractionResult,
286
+ method: extractionResult?.method || 'none'
287
+ });
288
+ parsedContent = { rawText: content };
289
+ }
290
+ }
291
+ catch (extractionError) {
292
+ // Extraction failed, fall back to raw text wrapper
293
+ const errorMessage = extractionError instanceof Error ? extractionError.message : String(extractionError);
294
+ this.logger.warn('Flex-md extraction failed - flex-md library compatibility issue', {
295
+ aiRequestId: request.aiRequestId,
296
+ error: errorMessage,
297
+ issue: 'flex-md uses require() in ES module context - needs fixing in flex-md-loader.ts',
298
+ fallback: 'using rawText wrapper'
299
+ });
300
+ parsedContent = { rawText: content };
301
+ }
302
+ contentType = 'structured';
303
+ parsingMethod = 'flex-md';
304
+ // Extract token usage properly
305
+ let tokens = { prompt: 0, completion: 0, total: 0 };
306
+ if (routerResponse.usage) {
307
+ tokens = {
308
+ prompt: routerResponse.usage.promptTokens || routerResponse.usage.inputTokens || 0,
309
+ completion: routerResponse.usage.completionTokens || routerResponse.usage.outputTokens || 0,
310
+ total: routerResponse.usage.totalTokens || 0
311
+ };
312
+ }
313
+ else if (routerResponse.metadata?.['ai-activities-response']?.usage) {
314
+ const usage = routerResponse.metadata['ai-activities-response'].usage;
315
+ tokens = {
316
+ prompt: usage.promptTokens || usage.inputTokens || 0,
317
+ completion: usage.completionTokens || usage.outputTokens || 0,
318
+ total: usage.totalTokens || 0
319
+ };
320
+ }
321
+ const enhancedResponse = {
322
+ content: content,
323
+ parsedContent: parsedContent,
324
+ metadata: {
325
+ aiRequestId: request.aiRequestId,
326
+ identity: request.identity,
327
+ latencyMs: Date.now() - startTime,
328
+ tokens: tokens,
329
+ taskTypeId,
330
+ agentType: 'ai',
331
+ contentType,
332
+ parsingMethod
333
+ }
334
+ };
335
+ // Track activity success if activity was started
336
+ if (activity) {
337
+ try {
338
+ // Create activity response with proper structure for ActivityTracker
339
+ const activityResponse = {
340
+ content: {
341
+ rawContent: content, // Store the actual response content as rawContent
342
+ fullResponse: routerResponse.rawResponse || routerResponse // Include full router response
343
+ },
344
+ parsed: parsedContent, // Include parsed content in activity record
345
+ metadata: enhancedResponse.metadata,
346
+ status: 'success',
347
+ error: null,
348
+ usage: tokens
349
+ };
350
+ await this.activityManager.logSuccess(activity, {
351
+ response: activityResponse,
352
+ endTime: Date.now(),
353
+ duration: Date.now() - startTime
354
+ });
355
+ }
356
+ catch (activityError) {
357
+ // Log activity tracking error but don't fail the request
358
+ this.logger.warn('Failed to track activity success', {
359
+ aiRequestId: request.aiRequestId,
360
+ error: activityError instanceof Error ? activityError.message : String(activityError)
361
+ });
362
+ }
363
+ }
364
+ console.debug('gateway: enhancedResponse:', enhancedResponse);
365
+ return enhancedResponse;
366
+ }
367
+ catch (error) {
368
+ const err = error instanceof Error ? error : new Error(String(error));
369
+ if (err.message.includes(NO_PROVIDER_ERROR)) {
370
+ throw new Error(err.message + NO_PROVIDER_HINT);
371
+ }
372
+ throw err;
373
+ }
374
+ }
375
+ /**
376
+ * Build simple messages from request (instructions and prompt as literal template text; no registry).
377
+ */
378
+ buildSimpleMessages(request) {
379
+ const messages = [];
380
+ // Add instructions as system message if present
381
+ if (request.instructions) {
382
+ const instructions = typeof request.instructions === 'string'
383
+ ? request.instructions
384
+ : 'Default instructions';
385
+ messages.push({ role: 'system', content: instructions });
386
+ }
387
+ // Add context as assistant message if present
388
+ if (request.context) {
389
+ const context = typeof request.context === 'string'
390
+ ? request.context
391
+ : JSON.stringify(request.context);
392
+ messages.push({ role: 'assistant', content: context });
393
+ }
394
+ // Add prompt/input as user message
395
+ // Input field has been removed - prompt template should contain {{input}} which resolves from workingMemory.input
396
+ const userContent = request.prompt || '';
397
+ if (userContent) {
398
+ messages.push({ role: 'user', content: userContent });
399
+ }
400
+ // Add direct messages if present
401
+ if (request.messages) {
402
+ messages.push(...request.messages);
403
+ }
404
+ return messages;
405
+ }
406
+ // Provider management methods
407
+ register(provider) {
408
+ this.router.registerProvider(provider);
409
+ }
410
+ listProviders() {
411
+ return this.router.listProviders ? this.router.listProviders() : [];
412
+ }
413
+ // Utility methods
414
+ getRouter() {
415
+ return this.router;
416
+ }
417
+ getLogger() {
418
+ return this.logger;
419
+ }
420
+ getActivityManager() {
421
+ return this.activityManager;
422
+ }
423
+ setActivityManager(activityManager) {
424
+ this.activityManager = activityManager;
425
+ (0, runtime_objects_js_1.setGatewayRuntimeClients)({
426
+ activix: this.activityManager.getTracker(),
427
+ logger: this.logger
428
+ });
429
+ }
430
+ }
431
+ exports.AIGateway = AIGateway;
432
+ function resolveRuntimeJobId(request) {
433
+ return request.identity?.jobId ?? request.jobId ?? request.identity?.sessionId ?? request.aiRequestId;
434
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @x12i/ai-gateway
3
+ *
4
+ * Simplified AI Gateway - Clean proxy implementation
5
+ */
6
+ import { LLMProviderRouter } from '@x12i/ai-providers-router';
7
+ import type { GatewayConfig, ChatRequest, AIRequest, EnhancedLLMResponse } from './types.js';
8
+ import type { Logxer } from '@x12i/logxer';
9
+ import { ActivityManager } from './activity-manager.js';
10
+ /**
11
+ * Simplified AI Gateway - Clean proxy implementation
12
+ */
13
+ export declare class AIGateway {
14
+ private router;
15
+ private config;
16
+ private logger;
17
+ private activityManager?;
18
+ private messageBuilderConfig?;
19
+ private _autoRegisterDone;
20
+ constructor(config?: GatewayConfig, activityManager?: ActivityManager);
21
+ /**
22
+ * Invoke chat request (without structured output requirements)
23
+ */
24
+ invokeChat<TContent = unknown>(request: ChatRequest): Promise<EnhancedLLMResponse<TContent>>;
25
+ /**
26
+ * Invoke AI request (with structured output support)
27
+ */
28
+ invoke<TContent = unknown>(request: AIRequest): Promise<EnhancedLLMResponse<TContent>>;
29
+ /**
30
+ * Build simple messages from request (instructions and prompt as literal template text; no registry).
31
+ */
32
+ private buildSimpleMessages;
33
+ register(provider: any): void;
34
+ listProviders(): string[];
35
+ getRouter(): LLMProviderRouter;
36
+ getLogger(): Logxer;
37
+ getActivityManager(): ActivityManager | undefined;
38
+ setActivityManager(activityManager: ActivityManager): void;
39
+ }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * @x12i/ai-gateway
4
+ *
5
+ * Unified gateway for LLM provider routing and management.
6
+ * This package exposes all functionality from @x12i/ai-providers-router
7
+ * with enhanced features: context propagation, usage tier tracking, and comprehensive metadata.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
21
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.resetObjectTypesLibrary = exports.getObjectTypesLibrary = exports.initializeObjectTypesLibrary = exports.getObjectTypesForAgent = exports.getObjectType = exports.OBJECT_TYPES_LIBRARY = exports.assertValidAIRequest = exports.formatDiagnostic = exports.runValidationTests = exports.createValidationTestCases = exports.createTestAIRequest = exports.supportsJSONMode = exports.diagnoseResponse = exports.diagnoseRequest = exports.validateResponse = exports.extractJSON = exports.validateJSON = exports.validateAIRequest = exports.DEFAULT_RATE_LIMIT_ENABLED = exports.DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS = exports.GatewayRateLimiter = exports.runtimeObjects = exports.createLogxer = exports.ensureGatewayRequestIdentity = exports.ActivityManager = exports.Activix = exports.mergeTemplateRenderOptions = exports.autoRegisterProviders = exports.InstructionBackendError = exports.InstructionNotFoundError = exports.AIGateway = exports.FallbackExhaustedError = exports.ProviderNotFoundError = exports.createRouterFromConfig = exports.createRouter = exports.LLMProviderRouter = void 0;
25
+ // Re-export router class and types (base functionality)
26
+ var ai_providers_router_1 = require("@x12i/ai-providers-router");
27
+ Object.defineProperty(exports, "LLMProviderRouter", { enumerable: true, get: function () { return ai_providers_router_1.LLMProviderRouter; } });
28
+ // Re-export factory functions
29
+ var ai_providers_router_2 = require("@x12i/ai-providers-router");
30
+ Object.defineProperty(exports, "createRouter", { enumerable: true, get: function () { return ai_providers_router_2.createRouter; } });
31
+ Object.defineProperty(exports, "createRouterFromConfig", { enumerable: true, get: function () { return ai_providers_router_2.createRouterFromConfig; } });
32
+ // Re-export error classes
33
+ var ai_providers_router_3 = require("@x12i/ai-providers-router");
34
+ Object.defineProperty(exports, "ProviderNotFoundError", { enumerable: true, get: function () { return ai_providers_router_3.ProviderNotFoundError; } });
35
+ Object.defineProperty(exports, "FallbackExhaustedError", { enumerable: true, get: function () { return ai_providers_router_3.FallbackExhaustedError; } });
36
+ // Re-export all from router (includes everything it exports)
37
+ __exportStar(require("@x12i/ai-providers-router"), exports);
38
+ // Export enhanced gateway
39
+ var gateway_js_1 = require("./gateway.cjs");
40
+ Object.defineProperty(exports, "AIGateway", { enumerable: true, get: function () { return gateway_js_1.AIGateway; } });
41
+ var instruction_errors_js_1 = require("./instruction-errors.cjs");
42
+ Object.defineProperty(exports, "InstructionNotFoundError", { enumerable: true, get: function () { return instruction_errors_js_1.InstructionNotFoundError; } });
43
+ Object.defineProperty(exports, "InstructionBackendError", { enumerable: true, get: function () { return instruction_errors_js_1.InstructionBackendError; } });
44
+ var gateway_provider_auto_register_js_1 = require("./gateway-provider-auto-register.cjs");
45
+ Object.defineProperty(exports, "autoRegisterProviders", { enumerable: true, get: function () { return gateway_provider_auto_register_js_1.autoRegisterProviders; } });
46
+ var template_render_merge_js_1 = require("./template-render-merge.cjs");
47
+ Object.defineProperty(exports, "mergeTemplateRenderOptions", { enumerable: true, get: function () { return template_render_merge_js_1.mergeTemplateRenderOptions; } });
48
+ // Usage tracking: UsageTracker class methods are available but consumption calculation is disabled
49
+ // (x-models was previously used for RPM/TPM tracking but is no longer integrated)
50
+ // Re-export activity tracking primitives (Activix)
51
+ var activix_1 = require("@x12i/activix");
52
+ Object.defineProperty(exports, "Activix", { enumerable: true, get: function () { return activix_1.Activix; } });
53
+ var activity_manager_js_1 = require("./activity-manager.cjs");
54
+ Object.defineProperty(exports, "ActivityManager", { enumerable: true, get: function () { return activity_manager_js_1.ActivityManager; } });
55
+ Object.defineProperty(exports, "ensureGatewayRequestIdentity", { enumerable: true, get: function () { return activity_manager_js_1.ensureGatewayRequestIdentity; } });
56
+ // Re-export logging (@x12i/logxer)
57
+ var logxer_1 = require("@x12i/logxer");
58
+ Object.defineProperty(exports, "createLogxer", { enumerable: true, get: function () { return logxer_1.createLogxer; } });
59
+ // Runtime observability surface (leaf package: no downstream runtime objects)
60
+ var runtime_objects_js_1 = require("./runtime-objects.cjs");
61
+ Object.defineProperty(exports, "runtimeObjects", { enumerable: true, get: function () { return runtime_objects_js_1.runtimeObjects; } });
62
+ // Export rate limiter
63
+ var gateway_rate_limiter_js_1 = require("./gateway-rate-limiter.cjs");
64
+ Object.defineProperty(exports, "GatewayRateLimiter", { enumerable: true, get: function () { return gateway_rate_limiter_js_1.GatewayRateLimiter; } });
65
+ var gateway_rate_limiter_constants_js_1 = require("./gateway-rate-limiter-constants.cjs");
66
+ Object.defineProperty(exports, "DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS", { enumerable: true, get: function () { return gateway_rate_limiter_constants_js_1.DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS; } });
67
+ Object.defineProperty(exports, "DEFAULT_RATE_LIMIT_ENABLED", { enumerable: true, get: function () { return gateway_rate_limiter_constants_js_1.DEFAULT_RATE_LIMIT_ENABLED; } });
68
+ // Export troubleshooting helpers
69
+ var troubleshooting_helper_js_1 = require("./troubleshooting-helper.cjs");
70
+ Object.defineProperty(exports, "validateAIRequest", { enumerable: true, get: function () { return troubleshooting_helper_js_1.validateAIRequest; } });
71
+ Object.defineProperty(exports, "validateJSON", { enumerable: true, get: function () { return troubleshooting_helper_js_1.validateJSON; } });
72
+ Object.defineProperty(exports, "extractJSON", { enumerable: true, get: function () { return troubleshooting_helper_js_1.extractJSON; } });
73
+ Object.defineProperty(exports, "validateResponse", { enumerable: true, get: function () { return troubleshooting_helper_js_1.validateResponse; } });
74
+ Object.defineProperty(exports, "diagnoseRequest", { enumerable: true, get: function () { return troubleshooting_helper_js_1.diagnoseRequest; } });
75
+ Object.defineProperty(exports, "diagnoseResponse", { enumerable: true, get: function () { return troubleshooting_helper_js_1.diagnoseResponse; } });
76
+ Object.defineProperty(exports, "supportsJSONMode", { enumerable: true, get: function () { return troubleshooting_helper_js_1.supportsJSONMode; } });
77
+ Object.defineProperty(exports, "createTestAIRequest", { enumerable: true, get: function () { return troubleshooting_helper_js_1.createTestAIRequest; } });
78
+ Object.defineProperty(exports, "createValidationTestCases", { enumerable: true, get: function () { return troubleshooting_helper_js_1.createValidationTestCases; } });
79
+ Object.defineProperty(exports, "runValidationTests", { enumerable: true, get: function () { return troubleshooting_helper_js_1.runValidationTests; } });
80
+ Object.defineProperty(exports, "formatDiagnostic", { enumerable: true, get: function () { return troubleshooting_helper_js_1.formatDiagnostic; } });
81
+ Object.defineProperty(exports, "assertValidAIRequest", { enumerable: true, get: function () { return troubleshooting_helper_js_1.assertValidAIRequest; } });
82
+ // Export object types library
83
+ var object_types_library_js_1 = require("./object-types-library.cjs");
84
+ Object.defineProperty(exports, "OBJECT_TYPES_LIBRARY", { enumerable: true, get: function () { return object_types_library_js_1.OBJECT_TYPES_LIBRARY; } });
85
+ Object.defineProperty(exports, "getObjectType", { enumerable: true, get: function () { return object_types_library_js_1.getObjectType; } });
86
+ Object.defineProperty(exports, "getObjectTypesForAgent", { enumerable: true, get: function () { return object_types_library_js_1.getObjectTypesForAgent; } });
87
+ // Re-export outputs library integration functions
88
+ var object_types_library_integration_js_1 = require("./object-types-library-integration.cjs");
89
+ Object.defineProperty(exports, "initializeObjectTypesLibrary", { enumerable: true, get: function () { return object_types_library_integration_js_1.initializeObjectTypesLibrary; } });
90
+ Object.defineProperty(exports, "getObjectTypesLibrary", { enumerable: true, get: function () { return object_types_library_integration_js_1.getObjectTypesLibrary; } });
91
+ Object.defineProperty(exports, "resetObjectTypesLibrary", { enumerable: true, get: function () { return object_types_library_integration_js_1.resetObjectTypesLibrary; } });
92
+ // Re-export outputs library types and utilities for convenience
93
+ // Note: Since we use dynamic imports for the outputs library, these types may not be available
94
+ // at compile time if the package isn't installed. Users can import directly from
95
+ // @x12i/outputs-library if they need these types or utilities.
96
+ //
97
+ // Recommended: Import types and utilities directly from @x12i/outputs-library:
98
+ // import type { ClassificationOutput } from '@x12i/outputs-library/types';
99
+ // import { ResponseParser } from '@x12i/outputs-library/parsers';
100
+ // import type { ObjectTypesLibrary, FlexMdSupport } from '@x12i/outputs-library';
101
+ //
102
+ // The gateway integrates with the outputs library internally via dynamic imports,
103
+ // so these re-exports are optional and mainly for convenience.
104
+ //
105
+ // For outputs-library v3.3.1+ with flex-md support:
106
+ // - ObjectTypesLibrary class with flex-md methods (getFlexMdTemplate, getFlexMdFormatSpec, etc.)
107
+ // - FlexMdSupport type for object type definitions
108
+ // - All flex-md methods are available on the library instance returned by getObjectTypesLibrary()
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @x12i/ai-gateway
3
+ *
4
+ * Unified gateway for LLM provider routing and management.
5
+ * This package exposes all functionality from @x12i/ai-providers-router
6
+ * with enhanced features: context propagation, usage tier tracking, and comprehensive metadata.
7
+ */
8
+ export { LLMProviderRouter } from '@x12i/ai-providers-router';
9
+ export type { RouterConfig, HealthCheckResult } from '@x12i/ai-providers-router';
10
+ export { createRouter, createRouterFromConfig } from '@x12i/ai-providers-router';
11
+ export type { CreateRouterConfig } from '@x12i/ai-providers-router';
12
+ export { ProviderNotFoundError, FallbackExhaustedError } from '@x12i/ai-providers-router';
13
+ export type { RequestInterceptor, ResponseInterceptor } from '@x12i/ai-providers-router';
14
+ export type { UsageTracker } from '@x12i/ai-providers-router';
15
+ export * from '@x12i/ai-providers-router';
16
+ export { AIGateway } from './gateway.js';
17
+ export { InstructionNotFoundError, InstructionBackendError } from './instruction-errors.js';
18
+ export { autoRegisterProviders } from './gateway-provider-auto-register.js';
19
+ export type { GatewayConfig, ProviderModelRef, ModelConfig, RetryConfig, ChatRequest, AIRequest, EnhancedLLMResponse, InstructionMetadata, ValidationRule, ResponseTransformationConfig, TemplateRenderOptions } from './types.js';
20
+ export { mergeTemplateRenderOptions } from './template-render-merge.js';
21
+ export type { UsageTier } from './types.js';
22
+ export { Activix } from '@x12i/activix';
23
+ export type { ActivixRunContext, FindByRunContextCriteria } from '@x12i/activix';
24
+ export { ActivityManager, ensureGatewayRequestIdentity } from './activity-manager.js';
25
+ export type { ActivityIdentity } from './types.js';
26
+ export { createLogxer } from '@x12i/logxer';
27
+ export type { Logxer } from '@x12i/logxer';
28
+ export { runtimeObjects } from './runtime-objects.js';
29
+ export type { ActivixQueryableClient, LogxerQueryableClient, PackageRuntimeObjects, RuntimeObjects } from './runtime-objects.js';
30
+ export { GatewayRateLimiter } from './gateway-rate-limiter.js';
31
+ export { DEFAULT_RATE_LIMIT_MIN_INTERVAL_MS, DEFAULT_RATE_LIMIT_ENABLED } from './gateway-rate-limiter-constants.js';
32
+ export { validateAIRequest, validateJSON, extractJSON, validateResponse, diagnoseRequest, diagnoseResponse, supportsJSONMode, createTestAIRequest, createValidationTestCases, runValidationTests, formatDiagnostic, assertValidAIRequest } from './troubleshooting-helper.js';
33
+ export type { ValidationResult, DiagnosticInfo } from './troubleshooting-helper.js';
34
+ export { OBJECT_TYPES_LIBRARY, getObjectType, getObjectTypesForAgent } from './object-types-library.js';
35
+ export type { ReasoningResult, AuditReport, ScopeDefinition, DiscoveryFindings, ActionPlan, ExecutionResult } from './object-types-library.js';
36
+ export { initializeObjectTypesLibrary, getObjectTypesLibrary, resetObjectTypesLibrary } from './object-types-library-integration.js';
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /**
3
+ * Errors for instruction / prompt template and instructions-block resolution.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InstructionBackendError = exports.InstructionNotFoundError = void 0;
7
+ class InstructionNotFoundError extends Error {
8
+ key;
9
+ backend;
10
+ originalKey;
11
+ constructor(key, backend, message, originalKey) {
12
+ super(message);
13
+ this.key = key;
14
+ this.backend = backend;
15
+ this.originalKey = originalKey;
16
+ this.name = 'InstructionNotFoundError';
17
+ }
18
+ }
19
+ exports.InstructionNotFoundError = InstructionNotFoundError;
20
+ class InstructionBackendError extends Error {
21
+ key;
22
+ backend;
23
+ isRetryable;
24
+ originalError;
25
+ constructor(key, backend, message, isRetryable, originalError) {
26
+ super(message);
27
+ this.key = key;
28
+ this.backend = backend;
29
+ this.isRetryable = isRetryable;
30
+ this.originalError = originalError;
31
+ this.name = 'InstructionBackendError';
32
+ }
33
+ }
34
+ exports.InstructionBackendError = InstructionBackendError;