@x12i/ai-gateway 10.3.1 → 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 (66) 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/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +23 -0
  12. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.js +31 -0
  13. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +9 -0
  14. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.js +41 -0
  15. package/dist/openrouter-runtime-adapter/index.d.ts +8 -0
  16. package/dist/openrouter-runtime-adapter/index.js +8 -0
  17. package/dist/openrouter-runtime-adapter/map-gateway-request.d.ts +26 -0
  18. package/dist/openrouter-runtime-adapter/map-gateway-request.js +62 -0
  19. package/dist/openrouter-runtime-adapter/map-runtime-errors.d.ts +5 -0
  20. package/dist/openrouter-runtime-adapter/map-runtime-errors.js +60 -0
  21. package/dist/openrouter-runtime-adapter/map-runtime-response.d.ts +31 -0
  22. package/dist/openrouter-runtime-adapter/map-runtime-response.js +153 -0
  23. package/dist/openrouter-runtime-adapter/map-server-tools.d.ts +3 -0
  24. package/dist/openrouter-runtime-adapter/map-server-tools.js +143 -0
  25. package/dist/openrouter-runtime-adapter/map-trace.d.ts +5 -0
  26. package/dist/openrouter-runtime-adapter/map-trace.js +45 -0
  27. package/dist/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +10 -0
  28. package/dist/openrouter-runtime-adapter/register-openrouter-runtime.js +14 -0
  29. package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +14 -0
  30. package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.js +29 -0
  31. package/dist/openrouter-runtime-adapter/validate-server-tools.d.ts +30 -0
  32. package/dist/openrouter-runtime-adapter/validate-server-tools.js +151 -0
  33. package/dist/types.d.ts +234 -0
  34. package/dist-cjs/activity-manager.cjs +33 -0
  35. package/dist-cjs/gateway-config.cjs +15 -0
  36. package/dist-cjs/gateway-utils.cjs +73 -1
  37. package/dist-cjs/gateway-utils.d.ts +8 -1
  38. package/dist-cjs/gateway.cjs +18 -3
  39. package/dist-cjs/index.cjs +3 -2
  40. package/dist-cjs/index.d.ts +4 -3
  41. package/dist-cjs/instruction-errors.cjs +36 -0
  42. package/dist-cjs/instruction-errors.d.ts +21 -0
  43. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.cjs +31 -0
  44. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +23 -0
  45. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.cjs +41 -0
  46. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +9 -0
  47. package/dist-cjs/openrouter-runtime-adapter/index.cjs +8 -0
  48. package/dist-cjs/openrouter-runtime-adapter/index.d.ts +8 -0
  49. package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.cjs +62 -0
  50. package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.d.ts +26 -0
  51. package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.cjs +60 -0
  52. package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.d.ts +5 -0
  53. package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.cjs +153 -0
  54. package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.d.ts +31 -0
  55. package/dist-cjs/openrouter-runtime-adapter/map-server-tools.cjs +143 -0
  56. package/dist-cjs/openrouter-runtime-adapter/map-server-tools.d.ts +3 -0
  57. package/dist-cjs/openrouter-runtime-adapter/map-trace.cjs +45 -0
  58. package/dist-cjs/openrouter-runtime-adapter/map-trace.d.ts +5 -0
  59. package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.cjs +14 -0
  60. package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +10 -0
  61. package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.cjs +29 -0
  62. package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +14 -0
  63. package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.cjs +151 -0
  64. package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.d.ts +30 -0
  65. package/dist-cjs/types.d.ts +234 -0
  66. package/package.json +3 -1
