@x12i/ai-gateway 10.3.0 → 10.4.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.
Files changed (68) hide show
  1. package/README.md +92 -1
  2. package/dist/activity-manager.js +33 -0
  3. package/dist/gateway-config.js +15 -0
  4. package/dist/gateway-utils.d.ts +8 -1
  5. package/dist/gateway-utils.js +73 -1
  6. package/dist/gateway.js +18 -3
  7. package/dist/index.d.ts +4 -3
  8. package/dist/index.js +3 -2
  9. package/dist/instruction-errors.d.ts +21 -0
  10. package/dist/instruction-errors.js +36 -0
  11. package/dist/logger-factory.js +0 -2
  12. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +23 -0
  13. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.js +31 -0
  14. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +9 -0
  15. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.js +41 -0
  16. package/dist/openrouter-runtime-adapter/index.d.ts +8 -0
  17. package/dist/openrouter-runtime-adapter/index.js +8 -0
  18. package/dist/openrouter-runtime-adapter/map-gateway-request.d.ts +26 -0
  19. package/dist/openrouter-runtime-adapter/map-gateway-request.js +62 -0
  20. package/dist/openrouter-runtime-adapter/map-runtime-errors.d.ts +5 -0
  21. package/dist/openrouter-runtime-adapter/map-runtime-errors.js +60 -0
  22. package/dist/openrouter-runtime-adapter/map-runtime-response.d.ts +31 -0
  23. package/dist/openrouter-runtime-adapter/map-runtime-response.js +153 -0
  24. package/dist/openrouter-runtime-adapter/map-server-tools.d.ts +3 -0
  25. package/dist/openrouter-runtime-adapter/map-server-tools.js +143 -0
  26. package/dist/openrouter-runtime-adapter/map-trace.d.ts +5 -0
  27. package/dist/openrouter-runtime-adapter/map-trace.js +45 -0
  28. package/dist/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +10 -0
  29. package/dist/openrouter-runtime-adapter/register-openrouter-runtime.js +14 -0
  30. package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +14 -0
  31. package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.js +29 -0
  32. package/dist/openrouter-runtime-adapter/validate-server-tools.d.ts +30 -0
  33. package/dist/openrouter-runtime-adapter/validate-server-tools.js +151 -0
  34. package/dist/types.d.ts +234 -0
  35. package/dist-cjs/activity-manager.cjs +33 -0
  36. package/dist-cjs/gateway-config.cjs +15 -0
  37. package/dist-cjs/gateway-utils.cjs +73 -1
  38. package/dist-cjs/gateway-utils.d.ts +8 -1
  39. package/dist-cjs/gateway.cjs +18 -3
  40. package/dist-cjs/index.cjs +3 -2
  41. package/dist-cjs/index.d.ts +4 -3
  42. package/dist-cjs/instruction-errors.cjs +36 -0
  43. package/dist-cjs/instruction-errors.d.ts +21 -0
  44. package/dist-cjs/logger-factory.cjs +0 -2
  45. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.cjs +31 -0
  46. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +23 -0
  47. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.cjs +41 -0
  48. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +9 -0
  49. package/dist-cjs/openrouter-runtime-adapter/index.cjs +8 -0
  50. package/dist-cjs/openrouter-runtime-adapter/index.d.ts +8 -0
  51. package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.cjs +62 -0
  52. package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.d.ts +26 -0
  53. package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.cjs +60 -0
  54. package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.d.ts +5 -0
  55. package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.cjs +153 -0
  56. package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.d.ts +31 -0
  57. package/dist-cjs/openrouter-runtime-adapter/map-server-tools.cjs +143 -0
  58. package/dist-cjs/openrouter-runtime-adapter/map-server-tools.d.ts +3 -0
  59. package/dist-cjs/openrouter-runtime-adapter/map-trace.cjs +45 -0
  60. package/dist-cjs/openrouter-runtime-adapter/map-trace.d.ts +5 -0
  61. package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.cjs +14 -0
  62. package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +10 -0
  63. package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.cjs +29 -0
  64. package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +14 -0
  65. package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.cjs +151 -0
  66. package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.d.ts +30 -0
  67. package/dist-cjs/types.d.ts +234 -0
  68. package/package.json +7 -5
@@ -51,6 +51,202 @@ export type GatewayTraceRequestIds = {
51
51
  /** Allow additional stable ids without breaking contract. */
52
52
  [key: string]: string | undefined;
53
53
  };
