@x12i/ai-gateway 9.6.9 → 9.7.2
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 +22 -5
- package/dist/gateway-config.js +3 -3
- package/dist/gateway-log-levels.d.ts +9 -0
- package/dist/gateway-log-levels.js +9 -0
- package/dist/gateway-provider-auto-register.js +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -2
- package/dist/logger-factory.d.ts +17 -12
- package/dist/logger-factory.js +75 -17
- package/dist/openrouter-routing.d.ts +8 -3
- package/dist/openrouter-routing.js +28 -7
- package/dist/types.d.ts +15 -8
- package/dist-cjs/gateway-config.cjs +3 -3
- package/dist-cjs/gateway-log-levels.cjs +9 -0
- package/dist-cjs/gateway-log-levels.d.ts +9 -0
- package/dist-cjs/gateway-provider-auto-register.cjs +1 -1
- package/dist-cjs/index.cjs +2 -2
- package/dist-cjs/index.d.ts +3 -2
- package/dist-cjs/logger-factory.cjs +75 -17
- package/dist-cjs/logger-factory.d.ts +17 -12
- package/dist-cjs/openrouter-routing.cjs +28 -7
- package/dist-cjs/openrouter-routing.d.ts +8 -3
- package/dist-cjs/types.d.ts +15 -8
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -131,13 +131,27 @@ Defaults load from `defaults/model-config.json`, `instructions-blocks.json`, and
|
|
|
131
131
|
| `MONGO_URI`, `MONGO_LOGS_DB` / `MONGO_DB` | Activix when no custom tracker |
|
|
132
132
|
| `AI_GATEWAY_DEFAULT_MODEL` | Default model slug (`provider/model` or OpenRouter id) |
|
|
133
133
|
| `mode` / `MODE` | Operational mode (`dev`, `debug`, `prod`) |
|
|
134
|
-
| `AI_GATEWAY_LOGS_LEVEL` | Log
|
|
134
|
+
| `AI_GATEWAY_LOGS_LEVEL` | Log threshold for gateway diagnostics (`AI_GATEWAY` prefix): `error` … `verbose` |
|
|
135
|
+
| `AI_GATEWAY_VERBOSE` | Full payload lines (still requires `AI_GATEWAY_LOGS_LEVEL=verbose`) |
|
|
136
|
+
| `LOGXER_PACKAGE_LEVELS` | Bulk stack levels, e.g. `AI_GATEWAY:info,AI_PROVIDER_ROUTER:debug` |
|
|
135
137
|
| `FLEX_MD_MIN_COMPLIANCE_LEVEL` | `L0`–`L3` output-format validation (default `L0`) |
|
|
136
138
|
| `OPENROUTER_API_KEY` | OpenRouter key; always wired when set (required for profile/OpenRouter routes) |
|
|
137
139
|
| `USE_OPENROUTER` | Optional; default **prefer** OpenRouter when key is set. `false` = use direct provider keys when present; OpenRouter still used as fallback when a provider has no key |
|
|
138
140
|
| Other provider keys | `OPENAI_API_KEY`, `GROK_API_KEY`, etc. |
|
|
139
141
|
|
|
140
|
-
Logging details: [Logger initialization](./docs/LOGGER_INITIALIZATION.md).
|
|
142
|
+
Logging details: [Logger initialization](./docs/LOGGER_INITIALIZATION.md). Package identity and audit checklist: [LOGXER_INTEGRATION_CHECKLIST.md](./docs/LOGXER_INTEGRATION_CHECKLIST.md).
|
|
143
|
+
|
|
144
|
+
### Logxer identity
|
|
145
|
+
|
|
146
|
+
| Field | Value | Env / filter |
|
|
147
|
+
|-------|-------|----------------|
|
|
148
|
+
| `packageName` (log `package` column) | `AIGateway` | — |
|
|
149
|
+
| `envPrefix` | `AI_GATEWAY` | `AI_GATEWAY_LOGS_LEVEL`, `LOGXER_PACKAGE_LEVELS` |
|
|
150
|
+
| `debugNamespace` | `ai-gateway` | `DEBUG=ai-gateway` |
|
|
151
|
+
|
|
152
|
+
Console lines show **`app:`** (host app from cwd `package.json`) separately from **`package:`** (`AIGateway` for gateway code, host package for host code).
|
|
153
|
+
|
|
154
|
+
Exports: `GATEWAY_LOGXER_PACKAGE`, `GATEWAY_LOG_ENV_PREFIX`, `createGatewayLogger`, `resolveGatewayVerboseEnabled`.
|
|
141
155
|
|
|
142
156
|
---
|
|
143
157
|
|
|
@@ -251,11 +265,14 @@ Live tests use `LIVE_TEST_PROVIDER` / `LIVE_TEST_MODEL` (default `openrouter` +
|
|
|
251
265
|
import { validateAIRequest, diagnoseRequest, formatDiagnostic } from '@x12i/ai-gateway';
|
|
252
266
|
```
|
|
253
267
|
|
|
254
|
-
Enable
|
|
268
|
+
Enable gateway/router diagnostics:
|
|
255
269
|
|
|
256
270
|
```bash
|
|
257
|
-
export
|
|
258
|
-
export
|
|
271
|
+
export AI_GATEWAY_LOGS_LEVEL=debug
|
|
272
|
+
export AI_PROVIDER_ROUTER_LOGS_LEVEL=debug
|
|
273
|
+
# Optional full I/O payloads (requires _LOGS_LEVEL=verbose on the relevant package):
|
|
274
|
+
export AI_GATEWAY_VERBOSE=true
|
|
275
|
+
export AI_PROVIDER_ROUTER_VERBOSE=true
|
|
259
276
|
export FLEX_MD_MIN_COMPLIANCE_LEVEL=L0
|
|
260
277
|
```
|
|
261
278
|
|
package/dist/gateway-config.js
CHANGED
|
@@ -161,11 +161,11 @@ export function initializeGatewayComponents(config) {
|
|
|
161
161
|
// Initialize logger FIRST (before other components that might need it)
|
|
162
162
|
const logger = createGatewayLogger({
|
|
163
163
|
enableLogging: config.enableLogging ?? true,
|
|
164
|
-
packageName: config.packageName,
|
|
165
164
|
customLogger: config.logger,
|
|
166
165
|
logging: config.logging,
|
|
167
166
|
packageLogLevels: config.packageLogLevels,
|
|
168
|
-
logLevel: config.logLevel
|
|
167
|
+
logLevel: config.logLevel,
|
|
168
|
+
verbose: config.verbose
|
|
169
169
|
});
|
|
170
170
|
const { defaultModelConfig, defaultInstructionsBlocks, defaultTemplateRendering } = loadConfig(logger);
|
|
171
171
|
logger.verbose('Gateway initializing', {
|
|
@@ -204,7 +204,7 @@ export function initializeGatewayComponents(config) {
|
|
|
204
204
|
if (config.logging !== undefined)
|
|
205
205
|
routerConfig.logging = config.logging;
|
|
206
206
|
// OpenRouter: always pass apiKey when set (fallback for providers without direct keys).
|
|
207
|
-
//
|
|
207
|
+
// PREFER_OPENROUTER=false only disables *preferring* OpenRouter when direct provider keys exist.
|
|
208
208
|
const openRouterKey = resolveOpenRouterApiKey(config);
|
|
209
209
|
const preferOpenRouter = resolvePreferOpenRouter(config);
|
|
210
210
|
if (openRouterKey) {
|
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
import { type PackageLogLevelsConfig } from '@x12i/logxer';
|
|
6
6
|
/** Stable ERC 2.0 env prefix — controls `AI_GATEWAY_LOGS_LEVEL`, etc. */
|
|
7
7
|
export declare const GATEWAY_LOG_ENV_PREFIX = "AI_GATEWAY";
|
|
8
|
+
/**
|
|
9
|
+
* Stable logxer package identity for `@x12i/ai-gateway`.
|
|
10
|
+
* @see docs/LOGXER_INTEGRATION_CHECKLIST.md
|
|
11
|
+
*/
|
|
12
|
+
export declare const GATEWAY_LOGXER_PACKAGE: {
|
|
13
|
+
readonly packageName: "AIGateway";
|
|
14
|
+
readonly envPrefix: "AI_GATEWAY";
|
|
15
|
+
readonly debugNamespace: "ai-gateway";
|
|
16
|
+
};
|
|
8
17
|
/** Known `envPrefix` values in this package's dependency stack (for hosts / `.env`). */
|
|
9
18
|
export declare const GATEWAY_STACK_LOG_PREFIXES: {
|
|
10
19
|
readonly gateway: "AI_GATEWAY";
|
|
@@ -6,6 +6,15 @@ import { applyPackageLogLevelsFromEnv, mergePackageLogLevelsConfig } from '@x12i
|
|
|
6
6
|
import { ROUTER_LOG_ENV_PREFIX } from '@x12i/ai-providers-router';
|
|
7
7
|
/** Stable ERC 2.0 env prefix — controls `AI_GATEWAY_LOGS_LEVEL`, etc. */
|
|
8
8
|
export const GATEWAY_LOG_ENV_PREFIX = 'AI_GATEWAY';
|
|
9
|
+
/**
|
|
10
|
+
* Stable logxer package identity for `@x12i/ai-gateway`.
|
|
11
|
+
* @see docs/LOGXER_INTEGRATION_CHECKLIST.md
|
|
12
|
+
*/
|
|
13
|
+
export const GATEWAY_LOGXER_PACKAGE = {
|
|
14
|
+
packageName: 'AIGateway',
|
|
15
|
+
envPrefix: GATEWAY_LOG_ENV_PREFIX,
|
|
16
|
+
debugNamespace: 'ai-gateway'
|
|
17
|
+
};
|
|
9
18
|
/** Known `envPrefix` values in this package's dependency stack (for hosts / `.env`). */
|
|
10
19
|
export const GATEWAY_STACK_LOG_PREFIXES = {
|
|
11
20
|
gateway: GATEWAY_LOG_ENV_PREFIX,
|
|
@@ -146,7 +146,7 @@ export async function autoRegisterProviders(router, logger) {
|
|
|
146
146
|
optionalEnvVars: PROVIDER_CONFIGS
|
|
147
147
|
.filter(p => p.optional)
|
|
148
148
|
.map(p => p.envVar),
|
|
149
|
-
openRouter: 'Set OPENROUTER_API_KEY for OpenRouter (default route when set).
|
|
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
150
|
note: 'You can still manually register providers using gateway.register(provider)'
|
|
151
151
|
});
|
|
152
152
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -35,8 +35,9 @@ export { ActivityManager, ensureGatewayRequestIdentity } from './activity-manage
|
|
|
35
35
|
export { OptimixerManager } from './optimixer-manager.js';
|
|
36
36
|
export type { ActivityIdentity } from './types.js';
|
|
37
37
|
export { activityIdentityToLogContext, activityIdentityToLogMeta, withActivityIdentity, withGatewayLogContext, gatewayLogDebug } from './gateway-log-meta.js';
|
|
38
|
-
export { createGatewayLogger } from './logger-factory.js';
|
|
39
|
-
export {
|
|
38
|
+
export { createGatewayLogger, resolveGatewayVerboseEnabled } from './logger-factory.js';
|
|
39
|
+
export type { GatewayLoggerConfig } from './logger-factory.js';
|
|
40
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
40
41
|
export { GatewayLogCode, gatewayErrorCode, gatewayInfoCode, gatewayWarnCode, gatewayAnomalyMeta, resolveLogDiagnosticsCatalogPath, exceptionEvidence, fieldEvidence } from './gateway-log-diagnostics.js';
|
|
41
42
|
export type { GatewayLogCode as GatewayDiagnosticCode } from './gateway-log-diagnostics.js';
|
|
42
43
|
export { createLogxer, DebugLogAbstract, runWithLogContext, getStationRuntimeIdentity, mergeRuntimeIdentity, conditionEvidence, sourceEvidence, logReferenceEvidence, readAgentLoggingInstructions, resolveAgentLoggingInstructionsPath, applyPackageLogLevelsFromEnv, configurePackageLogLevels, mergePackageLogLevelsConfig, setPackageLogLevel, resolveStackLogLevelForPrefix, resolvePackageLogsLevel, parseLogxerPackageLevelsEnv, LOGXER_PACKAGE_LEVELS_ENV, LOGXER_PACKAGE_LOGS_DEFAULT_ENV } from '@x12i/logxer';
|
package/dist/index.js
CHANGED
|
@@ -30,8 +30,8 @@ export { normalizeToActivixCostShape } from '@x12i/activix';
|
|
|
30
30
|
export { ActivityManager, ensureGatewayRequestIdentity } from './activity-manager.js';
|
|
31
31
|
export { OptimixerManager } from './optimixer-manager.js';
|
|
32
32
|
export { activityIdentityToLogContext, activityIdentityToLogMeta, withActivityIdentity, withGatewayLogContext, gatewayLogDebug } from './gateway-log-meta.js';
|
|
33
|
-
export { createGatewayLogger } from './logger-factory.js';
|
|
34
|
-
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
33
|
+
export { createGatewayLogger, resolveGatewayVerboseEnabled } from './logger-factory.js';
|
|
34
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
35
35
|
export { GatewayLogCode, gatewayErrorCode, gatewayInfoCode, gatewayWarnCode, gatewayAnomalyMeta, resolveLogDiagnosticsCatalogPath, exceptionEvidence, fieldEvidence } from './gateway-log-diagnostics.js';
|
|
36
36
|
// Re-export logging (@x12i/logxer)
|
|
37
37
|
export { createLogxer, DebugLogAbstract, runWithLogContext, getStationRuntimeIdentity, mergeRuntimeIdentity, conditionEvidence, sourceEvidence, logReferenceEvidence, readAgentLoggingInstructions, resolveAgentLoggingInstructionsPath, applyPackageLogLevelsFromEnv, configurePackageLogLevels, mergePackageLogLevelsConfig, setPackageLogLevel, resolveStackLogLevelForPrefix, resolvePackageLogsLevel, parseLogxerPackageLevelsEnv, LOGXER_PACKAGE_LEVELS_ENV, LOGXER_PACKAGE_LOGS_DEFAULT_ENV } from '@x12i/logxer';
|
package/dist/logger-factory.d.ts
CHANGED
|
@@ -4,24 +4,29 @@
|
|
|
4
4
|
* Creates and configures logxer instances for the gateway
|
|
5
5
|
*/
|
|
6
6
|
import { type LogLevel, type Logxer, type PackageLogLevelsConfig, type StackLoggingOptions } from '@x12i/logxer';
|
|
7
|
-
import { GATEWAY_LOG_ENV_PREFIX } from './gateway-log-levels.js';
|
|
8
|
-
export { GATEWAY_LOG_ENV_PREFIX };
|
|
7
|
+
import { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE } from './gateway-log-levels.js';
|
|
8
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE };
|
|
9
9
|
/** True for the internal no-op logger when `enableLogging` is false. */
|
|
10
10
|
export declare function isNoOpGatewayLogger(logger: Logxer): boolean;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*/
|
|
17
|
-
export declare function createGatewayLogger(config: {
|
|
11
|
+
/** Payload verbose flag (`AI_GATEWAY_VERBOSE`) — separate from `{PREFIX}_LOGS_LEVEL` threshold. */
|
|
12
|
+
export declare function resolveGatewayVerboseEnabled(config?: {
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
}): boolean;
|
|
15
|
+
export interface GatewayLoggerConfig {
|
|
18
16
|
enableLogging: boolean;
|
|
19
|
-
|
|
17
|
+
/** Host Logxer — transports inherited; emit surface stays {@link GATEWAY_LOGXER_PACKAGE}. */
|
|
20
18
|
customLogger?: Logxer;
|
|
21
|
-
/**
|
|
19
|
+
/** Host pass-through (logxer ≥ 4.5). Forwarded as `createLogxer(..., { stack })`. */
|
|
22
20
|
logging?: StackLoggingOptions;
|
|
23
21
|
/** Merged into the process registry after `applyPackageLogLevelsFromEnv()`. */
|
|
24
22
|
packageLogLevels?: PackageLogLevelsConfig;
|
|
25
23
|
/** Explicit level for this gateway logger instance (wins over stack/registry/env). */
|
|
26
24
|
logLevel?: LogLevel;
|
|
27
|
-
|
|
25
|
+
/** Full payload logging (`AI_GATEWAY_VERBOSE`); still requires log threshold `verbose`. */
|
|
26
|
+
verbose?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates a logger instance based on configuration.
|
|
30
|
+
* Prefer this over ad-hoc `createLogxer` in consumers.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createGatewayLogger(config: GatewayLoggerConfig): Logxer;
|
package/dist/logger-factory.js
CHANGED
|
@@ -5,42 +5,100 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createLogxer, getStationRuntimeIdentity, mergeRuntimeIdentity } from '@x12i/logxer';
|
|
7
7
|
import { resolveLogDiagnosticsCatalogPath } from './gateway-log-diagnostics.js';
|
|
8
|
-
import { GATEWAY_LOG_ENV_PREFIX, initializeGatewayPackageLogLevels } from './gateway-log-levels.js';
|
|
9
|
-
export { GATEWAY_LOG_ENV_PREFIX };
|
|
8
|
+
import { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, initializeGatewayPackageLogLevels } from './gateway-log-levels.js';
|
|
9
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE };
|
|
10
10
|
const NOOP_GATEWAY_LOGGER = Symbol('noop-gateway-logger');
|
|
11
|
+
const DEFAULT_GATEWAY_LOGXER_OPTIONS = {
|
|
12
|
+
sanitization: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
detectAPIKeys: true,
|
|
15
|
+
detectPasswords: true,
|
|
16
|
+
detectJWTs: true,
|
|
17
|
+
detectEmails: true
|
|
18
|
+
}
|
|
19
|
+
};
|
|
11
20
|
/** True for the internal no-op logger when `enableLogging` is false. */
|
|
12
21
|
export function isNoOpGatewayLogger(logger) {
|
|
13
22
|
return logger[NOOP_GATEWAY_LOGGER] === true;
|
|
14
23
|
}
|
|
15
|
-
|
|
24
|
+
/** Payload verbose flag (`AI_GATEWAY_VERBOSE`) — separate from `{PREFIX}_LOGS_LEVEL` threshold. */
|
|
25
|
+
export function resolveGatewayVerboseEnabled(config) {
|
|
26
|
+
if (config?.verbose !== undefined) {
|
|
27
|
+
return config.verbose;
|
|
28
|
+
}
|
|
29
|
+
const env = process.env.AI_GATEWAY_VERBOSE ?? process.env[`${GATEWAY_LOG_ENV_PREFIX}_VERBOSE`];
|
|
30
|
+
if (env === undefined) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return env === 'true' || env === '1';
|
|
34
|
+
}
|
|
35
|
+
function resolveGatewayRuntimeIdentity() {
|
|
16
36
|
return mergeRuntimeIdentity(getStationRuntimeIdentity(), {
|
|
17
|
-
service: process.env.AI_GATEWAY_LOG_SERVICE ??
|
|
37
|
+
service: process.env.AI_GATEWAY_LOG_SERVICE ?? 'ai-gateway',
|
|
18
38
|
version: process.env.npm_package_version
|
|
19
39
|
});
|
|
20
40
|
}
|
|
41
|
+
/** Share host transport settings; gateway keeps its own `package` label (`AIGateway`). */
|
|
42
|
+
function inheritLoggingConfigFromHost(hostLogger) {
|
|
43
|
+
if (!hostLogger || typeof hostLogger.getConfig !== 'function') {
|
|
44
|
+
return {};
|
|
45
|
+
}
|
|
46
|
+
const hostConfig = hostLogger.getConfig();
|
|
47
|
+
if (!hostConfig || typeof hostConfig !== 'object') {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
const inherited = {};
|
|
51
|
+
const pick = (key) => {
|
|
52
|
+
const value = hostConfig[key];
|
|
53
|
+
if (value !== undefined) {
|
|
54
|
+
inherited[key] = value;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
pick('logToConsole');
|
|
58
|
+
pick('logToFile');
|
|
59
|
+
pick('logFilePath');
|
|
60
|
+
pick('logFormat');
|
|
61
|
+
pick('showFullTimestamp');
|
|
62
|
+
pick('enableUnifiedLogger');
|
|
63
|
+
pick('unifiedLogger');
|
|
64
|
+
pick('consolePackagesShow');
|
|
65
|
+
pick('consolePackagesHide');
|
|
66
|
+
pick('transports');
|
|
67
|
+
pick('tracing');
|
|
68
|
+
pick('trails');
|
|
69
|
+
pick('shadow');
|
|
70
|
+
pick('queryStore');
|
|
71
|
+
pick('queryCache');
|
|
72
|
+
pick('causalLogging');
|
|
73
|
+
// Gateway always sanitizes; merge host toggles when present.
|
|
74
|
+
if (hostConfig.sanitization) {
|
|
75
|
+
inherited.sanitization = {
|
|
76
|
+
...DEFAULT_GATEWAY_LOGXER_OPTIONS.sanitization,
|
|
77
|
+
...hostConfig.sanitization
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (hostConfig.runtimeIdentity) {
|
|
81
|
+
inherited.runtimeIdentity = mergeRuntimeIdentity(hostConfig.runtimeIdentity, resolveGatewayRuntimeIdentity());
|
|
82
|
+
}
|
|
83
|
+
return inherited;
|
|
84
|
+
}
|
|
21
85
|
/**
|
|
22
|
-
* Creates a logger instance based on configuration
|
|
23
|
-
*
|
|
24
|
-
* @param config - Logger configuration
|
|
25
|
-
* @returns Configured logger or no-op logger if logging is disabled
|
|
86
|
+
* Creates a logger instance based on configuration.
|
|
87
|
+
* Prefer this over ad-hoc `createLogxer` in consumers.
|
|
26
88
|
*/
|
|
27
89
|
export function createGatewayLogger(config) {
|
|
28
|
-
if (config.customLogger) {
|
|
29
|
-
return config.customLogger;
|
|
30
|
-
}
|
|
31
90
|
if (!config.enableLogging) {
|
|
32
91
|
return createNoOpLogger();
|
|
33
92
|
}
|
|
34
93
|
initializeGatewayPackageLogLevels({ packageLogLevels: config.packageLogLevels });
|
|
35
94
|
const catalogPath = resolveLogDiagnosticsCatalogPath();
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}, {
|
|
41
|
-
runtimeIdentity: resolveGatewayRuntimeIdentity(config.packageName),
|
|
95
|
+
const hostLogging = inheritLoggingConfigFromHost(config.customLogger);
|
|
96
|
+
return createLogxer(GATEWAY_LOGXER_PACKAGE, {
|
|
97
|
+
...DEFAULT_GATEWAY_LOGXER_OPTIONS,
|
|
98
|
+
runtimeIdentity: resolveGatewayRuntimeIdentity(),
|
|
42
99
|
stack: config.logging,
|
|
43
100
|
...(config.logLevel !== undefined ? { logLevel: config.logLevel } : {}),
|
|
101
|
+
...hostLogging,
|
|
44
102
|
...(catalogPath
|
|
45
103
|
? {
|
|
46
104
|
diagnostics: {
|
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
import type { GatewayConfig } from './types.js';
|
|
6
6
|
export declare function resolveOpenRouterApiKey(config?: GatewayConfig): string | undefined;
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
|
|
8
|
+
* Read operator preference from env: `PREFER_OPENROUTER` (current), then deprecated `USE_OPENROUTER`.
|
|
9
|
+
* Returns undefined when neither is set.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readPreferOpenRouterFromEnv(): boolean | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* When true, pass `routeViaOpenRouter: true` into ai-tools resolveModel (prefer OpenRouter when a key exists).
|
|
14
|
+
* Default: true. `PREFER_OPENROUTER=false` (or deprecated `USE_OPENROUTER=false`) forces vendor-direct when keys exist;
|
|
15
|
+
* ai-tools still falls back to OpenRouter when the requested provider has no direct key.
|
|
11
16
|
*/
|
|
12
17
|
export declare function resolvePreferOpenRouter(config?: GatewayConfig): boolean;
|
|
@@ -11,17 +11,38 @@ export function resolveOpenRouterApiKey(config = {}) {
|
|
|
11
11
|
return env || undefined;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
|
|
14
|
+
* Read operator preference from env: `PREFER_OPENROUTER` (current), then deprecated `USE_OPENROUTER`.
|
|
15
|
+
* Returns undefined when neither is set.
|
|
16
|
+
*/
|
|
17
|
+
export function readPreferOpenRouterFromEnv() {
|
|
18
|
+
const prefer = process.env.PREFER_OPENROUTER?.trim();
|
|
19
|
+
if (prefer === 'false' || prefer === '0')
|
|
20
|
+
return false;
|
|
21
|
+
if (prefer === 'true' || prefer === '1')
|
|
22
|
+
return true;
|
|
23
|
+
const legacy = process.env.USE_OPENROUTER?.trim();
|
|
24
|
+
if (legacy === 'false' || legacy === '0')
|
|
25
|
+
return false;
|
|
26
|
+
if (legacy === 'true' || legacy === '1')
|
|
27
|
+
return true;
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* When true, pass `routeViaOpenRouter: true` into ai-tools resolveModel (prefer OpenRouter when a key exists).
|
|
32
|
+
* Default: true. `PREFER_OPENROUTER=false` (or deprecated `USE_OPENROUTER=false`) forces vendor-direct when keys exist;
|
|
33
|
+
* ai-tools still falls back to OpenRouter when the requested provider has no direct key.
|
|
17
34
|
*/
|
|
18
35
|
export function resolvePreferOpenRouter(config = {}) {
|
|
36
|
+
if (config.openRouter?.prefer === true)
|
|
37
|
+
return true;
|
|
38
|
+
if (config.openRouter?.prefer === false)
|
|
39
|
+
return false;
|
|
19
40
|
if (config.openRouter?.enabled === true)
|
|
20
41
|
return true;
|
|
21
42
|
if (config.openRouter?.enabled === false)
|
|
22
43
|
return false;
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
25
|
-
return
|
|
26
|
-
return
|
|
44
|
+
const fromEnv = readPreferOpenRouterFromEnv();
|
|
45
|
+
if (fromEnv !== undefined)
|
|
46
|
+
return fromEnv;
|
|
47
|
+
return true;
|
|
27
48
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -357,18 +357,25 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
357
357
|
*/
|
|
358
358
|
packageLogLevels?: PackageLogLevelsConfig;
|
|
359
359
|
/**
|
|
360
|
-
*
|
|
360
|
+
* Host Logxer for shared transports and correlation context.
|
|
361
|
+
* The gateway always creates its own logger with log envelope `package: AIGateway`;
|
|
362
|
+
* the host logger is not used as the emit surface (so ai-skills logs stay ai-skills, gateway logs stay AIGateway).
|
|
361
363
|
*/
|
|
362
364
|
logger?: Logxer;
|
|
363
365
|
/**
|
|
364
|
-
*
|
|
366
|
+
* @deprecated Ignored — gateway logs always use {@link GATEWAY_LOGXER_PACKAGE} (`package: AIGateway`).
|
|
367
|
+
* Use `logging` / `packageLogLevels` for stack verbosity; pass `logger` to share transports.
|
|
365
368
|
*/
|
|
366
|
-
|
|
369
|
+
packageName?: string;
|
|
367
370
|
/**
|
|
368
|
-
*
|
|
369
|
-
*
|
|
371
|
+
* Full payload logging for gateway-owned verbose lines (`AI_GATEWAY_VERBOSE=true`).
|
|
372
|
+
* Separate from log threshold (`AI_GATEWAY_LOGS_LEVEL=verbose`). Router I/O payloads use the same flag via `RouterConfig.verbose`.
|
|
370
373
|
*/
|
|
371
|
-
|
|
374
|
+
verbose?: boolean;
|
|
375
|
+
/**
|
|
376
|
+
* Custom activity tracker instance (optional)
|
|
377
|
+
*/
|
|
378
|
+
activityTracker?: Activix;
|
|
372
379
|
/**
|
|
373
380
|
* Default engine (e.g., 'openai', 'anthropic')
|
|
374
381
|
* Used only for provider routing when request doesn't specify provider
|
|
@@ -383,8 +390,8 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
383
390
|
};
|
|
384
391
|
/**
|
|
385
392
|
* OpenRouter preference (not a hard off-switch when {@link openrouter}.apiKey or OPENROUTER_API_KEY is set).
|
|
386
|
-
* - `enabled: true` or omitted
|
|
387
|
-
* - `enabled: false` or
|
|
393
|
+
* - `prefer: true` / `enabled: true` or omitted env (default true): prefer OpenRouter when OPENROUTER_API_KEY is present.
|
|
394
|
+
* - `prefer: false` / `enabled: false` or PREFER_OPENROUTER=false: use direct providers when their API keys exist; OpenRouter still used as fallback when a requested provider has no key.
|
|
388
395
|
*/
|
|
389
396
|
openRouter?: {
|
|
390
397
|
enabled?: boolean;
|
|
@@ -161,11 +161,11 @@ export function initializeGatewayComponents(config) {
|
|
|
161
161
|
// Initialize logger FIRST (before other components that might need it)
|
|
162
162
|
const logger = createGatewayLogger({
|
|
163
163
|
enableLogging: config.enableLogging ?? true,
|
|
164
|
-
packageName: config.packageName,
|
|
165
164
|
customLogger: config.logger,
|
|
166
165
|
logging: config.logging,
|
|
167
166
|
packageLogLevels: config.packageLogLevels,
|
|
168
|
-
logLevel: config.logLevel
|
|
167
|
+
logLevel: config.logLevel,
|
|
168
|
+
verbose: config.verbose
|
|
169
169
|
});
|
|
170
170
|
const { defaultModelConfig, defaultInstructionsBlocks, defaultTemplateRendering } = loadConfig(logger);
|
|
171
171
|
logger.verbose('Gateway initializing', {
|
|
@@ -204,7 +204,7 @@ export function initializeGatewayComponents(config) {
|
|
|
204
204
|
if (config.logging !== undefined)
|
|
205
205
|
routerConfig.logging = config.logging;
|
|
206
206
|
// OpenRouter: always pass apiKey when set (fallback for providers without direct keys).
|
|
207
|
-
//
|
|
207
|
+
// PREFER_OPENROUTER=false only disables *preferring* OpenRouter when direct provider keys exist.
|
|
208
208
|
const openRouterKey = resolveOpenRouterApiKey(config);
|
|
209
209
|
const preferOpenRouter = resolvePreferOpenRouter(config);
|
|
210
210
|
if (openRouterKey) {
|
|
@@ -6,6 +6,15 @@ import { applyPackageLogLevelsFromEnv, mergePackageLogLevelsConfig } from '@x12i
|
|
|
6
6
|
import { ROUTER_LOG_ENV_PREFIX } from '@x12i/ai-providers-router';
|
|
7
7
|
/** Stable ERC 2.0 env prefix — controls `AI_GATEWAY_LOGS_LEVEL`, etc. */
|
|
8
8
|
export const GATEWAY_LOG_ENV_PREFIX = 'AI_GATEWAY';
|
|
9
|
+
/**
|
|
10
|
+
* Stable logxer package identity for `@x12i/ai-gateway`.
|
|
11
|
+
* @see docs/LOGXER_INTEGRATION_CHECKLIST.md
|
|
12
|
+
*/
|
|
13
|
+
export const GATEWAY_LOGXER_PACKAGE = {
|
|
14
|
+
packageName: 'AIGateway',
|
|
15
|
+
envPrefix: GATEWAY_LOG_ENV_PREFIX,
|
|
16
|
+
debugNamespace: 'ai-gateway'
|
|
17
|
+
};
|
|
9
18
|
/** Known `envPrefix` values in this package's dependency stack (for hosts / `.env`). */
|
|
10
19
|
export const GATEWAY_STACK_LOG_PREFIXES = {
|
|
11
20
|
gateway: GATEWAY_LOG_ENV_PREFIX,
|
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
import { type PackageLogLevelsConfig } from '@x12i/logxer';
|
|
6
6
|
/** Stable ERC 2.0 env prefix — controls `AI_GATEWAY_LOGS_LEVEL`, etc. */
|
|
7
7
|
export declare const GATEWAY_LOG_ENV_PREFIX = "AI_GATEWAY";
|
|
8
|
+
/**
|
|
9
|
+
* Stable logxer package identity for `@x12i/ai-gateway`.
|
|
10
|
+
* @see docs/LOGXER_INTEGRATION_CHECKLIST.md
|
|
11
|
+
*/
|
|
12
|
+
export declare const GATEWAY_LOGXER_PACKAGE: {
|
|
13
|
+
readonly packageName: "AIGateway";
|
|
14
|
+
readonly envPrefix: "AI_GATEWAY";
|
|
15
|
+
readonly debugNamespace: "ai-gateway";
|
|
16
|
+
};
|
|
8
17
|
/** Known `envPrefix` values in this package's dependency stack (for hosts / `.env`). */
|
|
9
18
|
export declare const GATEWAY_STACK_LOG_PREFIXES: {
|
|
10
19
|
readonly gateway: "AI_GATEWAY";
|
|
@@ -146,7 +146,7 @@ export async function autoRegisterProviders(router, logger) {
|
|
|
146
146
|
optionalEnvVars: PROVIDER_CONFIGS
|
|
147
147
|
.filter(p => p.optional)
|
|
148
148
|
.map(p => p.envVar),
|
|
149
|
-
openRouter: 'Set OPENROUTER_API_KEY for OpenRouter (default route when set).
|
|
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
150
|
note: 'You can still manually register providers using gateway.register(provider)'
|
|
151
151
|
});
|
|
152
152
|
}
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -30,8 +30,8 @@ export { normalizeToActivixCostShape } from '@x12i/activix';
|
|
|
30
30
|
export { ActivityManager, ensureGatewayRequestIdentity } from './activity-manager.js';
|
|
31
31
|
export { OptimixerManager } from './optimixer-manager.js';
|
|
32
32
|
export { activityIdentityToLogContext, activityIdentityToLogMeta, withActivityIdentity, withGatewayLogContext, gatewayLogDebug } from './gateway-log-meta.js';
|
|
33
|
-
export { createGatewayLogger } from './logger-factory.js';
|
|
34
|
-
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
33
|
+
export { createGatewayLogger, resolveGatewayVerboseEnabled } from './logger-factory.js';
|
|
34
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
35
35
|
export { GatewayLogCode, gatewayErrorCode, gatewayInfoCode, gatewayWarnCode, gatewayAnomalyMeta, resolveLogDiagnosticsCatalogPath, exceptionEvidence, fieldEvidence } from './gateway-log-diagnostics.js';
|
|
36
36
|
// Re-export logging (@x12i/logxer)
|
|
37
37
|
export { createLogxer, DebugLogAbstract, runWithLogContext, getStationRuntimeIdentity, mergeRuntimeIdentity, conditionEvidence, sourceEvidence, logReferenceEvidence, readAgentLoggingInstructions, resolveAgentLoggingInstructionsPath, applyPackageLogLevelsFromEnv, configurePackageLogLevels, mergePackageLogLevelsConfig, setPackageLogLevel, resolveStackLogLevelForPrefix, resolvePackageLogsLevel, parseLogxerPackageLevelsEnv, LOGXER_PACKAGE_LEVELS_ENV, LOGXER_PACKAGE_LOGS_DEFAULT_ENV } from '@x12i/logxer';
|
package/dist-cjs/index.d.ts
CHANGED
|
@@ -35,8 +35,9 @@ export { ActivityManager, ensureGatewayRequestIdentity } from './activity-manage
|
|
|
35
35
|
export { OptimixerManager } from './optimixer-manager.js';
|
|
36
36
|
export type { ActivityIdentity } from './types.js';
|
|
37
37
|
export { activityIdentityToLogContext, activityIdentityToLogMeta, withActivityIdentity, withGatewayLogContext, gatewayLogDebug } from './gateway-log-meta.js';
|
|
38
|
-
export { createGatewayLogger } from './logger-factory.js';
|
|
39
|
-
export {
|
|
38
|
+
export { createGatewayLogger, resolveGatewayVerboseEnabled } from './logger-factory.js';
|
|
39
|
+
export type { GatewayLoggerConfig } from './logger-factory.js';
|
|
40
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
40
41
|
export { GatewayLogCode, gatewayErrorCode, gatewayInfoCode, gatewayWarnCode, gatewayAnomalyMeta, resolveLogDiagnosticsCatalogPath, exceptionEvidence, fieldEvidence } from './gateway-log-diagnostics.js';
|
|
41
42
|
export type { GatewayLogCode as GatewayDiagnosticCode } from './gateway-log-diagnostics.js';
|
|
42
43
|
export { createLogxer, DebugLogAbstract, runWithLogContext, getStationRuntimeIdentity, mergeRuntimeIdentity, conditionEvidence, sourceEvidence, logReferenceEvidence, readAgentLoggingInstructions, resolveAgentLoggingInstructionsPath, applyPackageLogLevelsFromEnv, configurePackageLogLevels, mergePackageLogLevelsConfig, setPackageLogLevel, resolveStackLogLevelForPrefix, resolvePackageLogsLevel, parseLogxerPackageLevelsEnv, LOGXER_PACKAGE_LEVELS_ENV, LOGXER_PACKAGE_LOGS_DEFAULT_ENV } from '@x12i/logxer';
|
|
@@ -5,42 +5,100 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createLogxer, getStationRuntimeIdentity, mergeRuntimeIdentity } from '@x12i/logxer';
|
|
7
7
|
import { resolveLogDiagnosticsCatalogPath } from './gateway-log-diagnostics.js';
|
|
8
|
-
import { GATEWAY_LOG_ENV_PREFIX, initializeGatewayPackageLogLevels } from './gateway-log-levels.js';
|
|
9
|
-
export { GATEWAY_LOG_ENV_PREFIX };
|
|
8
|
+
import { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, initializeGatewayPackageLogLevels } from './gateway-log-levels.js';
|
|
9
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE };
|
|
10
10
|
const NOOP_GATEWAY_LOGGER = Symbol('noop-gateway-logger');
|
|
11
|
+
const DEFAULT_GATEWAY_LOGXER_OPTIONS = {
|
|
12
|
+
sanitization: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
detectAPIKeys: true,
|
|
15
|
+
detectPasswords: true,
|
|
16
|
+
detectJWTs: true,
|
|
17
|
+
detectEmails: true
|
|
18
|
+
}
|
|
19
|
+
};
|
|
11
20
|
/** True for the internal no-op logger when `enableLogging` is false. */
|
|
12
21
|
export function isNoOpGatewayLogger(logger) {
|
|
13
22
|
return logger[NOOP_GATEWAY_LOGGER] === true;
|
|
14
23
|
}
|
|
15
|
-
|
|
24
|
+
/** Payload verbose flag (`AI_GATEWAY_VERBOSE`) — separate from `{PREFIX}_LOGS_LEVEL` threshold. */
|
|
25
|
+
export function resolveGatewayVerboseEnabled(config) {
|
|
26
|
+
if (config?.verbose !== undefined) {
|
|
27
|
+
return config.verbose;
|
|
28
|
+
}
|
|
29
|
+
const env = process.env.AI_GATEWAY_VERBOSE ?? process.env[`${GATEWAY_LOG_ENV_PREFIX}_VERBOSE`];
|
|
30
|
+
if (env === undefined) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return env === 'true' || env === '1';
|
|
34
|
+
}
|
|
35
|
+
function resolveGatewayRuntimeIdentity() {
|
|
16
36
|
return mergeRuntimeIdentity(getStationRuntimeIdentity(), {
|
|
17
|
-
service: process.env.AI_GATEWAY_LOG_SERVICE ??
|
|
37
|
+
service: process.env.AI_GATEWAY_LOG_SERVICE ?? 'ai-gateway',
|
|
18
38
|
version: process.env.npm_package_version
|
|
19
39
|
});
|
|
20
40
|
}
|
|
41
|
+
/** Share host transport settings; gateway keeps its own `package` label (`AIGateway`). */
|
|
42
|
+
function inheritLoggingConfigFromHost(hostLogger) {
|
|
43
|
+
if (!hostLogger || typeof hostLogger.getConfig !== 'function') {
|
|
44
|
+
return {};
|
|
45
|
+
}
|
|
46
|
+
const hostConfig = hostLogger.getConfig();
|
|
47
|
+
if (!hostConfig || typeof hostConfig !== 'object') {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
const inherited = {};
|
|
51
|
+
const pick = (key) => {
|
|
52
|
+
const value = hostConfig[key];
|
|
53
|
+
if (value !== undefined) {
|
|
54
|
+
inherited[key] = value;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
pick('logToConsole');
|
|
58
|
+
pick('logToFile');
|
|
59
|
+
pick('logFilePath');
|
|
60
|
+
pick('logFormat');
|
|
61
|
+
pick('showFullTimestamp');
|
|
62
|
+
pick('enableUnifiedLogger');
|
|
63
|
+
pick('unifiedLogger');
|
|
64
|
+
pick('consolePackagesShow');
|
|
65
|
+
pick('consolePackagesHide');
|
|
66
|
+
pick('transports');
|
|
67
|
+
pick('tracing');
|
|
68
|
+
pick('trails');
|
|
69
|
+
pick('shadow');
|
|
70
|
+
pick('queryStore');
|
|
71
|
+
pick('queryCache');
|
|
72
|
+
pick('causalLogging');
|
|
73
|
+
// Gateway always sanitizes; merge host toggles when present.
|
|
74
|
+
if (hostConfig.sanitization) {
|
|
75
|
+
inherited.sanitization = {
|
|
76
|
+
...DEFAULT_GATEWAY_LOGXER_OPTIONS.sanitization,
|
|
77
|
+
...hostConfig.sanitization
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (hostConfig.runtimeIdentity) {
|
|
81
|
+
inherited.runtimeIdentity = mergeRuntimeIdentity(hostConfig.runtimeIdentity, resolveGatewayRuntimeIdentity());
|
|
82
|
+
}
|
|
83
|
+
return inherited;
|
|
84
|
+
}
|
|
21
85
|
/**
|
|
22
|
-
* Creates a logger instance based on configuration
|
|
23
|
-
*
|
|
24
|
-
* @param config - Logger configuration
|
|
25
|
-
* @returns Configured logger or no-op logger if logging is disabled
|
|
86
|
+
* Creates a logger instance based on configuration.
|
|
87
|
+
* Prefer this over ad-hoc `createLogxer` in consumers.
|
|
26
88
|
*/
|
|
27
89
|
export function createGatewayLogger(config) {
|
|
28
|
-
if (config.customLogger) {
|
|
29
|
-
return config.customLogger;
|
|
30
|
-
}
|
|
31
90
|
if (!config.enableLogging) {
|
|
32
91
|
return createNoOpLogger();
|
|
33
92
|
}
|
|
34
93
|
initializeGatewayPackageLogLevels({ packageLogLevels: config.packageLogLevels });
|
|
35
94
|
const catalogPath = resolveLogDiagnosticsCatalogPath();
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}, {
|
|
41
|
-
runtimeIdentity: resolveGatewayRuntimeIdentity(config.packageName),
|
|
95
|
+
const hostLogging = inheritLoggingConfigFromHost(config.customLogger);
|
|
96
|
+
return createLogxer(GATEWAY_LOGXER_PACKAGE, {
|
|
97
|
+
...DEFAULT_GATEWAY_LOGXER_OPTIONS,
|
|
98
|
+
runtimeIdentity: resolveGatewayRuntimeIdentity(),
|
|
42
99
|
stack: config.logging,
|
|
43
100
|
...(config.logLevel !== undefined ? { logLevel: config.logLevel } : {}),
|
|
101
|
+
...hostLogging,
|
|
44
102
|
...(catalogPath
|
|
45
103
|
? {
|
|
46
104
|
diagnostics: {
|
|
@@ -4,24 +4,29 @@
|
|
|
4
4
|
* Creates and configures logxer instances for the gateway
|
|
5
5
|
*/
|
|
6
6
|
import { type LogLevel, type Logxer, type PackageLogLevelsConfig, type StackLoggingOptions } from '@x12i/logxer';
|
|
7
|
-
import { GATEWAY_LOG_ENV_PREFIX } from './gateway-log-levels.js';
|
|
8
|
-
export { GATEWAY_LOG_ENV_PREFIX };
|
|
7
|
+
import { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE } from './gateway-log-levels.js';
|
|
8
|
+
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE };
|
|
9
9
|
/** True for the internal no-op logger when `enableLogging` is false. */
|
|
10
10
|
export declare function isNoOpGatewayLogger(logger: Logxer): boolean;
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
*/
|
|
17
|
-
export declare function createGatewayLogger(config: {
|
|
11
|
+
/** Payload verbose flag (`AI_GATEWAY_VERBOSE`) — separate from `{PREFIX}_LOGS_LEVEL` threshold. */
|
|
12
|
+
export declare function resolveGatewayVerboseEnabled(config?: {
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
}): boolean;
|
|
15
|
+
export interface GatewayLoggerConfig {
|
|
18
16
|
enableLogging: boolean;
|
|
19
|
-
|
|
17
|
+
/** Host Logxer — transports inherited; emit surface stays {@link GATEWAY_LOGXER_PACKAGE}. */
|
|
20
18
|
customLogger?: Logxer;
|
|
21
|
-
/**
|
|
19
|
+
/** Host pass-through (logxer ≥ 4.5). Forwarded as `createLogxer(..., { stack })`. */
|
|
22
20
|
logging?: StackLoggingOptions;
|
|
23
21
|
/** Merged into the process registry after `applyPackageLogLevelsFromEnv()`. */
|
|
24
22
|
packageLogLevels?: PackageLogLevelsConfig;
|
|
25
23
|
/** Explicit level for this gateway logger instance (wins over stack/registry/env). */
|
|
26
24
|
logLevel?: LogLevel;
|
|
27
|
-
|
|
25
|
+
/** Full payload logging (`AI_GATEWAY_VERBOSE`); still requires log threshold `verbose`. */
|
|
26
|
+
verbose?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates a logger instance based on configuration.
|
|
30
|
+
* Prefer this over ad-hoc `createLogxer` in consumers.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createGatewayLogger(config: GatewayLoggerConfig): Logxer;
|
|
@@ -11,17 +11,38 @@ export function resolveOpenRouterApiKey(config = {}) {
|
|
|
11
11
|
return env || undefined;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
|
|
14
|
+
* Read operator preference from env: `PREFER_OPENROUTER` (current), then deprecated `USE_OPENROUTER`.
|
|
15
|
+
* Returns undefined when neither is set.
|
|
16
|
+
*/
|
|
17
|
+
export function readPreferOpenRouterFromEnv() {
|
|
18
|
+
const prefer = process.env.PREFER_OPENROUTER?.trim();
|
|
19
|
+
if (prefer === 'false' || prefer === '0')
|
|
20
|
+
return false;
|
|
21
|
+
if (prefer === 'true' || prefer === '1')
|
|
22
|
+
return true;
|
|
23
|
+
const legacy = process.env.USE_OPENROUTER?.trim();
|
|
24
|
+
if (legacy === 'false' || legacy === '0')
|
|
25
|
+
return false;
|
|
26
|
+
if (legacy === 'true' || legacy === '1')
|
|
27
|
+
return true;
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* When true, pass `routeViaOpenRouter: true` into ai-tools resolveModel (prefer OpenRouter when a key exists).
|
|
32
|
+
* Default: true. `PREFER_OPENROUTER=false` (or deprecated `USE_OPENROUTER=false`) forces vendor-direct when keys exist;
|
|
33
|
+
* ai-tools still falls back to OpenRouter when the requested provider has no direct key.
|
|
17
34
|
*/
|
|
18
35
|
export function resolvePreferOpenRouter(config = {}) {
|
|
36
|
+
if (config.openRouter?.prefer === true)
|
|
37
|
+
return true;
|
|
38
|
+
if (config.openRouter?.prefer === false)
|
|
39
|
+
return false;
|
|
19
40
|
if (config.openRouter?.enabled === true)
|
|
20
41
|
return true;
|
|
21
42
|
if (config.openRouter?.enabled === false)
|
|
22
43
|
return false;
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
25
|
-
return
|
|
26
|
-
return
|
|
44
|
+
const fromEnv = readPreferOpenRouterFromEnv();
|
|
45
|
+
if (fromEnv !== undefined)
|
|
46
|
+
return fromEnv;
|
|
47
|
+
return true;
|
|
27
48
|
}
|
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
import type { GatewayConfig } from './types.js';
|
|
6
6
|
export declare function resolveOpenRouterApiKey(config?: GatewayConfig): string | undefined;
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
|
|
8
|
+
* Read operator preference from env: `PREFER_OPENROUTER` (current), then deprecated `USE_OPENROUTER`.
|
|
9
|
+
* Returns undefined when neither is set.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readPreferOpenRouterFromEnv(): boolean | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* When true, pass `routeViaOpenRouter: true` into ai-tools resolveModel (prefer OpenRouter when a key exists).
|
|
14
|
+
* Default: true. `PREFER_OPENROUTER=false` (or deprecated `USE_OPENROUTER=false`) forces vendor-direct when keys exist;
|
|
15
|
+
* ai-tools still falls back to OpenRouter when the requested provider has no direct key.
|
|
11
16
|
*/
|
|
12
17
|
export declare function resolvePreferOpenRouter(config?: GatewayConfig): boolean;
|
package/dist-cjs/types.d.ts
CHANGED
|
@@ -357,18 +357,25 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
357
357
|
*/
|
|
358
358
|
packageLogLevels?: PackageLogLevelsConfig;
|
|
359
359
|
/**
|
|
360
|
-
*
|
|
360
|
+
* Host Logxer for shared transports and correlation context.
|
|
361
|
+
* The gateway always creates its own logger with log envelope `package: AIGateway`;
|
|
362
|
+
* the host logger is not used as the emit surface (so ai-skills logs stay ai-skills, gateway logs stay AIGateway).
|
|
361
363
|
*/
|
|
362
364
|
logger?: Logxer;
|
|
363
365
|
/**
|
|
364
|
-
*
|
|
366
|
+
* @deprecated Ignored — gateway logs always use {@link GATEWAY_LOGXER_PACKAGE} (`package: AIGateway`).
|
|
367
|
+
* Use `logging` / `packageLogLevels` for stack verbosity; pass `logger` to share transports.
|
|
365
368
|
*/
|
|
366
|
-
|
|
369
|
+
packageName?: string;
|
|
367
370
|
/**
|
|
368
|
-
*
|
|
369
|
-
*
|
|
371
|
+
* Full payload logging for gateway-owned verbose lines (`AI_GATEWAY_VERBOSE=true`).
|
|
372
|
+
* Separate from log threshold (`AI_GATEWAY_LOGS_LEVEL=verbose`). Router I/O payloads use the same flag via `RouterConfig.verbose`.
|
|
370
373
|
*/
|
|
371
|
-
|
|
374
|
+
verbose?: boolean;
|
|
375
|
+
/**
|
|
376
|
+
* Custom activity tracker instance (optional)
|
|
377
|
+
*/
|
|
378
|
+
activityTracker?: Activix;
|
|
372
379
|
/**
|
|
373
380
|
* Default engine (e.g., 'openai', 'anthropic')
|
|
374
381
|
* Used only for provider routing when request doesn't specify provider
|
|
@@ -383,8 +390,8 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
383
390
|
};
|
|
384
391
|
/**
|
|
385
392
|
* OpenRouter preference (not a hard off-switch when {@link openrouter}.apiKey or OPENROUTER_API_KEY is set).
|
|
386
|
-
* - `enabled: true` or omitted
|
|
387
|
-
* - `enabled: false` or
|
|
393
|
+
* - `prefer: true` / `enabled: true` or omitted env (default true): prefer OpenRouter when OPENROUTER_API_KEY is present.
|
|
394
|
+
* - `prefer: false` / `enabled: false` or PREFER_OPENROUTER=false: use direct providers when their API keys exist; OpenRouter still used as fallback when a requested provider has no key.
|
|
388
395
|
*/
|
|
389
396
|
openRouter?: {
|
|
390
397
|
enabled?: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/ai-gateway",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.7.2",
|
|
4
4
|
"description": "AI Gateway - Unified interface for LLM provider routing and management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"license": "mit",
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@x12i/activix": "^8.3.1",
|
|
45
|
-
"@x12i/ai-providers-router": "^4.
|
|
46
|
-
"@x12i/ai-tools": "^2.1.
|
|
45
|
+
"@x12i/ai-providers-router": "^4.9.2",
|
|
46
|
+
"@x12i/ai-tools": "^2.1.3",
|
|
47
47
|
"@x12i/flex-md": "^4.8.0",
|
|
48
|
-
"@x12i/logxer": "^4.
|
|
48
|
+
"@x12i/logxer": "^4.6.0",
|
|
49
49
|
"@x12i/optimixer": "^2.4.4",
|
|
50
50
|
"@x12i/rendrix": "^4.3.0"
|
|
51
51
|
},
|