@x12i/ai-gateway 11.0.7 → 11.1.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.
- package/dist/gateway-config.d.ts +4 -4
- package/dist/gateway-config.js +18 -53
- package/dist/gateway-log-levels.d.ts +3 -1
- package/dist/gateway-log-levels.js +2 -1
- package/dist/gateway-retry.d.ts +2 -2
- package/dist/gateway-router.d.ts +42 -0
- package/dist/gateway-router.js +118 -0
- package/dist/gateway-utils.d.ts +2 -2
- package/dist/gateway-utils.js +1 -1
- package/dist/gateway.d.ts +2 -3
- package/dist/gateway.js +4 -16
- package/dist/index.d.ts +9 -13
- package/dist/index.js +7 -13
- package/dist/openrouter-runtime-adapter/index.d.ts +1 -3
- package/dist/openrouter-runtime-adapter/index.js +1 -3
- package/dist/openrouter-runtime-adapter/map-gateway-request.d.ts +1 -2
- package/dist/openrouter-runtime-adapter/map-gateway-request.js +0 -1
- package/dist/openrouter-runtime-adapter/map-runtime-errors.d.ts +14 -3
- package/dist/openrouter-runtime-adapter/map-runtime-errors.js +13 -3
- package/dist/openrouter-runtime-adapter/map-runtime-response.d.ts +2 -2
- package/dist/openrouter-runtime-adapter/map-server-tools.d.ts +1 -1
- package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +1 -6
- package/dist/openrouter-runtime-adapter/should-use-openrouter-runtime.js +1 -6
- package/dist/router-errors.d.ts +52 -0
- package/dist/router-errors.js +115 -0
- package/dist/router-types.d.ts +147 -0
- package/dist/router-types.js +4 -0
- package/dist/types.d.ts +11 -16
- package/dist-cjs/gateway-config.cjs +18 -53
- package/dist-cjs/gateway-config.d.ts +4 -4
- package/dist-cjs/gateway-log-levels.cjs +2 -1
- package/dist-cjs/gateway-log-levels.d.ts +3 -1
- package/dist-cjs/gateway-retry.d.ts +2 -2
- package/dist-cjs/gateway-router.cjs +118 -0
- package/dist-cjs/gateway-router.d.ts +42 -0
- package/dist-cjs/gateway-utils.cjs +1 -1
- package/dist-cjs/gateway-utils.d.ts +2 -2
- package/dist-cjs/gateway.cjs +4 -16
- package/dist-cjs/gateway.d.ts +2 -3
- package/dist-cjs/index.cjs +7 -13
- package/dist-cjs/index.d.ts +9 -13
- package/dist-cjs/openrouter-runtime-adapter/index.cjs +1 -3
- package/dist-cjs/openrouter-runtime-adapter/index.d.ts +1 -3
- package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.cjs +0 -1
- package/dist-cjs/openrouter-runtime-adapter/map-gateway-request.d.ts +1 -2
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.cjs +13 -3
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.d.ts +14 -3
- package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.d.ts +2 -2
- package/dist-cjs/openrouter-runtime-adapter/map-server-tools.d.ts +1 -1
- package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.cjs +1 -6
- package/dist-cjs/openrouter-runtime-adapter/should-use-openrouter-runtime.d.ts +1 -6
- package/dist-cjs/router-errors.cjs +115 -0
- package/dist-cjs/router-errors.d.ts +52 -0
- package/dist-cjs/router-types.cjs +4 -0
- package/dist-cjs/router-types.d.ts +147 -0
- package/dist-cjs/types.d.ts +11 -16
- package/package.json +5 -6
- package/dist/gateway-provider-auto-register.d.ts +0 -17
- package/dist/gateway-provider-auto-register.js +0 -159
- package/dist/gateway-provider.d.ts +0 -54
- package/dist/gateway-provider.js +0 -202
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +0 -23
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-adapter.js +0 -31
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +0 -10
- package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.js +0 -152
- package/dist/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +0 -10
- package/dist/openrouter-runtime-adapter/register-openrouter-runtime.js +0 -19
- package/dist-cjs/gateway-provider-auto-register.cjs +0 -159
- package/dist-cjs/gateway-provider-auto-register.d.ts +0 -17
- package/dist-cjs/gateway-provider.cjs +0 -202
- package/dist-cjs/gateway-provider.d.ts +0 -54
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.cjs +0 -31
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-adapter.d.ts +0 -23
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.cjs +0 -152
- package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.d.ts +0 -10
- package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.cjs +0 -19
- package/dist-cjs/openrouter-runtime-adapter/register-openrouter-runtime.d.ts +0 -10
package/dist/gateway-provider.js
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gateway Provider Module
|
|
3
|
-
* Handles provider management
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Register a provider with the router
|
|
7
|
-
*/
|
|
8
|
-
export function registerProvider(provider, router, logger) {
|
|
9
|
-
// Get provider name - try multiple methods
|
|
10
|
-
let providerName = 'unknown';
|
|
11
|
-
if (typeof provider.getProviderName === 'function') {
|
|
12
|
-
providerName = provider.getProviderName();
|
|
13
|
-
}
|
|
14
|
-
else if (provider.name) {
|
|
15
|
-
providerName = provider.name;
|
|
16
|
-
}
|
|
17
|
-
else if (provider.constructor?.name) {
|
|
18
|
-
providerName = provider.constructor.name.replace('Provider', '').toLowerCase();
|
|
19
|
-
}
|
|
20
|
-
logger.debug('Registering provider', { provider: providerName });
|
|
21
|
-
// Check if provider has required methods
|
|
22
|
-
if (!provider || (typeof provider.invoke !== 'function' && typeof provider.aiCall !== 'function')) {
|
|
23
|
-
logger.error('Provider registration failed: must implement invoke() or aiCall()', {
|
|
24
|
-
provider: providerName,
|
|
25
|
-
hasInvoke: typeof provider.invoke === 'function',
|
|
26
|
-
hasAiCall: typeof provider.aiCall === 'function'
|
|
27
|
-
});
|
|
28
|
-
throw new Error('Provider must implement LLMProviderInterface (invoke) or AIProviderInterface (aiCall)');
|
|
29
|
-
}
|
|
30
|
-
// Create a ProviderModule wrapper for the provider instance
|
|
31
|
-
logger.debug('Creating ProviderModule wrapper for provider instance', { provider: providerName });
|
|
32
|
-
// Ensure provider has invoke method
|
|
33
|
-
let providerWithInvoke = provider;
|
|
34
|
-
if (typeof provider.aiCall === 'function' && typeof provider.invoke !== 'function') {
|
|
35
|
-
logger.debug('Provider uses aiCall, creating invoke wrapper', { provider: providerName });
|
|
36
|
-
providerWithInvoke = {
|
|
37
|
-
...provider,
|
|
38
|
-
invoke: async (request) => {
|
|
39
|
-
// Convert LLMRequest to format expected by aiCall
|
|
40
|
-
return await provider.aiCall(request);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
// Create ProviderModule wrapper
|
|
45
|
-
const providerModule = {
|
|
46
|
-
name: providerName,
|
|
47
|
-
capabilities: {
|
|
48
|
-
modes: {
|
|
49
|
-
sync: true,
|
|
50
|
-
stream: false,
|
|
51
|
-
batch: false
|
|
52
|
-
},
|
|
53
|
-
operations: ['invoke'],
|
|
54
|
-
maxConcurrency: 10
|
|
55
|
-
},
|
|
56
|
-
execute: async (request) => {
|
|
57
|
-
return await providerWithInvoke.invoke(request);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
// Register with router using registerProvider
|
|
61
|
-
try {
|
|
62
|
-
router.registerProvider(providerModule);
|
|
63
|
-
logger.info('Provider registered as ProviderModule', {
|
|
64
|
-
provider: providerName,
|
|
65
|
-
totalProviders: router.listProviders().length
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
logger.error('Failed to register provider with router.registerProvider, trying registry directly', {
|
|
70
|
-
provider: providerName,
|
|
71
|
-
error: error instanceof Error ? error.message : String(error)
|
|
72
|
-
});
|
|
73
|
-
// Fallback: try to access registry directly
|
|
74
|
-
try {
|
|
75
|
-
const registry = router.getProviderRegistry();
|
|
76
|
-
registry.register(providerModule);
|
|
77
|
-
logger.info('Provider registered via registry fallback', {
|
|
78
|
-
provider: providerName,
|
|
79
|
-
totalProviders: router.listProviders().length
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch (registryError) {
|
|
83
|
-
logger.error('Failed to register provider via registry', {
|
|
84
|
-
provider: providerName,
|
|
85
|
-
error: registryError instanceof Error ? registryError.message : String(registryError)
|
|
86
|
-
});
|
|
87
|
-
throw registryError;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Unregister a provider
|
|
93
|
-
*/
|
|
94
|
-
export function unregisterProvider(providerName, router, logger) {
|
|
95
|
-
try {
|
|
96
|
-
// Try to access registry directly to remove the provider
|
|
97
|
-
const registry = router.getProviderRegistry();
|
|
98
|
-
// Since registry doesn't have an unregister method, we'll need to manipulate the map directly
|
|
99
|
-
// This is a bit hacky but necessary since the API doesn't provide unregister
|
|
100
|
-
const map = registry.map;
|
|
101
|
-
if (map && map instanceof Map) {
|
|
102
|
-
map.delete(providerName);
|
|
103
|
-
logger.info('Provider unregistered from registry', { provider: providerName });
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
logger.warn('Could not access provider registry map for unregistration', { provider: providerName });
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
logger.error('Failed to unregister provider', {
|
|
111
|
-
provider: providerName,
|
|
112
|
-
error: error instanceof Error ? error.message : String(error)
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Get a provider module
|
|
118
|
-
*/
|
|
119
|
-
export function getProvider(providerName, router) {
|
|
120
|
-
try {
|
|
121
|
-
const registry = router.getProviderRegistry();
|
|
122
|
-
return registry.get(providerName);
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
// Fallback to any access if registry access fails
|
|
126
|
-
return router.getProvider?.(providerName);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* List all registered providers
|
|
131
|
-
*/
|
|
132
|
-
export function listProviders(router) {
|
|
133
|
-
return router.listProviders();
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Set default provider
|
|
137
|
-
*
|
|
138
|
-
* NOTE: Router doesn't support changing default provider after initialization.
|
|
139
|
-
* This method is kept for API compatibility but does nothing.
|
|
140
|
-
* Default provider must be set in router config during initialization.
|
|
141
|
-
*/
|
|
142
|
-
export function setDefaultProvider(provider, router, logger) {
|
|
143
|
-
// Router doesn't support changing default provider after initialization
|
|
144
|
-
// Default provider must be set in router config during initialization
|
|
145
|
-
logger.warn('setDefaultProvider called but router does not support changing default provider after initialization', {
|
|
146
|
-
provider,
|
|
147
|
-
note: 'Default provider must be set in router config during initialization'
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Set fallback chain
|
|
152
|
-
*
|
|
153
|
-
* NOTE: Router doesn't support changing fallback chain after initialization.
|
|
154
|
-
* This method is kept for API compatibility but does nothing.
|
|
155
|
-
* Fallback chain must be set in router config during initialization.
|
|
156
|
-
*/
|
|
157
|
-
export function setFallbackChain(chain, router, logger) {
|
|
158
|
-
// Router doesn't support changing fallback chain after initialization
|
|
159
|
-
// Fallback chain must be set in router config during initialization
|
|
160
|
-
logger.warn('setFallbackChain called but router does not support changing fallback chain after initialization', {
|
|
161
|
-
chain,
|
|
162
|
-
note: 'Fallback chain must be set in router config during initialization'
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Add request interceptor
|
|
167
|
-
*/
|
|
168
|
-
export function addRequestInterceptor(interceptor, router) {
|
|
169
|
-
router.addRequestInterceptor(interceptor);
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Add response interceptor
|
|
173
|
-
*/
|
|
174
|
-
export function addResponseInterceptor(interceptor, router) {
|
|
175
|
-
router.addResponseInterceptor(interceptor);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Check health of a provider
|
|
179
|
-
*/
|
|
180
|
-
export async function checkHealth(provider, router) {
|
|
181
|
-
return router.checkHealth(provider);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Check health of all providers
|
|
185
|
-
*/
|
|
186
|
-
export async function checkAllHealth(router) {
|
|
187
|
-
const providers = listProviders(router);
|
|
188
|
-
const results = {};
|
|
189
|
-
for (const provider of providers) {
|
|
190
|
-
try {
|
|
191
|
-
results[provider] = await router.checkHealth(provider);
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
results[provider] = {
|
|
195
|
-
provider,
|
|
196
|
-
healthy: false,
|
|
197
|
-
error: error instanceof Error ? error.message : String(error)
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return results;
|
|
202
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { ProviderSDKCallSpec } from '@x12i/ai-provider-interface';
|
|
2
|
-
import type { AIResponse } from '@x12i/ai-providers-router';
|
|
3
|
-
export declare function createOpenRouterRuntimeAdapter(): {
|
|
4
|
-
provider: string;
|
|
5
|
-
buildCallSpec(input: {
|
|
6
|
-
requestId: string;
|
|
7
|
-
mode: "sync" | "stream";
|
|
8
|
-
request: Record<string, unknown>;
|
|
9
|
-
exec?: {
|
|
10
|
-
timeoutMs?: number;
|
|
11
|
-
retries?: number;
|
|
12
|
-
idempotencyKey?: string;
|
|
13
|
-
signal?: AbortSignal;
|
|
14
|
-
};
|
|
15
|
-
}): ProviderSDKCallSpec;
|
|
16
|
-
parseResponse(input: {
|
|
17
|
-
requestId: string;
|
|
18
|
-
request: unknown;
|
|
19
|
-
execResult: {
|
|
20
|
-
rawResponse: unknown;
|
|
21
|
-
};
|
|
22
|
-
}): AIResponse;
|
|
23
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { mapGatewayRequestToRuntimeRequestFromRouter, OPENROUTER_RUNTIME_OPERATION, } from './map-gateway-request.js';
|
|
2
|
-
import { parseRuntimeResponseToAIResponse } from './map-runtime-response.js';
|
|
3
|
-
export function createOpenRouterRuntimeAdapter() {
|
|
4
|
-
return {
|
|
5
|
-
provider: 'openrouter',
|
|
6
|
-
buildCallSpec(input) {
|
|
7
|
-
const runtimeRequest = mapGatewayRequestToRuntimeRequestFromRouter({
|
|
8
|
-
request: input.request,
|
|
9
|
-
exec: input.exec,
|
|
10
|
-
});
|
|
11
|
-
return {
|
|
12
|
-
requestId: input.requestId,
|
|
13
|
-
provider: 'openrouter',
|
|
14
|
-
mode: input.mode === 'stream' ? 'sync' : input.mode,
|
|
15
|
-
operation: OPENROUTER_RUNTIME_OPERATION,
|
|
16
|
-
args: runtimeRequest,
|
|
17
|
-
exec: input.exec
|
|
18
|
-
? {
|
|
19
|
-
timeoutMs: input.exec.timeoutMs,
|
|
20
|
-
retries: input.exec.retries,
|
|
21
|
-
idempotencyKey: input.exec.idempotencyKey,
|
|
22
|
-
signal: input.exec.signal,
|
|
23
|
-
}
|
|
24
|
-
: undefined,
|
|
25
|
-
};
|
|
26
|
-
},
|
|
27
|
-
parseResponse(input) {
|
|
28
|
-
return parseRuntimeResponseToAIResponse(input);
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type OpenRouterRuntime } from '@x12i/openrouter-runtime';
|
|
2
|
-
import type { ProviderModule } from '@x12i/ai-provider-interface';
|
|
3
|
-
import type { Logxer } from '@x12i/logxer';
|
|
4
|
-
export type OpenRouterRuntimeProviderOptions = {
|
|
5
|
-
apiKey: string;
|
|
6
|
-
logger?: Logxer;
|
|
7
|
-
runtime?: OpenRouterRuntime;
|
|
8
|
-
debugOpenRouterBody?: boolean;
|
|
9
|
-
};
|
|
10
|
-
export declare function createOpenRouterRuntimeProvider(options: OpenRouterRuntimeProviderOptions): ProviderModule;
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { createOpenRouterRuntime, RuntimeConfigError, OpenRouterHttpError, } from '@x12i/openrouter-runtime';
|
|
2
|
-
import { OPENROUTER_RUNTIME_OPERATION } from './map-gateway-request.js';
|
|
3
|
-
import { throwMappedOpenRouterHttpError, throwMappedRuntimeConfigError, throwMappedRuntimeResponseErrors, } from './map-runtime-errors.js';
|
|
4
|
-
import { redactRawOpenRouterPayload } from './map-trace.js';
|
|
5
|
-
function hasOwn(obj, key) {
|
|
6
|
-
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
7
|
-
}
|
|
8
|
-
function summarizeStreamValue(value) {
|
|
9
|
-
if (value == null || ['boolean', 'number', 'string'].includes(typeof value))
|
|
10
|
-
return value;
|
|
11
|
-
if (Array.isArray(value))
|
|
12
|
-
return `[array:${value.length}]`;
|
|
13
|
-
return `[${typeof value}]`;
|
|
14
|
-
}
|
|
15
|
-
function collectStreamFields(value, path = 'body', depth = 0, out = []) {
|
|
16
|
-
if (out.length >= 20 || depth > 8 || value == null || typeof value !== 'object')
|
|
17
|
-
return out;
|
|
18
|
-
if (Array.isArray(value)) {
|
|
19
|
-
for (let i = 0; i < value.length && out.length < 20; i += 1) {
|
|
20
|
-
collectStreamFields(value[i], `${path}[${i}]`, depth + 1, out);
|
|
21
|
-
}
|
|
22
|
-
return out;
|
|
23
|
-
}
|
|
24
|
-
for (const [key, child] of Object.entries(value)) {
|
|
25
|
-
const childPath = `${path}.${key}`;
|
|
26
|
-
if (key === 'stream') {
|
|
27
|
-
out.push({ path: childPath, value: summarizeStreamValue(child) });
|
|
28
|
-
if (out.length >= 20)
|
|
29
|
-
return out;
|
|
30
|
-
}
|
|
31
|
-
collectStreamFields(child, childPath, depth + 1, out);
|
|
32
|
-
}
|
|
33
|
-
return out;
|
|
34
|
-
}
|
|
35
|
-
function summarizeServerTools(serverTools) {
|
|
36
|
-
if (!serverTools)
|
|
37
|
-
return undefined;
|
|
38
|
-
const out = {};
|
|
39
|
-
for (const [key, value] of Object.entries(serverTools)) {
|
|
40
|
-
if (Array.isArray(value)) {
|
|
41
|
-
out[key] = value.map((item) => item.mode).join(',');
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
if (value && typeof value === 'object' && 'mode' in value && typeof value.mode === 'string') {
|
|
45
|
-
out[key] = value.mode;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return Object.keys(out).length ? out : undefined;
|
|
49
|
-
}
|
|
50
|
-
function summarizeCompiledTools(compiled) {
|
|
51
|
-
const tools = Array.isArray(compiled.body.tools) ? compiled.body.tools : [];
|
|
52
|
-
const toolTypes = tools
|
|
53
|
-
.map((tool) => (tool && typeof tool === 'object' && 'type' in tool ? String(tool.type) : undefined))
|
|
54
|
-
.filter((type) => typeof type === 'string');
|
|
55
|
-
return {
|
|
56
|
-
apiMode: compiled.apiMode,
|
|
57
|
-
toolCount: tools.length,
|
|
58
|
-
toolTypes,
|
|
59
|
-
bodyKeys: Object.keys(compiled.body),
|
|
60
|
-
hasTopLevelStream: hasOwn(compiled.body, 'stream'),
|
|
61
|
-
topLevelStream: compiled.body.stream,
|
|
62
|
-
streamFields: collectStreamFields(compiled.body),
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function shouldDebugOpenRouterBody(options) {
|
|
66
|
-
if (options.debugOpenRouterBody === true)
|
|
67
|
-
return true;
|
|
68
|
-
const env = process.env.AI_GATEWAY_DEBUG_OPENROUTER_BODY?.toLowerCase();
|
|
69
|
-
return env === '1' || env === 'true' || env === 'yes';
|
|
70
|
-
}
|
|
71
|
-
export function createOpenRouterRuntimeProvider(options) {
|
|
72
|
-
const debugOpenRouterBody = shouldDebugOpenRouterBody(options);
|
|
73
|
-
const runtime = options.runtime ??
|
|
74
|
-
createOpenRouterRuntime({
|
|
75
|
-
apiKey: options.apiKey,
|
|
76
|
-
defaults: {
|
|
77
|
-
retry: { enabled: false },
|
|
78
|
-
onPolicyViolation: 'throw',
|
|
79
|
-
},
|
|
80
|
-
logger: options.logger
|
|
81
|
-
? {
|
|
82
|
-
debug: (event, data) => options.logger?.debug(event, data),
|
|
83
|
-
info: (event, data) => options.logger?.info(event, data),
|
|
84
|
-
warn: (event, data) => options.logger?.warn(event, data),
|
|
85
|
-
error: (event, data) => options.logger?.error(event, data),
|
|
86
|
-
}
|
|
87
|
-
: undefined,
|
|
88
|
-
hooks: options.logger
|
|
89
|
-
? {
|
|
90
|
-
beforeOpenRouterRequest: (compiled) => {
|
|
91
|
-
const summary = summarizeCompiledTools(compiled);
|
|
92
|
-
options.logger?.debug('OpenRouter runtime compiled request before fetch', {
|
|
93
|
-
...summary,
|
|
94
|
-
url: compiled.url,
|
|
95
|
-
});
|
|
96
|
-
if (debugOpenRouterBody) {
|
|
97
|
-
const redactedBody = redactRawOpenRouterPayload(compiled.body);
|
|
98
|
-
options.logger?.debug('OpenRouter runtime compiled request body before fetch', {
|
|
99
|
-
apiMode: compiled.apiMode,
|
|
100
|
-
url: compiled.url,
|
|
101
|
-
body: redactedBody,
|
|
102
|
-
bodyJson: JSON.stringify(redactedBody, null, 2),
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
}
|
|
107
|
-
: undefined,
|
|
108
|
-
});
|
|
109
|
-
return {
|
|
110
|
-
name: 'openrouter',
|
|
111
|
-
capabilities: {
|
|
112
|
-
modes: { sync: true, stream: false, batch: false },
|
|
113
|
-
operations: [OPENROUTER_RUNTIME_OPERATION],
|
|
114
|
-
maxConcurrency: 10,
|
|
115
|
-
},
|
|
116
|
-
async execute(spec) {
|
|
117
|
-
if (spec.operation !== OPENROUTER_RUNTIME_OPERATION) {
|
|
118
|
-
throw new Error(`Unsupported OpenRouter runtime operation: ${spec.operation}`);
|
|
119
|
-
}
|
|
120
|
-
const runtimeRequest = spec.args;
|
|
121
|
-
const rawOverrideKeys = runtimeRequest.rawOpenRouterOverrides
|
|
122
|
-
? Object.keys(runtimeRequest.rawOpenRouterOverrides)
|
|
123
|
-
: [];
|
|
124
|
-
const rawOverrides = runtimeRequest.rawOpenRouterOverrides ?? {};
|
|
125
|
-
const rawOverrideHasStream = hasOwn(rawOverrides, 'stream');
|
|
126
|
-
options.logger?.debug('OpenRouter runtime request server tools', {
|
|
127
|
-
requestId: spec.requestId,
|
|
128
|
-
model: runtimeRequest.model,
|
|
129
|
-
apiMode: runtimeRequest.apiMode,
|
|
130
|
-
serverTools: summarizeServerTools(runtimeRequest.serverTools),
|
|
131
|
-
rawOverrideKeys,
|
|
132
|
-
rawOverrideHasStream,
|
|
133
|
-
rawOverrideStream: rawOverrides.stream,
|
|
134
|
-
rawOverridesToolsPresent: Object.prototype.hasOwnProperty.call(rawOverrides, 'tools'),
|
|
135
|
-
});
|
|
136
|
-
try {
|
|
137
|
-
const response = await runtime.run(runtimeRequest);
|
|
138
|
-
if (response.status !== 'completed') {
|
|
139
|
-
throwMappedRuntimeResponseErrors(response);
|
|
140
|
-
}
|
|
141
|
-
return { rawResponse: response };
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
if (err instanceof RuntimeConfigError)
|
|
145
|
-
throwMappedRuntimeConfigError(err);
|
|
146
|
-
if (err instanceof OpenRouterHttpError)
|
|
147
|
-
throwMappedOpenRouterHttpError(err);
|
|
148
|
-
throw err;
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
};
|
|
152
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
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';
|
|
@@ -1,19 +0,0 @@
|
|
|
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, runtimeConfig } = options;
|
|
5
|
-
const provider = createOpenRouterRuntimeProvider({
|
|
6
|
-
apiKey,
|
|
7
|
-
logger,
|
|
8
|
-
debugOpenRouterBody: runtimeConfig?.debugOpenRouterBody,
|
|
9
|
-
});
|
|
10
|
-
router.registerProvider(provider);
|
|
11
|
-
const adapter = createOpenRouterRuntimeAdapter();
|
|
12
|
-
router.getAdapterRegistry().register(adapter);
|
|
13
|
-
logger?.info('Registered OpenRouter runtime provider and adapter', {
|
|
14
|
-
provider: 'openrouter',
|
|
15
|
-
runtimeEnabled: true,
|
|
16
|
-
debugOpenRouterBody: runtimeConfig?.debugOpenRouterBody,
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
export { shouldUseOpenRouterRuntime, resolveOpenRouterRuntimeDefaults } from './should-use-openrouter-runtime.js';
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gateway Provider Auto-Registration Module
|
|
3
|
-
* Automatically registers providers based on environment variables
|
|
4
|
-
*/
|
|
5
|
-
const PROVIDER_CONFIGS = [
|
|
6
|
-
{
|
|
7
|
-
name: 'openai',
|
|
8
|
-
packageName: '@x12i/ai-provider-openai',
|
|
9
|
-
className: 'OpenAIProvider',
|
|
10
|
-
envVar: 'OPENAI_API_KEY'
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
name: 'grok',
|
|
14
|
-
packageName: '@x12i/ai-provider-grok',
|
|
15
|
-
className: 'GrokProvider',
|
|
16
|
-
envVar: 'GROK_API_KEY'
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
name: 'anthropic',
|
|
20
|
-
packageName: '@x12i/ai-provider-anthropic',
|
|
21
|
-
className: 'AnthropicProvider',
|
|
22
|
-
envVar: 'ANTHROPIC_API_KEY',
|
|
23
|
-
optional: true // Optional - may not be installed
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'google',
|
|
27
|
-
packageName: '@x12i/ai-provider-google',
|
|
28
|
-
className: 'GoogleProvider',
|
|
29
|
-
envVar: 'GOOGLE_API_KEY',
|
|
30
|
-
optional: true // Optional - may not be installed
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: 'cohere',
|
|
34
|
-
packageName: '@x12i/ai-provider-cohere',
|
|
35
|
-
className: 'CohereProvider',
|
|
36
|
-
envVar: 'COHERE_API_KEY',
|
|
37
|
-
optional: true // Optional - may not be installed
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
name: 'mistral',
|
|
41
|
-
packageName: '@x12i/ai-provider-mistral',
|
|
42
|
-
className: 'MistralProvider',
|
|
43
|
-
envVar: 'MISTRAL_API_KEY',
|
|
44
|
-
optional: true // Optional - may not be installed
|
|
45
|
-
}
|
|
46
|
-
];
|
|
47
|
-
/**
|
|
48
|
-
* Auto-registers providers based on environment variables
|
|
49
|
-
* Only registers providers that:
|
|
50
|
-
* 1. Have their API key set in environment variables
|
|
51
|
-
* 2. Have their provider package installed
|
|
52
|
-
*
|
|
53
|
-
* @param router - LLM provider router instance
|
|
54
|
-
* @param logger - Logger instance
|
|
55
|
-
* @returns Array of provider names that were successfully registered
|
|
56
|
-
*/
|
|
57
|
-
export async function autoRegisterProviders(router, logger) {
|
|
58
|
-
const registeredProviders = [];
|
|
59
|
-
logger.debug('Auto-registering providers from environment variables');
|
|
60
|
-
for (const providerConfig of PROVIDER_CONFIGS) {
|
|
61
|
-
const apiKey = process.env[providerConfig.envVar];
|
|
62
|
-
// Skip if API key is not set
|
|
63
|
-
if (!apiKey) {
|
|
64
|
-
if (!providerConfig.optional) {
|
|
65
|
-
logger.debug(`Skipping ${providerConfig.name} provider: ${providerConfig.envVar} not set`);
|
|
66
|
-
}
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
// Dynamically import the provider package
|
|
71
|
-
// Use dynamic import() for ES module compatibility
|
|
72
|
-
let ProviderClass;
|
|
73
|
-
try {
|
|
74
|
-
const providerModule = await import(providerConfig.packageName);
|
|
75
|
-
ProviderClass = providerModule[providerConfig.className] || providerModule.default;
|
|
76
|
-
if (!ProviderClass) {
|
|
77
|
-
logger.debug(`Provider class ${providerConfig.className} not found in ${providerConfig.packageName}`);
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch (importError) {
|
|
82
|
-
if (!providerConfig.optional) {
|
|
83
|
-
logger.warn(`Failed to import ${providerConfig.packageName}`, {
|
|
84
|
-
error: importError instanceof Error ? importError.message : String(importError),
|
|
85
|
-
note: `Install it with: npm install ${providerConfig.packageName}`
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
// Instantiate the provider
|
|
91
|
-
const provider = new ProviderClass({
|
|
92
|
-
apiKey: apiKey
|
|
93
|
-
});
|
|
94
|
-
// Get provider name for both module creation and logging
|
|
95
|
-
const providerName = typeof provider.getProviderName === 'function'
|
|
96
|
-
? provider.getProviderName()
|
|
97
|
-
: providerConfig.name;
|
|
98
|
-
// Register with router as ProviderModule
|
|
99
|
-
const providerModule = {
|
|
100
|
-
name: providerName,
|
|
101
|
-
capabilities: {
|
|
102
|
-
modes: {
|
|
103
|
-
sync: true,
|
|
104
|
-
stream: false,
|
|
105
|
-
batch: false
|
|
106
|
-
},
|
|
107
|
-
operations: ['invoke'],
|
|
108
|
-
maxConcurrency: 10
|
|
109
|
-
},
|
|
110
|
-
execute: async (request) => {
|
|
111
|
-
// Use aiCall if available, otherwise assume invoke
|
|
112
|
-
if (typeof provider.aiCall === 'function') {
|
|
113
|
-
return await provider.aiCall(request);
|
|
114
|
-
}
|
|
115
|
-
else if (typeof provider.invoke === 'function') {
|
|
116
|
-
return await provider.invoke(request);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
throw new Error(`Provider ${providerName} has neither aiCall nor invoke method`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
router.registerProvider(providerModule);
|
|
124
|
-
registeredProviders.push(providerName);
|
|
125
|
-
logger.info(`Auto-registered provider: ${providerName}`, {
|
|
126
|
-
provider: providerName,
|
|
127
|
-
envVar: providerConfig.envVar,
|
|
128
|
-
hasApiKey: !!apiKey
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
logger.error(`Failed to auto-register ${providerConfig.name} provider`, {
|
|
133
|
-
provider: providerConfig.name,
|
|
134
|
-
package: providerConfig.packageName,
|
|
135
|
-
error: error instanceof Error ? error.message : String(error),
|
|
136
|
-
stack: error instanceof Error ? error.stack : undefined
|
|
137
|
-
});
|
|
138
|
-
// Continue with other providers even if one fails
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (registeredProviders.length === 0) {
|
|
142
|
-
logger.warn('No providers were auto-registered. Make sure API keys are set in environment variables:', {
|
|
143
|
-
requiredEnvVars: PROVIDER_CONFIGS
|
|
144
|
-
.filter(p => !p.optional)
|
|
145
|
-
.map(p => p.envVar),
|
|
146
|
-
optionalEnvVars: PROVIDER_CONFIGS
|
|
147
|
-
.filter(p => p.optional)
|
|
148
|
-
.map(p => p.envVar),
|
|
149
|
-
openRouter: 'Set OPENROUTER_API_KEY for OpenRouter (default route when set). PREFER_OPENROUTER=false prefers direct provider keys when present; OpenRouter is still used when a requested provider has no key.',
|
|
150
|
-
note: 'You can still manually register providers using gateway.register(provider)'
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
logger.info(`Auto-registered ${registeredProviders.length} provider(s)`, {
|
|
155
|
-
providers: registeredProviders
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
return registeredProviders;
|
|
159
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gateway Provider Auto-Registration Module
|
|
3
|
-
* Automatically registers providers based on environment variables
|
|
4
|
-
*/
|
|
5
|
-
import type { LLMProviderRouter } from '@x12i/ai-providers-router';
|
|
6
|
-
import type { Logxer } from '@x12i/logxer';
|
|
7
|
-
/**
|
|
8
|
-
* Auto-registers providers based on environment variables
|
|
9
|
-
* Only registers providers that:
|
|
10
|
-
* 1. Have their API key set in environment variables
|
|
11
|
-
* 2. Have their provider package installed
|
|
12
|
-
*
|
|
13
|
-
* @param router - LLM provider router instance
|
|
14
|
-
* @param logger - Logger instance
|
|
15
|
-
* @returns Array of provider names that were successfully registered
|
|
16
|
-
*/
|
|
17
|
-
export declare function autoRegisterProviders(router: LLMProviderRouter, logger: Logxer): Promise<string[]>;
|