@x12i/ai-gateway 11.0.7 → 11.1.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/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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router error types and enrichment helpers for gateway consumers.
|
|
3
|
+
*/
|
|
4
|
+
export declare const PROVIDER_FAILURE_CODES: readonly ["OPENROUTER_API_KEY_MISSING", "PROVIDER_AUTH_FAILED", "PROVIDER_RATE_LIMITED", "PROVIDER_QUOTA_EXCEEDED", "PROVIDER_MODEL_NOT_FOUND", "PROVIDER_GATEWAY_UNREACHABLE", "PROVIDER_NOT_REGISTERED", "PROVIDER_REQUEST_FAILED", "PROVIDER_INVOKE_FAILED"];
|
|
5
|
+
export type ProviderFailureCode = (typeof PROVIDER_FAILURE_CODES)[number];
|
|
6
|
+
export type ProviderAttemptDetail = {
|
|
7
|
+
provider: string;
|
|
8
|
+
modelId?: string;
|
|
9
|
+
httpStatus?: number;
|
|
10
|
+
message: string;
|
|
11
|
+
code: ProviderFailureCode;
|
|
12
|
+
retryable?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function operatorHintForProviderFailureCode(code: ProviderFailureCode): string;
|
|
15
|
+
export type FallbackAttempt = {
|
|
16
|
+
provider: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
httpStatus?: number;
|
|
19
|
+
code?: ProviderFailureCode;
|
|
20
|
+
message?: string;
|
|
21
|
+
error: Error;
|
|
22
|
+
responsePreview?: string;
|
|
23
|
+
};
|
|
24
|
+
export declare class ProviderNotFoundError extends Error {
|
|
25
|
+
constructor(providerName: string);
|
|
26
|
+
}
|
|
27
|
+
export declare class OpenRouterApiKeyMissingError extends Error {
|
|
28
|
+
readonly code: "OPENROUTER_API_KEY_MISSING";
|
|
29
|
+
constructor();
|
|
30
|
+
}
|
|
31
|
+
export declare class FallbackExhaustedError extends Error {
|
|
32
|
+
attempts: FallbackAttempt[];
|
|
33
|
+
code?: ProviderFailureCode;
|
|
34
|
+
operatorHint?: string;
|
|
35
|
+
details?: {
|
|
36
|
+
providerAttempts: ProviderAttemptDetail[];
|
|
37
|
+
};
|
|
38
|
+
constructor(attempts: FallbackAttempt[]);
|
|
39
|
+
}
|
|
40
|
+
export declare function buildProviderAttemptDetail(input: {
|
|
41
|
+
provider: string;
|
|
42
|
+
modelId?: string;
|
|
43
|
+
httpStatus?: number;
|
|
44
|
+
message: string;
|
|
45
|
+
code?: ProviderFailureCode;
|
|
46
|
+
err?: unknown;
|
|
47
|
+
}): ProviderAttemptDetail;
|
|
48
|
+
export declare function providerAttemptsFromFallbackAttempts(attempts: FallbackAttempt[]): ProviderAttemptDetail[];
|
|
49
|
+
export declare function enrichRunTaskError(err: Error, input?: {
|
|
50
|
+
providerAttempts?: ProviderAttemptDetail[];
|
|
51
|
+
code?: ProviderFailureCode;
|
|
52
|
+
}): Error;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router-level types for @x12i/ai-gateway (backed by @x12i/ai-router-runtime).
|
|
3
|
+
*/
|
|
4
|
+
import type { LogLevel, Logxer, StackLoggingOptions } from '@x12i/logxer';
|
|
5
|
+
import type { ProviderFailureCode } from './router-errors.js';
|
|
6
|
+
export type RouterMode = 'sync' | 'stream' | 'batch';
|
|
7
|
+
export type NormalizedUsage = {
|
|
8
|
+
promptTokens: number;
|
|
9
|
+
completionTokens: number;
|
|
10
|
+
totalTokens: number;
|
|
11
|
+
};
|
|
12
|
+
export type ActivityCostStatus = 'priced' | 'unpriced';
|
|
13
|
+
export type ProviderModelRef = {
|
|
14
|
+
engine?: string;
|
|
15
|
+
provider?: string;
|
|
16
|
+
model?: string;
|
|
17
|
+
};
|
|
18
|
+
export type AttemptErrorSummary = {
|
|
19
|
+
name: string;
|
|
20
|
+
message: string;
|
|
21
|
+
code: ProviderFailureCode;
|
|
22
|
+
httpStatus?: number;
|
|
23
|
+
responsePreview?: string;
|
|
24
|
+
};
|
|
25
|
+
export type DiagnosticsMetadata = {
|
|
26
|
+
provider?: string;
|
|
27
|
+
region?: string;
|
|
28
|
+
modelUsed?: string;
|
|
29
|
+
costUsd?: number;
|
|
30
|
+
cost?: number;
|
|
31
|
+
costStatus?: ActivityCostStatus;
|
|
32
|
+
maxTokensRequested?: number;
|
|
33
|
+
requestIds?: Record<string, string | undefined>;
|
|
34
|
+
timing?: {
|
|
35
|
+
startedAt: number;
|
|
36
|
+
endedAt: number;
|
|
37
|
+
durationMs: number;
|
|
38
|
+
};
|
|
39
|
+
latencyMs?: number;
|
|
40
|
+
attempts?: unknown[];
|
|
41
|
+
failureCode?: ProviderFailureCode;
|
|
42
|
+
providerAttempts?: unknown[];
|
|
43
|
+
operatorHint?: string;
|
|
44
|
+
normalization?: {
|
|
45
|
+
normalizedConfig?: Record<string, unknown>;
|
|
46
|
+
warnings?: string[];
|
|
47
|
+
};
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Router configuration shared between gateway init and standalone router factory.
|
|
52
|
+
*/
|
|
53
|
+
export interface GatewayRouterConfig {
|
|
54
|
+
usageTracker?: {
|
|
55
|
+
recordRequest(event: {
|
|
56
|
+
provider: string;
|
|
57
|
+
timestamp: number;
|
|
58
|
+
duration: number;
|
|
59
|
+
tokens: {
|
|
60
|
+
input: number;
|
|
61
|
+
output: number;
|
|
62
|
+
total: number;
|
|
63
|
+
};
|
|
64
|
+
cost?: number;
|
|
65
|
+
success: boolean;
|
|
66
|
+
}): void;
|
|
67
|
+
};
|
|
68
|
+
verbose?: boolean;
|
|
69
|
+
logLevel?: LogLevel;
|
|
70
|
+
logging?: StackLoggingOptions;
|
|
71
|
+
logger?: Logxer;
|
|
72
|
+
timeoutMs?: number;
|
|
73
|
+
defaultTimeoutMs?: number;
|
|
74
|
+
preferOpenRouter?: boolean;
|
|
75
|
+
/** @deprecated Use preferOpenRouter. */
|
|
76
|
+
useOpenRouter?: boolean;
|
|
77
|
+
openrouter?: {
|
|
78
|
+
apiKey?: string;
|
|
79
|
+
httpReferer?: string;
|
|
80
|
+
xTitle?: string;
|
|
81
|
+
};
|
|
82
|
+
fallbackChain?: ProviderModelRef[];
|
|
83
|
+
defaultProvider?: string;
|
|
84
|
+
autoDiscover?: boolean;
|
|
85
|
+
}
|
|
86
|
+
export interface AIRouterRequest {
|
|
87
|
+
requestId?: string;
|
|
88
|
+
request: Record<string, unknown>;
|
|
89
|
+
provider?: string;
|
|
90
|
+
mode: RouterMode;
|
|
91
|
+
exec?: {
|
|
92
|
+
timeoutMs?: number;
|
|
93
|
+
retries?: number;
|
|
94
|
+
idempotencyKey?: string;
|
|
95
|
+
signal?: AbortSignal;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export type NormalizedRouterOutput = {
|
|
99
|
+
parsed?: Record<string, unknown>;
|
|
100
|
+
};
|
|
101
|
+
export interface AIResponse {
|
|
102
|
+
requestId: string;
|
|
103
|
+
provider: string;
|
|
104
|
+
rawResponse: unknown;
|
|
105
|
+
outputText?: string;
|
|
106
|
+
output?: NormalizedRouterOutput;
|
|
107
|
+
usage?: NormalizedUsage;
|
|
108
|
+
reasoning: {
|
|
109
|
+
requested: {
|
|
110
|
+
effort: string;
|
|
111
|
+
visibility: string;
|
|
112
|
+
};
|
|
113
|
+
applied: {
|
|
114
|
+
effort: string;
|
|
115
|
+
visibility: string;
|
|
116
|
+
};
|
|
117
|
+
artifacts: {
|
|
118
|
+
encrypted?: unknown[];
|
|
119
|
+
summary?: {
|
|
120
|
+
text: string;
|
|
121
|
+
format: string;
|
|
122
|
+
};
|
|
123
|
+
trace?: {
|
|
124
|
+
text: string;
|
|
125
|
+
format: string;
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
availability: {
|
|
129
|
+
supportsEffort: boolean;
|
|
130
|
+
supportsSummary: boolean;
|
|
131
|
+
supportsTrace: boolean;
|
|
132
|
+
supportsEncrypted: boolean;
|
|
133
|
+
};
|
|
134
|
+
warnings?: unknown[];
|
|
135
|
+
};
|
|
136
|
+
metadata?: DiagnosticsMetadata;
|
|
137
|
+
}
|
|
138
|
+
export interface HealthCheckResult {
|
|
139
|
+
provider: string;
|
|
140
|
+
healthy: boolean;
|
|
141
|
+
latencyMs?: number;
|
|
142
|
+
error?: string;
|
|
143
|
+
}
|
|
144
|
+
/** @deprecated Use {@link GatewayRouterConfig}. */
|
|
145
|
+
export type RouterConfig = GatewayRouterConfig;
|
|
146
|
+
/** Backward-compatible alias for {@link GatewayRouter}. */
|
|
147
|
+
export type LLMProviderRouter = import('./gateway-router.js').GatewayRouter;
|
package/dist-cjs/types.d.ts
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Extends router types with gateway-specific enhancements
|
|
5
5
|
*/
|
|
6
|
-
import { AIResponse,
|
|
6
|
+
import type { AIResponse, GatewayRouterConfig } from './router-types.js';
|
|
7
|
+
import type { GatewayRouter } from './gateway-router.js';
|
|
7
8
|
type AIProvider = string;
|
|
8
9
|
type AIModel = string;
|
|
9
10
|
export type UsageTier = string;
|
|
@@ -366,7 +367,7 @@ export type GatewayInvokeRejectionMetadata = {
|
|
|
366
367
|
*/
|
|
367
368
|
fallbackAttempts?: GatewayFallbackAttempt[];
|
|
368
369
|
/**
|
|
369
|
-
* Structured per-attempt diagnostics
|
|
370
|
+
* Structured per-attempt diagnostics from the gateway fallback chain.
|
|
370
371
|
* Same attempts as {@link fallbackAttempts} when enriched; prefer this for UIs.
|
|
371
372
|
*/
|
|
372
373
|
providerAttempts?: Array<{
|
|
@@ -399,7 +400,7 @@ export type GatewayFallbackAttempt = {
|
|
|
399
400
|
model?: string;
|
|
400
401
|
httpStatus?: number;
|
|
401
402
|
error: string;
|
|
402
|
-
/** Stable sub-code
|
|
403
|
+
/** Stable sub-code (`PROVIDER_AUTH_FAILED`, …). */
|
|
403
404
|
code?: string;
|
|
404
405
|
responsePreview?: string;
|
|
405
406
|
};
|
|
@@ -456,18 +457,12 @@ export type ActivityIdentity = {
|
|
|
456
457
|
};
|
|
457
458
|
/** Re-export parser template options for gateway consumers (MUST/optional protocol, subPathSearch, smartInput, etc.). */
|
|
458
459
|
export type { SmartInputConfig, SmartInputRenderOptions, TemplateRenderOptions } from '@x12i/rendrix';
|
|
459
|
-
type LLMRequest = Parameters<
|
|
460
|
-
type LLMResponse = Awaited<ReturnType<
|
|
460
|
+
type LLMRequest = Parameters<GatewayRouter['invoke']>[0];
|
|
461
|
+
type LLMResponse = Awaited<ReturnType<GatewayRouter['invoke']>>;
|
|
461
462
|
/**
|
|
462
463
|
* Gateway configuration extending router configuration
|
|
463
464
|
*
|
|
464
|
-
*
|
|
465
|
-
* - defaultProvider?: LLMProvider (from llm-provider-interface)
|
|
466
|
-
* - fallbackChain?: LLMProvider[]
|
|
467
|
-
* - autoDiscover?: boolean
|
|
468
|
-
* - usageTracker?: UsageTracker
|
|
469
|
-
*
|
|
470
|
-
* We don't need to redeclare these - they're inherited from RouterConfig
|
|
465
|
+
* GatewayRouterConfig fields (defaultProvider, fallbackChain, usageTracker, …) are inherited below.
|
|
471
466
|
*/
|
|
472
467
|
/**
|
|
473
468
|
* Provider + model reference used for defaults and fallbacks
|
|
@@ -578,7 +573,7 @@ export interface ModelConfig {
|
|
|
578
573
|
}
|
|
579
574
|
/** Alias for {@link ModelConfig} in gateway documentation. */
|
|
580
575
|
export type GatewayModelConfig = ModelConfig;
|
|
581
|
-
export interface GatewayConfig extends Omit<
|
|
576
|
+
export interface GatewayConfig extends Omit<GatewayRouterConfig, 'logger'> {
|
|
582
577
|
/**
|
|
583
578
|
* Default target (engine + model) for routing
|
|
584
579
|
*/
|
|
@@ -610,8 +605,8 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
610
605
|
/**
|
|
611
606
|
* Process-wide package log level registry (logxer ≥ 4.5).
|
|
612
607
|
* Merged after `applyPackageLogLevelsFromEnv()` on first gateway init.
|
|
613
|
-
* `logging`
|
|
614
|
-
* @example `{ default: 'warn', levels: { AI_GATEWAY: 'info',
|
|
608
|
+
* `logging` is forwarded to the gateway logger and router runtime.
|
|
609
|
+
* @example `{ default: 'warn', levels: { AI_GATEWAY: 'info', AI_ROUTER_RUNTIME: 'debug' } }`
|
|
615
610
|
*/
|
|
616
611
|
packageLogLevels?: PackageLogLevelsConfig;
|
|
617
612
|
/**
|
|
@@ -627,7 +622,7 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
627
622
|
packageName?: string;
|
|
628
623
|
/**
|
|
629
624
|
* Full payload logging for gateway-owned verbose lines (`AI_GATEWAY_VERBOSE=true`).
|
|
630
|
-
* Separate from log threshold (`AI_GATEWAY_LOGS_LEVEL=verbose`). Router I/O payloads use the same flag via `
|
|
625
|
+
* Separate from log threshold (`AI_GATEWAY_LOGS_LEVEL=verbose`). Router I/O payloads use the same flag via `GatewayRouterConfig.verbose`.
|
|
631
626
|
*/
|
|
632
627
|
verbose?: boolean;
|
|
633
628
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/ai-gateway",
|
|
3
|
-
"version": "11.0
|
|
3
|
+
"version": "11.1.0",
|
|
4
4
|
"description": "AI Gateway - Unified interface for LLM provider routing and management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -42,13 +42,12 @@
|
|
|
42
42
|
"author": "x12i",
|
|
43
43
|
"license": "mit",
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@x12i/activix": "^9.0.
|
|
46
|
-
"@x12i/ai-profiles": "^4.
|
|
47
|
-
"@x12i/ai-
|
|
48
|
-
"@x12i/ai-tools": "^
|
|
45
|
+
"@x12i/activix": "^9.0.4",
|
|
46
|
+
"@x12i/ai-profiles": "^4.2.1",
|
|
47
|
+
"@x12i/ai-router-runtime": "^1.1.0",
|
|
48
|
+
"@x12i/ai-tools": "^5.0.0",
|
|
49
49
|
"@x12i/flex-md": "^4.8.0",
|
|
50
50
|
"@x12i/logxer": "^5.1.0",
|
|
51
|
-
"@x12i/openrouter-runtime": "^1.0.5",
|
|
52
51
|
"@x12i/rendrix": "^4.3.0"
|
|
53
52
|
},
|
|
54
53
|
"devDependencies": {
|
|
@@ -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[]>;
|
|
@@ -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,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gateway Provider Module
|
|
3
|
-
* Handles provider management
|
|
4
|
-
*/
|
|
5
|
-
import type { LLMProviderRouter } from '@x12i/ai-providers-router';
|
|
6
|
-
import type { Logxer } from '@x12i/logxer';
|
|
7
|
-
/**
|
|
8
|
-
* Register a provider with the router
|
|
9
|
-
*/
|
|
10
|
-
export declare function registerProvider(provider: any, router: LLMProviderRouter, logger: Logxer): void;
|
|
11
|
-
/**
|
|
12
|
-
* Unregister a provider
|
|
13
|
-
*/
|
|
14
|
-
export declare function unregisterProvider(providerName: string, router: LLMProviderRouter, logger: Logxer): void;
|
|
15
|
-
/**
|
|
16
|
-
* Get a provider module
|
|
17
|
-
*/
|
|
18
|
-
export declare function getProvider(providerName: string, router: LLMProviderRouter): any;
|
|
19
|
-
/**
|
|
20
|
-
* List all registered providers
|
|
21
|
-
*/
|
|
22
|
-
export declare function listProviders(router: LLMProviderRouter): string[];
|
|
23
|
-
/**
|
|
24
|
-
* Set default provider
|
|
25
|
-
*
|
|
26
|
-
* NOTE: Router doesn't support changing default provider after initialization.
|
|
27
|
-
* This method is kept for API compatibility but does nothing.
|
|
28
|
-
* Default provider must be set in router config during initialization.
|
|
29
|
-
*/
|
|
30
|
-
export declare function setDefaultProvider(provider: string, router: LLMProviderRouter, logger: Logxer): void;
|
|
31
|
-
/**
|
|
32
|
-
* Set fallback chain
|
|
33
|
-
*
|
|
34
|
-
* NOTE: Router doesn't support changing fallback chain after initialization.
|
|
35
|
-
* This method is kept for API compatibility but does nothing.
|
|
36
|
-
* Fallback chain must be set in router config during initialization.
|
|
37
|
-
*/
|
|
38
|
-
export declare function setFallbackChain(chain: string[], router: LLMProviderRouter, logger: Logxer): void;
|
|
39
|
-
/**
|
|
40
|
-
* Add request interceptor
|
|
41
|
-
*/
|
|
42
|
-
export declare function addRequestInterceptor(interceptor: any, router: LLMProviderRouter): void;
|
|
43
|
-
/**
|
|
44
|
-
* Add response interceptor
|
|
45
|
-
*/
|
|
46
|
-
export declare function addResponseInterceptor(interceptor: any, router: LLMProviderRouter): void;
|
|
47
|
-
/**
|
|
48
|
-
* Check health of a provider
|
|
49
|
-
*/
|
|
50
|
-
export declare function checkHealth(provider: string, router: LLMProviderRouter): Promise<import("@x12i/ai-providers-router").HealthCheckResult>;
|
|
51
|
-
/**
|
|
52
|
-
* Check health of all providers
|
|
53
|
-
*/
|
|
54
|
-
export declare function checkAllHealth(router: LLMProviderRouter): Promise<Record<string, any>>;
|