@@ -0,0 +1,143 @@
1
+ function mapWebSearch(src) {
2
+ if (!src)
3
+ return undefined;
4
+ return {
5
+ mode: src.mode,
6
+ engine: src.engine,
7
+ maxResults: src.maxResults,
8
+ maxTotalResults: src.maxTotalResults,
9
+ searchContextSize: src.searchContextSize,
10
+ allowedDomains: src.allowedDomains,
11
+ excludedDomains: src.excludedDomains,
12
+ userLocation: src.userLocation,
13
+ requireCitations: src.requireCitations,
14
+ onFailure: src.onFailure,
15
+ };
16
+ }
17
+ function mapWebFetch(src) {
18
+ if (!src)
19
+ return undefined;
20
+ return {
21
+ mode: src.mode,
22
+ engine: src.engine,
23
+ maxUses: src.maxUses,
24
+ maxContentTokens: src.maxContentTokens,
25
+ allowedDomains: src.allowedDomains,
26
+ blockedDomains: src.blockedDomains,
27
+ onFailure: src.onFailure,
28
+ };
29
+ }
30
+ function mapDatetime(src) {
31
+ if (!src)
32
+ return undefined;
33
+ return { mode: src.mode, timezone: src.timezone };
34
+ }
35
+ function mapImageGeneration(src) {
36
+ if (!src)
37
+ return undefined;
38
+ return {
39
+ mode: src.mode,
40
+ model: src.model,
41
+ quality: src.quality,
42
+ size: src.size,
43
+ aspectRatio: src.aspectRatio,
44
+ background: src.background,
45
+ outputFormat: src.outputFormat,
46
+ outputCompression: src.outputCompression,
47
+ moderation: src.moderation,
48
+ };
49
+ }
50
+ function mapApplyPatch(src) {
51
+ if (!src)
52
+ return undefined;
53
+ return {
54
+ mode: src.mode,
55
+ behavior: src.behavior ?? 'return_only',
56
+ workspaceRoot: src.workspaceRoot,
57
+ allowDelete: src.allowDelete,
58
+ allowCreate: src.allowCreate,
59
+ allowUpdate: src.allowUpdate,
60
+ };
61
+ }
62
+ function mapFusion(src) {
63
+ if (!src)
64
+ return undefined;
65
+ return {
66
+ mode: src.mode,
67
+ analysisModels: src.analysisModels,
68
+ judgeModel: src.judgeModel,
69
+ maxToolCalls: src.maxToolCalls,
70
+ maxCompletionTokens: src.maxCompletionTokens,
71
+ reasoning: src.reasoning,
72
+ temperature: src.temperature,
73
+ };
74
+ }
75
+ function mapNestedTools(tools) {
76
+ if (!tools?.length)
77
+ return undefined;
78
+ return tools.map((t) => ({ type: t.type, parameters: t.parameters }));
79
+ }
80
+ function mapAdvisor(src) {
81
+ if (!src)
82
+ return undefined;
83
+ const mapOne = (a) => ({
84
+ mode: a.mode,
85
+ name: a.name,
86
+ model: a.model,
87
+ instructions: a.instructions,
88
+ tools: mapNestedTools(a.tools),
89
+ forwardTranscript: a.forwardTranscript,
90
+ stream: a.stream,
91
+ maxToolCalls: a.maxToolCalls,
92
+ maxCompletionTokens: a.maxCompletionTokens,
93
+ reasoning: a.reasoning,
94
+ temperature: a.temperature,
95
+ });
96
+ if (Array.isArray(src))
97
+ return src.map(mapOne);
98
+ return mapOne(src);
99
+ }
100
+ function mapSubagent(src) {
101
+ if (!src)
102
+ return undefined;
103
+ return {
104
+ mode: src.mode,
105
+ model: src.model,
106
+ instructions: src.instructions,
107
+ tools: mapNestedTools(src.tools),
108
+ maxToolCalls: src.maxToolCalls,
109
+ maxCompletionTokens: src.maxCompletionTokens,
110
+ reasoning: src.reasoning,
111
+ temperature: src.temperature,
112
+ };
113
+ }
114
+ export function mapGatewayServerTools(config) {
115
+ if (!config)
116
+ return undefined;
117
+ const out = {};
118
+ const webSearch = mapWebSearch(config.webSearch);
119
+ const webFetch = mapWebFetch(config.webFetch);
120
+ const datetime = mapDatetime(config.datetime);
121
+ const imageGeneration = mapImageGeneration(config.imageGeneration);
122
+ const applyPatch = mapApplyPatch(config.applyPatch);
123
+ const fusion = mapFusion(config.fusion);
124
+ const advisor = mapAdvisor(config.advisor);
125
+ const subagent = mapSubagent(config.subagent);
126
+ if (webSearch)
127
+ out.webSearch = webSearch;
128
+ if (webFetch)
129
+ out.webFetch = webFetch;
130
+ if (datetime)
131
+ out.datetime = datetime;
132
+ if (imageGeneration)
133
+ out.imageGeneration = imageGeneration;
134
+ if (applyPatch)
135
+ out.applyPatch = applyPatch;
136
+ if (fusion)
137
+ out.fusion = fusion;
138
+ if (advisor)
139
+ out.advisor = advisor;
140
+ if (subagent)
141
+ out.subagent = subagent;
142
+ return Object.keys(out).length ? out : undefined;
143
+ }
@@ -0,0 +1,3 @@
1
+ import type { GatewayServerToolsConfig } from '../types.js';
2
+ import type { RuntimeServerToolsPolicy } from '@x12i/openrouter-runtime';
3
+ export declare function mapGatewayServerTools(config?: GatewayServerToolsConfig): RuntimeServerToolsPolicy | undefined;
@@ -0,0 +1,45 @@
1
+ export function buildTraceAttemptOpenRouterRuntimeSlice(metadata) {
2
+ if (!metadata.openrouterRuntime && !metadata.serverTools)
3
+ return undefined;
4
+ return {
5
+ apiMode: metadata.openrouterRuntime?.apiMode,
6
+ serverTools: metadata.serverTools,
7
+ citationCount: metadata.citations?.length ?? 0,
8
+ generatedImageCount: metadata.generatedImages?.length ?? 0,
9
+ patchProposalCount: metadata.patchProposals?.length ?? 0,
10
+ };
11
+ }
12
+ export function enrichTraceOpenRouterRuntimeMetadata(base, metadata, traceEnabled) {
13
+ if (!traceEnabled && !base)
14
+ return base;
15
+ const merged = {
16
+ apiMode: base?.apiMode ?? metadata.openrouterRuntime?.apiMode ?? 'chat',
17
+ warnings: base?.warnings ?? metadata.openrouterRuntime?.warnings ?? [],
18
+ policyViolations: base?.policyViolations ?? metadata.openrouterRuntime?.policyViolations ?? [],
19
+ requestIds: base?.requestIds ?? metadata.openrouterRuntime?.requestIds,
20
+ };
21
+ if (traceEnabled) {
22
+ merged.serverToolsRequested = metadata.serverTools;
23
+ merged.serverToolsUsed = metadata.serverTools;
24
+ merged.citations = metadata.citations;
25
+ merged.generatedImages = metadata.generatedImages;
26
+ merged.patchProposals = metadata.patchProposals;
27
+ }
28
+ return merged;
29
+ }
30
+ export function redactRawOpenRouterPayload(raw, maxChars = 32_000) {
31
+ if (raw == null)
32
+ return raw;
33
+ try {
34
+ const text = JSON.stringify(raw);
35
+ const redacted = text
36
+ .replace(/"(Authorization|authorization|api[_-]?key)"\s*:\s*"[^"]*"/gi, '"$1":"[REDACTED]"')
37
+ .replace(/Bearer\s+[A-Za-z0-9._-]+/g, 'Bearer [REDACTED]');
38
+ if (redacted.length <= maxChars)
39
+ return JSON.parse(redacted);
40
+ return { truncated: true, preview: redacted.slice(0, maxChars) };
41
+ }
42
+ catch {
43
+ return { truncated: true };
44
+ }
45
+ }
@@ -0,0 +1,5 @@
1
+ import type { GatewayTraceAttempt, GatewayOpenRouterRuntimeMetadata } from '../types.js';
2
+ import type { OpenRouterRuntimeRouterMetadata } from './map-runtime-response.js';
3
+ export declare function buildTraceAttemptOpenRouterRuntimeSlice(metadata: OpenRouterRuntimeRouterMetadata): GatewayTraceAttempt['openrouterRuntime'];
4
+ export declare function enrichTraceOpenRouterRuntimeMetadata(base: GatewayOpenRouterRuntimeMetadata | undefined, metadata: OpenRouterRuntimeRouterMetadata, traceEnabled: boolean): GatewayOpenRouterRuntimeMetadata | undefined;
5
+ export declare function redactRawOpenRouterPayload(raw: unknown, maxChars?: number): unknown;
@@ -0,0 +1,14 @@
1
+ import { createOpenRouterRuntimeAdapter } from './create-openrouter-runtime-adapter.js';
2
+ import { createOpenRouterRuntimeProvider } from './create-openrouter-runtime-provider.js';
3
+ export function registerOpenRouterRuntime(router, options) {
4
+ const { apiKey, logger } = options;
5
+ const provider = createOpenRouterRuntimeProvider({ apiKey, logger });
6
+ router.registerProvider(provider);
7
+ const adapter = createOpenRouterRuntimeAdapter();
8
+ router.getAdapterRegistry().register(adapter);
9
+ logger?.info('Registered OpenRouter runtime provider and adapter', {
10
+ provider: 'openrouter',
11
+ runtimeEnabled: true,
12
+ });
13
+ }
14
+ export { shouldUseOpenRouterRuntime, resolveOpenRouterRuntimeDefaults } from './should-use-openrouter-runtime.js';
@@ -0,0 +1,10 @@
1
+ import type { LLMProviderRouter } from '@x12i/ai-providers-router';
2
+ import type { Logxer } from '@x12i/logxer';
3
+ import type { GatewayOpenRouterRuntimeConfig } from '../types.js';
4
+ export type RegisterOpenRouterRuntimeOptions = {
5
+ apiKey: string;
6
+ logger?: Logxer;
7
+ runtimeConfig?: GatewayOpenRouterRuntimeConfig;
8
+ };
9
+ export declare function registerOpenRouterRuntime(router: LLMProviderRouter, options: RegisterOpenRouterRuntimeOptions): void;
10
+ export { shouldUseOpenRouterRuntime, resolveOpenRouterRuntimeDefaults } from './should-use-openrouter-runtime.js';
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Whether the gateway should register @x12i/openrouter-runtime instead of the router's legacy OpenRouter provider.
3
+ *
4
+ * - AI_GATEWAY_USE_LEGACY_OPENROUTER=1 → legacy router OpenRouter
5
+ * - AI_GATEWAY_USE_OPENROUTER_RUNTIME=0 → legacy
6
+ * - GatewayConfig.openrouterRuntime.enabled=false → legacy
7
+ * - default → runtime enabled
8
+ */
9
+ export function shouldUseOpenRouterRuntime(config) {
10
+ const legacyEnv = process.env.AI_GATEWAY_USE_LEGACY_OPENROUTER;
11
+ if (legacyEnv === '1' || legacyEnv === 'true') {
12
+ return false;
13
+ }
14
+ const runtimeEnv = process.env.AI_GATEWAY_USE_OPENROUTER_RUNTIME;
15
+ if (runtimeEnv === '0' || runtimeEnv === 'false') {
16
+ return false;
17
+ }
18
+ if (config?.openrouterRuntime?.enabled === false) {
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ export function resolveOpenRouterRuntimeDefaults(config) {
24
+ const rt = config?.openrouterRuntime;
25
+ return {
26
+ apiMode: rt?.apiMode ?? 'auto',
27
+ includeRawInTrace: rt?.includeRawInTrace ?? false,
28
+ };
29
+ }
@@ -0,0 +1,14 @@
1
+ import type { GatewayConfig } from '../types.js';
2
+ /**
3
+ * Whether the gateway should register @x12i/openrouter-runtime instead of the router's legacy OpenRouter provider.
4
+ *
5
+ * - AI_GATEWAY_USE_LEGACY_OPENROUTER=1 → legacy router OpenRouter
6
+ * - AI_GATEWAY_USE_OPENROUTER_RUNTIME=0 → legacy
7
+ * - GatewayConfig.openrouterRuntime.enabled=false → legacy
8
+ * - default → runtime enabled
9
+ */
10
+ export declare function shouldUseOpenRouterRuntime(config?: GatewayConfig): boolean;
11
+ export declare function resolveOpenRouterRuntimeDefaults(config?: GatewayConfig): {
12
+ apiMode: 'chat' | 'responses' | 'auto';
13
+ includeRawInTrace: boolean;
14
+ };
@@ -0,0 +1,151 @@
1
+ import { GatewayValidationError, ProviderConfigError, } from '../instruction-errors.js';
2
+ const TOOL_KEYS = [
3
+ 'webSearch',
4
+ 'webFetch',
5
+ 'datetime',
6
+ 'imageGeneration',
7
+ 'applyPatch',
8
+ 'fusion',
9
+ 'advisor',
10
+ 'subagent',
11
+ ];
12
+ function getToolMode(serverTools, key) {
13
+ const tool = serverTools?.[key];
14
+ if (!tool)
15
+ return undefined;
16
+ if (Array.isArray(tool)) {
17
+ return tool.some((t) => t.mode === 'required')
18
+ ? 'required'
19
+ : tool.some((t) => t.mode === 'allowed')
20
+ ? 'allowed'
21
+ : 'disabled';
22
+ }
23
+ return tool.mode;
24
+ }
25
+ export function hasAnyServerToolMode(serverTools, mode) {
26
+ if (!serverTools)
27
+ return false;
28
+ for (const key of TOOL_KEYS) {
29
+ const m = getToolMode(serverTools, key);
30
+ if (m === mode)
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ export function hasAnyActiveServerTool(serverTools) {
36
+ if (!serverTools)
37
+ return false;
38
+ for (const key of TOOL_KEYS) {
39
+ const m = getToolMode(serverTools, key);
40
+ if (m === 'allowed' || m === 'required')
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ export function hasRequiredServerTool(serverTools) {
46
+ return hasAnyServerToolMode(serverTools, 'required');
47
+ }
48
+ function resolveEffectiveApiMode(openrouter, serverTools) {
49
+ if (openrouter?.apiMode)
50
+ return openrouter.apiMode;
51
+ const applyPatch = serverTools?.applyPatch;
52
+ if (applyPatch && applyPatch.mode !== 'disabled')
53
+ return 'auto';
54
+ return 'auto';
55
+ }
56
+ export function validateApplyPatchConfig(serverTools, openrouter) {
57
+ const applyPatch = serverTools?.applyPatch;
58
+ if (!applyPatch || applyPatch.mode === 'disabled')
59
+ return;
60
+ if (applyPatch.behavior === 'apply_with_callback') {
61
+ throw new GatewayValidationError('PATCH_APPLIER_REQUIRED', 'applyPatch behavior apply_with_callback is not supported by ai-gateway; use return_only');
62
+ }
63
+ const apiMode = resolveEffectiveApiMode(openrouter, serverTools);
64
+ if (apiMode === 'chat') {
65
+ throw new GatewayValidationError('APPLY_PATCH_REQUIRES_RESPONSES_API', 'applyPatch requires openrouter.apiMode = "responses" or auto mode resolving to responses');
66
+ }
67
+ }
68
+ export function applyPostRoutingServerToolsPolicy(input) {
69
+ const warnings = [];
70
+ const { serverTools, openrouter, openRouterApiKey } = input;
71
+ let provider = input.provider?.toLowerCase();
72
+ if (!hasAnyActiveServerTool(serverTools)) {
73
+ return { serverTools, warnings, forceOpenRouter: false };
74
+ }
75
+ validateApplyPatchConfig(serverTools, openrouter);
76
+ if (hasRequiredServerTool(serverTools)) {
77
+ if (!openRouterApiKey) {
78
+ throw new ProviderConfigError('OPENROUTER_SERVER_TOOL_REQUIRES_KEY', 'Required OpenRouter server tools need OPENROUTER_API_KEY or GatewayConfig.openrouter.apiKey');
79
+ }
80
+ if (provider !== 'openrouter') {
81
+ provider = 'openrouter';
82
+ return { serverTools, warnings, forceOpenRouter: true };
83
+ }
84
+ return { serverTools, warnings, forceOpenRouter: false };
85
+ }
86
+ if (provider !== 'openrouter') {
87
+ warnings.push({
88
+ code: 'SERVER_TOOLS_IGNORED_FOR_NON_OPENROUTER_PROVIDER',
89
+ message: 'OpenRouter server tools were requested but the final provider is not openrouter; tools were stripped',
90
+ });
91
+ return { serverTools: undefined, warnings, forceOpenRouter: false };
92
+ }
93
+ return { serverTools, warnings, forceOpenRouter: false };
94
+ }
95
+ export function applyOnlineVariantMigration(model, serverTools) {
96
+ if (!model.endsWith(':online')) {
97
+ return { model, serverTools };
98
+ }
99
+ const stripped = model.slice(0, -':online'.length);
100
+ const merged = { ...(serverTools ?? {}) };
101
+ if (!merged.webSearch) {
102
+ merged.webSearch = { mode: 'allowed' };
103
+ }
104
+ return {
105
+ model: stripped,
106
+ serverTools: merged,
107
+ warning: {
108
+ code: 'OPENROUTER_ONLINE_VARIANT_DEPRECATED',
109
+ message: `Model suffix :online is deprecated; stripped to "${stripped}" and enabled webSearch.mode=allowed`,
110
+ },
111
+ };
112
+ }
113
+ export function mergeServerToolsConfig(...layers) {
114
+ const out = {};
115
+ for (const layer of layers) {
116
+ if (!layer)
117
+ continue;
118
+ for (const key of TOOL_KEYS) {
119
+ const val = layer[key];
120
+ if (val !== undefined) {
121
+ out[key] = val;
122
+ }
123
+ }
124
+ }
125
+ return Object.keys(out).length ? out : undefined;
126
+ }
127
+ export function mergeOpenRouterConfig(...layers) {
128
+ const out = {};
129
+ for (const layer of layers) {
130
+ if (!layer)
131
+ continue;
132
+ if (layer.apiMode !== undefined)
133
+ out.apiMode = layer.apiMode;
134
+ if (layer.includeRawInTrace !== undefined)
135
+ out.includeRawInTrace = layer.includeRawInTrace;
136
+ if (layer.rawOverrides !== undefined) {
137
+ out.rawOverrides = { ...(out.rawOverrides ?? {}), ...layer.rawOverrides };
138
+ }
139
+ }
140
+ return Object.keys(out).length ? out : undefined;
141
+ }
142
+ /** Default applyPatch behavior when not specified. */
143
+ export function normalizeApplyPatchDefaults(serverTools) {
144
+ if (!serverTools?.applyPatch)
145
+ return serverTools;
146
+ const applyPatch = {
147
+ behavior: 'return_only',
148
+ ...serverTools.applyPatch,
149
+ };
150
+ return { ...serverTools, applyPatch };
151
+ }
@@ -0,0 +1,30 @@
1
+ import type { GatewayOpenRouterConfig, GatewayServerToolsConfig } from '../types.js';
2
+ export type ServerToolValidationWarning = {
3
+ code: string;
4
+ message: string;
5
+ };
6
+ export declare function hasAnyServerToolMode(serverTools: GatewayServerToolsConfig | undefined, mode: 'allowed' | 'required'): boolean;
7
+ export declare function hasAnyActiveServerTool(serverTools?: GatewayServerToolsConfig): boolean;
8
+ export declare function hasRequiredServerTool(serverTools?: GatewayServerToolsConfig): boolean;
9
+ export declare function validateApplyPatchConfig(serverTools: GatewayServerToolsConfig | undefined, openrouter: GatewayOpenRouterConfig | undefined): void;
10
+ export type PostRoutingServerToolsResult = {
11
+ serverTools?: GatewayServerToolsConfig;
12
+ warnings: ServerToolValidationWarning[];
13
+ forceOpenRouter: boolean;
14
+ };
15
+ export declare function applyPostRoutingServerToolsPolicy(input: {
16
+ provider: string | undefined;
17
+ serverTools?: GatewayServerToolsConfig;
18
+ openrouter?: GatewayOpenRouterConfig;
19
+ openRouterApiKey?: string;
20
+ }): PostRoutingServerToolsResult;
21
+ export type OnlineVariantMigrationResult = {
22
+ model: string;
23
+ serverTools?: GatewayServerToolsConfig;
24
+ warning?: ServerToolValidationWarning;
25
+ };
26
+ export declare function applyOnlineVariantMigration(model: string, serverTools?: GatewayServerToolsConfig): OnlineVariantMigrationResult;
27
+ export declare function mergeServerToolsConfig(...layers: (GatewayServerToolsConfig | undefined)[]): GatewayServerToolsConfig | undefined;
28
+ export declare function mergeOpenRouterConfig(...layers: (GatewayOpenRouterConfig | undefined)[]): GatewayOpenRouterConfig | undefined;
29
+ /** Default applyPatch behavior when not specified. */
30
+ export declare function normalizeApplyPatchDefaults(serverTools?: GatewayServerToolsConfig): GatewayServerToolsConfig | undefined;