@x12i/ai-gateway 10.0.2 → 10.0.5
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 +40 -13
- package/dist/ai-tools-client.d.ts +15 -33
- package/dist/ai-tools-client.js +57 -107
- package/dist/gateway-utils.d.ts +30 -10
- package/dist/gateway-utils.js +168 -110
- package/dist/gateway.js +8 -18
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3 -1
- package/dist/openrouter-routing.d.ts +3 -12
- package/dist/openrouter-routing.js +5 -34
- package/dist/types.d.ts +12 -0
- package/dist-cjs/ai-tools-client.cjs +57 -107
- package/dist-cjs/ai-tools-client.d.ts +15 -33
- package/dist-cjs/gateway-utils.cjs +168 -110
- package/dist-cjs/gateway-utils.d.ts +30 -10
- package/dist-cjs/gateway.cjs +8 -18
- package/dist-cjs/index.cjs +3 -1
- package/dist-cjs/index.d.ts +4 -1
- package/dist-cjs/openrouter-routing.cjs +5 -34
- package/dist-cjs/openrouter-routing.d.ts +3 -12
- package/dist-cjs/types.d.ts +12 -0
- package/package.json +2 -2
|
@@ -16,7 +16,10 @@ export declare function ensureTaskTypeId(request: ChatRequest, logger: Logxer):
|
|
|
16
16
|
export type MergeConfigOptions = {
|
|
17
17
|
catalog?: AiModelsCatalogClient | null;
|
|
18
18
|
routingEnv?: OpenRouterRoutingConfig;
|
|
19
|
+
openRouterApiKey?: string;
|
|
20
|
+
preferOpenRouter?: boolean;
|
|
19
21
|
};
|
|
22
|
+
export { MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, ModelProfileInputRejectedError, } from '@x12i/ai-tools';
|
|
20
23
|
/**
|
|
21
24
|
* Merges config with defaults
|
|
22
25
|
* Supports using internal system action defaults (internalSkill or skillAudit) when useInternalDefaults is set
|
|
@@ -91,13 +94,38 @@ export type ResolveCostCompletionOptions = {
|
|
|
91
94
|
calculator?: CostCalculator | null;
|
|
92
95
|
calculateCost?: boolean;
|
|
93
96
|
};
|
|
94
|
-
/**
|
|
97
|
+
/** Optional cache/reasoning token fields for catalog pricing records. */
|
|
98
|
+
export type InvokeUsageExtras = {
|
|
99
|
+
cached?: number;
|
|
100
|
+
cacheWrite?: number;
|
|
101
|
+
reasoning?: number;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Best-effort cache/reasoning token counts from router usage buckets
|
|
105
|
+
* (for {@link buildGatewayPricingRecord} / ai-tools {@link CostCalculator.calculateFromRecord}).
|
|
106
|
+
*/
|
|
107
|
+
export declare function extractUsageExtrasFromRouterResponse(routerResponse: unknown): InvokeUsageExtras;
|
|
108
|
+
/**
|
|
109
|
+
* Whether ai-tools catalog pricing is authoritative enough for Step B (`priced`).
|
|
110
|
+
* Matches the generic engine contract: authoritative catalog hit with finite cost ≥ 0.
|
|
111
|
+
*/
|
|
112
|
+
export declare function catalogPricingSucceeded(result: AiCostResult): boolean;
|
|
113
|
+
/** Record shape for {@link CostCalculator.calculateFromRecord} (shared engine contract). */
|
|
95
114
|
export declare function buildGatewayPricingRecord(routerResponse: unknown, tokens: {
|
|
96
115
|
prompt: number;
|
|
97
116
|
completion: number;
|
|
98
117
|
total: number;
|
|
99
118
|
}, mergedConfig?: unknown): Record<string, unknown>;
|
|
100
119
|
export declare function mapAiCostResultToResolvedActivityCost(base: ResolvedActivityCost, result: AiCostResult): ResolvedActivityCost;
|
|
120
|
+
/**
|
|
121
|
+
* G8 safety net: token usage without a billing signal → `unpriced`.
|
|
122
|
+
* Used at invoke boundaries after {@link resolveCostCompletionWithAiTools}.
|
|
123
|
+
*/
|
|
124
|
+
export declare function ensureInvokeBillingCostStatus(billing: ResolvedActivityCost, tokens: {
|
|
125
|
+
prompt: number;
|
|
126
|
+
completion: number;
|
|
127
|
+
total: number;
|
|
128
|
+
}): ResolvedActivityCost;
|
|
101
129
|
/**
|
|
102
130
|
* Router cost passthrough, then optional @x12i/ai-tools catalog pricing when still unpriced.
|
|
103
131
|
*/
|
|
@@ -149,14 +177,6 @@ export declare function pickEffectiveModelConfigFromInvokeRequest(request: Pick<
|
|
|
149
177
|
*/
|
|
150
178
|
export declare function tryExtractRouterLikePayloadFromErrorChain(error: unknown, maxDepth?: number): unknown;
|
|
151
179
|
export declare function pickRequestIdsFromRouterLike(gatewayAiRequestId: string | undefined, routerLike: unknown): GatewayTraceRequestIds | undefined;
|
|
152
|
-
/** Error code hint when a bundled profile name cannot be routed to a catalog target. */
|
|
153
|
-
export declare const MODEL_PROFILE_UNROUTABLE = "MODEL_PROFILE_UNROUTABLE";
|
|
154
|
-
export declare class ModelProfileUnroutableError extends Error {
|
|
155
|
-
readonly profileAlias: string;
|
|
156
|
-
readonly provider: string | undefined;
|
|
157
|
-
readonly code = "MODEL_PROFILE_UNROUTABLE";
|
|
158
|
-
constructor(profileAlias: string, provider: string | undefined, cause?: unknown);
|
|
159
|
-
}
|
|
160
180
|
type ModelResolutionCandidate = {
|
|
161
181
|
provider: string;
|
|
162
182
|
model: string;
|
|
@@ -175,7 +195,7 @@ export declare function mapGatewayFallbackAttemptsToRouter(attempts: GatewayFall
|
|
|
175
195
|
responsePreview?: string;
|
|
176
196
|
}>;
|
|
177
197
|
/**
|
|
178
|
-
* Log
|
|
198
|
+
* Log original input vs OpenRouter model id actually sent to the router after catalog resolution.
|
|
179
199
|
*/
|
|
180
200
|
export declare function logResolvedModelRouting(logger: Logxer, request: ChatRequest, mergedConfig: ChatRequest['config']): void;
|
|
181
201
|
/**
|
package/dist-cjs/gateway.cjs
CHANGED
|
@@ -11,10 +11,9 @@ import { resolveRetryConfig } from './gateway-defaults.js';
|
|
|
11
11
|
import { buildMessages } from './message-builder.js';
|
|
12
12
|
import { extractJsonFromFlexMd } from './flex-md-loader.js';
|
|
13
13
|
import { enrichParsedContentForOutputContract, resolveOutputContractFieldKeys } from './output-contract-normalizer.js';
|
|
14
|
-
import { attachGatewayInvokeRejectionMetadata, buildGatewayFallbackAttemptsFromTrace, buildInvokeRejectionMetadata, capActivityFullResponsePayload, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter,
|
|
14
|
+
import { attachGatewayInvokeRejectionMetadata, buildGatewayFallbackAttemptsFromTrace, buildInvokeRejectionMetadata, capActivityFullResponsePayload, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter, DEFAULT_ACTIVITY_FULL_RESPONSE_MAX_CHARS, extractCostUsdFromRouterResponse, extractTokenUsageFromRouterResponse, mergeConfig, pickEffectiveModelConfigForMetadata, pickInvokeRoutingMetadataSlice, pickTraceMergedRouterConfig, resolveCostCompletionWithAiTools, ensureInvokeBillingCostStatus, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, tryExtractRouterLikePayloadFromErrorChain } from './gateway-utils.js';
|
|
15
15
|
import { getAiToolsClient } from './ai-tools-client.js';
|
|
16
16
|
import { autoRegisterProviders } from './gateway-provider-auto-register.js';
|
|
17
|
-
import { applyOpenRouterInvokePolicy } from './ai-tools-client.js';
|
|
18
17
|
import { setGatewayLastJobId, setGatewayRuntimeClients } from './runtime-objects.js';
|
|
19
18
|
import { gatewayLogDebug, withActivityIdentity, withGatewayLogContext } from './gateway-log-meta.js';
|
|
20
19
|
import { exceptionEvidence, fieldEvidence, GatewayLogCode, gatewayErrorCode, gatewayWarnCode } from './gateway-log-diagnostics.js';
|
|
@@ -100,15 +99,11 @@ export class AIGateway {
|
|
|
100
99
|
const mergedConfig = await mergeConfig(request, this.config, this.logger, {
|
|
101
100
|
catalog: aiTools?.catalog ?? null,
|
|
102
101
|
routingEnv: aiTools?.routingEnv,
|
|
102
|
+
openRouterApiKey: this.openRouterApiKey,
|
|
103
|
+
preferOpenRouter: this.preferOpenRouter,
|
|
103
104
|
});
|
|
104
105
|
// Activix start snapshot must match what the router receives (modelConfig-only callers omit request.config.model).
|
|
105
106
|
request._mergedRouterConfig = mergedConfig;
|
|
106
|
-
applyOpenRouterInvokePolicy(mergedConfig, {
|
|
107
|
-
preferOpenRouter: this.preferOpenRouter,
|
|
108
|
-
openRouterApiKey: this.openRouterApiKey,
|
|
109
|
-
routingEnv: aiTools?.routingEnv,
|
|
110
|
-
resolution: request._modelResolution,
|
|
111
|
-
});
|
|
112
107
|
// Lazy auto-register providers from env (OPENAI_API_KEY, etc.) so consumers don't have to call init
|
|
113
108
|
if (!this._autoRegisterDone) {
|
|
114
109
|
await autoRegisterProviders(this.router, this.logger);
|
|
@@ -140,11 +135,12 @@ export class AIGateway {
|
|
|
140
135
|
});
|
|
141
136
|
const metaChat = response?.metadata || {};
|
|
142
137
|
const tokensChat = extractTokenUsageFromRouterResponse(response);
|
|
143
|
-
|
|
138
|
+
let costCompletionChat = await resolveCostCompletionWithAiTools(response, tokensChat, {
|
|
144
139
|
mergedConfig,
|
|
145
140
|
calculator: aiTools?.calculator ?? null,
|
|
146
141
|
calculateCost: this.config.aiTools?.calculateCost
|
|
147
142
|
});
|
|
143
|
+
costCompletionChat = ensureInvokeBillingCostStatus(costCompletionChat, tokensChat);
|
|
148
144
|
// Create enhanced response
|
|
149
145
|
const enhancedResponse = {
|
|
150
146
|
content: response.content || '',
|
|
@@ -292,14 +288,10 @@ export class AIGateway {
|
|
|
292
288
|
const mergedConfig = await mergeConfig(request, this.config, this.logger, {
|
|
293
289
|
catalog: aiTools?.catalog ?? null,
|
|
294
290
|
routingEnv: aiTools?.routingEnv,
|
|
295
|
-
});
|
|
296
|
-
request._mergedRouterConfig = mergedConfig;
|
|
297
|
-
applyOpenRouterInvokePolicy(mergedConfig, {
|
|
298
|
-
preferOpenRouter: this.preferOpenRouter,
|
|
299
291
|
openRouterApiKey: this.openRouterApiKey,
|
|
300
|
-
|
|
301
|
-
resolution: request._modelResolution,
|
|
292
|
+
preferOpenRouter: this.preferOpenRouter,
|
|
302
293
|
});
|
|
294
|
+
request._mergedRouterConfig = mergedConfig;
|
|
303
295
|
logResolvedModelRouting(this.logger, request, mergedConfig);
|
|
304
296
|
const diagnosticsMode = request.diagnostics?.mode;
|
|
305
297
|
const traceEnabled = diagnosticsMode === 'trace';
|
|
@@ -623,9 +615,7 @@ export class AIGateway {
|
|
|
623
615
|
calculator: aiTools?.calculator ?? null,
|
|
624
616
|
calculateCost: this.config.aiTools?.calculateCost
|
|
625
617
|
});
|
|
626
|
-
|
|
627
|
-
costCompletion = { ...costCompletion, costStatus: 'unpriced' };
|
|
628
|
-
}
|
|
618
|
+
costCompletion = ensureInvokeBillingCostStatus(costCompletion, tokens);
|
|
629
619
|
const routerMetaForCost = routerResponse?.metadata || {};
|
|
630
620
|
const routingMetadataSlice = pickInvokeRoutingMetadataSlice(routerResponse, mergedConfig);
|
|
631
621
|
const effectiveModelConfig = pickEffectiveModelConfigForMetadata(mergedConfig);
|
package/dist-cjs/index.cjs
CHANGED
|
@@ -17,7 +17,7 @@ export * from '@x12i/ai-providers-router';
|
|
|
17
17
|
export { AIGateway } from './gateway.js';
|
|
18
18
|
export { InstructionNotFoundError, InstructionBackendError, ModelRequiredError, MaxTokensRequiredError } from './instruction-errors.js';
|
|
19
19
|
export { autoRegisterProviders } from './gateway-provider-auto-register.js';
|
|
20
|
-
export { attachGatewayInvokeRejectionMetadata, buildInvokeRejectionMetadata, tryExtractRouterLikePayloadFromErrorChain, tryExtractFallbackAttemptsFromErrorChain, pickRequestIdsFromRouterLike, resolveActivityCostCompletion, resolveCostCompletionForActivity, resolveCostCompletionWithAiTools, buildGatewayPricingRecord, mapAiCostResultToResolvedActivityCost, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, hasNonZeroTokenUsage, MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, buildGatewayFallbackAttemptsFromTrace, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter } from './gateway-utils.js';
|
|
20
|
+
export { attachGatewayInvokeRejectionMetadata, buildInvokeRejectionMetadata, tryExtractRouterLikePayloadFromErrorChain, tryExtractFallbackAttemptsFromErrorChain, pickRequestIdsFromRouterLike, resolveActivityCostCompletion, resolveCostCompletionForActivity, resolveCostCompletionWithAiTools, buildGatewayPricingRecord, mapAiCostResultToResolvedActivityCost, catalogPricingSucceeded, ensureInvokeBillingCostStatus, extractUsageExtrasFromRouterResponse, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, hasNonZeroTokenUsage, MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, ModelProfileInputRejectedError, buildGatewayFallbackAttemptsFromTrace, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter } from './gateway-utils.js';
|
|
21
21
|
export { getGatewayOperationalMode, isProdGatewayMode, parseModelProviderSpec } from './gateway-mode.js';
|
|
22
22
|
export { DEFAULT_ACTIVITY_FULL_RESPONSE_MAX_CHARS, GATEWAY_DEFAULT_FREQUENCY_PENALTY, GATEWAY_DEFAULT_PRESENCE_PENALTY, GATEWAY_DEFAULT_RETRY, GATEWAY_DEFAULT_TEMPERATURE, GATEWAY_DEFAULT_TOP_P, resolveRetryConfig } from './gateway-defaults.js';
|
|
23
23
|
export { contractSpecToFieldKeys, enrichParsedContentForOutputContract, resolveOutputContractFieldKeys } from './output-contract-normalizer.js';
|
|
@@ -33,6 +33,8 @@ export { activityIdentityToLogContext, activityIdentityToLogMeta, withActivityId
|
|
|
33
33
|
export { createGatewayLogger, resolveGatewayVerboseEnabled } from './logger-factory.js';
|
|
34
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
|
+
/** Re-export @x12i/ai-tools invoke orchestrator (≥ 2.5.0) for engine callers. */
|
|
37
|
+
export { resolveInvokeModel, applyModelResolution, applyOpenRouterInvokePolicy, mapResolutionToRouterConfig, buildInvokeModelResolverOptions, buildModelResolverOptions, enrichModelResolutionError, getAiToolsClient, resetAiToolsClientForTests, resolveOpenRouterApiKey, resolvePreferOpenRouter, readPreferOpenRouterFromEnv, getAiToolsInvokeClient, createAiToolsInvokeClient, } from './ai-tools-client.js';
|
|
36
38
|
// Re-export logging (@x12i/logxer)
|
|
37
39
|
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';
|
|
38
40
|
export { ROUTER_LOG_ENV_PREFIX } from '@x12i/ai-providers-router';
|
package/dist-cjs/index.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export { AIGateway } from './gateway.js';
|
|
|
17
17
|
export { InstructionNotFoundError, InstructionBackendError, ModelRequiredError, MaxTokensRequiredError } from './instruction-errors.js';
|
|
18
18
|
export { autoRegisterProviders } from './gateway-provider-auto-register.js';
|
|
19
19
|
export type { GatewayConfig, ProviderModelRef, ModelConfig, RetryConfig, ChatRequest, AIInvokeRequest, AIRequest, GatewayActionType, GatewayInvokeRejectionMetadata, GatewayFallbackAttempt, GatewayTraceRequestIds, GatewayTraceAttempt, GatewayTraceUsageSummary, GatewayTraceMergedConfig, EnhancedLLMResponse, InstructionMetadata, ValidationRule, TemplateRenderOptions, SmartInputConfig, SmartInputRenderOptions } from './types.js';
|
|
20
|
-
export { attachGatewayInvokeRejectionMetadata, buildInvokeRejectionMetadata, tryExtractRouterLikePayloadFromErrorChain, tryExtractFallbackAttemptsFromErrorChain, pickRequestIdsFromRouterLike, resolveActivityCostCompletion, resolveCostCompletionForActivity, resolveCostCompletionWithAiTools, buildGatewayPricingRecord, mapAiCostResultToResolvedActivityCost, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, hasNonZeroTokenUsage, MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, buildGatewayFallbackAttemptsFromTrace, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter } from './gateway-utils.js';
|
|
20
|
+
export { attachGatewayInvokeRejectionMetadata, buildInvokeRejectionMetadata, tryExtractRouterLikePayloadFromErrorChain, tryExtractFallbackAttemptsFromErrorChain, pickRequestIdsFromRouterLike, resolveActivityCostCompletion, resolveCostCompletionForActivity, resolveCostCompletionWithAiTools, buildGatewayPricingRecord, mapAiCostResultToResolvedActivityCost, catalogPricingSucceeded, ensureInvokeBillingCostStatus, extractUsageExtrasFromRouterResponse, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, hasNonZeroTokenUsage, MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, ModelProfileInputRejectedError, buildGatewayFallbackAttemptsFromTrace, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter } from './gateway-utils.js';
|
|
21
21
|
export { getGatewayOperationalMode, isProdGatewayMode, parseModelProviderSpec } from './gateway-mode.js';
|
|
22
22
|
export type { GatewayOperationalMode } from './gateway-mode.js';
|
|
23
23
|
export { DEFAULT_ACTIVITY_FULL_RESPONSE_MAX_CHARS, GATEWAY_DEFAULT_FREQUENCY_PENALTY, GATEWAY_DEFAULT_PRESENCE_PENALTY, GATEWAY_DEFAULT_RETRY, GATEWAY_DEFAULT_TEMPERATURE, GATEWAY_DEFAULT_TOP_P, resolveRetryConfig } from './gateway-defaults.js';
|
|
@@ -40,6 +40,9 @@ export type { GatewayLoggerConfig } from './logger-factory.js';
|
|
|
40
40
|
export { GATEWAY_LOG_ENV_PREFIX, GATEWAY_LOGXER_PACKAGE, GATEWAY_STACK_LOG_PREFIXES, initializeGatewayPackageLogLevels, resetGatewayPackageLogLevelsInit } from './gateway-log-levels.js';
|
|
41
41
|
export { GatewayLogCode, gatewayErrorCode, gatewayInfoCode, gatewayWarnCode, gatewayAnomalyMeta, resolveLogDiagnosticsCatalogPath, exceptionEvidence, fieldEvidence } from './gateway-log-diagnostics.js';
|
|
42
42
|
export type { GatewayLogCode as GatewayDiagnosticCode } from './gateway-log-diagnostics.js';
|
|
43
|
+
/** Re-export @x12i/ai-tools invoke orchestrator (≥ 2.5.0) for engine callers. */
|
|
44
|
+
export { resolveInvokeModel, applyModelResolution, applyOpenRouterInvokePolicy, mapResolutionToRouterConfig, buildInvokeModelResolverOptions, buildModelResolverOptions, enrichModelResolutionError, getAiToolsClient, resetAiToolsClientForTests, resolveOpenRouterApiKey, resolvePreferOpenRouter, readPreferOpenRouterFromEnv, getAiToolsInvokeClient, createAiToolsInvokeClient, } from './ai-tools-client.js';
|
|
45
|
+
export type { AiToolsClientBundle, AiToolsInvokeClient, InvokeModelResolutionDiagnostics, InvokeModelResolutionInput, InvokeModelResolutionOptions, InvokeModelResolutionResult, InvokeRouterConfigSlice, } from './ai-tools-client.js';
|
|
43
46
|
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';
|
|
44
47
|
export { ROUTER_LOG_ENV_PREFIX } from '@x12i/ai-providers-router';
|
|
45
48
|
export type { Logxer, LogMeta, RuntimeIdentity, LogRuntimeContext, GetJobLogsInput, GetJobLogsResult, QueryableLogLine, LogDiagnostics, DiagnosticEvidence, ScopeCriteria, ScopeLogsResult, StackLoggingOptions, PackageLogLevelsConfig, PackageLogLevelSetting } from '@x12i/logxer';
|
|
@@ -1,37 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenRouter
|
|
3
|
-
* Provider/model routing (openrouter vs vendor) is resolved by @x12i/ai-tools in mergeConfig.
|
|
2
|
+
* Gateway-level OpenRouter key + prefer flags mapped to @x12i/ai-tools invoke helpers.
|
|
4
3
|
*/
|
|
4
|
+
import { readPreferOpenRouterFromEnv, resolveOpenRouterApiKey as resolveOpenRouterApiKeyFromTools, resolvePreferOpenRouter as resolvePreferFromTools, } from '@x12i/ai-tools';
|
|
5
|
+
export { readPreferOpenRouterFromEnv };
|
|
5
6
|
export function resolveOpenRouterApiKey(config = {}) {
|
|
6
|
-
|
|
7
|
-
if (typeof explicit === 'string' && explicit.trim() && !explicit.startsWith('ENV.')) {
|
|
8
|
-
return explicit.trim();
|
|
9
|
-
}
|
|
10
|
-
const env = process.env.OPENROUTER_API_KEY?.trim();
|
|
11
|
-
return env || undefined;
|
|
7
|
+
return resolveOpenRouterApiKeyFromTools(config.openrouter?.apiKey);
|
|
12
8
|
}
|
|
13
|
-
/**
|
|
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.
|
|
34
|
-
*/
|
|
35
9
|
export function resolvePreferOpenRouter(config = {}) {
|
|
36
10
|
if (config.openRouter?.prefer === true)
|
|
37
11
|
return true;
|
|
@@ -41,8 +15,5 @@ export function resolvePreferOpenRouter(config = {}) {
|
|
|
41
15
|
return true;
|
|
42
16
|
if (config.openRouter?.enabled === false)
|
|
43
17
|
return false;
|
|
44
|
-
|
|
45
|
-
if (fromEnv !== undefined)
|
|
46
|
-
return fromEnv;
|
|
47
|
-
return true;
|
|
18
|
+
return resolvePreferFromTools();
|
|
48
19
|
}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenRouter
|
|
3
|
-
* Provider/model routing (openrouter vs vendor) is resolved by @x12i/ai-tools in mergeConfig.
|
|
2
|
+
* Gateway-level OpenRouter key + prefer flags mapped to @x12i/ai-tools invoke helpers.
|
|
4
3
|
*/
|
|
4
|
+
import { readPreferOpenRouterFromEnv } from '@x12i/ai-tools';
|
|
5
5
|
import type { GatewayConfig } from './types.js';
|
|
6
|
+
export { readPreferOpenRouterFromEnv };
|
|
6
7
|
export declare function resolveOpenRouterApiKey(config?: GatewayConfig): string | undefined;
|
|
7
|
-
/**
|
|
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.
|
|
16
|
-
*/
|
|
17
8
|
export declare function resolvePreferOpenRouter(config?: GatewayConfig): boolean;
|
package/dist-cjs/types.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ type AIModel = string;
|
|
|
9
9
|
export type UsageTier = string;
|
|
10
10
|
import type { Activix } from '@x12i/activix';
|
|
11
11
|
import type { SmartInputConfig, SmartInputRenderOptions, TemplateRenderOptions } from '@x12i/rendrix';
|
|
12
|
+
import type { ProfileCatalogLane } from '@x12i/ai-profiles';
|
|
12
13
|
import type { Logxer, PackageLogLevelsConfig } from '@x12i/logxer';
|
|
13
14
|
/**
|
|
14
15
|
* Diagnostics options for opt-in authoritative tracing.
|
|
@@ -415,10 +416,21 @@ export interface GatewayConfig extends Omit<RouterConfig, 'defaultEngine' | 'log
|
|
|
415
416
|
cacheTtlMs?: number;
|
|
416
417
|
/** Use bundled catalog JSON only (offline / tests). */
|
|
417
418
|
bundledOnly?: boolean;
|
|
419
|
+
/**
|
|
420
|
+
* Catalog lane for model resolution and cost lookup (`text`, `image`, …).
|
|
421
|
+
* @default `"text"` in ai-tools when omitted.
|
|
422
|
+
*/
|
|
423
|
+
catalogLane?: ProfileCatalogLane;
|
|
418
424
|
/** @default true */
|
|
419
425
|
resolveModels?: boolean;
|
|
426
|
+
/**
|
|
427
|
+
* When true (default), reject profile/choice keys and shortcuts (`cheap/default`, `cheapest`, …).
|
|
428
|
+
* Only concrete catalog model ids are accepted; ai-tools still normalizes aliases and routing.
|
|
429
|
+
*/
|
|
430
|
+
modelsOnly?: boolean;
|
|
420
431
|
/** @default true */
|
|
421
432
|
calculateCost?: boolean;
|
|
433
|
+
/** @default false — when true, priced results may include prompt/completion breakdown. */
|
|
422
434
|
costIncludeBreakdown?: boolean;
|
|
423
435
|
};
|
|
424
436
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/ai-gateway",
|
|
3
|
-
"version": "10.0.
|
|
3
|
+
"version": "10.0.5",
|
|
4
4
|
"description": "AI Gateway - Unified interface for LLM provider routing and management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@x12i/activix": "^8.5.0",
|
|
45
45
|
"@x12i/ai-providers-router": "^4.9.2",
|
|
46
|
-
"@x12i/ai-tools": "^2.
|
|
46
|
+
"@x12i/ai-tools": "^2.5.0",
|
|
47
47
|
"@x12i/flex-md": "^4.8.0",
|
|
48
48
|
"@x12i/logxer": "^4.6.0",
|
|
49
49
|
"@x12i/rendrix": "^4.3.0"
|