@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.
- package/README.md +92 -1
- package/dist/activity-manager.js +33 -0
- package/dist/gateway-config.js +15 -0
- package/dist/gateway-utils.d.ts +8 -1
- package/dist/gateway-utils.js +73 -1
- package/dist/gateway.js +18 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -2
- package/dist/instruction-errors.d.ts +21 -0
- package/dist/instruction-errors.js +36 -0
- package/dist/logger-factory.js +0 -2
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +23 -0
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.js +31 -0
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +9 -0
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.js +41 -0
- package/dist/openrouter-runtime-adapter/index.d.ts +8 -0
- package/dist/openrouter-runtime-adapter/index.js +8 -0
- package/dist/openrouter-runtime-adapter/map-gateway-request.d.ts +26 -0
- package/dist/openrouter-runtime-adapter/map-gateway-request.js +62 -0
- package/dist/openrouter-runtime-adapter/map-runtime-errors.d.ts +5 -0
- package/dist/openrouter-runtime-adapter/map-runtime-errors.js +60 -0
- package/dist/openrouter-runtime-adapter/map-runtime-response.d.ts +31 -0
- package/dist/openrouter-runtime-adapter/map-runtime-response.js +153 -0
- package/dist/openrouter-runtime-adapter/map-server-tools.d.ts +3 -0
- package/dist/openrouter-runtime-adapter/map-server-tools.js +143 -0
- package/dist/openrouter-runtime-adapter/map-trace.d.ts +5 -0
- package/dist/openrouter-runtime-adapter/map-trace.js +45 -0
- package/dist/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +10 -0
- package/dist/openrouter-runtime-adapter/register-openrouter-runtime.js +14 -0
- package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +14 -0
- package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.js +29 -0
- package/dist/openrouter-runtime-adapter/validate-server-tools.d.ts +30 -0
- package/dist/openrouter-runtime-adapter/validate-server-tools.js +151 -0
- package/dist/types.d.ts +234 -0
- package/dist-cjs/activity-manager.cjs +33 -0
- package/dist-cjs/gateway-config.cjs +15 -0
- package/dist-cjs/gateway-utils.cjs +73 -1
- package/dist-cjs/gateway-utils.d.ts +8 -1
- package/dist-cjs/gateway.cjs +18 -3
- package/dist-cjs/index.cjs +3 -2
- package/dist-cjs/index.d.ts +4 -3
- package/dist-cjs/instruction-errors.cjs +36 -0
- package/dist-cjs/instruction-errors.d.ts +21 -0
- package/dist-cjs/logger-factory.cjs +0 -2
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.cjs +31 -0
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +23 -0
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.cjs +41 -0
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +9 -0
- package/dist-cjs/openrouter-runtime-adapter/index.cjs +8 -0
- package/dist-cjs/openrouter-runtime-adapter/index.d.ts +8 -0
- package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.cjs +62 -0
- package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.d.ts +26 -0
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.cjs +60 -0
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.d.ts +5 -0
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.cjs +153 -0
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.d.ts +31 -0
- package/dist-cjs/openrouter-runtime-adapter/map-server-tools.cjs +143 -0
- package/dist-cjs/openrouter-runtime-adapter/map-server-tools.d.ts +3 -0
- package/dist-cjs/openrouter-runtime-adapter/map-trace.cjs +45 -0
- package/dist-cjs/openrouter-runtime-adapter/map-trace.d.ts +5 -0
- package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.cjs +14 -0
- package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +10 -0
- package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.cjs +29 -0
- package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +14 -0
- package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.cjs +151 -0
- package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.d.ts +30 -0
- package/dist-cjs/types.d.ts +234 -0
- package/package.json +7 -5
package/dist-cjs/types.d.ts
CHANGED
|
@@ -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
|
+
"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.
|
|
45
|
-
"@x12i/ai-profiles": "^3.4.
|
|
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.
|
|
48
|
+
"@x12i/ai-tools": "^3.3.5",
|
|
48
49
|
"@x12i/flex-md": "^4.8.0",
|
|
49
|
-
"@x12i/logxer": "^
|
|
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": {
|