54
+ export type GatewayServerToolMode = 'disabled' | 'allowed' | 'required';
55
+ export type GatewayNestedServerTool = {
56
+ type: 'openrouter:web_search';
57
+ parameters?: Record<string, unknown>;
58
+ } | {
59
+ type: 'openrouter:web_fetch';
60
+ parameters?: Record<string, unknown>;
61
+ } | {
62
+ type: 'openrouter:datetime';
63
+ parameters?: Record<string, unknown>;
64
+ } | {
65
+ type: 'openrouter:image_generation';
66
+ parameters?: Record<string, unknown>;
67
+ };
68
+ export interface GatewayWebSearchToolConfig {
69
+ mode: GatewayServerToolMode;
70
+ engine?: 'auto' | 'native' | 'exa' | 'firecrawl' | 'parallel' | 'perplexity';
71
+ maxResults?: number;
72
+ maxTotalResults?: number;
73
+ searchContextSize?: 'low' | 'medium' | 'high';
74
+ maxCharacters?: number;
75
+ allowedDomains?: string[];
76
+ excludedDomains?: string[];
77
+ userLocation?: {
78
+ type: 'approximate';
79
+ city?: string;
80
+ region?: string;
81
+ country?: string;
82
+ timezone?: string;
83
+ };
84
+ requireCitations?: boolean;
85
+ onFailure?: 'fail' | 'warn' | 'continue';
86
+ }
87
+ export interface GatewayWebFetchToolConfig {
88
+ mode: GatewayServerToolMode;
89
+ engine?: 'auto' | 'native' | 'exa' | 'openrouter' | 'firecrawl' | 'parallel';
90
+ maxUses?: number;
91
+ maxContentTokens?: number;
92
+ allowedDomains?: string[];
93
+ blockedDomains?: string[];
94
+ onFailure?: 'fail' | 'warn' | 'continue';
95
+ }
96
+ export interface GatewayDatetimeToolConfig {
97
+ mode: GatewayServerToolMode;
98
+ timezone?: string;
99
+ }
100
+ export interface GatewayImageGenerationToolConfig {
101
+ mode: GatewayServerToolMode;
102
+ model?: string;
103
+ quality?: 'low' | 'medium' | 'high' | string;
104
+ size?: string;
105
+ aspectRatio?: string;
106
+ background?: string;
107
+ outputFormat?: 'png' | 'jpeg' | 'webp' | string;
108
+ outputCompression?: number;
109
+ moderation?: string;
110
+ }
111
+ export interface GatewayApplyPatchToolConfig {
112
+ mode: GatewayServerToolMode;
113
+ behavior?: 'return_only' | 'apply_with_callback';
114
+ allowCreate?: boolean;
115
+ allowUpdate?: boolean;
116
+ allowDelete?: boolean;
117
+ workspaceRoot?: string;
118
+ }
119
+ export interface GatewayFusionToolConfig {
120
+ mode: GatewayServerToolMode;
121
+ analysisModels?: string[];
122
+ judgeModel?: string;
123
+ maxToolCalls?: number;
124
+ maxCompletionTokens?: number;
125
+ temperature?: number;
126
+ reasoning?: {
127
+ effort?: 'low' | 'medium' | 'high';
128
+ maxTokens?: number;
129
+ };
130
+ }
131
+ export interface GatewayAdvisorToolConfig {
132
+ mode: GatewayServerToolMode;
133
+ name?: string;
134
+ model?: string;
135
+ instructions?: string;
136
+ tools?: GatewayNestedServerTool[];
137
+ forwardTranscript?: boolean;
138
+ stream?: boolean;
139
+ maxToolCalls?: number;
140
+ maxCompletionTokens?: number;
141
+ temperature?: number;
142
+ reasoning?: {
143
+ effort?: 'low' | 'medium' | 'high';
144
+ maxTokens?: number;
145
+ };
146
+ }
147
+ export interface GatewaySubagentToolConfig {
148
+ mode: GatewayServerToolMode;
149
+ model?: string;
150
+ instructions?: string;
151
+ tools?: GatewayNestedServerTool[];
152
+ maxToolCalls?: number;
153
+ maxCompletionTokens?: number;
154
+ temperature?: number;
155
+ reasoning?: {
156
+ effort?: 'low' | 'medium' | 'high';
157
+ maxTokens?: number;
158
+ };
159
+ }
160
+ export interface GatewayServerToolsConfig {
161
+ webSearch?: GatewayWebSearchToolConfig;
162
+ webFetch?: GatewayWebFetchToolConfig;
163
+ datetime?: GatewayDatetimeToolConfig;
164
+ imageGeneration?: GatewayImageGenerationToolConfig;
165
+ applyPatch?: GatewayApplyPatchToolConfig;
166
+ fusion?: GatewayFusionToolConfig;
167
+ advisor?: GatewayAdvisorToolConfig | GatewayAdvisorToolConfig[];
168
+ subagent?: GatewaySubagentToolConfig;
169
+ }
170
+ export interface GatewayOpenRouterConfig {
171
+ apiMode?: 'chat' | 'responses' | 'auto';
172
+ rawOverrides?: Record<string, unknown>;
173
+ includeRawInTrace?: boolean;
174
+ }
175
+ export interface GatewayOpenRouterRuntimeConfig {
176
+ enabled?: boolean;
177
+ apiMode?: 'chat' | 'responses' | 'auto';
178
+ includeRawInTrace?: boolean;
179
+ }
180
+ export interface GatewayServerToolUsage {
181
+ requested: boolean;
182
+ required: boolean;
183
+ used: boolean;
184
+ callCount?: number;
185
+ policyViolation?: string;
186
+ }
187
+ export interface GatewayServerToolUsageMap {
188
+ webSearch?: GatewayServerToolUsage;
189
+ webFetch?: GatewayServerToolUsage;
190
+ datetime?: GatewayServerToolUsage;
191
+ imageGeneration?: GatewayServerToolUsage;
192
+ applyPatch?: GatewayServerToolUsage;
193
+ fusion?: GatewayServerToolUsage;
194
+ advisor?: GatewayServerToolUsage;
195
+ subagent?: GatewayServerToolUsage;
196
+ }
197
+ export interface GatewayCitation {
198
+ type: 'url';
199
+ url: string;
200
+ title?: string;
201
+ excerpt?: string;
202
+ startIndex?: number;
203
+ endIndex?: number;
204
+ sourceProvider: 'openrouter';
205
+ }
206
+ export interface GatewayGeneratedImage {
207
+ imageUrl: string;
208
+ status: 'ok' | 'error';
209
+ error?: string;
210
+ raw?: unknown;
211
+ }
212
+ export interface GatewayPatchProposal {
213
+ callId: string;
214
+ status: 'completed' | 'failed';
215
+ operation: {
216
+ type: 'create_file';
217
+ path: string;
218
+ diff: string;
219
+ } | {
220
+ type: 'update_file';
221
+ path: string;
222
+ diff: string;
223
+ } | {
224
+ type: 'delete_file';
225
+ path: string;
226
+ };
227
+ raw?: unknown;
228
+ }
229
+ export interface GatewayWarning {
230
+ code: string;
231
+ message: string;
232
+ details?: unknown;
233
+ }
234
+ export interface GatewayPolicyViolation {
235
+ code: string;
236
+ message: string;
237
+ details?: unknown;
238
+ }
239
+ export interface GatewayOpenRouterRuntimeMetadata {
240
+ apiMode: 'chat' | 'responses';
241
+ warnings: GatewayWarning[];
242
+ policyViolations: GatewayPolicyViolation[];
243
+ requestIds?: string[];
244
+ serverToolsRequested?: GatewayServerToolUsageMap;
245
+ serverToolsUsed?: GatewayServerToolUsageMap;
246
+ citations?: GatewayCitation[];
247
+ generatedImages?: GatewayGeneratedImage[];
248
+ patchProposals?: GatewayPatchProposal[];
249
+ }
54
250
  export type GatewayTraceAttempt = {
55
251
  timing: {
56
252
  startedAt: number;
@@ -95,6 +291,13 @@ export type GatewayTraceAttempt = {
95
291
  * The exact shape is intentionally loose to avoid locking downstream to provider schemas.
96
292
  */
97
293
  rawProviderPayload?: unknown;
294
+ openrouterRuntime?: {
295
+ apiMode?: 'chat' | 'responses';
296
+ serverTools?: GatewayServerToolUsageMap;
297
+ citationCount?: number;
298
+ generatedImageCount?: number;
299
+ patchProposalCount?: number;
300
+ };
98
301
  };
99
302
  /**
100
303
  * Allowlisted merged router/generation config returned in {@link EnhancedLLMResponse.metadata}
@@ -115,6 +318,8 @@ export type GatewayTraceUsageSummary = {
115
318
  cost?: number;
116
319
  costStatus?: 'priced' | 'unpriced';
117
320
  costBreakdown?: GatewayTraceAttempt['costBreakdown'];
321
+ serverTools?: GatewayServerToolUsageMap;
322
+ citations?: GatewayCitation[];
118
323
  };
119
324
  export type GatewayTraceMergedConfig = Partial<Pick<ModelConfig, 'model' | 'modelId' | 'provider' | 'temperature' | 'maxTokens' | 'topP' | 'frequencyPenalty' | 'presencePenalty' | 'stop'>>;
120
325
  /**
@@ -316,11 +521,21 @@ export interface ModelConfig {
316
521
  * Generation stops when any stop sequence is encountered
317
522
  */
318
523
  stop?: string[];
524
+ /**
525
+ * OpenRouter-only server tools. Ignored unless final provider is openrouter.
526
+ */
527
+ serverTools?: GatewayServerToolsConfig;
528
+ /**
529
+ * OpenRouter-specific execution controls.
530
+ */
531
+ openrouter?: GatewayOpenRouterConfig;
319
532
  /**
320
533
  * Additional provider-specific parameters
321
534
  */
322
535
  [key: string]: any;
323
536
  }
537
+ /** Alias for {@link ModelConfig} in gateway documentation. */
538
+ export type GatewayModelConfig = ModelConfig;
324
539
  export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'logger'> {
325
540
  /**
326
541
  * Default target (engine + model) for routing
@@ -397,6 +612,15 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
397
612
  openRouter?: {
398
613
  prefer?: boolean;
399
614
  };
615
+ /**
616
+ * Default OpenRouter server tool policy merged into every invoke (lowest priority).
617
+ */
618
+ defaultServerTools?: GatewayServerToolsConfig;
619
+ /**
620
+ * OpenRouter runtime integration defaults.
621
+ * @default `{ enabled: true, apiMode: 'auto', includeRawInTrace: false }`
622
+ */
623
+ openrouterRuntime?: GatewayOpenRouterRuntimeConfig;
400
624
  /**
401
625
  * Operational mode override (`process.env.mode` / `MODE` when omitted; default `debug`).
402
626
  * Downstream hosts (ai-skills, ai-tasks, graph-engine) should expose this to their clients.
@@ -1035,6 +1259,16 @@ export interface EnhancedLLMResponse<TContent = unknown> extends Omit<AIResponse
1035
1259
  * Reflects gateway merge order: modelConfig / request.config / defaults.
1036
1260
  */
1037
1261
  effectiveModelConfig?: Partial<Pick<ModelConfig, 'model' | 'modelId' | 'provider' | 'temperature' | 'maxTokens' | 'topP'>>;
1262
+ /** OpenRouter server tool usage summary (additive). */
1263
+ serverTools?: GatewayServerToolUsageMap;
1264
+ /** Citations extracted by OpenRouter runtime (additive). */
1265
+ citations?: GatewayCitation[];
1266
+ /** Generated image metadata from OpenRouter runtime (additive). */
1267
+ generatedImages?: GatewayGeneratedImage[];
1268
+ /** Patch proposals from OpenRouter runtime — never applied by the gateway (additive). */
1269
+ patchProposals?: GatewayPatchProposal[];
1270
+ /** OpenRouter runtime execution metadata (additive). */
1271
+ openrouterRuntime?: GatewayOpenRouterRuntimeMetadata;
1038
1272
  /**
1039
1273
  * Stable request/correlation identifiers across gateway/router/provider layers.
1040
1274
  * Only populated when diagnostics trace mode is enabled.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/ai-gateway",
3
- "version": "10.3.0",
3
+ "version": "10.4.0",
4
4
  "description": "AI Gateway - Unified interface for LLM provider routing and management",
5
5
  "type": "module",
6
6
  "exports": {
@@ -28,6 +28,7 @@
28
28
  "test:flex-md-parsing": "tsx .tests/flex-md-parsing-scenarios.test.ts",
29
29
  "test:flex-md-esm-regression": "npm run build:esm && node .tests/flex-md-esm-regression.test.mjs",
30
30
  "test:live": "npm run test:ai-tools:live",
31
+ "test:openrouter-live": "tsx .tests/openrouter-runtime-live.test.ts",
31
32
  "test:prepublish": "npm run build && npm test",
32
33
  "deps:latest": "npx npm-check-updates -u && npm install"
33
34
  },
@@ -41,12 +42,13 @@
41
42
  "author": "x12i",
42
43
  "license": "mit",
43
44
  "dependencies": {
44
- "@x12i/activix": "^9.0.0",
45
- "@x12i/ai-profiles": "^3.4.0",
45
+ "@x12i/activix": "^9.0.2",
46
+ "@x12i/ai-profiles": "^3.4.1",
46
47
  "@x12i/ai-providers-router": "^4.9.2",
47
- "@x12i/ai-tools": "^3.3.3",
48
+ "@x12i/ai-tools": "^3.3.5",
48
49
  "@x12i/flex-md": "^4.8.0",
49
- "@x12i/logxer": "^4.6.0",
50
+ "@x12i/logxer": "^5.1.0",
51
+ "@x12i/openrouter-runtime": "^1.0.2",
50
52
  "@x12i/rendrix": "^4.3.0"
51
53
  },
52
54
  "devDependencies": {